@krymskyimaksym/react-api-client 2.0.0-beta.2 → 2.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/README.md +143 -8
- package/dist/index.d.mts +252 -59
- package/dist/index.d.ts +252 -59
- package/dist/index.js +377 -57
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +372 -59
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config.ts","../src/errors.ts","../src/utils.ts","../src/logger.ts","../src/query/focus-manager.ts","../src/query/online-manager.ts","../src/query/key.ts","../src/query/cache.ts","../src/query/client.ts","../src/hooks/use-fetch.ts","../src/query/mutation-counter.ts","../src/hooks/use-mutation.ts","../src/hooks/use-paginate.ts","../src/hooks/use-is-fetching.ts","../src/query/persist.ts","../src/query/devtools.ts","../src/query/provider.tsx","../src/index.ts"],"names":["useMemo","useCallback","useState","useEffect","state","useRef","error","createContext","createElement","useContext"],"mappings":"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","file":"index.js","sourcesContent":["import type { ApiClientConfig } from './types';\n\nlet globalConfig: ApiClientConfig | null = null;\n\n/**\n * Configure the API client globally\n * @param config - API client configuration\n *\n * @example\n * import { configureApiClient } from '@krymskyimaksym/react-api-client';\n * import { router } from 'expo-router';\n *\n * configureApiClient({\n * httpClient: myHttpClient,\n * onUnauthorized: () => router.replace('/login')\n * });\n */\nexport function configureApiClient(config: ApiClientConfig): void {\n globalConfig = config;\n}\n\n/**\n * Get the current global configuration\n * @throws Error if configuration is not set\n */\nexport function getConfig(): ApiClientConfig {\n if (!globalConfig) {\n throw new Error(\n 'API client is not configured. Call configureApiClient() first.',\n );\n }\n return globalConfig;\n}\n\n/**\n * Check if the API client is configured\n */\nexport function isConfigured(): boolean {\n return globalConfig !== null;\n}\n","/**\n * Унифицированная ошибка API. Кидается из `executeRequest` (а значит,\n * из `fetch`/`mutate`/хуков) только когда в `configureApiClient` включён\n * `throwOnError: true`. По умолчанию поведение пакета не меняется —\n * ошибки приходят как `{ status: false }` (см. CHANGELOG, Фаза 3.5).\n */\nexport type ApiErrorInit<E = unknown> = {\n message: string;\n status: number;\n code?: string;\n errors?: E;\n isNetworkError?: boolean;\n isUnauthorized?: boolean;\n isValidationError?: boolean;\n raw?: unknown;\n};\n\nexport class ApiError<E = unknown> extends Error {\n readonly status: number;\n readonly code?: string;\n readonly errors?: E;\n readonly isNetworkError: boolean;\n readonly isUnauthorized: boolean;\n readonly isValidationError: boolean;\n readonly raw: unknown;\n\n constructor(init: ApiErrorInit<E>) {\n super(init.message);\n this.name = 'ApiError';\n this.status = init.status;\n this.code = init.code;\n this.errors = init.errors;\n this.isNetworkError = init.isNetworkError ?? false;\n this.isUnauthorized = init.isUnauthorized ?? init.status === 401;\n this.isValidationError =\n init.isValidationError ??\n (init.status === 422 || (init.errors !== undefined && init.errors !== null));\n this.raw = init.raw;\n // корректный prototype chain для instanceof после транспиляции\n Object.setPrototypeOf(this, ApiError.prototype);\n }\n}\n\nconst isObject = (v: unknown): v is Record<string, unknown> =>\n typeof v === 'object' && v !== null;\n\n/**\n * Конвертация произвольного throw'нутого значения в `ApiError`.\n * Покрывает 4 кейса:\n * - `ApiError` → passthrough\n * - axios-like `{ response: { status, data } }` → ApiError с полями из data\n * - `Error` (сетевая ошибка, таймаут) → ApiError(isNetworkError, status: 0)\n * - неизвестный объект → ApiError(message: 'Unknown error', status: 0)\n */\nexport function toApiError(thrown: unknown): ApiError {\n if (thrown instanceof ApiError) return thrown;\n\n if (isObject(thrown) && 'response' in thrown && isObject(thrown.response)) {\n const r = thrown.response as { status?: number; data?: unknown };\n const status = typeof r.status === 'number' ? r.status : 0;\n const data = isObject(r.data) ? r.data : undefined;\n const message =\n (data && typeof data.message === 'string' ? data.message : undefined) ??\n (thrown instanceof Error ? thrown.message : undefined) ??\n `HTTP ${status}`;\n return new ApiError({\n message,\n status,\n code: data && typeof data.code === 'string' ? data.code : undefined,\n errors: data?.errors as unknown,\n isNetworkError: status === 0,\n isUnauthorized: status === 401,\n isValidationError: status === 422 || data?.errors !== undefined,\n raw: r.data ?? thrown,\n });\n }\n\n if (thrown instanceof Error) {\n return new ApiError({\n message: thrown.message,\n status: 0,\n isNetworkError: true,\n raw: thrown,\n });\n }\n\n return new ApiError({\n message: 'Unknown error',\n status: 0,\n raw: thrown,\n });\n}\n\n/**\n * Для 2xx ответа, в теле которого Laravel-style `{ status: false }`.\n * Возвращает ApiError(status: 200, ...). Вызывается из executeRequest\n * только при `throwOnError: true`.\n */\nexport function businessErrorToApiError(response: unknown): ApiError {\n if (!isObject(response)) {\n return new ApiError({ message: 'Request failed', status: 200, raw: response });\n }\n return new ApiError({\n message:\n typeof response.message === 'string' ? response.message : 'Request failed',\n status: 200,\n code: typeof response.code === 'string' ? response.code : undefined,\n errors: response.errors,\n isValidationError: response.errors !== undefined,\n raw: response,\n });\n}\n","import { getConfig } from './config';\nimport { ApiError, businessErrorToApiError, toApiError } from './errors';\n\nimport type { RequestConfig, ResponseWrapper } from './types';\n\n/**\n * Builds the endpoint URL from a string or function\n */\nexport function buildEndpoint<RequestParamsType>(\n endpoint: string | ((arg0: RequestParamsType) => string),\n params?: RequestParamsType,\n): string {\n if (typeof endpoint === 'function' && typeof params !== 'undefined') {\n return endpoint(params);\n }\n return endpoint as string;\n}\n\ntype AxiosLikeError<E> = {\n response?: { status: number; data: E };\n message?: string;\n};\n\n/**\n * Executes an HTTP request with error handling and response wrapping.\n *\n * Поведение зависит от `throwOnError` в `configureApiClient`:\n * - false (default): возвращает `{ status: true, ... }` либо\n * `{ status: false, message?, errors? }`. Старое поведение.\n * - true: на HTTP >= 400 / сетевой ошибке / теле с `{ status: false }`\n * кидает `ApiError`.\n */\nexport async function executeRequest<\n ResponseType,\n RequestParamsType,\n ErrorResponseType,\n>(\n endpoint: string | ((arg0: RequestParamsType) => string),\n fetchConfig: RequestConfig,\n params?: RequestParamsType,\n signal?: AbortSignal,\n): Promise<ResponseWrapper<ResponseType, ErrorResponseType>> {\n type RT = ResponseWrapper<ResponseType, ErrorResponseType>;\n const url = buildEndpoint(endpoint, params);\n const config = getConfig();\n\n try {\n const requestConfig = { ...fetchConfig };\n let response: ResponseType;\n\n if (\n requestConfig.method?.toUpperCase() === 'GET' ||\n !requestConfig.method\n ) {\n response = await config.httpClient.get<ResponseType>(url, {\n params: {\n ...requestConfig.requestParams,\n ...(params as Record<string, string>),\n },\n signal,\n });\n } else {\n response = await config.httpClient.request<ResponseType>(url, {\n method: requestConfig.method,\n data: {\n ...requestConfig.requestParams,\n ...(params as Record<string, unknown>),\n },\n signal,\n });\n }\n\n // Бизнес-ошибка: 2xx, но в теле { status: false } (Laravel-style)\n const hasExplicitStatus =\n response &&\n typeof response === 'object' &&\n 'status' in (response as object) &&\n typeof (response as unknown as { status: unknown }).status === 'boolean';\n if (\n config.throwOnError &&\n hasExplicitStatus &&\n (response as unknown as { status: boolean }).status === false\n ) {\n throw businessErrorToApiError(response);\n }\n\n return { ...response, status: true } as RT;\n } catch (e) {\n // Уже наш ApiError — пробрасываем без модификаций\n if (e instanceof ApiError) {\n if (e.status === 401 && config.onUnauthorized) {\n await config.onUnauthorized();\n }\n throw e;\n }\n\n const error = e as AxiosLikeError<ErrorResponseType>;\n const httpStatus = error.response?.status;\n\n if (httpStatus === 401 && config.onUnauthorized) {\n await config.onUnauthorized();\n }\n\n if (config.throwOnError) {\n throw toApiError(e);\n }\n\n if (error.response?.data) {\n return {\n ...(error.response.data as Record<string, unknown>),\n status: false,\n } as unknown as RT;\n }\n\n return {\n status: false,\n message: e instanceof Error ? e.message : 'Request error',\n } as unknown as RT;\n }\n}\n\n/**\n * Handles response success and error callbacks\n */\nexport function handleResponse<T, E = unknown>(\n result: ResponseWrapper<T, E>,\n onSuccess?: (data: ResponseWrapper<T, E>) => void,\n onError?: (error: Error) => void,\n): void {\n if (result.status && onSuccess) {\n onSuccess(result);\n } else if (!result.status && onError) {\n const err = new Error(result.message ?? 'Request failed');\n onError(err);\n }\n}\n","import { getConfig, isConfigured } from './config';\nimport type { ApiClientLogger } from './types';\n\n/**\n * Безопасный доступ к logger из глобального конфига: ошибки колбэков\n * проглатываются, отсутствие конфига/логгера — no-op.\n */\nfunction getLogger(): ApiClientLogger | undefined {\n if (!isConfigured()) return undefined;\n return getConfig().logger;\n}\n\nexport function callLogger<K extends keyof ApiClientLogger>(\n method: K,\n ...args: Parameters<NonNullable<ApiClientLogger[K]>>\n): void {\n const logger = getLogger();\n const fn = logger?.[method] as\n | ((...a: Parameters<NonNullable<ApiClientLogger[K]>>) => void)\n | undefined;\n if (!fn) return;\n try {\n fn(...args);\n } catch {\n // логгер не должен ломать приложение\n }\n}\n","/**\n * Глобальный менеджер «фокуса» приложения.\n * - В вебе автоматически подключается к window focus/visibilitychange.\n * - В React Native интеграцию ставит сам потребитель через\n * `focusManager.setFocused(state === 'active')` из AppState.\n *\n * Подписчики (useFetch с refetchOnFocus / refetchOnAppActive) получают\n * уведомление при переходе в focused == true.\n */\ntype Listener = (focused: boolean) => void;\n\nclass FocusManager {\n private focused = true;\n private listeners = new Set<Listener>();\n private cleanup: (() => void) | null = null;\n\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n this.setupBrowserListeners();\n return () => {\n this.listeners.delete(listener);\n if (this.listeners.size === 0) this.teardownBrowserListeners();\n };\n }\n\n isFocused(): boolean {\n return this.focused;\n }\n\n setFocused(focused: boolean): void {\n if (this.focused === focused) return;\n this.focused = focused;\n for (const l of this.listeners) l(focused);\n }\n\n private setupBrowserListeners(): void {\n if (this.cleanup) return;\n if (\n typeof window === 'undefined' ||\n typeof window.addEventListener !== 'function'\n ) {\n return;\n }\n const onFocus = () => this.setFocused(true);\n const onVisibility = () => {\n if (typeof document !== 'undefined') {\n this.setFocused(document.visibilityState !== 'hidden');\n }\n };\n window.addEventListener('focus', onFocus);\n if (typeof document !== 'undefined') {\n document.addEventListener('visibilitychange', onVisibility);\n }\n this.cleanup = () => {\n window.removeEventListener('focus', onFocus);\n if (typeof document !== 'undefined') {\n document.removeEventListener('visibilitychange', onVisibility);\n }\n };\n }\n\n private teardownBrowserListeners(): void {\n this.cleanup?.();\n this.cleanup = null;\n }\n}\n\nexport const focusManager = new FocusManager();\nexport type { FocusManager };\n","/**\n * Глобальный менеджер сетевого статуса.\n * - В браузере подключается к window online/offline.\n * - В React Native интеграция — через NetInfo (опционально):\n * `NetInfo.addEventListener(s => onlineManager.setOnline(!!s.isConnected))`.\n * Жёсткой зависимости от NetInfo нет — без него по умолчанию online: true.\n *\n * Подписчики (useFetch с refetchOnReconnect) получают уведомление при\n * переходе offline → online.\n */\ntype Listener = (online: boolean) => void;\n\nclass OnlineManager {\n private online = true;\n private listeners = new Set<Listener>();\n private cleanup: (() => void) | null = null;\n\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n this.setupBrowserListeners();\n return () => {\n this.listeners.delete(listener);\n if (this.listeners.size === 0) this.teardownBrowserListeners();\n };\n }\n\n isOnline(): boolean {\n return this.online;\n }\n\n setOnline(online: boolean): void {\n if (this.online === online) return;\n this.online = online;\n for (const l of this.listeners) l(online);\n }\n\n private setupBrowserListeners(): void {\n if (this.cleanup) return;\n if (\n typeof window === 'undefined' ||\n typeof window.addEventListener !== 'function'\n ) {\n return;\n }\n // navigator.onLine может врать, но как initial state — ок\n if (typeof navigator !== 'undefined' && 'onLine' in navigator) {\n this.online = navigator.onLine;\n }\n const onOnline = () => this.setOnline(true);\n const onOffline = () => this.setOnline(false);\n window.addEventListener('online', onOnline);\n window.addEventListener('offline', onOffline);\n this.cleanup = () => {\n window.removeEventListener('online', onOnline);\n window.removeEventListener('offline', onOffline);\n };\n }\n\n private teardownBrowserListeners(): void {\n this.cleanup?.();\n this.cleanup = null;\n }\n}\n\nexport const onlineManager = new OnlineManager();\nexport type { OnlineManager };\n","export type QueryKey = readonly unknown[];\n\n/**\n * Стабильная сериализация ключа кэша.\n * - Объекты сериализуются с сортировкой ключей.\n * - Массивы сохраняют порядок.\n * - Функции и symbol — недопустимы (как в TanStack Query), кидаем.\n * - undefined в массиве становится null, в объекте — поле пропускается.\n *\n * Пример: ['orders', { sort: 'date', dir: 'asc' }] и\n * ['orders', { dir: 'asc', sort: 'date' }] дают одинаковый hash.\n */\nexport function hashQueryKey(key: QueryKey): string {\n return JSON.stringify(key, (_, value) => {\n if (typeof value === 'function') {\n throw new Error(\n 'react-api-client: функции запрещены в queryKey — ключ должен быть сериализуем',\n );\n }\n if (typeof value === 'symbol') {\n throw new Error(\n 'react-api-client: symbol запрещены в queryKey — ключ должен быть сериализуем',\n );\n }\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const sortedKeys = Object.keys(value).sort();\n const result: Record<string, unknown> = {};\n for (const k of sortedKeys) {\n const v = (value as Record<string, unknown>)[k];\n if (v !== undefined) result[k] = v;\n }\n return result;\n }\n return value;\n });\n}\n\n/**\n * Проверяет, начинается ли `key` с `prefix`.\n * Используется для invalidateQueries по префиксу: ['orders'] матчит\n * и ['orders', 'manager'], и ['orders', 960].\n */\nexport function matchQueryKey(prefix: QueryKey, key: QueryKey): boolean {\n if (prefix.length > key.length) return false;\n for (let i = 0; i < prefix.length; i++) {\n if (hashQueryKey([prefix[i]]) !== hashQueryKey([key[i]])) return false;\n }\n return true;\n}","import { hashQueryKey, matchQueryKey, type QueryKey } from './key';\n\nexport type QueryStatus = 'idle' | 'loading' | 'success' | 'error';\n\nexport type QueryState<T> = {\n data: T | undefined;\n error: Error | null;\n status: QueryStatus;\n updatedAt: number;\n isStale: boolean;\n};\n\ntype Listener = () => void;\n\ntype QueryEntry<T> = {\n key: QueryKey;\n state: QueryState<T>;\n subscribers: Set<Listener>;\n inflight: Promise<T> | null;\n inflightController: AbortController | null;\n gcTimer: ReturnType<typeof setTimeout> | null;\n staleTime: number;\n gcTime: number;\n /**\n * Последний queryFn, переданный в fetch для этого ключа.\n * Используется refetchQueries: позволяет перезапустить запрос,\n * не зная queryFn из caller'а (например, push-handler).\n */\n lastQueryFn: QueryFn<T> | null;\n};\n\nexport type QueryFnContext = { signal: AbortSignal };\n/**\n * queryFn принимает контекст с AbortSignal. Если HTTP-клиент его\n * использует — отмена будет реальной; если игнорирует — поведение\n * деградирует до текущего (запрос идёт до конца, но кэш игнорирует результат).\n *\n * Для обратной совместимости старая сигнатура `() => Promise<T>` тоже\n * принимается — пакет просто не передаст signal внутрь.\n */\nexport type QueryFn<T> = (ctx: QueryFnContext) => Promise<T>;\n\nexport type FetchOptions = {\n staleTime?: number;\n gcTime?: number;\n /** Если true — игнорируем staleTime и форсим запрос */\n force?: boolean;\n};\n\nconst DEFAULT_GC_TIME = 5 * 60 * 1000;\nconst DEFAULT_STALE_TIME = 0;\n\n/**\n * In-memory кэш запросов с подпиской по ключу, dedupe inflight-промисов\n * и сборкой мусора через gcTime.\n */\nexport class QueryCache {\n private entries = new Map<string, QueryEntry<unknown>>();\n private globalListeners = new Set<Listener>();\n\n /**\n * Подписка на любое изменение кэша: setData, invalidate, remove,\n * успешный/ошибочный fetch. Используется persistQueryClient и\n * devtools-подобными адаптерами. Не дублирует `subscribe(key, ...)`.\n */\n subscribeAll(listener: Listener): () => void {\n this.globalListeners.add(listener);\n return () => {\n this.globalListeners.delete(listener);\n };\n }\n\n private notifyGlobal() {\n for (const listener of this.globalListeners) listener();\n }\n\n private ensureEntry<T>(\n key: QueryKey,\n staleTime?: number,\n gcTime?: number,\n ): QueryEntry<T> {\n const hash = hashQueryKey(key);\n let entry = this.entries.get(hash) as QueryEntry<T> | undefined;\n if (!entry) {\n entry = {\n key,\n state: {\n data: undefined,\n error: null,\n status: 'idle',\n updatedAt: 0,\n isStale: true,\n },\n subscribers: new Set(),\n inflight: null,\n inflightController: null,\n gcTimer: null,\n lastQueryFn: null,\n staleTime: staleTime ?? DEFAULT_STALE_TIME,\n gcTime: gcTime ?? DEFAULT_GC_TIME,\n };\n this.entries.set(hash, entry as QueryEntry<unknown>);\n } else {\n // обновим только явно переданные параметры\n if (staleTime !== undefined) entry.staleTime = staleTime;\n if (gcTime !== undefined) entry.gcTime = gcTime;\n }\n return entry;\n }\n\n getState<T>(key: QueryKey): QueryState<T> | undefined {\n const entry = this.entries.get(hashQueryKey(key)) as\n | QueryEntry<T>\n | undefined;\n return entry?.state;\n }\n\n getData<T>(key: QueryKey): T | undefined {\n return this.getState<T>(key)?.data;\n }\n\n setData<T>(key: QueryKey, updater: T | ((prev: T | undefined) => T)): void {\n const entry = this.ensureEntry<T>(key);\n const next =\n typeof updater === 'function'\n ? (updater as (prev: T | undefined) => T)(entry.state.data)\n : updater;\n entry.state = {\n data: next,\n error: null,\n status: 'success',\n updatedAt: Date.now(),\n isStale: false,\n };\n this.notify(entry);\n }\n\n /**\n * Подписка на изменения ключа. Возвращает unsubscribe.\n * Подписка останавливает GC таймер; отписка — запускает его обратно.\n */\n subscribe(key: QueryKey, listener: Listener): () => void {\n const entry = this.ensureEntry<unknown>(key);\n entry.subscribers.add(listener);\n if (entry.gcTimer) {\n clearTimeout(entry.gcTimer);\n entry.gcTimer = null;\n }\n return () => {\n entry.subscribers.delete(listener);\n if (entry.subscribers.size === 0) this.scheduleGc(entry);\n };\n }\n\n private notify<T>(entry: QueryEntry<T>) {\n for (const listener of entry.subscribers) listener();\n this.notifyGlobal();\n }\n\n private scheduleGc<T>(entry: QueryEntry<T>) {\n if (entry.gcTimer) clearTimeout(entry.gcTimer);\n if (entry.gcTime <= 0) {\n this.entries.delete(hashQueryKey(entry.key));\n return;\n }\n entry.gcTimer = setTimeout(() => {\n if (entry.subscribers.size === 0 && !entry.inflight) {\n this.entries.delete(hashQueryKey(entry.key));\n }\n }, entry.gcTime);\n }\n\n /**\n * Запускает или присоединяется к inflight-запросу.\n * Если данные свежие (не stale) и не force — отдаёт кэш без запроса.\n */\n async fetch<T>(\n key: QueryKey,\n queryFn: QueryFn<T>,\n options: FetchOptions = {},\n ): Promise<T> {\n const staleTime = options.staleTime ?? DEFAULT_STALE_TIME;\n const gcTime = options.gcTime ?? DEFAULT_GC_TIME;\n const entry = this.ensureEntry<T>(key, staleTime, gcTime);\n\n const isFresh =\n entry.state.status === 'success' &&\n !entry.state.isStale &&\n Date.now() - entry.state.updatedAt < staleTime;\n\n // Запоминаем queryFn для refetchQueries (используется push-handler'ами\n // и client.refetchQueries без знания queryFn).\n entry.lastQueryFn = queryFn as QueryFn<unknown> as QueryFn<T>;\n\n if (!options.force && isFresh && entry.state.data !== undefined) {\n return entry.state.data;\n }\n\n if (entry.inflight) return entry.inflight;\n\n entry.state = { ...entry.state, status: 'loading', error: null };\n this.notify(entry);\n\n const controller = new AbortController();\n const token = Symbol('inflight');\n (entry as QueryEntry<T> & { inflightToken?: symbol }).inflightToken = token;\n entry.inflightController = controller;\n\n const isCurrent = () =>\n (entry as QueryEntry<T> & { inflightToken?: symbol }).inflightToken ===\n token;\n\n const myPromise: Promise<T> = (async () => {\n try {\n const data = await queryFn({ signal: controller.signal });\n if (!isCurrent()) return data;\n entry.state = {\n data,\n error: null,\n status: 'success',\n updatedAt: Date.now(),\n isStale: false,\n };\n this.notify(entry);\n return data;\n } catch (err) {\n if (!isCurrent()) throw err;\n entry.state = {\n ...entry.state,\n status: 'error',\n error: err as Error,\n };\n this.notify(entry);\n throw err;\n } finally {\n if (isCurrent()) {\n entry.inflight = null;\n entry.inflightController = null;\n }\n }\n })();\n\n entry.inflight = myPromise;\n return myPromise;\n }\n\n /**\n * Помечает запись как stale. Сами по себе данные не удаляются.\n * Если есть подписчики — они получат уведомление, чтобы инициировать refetch.\n */\n invalidate(predicate: QueryKey | ((key: QueryKey) => boolean)): string[] {\n const invalidated: string[] = [];\n const match =\n typeof predicate === 'function'\n ? predicate\n : (k: QueryKey) => matchQueryKey(predicate, k);\n\n for (const [hash, entry] of this.entries) {\n if (match(entry.key)) {\n entry.state = { ...entry.state, isStale: true };\n this.notify(entry);\n invalidated.push(hash);\n }\n }\n return invalidated;\n }\n\n /**\n * Перезапускает все записи, матчинг predicate, у которых сохранён\n * `lastQueryFn` (т.е. их хоть раз кто-то загрузил через `fetch`).\n * Возвращает promise, который резолвится когда все запросы завершились.\n * Ошибки отдельных запросов проглатываются — общий promise успешный.\n */\n refetchQueries(\n predicate: QueryKey | ((key: QueryKey) => boolean),\n ): Promise<void> {\n const match =\n typeof predicate === 'function'\n ? predicate\n : (k: QueryKey) => matchQueryKey(predicate, k);\n const promises: Promise<unknown>[] = [];\n for (const entry of this.entries.values()) {\n if (!match(entry.key)) continue;\n if (!entry.lastQueryFn) continue;\n promises.push(\n this.fetch(entry.key, entry.lastQueryFn, { force: true }).catch(\n () => undefined,\n ),\n );\n }\n return Promise.all(promises).then(() => undefined);\n }\n\n /**\n * Отменяет «привязку» inflight-промиса к ключу. Сам HTTP-запрос\n * продолжит исполняться (executeRequest не использует AbortSignal),\n * но его результат больше не попадёт в кэш и не уведомит подписчиков.\n * Полезно при размонтировании / при переключении страниц.\n */\n cancelQueries(predicate: QueryKey | ((key: QueryKey) => boolean)): void {\n const match =\n typeof predicate === 'function'\n ? predicate\n : (k: QueryKey) => matchQueryKey(predicate, k);\n for (const entry of this.entries.values()) {\n if (match(entry.key) && entry.inflight) {\n // реальная отмена HTTP: вызываем abort на сохранённом controller\n entry.inflightController?.abort();\n entry.inflightController = null;\n entry.inflight = null;\n (entry as QueryEntry<unknown> & { inflightToken?: symbol })\n .inflightToken = undefined;\n if (entry.state.status === 'loading') {\n entry.state = { ...entry.state, status: 'idle' };\n this.notify(entry);\n }\n }\n }\n }\n\n /**\n * Полностью удаляет записи (даже с активными подписчиками).\n * Используется редко — обычно достаточно invalidate.\n */\n remove(predicate: QueryKey | ((key: QueryKey) => boolean)): void {\n const match =\n typeof predicate === 'function'\n ? predicate\n : (k: QueryKey) => matchQueryKey(predicate, k);\n let removed = false;\n for (const [hash, entry] of [...this.entries]) {\n if (match(entry.key)) {\n if (entry.gcTimer) clearTimeout(entry.gcTimer);\n this.entries.delete(hash);\n removed = true;\n }\n }\n if (removed) this.notifyGlobal();\n }\n\n /**\n * Количество inflight-запросов в кэше, опционально отфильтрованных\n * по predicate. Используется `useIsFetching()` для глобального\n * индикатора загрузки.\n */\n countFetching(\n predicate?: QueryKey | ((key: QueryKey) => boolean),\n ): number {\n const match = !predicate\n ? () => true\n : typeof predicate === 'function'\n ? predicate\n : (k: QueryKey) => matchQueryKey(predicate, k);\n let n = 0;\n for (const entry of this.entries.values()) {\n // считаем по status === 'loading' (не по entry.inflight), потому что\n // notify летит до выставления inflight — иначе useIsFetching\n // пропустит начало запроса.\n if (entry.state.status === 'loading' && match(entry.key)) n++;\n }\n return n;\n }\n\n /** Только для тестов / DevTools. */\n _debugEntries(): ReadonlyMap<string, QueryEntry<unknown>> {\n return this.entries;\n }\n\n /**\n * Сериализует записи со статусом success — для persistence.\n * inflight / loading / error не сохраняются, чтобы не гидратировать\n * приложение в полу-загруженном состоянии.\n */\n dehydrate(filter?: (key: QueryKey) => boolean): DehydratedState {\n const queries: DehydratedQuery[] = [];\n for (const entry of this.entries.values()) {\n if (entry.state.status !== 'success') continue;\n if (entry.state.data === undefined) continue;\n if (filter && !filter(entry.key)) continue;\n queries.push({\n key: entry.key as unknown[],\n data: entry.state.data,\n updatedAt: entry.state.updatedAt,\n });\n }\n return { queries };\n }\n\n hydrate(state: DehydratedState): void {\n for (const q of state.queries) {\n const entry = this.ensureEntry<unknown>(q.key);\n // не перетираем более свежие данные\n if (entry.state.updatedAt >= q.updatedAt && entry.state.data !== undefined) {\n continue;\n }\n entry.state = {\n data: q.data,\n error: null,\n status: 'success',\n updatedAt: q.updatedAt,\n isStale: true, // гидратированные данные сразу stale → фоновый refetch\n };\n this.notify(entry);\n }\n }\n}\n\nexport type DehydratedQuery = {\n key: unknown[];\n data: unknown;\n updatedAt: number;\n};\n\nexport type DehydratedState = {\n queries: DehydratedQuery[];\n};","import { callLogger } from '../logger';\nimport { QueryCache, type FetchOptions, type QueryFn } from './cache';\nimport type { QueryKey } from './key';\n\n/**\n * Высокоуровневый фасад над QueryCache: единый объект, который удобно\n * прокидывать через Provider и дергать из push-handler'ов / эффектов.\n *\n * Сами queryFn-ы здесь не регистрируются — refetchQueries требует, чтобы\n * либо подписчик сам перезапустил запрос (через subscribe), либо чтобы\n * вызвали fetchQuery с queryFn вручную. Это намеренно: хук React сам\n * знает, как собрать свой queryFn из endpoint/params.\n */\nexport class QueryClient {\n readonly cache: QueryCache;\n\n constructor(cache?: QueryCache) {\n this.cache = cache ?? new QueryCache();\n }\n\n getQueryData<T>(key: QueryKey): T | undefined {\n return this.cache.getData<T>(key);\n }\n\n setQueryData<T>(\n key: QueryKey,\n updater: T | ((prev: T | undefined) => T),\n ): void {\n this.cache.setData(key, updater);\n }\n\n fetchQuery<T>(\n key: QueryKey,\n queryFn: QueryFn<T>,\n options?: FetchOptions,\n ): Promise<T> {\n return this.cache.fetch(key, queryFn, options);\n }\n\n invalidateQueries(\n predicate: QueryKey | ((key: QueryKey) => boolean),\n ): void {\n const hashes = this.cache.invalidate(predicate);\n if (hashes.length > 0) callLogger('onInvalidate', hashes);\n }\n\n removeQueries(predicate: QueryKey | ((key: QueryKey) => boolean)): void {\n this.cache.remove(predicate);\n }\n\n cancelQueries(predicate: QueryKey | ((key: QueryKey) => boolean)): void {\n this.cache.cancelQueries(predicate);\n }\n\n refetchQueries(\n predicate: QueryKey | ((key: QueryKey) => boolean),\n ): Promise<void> {\n return this.cache.refetchQueries(predicate);\n }\n\n /**\n * Кладёт запрос в кэш, не пробрасывая ошибки. Подходит для оптимистичной\n * подгрузки следующего экрана при наведении / долгом тапе.\n */\n prefetchQuery<T>(\n key: QueryKey,\n queryFn: QueryFn<T>,\n options?: FetchOptions,\n ): Promise<void> {\n return this.cache.fetch(key, queryFn, options).then(\n () => undefined,\n () => undefined,\n );\n }\n}\n\nlet globalClient: QueryClient | null = null;\n\n/** Singleton-доступ для тех мест, где Provider недоступен (push-handler и т.п.). */\nexport function getQueryClient(): QueryClient {\n if (!globalClient) globalClient = new QueryClient();\n return globalClient;\n}\n\nexport function setQueryClient(client: QueryClient): void {\n globalClient = client;\n}","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { callLogger } from '../logger';\nimport { focusManager } from '../query/focus-manager';\nimport { onlineManager } from '../query/online-manager';\nimport { hashQueryKey, type QueryKey } from '../query/key';\nimport { getQueryClient } from '../query/client';\nimport { buildEndpoint, executeRequest, handleResponse } from '../utils';\n\nimport type {\n RequestConfig,\n ResponseWrapper,\n UseFetchOptions,\n UseFetchResult,\n} from '../types/index';\n\n/**\n * Hook for fetching data (GET requests).\n *\n * Поверх QueryCache: одинаковые queryKey разделяют один результат и один\n * inflight-promise. Поддерживает staleTime, refetchOnFocus,\n * pollingInterval, select.\n *\n * Возвращаемый тип { data, isLoading, isRefetching, error, refetch }\n * сохранён 1-в-1 с предыдущей версией — старые потребители продолжают работать.\n */\nexport function createUseFetch<\n ResponseType,\n RequestParamsType,\n ErrorResponseType,\n>(\n endpoint: string | ((arg0: RequestParamsType) => string),\n fetchConfig: RequestConfig,\n) {\n type RT = ResponseWrapper<ResponseType, ErrorResponseType>;\n\n return <TSelected = RT>(\n params?: RequestParamsType,\n options: UseFetchOptions<RT, TSelected> = {},\n ): UseFetchResult<TSelected> => {\n const {\n enabled = true,\n refetchOnMount = true,\n refetchOnFocus = false,\n refetchOnAppActive = false,\n refetchOnReconnect = false,\n staleTime = 0,\n gcTime,\n pollingInterval,\n queryKey: customKey,\n select,\n onSuccess,\n onError,\n } = options;\n\n const serializedParams = useMemo(\n () => (params === undefined ? null : JSON.stringify(params)),\n [params],\n );\n\n const queryKey = useMemo<QueryKey>(() => {\n if (customKey) return customKey;\n const endpointId =\n typeof endpoint === 'function'\n ? buildEndpoint<RequestParamsType>(endpoint, params)\n : endpoint;\n return ['__endpoint__', endpointId, params ?? null];\n // params уже учтён через serializedParams ниже\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [customKey ? hashQueryKey(customKey) : null, serializedParams]);\n\n const client = getQueryClient();\n const cache = client.cache;\n\n // queryFn — стабилен относительно serializedParams, не пересоздаём\n // на каждый рендер. Принимает signal от QueryCache и пробрасывает\n // его в executeRequest → httpClient.\n const queryFn = useCallback(\n ({ signal }: { signal: AbortSignal }) => {\n const parsedParams = serializedParams\n ? (JSON.parse(serializedParams) as RequestParamsType)\n : undefined;\n return executeRequest<\n ResponseType,\n RequestParamsType,\n ErrorResponseType\n >(endpoint, fetchConfig, parsedParams, signal);\n },\n [serializedParams],\n );\n\n const initialState = cache.getState<RT>(queryKey);\n const [, forceRender] = useState(0);\n const rerender = useCallback(() => forceRender(v => v + 1), []);\n\n // Подписка на изменения ключа — работает даже при enabled: false,\n // чтобы хук выступал read-only слушателем кэша. Полезно для\n // бейджей/счётчиков, которые читают тот же ключ, что пишут другие\n // экраны (см. JSDoc для `enabled`).\n //\n // На unmount: если стали последним подписчиком и запрос ещё inflight —\n // отменяем HTTP, чтобы не держать соединение зря.\n useEffect(() => {\n const unsub = cache.subscribe(queryKey, rerender);\n return () => {\n unsub();\n const state = cache._debugEntries().get(hashQueryKey(queryKey));\n if (state && state.subscribers.size === 0 && state.inflight) {\n cache.cancelQueries(queryKey);\n }\n };\n }, [cache, hashQueryKey(queryKey), rerender]);\n\n // Триггер запроса при mount / смене ключа / stale-инвалидации.\n const lastNotifiedRef = useRef<{\n success?: RT;\n errorHash?: string;\n }>({});\n\n const runFetch = useCallback(\n async (force: boolean) => {\n callLogger('onFetchStart', queryKey);\n try {\n const data = await cache.fetch(queryKey, queryFn, {\n staleTime,\n gcTime,\n force,\n });\n callLogger('onFetchSuccess', queryKey, data);\n // onSuccess / onError — на основе бизнес-статуса\n if (lastNotifiedRef.current.success !== data) {\n lastNotifiedRef.current.success = data;\n handleResponse<ResponseType, ErrorResponseType>(\n data,\n onSuccess,\n onError,\n );\n }\n } catch (err) {\n callLogger('onFetchError', queryKey, err);\n const e = err as Error;\n const hash = `${e.name}:${e.message}`;\n if (lastNotifiedRef.current.errorHash !== hash) {\n lastNotifiedRef.current.errorHash = hash;\n onError?.(e);\n }\n }\n },\n [cache, hashQueryKey(queryKey), queryFn, staleTime, gcTime, onSuccess, onError],\n );\n\n useEffect(() => {\n if (!enabled || !refetchOnMount) return;\n void runFetch(false);\n }, [enabled, refetchOnMount, runFetch]);\n\n // Реакция на внешний invalidate: подписчик уже получил notify\n // (rerender), здесь смотрим isStale в кэше и догоняем запросом.\n const stateForEffect = cache.getState<RT>(queryKey);\n const isStale = stateForEffect?.isStale ?? false;\n const hasFetchedData = stateForEffect?.data !== undefined;\n useEffect(() => {\n if (!enabled) return;\n if (isStale && hasFetchedData) void runFetch(true);\n }, [enabled, isStale, hasFetchedData, runFetch]);\n\n // refetchOnFocus / refetchOnAppActive — обе настройки висят на одном\n // focusManager (RN AppState → focusManager.setFocused). Если хоть одна\n // включена — подписываемся.\n useEffect(() => {\n if (!enabled) return;\n if (!refetchOnFocus && !refetchOnAppActive) return;\n const unsub = focusManager.subscribe(focused => {\n if (focused) void runFetch(false);\n });\n return unsub;\n }, [enabled, refetchOnFocus, refetchOnAppActive, runFetch]);\n\n // refetchOnReconnect: подписываемся на onlineManager.\n useEffect(() => {\n if (!enabled || !refetchOnReconnect) return;\n const unsub = onlineManager.subscribe(online => {\n if (online) void runFetch(false);\n });\n return unsub;\n }, [enabled, refetchOnReconnect, runFetch]);\n\n // Поллинг с авто-паузой при !focused.\n useEffect(() => {\n if (!enabled || !pollingInterval || pollingInterval <= 0) return;\n let timer: ReturnType<typeof setInterval> | null = null;\n\n const start = () => {\n if (timer) return;\n timer = setInterval(() => {\n if (focusManager.isFocused()) void runFetch(true);\n }, pollingInterval);\n };\n const stop = () => {\n if (timer) clearInterval(timer);\n timer = null;\n };\n\n start();\n const unsub = focusManager.subscribe(focused => {\n if (focused) start();\n else stop();\n });\n return () => {\n stop();\n unsub();\n };\n }, [enabled, pollingInterval, runFetch]);\n\n // Текущее состояние из кэша.\n const state = cache.getState<RT>(queryKey) ?? initialState;\n const rawData = state?.data ?? null;\n\n // select мемоизация: пересчёт только если rawData меняется ссылочно\n // или меняется select.\n const selectedData = useMemo<TSelected | null>(() => {\n if (rawData === null) return null;\n if (!select) return rawData as unknown as TSelected;\n return select(rawData);\n }, [rawData, select]);\n\n const status = state?.status ?? 'idle';\n const hasData = rawData !== null;\n const isLoading = status === 'loading' && !hasData;\n const isRefetching = status === 'loading' && hasData;\n const error = state?.error ?? null;\n\n const refetch = useCallback(async () => {\n await runFetch(true);\n }, [runFetch]);\n\n return {\n data: selectedData,\n isLoading: enabled ? isLoading : false,\n isRefetching,\n error,\n refetch,\n };\n };\n}\n","import { matchQueryKey, type QueryKey } from './key';\n\ntype Listener = () => void;\n\n/**\n * Глобальный счётчик активных мутаций. Используется `useIsMutating()`\n * для глобального индикатора загрузки.\n *\n * Мутации не имеют ключа в кэше (в отличие от запросов), поэтому\n * счётчик ведётся отдельно. Каждой активной мутации можно опционально\n * приписать `scope` (QueryKey) — это позволяет `useIsMutating(prefix)`\n * фильтровать по предметной области.\n */\nclass MutationCounter {\n private active = new Map<symbol, QueryKey | undefined>();\n private listeners = new Set<Listener>();\n\n start(scope?: QueryKey): symbol {\n const id = Symbol('mutation');\n this.active.set(id, scope);\n this.notify();\n return id;\n }\n\n stop(id: symbol): void {\n if (this.active.delete(id)) this.notify();\n }\n\n count(predicate?: QueryKey | ((scope: QueryKey | undefined) => boolean)): number {\n if (!predicate) return this.active.size;\n let n = 0;\n for (const scope of this.active.values()) {\n if (typeof predicate === 'function') {\n if (predicate(scope)) n++;\n } else {\n if (scope && matchQueryKey(predicate, scope)) n++;\n }\n }\n return n;\n }\n\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private notify() {\n for (const l of this.listeners) l();\n }\n}\n\nexport const mutationCounter = new MutationCounter();\nexport type { MutationCounter };\n","import { useCallback, useState } from 'react';\n\nimport { callLogger } from '../logger';\nimport { getQueryClient } from '../query/client';\nimport { matchQueryKey, type QueryKey } from '../query/key';\nimport { mutationCounter } from '../query/mutation-counter';\nimport { buildEndpoint, executeRequest } from '../utils';\n\nimport type {\n RequestConfig,\n ResponseWrapper,\n UseMutationOptions,\n UseMutationResult,\n} from '../types/index';\n\n/**\n * Hook for mutations (POST/PUT/PATCH/DELETE requests).\n *\n * Фаза 3:\n * - onMutate теперь может вернуть context — он передаётся в onError/onSettled\n * для rollback.\n * - setQueryData(client, vars, data) — точечный патч кэша после успеха.\n * - invalidateKeys — массив или функция, помечает указанные ключи stale;\n * подписанные useFetch сами догоняют запросом.\n */\nexport function createUseMutation<\n ResponseType,\n RequestParamsType,\n ErrorResponseType,\n>(\n endpoint: string | ((arg0: RequestParamsType) => string),\n fetchConfig: RequestConfig,\n) {\n type RT = ResponseWrapper<ResponseType, ErrorResponseType>;\n\n return <TContext = unknown>(\n options: UseMutationOptions<RT, RequestParamsType, TContext> = {},\n ): UseMutationResult<RT, RequestParamsType> => {\n const {\n onMutate,\n onSuccess,\n onError,\n onSettled,\n invalidateKeys,\n setQueryData,\n } = options;\n\n const [data, setData] = useState<RT | null>(null);\n const [error, setError] = useState<Error | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isSuccess, setIsSuccess] = useState(false);\n const [isError, setIsError] = useState(false);\n\n const reset = useCallback(() => {\n setData(null);\n setError(null);\n setIsLoading(false);\n setIsSuccess(false);\n setIsError(false);\n }, []);\n\n const applyInvalidate = useCallback(\n (vars: RequestParamsType, result: RT) => {\n if (!invalidateKeys) return;\n const client = getQueryClient();\n // Прямой массив\n if (Array.isArray(invalidateKeys)) {\n if (invalidateKeys.length === 0) return;\n client.invalidateQueries((k: QueryKey) =>\n invalidateKeys.some(prefix => matchQueryKey(prefix, k)),\n );\n return;\n }\n // Функция — либо вернёт массив ключей, либо предикат\n const out = invalidateKeys(vars, result);\n if (typeof out === 'function') {\n client.invalidateQueries(out);\n return;\n }\n if (out.length === 0) return;\n client.invalidateQueries((k: QueryKey) =>\n out.some(prefix => matchQueryKey(prefix, k)),\n );\n },\n [invalidateKeys],\n );\n\n const mutateAsync = useCallback(\n async (variables: RequestParamsType): Promise<RT> => {\n setIsLoading(true);\n setIsSuccess(false);\n setIsError(false);\n setError(null);\n\n // scope для useIsMutating(prefix): если у мутации задан\n // invalidateKeys-массив — используем первый ключ как scope.\n const scope =\n Array.isArray(invalidateKeys) && invalidateKeys.length > 0\n ? (invalidateKeys[0] as QueryKey)\n : undefined;\n const mutationId = mutationCounter.start(scope);\n const endpointId = buildEndpoint<RequestParamsType>(endpoint, variables);\n callLogger('onMutationStart', endpointId, variables);\n\n let context: TContext | undefined;\n\n try {\n if (onMutate) {\n const ctx = await onMutate(variables);\n context = ctx as TContext | undefined;\n }\n\n const result = await executeRequest<\n ResponseType,\n RequestParamsType,\n ErrorResponseType\n >(endpoint, fetchConfig, variables);\n\n setData(result);\n\n if (result.status) {\n setIsSuccess(true);\n callLogger('onMutationSuccess', endpointId, variables, result);\n // setQueryData — точечный патч кэша\n if (setQueryData) {\n setQueryData(getQueryClient(), variables, result);\n }\n // invalidateKeys — пометить stale и дать подписчикам догнать\n applyInvalidate(variables, result);\n\n if (onSuccess) {\n await onSuccess(result, variables, context);\n }\n } else {\n const err = new Error(result.message ?? 'Mutation failed');\n setIsError(true);\n setError(err);\n callLogger('onMutationError', endpointId, variables, err);\n if (onError) {\n await onError(err, variables, context);\n }\n }\n\n if (onSettled) {\n await onSettled(result, null, variables, context);\n }\n\n return result;\n } catch (err) {\n const error = err as Error;\n setError(error);\n setIsError(true);\n setIsSuccess(false);\n callLogger('onMutationError', endpointId, variables, error);\n\n if (onError) {\n await onError(error, variables, context);\n }\n if (onSettled) {\n await onSettled(null, error, variables, context);\n }\n\n throw error;\n } finally {\n mutationCounter.stop(mutationId);\n setIsLoading(false);\n }\n },\n [\n onMutate,\n onSuccess,\n onError,\n onSettled,\n setQueryData,\n applyInvalidate,\n ],\n );\n\n const mutateSync = useCallback(\n (variables: RequestParamsType) => {\n void mutateAsync(variables);\n },\n [mutateAsync],\n );\n\n return {\n data,\n error,\n isLoading,\n isSuccess,\n isError,\n mutate: mutateSync,\n mutateAsync,\n reset,\n };\n };\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { getQueryClient } from '../query/client';\nimport { hashQueryKey, type QueryKey } from '../query/key';\nimport { buildEndpoint, executeRequest, handleResponse } from '../utils';\n\nimport type {\n RequestConfig,\n ResponseWrapper,\n UsePaginateOptions,\n UsePaginateResult,\n} from '../types/index';\n\n/**\n * Hook for paginated data fetching.\n *\n * Фаза 4: страницы кэшируются как отдельные записи под подключами вида\n * `[...prefix, { page, limit }]`. Это даёт:\n * - повторное открытие списка → данные из кэша мгновенно;\n * - keepPreviousData → плавная смена страницы;\n * - prefetchNextPage → префетч в кэш без визуального изменения.\n */\nexport function createUsePaginate<\n ResponseType extends { data: TData; total?: number; page?: number },\n TData extends unknown[],\n RequestParamsType,\n ErrorResponseType,\n>(\n endpoint: string | ((arg0: RequestParamsType) => string),\n fetchConfig: RequestConfig,\n options?: {\n dataExtractor?: (response: ResponseType) => TData;\n totalExtractor?: (response: ResponseType) => number;\n },\n) {\n type RT = ResponseWrapper<ResponseType, ErrorResponseType>;\n\n return (\n params?: Omit<RequestParamsType, 'page' | 'limit'>,\n hookOptions: UsePaginateOptions<RT> = {},\n ): UsePaginateResult<TData> => {\n const {\n enabled = true,\n initialPage = 1,\n initialLimit = 20,\n staleTime = 0,\n gcTime,\n keepPreviousData = false,\n queryKey: customKey,\n onSuccess,\n onError,\n } = hookOptions;\n\n const client = getQueryClient();\n const cache = client.cache;\n\n const limit = initialLimit;\n const [currentPage, setCurrentPage] = useState(initialPage);\n const [isFetchingNextPage, setIsFetchingNextPage] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const dataExtractor = useMemo(\n () =>\n options?.dataExtractor || ((response: ResponseType) => response.data),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n const totalExtractor = useMemo(\n () =>\n options?.totalExtractor ||\n ((response: ResponseType) => response.total ?? 0),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n\n const serializedParams = useMemo(\n () => (params === undefined ? null : JSON.stringify(params)),\n [params],\n );\n\n const keyPrefix = useMemo<QueryKey>(() => {\n if (customKey) return customKey;\n const endpointId =\n typeof endpoint === 'function'\n ? buildEndpoint<RequestParamsType>(\n endpoint,\n params as RequestParamsType,\n )\n : endpoint;\n return ['__paginate__', endpointId, params ?? null];\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [customKey ? hashQueryKey(customKey) : null, serializedParams]);\n\n const pageKey = useCallback(\n (page: number): QueryKey => [...keyPrefix, { page, limit }],\n [keyPrefix, limit],\n );\n\n const pageQueryFn = useCallback(\n (page: number) =>\n ({ signal }: { signal: AbortSignal }) => {\n const parsedParams = serializedParams\n ? (JSON.parse(serializedParams) as Record<string, unknown>)\n : {};\n const requestParams = {\n ...parsedParams,\n page,\n limit,\n } as RequestParamsType;\n return executeRequest<\n ResponseType,\n RequestParamsType,\n ErrorResponseType\n >(endpoint, fetchConfig, requestParams, signal);\n },\n [serializedParams, limit],\n );\n\n // Подписка на ключ текущей страницы для rerender.\n const [, forceRender] = useState(0);\n const rerender = useCallback(() => forceRender(v => v + 1), []);\n useEffect(() => {\n if (!enabled) return;\n const unsub = cache.subscribe(pageKey(currentPage), rerender);\n return unsub;\n }, [cache, enabled, hashQueryKey(pageKey(currentPage)), rerender]);\n\n const previousPageKeyRef = useRef<QueryKey | null>(null);\n\n const runFetchPage = useCallback(\n async (page: number, isNextPage: boolean) => {\n try {\n if (isNextPage) setIsFetchingNextPage(true);\n setError(null);\n\n const result = await cache.fetch(pageKey(page), pageQueryFn(page), {\n staleTime,\n gcTime,\n });\n\n handleResponse<ResponseType, ErrorResponseType>(\n result,\n onSuccess,\n onError,\n );\n if (!result.status) {\n setError(new Error(result.message ?? 'Request failed'));\n return;\n }\n\n previousPageKeyRef.current = pageKey(page);\n setCurrentPage(page);\n } catch (err) {\n const e = err as Error;\n setError(e);\n onError?.(e);\n } finally {\n if (isNextPage) setIsFetchingNextPage(false);\n }\n },\n [cache, pageKey, pageQueryFn, staleTime, gcTime, onSuccess, onError],\n );\n\n // Первичный mount + смена params.\n useEffect(() => {\n if (!enabled) return;\n void runFetchPage(initialPage, false);\n setCurrentPage(initialPage);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [enabled, serializedParams, initialPage]);\n\n // Auto-refetch при isStale (внешний invalidateQueries).\n const currentState = cache.getState<RT>(pageKey(currentPage));\n const isStale = currentState?.isStale ?? false;\n const hasFetchedData = currentState?.data !== undefined;\n useEffect(() => {\n if (!enabled) return;\n if (isStale && hasFetchedData) void runFetchPage(currentPage, false);\n }, [enabled, isStale, hasFetchedData, currentPage, runFetchPage]);\n\n // Источник данных для UI с учётом keepPreviousData.\n const currentResult = currentState?.data;\n const usingPlaceholder =\n keepPreviousData &&\n !currentResult &&\n previousPageKeyRef.current !== null;\n const effectiveResult = usingPlaceholder\n ? cache.getData<RT>(previousPageKeyRef.current as QueryKey)\n : currentResult;\n\n const data: TData =\n effectiveResult && effectiveResult.status\n ? dataExtractor(effectiveResult as ResponseType)\n : ([] as unknown as TData);\n\n const totalCount =\n effectiveResult && effectiveResult.status\n ? totalExtractor(effectiveResult as ResponseType)\n : null;\n const total = totalCount;\n const totalPages = totalCount !== null ? Math.ceil(totalCount / limit) : null;\n const hasNextPage = totalPages !== null && currentPage < totalPages;\n const hasPreviousPage = currentPage > 1;\n\n const status = currentState?.status ?? 'idle';\n const isLoading = status === 'loading' && !hasFetchedData && !usingPlaceholder;\n\n const fetchNextPage = useCallback(async () => {\n if (!hasNextPage) return;\n await runFetchPage(currentPage + 1, true);\n }, [hasNextPage, currentPage, runFetchPage]);\n\n const fetchPreviousPage = useCallback(async () => {\n if (!hasPreviousPage) return;\n await runFetchPage(currentPage - 1, false);\n }, [hasPreviousPage, currentPage, runFetchPage]);\n\n const prefetchNextPage = useCallback(async () => {\n if (!hasNextPage) return;\n // Просто складываем в кэш — не меняем currentPage, не показываем loading.\n await cache.fetch(\n pageKey(currentPage + 1),\n pageQueryFn(currentPage + 1),\n { staleTime, gcTime },\n );\n }, [hasNextPage, currentPage, cache, pageKey, pageQueryFn, staleTime, gcTime]);\n\n const refetch = useCallback(async () => {\n await cache.fetch(pageKey(currentPage), pageQueryFn(currentPage), {\n staleTime: 0,\n gcTime,\n force: true,\n });\n }, [cache, pageKey, pageQueryFn, currentPage, gcTime]);\n\n const reset = useCallback(() => {\n // Удаляем все страницы текущего префикса.\n cache.remove((k: QueryKey) => {\n if (k.length < keyPrefix.length) return false;\n for (let i = 0; i < keyPrefix.length; i++) {\n if (hashQueryKey([k[i]]) !== hashQueryKey([keyPrefix[i]])) return false;\n }\n return true;\n });\n previousPageKeyRef.current = null;\n setCurrentPage(initialPage);\n void runFetchPage(initialPage, false);\n }, [cache, keyPrefix, initialPage, runFetchPage]);\n\n return {\n data,\n currentPage,\n totalPages,\n total,\n hasNextPage,\n hasPreviousPage,\n isLoading: enabled ? isLoading : false,\n isFetchingNextPage,\n isPlaceholderData: usingPlaceholder,\n error,\n fetchNextPage,\n fetchPreviousPage,\n prefetchNextPage,\n refetch,\n reset,\n };\n };\n}\n","import { useCallback, useEffect, useState } from 'react';\n\nimport { getQueryClient } from '../query/client';\nimport type { QueryKey } from '../query/key';\nimport { mutationCounter } from '../query/mutation-counter';\n\n/**\n * Возвращает число активных (inflight) запросов в кэше.\n * Полезно для глобального индикатора загрузки в шапке.\n *\n * С опциональным predicate — считает только матчинг запросы:\n * `useIsFetching(['orders'])` — сколько inflight'ов под префиксом ['orders'].\n */\nexport function useIsFetching(\n predicate?: QueryKey | ((key: QueryKey) => boolean),\n): number {\n const client = getQueryClient();\n const get = useCallback(\n () => client.cache.countFetching(predicate),\n [client.cache, predicate],\n );\n const [count, setCount] = useState<number>(get);\n\n useEffect(() => {\n setCount(get());\n const unsub = client.cache.subscribeAll(() => setCount(get()));\n return unsub;\n }, [client.cache, get]);\n\n return count;\n}\n\n/**\n * Возвращает число активных мутаций. С predicate — только матчинг.\n * Скоуп мутации = первый ключ из её `invalidateKeys`, если задан массив;\n * иначе — без скоупа (попадает только в безусловный счётчик).\n */\nexport function useIsMutating(\n predicate?: QueryKey | ((scope: QueryKey | undefined) => boolean),\n): number {\n const get = useCallback(\n () => mutationCounter.count(predicate),\n [predicate],\n );\n const [count, setCount] = useState<number>(get);\n\n useEffect(() => {\n setCount(get());\n const unsub = mutationCounter.subscribe(() => setCount(get()));\n return unsub;\n }, [get]);\n\n return count;\n}\n","import type { DehydratedState } from './cache';\nimport type { QueryClient } from './client';\nimport type { QueryKey } from './key';\n\n/**\n * Storage-адаптер. Совместим с AsyncStorage и expo-secure-store:\n * { getItem(key): Promise<string|null>, setItem(key, value): Promise<void>,\n * removeItem(key): Promise<void> }.\n */\nexport interface PersistStorage {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n}\n\nexport type PersistOptions = {\n client: QueryClient;\n storage: PersistStorage;\n /** Ключ в storage. По умолчанию 'react-api-client:cache'. */\n storageKey?: string;\n /** Дросселирование записи (ms). По умолчанию 1000. */\n throttleMs?: number;\n /** Фильтр ключей: что вообще сохранять. По умолчанию — всё. */\n allowList?: (key: QueryKey) => boolean;\n /** Максимальный возраст сохранённого снэпшота (ms). Старее — выбрасываем. */\n maxAge?: number;\n /**\n * Версия снэпшота. При несовпадении — снэпшот игнорируется и удаляется.\n * Поднимай при изменении формата данных в кэше.\n */\n version?: string | number;\n};\n\ntype Snapshot = {\n version?: string | number;\n savedAt: number;\n state: DehydratedState;\n};\n\n/**\n * Подключает QueryClient к persistent storage.\n *\n * С версии 2.0.0 — подписан на `cache.subscribeAll`, поэтому\n * автоматически сохраняет состояние через `throttleMs` после любого\n * изменения (setData, успешный fetch, invalidate, remove). Ручной\n * `persist()` остаётся доступным для критичных моментов (logout,\n * shutdown), но в обычном потоке не нужен.\n *\n * Возвращает:\n * - `restore()` — гидратирует кэш из storage. Вызывать на старте.\n * - `persist()` — форс-запись текущего состояния.\n * - `unsubscribe()` — отключить авто-сохранение.\n */\nexport function persistQueryClient(options: PersistOptions): {\n restore: () => Promise<void>;\n persist: () => Promise<void>;\n unsubscribe: () => void;\n} {\n const {\n client,\n storage,\n storageKey = 'react-api-client:cache',\n throttleMs = 1000,\n allowList,\n maxAge,\n version,\n } = options;\n\n let pendingTimer: ReturnType<typeof setTimeout> | null = null;\n let lastSerialized: string | null = null;\n let unsubscribed = false;\n\n const persist = async () => {\n const state = client.cache.dehydrate(allowList);\n if (state.queries.length === 0) return;\n const snap: Snapshot = { version, savedAt: Date.now(), state };\n const serialized = JSON.stringify(snap);\n if (serialized === lastSerialized) return;\n lastSerialized = serialized;\n await storage.setItem(storageKey, serialized);\n };\n\n const scheduleWrite = () => {\n if (unsubscribed) return;\n if (pendingTimer) return; // throttle: один таймер на окно\n pendingTimer = setTimeout(() => {\n pendingTimer = null;\n void persist();\n }, throttleMs);\n };\n\n const restore = async () => {\n const raw = await storage.getItem(storageKey);\n if (!raw) return;\n try {\n const snap = JSON.parse(raw) as Snapshot;\n if (version !== undefined && snap.version !== version) {\n await storage.removeItem(storageKey);\n return;\n }\n if (maxAge && Date.now() - snap.savedAt > maxAge) {\n await storage.removeItem(storageKey);\n return;\n }\n client.cache.hydrate(snap.state);\n } catch {\n await storage.removeItem(storageKey);\n }\n };\n\n const unsubscribeFromCache = client.cache.subscribeAll(scheduleWrite);\n\n return {\n restore,\n persist,\n unsubscribe: () => {\n unsubscribed = true;\n unsubscribeFromCache();\n if (pendingTimer) {\n clearTimeout(pendingTimer);\n pendingTimer = null;\n }\n },\n };\n}","import type { QueryCache, QueryStatus } from './cache';\nimport type { QueryClient } from './client';\nimport type { QueryKey } from './key';\n\nexport type CacheEntrySnapshot = {\n key: QueryKey;\n hash: string;\n status: QueryStatus;\n isStale: boolean;\n updatedAt: number;\n hasData: boolean;\n subscribers: number;\n hasInflight: boolean;\n errorMessage: string | null;\n};\n\n/**\n * Снимок состояния всего кэша — без приватных полей и без данных.\n * Удобно выводить в debug-экране или логировать.\n */\nexport function inspectCache(cache: QueryCache): CacheEntrySnapshot[] {\n const entries = cache._debugEntries();\n const snapshot: CacheEntrySnapshot[] = [];\n for (const [hash, entry] of entries) {\n snapshot.push({\n key: entry.key,\n hash,\n status: entry.state.status,\n isStale: entry.state.isStale,\n updatedAt: entry.state.updatedAt,\n hasData: entry.state.data !== undefined,\n subscribers: entry.subscribers.size,\n hasInflight: entry.inflight !== null,\n errorMessage: entry.state.error?.message ?? null,\n });\n }\n return snapshot;\n}\n\n/** «invalidate all» — пометить весь кэш как stale. */\nexport function invalidateAll(client: QueryClient): void {\n client.invalidateQueries(() => true);\n}\n\n/** Краткая сводка для логов: сколько записей, активных подписчиков, inflight. */\nexport function summarizeCache(cache: QueryCache): {\n total: number;\n withSubscribers: number;\n inflight: number;\n stale: number;\n byStatus: Record<QueryStatus, number>;\n} {\n const byStatus: Record<QueryStatus, number> = {\n idle: 0,\n loading: 0,\n success: 0,\n error: 0,\n };\n let withSubscribers = 0;\n let inflight = 0;\n let stale = 0;\n const entries = cache._debugEntries();\n for (const entry of entries.values()) {\n byStatus[entry.state.status]++;\n if (entry.subscribers.size > 0) withSubscribers++;\n if (entry.inflight) inflight++;\n if (entry.state.isStale) stale++;\n }\n return { total: entries.size, withSubscribers, inflight, stale, byStatus };\n}\n","import {\n createContext,\n createElement,\n useContext,\n useMemo,\n type ReactNode,\n} from 'react';\n\nimport { QueryClient, setQueryClient } from './client';\n\nconst QueryClientContext = createContext<QueryClient | null>(null);\n\nexport type ApiClientProviderProps = {\n client?: QueryClient;\n children: ReactNode;\n};\n\n/**\n * Корневой Provider пакета. Создаёт (или принимает) QueryClient и кладёт\n * его в React Context. Хуки достают клиент через useQueryClient().\n *\n * Также синхронизирует переданный client с singleton'ом\n * getQueryClient() — чтобы push-handler'ы вне React-дерева могли дергать\n * `getQueryClient().invalidateQueries(...)`.\n */\nexport function ApiClientProvider({\n client,\n children,\n}: ApiClientProviderProps) {\n const value = useMemo(() => {\n const instance = client ?? new QueryClient();\n setQueryClient(instance);\n return instance;\n }, [client]);\n\n return createElement(\n QueryClientContext.Provider,\n { value },\n children,\n );\n}\n\nexport function useQueryClient(): QueryClient {\n const ctx = useContext(QueryClientContext);\n if (!ctx) {\n throw new Error(\n 'useQueryClient: не найден ApiClientProvider. Оберни корень приложения в <ApiClientProvider>.',\n );\n }\n return ctx;\n}\n","import { executeRequest } from './utils';\n\nimport { createUseFetch, createUseMutation, createUsePaginate } from './hooks';\n\nimport type {\n ApiClientReturn,\n ApiMutationReturn,\n ApiPaginateReturn,\n RequestConfig,\n ResponseWrapper,\n} from './types';\n\n/**\n * Creates an API client for GET requests\n * @param endpoint - URL string or function that generates URL from params\n * @param fetchConfig - Request configuration\n * @returns Object with fetch method and useFetch hook\n *\n * @example\n * const userApi = apiClient<User, { id: string }>('/api/users/:id')\n * const { data } = userApi.useFetch({ id: '123' })\n */\nfunction apiClient<\n ResponseType = void,\n RequestParamsType = void,\n ErrorResponseType = unknown,\n>(\n endpoint: string | ((arg0: RequestParamsType) => string),\n fetchConfig: RequestConfig = {},\n): ApiClientReturn<ResponseType, RequestParamsType, ErrorResponseType> {\n type RT = ResponseWrapper<ResponseType, ErrorResponseType>;\n\n const fetch = async (params?: RequestParamsType): Promise<RT> => {\n return executeRequest<ResponseType, RequestParamsType, ErrorResponseType>(\n endpoint,\n fetchConfig,\n params,\n );\n };\n\n const useFetch = createUseFetch<\n ResponseType,\n RequestParamsType,\n ErrorResponseType\n >(endpoint, fetchConfig);\n\n return { fetch, useFetch };\n}\n\n/**\n * Creates an API client for mutation requests (POST/PUT/PATCH/DELETE)\n * @param endpoint - URL string or function that generates URL from params\n * @param fetchConfig - Request configuration\n * @returns Object with mutate method and useMutation hook\n *\n * @example\n * const createUserApi = apiMutation<User, CreateUserRequest>('/api/users', { method: 'POST' })\n * const { mutate, isLoading } = createUserApi.useMutation()\n */\nfunction apiMutation<\n ResponseType = void,\n RequestParamsType = void,\n ErrorResponseType = unknown,\n>(\n endpoint: string | ((arg0: RequestParamsType) => string),\n fetchConfig: RequestConfig = {},\n): ApiMutationReturn<ResponseType, RequestParamsType, ErrorResponseType> {\n type RT = ResponseWrapper<ResponseType, ErrorResponseType>;\n\n const mutate = async (params?: RequestParamsType): Promise<RT> => {\n return executeRequest<ResponseType, RequestParamsType, ErrorResponseType>(\n endpoint,\n fetchConfig,\n params,\n );\n };\n\n const useMutation = createUseMutation<\n ResponseType,\n RequestParamsType,\n ErrorResponseType\n >(endpoint, fetchConfig);\n\n return { mutate, useMutation };\n}\n\n/**\n * Creates an API client for paginated requests.\n *\n * Каждая страница хранится в кэше под собственным подключом\n * `['__paginate__', endpoint, params, { page, limit }]`. Это значит, что\n * мутация может одной операцией пометить stale **все страницы** списка:\n *\n * ```ts\n * confirmOrder.useMutation({\n * invalidateKeys: [['__paginate__', '/orders/archive']],\n * });\n * ```\n *\n * Префикс матчится по `matchQueryKey` → подключи каждой страницы тоже\n * считаются совпадающими.\n *\n * @param endpoint - URL string or function that generates URL from params\n * @param fetchConfig - Request configuration\n * @param options - Pagination options (data/total extractors)\n * @returns Object with usePaginate hook\n *\n * @example\n * const usersApi = apiPaginate<UsersResponse, User[], { search?: string }>('/api/users')\n * const { data, fetchNextPage, hasNextPage } = usersApi.usePaginate()\n */\nfunction apiPaginate<\n ResponseType extends { data: TData; total?: number; page?: number },\n TData extends unknown[],\n RequestParamsType = void,\n ErrorResponseType = unknown,\n>(\n endpoint: string | ((arg0: RequestParamsType) => string),\n fetchConfig: RequestConfig = {},\n options?: {\n dataExtractor?: (response: ResponseType) => TData;\n totalExtractor?: (response: ResponseType) => number;\n },\n): ApiPaginateReturn<\n ResponseType,\n RequestParamsType,\n TData,\n ErrorResponseType\n> {\n const usePaginate = createUsePaginate<\n ResponseType,\n TData,\n RequestParamsType,\n ErrorResponseType\n >(endpoint, fetchConfig, options);\n\n return { usePaginate };\n}\n\nexport default apiClient;\nexport { apiMutation, apiPaginate };\n\n// Export configuration\nexport { configureApiClient, getConfig, isConfigured } from './config';\n\n// Унифицированные ошибки (Фаза 3.5 + 1.2)\nexport { ApiError, toApiError, businessErrorToApiError } from './errors';\nexport type { ApiErrorInit } from './errors';\n\n// Global state hooks\nexport { useIsFetching, useIsMutating } from './hooks';\n\n// Query cache layer (Phase 1 + 2)\nexport {\n QueryCache,\n QueryClient,\n getQueryClient,\n setQueryClient,\n hashQueryKey,\n matchQueryKey,\n focusManager,\n onlineManager,\n ApiClientProvider,\n useQueryClient,\n persistQueryClient,\n inspectCache,\n invalidateAll,\n summarizeCache,\n} from './query';\nexport type {\n FetchOptions,\n QueryFn,\n QueryKey,\n QueryState,\n QueryStatus,\n ApiClientProviderProps,\n DehydratedQuery,\n DehydratedState,\n PersistOptions,\n PersistStorage,\n CacheEntrySnapshot,\n} from './query';\n\n// Re-export types for convenience\nexport type {\n ResponseWrapper,\n UseFetchOptions,\n UseFetchResult,\n UseMutationOptions,\n UseMutationResult,\n UsePaginateOptions,\n UsePaginateResult,\n ApiClientConfig,\n ApiClientLogger,\n IHttpClient,\n} from './types';\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/config.ts","../src/errors.ts","../src/utils.ts","../src/logger.ts","../src/query/focus-manager.ts","../src/query/online-manager.ts","../src/query/key.ts","../src/query/cache.ts","../src/query/mutation-counter.ts","../src/query/client.ts","../src/hooks/use-fetch.ts","../src/hooks/use-mutation.ts","../src/hooks/use-paginate.ts","../src/hooks/use-is-fetching.ts","../src/hooks/use-query.ts","../src/hooks/use-queries-data.ts","../src/adapters.ts","../src/query/persist.ts","../src/query/devtools.ts","../src/query/provider.tsx","../src/index.ts"],"names":["useMemo","useCallback","useState","useEffect","state","useRef","error","isObject","createContext","createElement","useContext"],"mappings":";;;;;;;AAEA,IAAI,YAAA,GAAuC,IAAA;AAepC,SAAS,mBAAmB,MAAA,EAA+B;AAChE,EAAA,YAAA,GAAe,MAAA;AACjB;AAMO,SAAS,SAAA,GAA6B;AAC3C,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,YAAA;AACT;AAKO,SAAS,YAAA,GAAwB;AACtC,EAAA,OAAO,YAAA,KAAiB,IAAA;AAC1B;;;ACtBO,IAAM,QAAA,GAAN,MAAM,SAAA,SAA8B,KAAA,CAAM;AAAA,EAS/C,YAAY,IAAA,EAAuB;AACjC,IAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAClB,IAAA,IAAA,CAAK,IAAA,GAAO,UAAA;AACZ,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AACnB,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AACnB,IAAA,IAAA,CAAK,cAAA,GAAiB,KAAK,cAAA,IAAkB,KAAA;AAC7C,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA,CAAK,cAAA,IAAkB,IAAA,CAAK,MAAA,KAAW,GAAA;AAC7D,IAAA,IAAA,CAAK,iBAAA,GACH,IAAA,CAAK,iBAAA,KACJ,IAAA,CAAK,MAAA,KAAW,OAAQ,IAAA,CAAK,MAAA,KAAW,MAAA,IAAa,IAAA,CAAK,MAAA,KAAW,IAAA,CAAA;AACxE,IAAA,IAAA,CAAK,MAAM,IAAA,CAAK,GAAA;AAEhB,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,SAAA,CAAS,SAAS,CAAA;AAAA,EAChD;AACF;AAEA,IAAM,WAAW,CAAC,CAAA,KAChB,OAAO,CAAA,KAAM,YAAY,CAAA,KAAM,IAAA;AAU1B,SAAS,WAAW,MAAA,EAA2B;AACpD,EAAA,IAAI,MAAA,YAAkB,UAAU,OAAO,MAAA;AAEvC,EAAA,IAAI,QAAA,CAAS,MAAM,CAAA,IAAK,UAAA,IAAc,UAAU,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAA,EAAG;AACzE,IAAA,MAAM,IAAI,MAAA,CAAO,QAAA;AACjB,IAAA,MAAM,SAAS,OAAO,CAAA,CAAE,MAAA,KAAW,QAAA,GAAW,EAAE,MAAA,GAAS,CAAA;AACzD,IAAA,MAAM,OAAO,QAAA,CAAS,CAAA,CAAE,IAAI,CAAA,GAAI,EAAE,IAAA,GAAO,MAAA;AACzC,IAAA,MAAM,OAAA,GAAA,CACH,IAAA,IAAQ,OAAO,IAAA,CAAK,YAAY,QAAA,GAAW,IAAA,CAAK,OAAA,GAAU,MAAA,MAC1D,kBAAkB,KAAA,GAAQ,MAAA,CAAO,OAAA,GAAU,MAAA,CAAA,IAC5C,QAAQ,MAAM,CAAA,CAAA;AAChB,IAAA,OAAO,IAAI,QAAA,CAAS;AAAA,MAClB,OAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAM,IAAA,IAAQ,OAAO,KAAK,IAAA,KAAS,QAAA,GAAW,KAAK,IAAA,GAAO,MAAA;AAAA,MAC1D,QAAQ,IAAA,EAAM,MAAA;AAAA,MACd,gBAAgB,MAAA,KAAW,CAAA;AAAA,MAC3B,gBAAgB,MAAA,KAAW,GAAA;AAAA,MAC3B,iBAAA,EAAmB,MAAA,KAAW,GAAA,IAAO,IAAA,EAAM,MAAA,KAAW,MAAA;AAAA,MACtD,GAAA,EAAK,EAAE,IAAA,IAAQ;AAAA,KAChB,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,kBAAkB,KAAA,EAAO;AAC3B,IAAA,OAAO,IAAI,QAAA,CAAS;AAAA,MAClB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,MAAA,EAAQ,CAAA;AAAA,MACR,cAAA,EAAgB,IAAA;AAAA,MAChB,GAAA,EAAK;AAAA,KACN,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,IAAI,QAAA,CAAS;AAAA,IAClB,OAAA,EAAS,eAAA;AAAA,IACT,MAAA,EAAQ,CAAA;AAAA,IACR,GAAA,EAAK;AAAA,GACN,CAAA;AACH;AAOO,SAAS,wBAAwB,QAAA,EAA6B;AACnE,EAAA,IAAI,CAAC,QAAA,CAAS,QAAQ,CAAA,EAAG;AACvB,IAAA,OAAO,IAAI,SAAS,EAAE,OAAA,EAAS,kBAAkB,MAAA,EAAQ,GAAA,EAAK,GAAA,EAAK,QAAA,EAAU,CAAA;AAAA,EAC/E;AACA,EAAA,OAAO,IAAI,QAAA,CAAS;AAAA,IAClB,SACE,OAAO,QAAA,CAAS,OAAA,KAAY,QAAA,GAAW,SAAS,OAAA,GAAU,gBAAA;AAAA,IAC5D,MAAA,EAAQ,GAAA;AAAA,IACR,MAAM,OAAO,QAAA,CAAS,IAAA,KAAS,QAAA,GAAW,SAAS,IAAA,GAAO,MAAA;AAAA,IAC1D,QAAQ,QAAA,CAAS,MAAA;AAAA,IACjB,iBAAA,EAAmB,SAAS,MAAA,KAAW,MAAA;AAAA,IACvC,GAAA,EAAK;AAAA,GACN,CAAA;AACH;;;ACvGO,SAAS,aAAA,CACd,UACA,MAAA,EACQ;AACR,EAAA,IAAI,OAAO,QAAA,KAAa,UAAA,IAAc,OAAO,WAAW,WAAA,EAAa;AACnE,IAAA,OAAO,SAAS,MAAM,CAAA;AAAA,EACxB;AACA,EAAA,OAAO,QAAA;AACT;AAgBA,eAAsB,cAAA,CAKpB,QAAA,EACA,WAAA,EACA,MAAA,EACA,MAAA,EAC2D;AAE3D,EAAA,MAAM,GAAA,GAAM,aAAA,CAAc,QAAA,EAAU,MAAM,CAAA;AAC1C,EAAA,MAAM,SAAS,SAAA,EAAU;AAEzB,EAAA,IAAI;AACF,IAAA,MAAM,aAAA,GAAgB,EAAE,GAAG,WAAA,EAAY;AACvC,IAAA,IAAI,QAAA;AAEJ,IAAA,IACE,cAAc,MAAA,EAAQ,WAAA,OAAkB,KAAA,IACxC,CAAC,cAAc,MAAA,EACf;AACA,MAAA,QAAA,GAAW,MAAM,MAAA,CAAO,UAAA,CAAW,GAAA,CAAkB,GAAA,EAAK;AAAA,QACxD,MAAA,EAAQ;AAAA,UACN,GAAG,aAAA,CAAc,aAAA;AAAA,UACjB,GAAI;AAAA,SACN;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,QAAA,GAAW,MAAM,MAAA,CAAO,UAAA,CAAW,OAAA,CAAsB,GAAA,EAAK;AAAA,QAC5D,QAAQ,aAAA,CAAc,MAAA;AAAA,QACtB,IAAA,EAAM;AAAA,UACJ,GAAG,aAAA,CAAc,aAAA;AAAA,UACjB,GAAI;AAAA,SACN;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH;AAIA,IAAA,IAAI,OAAO,eAAA,EAAiB;AAC1B,MAAA,MAAM,UAAU,MAAA,CAAO,eAAA;AACvB,MAAA,IAAI,OAAA,CAAQ,eAAA,GAAkB,QAAmB,CAAA,EAAG;AAClD,QAAA,MAAM,MACJ,OAAA,CAAQ,OAAA,GAAU,UAAqB,GAAG,CAAA,IAC1C,IAAI,QAAA,CAAS;AAAA,UACX,OAAA,EAAS,gBAAA;AAAA,UACT,MAAA,EAAQ,GAAA;AAAA,UACR,GAAA,EAAK;AAAA,SACN,CAAA;AACH,QAAA,MAAM,GAAA;AAAA,MACR;AACA,MAAA,MAAM,YAAY,OAAA,CAAQ,MAAA,GACrB,OAAA,CAAQ,MAAA,CAAO,QAAmB,CAAA,GACnC,QAAA;AACJ,MAAA,OAAO,SAAA;AAAA,IACT;AAGA,IAAA,MAAM,iBAAA,GACJ,YACA,OAAO,QAAA,KAAa,YACpB,QAAA,IAAa,QAAA,IACb,OAAQ,QAAA,CAA4C,MAAA,KAAW,SAAA;AACjE,IAAA,IACE,MAAA,CAAO,YAAA,IACP,iBAAA,IACC,QAAA,CAA4C,WAAW,KAAA,EACxD;AACA,MAAA,MAAM,wBAAwB,QAAQ,CAAA;AAAA,IACxC;AAEA,IAAA,OAAO,EAAE,GAAG,QAAA,EAAU,MAAA,EAAQ,IAAA,EAAK;AAAA,EACrC,SAAS,CAAA,EAAG;AAEV,IAAA,IAAI,aAAa,QAAA,EAAU;AACzB,MAAA,IAAI,CAAA,CAAE,MAAA,KAAW,GAAA,IAAO,MAAA,CAAO,cAAA,EAAgB;AAC7C,QAAA,MAAM,OAAO,cAAA,EAAe;AAAA,MAC9B;AACA,MAAA,MAAM,CAAA;AAAA,IACR;AAEA,IAAA,MAAM,KAAA,GAAQ,CAAA;AACd,IAAA,MAAM,UAAA,GAAa,MAAM,QAAA,EAAU,MAAA;AAEnC,IAAA,IAAI,UAAA,KAAe,GAAA,IAAO,MAAA,CAAO,cAAA,EAAgB;AAC/C,MAAA,MAAM,OAAO,cAAA,EAAe;AAAA,IAC9B;AAGA,IAAA,IAAI,OAAO,eAAA,EAAiB;AAC1B,MAAA,MAAM,UAAU,MAAA,CAAO,eAAA;AACvB,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,QAAA,EAAU,IAAA,IAAQ,MAAA;AACrC,MAAA,MAAM,SAAS,UAAA,IAAc,CAAA;AAC7B,MAAA,MAAM,MACJ,OAAA,CAAQ,OAAA,GAAU,MAAM,MAAM,CAAA,IAC9B,WAAW,CAAC,CAAA;AACd,MAAA,MAAM,GAAA;AAAA,IACR;AAEA,IAAA,IAAI,OAAO,YAAA,EAAc;AACvB,MAAA,MAAM,WAAW,CAAC,CAAA;AAAA,IACpB;AAEA,IAAA,IAAI,KAAA,CAAM,UAAU,IAAA,EAAM;AACxB,MAAA,OAAO;AAAA,QACL,GAAI,MAAM,QAAA,CAAS,IAAA;AAAA,QACnB,MAAA,EAAQ;AAAA,OACV;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAS,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU;AAAA,KAC5C;AAAA,EACF;AACF;AAKO,SAAS,cAAA,CACd,MAAA,EACA,SAAA,EACA,OAAA,EACM;AACN,EAAA,IAAI,MAAA,CAAO,UAAU,SAAA,EAAW;AAC9B,IAAA,SAAA,CAAU,MAAM,CAAA;AAAA,EAClB,CAAA,MAAA,IAAW,CAAC,MAAA,CAAO,MAAA,IAAU,OAAA,EAAS;AACpC,IAAA,MAAM,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,WAAW,gBAAgB,CAAA;AACxD,IAAA,OAAA,CAAQ,GAAG,CAAA;AAAA,EACb;AACF;;;AC/JA,SAAS,SAAA,GAAyC;AAChD,EAAA,IAAI,CAAC,YAAA,EAAa,EAAG,OAAO,MAAA;AAC5B,EAAA,OAAO,WAAU,CAAE,MAAA;AACrB;AAEO,SAAS,UAAA,CACd,WACG,IAAA,EACG;AACN,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,MAAM,EAAA,GAAK,SAAS,MAAM,CAAA;AAG1B,EAAA,IAAI,CAAC,EAAA,EAAI;AACT,EAAA,IAAI;AACF,IAAA,EAAA,CAAG,GAAG,IAAI,CAAA;AAAA,EACZ,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;;;ACfA,IAAM,eAAN,MAAmB;AAAA,EAAnB,WAAA,GAAA;AACE,IAAA,IAAA,CAAQ,OAAA,GAAU,IAAA;AAClB,IAAA,IAAA,CAAQ,SAAA,uBAAgB,GAAA,EAAc;AACtC,IAAA,IAAA,CAAQ,OAAA,GAA+B,IAAA;AAAA,EAAA;AAAA,EAEvC,UAAU,QAAA,EAAgC;AACxC,IAAA,IAAA,CAAK,SAAA,CAAU,IAAI,QAAQ,CAAA;AAC3B,IAAA,IAAA,CAAK,qBAAA,EAAsB;AAC3B,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,SAAA,CAAU,OAAO,QAAQ,CAAA;AAC9B,MAAA,IAAI,IAAA,CAAK,SAAA,CAAU,IAAA,KAAS,CAAA,OAAQ,wBAAA,EAAyB;AAAA,IAC/D,CAAA;AAAA,EACF;AAAA,EAEA,SAAA,GAAqB;AACnB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,WAAW,OAAA,EAAwB;AACjC,IAAA,IAAI,IAAA,CAAK,YAAY,OAAA,EAAS;AAC9B,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,SAAA,EAAW,CAAA,CAAE,OAAO,CAAA;AAAA,EAC3C;AAAA,EAEQ,qBAAA,GAA8B;AACpC,IAAA,IAAI,KAAK,OAAA,EAAS;AAClB,IAAA,IACE,OAAO,MAAA,KAAW,WAAA,IAClB,OAAO,MAAA,CAAO,qBAAqB,UAAA,EACnC;AACA,MAAA;AAAA,IACF;AACA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA;AAC1C,IAAA,MAAM,eAAe,MAAM;AACzB,MAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,QAAA,IAAA,CAAK,UAAA,CAAW,QAAA,CAAS,eAAA,KAAoB,QAAQ,CAAA;AAAA,MACvD;AAAA,IACF,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,OAAO,CAAA;AACxC,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,MAAA,QAAA,CAAS,gBAAA,CAAiB,oBAAoB,YAAY,CAAA;AAAA,IAC5D;AACA,IAAA,IAAA,CAAK,UAAU,MAAM;AACnB,MAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAC3C,MAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,QAAA,QAAA,CAAS,mBAAA,CAAoB,oBAAoB,YAAY,CAAA;AAAA,MAC/D;AAAA,IACF,CAAA;AAAA,EACF;AAAA,EAEQ,wBAAA,GAAiC;AACvC,IAAA,IAAA,CAAK,OAAA,IAAU;AACf,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,EACjB;AACF,CAAA;AAEO,IAAM,YAAA,GAAe,IAAI,YAAA;;;ACvDhC,IAAM,gBAAN,MAAoB;AAAA,EAApB,WAAA,GAAA;AACE,IAAA,IAAA,CAAQ,MAAA,GAAS,IAAA;AACjB,IAAA,IAAA,CAAQ,SAAA,uBAAgB,GAAA,EAAc;AACtC,IAAA,IAAA,CAAQ,OAAA,GAA+B,IAAA;AAAA,EAAA;AAAA,EAEvC,UAAU,QAAA,EAAgC;AACxC,IAAA,IAAA,CAAK,SAAA,CAAU,IAAI,QAAQ,CAAA;AAC3B,IAAA,IAAA,CAAK,qBAAA,EAAsB;AAC3B,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,SAAA,CAAU,OAAO,QAAQ,CAAA;AAC9B,MAAA,IAAI,IAAA,CAAK,SAAA,CAAU,IAAA,KAAS,CAAA,OAAQ,wBAAA,EAAyB;AAAA,IAC/D,CAAA;AAAA,EACF;AAAA,EAEA,QAAA,GAAoB;AAClB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEA,UAAU,MAAA,EAAuB;AAC/B,IAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAQ;AAC5B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,SAAA,EAAW,CAAA,CAAE,MAAM,CAAA;AAAA,EAC1C;AAAA,EAEQ,qBAAA,GAA8B;AACpC,IAAA,IAAI,KAAK,OAAA,EAAS;AAClB,IAAA,IACE,OAAO,MAAA,KAAW,WAAA,IAClB,OAAO,MAAA,CAAO,qBAAqB,UAAA,EACnC;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAO,SAAA,KAAc,WAAA,IAAe,QAAA,IAAY,SAAA,EAAW;AAC7D,MAAA,IAAA,CAAK,SAAS,SAAA,CAAU,MAAA;AAAA,IAC1B;AACA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAC1C,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AAC5C,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,QAAQ,CAAA;AAC1C,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAC5C,IAAA,IAAA,CAAK,UAAU,MAAM;AACnB,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,QAAQ,CAAA;AAC7C,MAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,SAAS,CAAA;AAAA,IACjD,CAAA;AAAA,EACF;AAAA,EAEQ,wBAAA,GAAiC;AACvC,IAAA,IAAA,CAAK,OAAA,IAAU;AACf,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,EACjB;AACF,CAAA;AAEO,IAAM,aAAA,GAAgB,IAAI,aAAA;;;ACpD1B,SAAS,aAAa,GAAA,EAAuB;AAClD,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK,CAAC,GAAG,KAAA,KAAU;AACvC,IAAA,IAAI,OAAO,UAAU,UAAA,EAAY;AAC/B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC/D,MAAA,MAAM,UAAA,GAAa,MAAA,CAAO,IAAA,CAAK,KAAK,EAAE,IAAA,EAAK;AAC3C,MAAA,MAAM,SAAkC,EAAC;AACzC,MAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,QAAA,MAAM,CAAA,GAAK,MAAkC,CAAC,CAAA;AAC9C,QAAA,IAAI,CAAA,KAAM,MAAA,EAAW,MAAA,CAAO,CAAC,CAAA,GAAI,CAAA;AAAA,MACnC;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAC,CAAA;AACH;AAOO,SAAS,aAAA,CAAc,QAAkB,GAAA,EAAwB;AACtE,EAAA,IAAI,MAAA,CAAO,MAAA,GAAS,GAAA,CAAI,MAAA,EAAQ,OAAO,KAAA;AACvC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,IAAI,YAAA,CAAa,CAAC,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA,KAAM,YAAA,CAAa,CAAC,GAAA,CAAI,CAAC,CAAC,CAAC,GAAG,OAAO,KAAA;AAAA,EACnE;AACA,EAAA,OAAO,IAAA;AACT;;;ACCA,IAAM,eAAA,GAAkB,IAAI,EAAA,GAAK,GAAA;AACjC,IAAM,kBAAA,GAAqB,CAAA;AAMpB,IAAM,aAAN,MAAiB;AAAA,EAAjB,WAAA,GAAA;AACL,IAAA,IAAA,CAAQ,OAAA,uBAAc,GAAA,EAAiC;AACvD,IAAA,IAAA,CAAQ,eAAA,uBAAsB,GAAA,EAAc;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO5C,aAAa,QAAA,EAAgC;AAC3C,IAAA,IAAA,CAAK,eAAA,CAAgB,IAAI,QAAQ,CAAA;AACjC,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,QAAQ,CAAA;AAAA,IACtC,CAAA;AAAA,EACF;AAAA,EAEQ,YAAA,GAAe;AACrB,IAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,eAAA,EAAiB,QAAA,EAAS;AAAA,EACxD;AAAA,EAEQ,WAAA,CACN,GAAA,EACA,SAAA,EACA,MAAA,EACe;AACf,IAAA,MAAM,IAAA,GAAO,aAAa,GAAG,CAAA;AAC7B,IAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AACjC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,KAAA,GAAQ;AAAA,QACN,GAAA;AAAA,QACA,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,MAAA;AAAA,UACN,KAAA,EAAO,IAAA;AAAA,UACP,MAAA,EAAQ,MAAA;AAAA,UACR,SAAA,EAAW,CAAA;AAAA,UACX,OAAA,EAAS;AAAA,SACX;AAAA,QACA,WAAA,sBAAiB,GAAA,EAAI;AAAA,QACrB,QAAA,EAAU,IAAA;AAAA,QACV,kBAAA,EAAoB,IAAA;AAAA,QACpB,OAAA,EAAS,IAAA;AAAA,QACT,WAAA,EAAa,IAAA;AAAA,QACb,WAAW,SAAA,IAAa,kBAAA;AAAA,QACxB,QAAQ,MAAA,IAAU;AAAA,OACpB;AACA,MAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAA,EAAM,KAA4B,CAAA;AAAA,IACrD,CAAA,MAAO;AAEL,MAAA,IAAI,SAAA,KAAc,MAAA,EAAW,KAAA,CAAM,SAAA,GAAY,SAAA;AAC/C,MAAA,IAAI,MAAA,KAAW,MAAA,EAAW,KAAA,CAAM,MAAA,GAAS,MAAA;AAAA,IAC3C;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,SAAY,GAAA,EAA0C;AACpD,IAAA,MAAM,QAAQ,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,YAAA,CAAa,GAAG,CAAC,CAAA;AAGhD,IAAA,OAAO,KAAA,EAAO,KAAA;AAAA,EAChB;AAAA,EAEA,QAAW,GAAA,EAA8B;AACvC,IAAA,OAAO,IAAA,CAAK,QAAA,CAAY,GAAG,CAAA,EAAG,IAAA;AAAA,EAChC;AAAA,EAEA,OAAA,CAAW,KAAe,OAAA,EAA8C;AACtE,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAe,GAAG,CAAA;AACrC,IAAA,MAAM,IAAA,GACJ,OAAO,OAAA,KAAY,UAAA,GACd,QAAuC,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA,GACxD,OAAA;AACN,IAAA,KAAA,CAAM,KAAA,GAAQ;AAAA,MACZ,IAAA,EAAM,IAAA;AAAA,MACN,KAAA,EAAO,IAAA;AAAA,MACP,MAAA,EAAQ,SAAA;AAAA,MACR,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,OAAA,EAAS;AAAA,KACX;AACA,IAAA,IAAA,CAAK,OAAO,KAAK,CAAA;AACjB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAA,CAAU,KAAe,QAAA,EAAgC;AACvD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAqB,GAAG,CAAA;AAC3C,IAAA,KAAA,CAAM,WAAA,CAAY,IAAI,QAAQ,CAAA;AAC9B,IAAA,IAAI,MAAM,OAAA,EAAS;AACjB,MAAA,YAAA,CAAa,MAAM,OAAO,CAAA;AAC1B,MAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAAA,IAClB;AACA,IAAA,OAAO,MAAM;AACX,MAAA,KAAA,CAAM,WAAA,CAAY,OAAO,QAAQ,CAAA;AACjC,MAAA,IAAI,MAAM,WAAA,CAAY,IAAA,KAAS,CAAA,EAAG,IAAA,CAAK,WAAW,KAAK,CAAA;AAAA,IACzD,CAAA;AAAA,EACF;AAAA,EAEQ,OAAU,KAAA,EAAsB;AACtC,IAAA,KAAA,MAAW,QAAA,IAAY,KAAA,CAAM,WAAA,EAAa,QAAA,EAAS;AACnD,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACpB;AAAA,EAEQ,WAAc,KAAA,EAAsB;AAC1C,IAAA,IAAI,KAAA,CAAM,OAAA,EAAS,YAAA,CAAa,KAAA,CAAM,OAAO,CAAA;AAC7C,IAAA,IAAI,KAAA,CAAM,UAAU,CAAA,EAAG;AACrB,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,YAAA,CAAa,KAAA,CAAM,GAAG,CAAC,CAAA;AAC3C,MAAA;AAAA,IACF;AACA,IAAA,KAAA,CAAM,OAAA,GAAU,WAAW,MAAM;AAC/B,MAAA,IAAI,MAAM,WAAA,CAAY,IAAA,KAAS,CAAA,IAAK,CAAC,MAAM,QAAA,EAAU;AACnD,QAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,YAAA,CAAa,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,MAC7C;AAAA,IACF,CAAA,EAAG,MAAM,MAAM,CAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAA,CACJ,GAAA,EACA,OAAA,EACA,OAAA,GAAwB,EAAC,EACb;AACZ,IAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,IAAa,kBAAA;AACvC,IAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,eAAA;AACjC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAe,GAAA,EAAK,WAAW,MAAM,CAAA;AAExD,IAAA,MAAM,OAAA,GACJ,KAAA,CAAM,KAAA,CAAM,MAAA,KAAW,aACvB,CAAC,KAAA,CAAM,KAAA,CAAM,OAAA,IACb,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA,CAAM,MAAM,SAAA,GAAY,SAAA;AAIvC,IAAA,KAAA,CAAM,WAAA,GAAc,OAAA;AAEpB,IAAA,IAAI,CAAC,OAAA,CAAQ,KAAA,IAAS,WAAW,KAAA,CAAM,KAAA,CAAM,SAAS,MAAA,EAAW;AAC/D,MAAA,OAAO,MAAM,KAAA,CAAM,IAAA;AAAA,IACrB;AAEA,IAAA,IAAI,KAAA,CAAM,QAAA,EAAU,OAAO,KAAA,CAAM,QAAA;AAEjC,IAAA,KAAA,CAAM,KAAA,GAAQ,EAAE,GAAG,KAAA,CAAM,OAAO,MAAA,EAAQ,SAAA,EAAW,OAAO,IAAA,EAAK;AAC/D,IAAA,IAAA,CAAK,OAAO,KAAK,CAAA;AAEjB,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,KAAA,GAAQ,OAAO,UAAU,CAAA;AAC/B,IAAC,MAAqD,aAAA,GAAgB,KAAA;AACtE,IAAA,KAAA,CAAM,kBAAA,GAAqB,UAAA;AAE3B,IAAA,MAAM,SAAA,GAAY,MACf,KAAA,CAAqD,aAAA,KACtD,KAAA;AAEF,IAAA,MAAM,aAAyB,YAAY;AACzC,MAAA,IAAI;AACF,QAAA,MAAM,OAAO,MAAM,OAAA,CAAQ,EAAE,MAAA,EAAQ,UAAA,CAAW,QAAQ,CAAA;AACxD,QAAA,IAAI,CAAC,SAAA,EAAU,EAAG,OAAO,IAAA;AACzB,QAAA,KAAA,CAAM,KAAA,GAAQ;AAAA,UACZ,IAAA;AAAA,UACA,KAAA,EAAO,IAAA;AAAA,UACP,MAAA,EAAQ,SAAA;AAAA,UACR,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,UACpB,OAAA,EAAS;AAAA,SACX;AACA,QAAA,IAAA,CAAK,OAAO,KAAK,CAAA;AACjB,QAAA,OAAO,IAAA;AAAA,MACT,SAAS,GAAA,EAAK;AACZ,QAAA,IAAI,CAAC,SAAA,EAAU,EAAG,MAAM,GAAA;AACxB,QAAA,KAAA,CAAM,KAAA,GAAQ;AAAA,UACZ,GAAG,KAAA,CAAM,KAAA;AAAA,UACT,MAAA,EAAQ,OAAA;AAAA,UACR,KAAA,EAAO;AAAA,SACT;AACA,QAAA,IAAA,CAAK,OAAO,KAAK,CAAA;AACjB,QAAA,MAAM,GAAA;AAAA,MACR,CAAA,SAAE;AACA,QAAA,IAAI,WAAU,EAAG;AACf,UAAA,KAAA,CAAM,QAAA,GAAW,IAAA;AACjB,UAAA,KAAA,CAAM,kBAAA,GAAqB,IAAA;AAAA,QAC7B;AAAA,MACF;AAAA,IACF,CAAA,GAAG;AAEH,IAAA,KAAA,CAAM,QAAA,GAAW,SAAA;AACjB,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,SAAA,EAA8D;AACvE,IAAA,MAAM,cAAwB,EAAC;AAC/B,IAAA,MAAM,KAAA,GACJ,OAAO,SAAA,KAAc,UAAA,GACjB,YACA,CAAC,CAAA,KAAgB,aAAA,CAAc,SAAA,EAAW,CAAC,CAAA;AAEjD,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,CAAA,IAAK,KAAK,OAAA,EAAS;AACxC,MAAA,IAAI,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,EAAG;AACpB,QAAA,KAAA,CAAM,QAAQ,EAAE,GAAG,KAAA,CAAM,KAAA,EAAO,SAAS,IAAA,EAAK;AAC9C,QAAA,IAAA,CAAK,OAAO,KAAK,CAAA;AACjB,QAAA,WAAA,CAAY,KAAK,IAAI,CAAA;AAAA,MACvB;AAAA,IACF;AACA,IAAA,OAAO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,eACE,SAAA,EACe;AACf,IAAA,MAAM,KAAA,GACJ,OAAO,SAAA,KAAc,UAAA,GACjB,YACA,CAAC,CAAA,KAAgB,aAAA,CAAc,SAAA,EAAW,CAAC,CAAA;AACjD,IAAA,MAAM,WAA+B,EAAC;AACtC,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AACzC,MAAA,IAAI,CAAC,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,EAAG;AACvB,MAAA,IAAI,CAAC,MAAM,WAAA,EAAa;AACxB,MAAA,QAAA,CAAS,IAAA;AAAA,QACP,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,GAAA,EAAK,KAAA,CAAM,aAAa,EAAE,KAAA,EAAO,IAAA,EAAM,CAAA,CAAE,KAAA;AAAA,UACxD,MAAM;AAAA;AACR,OACF;AAAA,IACF;AACA,IAAA,OAAO,QAAQ,GAAA,CAAI,QAAQ,CAAA,CAAE,IAAA,CAAK,MAAM,MAAS,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,cAAc,SAAA,EAA0D;AACtE,IAAA,MAAM,KAAA,GACJ,OAAO,SAAA,KAAc,UAAA,GACjB,YACA,CAAC,CAAA,KAAgB,aAAA,CAAc,SAAA,EAAW,CAAC,CAAA;AACjD,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AACzC,MAAA,IAAI,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,IAAK,MAAM,QAAA,EAAU;AAEtC,QAAA,KAAA,CAAM,oBAAoB,KAAA,EAAM;AAChC,QAAA,KAAA,CAAM,kBAAA,GAAqB,IAAA;AAC3B,QAAA,KAAA,CAAM,QAAA,GAAW,IAAA;AACjB,QAAC,MACE,aAAA,GAAgB,MAAA;AACnB,QAAA,IAAI,KAAA,CAAM,KAAA,CAAM,MAAA,KAAW,SAAA,EAAW;AACpC,UAAA,KAAA,CAAM,QAAQ,EAAE,GAAG,KAAA,CAAM,KAAA,EAAO,QAAQ,MAAA,EAAO;AAC/C,UAAA,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,SAAA,EAA0D;AAC/D,IAAA,MAAM,KAAA,GACJ,OAAO,SAAA,KAAc,UAAA,GACjB,YACA,CAAC,CAAA,KAAgB,aAAA,CAAc,SAAA,EAAW,CAAC,CAAA;AACjD,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,KAAA,MAAW,CAAC,MAAM,KAAK,CAAA,IAAK,CAAC,GAAG,IAAA,CAAK,OAAO,CAAA,EAAG;AAC7C,MAAA,IAAI,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,EAAG;AACpB,QAAA,IAAI,KAAA,CAAM,OAAA,EAAS,YAAA,CAAa,KAAA,CAAM,OAAO,CAAA;AAC7C,QAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,IAAI,CAAA;AACxB,QAAA,OAAA,GAAU,IAAA;AAAA,MACZ;AAAA,IACF;AACA,IAAA,IAAI,OAAA,OAAc,YAAA,EAAa;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cACE,SAAA,EACQ;AACR,IAAA,MAAM,KAAA,GAAQ,CAAC,SAAA,GACX,MAAM,IAAA,GACN,OAAO,SAAA,KAAc,UAAA,GACrB,SAAA,GACA,CAAC,CAAA,KAAgB,aAAA,CAAc,WAAW,CAAC,CAAA;AAC/C,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AAIzC,MAAA,IAAI,MAAM,KAAA,CAAM,MAAA,KAAW,aAAa,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,EAAG,CAAA,EAAA;AAAA,IAC5D;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAAA;AAAA,EAGA,aAAA,GAA0D;AACxD,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,MAAA,EAAsD;AAC9D,IAAA,MAAM,UAA6B,EAAC;AACpC,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AACzC,MAAA,IAAI,KAAA,CAAM,KAAA,CAAM,MAAA,KAAW,SAAA,EAAW;AACtC,MAAA,IAAI,KAAA,CAAM,KAAA,CAAM,IAAA,KAAS,MAAA,EAAW;AACpC,MAAA,IAAI,MAAA,IAAU,CAAC,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,EAAG;AAClC,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,KAAK,KAAA,CAAM,GAAA;AAAA,QACX,IAAA,EAAM,MAAM,KAAA,CAAM,IAAA;AAAA,QAClB,SAAA,EAAW,MAAM,KAAA,CAAM;AAAA,OACxB,CAAA;AAAA,IACH;AACA,IAAA,OAAO,EAAE,OAAA,EAAQ;AAAA,EACnB;AAAA,EAEA,QAAQ,KAAA,EAA8B;AACpC,IAAA,KAAA,MAAW,CAAA,IAAK,MAAM,OAAA,EAAS;AAC7B,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAqB,CAAA,CAAE,GAAG,CAAA;AAE7C,MAAA,IAAI,KAAA,CAAM,MAAM,SAAA,IAAa,CAAA,CAAE,aAAa,KAAA,CAAM,KAAA,CAAM,SAAS,MAAA,EAAW;AAC1E,QAAA;AAAA,MACF;AACA,MAAA,KAAA,CAAM,KAAA,GAAQ;AAAA,QACZ,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,KAAA,EAAO,IAAA;AAAA,QACP,MAAA,EAAQ,SAAA;AAAA,QACR,WAAW,CAAA,CAAE,SAAA;AAAA,QACb,OAAA,EAAS;AAAA;AAAA,OACX;AACA,MAAA,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,IACnB;AAAA,EACF;AACF;;;AC1YA,IAAM,kBAAN,MAAsB;AAAA,EAAtB,WAAA,GAAA;AACE,IAAA,IAAA,CAAQ,MAAA,uBAAa,GAAA,EAA4B;AACjD,IAAA,IAAA,CAAQ,SAAA,uBAAgB,GAAA,EAAc;AAAA,EAAA;AAAA,EAEtC,KAAA,CAAM,OAAkB,UAAA,EAAsC;AAC5D,IAAA,MAAM,EAAA,GAAK,OAAO,UAAU,CAAA;AAC5B,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAA,EAAI,EAAE,KAAA,EAAO,YAAY,UAAA,IAAc,IAAI,eAAA,EAAgB,EAAG,CAAA;AAC9E,IAAA,IAAA,CAAK,MAAA,EAAO;AACZ,IAAA,OAAO,EAAA;AAAA,EACT;AAAA,EAEA,KAAK,EAAA,EAAkB;AACrB,IAAA,IAAI,KAAK,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA,OAAQ,MAAA,EAAO;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,SAAA,EAAyE;AAC9E,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,MAAA,CAAO,MAAA,EAAO,EAAG;AACtC,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,GAAA,CAAI,WAAW,KAAA,EAAM;AACrB,QAAA;AAAA,MACF;AACA,MAAA,IAAI,OAAO,cAAc,UAAA,EAAY;AACnC,QAAA,IAAI,UAAU,GAAA,CAAI,KAAK,CAAA,EAAG,GAAA,CAAI,WAAW,KAAA,EAAM;AAAA,MACjD,WAAW,GAAA,CAAI,KAAA,IAAS,cAAc,SAAA,EAAW,GAAA,CAAI,KAAK,CAAA,EAAG;AAC3D,QAAA,GAAA,CAAI,WAAW,KAAA,EAAM;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,SAAA,EAA2E;AAC/E,IAAA,IAAI,CAAC,SAAA,EAAW,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA;AACnC,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,MAAA,CAAO,MAAA,EAAO,EAAG;AACtC,MAAA,IAAI,OAAO,cAAc,UAAA,EAAY;AACnC,QAAA,IAAI,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,EAAG,CAAA,EAAA;AAAA,MAC5B,CAAA,MAAO;AACL,QAAA,IAAI,IAAI,KAAA,IAAS,aAAA,CAAc,SAAA,EAAW,GAAA,CAAI,KAAK,CAAA,EAAG,CAAA,EAAA;AAAA,MACxD;AAAA,IACF;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAAA,EAEA,UAAU,QAAA,EAAgC;AACxC,IAAA,IAAA,CAAK,SAAA,CAAU,IAAI,QAAQ,CAAA;AAC3B,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,SAAA,CAAU,OAAO,QAAQ,CAAA;AAAA,IAChC,CAAA;AAAA,EACF;AAAA,EAEQ,MAAA,GAAS;AACf,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,SAAA,EAAW,CAAA,EAAE;AAAA,EACpC;AACF,CAAA;AAEO,IAAM,eAAA,GAAkB,IAAI,eAAA,EAAgB;;;AC/D5C,IAAM,cAAN,MAAkB;AAAA,EAGvB,YAAY,KAAA,EAAoB;AAC9B,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA,IAAS,IAAI,UAAA,EAAW;AAAA,EACvC;AAAA,EAEA,aAAgB,GAAA,EAA8B;AAC5C,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,OAAA,CAAW,GAAG,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAA,CACE,KACA,OAAA,EACG;AACH,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,GAAA,EAAK,OAAO,CAAA;AAAA,EACxC;AAAA,EAEA,UAAA,CACE,GAAA,EACA,OAAA,EACA,OAAA,EACY;AACZ,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,GAAA,EAAK,SAAS,OAAO,CAAA;AAAA,EAC/C;AAAA,EAEA,kBACE,SAAA,EACM;AACN,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,SAAS,CAAA;AAC9C,IAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,UAAA,CAAW,gBAAgB,MAAM,CAAA;AAAA,EAC1D;AAAA,EAEA,cAAc,SAAA,EAA0D;AACtE,IAAA,IAAA,CAAK,KAAA,CAAM,OAAO,SAAS,CAAA;AAAA,EAC7B;AAAA,EAEA,cAAc,SAAA,EAA0D;AACtE,IAAA,IAAA,CAAK,KAAA,CAAM,cAAc,SAAS,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,gBACE,SAAA,EACM;AACN,IAAA,eAAA,CAAgB,OAAO,SAAS,CAAA;AAAA,EAClC;AAAA,EAEA,eACE,SAAA,EACe;AACf,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,cAAA,CAAe,SAAS,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,aAAA,CACE,GAAA,EACA,OAAA,EACA,OAAA,EACe;AACf,IAAA,OAAO,KAAK,KAAA,CAAM,KAAA,CAAM,GAAA,EAAK,OAAA,EAAS,OAAO,CAAA,CAAE,IAAA;AAAA,MAC7C,MAAM,MAAA;AAAA,MACN,MAAM;AAAA,KACR;AAAA,EACF;AACF;AAEA,IAAI,YAAA,GAAmC,IAAA;AAGhC,SAAS,cAAA,GAA8B;AAC5C,EAAA,IAAI,CAAC,YAAA,EAAc,YAAA,GAAe,IAAI,WAAA,EAAY;AAClD,EAAA,OAAO,YAAA;AACT;AAEO,SAAS,eAAe,MAAA,EAA2B;AACxD,EAAA,YAAA,GAAe,MAAA;AACjB;;;AC5FO,SAAS,cAAA,CAKd,UACA,WAAA,EACA;AAGA,EAAA,OAAO,CACL,MAAA,EACA,OAAA,GAA0C,EAAC,KACb;AAC9B,IAAA,MAAM;AAAA,MACJ,OAAA,GAAU,IAAA;AAAA,MACV,cAAA,GAAiB,IAAA;AAAA,MACjB,cAAA,GAAiB,KAAA;AAAA,MACjB,kBAAA,GAAqB,KAAA;AAAA,MACrB,kBAAA,GAAqB,KAAA;AAAA,MACrB,YAAY,YAAA,EAAa,GAAI,SAAA,EAAU,CAAE,oBAAoB,CAAA,GAAI,CAAA;AAAA,MACjE,MAAA;AAAA,MACA,eAAA;AAAA,MACA,QAAA,EAAU,SAAA;AAAA,MACV,MAAA;AAAA,MACA,aAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACF,GAAI,OAAA;AAEJ,IAAA,MAAM,gBAAA,GAAmBA,aAAA;AAAA,MACvB,MAAO,MAAA,KAAW,MAAA,GAAY,IAAA,GAAO,IAAA,CAAK,UAAU,MAAM,CAAA;AAAA,MAC1D,CAAC,MAAM;AAAA,KACT;AAEA,IAAA,MAAM,QAAA,GAAWA,cAAkB,MAAM;AACvC,MAAA,IAAI,WAAW,OAAO,SAAA;AACtB,MAAA,MAAM,aACJ,OAAO,QAAA,KAAa,aAChB,aAAA,CAAiC,QAAA,EAAU,MAAM,CAAA,GACjD,QAAA;AACN,MAAA,OAAO,CAAC,cAAA,EAAgB,UAAA,EAAY,MAAA,IAAU,IAAI,CAAA;AAAA,IAGpD,CAAA,EAAG,CAAC,SAAA,GAAY,YAAA,CAAa,SAAS,CAAA,GAAI,IAAA,EAAM,gBAAgB,CAAC,CAAA;AAEjE,IAAA,MAAM,SAAS,cAAA,EAAe;AAC9B,IAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AAKrB,IAAA,MAAM,OAAA,GAAUC,iBAAA;AAAA,MACd,CAAC,EAAE,MAAA,EAAO,KAA+B;AACvC,QAAA,MAAM,YAAA,GAAe,gBAAA,GAChB,IAAA,CAAK,KAAA,CAAM,gBAAgB,CAAA,GAC5B,MAAA;AACJ,QAAA,OAAO,cAAA,CAIL,QAAA,EAAU,WAAA,EAAa,YAAA,EAAc,MAAM,CAAA;AAAA,MAC/C,CAAA;AAAA,MACA,CAAC,gBAAgB;AAAA,KACnB;AAEA,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,QAAA,CAAa,QAAQ,CAAA;AAChD,IAAA,MAAM,GAAG,WAAW,CAAA,GAAIC,eAAS,CAAC,CAAA;AAClC,IAAA,MAAM,QAAA,GAAWD,kBAAY,MAAM,WAAA,CAAY,OAAK,CAAA,GAAI,CAAC,CAAA,EAAG,EAAE,CAAA;AAS9D,IAAAE,eAAA,CAAU,MAAM;AACd,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,SAAA,CAAU,QAAA,EAAU,QAAQ,CAAA;AAChD,MAAA,OAAO,MAAM;AACX,QAAA,KAAA,EAAM;AACN,QAAA,MAAMC,SAAQ,KAAA,CAAM,aAAA,GAAgB,GAAA,CAAI,YAAA,CAAa,QAAQ,CAAC,CAAA;AAC9D,QAAA,IAAIA,UAASA,MAAAA,CAAM,WAAA,CAAY,IAAA,KAAS,CAAA,IAAKA,OAAM,QAAA,EAAU;AAC3D,UAAA,KAAA,CAAM,cAAc,QAAQ,CAAA;AAAA,QAC9B;AAAA,MACF,CAAA;AAAA,IACF,GAAG,CAAC,KAAA,EAAO,aAAa,QAAQ,CAAA,EAAG,QAAQ,CAAC,CAAA;AAG5C,IAAA,MAAM,eAAA,GAAkBC,YAAA,CAGrB,EAAE,CAAA;AAEL,IAAA,MAAM,QAAA,GAAWJ,iBAAA;AAAA,MACf,OAAO,KAAA,KAAmB;AACxB,QAAA,UAAA,CAAW,gBAAgB,QAAQ,CAAA;AACnC,QAAA,IAAI;AACF,UAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,KAAA,CAAM,UAAU,OAAA,EAAS;AAAA,YAChD,SAAA;AAAA,YACA,MAAA;AAAA,YACA;AAAA,WACD,CAAA;AACD,UAAA,UAAA,CAAW,gBAAA,EAAkB,UAAU,IAAI,CAAA;AAE3C,UAAA,IAAI,eAAA,CAAgB,OAAA,CAAQ,OAAA,KAAY,IAAA,EAAM;AAC5C,YAAA,eAAA,CAAgB,QAAQ,OAAA,GAAU,IAAA;AAClC,YAAA,cAAA;AAAA,cACE,IAAA;AAAA,cACA,SAAA;AAAA,cACA;AAAA,aACF;AAAA,UACF;AAAA,QACF,SAAS,GAAA,EAAK;AACZ,UAAA,UAAA,CAAW,cAAA,EAAgB,UAAU,GAAG,CAAA;AACxC,UAAA,MAAM,CAAA,GAAI,GAAA;AACV,UAAA,MAAM,OAAO,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,EAAE,OAAO,CAAA,CAAA;AACnC,UAAA,IAAI,eAAA,CAAgB,OAAA,CAAQ,SAAA,KAAc,IAAA,EAAM;AAC9C,YAAA,eAAA,CAAgB,QAAQ,SAAA,GAAY,IAAA;AACpC,YAAA,OAAA,GAAU,CAAC,CAAA;AAAA,UACb;AAAA,QACF;AAAA,MACF,CAAA;AAAA,MACA,CAAC,OAAO,YAAA,CAAa,QAAQ,GAAG,OAAA,EAAS,SAAA,EAAW,MAAA,EAAQ,SAAA,EAAW,OAAO;AAAA,KAChF;AAEA,IAAAE,eAAA,CAAU,MAAM;AACd,MAAA,IAAI,CAAC,OAAA,IAAW,CAAC,cAAA,EAAgB;AACjC,MAAA,KAAK,SAAS,KAAK,CAAA;AAAA,IACrB,CAAA,EAAG,CAAC,OAAA,EAAS,cAAA,EAAgB,QAAQ,CAAC,CAAA;AAItC,IAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,QAAA,CAAa,QAAQ,CAAA;AAClD,IAAA,MAAM,OAAA,GAAU,gBAAgB,OAAA,IAAW,KAAA;AAC3C,IAAA,MAAM,cAAA,GAAiB,gBAAgB,IAAA,KAAS,MAAA;AAChD,IAAAA,eAAA,CAAU,MAAM;AACd,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,IAAI,OAAA,IAAW,cAAA,EAAgB,KAAK,QAAA,CAAS,IAAI,CAAA;AAAA,IACnD,GAAG,CAAC,OAAA,EAAS,OAAA,EAAS,cAAA,EAAgB,QAAQ,CAAC,CAAA;AAK/C,IAAAA,eAAA,CAAU,MAAM;AACd,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,IAAI,CAAC,cAAA,IAAkB,CAAC,kBAAA,EAAoB;AAC5C,MAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,SAAA,CAAU,CAAA,OAAA,KAAW;AAC9C,QAAA,IAAI,OAAA,EAAS,KAAK,QAAA,CAAS,KAAK,CAAA;AAAA,MAClC,CAAC,CAAA;AACD,MAAA,OAAO,KAAA;AAAA,IACT,GAAG,CAAC,OAAA,EAAS,cAAA,EAAgB,kBAAA,EAAoB,QAAQ,CAAC,CAAA;AAG1D,IAAAA,eAAA,CAAU,MAAM;AACd,MAAA,IAAI,CAAC,OAAA,IAAW,CAAC,kBAAA,EAAoB;AACrC,MAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,SAAA,CAAU,CAAA,MAAA,KAAU;AAC9C,QAAA,IAAI,MAAA,EAAQ,KAAK,QAAA,CAAS,KAAK,CAAA;AAAA,MACjC,CAAC,CAAA;AACD,MAAA,OAAO,KAAA;AAAA,IACT,CAAA,EAAG,CAAC,OAAA,EAAS,kBAAA,EAAoB,QAAQ,CAAC,CAAA;AAG1C,IAAAA,eAAA,CAAU,MAAM;AACd,MAAA,IAAI,CAAC,OAAA,IAAW,CAAC,eAAA,IAAmB,mBAAmB,CAAA,EAAG;AAC1D,MAAA,IAAI,KAAA,GAA+C,IAAA;AAEnD,MAAA,MAAM,QAAQ,MAAM;AAClB,QAAA,IAAI,KAAA,EAAO;AACX,QAAA,KAAA,GAAQ,YAAY,MAAM;AACxB,UAAA,IAAI,YAAA,CAAa,SAAA,EAAU,EAAG,KAAK,SAAS,IAAI,CAAA;AAAA,QAClD,GAAG,eAAe,CAAA;AAAA,MACpB,CAAA;AACA,MAAA,MAAM,OAAO,MAAM;AACjB,QAAA,IAAI,KAAA,gBAAqB,KAAK,CAAA;AAC9B,QAAA,KAAA,GAAQ,IAAA;AAAA,MACV,CAAA;AAEA,MAAA,KAAA,EAAM;AACN,MAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,SAAA,CAAU,CAAA,OAAA,KAAW;AAC9C,QAAA,IAAI,SAAS,KAAA,EAAM;AAAA,aACd,IAAA,EAAK;AAAA,MACZ,CAAC,CAAA;AACD,MAAA,OAAO,MAAM;AACX,QAAA,IAAA,EAAK;AACL,QAAA,KAAA,EAAM;AAAA,MACR,CAAA;AAAA,IACF,CAAA,EAAG,CAAC,OAAA,EAAS,eAAA,EAAiB,QAAQ,CAAC,CAAA;AAGvC,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,QAAA,CAAa,QAAQ,CAAA,IAAK,YAAA;AAC9C,IAAA,MAAM,OAAA,GAAU,OAAO,IAAA,IAAQ,IAAA;AAK/B,IAAA,MAAM,eAAA,GAAkBE,aAAyB,IAAI,CAAA;AACrD,IAAA,MAAM,YAAA,GAAeL,cAA0B,MAAM;AACnD,MAAA,IAAI,YAAY,IAAA,EAAM;AACpB,QAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAC1B,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,MAAM,IAAA,GAAO,MAAA,GACT,MAAA,CAAO,OAAO,CAAA,GACb,OAAA;AACL,MAAA,MAAM,OAAO,eAAA,CAAgB,OAAA;AAC7B,MAAA,MAAM,OAAA,GAAU,iBAAiB,MAAA,CAAO,EAAA;AACxC,MAAA,IAAI,SAAS,IAAA,IAAQ,OAAA,CAAQ,IAAA,EAAM,IAAI,GAAG,OAAO,IAAA;AACjD,MAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAC1B,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,EAAG,CAAC,OAAA,EAAS,MAAA,EAAQ,aAAa,CAAC,CAAA;AAEnC,IAAA,MAAM,MAAA,GAAS,OAAO,MAAA,IAAU,MAAA;AAChC,IAAA,MAAM,UAAU,OAAA,KAAY,IAAA;AAC5B,IAAA,MAAM,SAAA,GAAY,MAAA,KAAW,SAAA,IAAa,CAAC,OAAA;AAC3C,IAAA,MAAM,YAAA,GAAe,WAAW,SAAA,IAAa,OAAA;AAC7C,IAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,IAAS,IAAA;AAE9B,IAAA,MAAM,OAAA,GAAUC,kBAAY,YAAY;AACtC,MAAA,MAAM,SAAS,IAAI,CAAA;AAAA,IACrB,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,YAAA;AAAA,MACN,SAAA,EAAW,UAAU,SAAA,GAAY,KAAA;AAAA,MACjC,YAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA;AACF;ACxOO,SAAS,iBAAA,CAKd,UACA,WAAA,EACA;AAGA,EAAA,OAAO,CACL,OAAA,GAA+D,EAAC,KACnB;AAC7C,IAAA,MAAM;AAAA,MACJ,QAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACF,GAAI,OAAA;AAEJ,IAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIC,eAAoB,IAAI,CAAA;AAChD,IAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAuB,IAAI,CAAA;AACrD,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,IAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,KAAK,CAAA;AAE5C,IAAA,MAAM,KAAA,GAAQD,kBAAY,MAAM;AAC9B,MAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,MAAM,eAAA,GAAkBA,iBAAAA;AAAA,MACtB,CAAC,MAAyB,MAAA,KAAe;AACvC,QAAA,IAAI,CAAC,cAAA,EAAgB;AACrB,QAAA,MAAM,SAAS,cAAA,EAAe;AAE9B,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,cAAc,CAAA,EAAG;AACjC,UAAA,IAAI,cAAA,CAAe,WAAW,CAAA,EAAG;AACjC,UAAA,MAAA,CAAO,iBAAA;AAAA,YAAkB,CAAC,MACxB,cAAA,CAAe,IAAA,CAAK,YAAU,aAAA,CAAc,MAAA,EAAQ,CAAC,CAAC;AAAA,WACxD;AACA,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,GAAA,GAAM,cAAA,CAAe,IAAA,EAAM,MAAM,CAAA;AACvC,QAAA,IAAI,OAAO,QAAQ,UAAA,EAAY;AAC7B,UAAA,MAAA,CAAO,kBAAkB,GAAG,CAAA;AAC5B,UAAA;AAAA,QACF;AACA,QAAA,IAAI,GAAA,CAAI,WAAW,CAAA,EAAG;AACtB,QAAA,MAAA,CAAO,iBAAA;AAAA,UAAkB,CAAC,MACxB,GAAA,CAAI,IAAA,CAAK,YAAU,aAAA,CAAc,MAAA,EAAQ,CAAC,CAAC;AAAA,SAC7C;AAAA,MACF,CAAA;AAAA,MACA,CAAC,cAAc;AAAA,KACjB;AAEA,IAAA,MAAM,WAAA,GAAcA,iBAAAA;AAAA,MAClB,OAAO,SAAA,KAA8C;AACnD,QAAA,YAAA,CAAa,IAAI,CAAA;AACjB,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,UAAA,CAAW,KAAK,CAAA;AAChB,QAAA,QAAA,CAAS,IAAI,CAAA;AAIb,QAAA,MAAM,KAAA,GACJ,KAAA,CAAM,OAAA,CAAQ,cAAc,CAAA,IAAK,eAAe,MAAA,GAAS,CAAA,GACpD,cAAA,CAAe,CAAC,CAAA,GACjB,MAAA;AACN,QAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,QAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,KAAA,CAAM,KAAA,EAAO,UAAU,CAAA;AAC1D,QAAA,MAAM,UAAA,GAAa,aAAA,CAAiC,QAAA,EAAU,SAAS,CAAA;AACvE,QAAA,UAAA,CAAW,iBAAA,EAAmB,YAAY,SAAS,CAAA;AAEnD,QAAA,IAAI,OAAA;AAEJ,QAAA,IAAI;AACF,UAAA,IAAI,QAAA,EAAU;AACZ,YAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAS,SAAS,CAAA;AACpC,YAAA,OAAA,GAAU,GAAA;AAAA,UACZ;AAEA,UAAA,MAAM,SAAS,MAAM,cAAA,CAInB,UAAU,WAAA,EAAa,SAAA,EAAW,WAAW,MAAM,CAAA;AAErD,UAAA,OAAA,CAAQ,MAAM,CAAA;AAEd,UAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,YAAA,YAAA,CAAa,IAAI,CAAA;AACjB,YAAA,UAAA,CAAW,mBAAA,EAAqB,UAAA,EAAY,SAAA,EAAW,MAAM,CAAA;AAE7D,YAAA,IAAI,YAAA,EAAc;AAChB,cAAA,YAAA,CAAa,cAAA,EAAe,EAAG,SAAA,EAAW,MAAM,CAAA;AAAA,YAClD;AAEA,YAAA,eAAA,CAAgB,WAAW,MAAM,CAAA;AAEjC,YAAA,IAAI,SAAA,EAAW;AACb,cAAA,MAAM,SAAA,CAAU,MAAA,EAAQ,SAAA,EAAW,OAAO,CAAA;AAAA,YAC5C;AAAA,UACF,CAAA,MAAO;AACL,YAAA,MAAM,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,WAAW,iBAAiB,CAAA;AACzD,YAAA,UAAA,CAAW,IAAI,CAAA;AACf,YAAA,QAAA,CAAS,GAAG,CAAA;AACZ,YAAA,UAAA,CAAW,iBAAA,EAAmB,UAAA,EAAY,SAAA,EAAW,GAAG,CAAA;AACxD,YAAA,IAAI,OAAA,EAAS;AACX,cAAA,MAAM,OAAA,CAAQ,GAAA,EAAK,SAAA,EAAW,OAAO,CAAA;AAAA,YACvC;AAAA,UACF;AAEA,UAAA,IAAI,SAAA,EAAW;AACb,YAAA,MAAM,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAW,OAAO,CAAA;AAAA,UAClD;AAEA,UAAA,OAAO,MAAA;AAAA,QACT,SAAS,GAAA,EAAK;AACZ,UAAA,MAAMK,MAAAA,GAAQ,GAAA;AACd,UAAA,QAAA,CAASA,MAAK,CAAA;AACd,UAAA,UAAA,CAAW,IAAI,CAAA;AACf,UAAA,YAAA,CAAa,KAAK,CAAA;AAClB,UAAA,UAAA,CAAW,iBAAA,EAAmB,UAAA,EAAY,SAAA,EAAWA,MAAK,CAAA;AAE1D,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,MAAM,OAAA,CAAQA,MAAAA,EAAO,SAAA,EAAW,OAAO,CAAA;AAAA,UACzC;AACA,UAAA,IAAI,SAAA,EAAW;AACb,YAAA,MAAM,SAAA,CAAU,IAAA,EAAMA,MAAAA,EAAO,SAAA,EAAW,OAAO,CAAA;AAAA,UACjD;AAEA,UAAA,MAAMA,MAAAA;AAAA,QACR,CAAA,SAAE;AACA,UAAA,eAAA,CAAgB,KAAK,UAAU,CAAA;AAC/B,UAAA,YAAA,CAAa,KAAK,CAAA;AAAA,QACpB;AAAA,MACF,CAAA;AAAA,MACA;AAAA,QACE,QAAA;AAAA,QACA,SAAA;AAAA,QACA,OAAA;AAAA,QACA,SAAA;AAAA,QACA,YAAA;AAAA,QACA;AAAA;AACF,KACF;AAEA,IAAA,MAAM,UAAA,GAAaL,iBAAAA;AAAA,MACjB,CAAC,SAAA,KAAiC;AAChC,QAAA,KAAK,YAAY,SAAS,CAAA;AAAA,MAC5B,CAAA;AAAA,MACA,CAAC,WAAW;AAAA,KACd;AAEA,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA,EAAQ,UAAA;AAAA,MACR,WAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA;AACF;AC9KO,SAAS,iBAAA,CAMd,QAAA,EACA,WAAA,EACA,OAAA,EAIA;AAGA,EAAA,OAAO,CACL,MAAA,EACA,WAAA,GAAwD,EAAC,KACxB;AACjC,IAAA,MAAM;AAAA,MACJ,OAAA,GAAU,IAAA;AAAA,MACV,WAAA,GAAc,CAAA;AAAA,MACd,YAAA,GAAe,EAAA;AAAA,MACf,YAAY,YAAA,EAAa,GAAI,SAAA,EAAU,CAAE,oBAAoB,CAAA,GAAI,CAAA;AAAA,MACjE,MAAA;AAAA,MACA,gBAAA,GAAmB,KAAA;AAAA,MACnB,QAAA,EAAU,SAAA;AAAA,MACV,MAAA;AAAA,MACA,aAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACF,GAAI,WAAA;AAEJ,IAAA,MAAM,SAAS,cAAA,EAAe;AAC9B,IAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AAErB,IAAA,MAAM,KAAA,GAAQ,YAAA;AACd,IAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIC,eAAS,WAAW,CAAA;AAC1D,IAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAClE,IAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAuB,IAAI,CAAA;AAErD,IAAA,MAAM,aAAA,GAAgBF,aAAAA;AAAA,MACpB,MACE,OAAA,EAAS,aAAA,KAAkB,CAAC,aAA2B,QAAA,CAAS,IAAA,CAAA;AAAA;AAAA,MAElE;AAAC,KACH;AACA,IAAA,MAAM,cAAA,GAAiBA,aAAAA;AAAA,MACrB,MACE,OAAA,EAAS,cAAA,KACR,CAAC,QAAA,KAA2B,SAAS,KAAA,IAAS,CAAA,CAAA;AAAA;AAAA,MAEjD;AAAC,KACH;AAEA,IAAA,MAAM,gBAAA,GAAmBA,aAAAA;AAAA,MACvB,MAAO,MAAA,KAAW,MAAA,GAAY,IAAA,GAAO,IAAA,CAAK,UAAU,MAAM,CAAA;AAAA,MAC1D,CAAC,MAAM;AAAA,KACT;AAEA,IAAA,MAAM,SAAA,GAAYA,cAAkB,MAAM;AACxC,MAAA,IAAI,WAAW,OAAO,SAAA;AACtB,MAAA,MAAM,UAAA,GACJ,OAAO,QAAA,KAAa,UAAA,GAChB,aAAA;AAAA,QACE,QAAA;AAAA,QACA;AAAA,OACF,GACA,QAAA;AACN,MAAA,OAAO,CAAC,cAAA,EAAgB,UAAA,EAAY,MAAA,IAAU,IAAI,CAAA;AAAA,IAEpD,CAAA,EAAG,CAAC,SAAA,GAAY,YAAA,CAAa,SAAS,CAAA,GAAI,IAAA,EAAM,gBAAgB,CAAC,CAAA;AAEjE,IAAA,MAAM,OAAA,GAAUC,iBAAAA;AAAA,MACd,CAAC,SAA2B,CAAC,GAAG,WAAW,EAAE,IAAA,EAAM,OAAO,CAAA;AAAA,MAC1D,CAAC,WAAW,KAAK;AAAA,KACnB;AAEA,IAAA,MAAM,WAAA,GAAcA,iBAAAA;AAAA,MAClB,CAAC,IAAA,KACC,CAAC,EAAE,QAAO,KAA+B;AACvC,QAAA,MAAM,eAAe,gBAAA,GAChB,IAAA,CAAK,KAAA,CAAM,gBAAgB,IAC5B,EAAC;AACL,QAAA,MAAM,aAAA,GAAgB;AAAA,UACpB,GAAG,YAAA;AAAA,UACH,IAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,OAAO,cAAA,CAIL,QAAA,EAAU,WAAA,EAAa,aAAA,EAAe,MAAM,CAAA;AAAA,MAChD,CAAA;AAAA,MACF,CAAC,kBAAkB,KAAK;AAAA,KAC1B;AAGA,IAAA,MAAM,GAAG,WAAW,CAAA,GAAIC,eAAS,CAAC,CAAA;AAClC,IAAA,MAAM,QAAA,GAAWD,kBAAY,MAAM,WAAA,CAAY,OAAK,CAAA,GAAI,CAAC,CAAA,EAAG,EAAE,CAAA;AAC9D,IAAAE,gBAAU,MAAM;AACd,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,MAAM,QAAQ,KAAA,CAAM,SAAA,CAAU,OAAA,CAAQ,WAAW,GAAG,QAAQ,CAAA;AAC5D,MAAA,OAAO,KAAA;AAAA,IACT,CAAA,EAAG,CAAC,KAAA,EAAO,OAAA,EAAS,YAAA,CAAa,QAAQ,WAAW,CAAC,CAAA,EAAG,QAAQ,CAAC,CAAA;AAEjE,IAAA,MAAM,kBAAA,GAAqBE,aAAwB,IAAI,CAAA;AAEvD,IAAA,MAAM,YAAA,GAAeJ,iBAAAA;AAAA,MACnB,OAAO,MAAc,UAAA,KAAwB;AAC3C,QAAA,IAAI;AACF,UAAA,IAAI,UAAA,wBAAkC,IAAI,CAAA;AAC1C,UAAA,QAAA,CAAS,IAAI,CAAA;AAEb,UAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,KAAA,CAAM,QAAQ,IAAI,CAAA,EAAG,WAAA,CAAY,IAAI,CAAA,EAAG;AAAA,YACjE,SAAA;AAAA,YACA;AAAA,WACD,CAAA;AAED,UAAA,cAAA;AAAA,YACE,MAAA;AAAA,YACA,SAAA;AAAA,YACA;AAAA,WACF;AACA,UAAA,IAAI,CAAC,OAAO,MAAA,EAAQ;AAClB,YAAA,QAAA,CAAS,IAAI,KAAA,CAAM,MAAA,CAAO,OAAA,IAAW,gBAAgB,CAAC,CAAA;AACtD,YAAA;AAAA,UACF;AAEA,UAAA,kBAAA,CAAmB,OAAA,GAAU,QAAQ,IAAI,CAAA;AACzC,UAAA,cAAA,CAAe,IAAI,CAAA;AAAA,QACrB,SAAS,GAAA,EAAK;AACZ,UAAA,MAAM,CAAA,GAAI,GAAA;AACV,UAAA,QAAA,CAAS,CAAC,CAAA;AACV,UAAA,OAAA,GAAU,CAAC,CAAA;AAAA,QACb,CAAA,SAAE;AACA,UAAA,IAAI,UAAA,wBAAkC,KAAK,CAAA;AAAA,QAC7C;AAAA,MACF,CAAA;AAAA,MACA,CAAC,KAAA,EAAO,OAAA,EAAS,aAAa,SAAA,EAAW,MAAA,EAAQ,WAAW,OAAO;AAAA,KACrE;AAGA,IAAAE,gBAAU,MAAM;AACd,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,KAAK,YAAA,CAAa,aAAa,KAAK,CAAA;AACpC,MAAA,cAAA,CAAe,WAAW,CAAA;AAAA,IAE5B,CAAA,EAAG,CAAC,OAAA,EAAS,gBAAA,EAAkB,WAAW,CAAC,CAAA;AAG3C,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,QAAA,CAAa,OAAA,CAAQ,WAAW,CAAC,CAAA;AAC5D,IAAA,MAAM,OAAA,GAAU,cAAc,OAAA,IAAW,KAAA;AACzC,IAAA,MAAM,cAAA,GAAiB,cAAc,IAAA,KAAS,MAAA;AAC9C,IAAAA,gBAAU,MAAM;AACd,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,IAAI,OAAA,IAAW,cAAA,EAAgB,KAAK,YAAA,CAAa,aAAa,KAAK,CAAA;AAAA,IACrE,GAAG,CAAC,OAAA,EAAS,SAAS,cAAA,EAAgB,WAAA,EAAa,YAAY,CAAC,CAAA;AAGhE,IAAA,MAAM,gBAAgB,YAAA,EAAc,IAAA;AACpC,IAAA,MAAM,gBAAA,GACJ,gBAAA,IACA,CAAC,aAAA,IACD,mBAAmB,OAAA,KAAY,IAAA;AACjC,IAAA,MAAM,kBAAkB,gBAAA,GACpB,KAAA,CAAM,OAAA,CAAY,kBAAA,CAAmB,OAAmB,CAAA,GACxD,aAAA;AAEJ,IAAA,MAAM,UACJ,eAAA,IAAmB,eAAA,CAAgB,SAC/B,aAAA,CAAc,eAA+B,IAC5C,EAAC;AAER,IAAA,MAAM,eAAA,GAAkBE,aAAyB,IAAI,CAAA;AACrD,IAAA,MAAM,IAAA,GAAkBL,cAAQ,MAAM;AACpC,MAAA,MAAM,IAAA,GAAO,MAAA,GACT,MAAA,CAAO,OAAO,CAAA,GACb,OAAA;AACL,MAAA,MAAM,OAAO,eAAA,CAAgB,OAAA;AAC7B,MAAA,MAAM,OAAA,GAAU,iBAAiB,MAAA,CAAO,EAAA;AACxC,MAAA,IAAI,SAAS,IAAA,IAAQ,OAAA,CAAQ,IAAA,EAAM,IAAI,GAAG,OAAO,IAAA;AACjD,MAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAC1B,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,EAAG,CAAC,OAAA,EAAS,MAAA,EAAQ,aAAa,CAAC,CAAA;AAEnC,IAAA,MAAM,aACJ,eAAA,IAAmB,eAAA,CAAgB,MAAA,GAC/B,cAAA,CAAe,eAA+B,CAAA,GAC9C,IAAA;AACN,IAAA,MAAM,KAAA,GAAQ,UAAA;AACd,IAAA,MAAM,aAAa,UAAA,KAAe,IAAA,GAAO,KAAK,IAAA,CAAK,UAAA,GAAa,KAAK,CAAA,GAAI,IAAA;AACzE,IAAA,MAAM,WAAA,GAAc,UAAA,KAAe,IAAA,IAAQ,WAAA,GAAc,UAAA;AACzD,IAAA,MAAM,kBAAkB,WAAA,GAAc,CAAA;AAEtC,IAAA,MAAM,MAAA,GAAS,cAAc,MAAA,IAAU,MAAA;AACvC,IAAA,MAAM,SAAA,GAAY,MAAA,KAAW,SAAA,IAAa,CAAC,kBAAkB,CAAC,gBAAA;AAE9D,IAAA,MAAM,aAAA,GAAgBC,kBAAY,YAAY;AAC5C,MAAA,IAAI,CAAC,WAAA,EAAa;AAClB,MAAA,MAAM,YAAA,CAAa,WAAA,GAAc,CAAA,EAAG,IAAI,CAAA;AAAA,IAC1C,CAAA,EAAG,CAAC,WAAA,EAAa,WAAA,EAAa,YAAY,CAAC,CAAA;AAE3C,IAAA,MAAM,iBAAA,GAAoBA,kBAAY,YAAY;AAChD,MAAA,IAAI,CAAC,eAAA,EAAiB;AACtB,MAAA,MAAM,YAAA,CAAa,WAAA,GAAc,CAAA,EAAG,KAAK,CAAA;AAAA,IAC3C,CAAA,EAAG,CAAC,eAAA,EAAiB,WAAA,EAAa,YAAY,CAAC,CAAA;AAE/C,IAAA,MAAM,gBAAA,GAAmBA,kBAAY,YAAY;AAC/C,MAAA,IAAI,CAAC,WAAA,EAAa;AAElB,MAAA,MAAM,KAAA,CAAM,KAAA;AAAA,QACV,OAAA,CAAQ,cAAc,CAAC,CAAA;AAAA,QACvB,WAAA,CAAY,cAAc,CAAC,CAAA;AAAA,QAC3B,EAAE,WAAW,MAAA;AAAO,OACtB;AAAA,IACF,CAAA,EAAG,CAAC,WAAA,EAAa,WAAA,EAAa,OAAO,OAAA,EAAS,WAAA,EAAa,SAAA,EAAW,MAAM,CAAC,CAAA;AAE7E,IAAA,MAAM,OAAA,GAAUA,kBAAY,YAAY;AACtC,MAAA,MAAM,MAAM,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,EAAG,WAAA,CAAY,WAAW,CAAA,EAAG;AAAA,QAChE,SAAA,EAAW,CAAA;AAAA,QACX,MAAA;AAAA,QACA,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH,GAAG,CAAC,KAAA,EAAO,SAAS,WAAA,EAAa,WAAA,EAAa,MAAM,CAAC,CAAA;AAErD,IAAA,MAAM,KAAA,GAAQA,kBAAY,MAAM;AAE9B,MAAA,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAgB;AAC5B,QAAA,IAAI,CAAA,CAAE,MAAA,GAAS,SAAA,CAAU,MAAA,EAAQ,OAAO,KAAA;AACxC,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,QAAQ,CAAA,EAAA,EAAK;AACzC,UAAA,IAAI,YAAA,CAAa,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC,CAAA,KAAM,YAAA,CAAa,CAAC,SAAA,CAAU,CAAC,CAAC,CAAC,GAAG,OAAO,KAAA;AAAA,QACpE;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AACD,MAAA,kBAAA,CAAmB,OAAA,GAAU,IAAA;AAC7B,MAAA,cAAA,CAAe,WAAW,CAAA;AAC1B,MAAA,KAAK,YAAA,CAAa,aAAa,KAAK,CAAA;AAAA,IACtC,GAAG,CAAC,KAAA,EAAO,SAAA,EAAW,WAAA,EAAa,YAAY,CAAC,CAAA;AAEhD,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA;AAAA,MACA,KAAA;AAAA,MACA,WAAA;AAAA,MACA,eAAA;AAAA,MACA,SAAA,EAAW,UAAU,SAAA,GAAY,KAAA;AAAA,MACjC,kBAAA;AAAA,MACA,iBAAA,EAAmB,gBAAA;AAAA,MACnB,KAAA;AAAA,MACA,aAAA;AAAA,MACA,iBAAA;AAAA,MACA,gBAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA;AACF;AC7QO,SAAS,cACd,SAAA,EACQ;AACR,EAAA,MAAM,SAAS,cAAA,EAAe;AAC9B,EAAA,MAAM,GAAA,GAAMA,iBAAAA;AAAA,IACV,MAAM,MAAA,CAAO,KAAA,CAAM,aAAA,CAAc,SAAS,CAAA;AAAA,IAC1C,CAAC,MAAA,CAAO,KAAA,EAAO,SAAS;AAAA,GAC1B;AACA,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIC,eAAiB,GAAG,CAAA;AAE9C,EAAAC,gBAAU,MAAM;AACd,IAAA,QAAA,CAAS,KAAK,CAAA;AACd,IAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,CAAM,YAAA,CAAa,MAAM,QAAA,CAAS,GAAA,EAAK,CAAC,CAAA;AAC7D,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,EAAG,CAAC,MAAA,CAAO,KAAA,EAAO,GAAG,CAAC,CAAA;AAEtB,EAAA,OAAO,KAAA;AACT;AAOO,SAAS,cACd,SAAA,EACQ;AACR,EAAA,MAAM,GAAA,GAAMF,iBAAAA;AAAA,IACV,MAAM,eAAA,CAAgB,KAAA,CAAM,SAAS,CAAA;AAAA,IACrC,CAAC,SAAS;AAAA,GACZ;AACA,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIC,eAAiB,GAAG,CAAA;AAE9C,EAAAC,gBAAU,MAAM;AACd,IAAA,QAAA,CAAS,KAAK,CAAA;AACd,IAAA,MAAM,QAAQ,eAAA,CAAgB,SAAA,CAAU,MAAM,QAAA,CAAS,GAAA,EAAK,CAAC,CAAA;AAC7D,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAER,EAAA,OAAO,KAAA;AACT;ACVO,SAAS,QAAA,CACd,QAAA,EACA,OAAA,EACA,OAAA,GAAyC,EAAC,EACf;AAC3B,EAAA,MAAM;AAAA,IACJ,OAAA,GAAU,IAAA;AAAA,IACV,cAAA,GAAiB,IAAA;AAAA,IACjB,cAAA,GAAiB,KAAA;AAAA,IACjB,kBAAA,GAAqB,KAAA;AAAA,IACrB,kBAAA,GAAqB,KAAA;AAAA,IACrB,SAAA,GAAY,CAAA;AAAA,IACZ,MAAA;AAAA,IACA,eAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,MAAM,SAAS,cAAA,EAAe;AAC9B,EAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,EAAA,MAAM,GAAG,WAAW,CAAA,GAAID,eAAS,CAAC,CAAA;AAClC,EAAA,MAAM,QAAA,GAAWD,kBAAY,MAAM,WAAA,CAAY,OAAK,CAAA,GAAI,CAAC,CAAA,EAAG,EAAE,CAAA;AAE9D,EAAAE,gBAAU,MAAM;AACd,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,SAAA,CAAU,QAAA,EAAU,QAAQ,CAAA;AAChD,IAAA,OAAO,MAAM;AACX,MAAA,KAAA,EAAM;AACN,MAAA,MAAMC,SAAQ,KAAA,CAAM,aAAA,GAAgB,GAAA,CAAI,YAAA,CAAa,QAAQ,CAAC,CAAA;AAC9D,MAAA,IAAIA,UAASA,MAAAA,CAAM,WAAA,CAAY,IAAA,KAAS,CAAA,IAAKA,OAAM,QAAA,EAAU;AAC3D,QAAA,KAAA,CAAM,cAAc,QAAQ,CAAA;AAAA,MAC9B;AAAA,IACF,CAAA;AAAA,EAEF,GAAG,CAAC,KAAA,EAAO,aAAa,QAAQ,CAAA,EAAG,QAAQ,CAAC,CAAA;AAE5C,EAAA,MAAM,QAAA,GAAWH,iBAAAA;AAAA,IACf,OAAO,KAAA,KAAmB;AACxB,MAAA,UAAA,CAAW,gBAAgB,QAAQ,CAAA;AACnC,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,KAAA,CAAM,UAAU,OAAA,EAAS;AAAA,UAChD,SAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACsB,CAAA;AACxB,QAAA,UAAA,CAAW,gBAAA,EAAkB,UAAU,IAAI,CAAA;AAAA,MAC7C,SAAS,GAAA,EAAK;AACZ,QAAA,UAAA,CAAW,cAAA,EAAgB,UAAU,GAAG,CAAA;AAAA,MAC1C;AAAA,IACF,CAAA;AAAA;AAAA,IAEA,CAAC,KAAA,EAAO,YAAA,CAAa,QAAQ,CAAA,EAAG,OAAA,EAAS,WAAW,MAAM;AAAA,GAC5D;AAEA,EAAAE,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,cAAA,EAAgB;AACjC,IAAA,KAAK,SAAS,KAAK,CAAA;AAAA,EACrB,CAAA,EAAG,CAAC,OAAA,EAAS,cAAA,EAAgB,QAAQ,CAAC,CAAA;AAEtC,EAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,QAAA,CAAY,QAAQ,CAAA;AACjD,EAAA,MAAM,OAAA,GAAU,gBAAgB,OAAA,IAAW,KAAA;AAC3C,EAAA,MAAM,cAAA,GAAiB,gBAAgB,IAAA,KAAS,MAAA;AAChD,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,IAAI,OAAA,IAAW,cAAA,EAAgB,KAAK,QAAA,CAAS,IAAI,CAAA;AAAA,EACnD,GAAG,CAAC,OAAA,EAAS,OAAA,EAAS,cAAA,EAAgB,QAAQ,CAAC,CAAA;AAE/C,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,IAAI,CAAC,cAAA,IAAkB,CAAC,kBAAA,EAAoB;AAC5C,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,SAAA,CAAU,CAAA,OAAA,KAAW;AAC9C,MAAA,IAAI,OAAA,EAAS,KAAK,QAAA,CAAS,KAAK,CAAA;AAAA,IAClC,CAAC,CAAA;AACD,IAAA,OAAO,KAAA;AAAA,EACT,GAAG,CAAC,OAAA,EAAS,cAAA,EAAgB,kBAAA,EAAoB,QAAQ,CAAC,CAAA;AAE1D,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,kBAAA,EAAoB;AACrC,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,SAAA,CAAU,CAAA,MAAA,KAAU;AAC9C,MAAA,IAAI,MAAA,EAAQ,KAAK,QAAA,CAAS,KAAK,CAAA;AAAA,IACjC,CAAC,CAAA;AACD,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,EAAG,CAAC,OAAA,EAAS,kBAAA,EAAoB,QAAQ,CAAC,CAAA;AAE1C,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,eAAA,IAAmB,mBAAmB,CAAA,EAAG;AAC1D,IAAA,IAAI,KAAA,GAA+C,IAAA;AACnD,IAAA,MAAM,QAAQ,MAAM;AAClB,MAAA,IAAI,KAAA,EAAO;AACX,MAAA,KAAA,GAAQ,YAAY,MAAM;AACxB,QAAA,IAAI,YAAA,CAAa,SAAA,EAAU,EAAG,KAAK,SAAS,IAAI,CAAA;AAAA,MAClD,GAAG,eAAe,CAAA;AAAA,IACpB,CAAA;AACA,IAAA,MAAM,OAAO,MAAM;AACjB,MAAA,IAAI,KAAA,gBAAqB,KAAK,CAAA;AAC9B,MAAA,KAAA,GAAQ,IAAA;AAAA,IACV,CAAA;AACA,IAAA,KAAA,EAAM;AACN,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,SAAA,CAAU,CAAA,OAAA,KAAW;AAC9C,MAAA,IAAI,SAAS,KAAA,EAAM;AAAA,WACd,IAAA,EAAK;AAAA,IACZ,CAAC,CAAA;AACD,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,EAAK;AACL,MAAA,KAAA,EAAM;AAAA,IACR,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,eAAA,EAAiB,QAAQ,CAAC,CAAA;AAEvC,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,QAAA,CAAY,QAAQ,CAAA;AACxC,EAAA,MAAM,OAAA,GAAU,OAAO,IAAA,IAAQ,IAAA;AAC/B,EAAA,MAAM,eAAA,GAAkBE,aAAyB,IAAI,CAAA;AACrD,EAAA,MAAM,YAAA,GAAeL,cAA0B,MAAM;AACnD,IAAA,IAAI,YAAY,IAAA,EAAM;AACpB,MAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAC1B,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,IAAA,GAAO,MAAA,GAAS,MAAA,CAAO,OAAO,CAAA,GAAK,OAAA;AACzC,IAAA,MAAM,OAAO,eAAA,CAAgB,OAAA;AAC7B,IAAA,MAAM,OAAA,GAAU,iBAAiB,MAAA,CAAO,EAAA;AACxC,IAAA,IAAI,SAAS,IAAA,IAAQ,OAAA,CAAQ,IAAA,EAAM,IAAI,GAAG,OAAO,IAAA;AACjD,IAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAC1B,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,EAAG,CAAC,OAAA,EAAS,MAAA,EAAQ,aAAa,CAAC,CAAA;AAEnC,EAAA,MAAM,MAAA,GAAS,OAAO,MAAA,IAAU,MAAA;AAChC,EAAA,MAAM,UAAU,OAAA,KAAY,IAAA;AAC5B,EAAA,MAAM,SAAA,GAAY,MAAA,KAAW,SAAA,IAAa,CAAC,OAAA;AAC3C,EAAA,MAAM,YAAA,GAAe,WAAW,SAAA,IAAa,OAAA;AAC7C,EAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,IAAS,IAAA;AAE9B,EAAA,MAAM,OAAA,GAAUC,kBAAY,YAAY;AACtC,IAAA,MAAM,SAAS,IAAI,CAAA;AAAA,EACrB,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,YAAA;AAAA,IACN,SAAA,EAAW,UAAU,SAAA,GAAY,KAAA;AAAA,IACjC,YAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACF;AC/JO,SAAS,eACd,IAAA,EACsC;AACtC,EAAA,MAAM,SAAS,cAAA,EAAe;AAC9B,EAAA,MAAM,GAAA,GAAMA,iBAAAA;AAAA,IACV,MAAM,IAAA,CAAK,GAAA,CAAI,OAAK,MAAA,CAAO,YAAA,CAAa,CAAC,CAAC,CAAA;AAAA;AAAA,IAI1C,CAAC,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC;AAAA,GACrD;AAEA,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIC,eAAS,GAAG,CAAA;AAE5C,EAAAC,gBAAU,MAAM;AACd,IAAA,WAAA,CAAY,KAAK,CAAA;AACjB,IAAA,MAAM,SAAS,IAAA,CAAK,GAAA;AAAA,MAAI,CAAA,CAAA,KACtB,OAAO,KAAA,CAAM,SAAA,CAAU,GAAG,MAAM,WAAA,CAAY,GAAA,EAAK,CAAC;AAAA,KACpD;AACA,IAAA,OAAO,MAAM;AACX,MAAA,KAAA,MAAW,CAAA,IAAK,QAAQ,CAAA,EAAE;AAAA,IAC5B,CAAA;AAAA,EAEF,CAAA,EAAG,CAAC,MAAA,EAAQ,GAAG,CAAC,CAAA;AAEhB,EAAA,OAAO,QAAA;AACT;;;ACZA,IAAMI,YAAW,CAAC,CAAA,KAChB,OAAO,CAAA,KAAM,YAAY,CAAA,KAAM,IAAA;AAG1B,IAAM,cAAA,GAAkC;AAAA,EAC7C,iBAAiB,CAAA,CAAA,KACfA,SAAAA,CAAS,CAAC,CAAA,IAAM,EAA2B,MAAA,KAAW,KAAA;AAAA,EACxD,OAAA,EAAS,CAAC,CAAA,EAAG,IAAA,KAAS;AACpB,IAAA,MAAM,IAAA,GAAOA,SAAAA,CAAS,CAAC,CAAA,GAAI,CAAA,GAAI,MAAA;AAC/B,IAAA,OAAO,IAAI,QAAA,CAAS;AAAA,MAClB,OAAA,EAAA,CACG,IAAA,IAAQ,OAAO,IAAA,CAAK,OAAA,KAAY,WAC7B,IAAA,CAAK,OAAA,GACL,MAAA,KAAc,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAA;AAAA,MAChC,MAAA,EAAQ,IAAA;AAAA,MACR,MAAM,IAAA,IAAQ,OAAO,KAAK,IAAA,KAAS,QAAA,GAAW,KAAK,IAAA,GAAO,MAAA;AAAA,MAC1D,QAAQ,IAAA,EAAM,MAAA;AAAA,MACd,gBAAgB,IAAA,KAAS,GAAA;AAAA,MACzB,iBAAA,EAAmB,IAAA,KAAS,GAAA,IAAQ,IAAA,EAAM,MAAA,KAAW,MAAA;AAAA,MACrD,GAAA,EAAK;AAAA,KACN,CAAA;AAAA,EACH;AACF;AAGO,IAAM,cAAA,GAAkC;AAAA,EAC7C,QAAQ,CAAC,CAAA,KAAgBA,UAAS,CAAC,CAAA,GAAI,EAAE,IAAA,GAAO,CAAA;AAAA,EAChD,eAAA,EAAiB,CAAA,CAAA,KACfA,SAAAA,CAAS,CAAC,CAAA,IAAK,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,MAAM,CAAA,IAAK,CAAA,CAAE,MAAA,CAAO,MAAA,GAAS,CAAA;AAAA,EAC9D,OAAA,EAAS,CAAC,CAAA,EAAG,IAAA,KAAS;AACpB,IAAA,MAAM,MAAA,GAASA,SAAAA,CAAS,CAAC,CAAA,IAAK,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,MAAM,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,EAAC;AACpE,IAAA,MAAM,KAAA,GAAQA,UAAS,MAAA,CAAO,CAAC,CAAC,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA,GAAI,MAAA;AAChD,IAAA,OAAO,IAAI,QAAA,CAAS;AAAA,MAClB,UACG,KAAA,IAAS,OAAO,MAAM,MAAA,KAAW,QAAA,GAAW,MAAM,MAAA,GAAS,MAAA,MAC3D,KAAA,IAAS,OAAO,MAAM,KAAA,KAAU,QAAA,GAAW,MAAM,KAAA,GAAQ,MAAA,CAAA,IAC1D,QAAQ,IAAI,CAAA,CAAA;AAAA,MACd,MAAA,EAAQ,IAAA;AAAA,MACR,MAAM,KAAA,IAAS,OAAO,MAAM,IAAA,KAAS,QAAA,GAAW,MAAM,IAAA,GAAO,MAAA;AAAA,MAC7D,MAAA;AAAA,MACA,gBAAgB,IAAA,KAAS,GAAA;AAAA,MACzB,mBAAmB,IAAA,KAAS,GAAA;AAAA,MAC5B,GAAA,EAAK;AAAA,KACN,CAAA;AAAA,EACH;AACF;AAGO,IAAM,cAAA,GAAkC;AAAA,EAC7C,QAAQ,CAAC,CAAA,KAAgBA,UAAS,CAAC,CAAA,GAAI,EAAE,IAAA,GAAO,CAAA;AAAA,EAChD,eAAA,EAAiB,CAAA,CAAA,KACfA,SAAAA,CAAS,CAAC,CAAA,IAAK,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,MAAM,CAAA,IAAK,CAAA,CAAE,MAAA,CAAO,MAAA,GAAS,CAAA;AAAA,EAC9D,OAAA,EAAS,CAAC,CAAA,EAAG,IAAA,KAAS;AACpB,IAAA,MAAM,MAAA,GAASA,SAAAA,CAAS,CAAC,CAAA,IAAK,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,MAAM,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,EAAC;AACpE,IAAA,MAAM,KAAA,GAAQA,UAAS,MAAA,CAAO,CAAC,CAAC,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA,GAAI,MAAA;AAChD,IAAA,OAAO,IAAI,QAAA,CAAS;AAAA,MAClB,OAAA,EAAA,CACG,KAAA,IAAS,OAAO,KAAA,CAAM,OAAA,KAAY,WAC/B,KAAA,CAAM,OAAA,GACN,MAAA,KAAc,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAA;AAAA,MAChC,MAAA,EAAQ,IAAA;AAAA,MACR,MAAA;AAAA,MACA,gBAAgB,IAAA,KAAS,GAAA;AAAA,MACzB,GAAA,EAAK;AAAA,KACN,CAAA;AAAA,EACH;AACF;AAGO,IAAM,kBAAA,GAAsC;AAAA,EACjD,iBAAiB,MAAM,KAAA;AAAA,EACvB,OAAA,EAAS,CAAC,CAAA,EAAG,IAAA,KAAS;AACpB,IAAA,MAAM,IAAA,GAAOA,SAAAA,CAAS,CAAC,CAAA,GAAI,CAAA,GAAI,MAAA;AAC/B,IAAA,OAAO,IAAI,QAAA,CAAS;AAAA,MAClB,UACG,IAAA,IAAQ,OAAO,KAAK,KAAA,KAAU,QAAA,GAAW,KAAK,KAAA,GAAQ,MAAA,MACtD,IAAA,IAAQ,OAAO,KAAK,MAAA,KAAW,QAAA,GAAW,KAAK,MAAA,GAAS,MAAA,CAAA,IACzD,QAAQ,IAAI,CAAA,CAAA;AAAA,MACd,MAAA,EAAQ,IAAA;AAAA,MACR,MAAM,IAAA,IAAQ,OAAO,KAAK,IAAA,KAAS,QAAA,GAAW,KAAK,IAAA,GAAO,MAAA;AAAA,MAC1D,gBAAgB,IAAA,KAAS,GAAA;AAAA,MACzB,mBAAmB,IAAA,KAAS,GAAA;AAAA,MAC5B,GAAA,EAAK;AAAA,KACN,CAAA;AAAA,EACH;AACF;AAGO,IAAM,YAAA,GAAgC;AAAA,EAC3C,iBAAiB,MAAM,KAAA;AAAA,EACvB,OAAA,EAAS,CAAC,CAAA,EAAG,IAAA,KAAS;AACpB,IAAA,MAAM,IAAA,GAAOA,SAAAA,CAAS,CAAC,CAAA,GAAI,CAAA,GAAI,MAAA;AAC/B,IAAA,OAAO,IAAI,QAAA,CAAS;AAAA,MAClB,OAAA,EAAA,CACG,IAAA,IAAQ,OAAO,IAAA,CAAK,OAAA,KAAY,WAC7B,IAAA,CAAK,OAAA,GACL,MAAA,KAAc,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAA;AAAA,MAChC,MAAA,EAAQ,IAAA;AAAA,MACR,gBAAgB,IAAA,KAAS,GAAA;AAAA,MACzB,gBAAgB,IAAA,KAAS,CAAA;AAAA,MACzB,GAAA,EAAK;AAAA,KACN,CAAA;AAAA,EACH;AACF;;;ACxFO,SAAS,mBAAmB,OAAA,EAIjC;AACA,EAAA,MAAM;AAAA,IACJ,MAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA,GAAa,wBAAA;AAAA,IACb,UAAA,GAAa,GAAA;AAAA,IACb,SAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,IAAI,YAAA,GAAqD,IAAA;AACzD,EAAA,IAAI,cAAA,GAAgC,IAAA;AACpC,EAAA,IAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,MAAM,UAAU,YAAY;AAC1B,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,SAAA,CAAU,SAAS,CAAA;AAC9C,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AAChC,IAAA,MAAM,OAAiB,EAAE,OAAA,EAAS,SAAS,IAAA,CAAK,GAAA,IAAO,KAAA,EAAM;AAC7D,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AACtC,IAAA,IAAI,eAAe,cAAA,EAAgB;AACnC,IAAA,cAAA,GAAiB,UAAA;AACjB,IAAA,MAAM,OAAA,CAAQ,OAAA,CAAQ,UAAA,EAAY,UAAU,CAAA;AAAA,EAC9C,CAAA;AAEA,EAAA,MAAM,gBAAgB,MAAM;AAC1B,IAAA,IAAI,YAAA,EAAc;AAClB,IAAA,IAAI,YAAA,EAAc;AAClB,IAAA,YAAA,GAAe,WAAW,MAAM;AAC9B,MAAA,YAAA,GAAe,IAAA;AACf,MAAA,KAAK,OAAA,EAAQ;AAAA,IACf,GAAG,UAAU,CAAA;AAAA,EACf,CAAA;AAEA,EAAA,MAAM,UAAU,YAAY;AAC1B,IAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,OAAA,CAAQ,UAAU,CAAA;AAC5C,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC3B,MAAA,IAAI,OAAA,KAAY,KAAA,CAAA,IAAa,IAAA,CAAK,OAAA,KAAY,OAAA,EAAS;AACrD,QAAA,MAAM,OAAA,CAAQ,WAAW,UAAU,CAAA;AACnC,QAAA;AAAA,MACF;AACA,MAAA,IAAI,UAAU,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,UAAU,MAAA,EAAQ;AAChD,QAAA,MAAM,OAAA,CAAQ,WAAW,UAAU,CAAA;AACnC,QAAA;AAAA,MACF;AACA,MAAA,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AAAA,IACjC,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,OAAA,CAAQ,WAAW,UAAU,CAAA;AAAA,IACrC;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,oBAAA,GAAuB,MAAA,CAAO,KAAA,CAAM,YAAA,CAAa,aAAa,CAAA;AAEpE,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,OAAA;AAAA,IACA,aAAa,MAAM;AACjB,MAAA,YAAA,GAAe,IAAA;AACf,MAAA,oBAAA,EAAqB;AACrB,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,YAAA,CAAa,YAAY,CAAA;AACzB,QAAA,YAAA,GAAe,IAAA;AAAA,MACjB;AAAA,IACF;AAAA,GACF;AACF;;;ACxGO,SAAS,aAAa,KAAA,EAAyC;AACpE,EAAA,MAAM,OAAA,GAAU,MAAM,aAAA,EAAc;AACpC,EAAA,MAAM,WAAiC,EAAC;AACxC,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,CAAA,IAAK,OAAA,EAAS;AACnC,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,KAAK,KAAA,CAAM,GAAA;AAAA,MACX,IAAA;AAAA,MACA,MAAA,EAAQ,MAAM,KAAA,CAAM,MAAA;AAAA,MACpB,OAAA,EAAS,MAAM,KAAA,CAAM,OAAA;AAAA,MACrB,SAAA,EAAW,MAAM,KAAA,CAAM,SAAA;AAAA,MACvB,OAAA,EAAS,KAAA,CAAM,KAAA,CAAM,IAAA,KAAS,MAAA;AAAA,MAC9B,WAAA,EAAa,MAAM,WAAA,CAAY,IAAA;AAAA,MAC/B,WAAA,EAAa,MAAM,QAAA,KAAa,IAAA;AAAA,MAChC,YAAA,EAAc,KAAA,CAAM,KAAA,CAAM,KAAA,EAAO,OAAA,IAAW;AAAA,KAC7C,CAAA;AAAA,EACH;AACA,EAAA,OAAO,QAAA;AACT;AAGO,SAAS,cAAc,MAAA,EAA2B;AACvD,EAAA,MAAA,CAAO,iBAAA,CAAkB,MAAM,IAAI,CAAA;AACrC;AAGO,SAAS,eAAe,KAAA,EAM7B;AACA,EAAA,MAAM,QAAA,GAAwC;AAAA,IAC5C,IAAA,EAAM,CAAA;AAAA,IACN,OAAA,EAAS,CAAA;AAAA,IACT,OAAA,EAAS,CAAA;AAAA,IACT,KAAA,EAAO;AAAA,GACT;AACA,EAAA,IAAI,eAAA,GAAkB,CAAA;AACtB,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,MAAM,OAAA,GAAU,MAAM,aAAA,EAAc;AACpC,EAAA,KAAA,MAAW,KAAA,IAAS,OAAA,CAAQ,MAAA,EAAO,EAAG;AACpC,IAAA,QAAA,CAAS,KAAA,CAAM,MAAM,MAAM,CAAA,EAAA;AAC3B,IAAA,IAAI,KAAA,CAAM,WAAA,CAAY,IAAA,GAAO,CAAA,EAAG,eAAA,EAAA;AAChC,IAAA,IAAI,MAAM,QAAA,EAAU,QAAA,EAAA;AACpB,IAAA,IAAI,KAAA,CAAM,MAAM,OAAA,EAAS,KAAA,EAAA;AAAA,EAC3B;AACA,EAAA,OAAO,EAAE,KAAA,EAAO,OAAA,CAAQ,MAAM,eAAA,EAAiB,QAAA,EAAU,OAAO,QAAA,EAAS;AAC3E;AC3DA,IAAM,kBAAA,GAAqBC,oBAAkC,IAAI,CAAA;AAe1D,SAAS,iBAAA,CAAkB;AAAA,EAChC,MAAA;AAAA,EACA;AACF,CAAA,EAA2B;AACzB,EAAA,MAAM,KAAA,GAAQR,cAAQ,MAAM;AAC1B,IAAA,MAAM,QAAA,GAAW,MAAA,IAAU,IAAI,WAAA,EAAY;AAC3C,IAAA,cAAA,CAAe,QAAQ,CAAA;AACvB,IAAA,OAAO,QAAA;AAAA,EACT,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,OAAOS,mBAAA;AAAA,IACL,kBAAA,CAAmB,QAAA;AAAA,IACnB,EAAE,KAAA,EAAM;AAAA,IACR;AAAA,GACF;AACF;AAEO,SAAS,cAAA,GAA8B;AAC5C,EAAA,MAAM,GAAA,GAAMC,iBAAW,kBAAkB,CAAA;AACzC,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;;;AC5BA,SAAS,SAAA,CAKP,QAAA,EACA,WAAA,GAA6B,EAAC,EACuC;AAGrE,EAAA,MAAM,KAAA,GAAQ,OAAO,MAAA,KAA4C;AAC/D,IAAA,OAAO,cAAA;AAAA,MACL,QAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,QAAA,GAAW,cAAA,CAIf,QAAA,EAAU,WAAW,CAAA;AAEvB,EAAA,OAAO,EAAE,OAAO,QAAA,EAAS;AAC3B;AAYA,SAAS,WAAA,CAKP,QAAA,EACA,WAAA,GAA6B,EAAC,EACyC;AAGvE,EAAA,MAAM,MAAA,GAAS,OAAO,MAAA,KAA4C;AAChE,IAAA,OAAO,cAAA;AAAA,MACL,QAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,iBAAA,CAIlB,QAAA,EAAU,WAAW,CAAA;AAEvB,EAAA,OAAO,EAAE,QAAQ,WAAA,EAAY;AAC/B;AA2BA,SAAS,WAAA,CAMP,QAAA,EACA,WAAA,GAA6B,IAC7B,OAAA,EASA;AACA,EAAA,MAAM,WAAA,GAAc,iBAAA,CAKlB,QAAA,EAAU,WAAA,EAAa,OAAO,CAAA;AAEhC,EAAA,OAAO,EAAE,WAAA,EAAY;AACvB;AAEA,IAAO,aAAA,GAAQ","file":"index.js","sourcesContent":["import type { ApiClientConfig } from './types';\n\nlet globalConfig: ApiClientConfig | null = null;\n\n/**\n * Configure the API client globally\n * @param config - API client configuration\n *\n * @example\n * import { configureApiClient } from '@krymskyimaksym/react-api-client';\n * import { router } from 'expo-router';\n *\n * configureApiClient({\n * httpClient: myHttpClient,\n * onUnauthorized: () => router.replace('/login')\n * });\n */\nexport function configureApiClient(config: ApiClientConfig): void {\n globalConfig = config;\n}\n\n/**\n * Get the current global configuration\n * @throws Error if configuration is not set\n */\nexport function getConfig(): ApiClientConfig {\n if (!globalConfig) {\n throw new Error(\n 'API client is not configured. Call configureApiClient() first.',\n );\n }\n return globalConfig;\n}\n\n/**\n * Check if the API client is configured\n */\nexport function isConfigured(): boolean {\n return globalConfig !== null;\n}\n","/**\n * Унифицированная ошибка API. Кидается из `executeRequest` (а значит,\n * из `fetch`/`mutate`/хуков) только когда в `configureApiClient` включён\n * `throwOnError: true`. По умолчанию поведение пакета не меняется —\n * ошибки приходят как `{ status: false }` (см. CHANGELOG, Фаза 3.5).\n */\nexport type ApiErrorInit<E = unknown> = {\n message: string;\n status: number;\n code?: string;\n errors?: E;\n isNetworkError?: boolean;\n isUnauthorized?: boolean;\n isValidationError?: boolean;\n raw?: unknown;\n};\n\nexport class ApiError<E = unknown> extends Error {\n readonly status: number;\n readonly code?: string;\n readonly errors?: E;\n readonly isNetworkError: boolean;\n readonly isUnauthorized: boolean;\n readonly isValidationError: boolean;\n readonly raw: unknown;\n\n constructor(init: ApiErrorInit<E>) {\n super(init.message);\n this.name = 'ApiError';\n this.status = init.status;\n this.code = init.code;\n this.errors = init.errors;\n this.isNetworkError = init.isNetworkError ?? false;\n this.isUnauthorized = init.isUnauthorized ?? init.status === 401;\n this.isValidationError =\n init.isValidationError ??\n (init.status === 422 || (init.errors !== undefined && init.errors !== null));\n this.raw = init.raw;\n // корректный prototype chain для instanceof после транспиляции\n Object.setPrototypeOf(this, ApiError.prototype);\n }\n}\n\nconst isObject = (v: unknown): v is Record<string, unknown> =>\n typeof v === 'object' && v !== null;\n\n/**\n * Конвертация произвольного throw'нутого значения в `ApiError`.\n * Покрывает 4 кейса:\n * - `ApiError` → passthrough\n * - axios-like `{ response: { status, data } }` → ApiError с полями из data\n * - `Error` (сетевая ошибка, таймаут) → ApiError(isNetworkError, status: 0)\n * - неизвестный объект → ApiError(message: 'Unknown error', status: 0)\n */\nexport function toApiError(thrown: unknown): ApiError {\n if (thrown instanceof ApiError) return thrown;\n\n if (isObject(thrown) && 'response' in thrown && isObject(thrown.response)) {\n const r = thrown.response as { status?: number; data?: unknown };\n const status = typeof r.status === 'number' ? r.status : 0;\n const data = isObject(r.data) ? r.data : undefined;\n const message =\n (data && typeof data.message === 'string' ? data.message : undefined) ??\n (thrown instanceof Error ? thrown.message : undefined) ??\n `HTTP ${status}`;\n return new ApiError({\n message,\n status,\n code: data && typeof data.code === 'string' ? data.code : undefined,\n errors: data?.errors as unknown,\n isNetworkError: status === 0,\n isUnauthorized: status === 401,\n isValidationError: status === 422 || data?.errors !== undefined,\n raw: r.data ?? thrown,\n });\n }\n\n if (thrown instanceof Error) {\n return new ApiError({\n message: thrown.message,\n status: 0,\n isNetworkError: true,\n raw: thrown,\n });\n }\n\n return new ApiError({\n message: 'Unknown error',\n status: 0,\n raw: thrown,\n });\n}\n\n/**\n * Для 2xx ответа, в теле которого Laravel-style `{ status: false }`.\n * Возвращает ApiError(status: 200, ...). Вызывается из executeRequest\n * только при `throwOnError: true`.\n */\nexport function businessErrorToApiError(response: unknown): ApiError {\n if (!isObject(response)) {\n return new ApiError({ message: 'Request failed', status: 200, raw: response });\n }\n return new ApiError({\n message:\n typeof response.message === 'string' ? response.message : 'Request failed',\n status: 200,\n code: typeof response.code === 'string' ? response.code : undefined,\n errors: response.errors,\n isValidationError: response.errors !== undefined,\n raw: response,\n });\n}\n","import { getConfig } from './config';\nimport { ApiError, businessErrorToApiError, toApiError } from './errors';\n\nimport type { RequestConfig, ResponseWrapper } from './types';\n\n/**\n * Builds the endpoint URL from a string or function\n */\nexport function buildEndpoint<RequestParamsType>(\n endpoint: string | ((arg0: RequestParamsType) => string),\n params?: RequestParamsType,\n): string {\n if (typeof endpoint === 'function' && typeof params !== 'undefined') {\n return endpoint(params);\n }\n return endpoint as string;\n}\n\ntype AxiosLikeError<E> = {\n response?: { status: number; data: E };\n message?: string;\n};\n\n/**\n * Executes an HTTP request with error handling and response wrapping.\n *\n * Поведение зависит от `throwOnError` в `configureApiClient`:\n * - false (default): возвращает `{ status: true, ... }` либо\n * `{ status: false, message?, errors? }`. Старое поведение.\n * - true: на HTTP >= 400 / сетевой ошибке / теле с `{ status: false }`\n * кидает `ApiError`.\n */\nexport async function executeRequest<\n ResponseType,\n RequestParamsType,\n ErrorResponseType,\n>(\n endpoint: string | ((arg0: RequestParamsType) => string),\n fetchConfig: RequestConfig,\n params?: RequestParamsType,\n signal?: AbortSignal,\n): Promise<ResponseWrapper<ResponseType, ErrorResponseType>> {\n type RT = ResponseWrapper<ResponseType, ErrorResponseType>;\n const url = buildEndpoint(endpoint, params);\n const config = getConfig();\n\n try {\n const requestConfig = { ...fetchConfig };\n let response: ResponseType;\n\n if (\n requestConfig.method?.toUpperCase() === 'GET' ||\n !requestConfig.method\n ) {\n response = await config.httpClient.get<ResponseType>(url, {\n params: {\n ...requestConfig.requestParams,\n ...(params as Record<string, string>),\n },\n signal,\n });\n } else {\n response = await config.httpClient.request<ResponseType>(url, {\n method: requestConfig.method,\n data: {\n ...requestConfig.requestParams,\n ...(params as Record<string, unknown>),\n },\n signal,\n });\n }\n\n // Если задан responseAdapter — отдаём управление ему.\n // Это единственный путь обработки ответа для не-Laravel бекендов.\n if (config.responseAdapter) {\n const adapter = config.responseAdapter;\n if (adapter.isBusinessError?.(response as unknown)) {\n const err =\n adapter.toError?.(response as unknown, 200) ??\n new ApiError({\n message: 'Business error',\n status: 200,\n raw: response,\n });\n throw err;\n }\n const unwrapped = adapter.unwrap\n ? (adapter.unwrap(response as unknown) as ResponseType)\n : response;\n return unwrapped as unknown as RT;\n }\n\n // Дефолтный (Laravel) путь — обратная совместимость с 1.x / 2.0.\n const hasExplicitStatus =\n response &&\n typeof response === 'object' &&\n 'status' in (response as object) &&\n typeof (response as unknown as { status: unknown }).status === 'boolean';\n if (\n config.throwOnError &&\n hasExplicitStatus &&\n (response as unknown as { status: boolean }).status === false\n ) {\n throw businessErrorToApiError(response);\n }\n\n return { ...response, status: true } as RT;\n } catch (e) {\n // Уже наш ApiError — пробрасываем без модификаций\n if (e instanceof ApiError) {\n if (e.status === 401 && config.onUnauthorized) {\n await config.onUnauthorized();\n }\n throw e;\n }\n\n const error = e as AxiosLikeError<ErrorResponseType>;\n const httpStatus = error.response?.status;\n\n if (httpStatus === 401 && config.onUnauthorized) {\n await config.onUnauthorized();\n }\n\n // Adapter-путь: всегда ApiError через adapter.toError.\n if (config.responseAdapter) {\n const adapter = config.responseAdapter;\n const body = error.response?.data ?? undefined;\n const status = httpStatus ?? 0;\n const err =\n adapter.toError?.(body, status) ??\n toApiError(e);\n throw err;\n }\n\n if (config.throwOnError) {\n throw toApiError(e);\n }\n\n if (error.response?.data) {\n return {\n ...(error.response.data as Record<string, unknown>),\n status: false,\n } as unknown as RT;\n }\n\n return {\n status: false,\n message: e instanceof Error ? e.message : 'Request error',\n } as unknown as RT;\n }\n}\n\n/**\n * Handles response success and error callbacks\n */\nexport function handleResponse<T, E = unknown>(\n result: ResponseWrapper<T, E>,\n onSuccess?: (data: ResponseWrapper<T, E>) => void,\n onError?: (error: Error) => void,\n): void {\n if (result.status && onSuccess) {\n onSuccess(result);\n } else if (!result.status && onError) {\n const err = new Error(result.message ?? 'Request failed');\n onError(err);\n }\n}\n","import { getConfig, isConfigured } from './config';\nimport type { ApiClientLogger } from './types';\n\n/**\n * Безопасный доступ к logger из глобального конфига: ошибки колбэков\n * проглатываются, отсутствие конфига/логгера — no-op.\n */\nfunction getLogger(): ApiClientLogger | undefined {\n if (!isConfigured()) return undefined;\n return getConfig().logger;\n}\n\nexport function callLogger<K extends keyof ApiClientLogger>(\n method: K,\n ...args: Parameters<NonNullable<ApiClientLogger[K]>>\n): void {\n const logger = getLogger();\n const fn = logger?.[method] as\n | ((...a: Parameters<NonNullable<ApiClientLogger[K]>>) => void)\n | undefined;\n if (!fn) return;\n try {\n fn(...args);\n } catch {\n // логгер не должен ломать приложение\n }\n}\n","/**\n * Глобальный менеджер «фокуса» приложения.\n * - В вебе автоматически подключается к window focus/visibilitychange.\n * - В React Native интеграцию ставит сам потребитель через\n * `focusManager.setFocused(state === 'active')` из AppState.\n *\n * Подписчики (useFetch с refetchOnFocus / refetchOnAppActive) получают\n * уведомление при переходе в focused == true.\n */\ntype Listener = (focused: boolean) => void;\n\nclass FocusManager {\n private focused = true;\n private listeners = new Set<Listener>();\n private cleanup: (() => void) | null = null;\n\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n this.setupBrowserListeners();\n return () => {\n this.listeners.delete(listener);\n if (this.listeners.size === 0) this.teardownBrowserListeners();\n };\n }\n\n isFocused(): boolean {\n return this.focused;\n }\n\n setFocused(focused: boolean): void {\n if (this.focused === focused) return;\n this.focused = focused;\n for (const l of this.listeners) l(focused);\n }\n\n private setupBrowserListeners(): void {\n if (this.cleanup) return;\n if (\n typeof window === 'undefined' ||\n typeof window.addEventListener !== 'function'\n ) {\n return;\n }\n const onFocus = () => this.setFocused(true);\n const onVisibility = () => {\n if (typeof document !== 'undefined') {\n this.setFocused(document.visibilityState !== 'hidden');\n }\n };\n window.addEventListener('focus', onFocus);\n if (typeof document !== 'undefined') {\n document.addEventListener('visibilitychange', onVisibility);\n }\n this.cleanup = () => {\n window.removeEventListener('focus', onFocus);\n if (typeof document !== 'undefined') {\n document.removeEventListener('visibilitychange', onVisibility);\n }\n };\n }\n\n private teardownBrowserListeners(): void {\n this.cleanup?.();\n this.cleanup = null;\n }\n}\n\nexport const focusManager = new FocusManager();\nexport type { FocusManager };\n","/**\n * Глобальный менеджер сетевого статуса.\n * - В браузере подключается к window online/offline.\n * - В React Native интеграция — через NetInfo (опционально):\n * `NetInfo.addEventListener(s => onlineManager.setOnline(!!s.isConnected))`.\n * Жёсткой зависимости от NetInfo нет — без него по умолчанию online: true.\n *\n * Подписчики (useFetch с refetchOnReconnect) получают уведомление при\n * переходе offline → online.\n */\ntype Listener = (online: boolean) => void;\n\nclass OnlineManager {\n private online = true;\n private listeners = new Set<Listener>();\n private cleanup: (() => void) | null = null;\n\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n this.setupBrowserListeners();\n return () => {\n this.listeners.delete(listener);\n if (this.listeners.size === 0) this.teardownBrowserListeners();\n };\n }\n\n isOnline(): boolean {\n return this.online;\n }\n\n setOnline(online: boolean): void {\n if (this.online === online) return;\n this.online = online;\n for (const l of this.listeners) l(online);\n }\n\n private setupBrowserListeners(): void {\n if (this.cleanup) return;\n if (\n typeof window === 'undefined' ||\n typeof window.addEventListener !== 'function'\n ) {\n return;\n }\n // navigator.onLine может врать, но как initial state — ок\n if (typeof navigator !== 'undefined' && 'onLine' in navigator) {\n this.online = navigator.onLine;\n }\n const onOnline = () => this.setOnline(true);\n const onOffline = () => this.setOnline(false);\n window.addEventListener('online', onOnline);\n window.addEventListener('offline', onOffline);\n this.cleanup = () => {\n window.removeEventListener('online', onOnline);\n window.removeEventListener('offline', onOffline);\n };\n }\n\n private teardownBrowserListeners(): void {\n this.cleanup?.();\n this.cleanup = null;\n }\n}\n\nexport const onlineManager = new OnlineManager();\nexport type { OnlineManager };\n","export type QueryKey = readonly unknown[];\n\n/**\n * Стабильная сериализация ключа кэша.\n * - Объекты сериализуются с сортировкой ключей.\n * - Массивы сохраняют порядок.\n * - Функции и symbol — недопустимы (как в TanStack Query), кидаем.\n * - undefined в массиве становится null, в объекте — поле пропускается.\n *\n * Пример: ['orders', { sort: 'date', dir: 'asc' }] и\n * ['orders', { dir: 'asc', sort: 'date' }] дают одинаковый hash.\n */\nexport function hashQueryKey(key: QueryKey): string {\n return JSON.stringify(key, (_, value) => {\n if (typeof value === 'function') {\n throw new Error(\n 'react-api-client: функции запрещены в queryKey — ключ должен быть сериализуем',\n );\n }\n if (typeof value === 'symbol') {\n throw new Error(\n 'react-api-client: symbol запрещены в queryKey — ключ должен быть сериализуем',\n );\n }\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const sortedKeys = Object.keys(value).sort();\n const result: Record<string, unknown> = {};\n for (const k of sortedKeys) {\n const v = (value as Record<string, unknown>)[k];\n if (v !== undefined) result[k] = v;\n }\n return result;\n }\n return value;\n });\n}\n\n/**\n * Проверяет, начинается ли `key` с `prefix`.\n * Используется для invalidateQueries по префиксу: ['orders'] матчит\n * и ['orders', 'manager'], и ['orders', 960].\n */\nexport function matchQueryKey(prefix: QueryKey, key: QueryKey): boolean {\n if (prefix.length > key.length) return false;\n for (let i = 0; i < prefix.length; i++) {\n if (hashQueryKey([prefix[i]]) !== hashQueryKey([key[i]])) return false;\n }\n return true;\n}","import { hashQueryKey, matchQueryKey, type QueryKey } from './key';\n\nexport type QueryStatus = 'idle' | 'loading' | 'success' | 'error';\n\nexport type QueryState<T> = {\n data: T | undefined;\n error: Error | null;\n status: QueryStatus;\n updatedAt: number;\n isStale: boolean;\n};\n\ntype Listener = () => void;\n\ntype QueryEntry<T> = {\n key: QueryKey;\n state: QueryState<T>;\n subscribers: Set<Listener>;\n inflight: Promise<T> | null;\n inflightController: AbortController | null;\n gcTimer: ReturnType<typeof setTimeout> | null;\n staleTime: number;\n gcTime: number;\n /**\n * Последний queryFn, переданный в fetch для этого ключа.\n * Используется refetchQueries: позволяет перезапустить запрос,\n * не зная queryFn из caller'а (например, push-handler).\n */\n lastQueryFn: QueryFn<T> | null;\n};\n\nexport type QueryFnContext = { signal: AbortSignal };\n/**\n * queryFn принимает контекст с AbortSignal. Если HTTP-клиент его\n * использует — отмена будет реальной; если игнорирует — поведение\n * деградирует до текущего (запрос идёт до конца, но кэш игнорирует результат).\n *\n * Для обратной совместимости старая сигнатура `() => Promise<T>` тоже\n * принимается — пакет просто не передаст signal внутрь.\n */\nexport type QueryFn<T> = (ctx: QueryFnContext) => Promise<T>;\n\nexport type FetchOptions = {\n staleTime?: number;\n gcTime?: number;\n /** Если true — игнорируем staleTime и форсим запрос */\n force?: boolean;\n};\n\nconst DEFAULT_GC_TIME = 5 * 60 * 1000;\nconst DEFAULT_STALE_TIME = 0;\n\n/**\n * In-memory кэш запросов с подпиской по ключу, dedupe inflight-промисов\n * и сборкой мусора через gcTime.\n */\nexport class QueryCache {\n private entries = new Map<string, QueryEntry<unknown>>();\n private globalListeners = new Set<Listener>();\n\n /**\n * Подписка на любое изменение кэша: setData, invalidate, remove,\n * успешный/ошибочный fetch. Используется persistQueryClient и\n * devtools-подобными адаптерами. Не дублирует `subscribe(key, ...)`.\n */\n subscribeAll(listener: Listener): () => void {\n this.globalListeners.add(listener);\n return () => {\n this.globalListeners.delete(listener);\n };\n }\n\n private notifyGlobal() {\n for (const listener of this.globalListeners) listener();\n }\n\n private ensureEntry<T>(\n key: QueryKey,\n staleTime?: number,\n gcTime?: number,\n ): QueryEntry<T> {\n const hash = hashQueryKey(key);\n let entry = this.entries.get(hash) as QueryEntry<T> | undefined;\n if (!entry) {\n entry = {\n key,\n state: {\n data: undefined,\n error: null,\n status: 'idle',\n updatedAt: 0,\n isStale: true,\n },\n subscribers: new Set(),\n inflight: null,\n inflightController: null,\n gcTimer: null,\n lastQueryFn: null,\n staleTime: staleTime ?? DEFAULT_STALE_TIME,\n gcTime: gcTime ?? DEFAULT_GC_TIME,\n };\n this.entries.set(hash, entry as QueryEntry<unknown>);\n } else {\n // обновим только явно переданные параметры\n if (staleTime !== undefined) entry.staleTime = staleTime;\n if (gcTime !== undefined) entry.gcTime = gcTime;\n }\n return entry;\n }\n\n getState<T>(key: QueryKey): QueryState<T> | undefined {\n const entry = this.entries.get(hashQueryKey(key)) as\n | QueryEntry<T>\n | undefined;\n return entry?.state;\n }\n\n getData<T>(key: QueryKey): T | undefined {\n return this.getState<T>(key)?.data;\n }\n\n setData<T>(key: QueryKey, updater: T | ((prev: T | undefined) => T)): T {\n const entry = this.ensureEntry<T>(key);\n const next =\n typeof updater === 'function'\n ? (updater as (prev: T | undefined) => T)(entry.state.data)\n : updater;\n entry.state = {\n data: next,\n error: null,\n status: 'success',\n updatedAt: Date.now(),\n isStale: false,\n };\n this.notify(entry);\n return next;\n }\n\n /**\n * Подписка на изменения ключа. Возвращает unsubscribe.\n * Подписка останавливает GC таймер; отписка — запускает его обратно.\n */\n subscribe(key: QueryKey, listener: Listener): () => void {\n const entry = this.ensureEntry<unknown>(key);\n entry.subscribers.add(listener);\n if (entry.gcTimer) {\n clearTimeout(entry.gcTimer);\n entry.gcTimer = null;\n }\n return () => {\n entry.subscribers.delete(listener);\n if (entry.subscribers.size === 0) this.scheduleGc(entry);\n };\n }\n\n private notify<T>(entry: QueryEntry<T>) {\n for (const listener of entry.subscribers) listener();\n this.notifyGlobal();\n }\n\n private scheduleGc<T>(entry: QueryEntry<T>) {\n if (entry.gcTimer) clearTimeout(entry.gcTimer);\n if (entry.gcTime <= 0) {\n this.entries.delete(hashQueryKey(entry.key));\n return;\n }\n entry.gcTimer = setTimeout(() => {\n if (entry.subscribers.size === 0 && !entry.inflight) {\n this.entries.delete(hashQueryKey(entry.key));\n }\n }, entry.gcTime);\n }\n\n /**\n * Запускает или присоединяется к inflight-запросу.\n * Если данные свежие (не stale) и не force — отдаёт кэш без запроса.\n */\n async fetch<T>(\n key: QueryKey,\n queryFn: QueryFn<T>,\n options: FetchOptions = {},\n ): Promise<T> {\n const staleTime = options.staleTime ?? DEFAULT_STALE_TIME;\n const gcTime = options.gcTime ?? DEFAULT_GC_TIME;\n const entry = this.ensureEntry<T>(key, staleTime, gcTime);\n\n const isFresh =\n entry.state.status === 'success' &&\n !entry.state.isStale &&\n Date.now() - entry.state.updatedAt < staleTime;\n\n // Запоминаем queryFn для refetchQueries (используется push-handler'ами\n // и client.refetchQueries без знания queryFn).\n entry.lastQueryFn = queryFn as QueryFn<unknown> as QueryFn<T>;\n\n if (!options.force && isFresh && entry.state.data !== undefined) {\n return entry.state.data;\n }\n\n if (entry.inflight) return entry.inflight;\n\n entry.state = { ...entry.state, status: 'loading', error: null };\n this.notify(entry);\n\n const controller = new AbortController();\n const token = Symbol('inflight');\n (entry as QueryEntry<T> & { inflightToken?: symbol }).inflightToken = token;\n entry.inflightController = controller;\n\n const isCurrent = () =>\n (entry as QueryEntry<T> & { inflightToken?: symbol }).inflightToken ===\n token;\n\n const myPromise: Promise<T> = (async () => {\n try {\n const data = await queryFn({ signal: controller.signal });\n if (!isCurrent()) return data;\n entry.state = {\n data,\n error: null,\n status: 'success',\n updatedAt: Date.now(),\n isStale: false,\n };\n this.notify(entry);\n return data;\n } catch (err) {\n if (!isCurrent()) throw err;\n entry.state = {\n ...entry.state,\n status: 'error',\n error: err as Error,\n };\n this.notify(entry);\n throw err;\n } finally {\n if (isCurrent()) {\n entry.inflight = null;\n entry.inflightController = null;\n }\n }\n })();\n\n entry.inflight = myPromise;\n return myPromise;\n }\n\n /**\n * Помечает запись как stale. Сами по себе данные не удаляются.\n * Если есть подписчики — они получат уведомление, чтобы инициировать refetch.\n */\n invalidate(predicate: QueryKey | ((key: QueryKey) => boolean)): string[] {\n const invalidated: string[] = [];\n const match =\n typeof predicate === 'function'\n ? predicate\n : (k: QueryKey) => matchQueryKey(predicate, k);\n\n for (const [hash, entry] of this.entries) {\n if (match(entry.key)) {\n entry.state = { ...entry.state, isStale: true };\n this.notify(entry);\n invalidated.push(hash);\n }\n }\n return invalidated;\n }\n\n /**\n * Перезапускает все записи, матчинг predicate, у которых сохранён\n * `lastQueryFn` (т.е. их хоть раз кто-то загрузил через `fetch`).\n * Возвращает promise, который резолвится когда все запросы завершились.\n * Ошибки отдельных запросов проглатываются — общий promise успешный.\n */\n refetchQueries(\n predicate: QueryKey | ((key: QueryKey) => boolean),\n ): Promise<void> {\n const match =\n typeof predicate === 'function'\n ? predicate\n : (k: QueryKey) => matchQueryKey(predicate, k);\n const promises: Promise<unknown>[] = [];\n for (const entry of this.entries.values()) {\n if (!match(entry.key)) continue;\n if (!entry.lastQueryFn) continue;\n promises.push(\n this.fetch(entry.key, entry.lastQueryFn, { force: true }).catch(\n () => undefined,\n ),\n );\n }\n return Promise.all(promises).then(() => undefined);\n }\n\n /**\n * Отменяет inflight-запрос: пробрасывает abort через `AbortSignal`\n * в `queryFn` (т.е. в `executeRequest` → `httpClient`) и отвязывает\n * результат от ключа.\n *\n * Если `httpClient` уважает `signal` (`fetch` нативный, axios v1+\n * с `signal`, и т.п.) — HTTP-запрос реально прерывается. Если\n * игнорирует — поведение деградирует: запрос продолжит исполняться,\n * но его ответ уже не попадёт в кэш и подписчиков не уведомит.\n *\n * Полезно при размонтировании / переключении страниц / logout'е.\n */\n cancelQueries(predicate: QueryKey | ((key: QueryKey) => boolean)): void {\n const match =\n typeof predicate === 'function'\n ? predicate\n : (k: QueryKey) => matchQueryKey(predicate, k);\n for (const entry of this.entries.values()) {\n if (match(entry.key) && entry.inflight) {\n // реальная отмена HTTP: вызываем abort на сохранённом controller\n entry.inflightController?.abort();\n entry.inflightController = null;\n entry.inflight = null;\n (entry as QueryEntry<unknown> & { inflightToken?: symbol })\n .inflightToken = undefined;\n if (entry.state.status === 'loading') {\n entry.state = { ...entry.state, status: 'idle' };\n this.notify(entry);\n }\n }\n }\n }\n\n /**\n * Полностью удаляет записи (даже с активными подписчиками).\n * Используется редко — обычно достаточно invalidate.\n */\n remove(predicate: QueryKey | ((key: QueryKey) => boolean)): void {\n const match =\n typeof predicate === 'function'\n ? predicate\n : (k: QueryKey) => matchQueryKey(predicate, k);\n let removed = false;\n for (const [hash, entry] of [...this.entries]) {\n if (match(entry.key)) {\n if (entry.gcTimer) clearTimeout(entry.gcTimer);\n this.entries.delete(hash);\n removed = true;\n }\n }\n if (removed) this.notifyGlobal();\n }\n\n /**\n * Количество inflight-запросов в кэше, опционально отфильтрованных\n * по predicate. Используется `useIsFetching()` для глобального\n * индикатора загрузки.\n */\n countFetching(\n predicate?: QueryKey | ((key: QueryKey) => boolean),\n ): number {\n const match = !predicate\n ? () => true\n : typeof predicate === 'function'\n ? predicate\n : (k: QueryKey) => matchQueryKey(predicate, k);\n let n = 0;\n for (const entry of this.entries.values()) {\n // считаем по status === 'loading' (не по entry.inflight), потому что\n // notify летит до выставления inflight — иначе useIsFetching\n // пропустит начало запроса.\n if (entry.state.status === 'loading' && match(entry.key)) n++;\n }\n return n;\n }\n\n /** Только для тестов / DevTools. */\n _debugEntries(): ReadonlyMap<string, QueryEntry<unknown>> {\n return this.entries;\n }\n\n /**\n * Сериализует записи со статусом success — для persistence.\n * inflight / loading / error не сохраняются, чтобы не гидратировать\n * приложение в полу-загруженном состоянии.\n */\n dehydrate(filter?: (key: QueryKey) => boolean): DehydratedState {\n const queries: DehydratedQuery[] = [];\n for (const entry of this.entries.values()) {\n if (entry.state.status !== 'success') continue;\n if (entry.state.data === undefined) continue;\n if (filter && !filter(entry.key)) continue;\n queries.push({\n key: entry.key as unknown[],\n data: entry.state.data,\n updatedAt: entry.state.updatedAt,\n });\n }\n return { queries };\n }\n\n hydrate(state: DehydratedState): void {\n for (const q of state.queries) {\n const entry = this.ensureEntry<unknown>(q.key);\n // не перетираем более свежие данные\n if (entry.state.updatedAt >= q.updatedAt && entry.state.data !== undefined) {\n continue;\n }\n entry.state = {\n data: q.data,\n error: null,\n status: 'success',\n updatedAt: q.updatedAt,\n isStale: true, // гидратированные данные сразу stale → фоновый refetch\n };\n this.notify(entry);\n }\n }\n}\n\nexport type DehydratedQuery = {\n key: unknown[];\n data: unknown;\n updatedAt: number;\n};\n\nexport type DehydratedState = {\n queries: DehydratedQuery[];\n};","import { matchQueryKey, type QueryKey } from './key';\n\ntype Listener = () => void;\n\n/**\n * Глобальный счётчик активных мутаций. Используется `useIsMutating()`\n * для глобального индикатора загрузки.\n *\n * Мутации не имеют ключа в кэше (в отличие от запросов), поэтому\n * счётчик ведётся отдельно. Каждой активной мутации можно опционально\n * приписать `scope` (QueryKey) — это позволяет `useIsMutating(prefix)`\n * фильтровать по предметной области.\n */\ntype MutationRecord = {\n scope: QueryKey | undefined;\n controller: AbortController;\n};\n\nclass MutationCounter {\n private active = new Map<symbol, MutationRecord>();\n private listeners = new Set<Listener>();\n\n start(scope?: QueryKey, controller?: AbortController): symbol {\n const id = Symbol('mutation');\n this.active.set(id, { scope, controller: controller ?? new AbortController() });\n this.notify();\n return id;\n }\n\n stop(id: symbol): void {\n if (this.active.delete(id)) this.notify();\n }\n\n /**\n * Отменяет inflight-мутации. Без predicate — все.\n * С predicate (префикс QueryKey или функция-предикат scope'а) —\n * только матчинг.\n */\n cancel(predicate?: QueryKey | ((scope: QueryKey | undefined) => boolean)): void {\n for (const rec of this.active.values()) {\n if (!predicate) {\n rec.controller.abort();\n continue;\n }\n if (typeof predicate === 'function') {\n if (predicate(rec.scope)) rec.controller.abort();\n } else if (rec.scope && matchQueryKey(predicate, rec.scope)) {\n rec.controller.abort();\n }\n }\n }\n\n count(predicate?: QueryKey | ((scope: QueryKey | undefined) => boolean)): number {\n if (!predicate) return this.active.size;\n let n = 0;\n for (const rec of this.active.values()) {\n if (typeof predicate === 'function') {\n if (predicate(rec.scope)) n++;\n } else {\n if (rec.scope && matchQueryKey(predicate, rec.scope)) n++;\n }\n }\n return n;\n }\n\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private notify() {\n for (const l of this.listeners) l();\n }\n}\n\nexport const mutationCounter = new MutationCounter();\nexport type { MutationCounter };\n","import { callLogger } from '../logger';\nimport { QueryCache, type FetchOptions, type QueryFn } from './cache';\nimport type { QueryKey } from './key';\nimport { mutationCounter } from './mutation-counter';\n\n/**\n * Высокоуровневый фасад над QueryCache: единый объект, который удобно\n * прокидывать через Provider и дергать из push-handler'ов / эффектов.\n *\n * Сами queryFn-ы здесь не регистрируются — refetchQueries требует, чтобы\n * либо подписчик сам перезапустил запрос (через subscribe), либо чтобы\n * вызвали fetchQuery с queryFn вручную. Это намеренно: хук React сам\n * знает, как собрать свой queryFn из endpoint/params.\n */\nexport class QueryClient {\n readonly cache: QueryCache;\n\n constructor(cache?: QueryCache) {\n this.cache = cache ?? new QueryCache();\n }\n\n getQueryData<T>(key: QueryKey): T | undefined {\n return this.cache.getData<T>(key);\n }\n\n /**\n * Точечно патчит данные под ключом. Возвращает новое значение —\n * удобно для «пропатчил → передал дальше».\n */\n setQueryData<T>(\n key: QueryKey,\n updater: T | ((prev: T | undefined) => T),\n ): T {\n return this.cache.setData(key, updater);\n }\n\n fetchQuery<T>(\n key: QueryKey,\n queryFn: QueryFn<T>,\n options?: FetchOptions,\n ): Promise<T> {\n return this.cache.fetch(key, queryFn, options);\n }\n\n invalidateQueries(\n predicate: QueryKey | ((key: QueryKey) => boolean),\n ): void {\n const hashes = this.cache.invalidate(predicate);\n if (hashes.length > 0) callLogger('onInvalidate', hashes);\n }\n\n removeQueries(predicate: QueryKey | ((key: QueryKey) => boolean)): void {\n this.cache.remove(predicate);\n }\n\n cancelQueries(predicate: QueryKey | ((key: QueryKey) => boolean)): void {\n this.cache.cancelQueries(predicate);\n }\n\n /**\n * Отменяет inflight-мутации через `AbortSignal`. Без аргумента — все.\n * С префиксом QueryKey или функцией-предикатом — только матчинг\n * (scope мутации = первый ключ из её `invalidateKeys`, если задан массив).\n *\n * Если `httpClient` уважает `signal` — HTTP-запрос реально прерывается;\n * иначе результат отменённой мутации просто не повлияет на UI\n * (`useMutation` останется в текущем состоянии).\n *\n * Типичный кейс — logout: `client.cancelMutations()` перед очисткой\n * сессии, чтобы поздние ответы не сработали.\n */\n cancelMutations(\n predicate?: QueryKey | ((scope: QueryKey | undefined) => boolean),\n ): void {\n mutationCounter.cancel(predicate);\n }\n\n refetchQueries(\n predicate: QueryKey | ((key: QueryKey) => boolean),\n ): Promise<void> {\n return this.cache.refetchQueries(predicate);\n }\n\n /**\n * Кладёт запрос в кэш, не пробрасывая ошибки. Подходит для\n * оптимистичной подгрузки следующего экрана при наведении / долгом тапе.\n *\n * Поведение:\n * - **`staleTime`**: учитывается. Если данные ещё свежие — запрос не\n * отправляется, promise резолвится сразу.\n * - **`inflight`**: если по ключу уже идёт запрос, prefetch присоединяется\n * к нему (dedupe). Не создаёт второй HTTP-вызов.\n * - **Подписчики**: если на ключ подписан `useFetch`, успешный prefetch\n * обновит его `data` (через notify подписчиков). При ошибке — статус\n * подписчика тоже обновится (`error`).\n * - **Возвращаемый promise**: всегда успешный — ошибки не пробрасываются.\n */\n prefetchQuery<T>(\n key: QueryKey,\n queryFn: QueryFn<T>,\n options?: FetchOptions,\n ): Promise<void> {\n return this.cache.fetch(key, queryFn, options).then(\n () => undefined,\n () => undefined,\n );\n }\n}\n\nlet globalClient: QueryClient | null = null;\n\n/** Singleton-доступ для тех мест, где Provider недоступен (push-handler и т.п.). */\nexport function getQueryClient(): QueryClient {\n if (!globalClient) globalClient = new QueryClient();\n return globalClient;\n}\n\nexport function setQueryClient(client: QueryClient): void {\n globalClient = client;\n}","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { getConfig, isConfigured } from '../config';\nimport { callLogger } from '../logger';\nimport { focusManager } from '../query/focus-manager';\nimport { onlineManager } from '../query/online-manager';\nimport { hashQueryKey, type QueryKey } from '../query/key';\nimport { getQueryClient } from '../query/client';\nimport { buildEndpoint, executeRequest, handleResponse } from '../utils';\n\nimport type {\n RequestConfig,\n ResponseWrapper,\n UseFetchOptions,\n UseFetchResult,\n} from '../types/index';\n\n/**\n * Hook for fetching data (GET requests).\n *\n * Поверх QueryCache: одинаковые queryKey разделяют один результат и один\n * inflight-promise. Поддерживает staleTime, refetchOnFocus,\n * pollingInterval, select.\n *\n * Возвращаемый тип { data, isLoading, isRefetching, error, refetch }\n * сохранён 1-в-1 с предыдущей версией — старые потребители продолжают работать.\n */\nexport function createUseFetch<\n ResponseType,\n RequestParamsType,\n ErrorResponseType,\n>(\n endpoint: string | ((arg0: RequestParamsType) => string),\n fetchConfig: RequestConfig,\n) {\n type RT = ResponseWrapper<ResponseType, ErrorResponseType>;\n\n return <TSelected = RT>(\n params?: RequestParamsType,\n options: UseFetchOptions<RT, TSelected> = {},\n ): UseFetchResult<TSelected> => {\n const {\n enabled = true,\n refetchOnMount = true,\n refetchOnFocus = false,\n refetchOnAppActive = false,\n refetchOnReconnect = false,\n staleTime = isConfigured() ? getConfig().defaultStaleTime ?? 0 : 0,\n gcTime,\n pollingInterval,\n queryKey: customKey,\n select,\n selectIsEqual,\n onSuccess,\n onError,\n } = options;\n\n const serializedParams = useMemo(\n () => (params === undefined ? null : JSON.stringify(params)),\n [params],\n );\n\n const queryKey = useMemo<QueryKey>(() => {\n if (customKey) return customKey;\n const endpointId =\n typeof endpoint === 'function'\n ? buildEndpoint<RequestParamsType>(endpoint, params)\n : endpoint;\n return ['__endpoint__', endpointId, params ?? null];\n // params уже учтён через serializedParams ниже\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [customKey ? hashQueryKey(customKey) : null, serializedParams]);\n\n const client = getQueryClient();\n const cache = client.cache;\n\n // queryFn — стабилен относительно serializedParams, не пересоздаём\n // на каждый рендер. Принимает signal от QueryCache и пробрасывает\n // его в executeRequest → httpClient.\n const queryFn = useCallback(\n ({ signal }: { signal: AbortSignal }) => {\n const parsedParams = serializedParams\n ? (JSON.parse(serializedParams) as RequestParamsType)\n : undefined;\n return executeRequest<\n ResponseType,\n RequestParamsType,\n ErrorResponseType\n >(endpoint, fetchConfig, parsedParams, signal);\n },\n [serializedParams],\n );\n\n const initialState = cache.getState<RT>(queryKey);\n const [, forceRender] = useState(0);\n const rerender = useCallback(() => forceRender(v => v + 1), []);\n\n // Подписка на изменения ключа — работает даже при enabled: false,\n // чтобы хук выступал read-only слушателем кэша. Полезно для\n // бейджей/счётчиков, которые читают тот же ключ, что пишут другие\n // экраны (см. JSDoc для `enabled`).\n //\n // На unmount: если стали последним подписчиком и запрос ещё inflight —\n // отменяем HTTP, чтобы не держать соединение зря.\n useEffect(() => {\n const unsub = cache.subscribe(queryKey, rerender);\n return () => {\n unsub();\n const state = cache._debugEntries().get(hashQueryKey(queryKey));\n if (state && state.subscribers.size === 0 && state.inflight) {\n cache.cancelQueries(queryKey);\n }\n };\n }, [cache, hashQueryKey(queryKey), rerender]);\n\n // Триггер запроса при mount / смене ключа / stale-инвалидации.\n const lastNotifiedRef = useRef<{\n success?: RT;\n errorHash?: string;\n }>({});\n\n const runFetch = useCallback(\n async (force: boolean) => {\n callLogger('onFetchStart', queryKey);\n try {\n const data = await cache.fetch(queryKey, queryFn, {\n staleTime,\n gcTime,\n force,\n });\n callLogger('onFetchSuccess', queryKey, data);\n // onSuccess / onError — на основе бизнес-статуса\n if (lastNotifiedRef.current.success !== data) {\n lastNotifiedRef.current.success = data;\n handleResponse<ResponseType, ErrorResponseType>(\n data,\n onSuccess,\n onError,\n );\n }\n } catch (err) {\n callLogger('onFetchError', queryKey, err);\n const e = err as Error;\n const hash = `${e.name}:${e.message}`;\n if (lastNotifiedRef.current.errorHash !== hash) {\n lastNotifiedRef.current.errorHash = hash;\n onError?.(e);\n }\n }\n },\n [cache, hashQueryKey(queryKey), queryFn, staleTime, gcTime, onSuccess, onError],\n );\n\n useEffect(() => {\n if (!enabled || !refetchOnMount) return;\n void runFetch(false);\n }, [enabled, refetchOnMount, runFetch]);\n\n // Реакция на внешний invalidate: подписчик уже получил notify\n // (rerender), здесь смотрим isStale в кэше и догоняем запросом.\n const stateForEffect = cache.getState<RT>(queryKey);\n const isStale = stateForEffect?.isStale ?? false;\n const hasFetchedData = stateForEffect?.data !== undefined;\n useEffect(() => {\n if (!enabled) return;\n if (isStale && hasFetchedData) void runFetch(true);\n }, [enabled, isStale, hasFetchedData, runFetch]);\n\n // refetchOnFocus / refetchOnAppActive — обе настройки висят на одном\n // focusManager (RN AppState → focusManager.setFocused). Если хоть одна\n // включена — подписываемся.\n useEffect(() => {\n if (!enabled) return;\n if (!refetchOnFocus && !refetchOnAppActive) return;\n const unsub = focusManager.subscribe(focused => {\n if (focused) void runFetch(false);\n });\n return unsub;\n }, [enabled, refetchOnFocus, refetchOnAppActive, runFetch]);\n\n // refetchOnReconnect: подписываемся на onlineManager.\n useEffect(() => {\n if (!enabled || !refetchOnReconnect) return;\n const unsub = onlineManager.subscribe(online => {\n if (online) void runFetch(false);\n });\n return unsub;\n }, [enabled, refetchOnReconnect, runFetch]);\n\n // Поллинг с авто-паузой при !focused.\n useEffect(() => {\n if (!enabled || !pollingInterval || pollingInterval <= 0) return;\n let timer: ReturnType<typeof setInterval> | null = null;\n\n const start = () => {\n if (timer) return;\n timer = setInterval(() => {\n if (focusManager.isFocused()) void runFetch(true);\n }, pollingInterval);\n };\n const stop = () => {\n if (timer) clearInterval(timer);\n timer = null;\n };\n\n start();\n const unsub = focusManager.subscribe(focused => {\n if (focused) start();\n else stop();\n });\n return () => {\n stop();\n unsub();\n };\n }, [enabled, pollingInterval, runFetch]);\n\n // Текущее состояние из кэша.\n const state = cache.getState<RT>(queryKey) ?? initialState;\n const rawData = state?.data ?? null;\n\n // select мемоизация: пересчёт только если rawData меняется ссылочно\n // или меняется select. selectIsEqual позволяет structural-сравнение,\n // чтобы равные, но новые по ссылке объекты не вызывали ререндер.\n const lastSelectedRef = useRef<TSelected | null>(null);\n const selectedData = useMemo<TSelected | null>(() => {\n if (rawData === null) {\n lastSelectedRef.current = null;\n return null;\n }\n const next = select\n ? select(rawData)\n : (rawData as unknown as TSelected);\n const prev = lastSelectedRef.current;\n const isEqual = selectIsEqual ?? Object.is;\n if (prev !== null && isEqual(prev, next)) return prev;\n lastSelectedRef.current = next;\n return next;\n }, [rawData, select, selectIsEqual]);\n\n const status = state?.status ?? 'idle';\n const hasData = rawData !== null;\n const isLoading = status === 'loading' && !hasData;\n const isRefetching = status === 'loading' && hasData;\n const error = state?.error ?? null;\n\n const refetch = useCallback(async () => {\n await runFetch(true);\n }, [runFetch]);\n\n return {\n data: selectedData,\n isLoading: enabled ? isLoading : false,\n isRefetching,\n error,\n refetch,\n };\n };\n}\n","import { useCallback, useState } from 'react';\n\nimport { callLogger } from '../logger';\nimport { getQueryClient } from '../query/client';\nimport { matchQueryKey, type QueryKey } from '../query/key';\nimport { mutationCounter } from '../query/mutation-counter';\nimport { buildEndpoint, executeRequest } from '../utils';\n\nimport type {\n RequestConfig,\n ResponseWrapper,\n UseMutationOptions,\n UseMutationResult,\n} from '../types/index';\n\n/**\n * Hook for mutations (POST/PUT/PATCH/DELETE requests).\n *\n * Фаза 3:\n * - onMutate теперь может вернуть context — он передаётся в onError/onSettled\n * для rollback.\n * - setQueryData(client, vars, data) — точечный патч кэша после успеха.\n * - invalidateKeys — массив или функция, помечает указанные ключи stale;\n * подписанные useFetch сами догоняют запросом.\n */\nexport function createUseMutation<\n ResponseType,\n RequestParamsType,\n ErrorResponseType,\n>(\n endpoint: string | ((arg0: RequestParamsType) => string),\n fetchConfig: RequestConfig,\n) {\n type RT = ResponseWrapper<ResponseType, ErrorResponseType>;\n\n return <TContext = unknown>(\n options: UseMutationOptions<RT, RequestParamsType, TContext> = {},\n ): UseMutationResult<RT, RequestParamsType> => {\n const {\n onMutate,\n onSuccess,\n onError,\n onSettled,\n invalidateKeys,\n setQueryData,\n } = options;\n\n const [data, setData] = useState<RT | null>(null);\n const [error, setError] = useState<Error | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isSuccess, setIsSuccess] = useState(false);\n const [isError, setIsError] = useState(false);\n\n const reset = useCallback(() => {\n setData(null);\n setError(null);\n setIsLoading(false);\n setIsSuccess(false);\n setIsError(false);\n }, []);\n\n const applyInvalidate = useCallback(\n (vars: RequestParamsType, result: RT) => {\n if (!invalidateKeys) return;\n const client = getQueryClient();\n // Прямой массив\n if (Array.isArray(invalidateKeys)) {\n if (invalidateKeys.length === 0) return;\n client.invalidateQueries((k: QueryKey) =>\n invalidateKeys.some(prefix => matchQueryKey(prefix, k)),\n );\n return;\n }\n // Функция — либо вернёт массив ключей, либо предикат\n const out = invalidateKeys(vars, result);\n if (typeof out === 'function') {\n client.invalidateQueries(out);\n return;\n }\n if (out.length === 0) return;\n client.invalidateQueries((k: QueryKey) =>\n out.some(prefix => matchQueryKey(prefix, k)),\n );\n },\n [invalidateKeys],\n );\n\n const mutateAsync = useCallback(\n async (variables: RequestParamsType): Promise<RT> => {\n setIsLoading(true);\n setIsSuccess(false);\n setIsError(false);\n setError(null);\n\n // scope для useIsMutating(prefix): если у мутации задан\n // invalidateKeys-массив — используем первый ключ как scope.\n const scope =\n Array.isArray(invalidateKeys) && invalidateKeys.length > 0\n ? (invalidateKeys[0] as QueryKey)\n : undefined;\n const controller = new AbortController();\n const mutationId = mutationCounter.start(scope, controller);\n const endpointId = buildEndpoint<RequestParamsType>(endpoint, variables);\n callLogger('onMutationStart', endpointId, variables);\n\n let context: TContext | undefined;\n\n try {\n if (onMutate) {\n const ctx = await onMutate(variables);\n context = ctx as TContext | undefined;\n }\n\n const result = await executeRequest<\n ResponseType,\n RequestParamsType,\n ErrorResponseType\n >(endpoint, fetchConfig, variables, controller.signal);\n\n setData(result);\n\n if (result.status) {\n setIsSuccess(true);\n callLogger('onMutationSuccess', endpointId, variables, result);\n // setQueryData — точечный патч кэша\n if (setQueryData) {\n setQueryData(getQueryClient(), variables, result);\n }\n // invalidateKeys — пометить stale и дать подписчикам догнать\n applyInvalidate(variables, result);\n\n if (onSuccess) {\n await onSuccess(result, variables, context);\n }\n } else {\n const err = new Error(result.message ?? 'Mutation failed');\n setIsError(true);\n setError(err);\n callLogger('onMutationError', endpointId, variables, err);\n if (onError) {\n await onError(err, variables, context);\n }\n }\n\n if (onSettled) {\n await onSettled(result, null, variables, context);\n }\n\n return result;\n } catch (err) {\n const error = err as Error;\n setError(error);\n setIsError(true);\n setIsSuccess(false);\n callLogger('onMutationError', endpointId, variables, error);\n\n if (onError) {\n await onError(error, variables, context);\n }\n if (onSettled) {\n await onSettled(null, error, variables, context);\n }\n\n throw error;\n } finally {\n mutationCounter.stop(mutationId);\n setIsLoading(false);\n }\n },\n [\n onMutate,\n onSuccess,\n onError,\n onSettled,\n setQueryData,\n applyInvalidate,\n ],\n );\n\n const mutateSync = useCallback(\n (variables: RequestParamsType) => {\n void mutateAsync(variables);\n },\n [mutateAsync],\n );\n\n return {\n data,\n error,\n isLoading,\n isSuccess,\n isError,\n mutate: mutateSync,\n mutateAsync,\n reset,\n };\n };\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { getConfig, isConfigured } from '../config';\nimport { getQueryClient } from '../query/client';\nimport { hashQueryKey, type QueryKey } from '../query/key';\nimport { buildEndpoint, executeRequest, handleResponse } from '../utils';\n\nimport type {\n RequestConfig,\n ResponseWrapper,\n UsePaginateOptions,\n UsePaginateResult,\n} from '../types/index';\n\n/**\n * Hook for paginated data fetching.\n *\n * Фаза 4: страницы кэшируются как отдельные записи под подключами вида\n * `[...prefix, { page, limit }]`. Это даёт:\n * - повторное открытие списка → данные из кэша мгновенно;\n * - keepPreviousData → плавная смена страницы;\n * - prefetchNextPage → префетч в кэш без визуального изменения.\n */\nexport function createUsePaginate<\n ResponseType extends { data: TData; total?: number; page?: number },\n TData extends unknown[],\n RequestParamsType,\n ErrorResponseType,\n>(\n endpoint: string | ((arg0: RequestParamsType) => string),\n fetchConfig: RequestConfig,\n options?: {\n dataExtractor?: (response: ResponseType) => TData;\n totalExtractor?: (response: ResponseType) => number;\n },\n) {\n type RT = ResponseWrapper<ResponseType, ErrorResponseType>;\n\n return <TSelected = TData>(\n params?: Omit<RequestParamsType, 'page' | 'limit'>,\n hookOptions: UsePaginateOptions<RT, TData, TSelected> = {},\n ): UsePaginateResult<TSelected> => {\n const {\n enabled = true,\n initialPage = 1,\n initialLimit = 20,\n staleTime = isConfigured() ? getConfig().defaultStaleTime ?? 0 : 0,\n gcTime,\n keepPreviousData = false,\n queryKey: customKey,\n select,\n selectIsEqual,\n onSuccess,\n onError,\n } = hookOptions;\n\n const client = getQueryClient();\n const cache = client.cache;\n\n const limit = initialLimit;\n const [currentPage, setCurrentPage] = useState(initialPage);\n const [isFetchingNextPage, setIsFetchingNextPage] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const dataExtractor = useMemo(\n () =>\n options?.dataExtractor || ((response: ResponseType) => response.data),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n const totalExtractor = useMemo(\n () =>\n options?.totalExtractor ||\n ((response: ResponseType) => response.total ?? 0),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n\n const serializedParams = useMemo(\n () => (params === undefined ? null : JSON.stringify(params)),\n [params],\n );\n\n const keyPrefix = useMemo<QueryKey>(() => {\n if (customKey) return customKey;\n const endpointId =\n typeof endpoint === 'function'\n ? buildEndpoint<RequestParamsType>(\n endpoint,\n params as RequestParamsType,\n )\n : endpoint;\n return ['__paginate__', endpointId, params ?? null];\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [customKey ? hashQueryKey(customKey) : null, serializedParams]);\n\n const pageKey = useCallback(\n (page: number): QueryKey => [...keyPrefix, { page, limit }],\n [keyPrefix, limit],\n );\n\n const pageQueryFn = useCallback(\n (page: number) =>\n ({ signal }: { signal: AbortSignal }) => {\n const parsedParams = serializedParams\n ? (JSON.parse(serializedParams) as Record<string, unknown>)\n : {};\n const requestParams = {\n ...parsedParams,\n page,\n limit,\n } as RequestParamsType;\n return executeRequest<\n ResponseType,\n RequestParamsType,\n ErrorResponseType\n >(endpoint, fetchConfig, requestParams, signal);\n },\n [serializedParams, limit],\n );\n\n // Подписка на ключ текущей страницы для rerender.\n const [, forceRender] = useState(0);\n const rerender = useCallback(() => forceRender(v => v + 1), []);\n useEffect(() => {\n if (!enabled) return;\n const unsub = cache.subscribe(pageKey(currentPage), rerender);\n return unsub;\n }, [cache, enabled, hashQueryKey(pageKey(currentPage)), rerender]);\n\n const previousPageKeyRef = useRef<QueryKey | null>(null);\n\n const runFetchPage = useCallback(\n async (page: number, isNextPage: boolean) => {\n try {\n if (isNextPage) setIsFetchingNextPage(true);\n setError(null);\n\n const result = await cache.fetch(pageKey(page), pageQueryFn(page), {\n staleTime,\n gcTime,\n });\n\n handleResponse<ResponseType, ErrorResponseType>(\n result,\n onSuccess,\n onError,\n );\n if (!result.status) {\n setError(new Error(result.message ?? 'Request failed'));\n return;\n }\n\n previousPageKeyRef.current = pageKey(page);\n setCurrentPage(page);\n } catch (err) {\n const e = err as Error;\n setError(e);\n onError?.(e);\n } finally {\n if (isNextPage) setIsFetchingNextPage(false);\n }\n },\n [cache, pageKey, pageQueryFn, staleTime, gcTime, onSuccess, onError],\n );\n\n // Первичный mount + смена params.\n useEffect(() => {\n if (!enabled) return;\n void runFetchPage(initialPage, false);\n setCurrentPage(initialPage);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [enabled, serializedParams, initialPage]);\n\n // Auto-refetch при isStale (внешний invalidateQueries).\n const currentState = cache.getState<RT>(pageKey(currentPage));\n const isStale = currentState?.isStale ?? false;\n const hasFetchedData = currentState?.data !== undefined;\n useEffect(() => {\n if (!enabled) return;\n if (isStale && hasFetchedData) void runFetchPage(currentPage, false);\n }, [enabled, isStale, hasFetchedData, currentPage, runFetchPage]);\n\n // Источник данных для UI с учётом keepPreviousData.\n const currentResult = currentState?.data;\n const usingPlaceholder =\n keepPreviousData &&\n !currentResult &&\n previousPageKeyRef.current !== null;\n const effectiveResult = usingPlaceholder\n ? cache.getData<RT>(previousPageKeyRef.current as QueryKey)\n : currentResult;\n\n const rawData: TData =\n effectiveResult && effectiveResult.status\n ? dataExtractor(effectiveResult as ResponseType)\n : ([] as unknown as TData);\n\n const lastSelectedRef = useRef<TSelected | null>(null);\n const data: TSelected = useMemo(() => {\n const next = select\n ? select(rawData)\n : (rawData as unknown as TSelected);\n const prev = lastSelectedRef.current;\n const isEqual = selectIsEqual ?? Object.is;\n if (prev !== null && isEqual(prev, next)) return prev;\n lastSelectedRef.current = next;\n return next;\n }, [rawData, select, selectIsEqual]);\n\n const totalCount =\n effectiveResult && effectiveResult.status\n ? totalExtractor(effectiveResult as ResponseType)\n : null;\n const total = totalCount;\n const totalPages = totalCount !== null ? Math.ceil(totalCount / limit) : null;\n const hasNextPage = totalPages !== null && currentPage < totalPages;\n const hasPreviousPage = currentPage > 1;\n\n const status = currentState?.status ?? 'idle';\n const isLoading = status === 'loading' && !hasFetchedData && !usingPlaceholder;\n\n const fetchNextPage = useCallback(async () => {\n if (!hasNextPage) return;\n await runFetchPage(currentPage + 1, true);\n }, [hasNextPage, currentPage, runFetchPage]);\n\n const fetchPreviousPage = useCallback(async () => {\n if (!hasPreviousPage) return;\n await runFetchPage(currentPage - 1, false);\n }, [hasPreviousPage, currentPage, runFetchPage]);\n\n const prefetchNextPage = useCallback(async () => {\n if (!hasNextPage) return;\n // Просто складываем в кэш — не меняем currentPage, не показываем loading.\n await cache.fetch(\n pageKey(currentPage + 1),\n pageQueryFn(currentPage + 1),\n { staleTime, gcTime },\n );\n }, [hasNextPage, currentPage, cache, pageKey, pageQueryFn, staleTime, gcTime]);\n\n const refetch = useCallback(async () => {\n await cache.fetch(pageKey(currentPage), pageQueryFn(currentPage), {\n staleTime: 0,\n gcTime,\n force: true,\n });\n }, [cache, pageKey, pageQueryFn, currentPage, gcTime]);\n\n const reset = useCallback(() => {\n // Удаляем все страницы текущего префикса.\n cache.remove((k: QueryKey) => {\n if (k.length < keyPrefix.length) return false;\n for (let i = 0; i < keyPrefix.length; i++) {\n if (hashQueryKey([k[i]]) !== hashQueryKey([keyPrefix[i]])) return false;\n }\n return true;\n });\n previousPageKeyRef.current = null;\n setCurrentPage(initialPage);\n void runFetchPage(initialPage, false);\n }, [cache, keyPrefix, initialPage, runFetchPage]);\n\n return {\n data,\n currentPage,\n totalPages,\n total,\n hasNextPage,\n hasPreviousPage,\n isLoading: enabled ? isLoading : false,\n isFetchingNextPage,\n isPlaceholderData: usingPlaceholder,\n error,\n fetchNextPage,\n fetchPreviousPage,\n prefetchNextPage,\n refetch,\n reset,\n };\n };\n}\n","import { useCallback, useEffect, useState } from 'react';\n\nimport { getQueryClient } from '../query/client';\nimport type { QueryKey } from '../query/key';\nimport { mutationCounter } from '../query/mutation-counter';\n\n/**\n * Возвращает число активных (inflight) запросов в кэше.\n * Полезно для глобального индикатора загрузки в шапке.\n *\n * С опциональным predicate — считает только матчинг запросы:\n * `useIsFetching(['orders'])` — сколько inflight'ов под префиксом ['orders'].\n */\nexport function useIsFetching(\n predicate?: QueryKey | ((key: QueryKey) => boolean),\n): number {\n const client = getQueryClient();\n const get = useCallback(\n () => client.cache.countFetching(predicate),\n [client.cache, predicate],\n );\n const [count, setCount] = useState<number>(get);\n\n useEffect(() => {\n setCount(get());\n const unsub = client.cache.subscribeAll(() => setCount(get()));\n return unsub;\n }, [client.cache, get]);\n\n return count;\n}\n\n/**\n * Возвращает число активных мутаций. С predicate — только матчинг.\n * Скоуп мутации = первый ключ из её `invalidateKeys`, если задан массив;\n * иначе — без скоупа (попадает только в безусловный счётчик).\n */\nexport function useIsMutating(\n predicate?: QueryKey | ((scope: QueryKey | undefined) => boolean),\n): number {\n const get = useCallback(\n () => mutationCounter.count(predicate),\n [predicate],\n );\n const [count, setCount] = useState<number>(get);\n\n useEffect(() => {\n setCount(get());\n const unsub = mutationCounter.subscribe(() => setCount(get()));\n return unsub;\n }, [get]);\n\n return count;\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { callLogger } from '../logger';\nimport type { FetchOptions, QueryFn } from '../query/cache';\nimport { getQueryClient } from '../query/client';\nimport { focusManager } from '../query/focus-manager';\nimport { hashQueryKey, type QueryKey } from '../query/key';\nimport { onlineManager } from '../query/online-manager';\n\n/** Опции для низкоуровневого `useQuery`. */\nexport type UseQueryOptions<T, TSelected = T> = {\n enabled?: boolean;\n refetchOnMount?: boolean;\n refetchOnFocus?: boolean;\n refetchOnAppActive?: boolean;\n refetchOnReconnect?: boolean;\n staleTime?: number;\n gcTime?: number;\n pollingInterval?: number;\n select?: (data: T) => TSelected;\n selectIsEqual?: (a: TSelected, b: TSelected) => boolean;\n};\n\nexport type UseQueryResult<T> = {\n data: T | null;\n isLoading: boolean;\n isRefetching: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n};\n\n/**\n * Низкоуровневый аналог `useFetch` поверх произвольного `queryFn`.\n * Имя совпадает с TanStack Query для discoverability — поведение\n * аналогично `useFetch`, но без обёртки `apiClient(endpoint, ...)`.\n *\n * @example\n * const { data } = useQuery(\n * ['orders', orderId],\n * ({ signal }) => fetchOrder(orderId, signal),\n * { staleTime: 30_000 },\n * );\n */\nexport function useQuery<T, TSelected = T>(\n queryKey: QueryKey,\n queryFn: QueryFn<T>,\n options: UseQueryOptions<T, TSelected> = {},\n): UseQueryResult<TSelected> {\n const {\n enabled = true,\n refetchOnMount = true,\n refetchOnFocus = false,\n refetchOnAppActive = false,\n refetchOnReconnect = false,\n staleTime = 0,\n gcTime,\n pollingInterval,\n select,\n selectIsEqual,\n } = options;\n\n const client = getQueryClient();\n const cache = client.cache;\n const [, forceRender] = useState(0);\n const rerender = useCallback(() => forceRender(v => v + 1), []);\n\n useEffect(() => {\n const unsub = cache.subscribe(queryKey, rerender);\n return () => {\n unsub();\n const state = cache._debugEntries().get(hashQueryKey(queryKey));\n if (state && state.subscribers.size === 0 && state.inflight) {\n cache.cancelQueries(queryKey);\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [cache, hashQueryKey(queryKey), rerender]);\n\n const runFetch = useCallback(\n async (force: boolean) => {\n callLogger('onFetchStart', queryKey);\n try {\n const data = await cache.fetch(queryKey, queryFn, {\n staleTime,\n gcTime,\n force,\n } satisfies FetchOptions);\n callLogger('onFetchSuccess', queryKey, data);\n } catch (err) {\n callLogger('onFetchError', queryKey, err);\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [cache, hashQueryKey(queryKey), queryFn, staleTime, gcTime],\n );\n\n useEffect(() => {\n if (!enabled || !refetchOnMount) return;\n void runFetch(false);\n }, [enabled, refetchOnMount, runFetch]);\n\n const stateForEffect = cache.getState<T>(queryKey);\n const isStale = stateForEffect?.isStale ?? false;\n const hasFetchedData = stateForEffect?.data !== undefined;\n useEffect(() => {\n if (!enabled) return;\n if (isStale && hasFetchedData) void runFetch(true);\n }, [enabled, isStale, hasFetchedData, runFetch]);\n\n useEffect(() => {\n if (!enabled) return;\n if (!refetchOnFocus && !refetchOnAppActive) return;\n const unsub = focusManager.subscribe(focused => {\n if (focused) void runFetch(false);\n });\n return unsub;\n }, [enabled, refetchOnFocus, refetchOnAppActive, runFetch]);\n\n useEffect(() => {\n if (!enabled || !refetchOnReconnect) return;\n const unsub = onlineManager.subscribe(online => {\n if (online) void runFetch(false);\n });\n return unsub;\n }, [enabled, refetchOnReconnect, runFetch]);\n\n useEffect(() => {\n if (!enabled || !pollingInterval || pollingInterval <= 0) return;\n let timer: ReturnType<typeof setInterval> | null = null;\n const start = () => {\n if (timer) return;\n timer = setInterval(() => {\n if (focusManager.isFocused()) void runFetch(true);\n }, pollingInterval);\n };\n const stop = () => {\n if (timer) clearInterval(timer);\n timer = null;\n };\n start();\n const unsub = focusManager.subscribe(focused => {\n if (focused) start();\n else stop();\n });\n return () => {\n stop();\n unsub();\n };\n }, [enabled, pollingInterval, runFetch]);\n\n const state = cache.getState<T>(queryKey);\n const rawData = state?.data ?? null;\n const lastSelectedRef = useRef<TSelected | null>(null);\n const selectedData = useMemo<TSelected | null>(() => {\n if (rawData === null) {\n lastSelectedRef.current = null;\n return null;\n }\n const next = select ? select(rawData) : (rawData as unknown as TSelected);\n const prev = lastSelectedRef.current;\n const isEqual = selectIsEqual ?? Object.is;\n if (prev !== null && isEqual(prev, next)) return prev;\n lastSelectedRef.current = next;\n return next;\n }, [rawData, select, selectIsEqual]);\n\n const status = state?.status ?? 'idle';\n const hasData = rawData !== null;\n const isLoading = status === 'loading' && !hasData;\n const isRefetching = status === 'loading' && hasData;\n const error = state?.error ?? null;\n\n const refetch = useCallback(async () => {\n await runFetch(true);\n }, [runFetch]);\n\n return {\n data: selectedData,\n isLoading: enabled ? isLoading : false,\n isRefetching,\n error,\n refetch,\n };\n}\n","import { useCallback, useEffect, useState } from 'react';\n\nimport { getQueryClient } from '../query/client';\nimport type { QueryKey } from '../query/key';\n\n/**\n * Пакетное чтение нескольких ключей из кэша. Хук подписан на каждый\n * ключ и перерендерится, когда любое из значений изменится.\n *\n * Возвращает массив значений того же порядка, что и `keys`. Если ключа\n * нет в кэше — соответствующий элемент `undefined`.\n *\n * Не делает запросов — только читает. Если данных нужно «загрузить» —\n * используй `useFetch`/`useQuery` отдельно.\n *\n * @example\n * const [orders, chats, tasks] = useQueriesData<\n * [Board, ChatsUnread, TasksNew]\n * >([\n * ['orders', 'board'],\n * ['chats', 'unread'],\n * ['tasks', 'new'],\n * ]);\n */\nexport function useQueriesData<T extends readonly unknown[]>(\n keys: readonly QueryKey[],\n): { [K in keyof T]: T[K] | undefined } {\n const client = getQueryClient();\n const get = useCallback(\n () => keys.map(k => client.getQueryData(k)) as unknown as {\n [K in keyof T]: T[K] | undefined;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [client, keys.map(k => JSON.stringify(k)).join('|')],\n );\n\n const [snapshot, setSnapshot] = useState(get);\n\n useEffect(() => {\n setSnapshot(get());\n const unsubs = keys.map(k =>\n client.cache.subscribe(k, () => setSnapshot(get())),\n );\n return () => {\n for (const u of unsubs) u();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [client, get]);\n\n return snapshot;\n}\n","import { ApiError } from './errors';\n\n/**\n * Описывает «как мы общаемся с бекендом»: как распаковывать успешный\n * ответ, как детектить бизнес-ошибку в 2xx-ответе и как конвертировать\n * сырое тело в `ApiError`.\n *\n * Передаётся один раз в `configureApiClient({ responseAdapter })`.\n * Все три поля опциональны: дефолты дают Laravel-поведение (обратная\n * совместимость с 1.x / 2.0).\n */\nexport type ResponseAdapter<TRaw = unknown, TUnwrapped = unknown> = {\n /**\n * Распаковать 2xx-ответ в данные для caller'а. Вызывается ровно один\n * раз сразу после получения тела, ДО записи в кэш и ДО `select`.\n * По умолчанию — identity.\n */\n unwrap?: (raw: TRaw) => TUnwrapped;\n\n /**\n * Является ли 2xx-ответ бизнес-ошибкой (Laravel `{status: false}`,\n * GraphQL `{ errors: [...] }`, и т.п.). Если true — пакет вызовет\n * `toError` и кинет `ApiError` вместо resolve.\n * По умолчанию — `(r) => r?.status === false` (Laravel).\n */\n isBusinessError?: (raw: TRaw) => boolean;\n\n /**\n * Сконвертировать сырое тело в `ApiError`. Вызывается для:\n * - HTTP ≥ 400\n * - 2xx + `isBusinessError === true`\n * - сетевая ошибка / таймаут (`httpStatus = 0`)\n *\n * По умолчанию — текущий маппинг (`message`/`code`/`errors`).\n */\n toError?: (raw: unknown, httpStatus: number) => ApiError;\n};\n\nconst isObject = (v: unknown): v is Record<string, unknown> =>\n typeof v === 'object' && v !== null;\n\n/** Laravel-стиль: `{ status: false, message, errors }`. Default. */\nexport const laravelAdapter: ResponseAdapter = {\n isBusinessError: r =>\n isObject(r) && (r as { status?: unknown }).status === false,\n toError: (r, http) => {\n const body = isObject(r) ? r : undefined;\n return new ApiError({\n message:\n (body && typeof body.message === 'string'\n ? body.message\n : undefined) ?? `HTTP ${http}`,\n status: http,\n code: body && typeof body.code === 'string' ? body.code : undefined,\n errors: body?.errors,\n isUnauthorized: http === 401,\n isValidationError: http === 422 || (body?.errors !== undefined),\n raw: r,\n });\n },\n};\n\n/** JSON:API. `unwrap` отдаёт `r.data`, ошибки — массив в `r.errors`. */\nexport const jsonApiAdapter: ResponseAdapter = {\n unwrap: (r: unknown) => (isObject(r) ? r.data : r),\n isBusinessError: r =>\n isObject(r) && Array.isArray(r.errors) && r.errors.length > 0,\n toError: (r, http) => {\n const errors = isObject(r) && Array.isArray(r.errors) ? r.errors : [];\n const first = isObject(errors[0]) ? errors[0] : undefined;\n return new ApiError({\n message:\n (first && typeof first.detail === 'string' ? first.detail : undefined) ??\n (first && typeof first.title === 'string' ? first.title : undefined) ??\n `HTTP ${http}`,\n status: http,\n code: first && typeof first.code === 'string' ? first.code : undefined,\n errors,\n isUnauthorized: http === 401,\n isValidationError: http === 422,\n raw: r,\n });\n },\n};\n\n/** GraphQL. `unwrap` отдаёт `r.data`, ошибки в `r.errors`. */\nexport const graphqlAdapter: ResponseAdapter = {\n unwrap: (r: unknown) => (isObject(r) ? r.data : r),\n isBusinessError: r =>\n isObject(r) && Array.isArray(r.errors) && r.errors.length > 0,\n toError: (r, http) => {\n const errors = isObject(r) && Array.isArray(r.errors) ? r.errors : [];\n const first = isObject(errors[0]) ? errors[0] : undefined;\n return new ApiError({\n message:\n (first && typeof first.message === 'string'\n ? first.message\n : undefined) ?? `HTTP ${http}`,\n status: http,\n errors,\n isUnauthorized: http === 401,\n raw: r,\n });\n },\n};\n\n/** RFC 7807 problem+json. Бизнес-ошибок в 2xx не бывает — только HTTP. */\nexport const problemJsonAdapter: ResponseAdapter = {\n isBusinessError: () => false,\n toError: (r, http) => {\n const body = isObject(r) ? r : undefined;\n return new ApiError({\n message:\n (body && typeof body.title === 'string' ? body.title : undefined) ??\n (body && typeof body.detail === 'string' ? body.detail : undefined) ??\n `HTTP ${http}`,\n status: http,\n code: body && typeof body.type === 'string' ? body.type : undefined,\n isUnauthorized: http === 401,\n isValidationError: http === 422,\n raw: r,\n });\n },\n};\n\n/** Plain REST: никаких бизнес-ошибок в 2xx, identity unwrap. */\nexport const plainAdapter: ResponseAdapter = {\n isBusinessError: () => false,\n toError: (r, http) => {\n const body = isObject(r) ? r : undefined;\n return new ApiError({\n message:\n (body && typeof body.message === 'string'\n ? body.message\n : undefined) ?? `HTTP ${http}`,\n status: http,\n isUnauthorized: http === 401,\n isNetworkError: http === 0,\n raw: r,\n });\n },\n};\n","import type { DehydratedState } from './cache';\nimport type { QueryClient } from './client';\nimport type { QueryKey } from './key';\n\n/**\n * Storage-адаптер. Совместим с AsyncStorage и expo-secure-store:\n * { getItem(key): Promise<string|null>, setItem(key, value): Promise<void>,\n * removeItem(key): Promise<void> }.\n */\nexport interface PersistStorage {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n}\n\nexport type PersistOptions = {\n client: QueryClient;\n storage: PersistStorage;\n /** Ключ в storage. По умолчанию 'react-api-client:cache'. */\n storageKey?: string;\n /** Дросселирование записи (ms). По умолчанию 1000. */\n throttleMs?: number;\n /** Фильтр ключей: что вообще сохранять. По умолчанию — всё. */\n allowList?: (key: QueryKey) => boolean;\n /** Максимальный возраст сохранённого снэпшота (ms). Старее — выбрасываем. */\n maxAge?: number;\n /**\n * Версия снэпшота. При несовпадении — снэпшот игнорируется и удаляется.\n * Поднимай при изменении формата данных в кэше.\n */\n version?: string | number;\n};\n\ntype Snapshot = {\n version?: string | number;\n savedAt: number;\n state: DehydratedState;\n};\n\n/**\n * Подключает QueryClient к persistent storage.\n *\n * С версии 2.0.0 — подписан на `cache.subscribeAll`, поэтому\n * автоматически сохраняет состояние через `throttleMs` после любого\n * изменения (setData, успешный fetch, invalidate, remove). Ручной\n * `persist()` остаётся доступным для критичных моментов (logout,\n * shutdown), но в обычном потоке не нужен.\n *\n * Возвращает:\n * - `restore()` — гидратирует кэш из storage. Вызывать на старте.\n * - `persist()` — форс-запись текущего состояния.\n * - `unsubscribe()` — отключить авто-сохранение.\n */\nexport function persistQueryClient(options: PersistOptions): {\n restore: () => Promise<void>;\n persist: () => Promise<void>;\n unsubscribe: () => void;\n} {\n const {\n client,\n storage,\n storageKey = 'react-api-client:cache',\n throttleMs = 1000,\n allowList,\n maxAge,\n version,\n } = options;\n\n let pendingTimer: ReturnType<typeof setTimeout> | null = null;\n let lastSerialized: string | null = null;\n let unsubscribed = false;\n\n const persist = async () => {\n const state = client.cache.dehydrate(allowList);\n if (state.queries.length === 0) return;\n const snap: Snapshot = { version, savedAt: Date.now(), state };\n const serialized = JSON.stringify(snap);\n if (serialized === lastSerialized) return;\n lastSerialized = serialized;\n await storage.setItem(storageKey, serialized);\n };\n\n const scheduleWrite = () => {\n if (unsubscribed) return;\n if (pendingTimer) return; // throttle: один таймер на окно\n pendingTimer = setTimeout(() => {\n pendingTimer = null;\n void persist();\n }, throttleMs);\n };\n\n const restore = async () => {\n const raw = await storage.getItem(storageKey);\n if (!raw) return;\n try {\n const snap = JSON.parse(raw) as Snapshot;\n if (version !== undefined && snap.version !== version) {\n await storage.removeItem(storageKey);\n return;\n }\n if (maxAge && Date.now() - snap.savedAt > maxAge) {\n await storage.removeItem(storageKey);\n return;\n }\n client.cache.hydrate(snap.state);\n } catch {\n await storage.removeItem(storageKey);\n }\n };\n\n const unsubscribeFromCache = client.cache.subscribeAll(scheduleWrite);\n\n return {\n restore,\n persist,\n unsubscribe: () => {\n unsubscribed = true;\n unsubscribeFromCache();\n if (pendingTimer) {\n clearTimeout(pendingTimer);\n pendingTimer = null;\n }\n },\n };\n}","import type { QueryCache, QueryStatus } from './cache';\nimport type { QueryClient } from './client';\nimport type { QueryKey } from './key';\n\nexport type CacheEntrySnapshot = {\n key: QueryKey;\n hash: string;\n status: QueryStatus;\n isStale: boolean;\n updatedAt: number;\n hasData: boolean;\n subscribers: number;\n hasInflight: boolean;\n errorMessage: string | null;\n};\n\n/**\n * Снимок состояния всего кэша — без приватных полей и без данных.\n * Удобно выводить в debug-экране или логировать.\n */\nexport function inspectCache(cache: QueryCache): CacheEntrySnapshot[] {\n const entries = cache._debugEntries();\n const snapshot: CacheEntrySnapshot[] = [];\n for (const [hash, entry] of entries) {\n snapshot.push({\n key: entry.key,\n hash,\n status: entry.state.status,\n isStale: entry.state.isStale,\n updatedAt: entry.state.updatedAt,\n hasData: entry.state.data !== undefined,\n subscribers: entry.subscribers.size,\n hasInflight: entry.inflight !== null,\n errorMessage: entry.state.error?.message ?? null,\n });\n }\n return snapshot;\n}\n\n/** «invalidate all» — пометить весь кэш как stale. */\nexport function invalidateAll(client: QueryClient): void {\n client.invalidateQueries(() => true);\n}\n\n/** Краткая сводка для логов: сколько записей, активных подписчиков, inflight. */\nexport function summarizeCache(cache: QueryCache): {\n total: number;\n withSubscribers: number;\n inflight: number;\n stale: number;\n byStatus: Record<QueryStatus, number>;\n} {\n const byStatus: Record<QueryStatus, number> = {\n idle: 0,\n loading: 0,\n success: 0,\n error: 0,\n };\n let withSubscribers = 0;\n let inflight = 0;\n let stale = 0;\n const entries = cache._debugEntries();\n for (const entry of entries.values()) {\n byStatus[entry.state.status]++;\n if (entry.subscribers.size > 0) withSubscribers++;\n if (entry.inflight) inflight++;\n if (entry.state.isStale) stale++;\n }\n return { total: entries.size, withSubscribers, inflight, stale, byStatus };\n}\n","import {\n createContext,\n createElement,\n useContext,\n useMemo,\n type ReactNode,\n} from 'react';\n\nimport { QueryClient, setQueryClient } from './client';\n\nconst QueryClientContext = createContext<QueryClient | null>(null);\n\nexport type ApiClientProviderProps = {\n client?: QueryClient;\n children: ReactNode;\n};\n\n/**\n * Корневой Provider пакета. Создаёт (или принимает) QueryClient и кладёт\n * его в React Context. Хуки достают клиент через useQueryClient().\n *\n * Также синхронизирует переданный client с singleton'ом\n * getQueryClient() — чтобы push-handler'ы вне React-дерева могли дергать\n * `getQueryClient().invalidateQueries(...)`.\n */\nexport function ApiClientProvider({\n client,\n children,\n}: ApiClientProviderProps) {\n const value = useMemo(() => {\n const instance = client ?? new QueryClient();\n setQueryClient(instance);\n return instance;\n }, [client]);\n\n return createElement(\n QueryClientContext.Provider,\n { value },\n children,\n );\n}\n\nexport function useQueryClient(): QueryClient {\n const ctx = useContext(QueryClientContext);\n if (!ctx) {\n throw new Error(\n 'useQueryClient: не найден ApiClientProvider. Оберни корень приложения в <ApiClientProvider>.',\n );\n }\n return ctx;\n}\n","import { executeRequest } from './utils';\n\nimport { createUseFetch, createUseMutation, createUsePaginate } from './hooks';\n\nimport type {\n ApiClientReturn,\n ApiMutationReturn,\n ApiPaginateReturn,\n RequestConfig,\n ResponseWrapper,\n} from './types';\n\n/**\n * Creates an API client for GET requests\n * @param endpoint - URL string or function that generates URL from params\n * @param fetchConfig - Request configuration\n * @returns Object with fetch method and useFetch hook\n *\n * @example\n * const userApi = apiClient<User, { id: string }>('/api/users/:id')\n * const { data } = userApi.useFetch({ id: '123' })\n */\nfunction apiClient<\n ResponseType = void,\n RequestParamsType = void,\n ErrorResponseType = unknown,\n>(\n endpoint: string | ((arg0: RequestParamsType) => string),\n fetchConfig: RequestConfig = {},\n): ApiClientReturn<ResponseType, RequestParamsType, ErrorResponseType> {\n type RT = ResponseWrapper<ResponseType, ErrorResponseType>;\n\n const fetch = async (params?: RequestParamsType): Promise<RT> => {\n return executeRequest<ResponseType, RequestParamsType, ErrorResponseType>(\n endpoint,\n fetchConfig,\n params,\n );\n };\n\n const useFetch = createUseFetch<\n ResponseType,\n RequestParamsType,\n ErrorResponseType\n >(endpoint, fetchConfig);\n\n return { fetch, useFetch };\n}\n\n/**\n * Creates an API client for mutation requests (POST/PUT/PATCH/DELETE)\n * @param endpoint - URL string or function that generates URL from params\n * @param fetchConfig - Request configuration\n * @returns Object with mutate method and useMutation hook\n *\n * @example\n * const createUserApi = apiMutation<User, CreateUserRequest>('/api/users', { method: 'POST' })\n * const { mutate, isLoading } = createUserApi.useMutation()\n */\nfunction apiMutation<\n ResponseType = void,\n RequestParamsType = void,\n ErrorResponseType = unknown,\n>(\n endpoint: string | ((arg0: RequestParamsType) => string),\n fetchConfig: RequestConfig = {},\n): ApiMutationReturn<ResponseType, RequestParamsType, ErrorResponseType> {\n type RT = ResponseWrapper<ResponseType, ErrorResponseType>;\n\n const mutate = async (params?: RequestParamsType): Promise<RT> => {\n return executeRequest<ResponseType, RequestParamsType, ErrorResponseType>(\n endpoint,\n fetchConfig,\n params,\n );\n };\n\n const useMutation = createUseMutation<\n ResponseType,\n RequestParamsType,\n ErrorResponseType\n >(endpoint, fetchConfig);\n\n return { mutate, useMutation };\n}\n\n/**\n * Creates an API client for paginated requests.\n *\n * Каждая страница хранится в кэше под собственным подключом\n * `['__paginate__', endpoint, params, { page, limit }]`. Это значит, что\n * мутация может одной операцией пометить stale **все страницы** списка:\n *\n * ```ts\n * confirmOrder.useMutation({\n * invalidateKeys: [['__paginate__', '/orders/archive']],\n * });\n * ```\n *\n * Префикс матчится по `matchQueryKey` → подключи каждой страницы тоже\n * считаются совпадающими.\n *\n * @param endpoint - URL string or function that generates URL from params\n * @param fetchConfig - Request configuration\n * @param options - Pagination options (data/total extractors)\n * @returns Object with usePaginate hook\n *\n * @example\n * const usersApi = apiPaginate<UsersResponse, User[], { search?: string }>('/api/users')\n * const { data, fetchNextPage, hasNextPage } = usersApi.usePaginate()\n */\nfunction apiPaginate<\n ResponseType extends { data: TData; total?: number; page?: number },\n TData extends unknown[],\n RequestParamsType = void,\n ErrorResponseType = unknown,\n>(\n endpoint: string | ((arg0: RequestParamsType) => string),\n fetchConfig: RequestConfig = {},\n options?: {\n dataExtractor?: (response: ResponseType) => TData;\n totalExtractor?: (response: ResponseType) => number;\n },\n): ApiPaginateReturn<\n ResponseType,\n RequestParamsType,\n TData,\n ErrorResponseType\n> {\n const usePaginate = createUsePaginate<\n ResponseType,\n TData,\n RequestParamsType,\n ErrorResponseType\n >(endpoint, fetchConfig, options);\n\n return { usePaginate };\n}\n\nexport default apiClient;\nexport { apiMutation, apiPaginate };\n\n// Export configuration\nexport { configureApiClient, getConfig, isConfigured } from './config';\n\n// Унифицированные ошибки (Фаза 3.5 + 1.2)\nexport { ApiError, toApiError, businessErrorToApiError } from './errors';\nexport type { ApiErrorInit } from './errors';\n\n// Response adapters: backend-agnostic режим\nexport {\n laravelAdapter,\n jsonApiAdapter,\n graphqlAdapter,\n problemJsonAdapter,\n plainAdapter,\n} from './adapters';\nexport type { ResponseAdapter } from './adapters';\n\n// Global state hooks\nexport {\n useIsFetching,\n useIsMutating,\n useQuery,\n useQueriesData,\n} from './hooks';\nexport type { UseQueryOptions, UseQueryResult } from './hooks';\n\n// Query cache layer (Phase 1 + 2)\nexport {\n QueryCache,\n QueryClient,\n getQueryClient,\n setQueryClient,\n hashQueryKey,\n matchQueryKey,\n focusManager,\n onlineManager,\n ApiClientProvider,\n useQueryClient,\n persistQueryClient,\n inspectCache,\n invalidateAll,\n summarizeCache,\n} from './query';\nexport type {\n FetchOptions,\n QueryFn,\n QueryKey,\n QueryState,\n QueryStatus,\n ApiClientProviderProps,\n DehydratedQuery,\n DehydratedState,\n PersistOptions,\n PersistStorage,\n CacheEntrySnapshot,\n} from './query';\n\n// Re-export types for convenience\nexport type {\n ResponseWrapper,\n Register,\n DataOf,\n UseFetchOptions,\n UseFetchResult,\n UseMutationOptions,\n UseMutationResult,\n UsePaginateOptions,\n UsePaginateResult,\n ApiClientConfig,\n ApiClientLogger,\n IHttpClient,\n} from './types';\n"]}
|