@igniter-js/caller 0.1.53 → 0.1.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/index.d.mts +11 -11
- package/dist/client/index.d.ts +11 -11
- package/dist/client/index.js +11 -6
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +11 -6
- package/dist/client/index.mjs.map +1 -1
- package/package.json +7 -8
package/dist/client/index.d.mts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { I as IgniterCallerManager, a as IgniterCallerApiResponse, b as IgniterCallerSchemaMap, c as IgniterCallerSchemaMethod, E as EndpointInfo, G as GetPaths, d as InferResponse, T as TypedRequestBuilder, e as IgniterCallerTypedRequestBuilder, P as PostPaths, f as PutPaths, g as PatchPaths, D as DeletePaths, H as HeadPaths } from '../manager-DXmJbnQY.mjs';
|
|
2
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
3
2
|
import { PropsWithChildren } from 'react';
|
|
4
3
|
import { IgniterError } from '@igniter-js/common';
|
|
4
|
+
import { I as IgniterCallerManager, a as IgniterCallerApiResponse, b as IgniterCallerSchemaMap, c as IgniterCallerSchemaMethod, E as EndpointInfo, G as GetPaths, d as InferResponse, T as TypedRequestBuilder, e as IgniterCallerTypedRequestBuilder, P as PostPaths, f as PutPaths, g as PatchPaths, D as DeletePaths, H as HeadPaths } from '../manager-DXmJbnQY.mjs';
|
|
5
5
|
import '@igniter-js/telemetry';
|
|
6
6
|
import 'zod';
|
|
7
7
|
import '../store-D2p2dqGN.mjs';
|
|
@@ -44,16 +44,6 @@ interface IgniterCallerClientContextValue<TCallers extends IgniterCallerClientMa
|
|
|
44
44
|
listeners: IgniterCallerClientListeners;
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
interface IgniterCallerProviderProps<TCallers extends IgniterCallerClientMap> extends PropsWithChildren {
|
|
48
|
-
callers: TCallers;
|
|
49
|
-
configs?: IgniterCallerClientConfigs<TCallers>;
|
|
50
|
-
hooks?: IgniterCallerClientConfig;
|
|
51
|
-
onError?: (error: IgniterError) => void;
|
|
52
|
-
}
|
|
53
|
-
declare function IgniterCallerProvider<TCallers extends IgniterCallerClientMap>(props: IgniterCallerProviderProps<TCallers>): react_jsx_runtime.JSX.Element;
|
|
54
|
-
declare function useIgniterCallerContext<TCallers extends IgniterCallerClientMap>(): IgniterCallerClientContextValue<TCallers>;
|
|
55
|
-
declare function useIgniterCaller<TCallers extends IgniterCallerClientMap>(): <TKey extends keyof TCallers>(callerKey: TKey) => IgniterCallerClient<IgniterCallerManager<any>>;
|
|
56
|
-
|
|
57
47
|
type IgniterCallerClientRequestParams<TSchemas extends IgniterCallerSchemaMap, TPath extends string, TMethod extends IgniterCallerSchemaMethod> = EndpointInfo<TSchemas, TPath, TMethod>['params'] & Record<string, string | number | boolean>;
|
|
58
48
|
type IgniterCallerClientRequestBody<TSchemas extends IgniterCallerSchemaMap, TPath extends string, TMethod extends IgniterCallerSchemaMethod> = EndpointInfo<TSchemas, TPath, TMethod>['request'];
|
|
59
49
|
interface IgniterCallerUseQueryOptions<TResponse, TVariables extends {
|
|
@@ -184,6 +174,16 @@ interface IgniterCallerClient<TCaller extends IgniterCallerManager<any>> {
|
|
|
184
174
|
};
|
|
185
175
|
}
|
|
186
176
|
|
|
177
|
+
interface IgniterCallerProviderProps<TCallers extends IgniterCallerClientMap> extends PropsWithChildren {
|
|
178
|
+
callers: TCallers;
|
|
179
|
+
configs?: IgniterCallerClientConfigs<TCallers>;
|
|
180
|
+
hooks?: IgniterCallerClientConfig;
|
|
181
|
+
onError?: (error: IgniterError) => void;
|
|
182
|
+
}
|
|
183
|
+
declare function IgniterCallerProvider<TCallers extends IgniterCallerClientMap>(props: IgniterCallerProviderProps<TCallers>): react_jsx_runtime.JSX.Element;
|
|
184
|
+
declare function useIgniterCallerContext<TCallers extends IgniterCallerClientMap>(): IgniterCallerClientContextValue<TCallers>;
|
|
185
|
+
declare function useIgniterCaller<TCallers extends IgniterCallerClientMap>(): <TKey extends keyof TCallers>(callerKey: TKey) => IgniterCallerClient<TCallers[TKey]>;
|
|
186
|
+
|
|
187
187
|
declare function createIgniterCallerClient<TCaller extends IgniterCallerManager<any>, TCallers extends Record<string, IgniterCallerManager<any>>>(context: IgniterCallerClientContextValue<TCallers>, callerKey: keyof TCallers): IgniterCallerClient<TCaller>;
|
|
188
188
|
|
|
189
189
|
declare class IgniterCallerClientCache {
|
package/dist/client/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { I as IgniterCallerManager, a as IgniterCallerApiResponse, b as IgniterCallerSchemaMap, c as IgniterCallerSchemaMethod, E as EndpointInfo, G as GetPaths, d as InferResponse, T as TypedRequestBuilder, e as IgniterCallerTypedRequestBuilder, P as PostPaths, f as PutPaths, g as PatchPaths, D as DeletePaths, H as HeadPaths } from '../manager-DQcuAp3y.js';
|
|
2
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
3
2
|
import { PropsWithChildren } from 'react';
|
|
4
3
|
import { IgniterError } from '@igniter-js/common';
|
|
4
|
+
import { I as IgniterCallerManager, a as IgniterCallerApiResponse, b as IgniterCallerSchemaMap, c as IgniterCallerSchemaMethod, E as EndpointInfo, G as GetPaths, d as InferResponse, T as TypedRequestBuilder, e as IgniterCallerTypedRequestBuilder, P as PostPaths, f as PutPaths, g as PatchPaths, D as DeletePaths, H as HeadPaths } from '../manager-DQcuAp3y.js';
|
|
5
5
|
import '@igniter-js/telemetry';
|
|
6
6
|
import 'zod';
|
|
7
7
|
import '../store-D2p2dqGN.js';
|
|
@@ -44,16 +44,6 @@ interface IgniterCallerClientContextValue<TCallers extends IgniterCallerClientMa
|
|
|
44
44
|
listeners: IgniterCallerClientListeners;
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
interface IgniterCallerProviderProps<TCallers extends IgniterCallerClientMap> extends PropsWithChildren {
|
|
48
|
-
callers: TCallers;
|
|
49
|
-
configs?: IgniterCallerClientConfigs<TCallers>;
|
|
50
|
-
hooks?: IgniterCallerClientConfig;
|
|
51
|
-
onError?: (error: IgniterError) => void;
|
|
52
|
-
}
|
|
53
|
-
declare function IgniterCallerProvider<TCallers extends IgniterCallerClientMap>(props: IgniterCallerProviderProps<TCallers>): react_jsx_runtime.JSX.Element;
|
|
54
|
-
declare function useIgniterCallerContext<TCallers extends IgniterCallerClientMap>(): IgniterCallerClientContextValue<TCallers>;
|
|
55
|
-
declare function useIgniterCaller<TCallers extends IgniterCallerClientMap>(): <TKey extends keyof TCallers>(callerKey: TKey) => IgniterCallerClient<IgniterCallerManager<any>>;
|
|
56
|
-
|
|
57
47
|
type IgniterCallerClientRequestParams<TSchemas extends IgniterCallerSchemaMap, TPath extends string, TMethod extends IgniterCallerSchemaMethod> = EndpointInfo<TSchemas, TPath, TMethod>['params'] & Record<string, string | number | boolean>;
|
|
58
48
|
type IgniterCallerClientRequestBody<TSchemas extends IgniterCallerSchemaMap, TPath extends string, TMethod extends IgniterCallerSchemaMethod> = EndpointInfo<TSchemas, TPath, TMethod>['request'];
|
|
59
49
|
interface IgniterCallerUseQueryOptions<TResponse, TVariables extends {
|
|
@@ -184,6 +174,16 @@ interface IgniterCallerClient<TCaller extends IgniterCallerManager<any>> {
|
|
|
184
174
|
};
|
|
185
175
|
}
|
|
186
176
|
|
|
177
|
+
interface IgniterCallerProviderProps<TCallers extends IgniterCallerClientMap> extends PropsWithChildren {
|
|
178
|
+
callers: TCallers;
|
|
179
|
+
configs?: IgniterCallerClientConfigs<TCallers>;
|
|
180
|
+
hooks?: IgniterCallerClientConfig;
|
|
181
|
+
onError?: (error: IgniterError) => void;
|
|
182
|
+
}
|
|
183
|
+
declare function IgniterCallerProvider<TCallers extends IgniterCallerClientMap>(props: IgniterCallerProviderProps<TCallers>): react_jsx_runtime.JSX.Element;
|
|
184
|
+
declare function useIgniterCallerContext<TCallers extends IgniterCallerClientMap>(): IgniterCallerClientContextValue<TCallers>;
|
|
185
|
+
declare function useIgniterCaller<TCallers extends IgniterCallerClientMap>(): <TKey extends keyof TCallers>(callerKey: TKey) => IgniterCallerClient<TCallers[TKey]>;
|
|
186
|
+
|
|
187
187
|
declare function createIgniterCallerClient<TCaller extends IgniterCallerManager<any>, TCallers extends Record<string, IgniterCallerManager<any>>>(context: IgniterCallerClientContextValue<TCallers>, callerKey: keyof TCallers): IgniterCallerClient<TCaller>;
|
|
188
188
|
|
|
189
189
|
declare class IgniterCallerClientCache {
|
package/dist/client/index.js
CHANGED
|
@@ -157,8 +157,9 @@ function createUseQuery(params) {
|
|
|
157
157
|
callerKey,
|
|
158
158
|
method,
|
|
159
159
|
path,
|
|
160
|
-
|
|
160
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
161
161
|
JSON.stringify(options?.params || {}),
|
|
162
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
162
163
|
JSON.stringify(options?.query || {})
|
|
163
164
|
]);
|
|
164
165
|
const execute = react.useCallback(
|
|
@@ -261,9 +262,11 @@ function createUseQuery(params) {
|
|
|
261
262
|
register(stableKey, refetch);
|
|
262
263
|
return () => unregister(stableKey, refetch);
|
|
263
264
|
}, [register, unregister, refetch, stableKey]);
|
|
265
|
+
const initialFetchDoneRef = react.useRef(false);
|
|
264
266
|
react.useEffect(() => {
|
|
265
267
|
if (optionsRef.current?.enabled === false) return;
|
|
266
|
-
if (optionsRef.current?.refetchOnMount === false) return;
|
|
268
|
+
if (optionsRef.current?.refetchOnMount === false && initialFetchDoneRef.current) return;
|
|
269
|
+
initialFetchDoneRef.current = true;
|
|
267
270
|
void execute(lastVariablesRef.current);
|
|
268
271
|
}, [stableKey, execute]);
|
|
269
272
|
react.useEffect(() => {
|
|
@@ -620,9 +623,13 @@ function IgniterCallerProvider(props) {
|
|
|
620
623
|
},
|
|
621
624
|
[]
|
|
622
625
|
);
|
|
626
|
+
const configStateRef = react.useMemo(() => ({ current: configState }), []);
|
|
627
|
+
configStateRef.current = configState;
|
|
628
|
+
const globalConfigRef = react.useMemo(() => ({ current: globalConfig }), []);
|
|
629
|
+
globalConfigRef.current = globalConfig;
|
|
623
630
|
const getMergedConfig = react.useCallback(
|
|
624
|
-
(callerKey) => mergeConfig(
|
|
625
|
-
[
|
|
631
|
+
(callerKey) => mergeConfig(globalConfigRef.current, configStateRef.current[callerKey]),
|
|
632
|
+
[globalConfigRef, configStateRef]
|
|
626
633
|
);
|
|
627
634
|
const getConfig = react.useCallback(
|
|
628
635
|
(callerKey, key) => getMergedConfig(callerKey)[key],
|
|
@@ -645,8 +652,6 @@ function IgniterCallerProvider(props) {
|
|
|
645
652
|
}),
|
|
646
653
|
[
|
|
647
654
|
callers,
|
|
648
|
-
configState,
|
|
649
|
-
globalConfig,
|
|
650
655
|
getConfig,
|
|
651
656
|
getMergedConfig,
|
|
652
657
|
invalidate,
|
package/dist/client/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/client/utils/cache.ts","../../src/client/utils/query-key.ts","../../src/client/utils/cookies.ts","../../src/client/builders/hooks.builder.tsx","../../src/client/builders/client.builder.ts","../../src/client/builders/provider.builder.tsx"],"names":["useState","useRef","useMemo","useCallback","useEffect","createContext","value","jsx","useContext"],"mappings":"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","file":"index.js","sourcesContent":["export class IgniterCallerClientCache {\n private static cache = new Map<\n string,\n { data: unknown; timestamp: number }\n >()\n\n static get<T>(key: string, staleTime?: number): T | undefined {\n const entry = IgniterCallerClientCache.cache.get(key)\n if (!entry) return undefined\n\n if (staleTime && Date.now() - entry.timestamp > staleTime) {\n IgniterCallerClientCache.cache.delete(key)\n return undefined\n }\n\n return entry.data as T\n }\n\n static set(key: string, data: unknown): void {\n IgniterCallerClientCache.cache.set(key, {\n data,\n timestamp: Date.now(),\n })\n }\n\n static replacePrefix(prefix: string, data: unknown): void {\n for (const [key, entry] of IgniterCallerClientCache.cache.entries()) {\n if (key.startsWith(prefix)) {\n IgniterCallerClientCache.cache.set(key, {\n data,\n timestamp: entry.timestamp,\n })\n }\n }\n }\n\n static clearPrefix(prefix: string): void {\n for (const key of IgniterCallerClientCache.cache.keys()) {\n if (key.startsWith(prefix)) {\n IgniterCallerClientCache.cache.delete(key)\n }\n }\n }\n}\n","import type { IgniterCallerClientQuery } from '../interfaces/config'\n\nconst EMPTY_KEY = '{}'\n\nfunction stableStringify(value: unknown): string {\n if (value === null || value === undefined) return EMPTY_KEY\n if (typeof value !== 'object') return JSON.stringify(value)\n if (Array.isArray(value)) {\n return `[${value.map((item) => stableStringify(item)).join(',')}]`\n }\n\n const entries = Object.entries(value as Record<string, unknown>).sort(\n ([a], [b]) => a.localeCompare(b),\n )\n\n return `{${entries\n .map(([key, val]) => `${JSON.stringify(key)}:${stableStringify(val)}`)\n .join(',')}}`\n}\n\nexport function buildQueryKey(params: {\n callerKey: string\n method: string\n path: string\n query?: IgniterCallerClientQuery\n params?: Record<string, string | number | boolean>\n}): string {\n const { callerKey, method, path, query, params: pathParams } = params\n const payload = {\n params: pathParams || {},\n query: query || {},\n }\n\n return `${callerKey}::${method.toUpperCase()}::${path}::${stableStringify(payload)}`\n}\n\nexport function buildQueryPrefix(params: {\n callerKey: string\n method: string\n path: string\n}): string {\n const { callerKey, method, path } = params\n return `${callerKey}::${method.toUpperCase()}::${path}`\n}\n","import type { IgniterCallerClientCookies } from '../interfaces/config'\n\nexport function buildCookieHeader(\n cookies?: IgniterCallerClientCookies,\n): string | undefined {\n if (!cookies || Object.keys(cookies).length === 0) return undefined\n\n return Object.entries(cookies)\n .map(([key, value]) => `${key}=${value}`)\n .join('; ')\n}\n","'use client'\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport type { IgniterError } from '@igniter-js/common'\nimport type { IgniterCallerApiResponse } from '../../types/response'\nimport type {\n IgniterCallerClientConfig,\n IgniterCallerClientQuery,\n} from '../interfaces/config'\nimport type { IgniterCallerClientRefetchFn } from '../interfaces/context'\nimport type {\n IgniterCallerUseMutateOptions,\n IgniterCallerUseMutateResult,\n IgniterCallerUseQueryOptions,\n IgniterCallerUseQueryResult,\n} from '../interfaces/hooks'\nimport { IgniterCallerClientCache } from '../utils/cache'\nimport { buildQueryKey, buildQueryPrefix } from '../utils/query-key'\nimport { buildCookieHeader } from '../utils/cookies'\n\nexport interface IgniterCallerClientRequestInput {\n params?: Record<string, string | number | boolean>\n query?: Record<string, string | number | boolean>\n headers?: Record<string, string>\n cookies?: Record<string, string>\n body?: unknown\n}\n\nexport type IgniterCallerClientRequestFactory<TResponse> = (\n method: string,\n path: string,\n input: IgniterCallerClientRequestInput,\n) => {\n execute: () => Promise<IgniterCallerApiResponse<TResponse>>\n}\n\ninterface UseQueryParams<TResponse, TVariables> {\n callerKey: string\n method: 'GET' | 'HEAD'\n path: string\n buildRequest: IgniterCallerClientRequestFactory<TResponse>\n register: (key: string, refetch: IgniterCallerClientRefetchFn) => void\n unregister: (key: string, refetch: IgniterCallerClientRefetchFn) => void\n invalidate: (keys: string | string[], data?: unknown) => void\n getMergedConfig: () => IgniterCallerClientConfig\n onError?: (error: IgniterError) => void\n}\n\ninterface UseMutateParams<TResponse, TVariables> {\n callerKey: string\n method: 'POST' | 'PUT' | 'PATCH' | 'DELETE'\n path: string\n buildRequest: IgniterCallerClientRequestFactory<TResponse>\n getMergedConfig: () => IgniterCallerClientConfig\n onError?: (error: IgniterError) => void\n}\n\nfunction mergeQueryInput(\n config: IgniterCallerClientConfig,\n options?: IgniterCallerClientRequestInput,\n variables?: IgniterCallerClientRequestInput,\n): IgniterCallerClientRequestInput {\n const headers = {\n ...(config.headers || {}),\n ...(options?.headers || {}),\n ...(variables?.headers || {}),\n }\n const cookies = {\n ...(config.cookies || {}),\n ...(options?.cookies || {}),\n ...(variables?.cookies || {}),\n }\n const query = {\n ...(config.query || {}),\n ...(options?.query || {}),\n ...(variables?.query || {}),\n ...(options?.params || {}),\n ...(variables?.params || {}),\n }\n\n const cookieHeader = buildCookieHeader(cookies)\n if (cookieHeader && !headers.Cookie) {\n headers.Cookie = cookieHeader\n }\n\n return {\n headers,\n cookies,\n query,\n params: variables?.params || options?.params,\n }\n}\n\nfunction mergeMutateInput(\n config: IgniterCallerClientConfig,\n options?: IgniterCallerClientRequestInput,\n variables?: IgniterCallerClientRequestInput,\n): IgniterCallerClientRequestInput {\n const merged = mergeQueryInput(config, options, variables)\n return {\n ...merged,\n body: variables?.body ?? options?.body,\n }\n}\n\nexport function createUseQuery<\n TResponse,\n TVariables extends {\n params?: Record<string, string | number | boolean>\n query?: IgniterCallerClientQuery\n },\n>(\n params: UseQueryParams<TResponse, TVariables>,\n): (\n options?: IgniterCallerUseQueryOptions<TResponse, TVariables>,\n) => IgniterCallerUseQueryResult<TResponse, TVariables> {\n const {\n callerKey,\n method,\n path,\n buildRequest,\n register,\n unregister,\n invalidate,\n getMergedConfig,\n onError,\n } = params\n\n return (options) => {\n const [status, setStatus] = useState<'loading' | 'error' | 'success'>(\n options?.initialData ? 'success' : 'loading',\n )\n const [isFetching, setIsFetching] = useState(false)\n const [response, setResponse] = useState<{\n data: TResponse | null\n error: IgniterError | null\n }>({\n data: options?.initialData ?? null,\n error: null,\n })\n const [variables, setVariables] = useState<TVariables | undefined>(\n undefined,\n )\n\n const optionsRef = useRef(options)\n optionsRef.current = options\n\n const lastVariablesRef = useRef<TVariables | undefined>(undefined)\n\n const stableKey = useMemo(() => {\n const mergedConfig = getMergedConfig()\n const mergedInput = mergeQueryInput(\n mergedConfig,\n options as IgniterCallerClientRequestInput | undefined,\n lastVariablesRef.current as IgniterCallerClientRequestInput | undefined,\n )\n\n return buildQueryKey({\n callerKey,\n method,\n path,\n query: mergedInput.query,\n params: mergedInput.params,\n })\n }, [\n callerKey,\n method,\n path,\n getMergedConfig,\n JSON.stringify(options?.params || {}),\n JSON.stringify(options?.query || {}),\n ])\n\n const execute = useCallback(\n async (nextVariables?: TVariables) => {\n if (optionsRef.current?.enabled === false) return\n\n const mergedConfig = getMergedConfig()\n const mergedInput = mergeQueryInput(\n mergedConfig,\n optionsRef.current as IgniterCallerClientRequestInput | undefined,\n nextVariables as IgniterCallerClientRequestInput | undefined,\n )\n\n const queryKey = buildQueryKey({\n callerKey,\n method,\n path,\n query: mergedInput.query,\n params: mergedInput.params,\n })\n\n lastVariablesRef.current = nextVariables\n setVariables(nextVariables)\n\n setIsFetching(true)\n setStatus('loading')\n optionsRef.current?.onLoading?.(true)\n mergedConfig.onQueryLoading?.(true)\n\n if (optionsRef.current?.staleTime) {\n const cached = IgniterCallerClientCache.get<TResponse>(\n queryKey,\n optionsRef.current.staleTime,\n )\n if (cached !== undefined) {\n setResponse({ data: cached, error: null })\n setStatus('success')\n optionsRef.current?.onSuccess?.(cached)\n mergedConfig.onQuerySuccess?.(cached)\n optionsRef.current?.onLoading?.(false)\n mergedConfig.onQueryLoading?.(false)\n setIsFetching(false)\n return {\n data: cached,\n error: undefined,\n }\n }\n }\n\n try {\n const result = await buildRequest(method, path, mergedInput).execute()\n optionsRef.current?.onRequest?.(result)\n if (result.error) {\n setResponse({ data: null, error: result.error })\n setStatus('error')\n optionsRef.current?.onError?.(result.error)\n mergedConfig.onQueryError?.(result.error)\n onError?.(result.error)\n } else {\n const data = (result.data ?? null) as TResponse | null\n setResponse({ data, error: null })\n setStatus('success')\n optionsRef.current?.onSuccess?.(data as TResponse)\n mergedConfig.onQuerySuccess?.(data)\n\n if (optionsRef.current?.staleTime && data !== null) {\n IgniterCallerClientCache.set(queryKey, data)\n }\n }\n\n optionsRef.current?.onSettled?.(\n result.data ?? null,\n result.error ?? null,\n )\n mergedConfig.onQuerySettled?.(\n result.data ?? null,\n result.error ?? null,\n )\n\n return result\n } catch (error) {\n const typedError = error as IgniterError\n setResponse({ data: null, error: typedError })\n setStatus('error')\n optionsRef.current?.onError?.(typedError)\n mergedConfig.onQueryError?.(typedError)\n onError?.(typedError)\n optionsRef.current?.onSettled?.(null, typedError)\n mergedConfig.onQuerySettled?.(null, typedError)\n } finally {\n setIsFetching(false)\n optionsRef.current?.onLoading?.(false)\n mergedConfig.onQueryLoading?.(false)\n }\n },\n [callerKey, method, path, buildRequest, getMergedConfig, onError],\n )\n\n const refetch = useCallback(() => {\n void execute(lastVariablesRef.current)\n }, [execute])\n\n const invalidateQuery = useCallback(\n (data?: TResponse) => {\n const prefix = buildQueryPrefix({ callerKey, method, path })\n invalidate(prefix, data)\n },\n [callerKey, method, path, invalidate],\n )\n\n useEffect(() => {\n register(stableKey, refetch)\n return () => unregister(stableKey, refetch)\n }, [register, unregister, refetch, stableKey])\n\n useEffect(() => {\n if (optionsRef.current?.enabled === false) return\n if (optionsRef.current?.refetchOnMount === false) return\n void execute(lastVariablesRef.current)\n }, [stableKey, execute])\n\n useEffect(() => {\n const interval = optionsRef.current?.refetchInterval\n if (!interval) return\n\n const handler = setInterval(() => {\n if (\n optionsRef.current?.refetchIntervalInBackground === false &&\n typeof document !== 'undefined' &&\n document.hidden\n ) {\n return\n }\n void execute(lastVariablesRef.current)\n }, interval)\n\n return () => clearInterval(handler)\n }, [execute])\n\n useEffect(() => {\n if (optionsRef.current?.refetchOnWindowFocus === false) return\n if (typeof window === 'undefined') return\n\n const handler = () => {\n void execute(lastVariablesRef.current)\n }\n window.addEventListener('focus', handler)\n return () => window.removeEventListener('focus', handler)\n }, [execute])\n\n return {\n data: response.data,\n error: response.error,\n variables,\n isLoading: status === 'loading',\n isFetching,\n isSuccess: status === 'success',\n isError: status === 'error',\n status,\n refetch,\n invalidate: invalidateQuery,\n execute,\n }\n }\n}\n\nexport function createUseMutate<\n TResponse,\n TVariables extends {\n params?: Record<string, string | number | boolean>\n query?: IgniterCallerClientQuery\n body?: unknown\n },\n>(\n params: UseMutateParams<TResponse, TVariables>,\n): (\n options?: IgniterCallerUseMutateOptions<TResponse, TVariables>,\n) => IgniterCallerUseMutateResult<TResponse, TVariables> {\n const {\n callerKey,\n method,\n path,\n buildRequest,\n getMergedConfig,\n onError,\n } = params\n\n return (options) => {\n const [status, setStatus] = useState<'loading' | 'error' | 'success'>(\n 'success',\n )\n const [response, setResponse] = useState<{\n data: TResponse | null\n error: IgniterError | null\n }>({ data: null, error: null })\n const [variables, setVariables] = useState<TVariables | undefined>(\n undefined,\n )\n\n const optionsRef = useRef(options)\n optionsRef.current = options\n const lastVariablesRef = useRef<TVariables | undefined>(undefined)\n\n const mutate = useCallback(\n async (nextVariables?: TVariables) => {\n const mergedConfig = getMergedConfig()\n const mergedInput = mergeMutateInput(\n mergedConfig,\n optionsRef.current as IgniterCallerClientRequestInput | undefined,\n nextVariables as IgniterCallerClientRequestInput | undefined,\n )\n\n lastVariablesRef.current = nextVariables\n setVariables(nextVariables)\n\n setStatus('loading')\n optionsRef.current?.onLoading?.(true)\n mergedConfig.onMutationLoading?.(true)\n\n try {\n const result = await buildRequest(method, path, mergedInput).execute()\n optionsRef.current?.onRequest?.(result)\n if (result.error) {\n setResponse({ data: null, error: result.error })\n setStatus('error')\n optionsRef.current?.onError?.(result.error)\n mergedConfig.onMutationError?.(result.error)\n onError?.(result.error)\n } else {\n const data = (result.data ?? null) as TResponse | null\n setResponse({ data, error: null })\n setStatus('success')\n optionsRef.current?.onSuccess?.(data as TResponse)\n mergedConfig.onMutationSuccess?.(data)\n }\n\n optionsRef.current?.onSettled?.(\n result.data ?? null,\n result.error ?? null,\n )\n mergedConfig.onMutationSettled?.(\n result.data ?? null,\n result.error ?? null,\n )\n\n return result\n } catch (error) {\n const typedError = error as IgniterError\n setResponse({ data: null, error: typedError })\n setStatus('error')\n optionsRef.current?.onError?.(typedError)\n mergedConfig.onMutationError?.(typedError)\n onError?.(typedError)\n optionsRef.current?.onSettled?.(null, typedError)\n mergedConfig.onMutationSettled?.(null, typedError)\n } finally {\n optionsRef.current?.onLoading?.(false)\n mergedConfig.onMutationLoading?.(false)\n }\n },\n [method, path, buildRequest, getMergedConfig, onError],\n )\n\n const retry = useCallback(() => {\n void mutate(lastVariablesRef.current)\n }, [mutate])\n\n return {\n data: response.data,\n error: response.error,\n variables,\n isLoading: status === 'loading',\n isSuccess: status === 'success',\n isError: status === 'error',\n status,\n mutate,\n retry,\n }\n }\n}\n","import type { IgniterCallerManager } from '../../core/manager'\nimport type { IgniterCallerClientContextValue } from '../interfaces/context'\nimport type { IgniterCallerClientRequestInput } from './hooks.builder'\nimport {\n createUseMutate,\n createUseQuery,\n} from './hooks.builder'\nimport type {\n IgniterCallerClient,\n IgniterCallerClientConfigApi,\n} from '../interfaces/client'\nimport { buildQueryPrefix } from '../utils/query-key'\n\nfunction applyRequestInput(\n builder: { params: (params: Record<string, string | number | boolean>) => any; headers: (headers: Record<string, string>) => any; body: (body: unknown) => any },\n input: IgniterCallerClientRequestInput,\n) {\n if (input.query && Object.keys(input.query).length > 0) {\n builder.params(input.query)\n }\n\n if (input.headers && Object.keys(input.headers).length > 0) {\n builder.headers(input.headers)\n }\n\n if (input.body !== undefined) {\n builder.body(input.body)\n }\n}\n\nexport function createIgniterCallerClient<\n TCaller extends IgniterCallerManager<any>,\n TCallers extends Record<string, IgniterCallerManager<any>>,\n>(\n context: IgniterCallerClientContextValue<TCallers>,\n callerKey: keyof TCallers,\n): IgniterCallerClient<TCaller> {\n const caller = context.callers[callerKey] as unknown as TCaller\n\n const getMergedConfig = () => context.getMergedConfig(callerKey)\n\n const buildRequest = (\n method: string,\n path: string,\n input: IgniterCallerClientRequestInput,\n ) => {\n if (!path) {\n throw new Error(\n 'IgniterCallerClient: path is required when using hooks with Caller client.',\n )\n }\n\n const methodKey = method.toLowerCase() as\n | 'get'\n | 'post'\n | 'put'\n | 'patch'\n | 'delete'\n | 'head'\n\n const builder = (caller as any)[methodKey](path)\n applyRequestInput(builder, input)\n return builder as { execute: () => Promise<any> }\n }\n\n const invalidate = (pathOrPaths: string | string[], data?: unknown) => {\n const paths = Array.isArray(pathOrPaths) ? pathOrPaths : [pathOrPaths]\n const prefixes = paths.map((path) =>\n buildQueryPrefix({\n callerKey: String(callerKey),\n method: 'GET',\n path,\n }),\n )\n context.invalidate(prefixes, data)\n }\n\n const config: IgniterCallerClientConfigApi = {\n set: (key, value) => context.setConfig(callerKey, key, value),\n get: (key) => context.getConfig(callerKey, key),\n reset: () => context.setConfigBatch(callerKey, {}),\n }\n\n const get = (path?: string) => {\n const builder = caller.get(path as any)\n const useQuery = createUseQuery({\n callerKey: String(callerKey),\n method: 'GET',\n path: path || '',\n buildRequest,\n register: context.register,\n unregister: context.unregister,\n invalidate: context.invalidate,\n getMergedConfig,\n onError: context.onError,\n })\n ;(builder as any).useQuery = useQuery\n return builder as any\n }\n\n const head = (path?: string) => {\n const builder = caller.head(path as any)\n const useQuery = createUseQuery({\n callerKey: String(callerKey),\n method: 'HEAD',\n path: path || '',\n buildRequest,\n register: context.register,\n unregister: context.unregister,\n invalidate: context.invalidate,\n getMergedConfig,\n onError: context.onError,\n })\n ;(builder as any).useQuery = useQuery\n return builder as any\n }\n\n const post = (path?: string) => {\n const builder = caller.post(path as any)\n const useMutate = createUseMutate({\n callerKey: String(callerKey),\n method: 'POST',\n path: path || '',\n buildRequest,\n getMergedConfig,\n onError: context.onError,\n })\n ;(builder as any).useMutate = useMutate\n return builder as any\n }\n\n const put = (path?: string) => {\n const builder = caller.put(path as any)\n const useMutate = createUseMutate({\n callerKey: String(callerKey),\n method: 'PUT',\n path: path || '',\n buildRequest,\n getMergedConfig,\n onError: context.onError,\n })\n ;(builder as any).useMutate = useMutate\n return builder as any\n }\n\n const patch = (path?: string) => {\n const builder = caller.patch(path as any)\n const useMutate = createUseMutate({\n callerKey: String(callerKey),\n method: 'PATCH',\n path: path || '',\n buildRequest,\n getMergedConfig,\n onError: context.onError,\n })\n ;(builder as any).useMutate = useMutate\n return builder as any\n }\n\n const del = (path?: string) => {\n const builder = caller.delete(path as any)\n const useMutate = createUseMutate({\n callerKey: String(callerKey),\n method: 'DELETE',\n path: path || '',\n buildRequest,\n getMergedConfig,\n onError: context.onError,\n })\n ;(builder as any).useMutate = useMutate\n return builder as any\n }\n\n return {\n raw: caller,\n config,\n invalidate: invalidate as any,\n get: get as any,\n post: post as any,\n put: put as any,\n patch: patch as any,\n delete: del as any,\n head: head as any,\n }\n}\n","'use client'\n\nimport {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState,\n type PropsWithChildren,\n} from 'react'\nimport type { IgniterError } from '@igniter-js/common'\nimport type {\n IgniterCallerClientContextValue,\n IgniterCallerClientConfigs,\n IgniterCallerClientMap,\n IgniterCallerClientRefetchFn,\n} from '../interfaces/context'\nimport type {\n IgniterCallerClientConfig,\n IgniterCallerClientConfigKey,\n IgniterCallerClientConfigValue,\n} from '../interfaces/config'\nimport { IgniterCallerClientCache } from '../utils/cache'\nimport { createIgniterCallerClient } from './client.builder'\n\nconst IgniterCallerClientContext = createContext<\n IgniterCallerClientContextValue<any> | undefined\n>(undefined)\n\nexport interface IgniterCallerProviderProps<\n TCallers extends IgniterCallerClientMap,\n> extends PropsWithChildren {\n callers: TCallers\n configs?: IgniterCallerClientConfigs<TCallers>\n hooks?: IgniterCallerClientConfig\n onError?: (error: IgniterError) => void\n}\n\nfunction mergeConfig(\n globalConfig: IgniterCallerClientConfig,\n localConfig?: IgniterCallerClientConfig,\n): IgniterCallerClientConfig {\n return {\n ...globalConfig,\n ...localConfig,\n headers: {\n ...(globalConfig.headers || {}),\n ...(localConfig?.headers || {}),\n },\n cookies: {\n ...(globalConfig.cookies || {}),\n ...(localConfig?.cookies || {}),\n },\n query: {\n ...(globalConfig.query || {}),\n ...(localConfig?.query || {}),\n },\n }\n}\n\nexport function IgniterCallerProvider<\n TCallers extends IgniterCallerClientMap,\n>(props: IgniterCallerProviderProps<TCallers>) {\n const { callers, configs, hooks, onError, children } = props\n const [configState, setConfigState] = useState<\n IgniterCallerClientConfigs<TCallers>\n >(configs || {})\n const [listeners] = useState(\n () => new Map<string, Set<IgniterCallerClientRefetchFn>>(),\n )\n\n const globalConfig = useMemo<IgniterCallerClientConfig>(\n () => hooks || {},\n [hooks],\n )\n\n const register = useCallback(\n (key: string, refetch: IgniterCallerClientRefetchFn) => {\n const current = listeners.get(key) || new Set()\n current.add(refetch)\n listeners.set(key, current)\n },\n [listeners],\n )\n\n const unregister = useCallback(\n (key: string, refetch: IgniterCallerClientRefetchFn) => {\n const current = listeners.get(key)\n if (!current) return\n current.delete(refetch)\n if (current.size === 0) {\n listeners.delete(key)\n }\n },\n [listeners],\n )\n\n const invalidate = useCallback(\n (keys: string | string[], data?: unknown) => {\n const keysArray = Array.isArray(keys) ? keys : [keys]\n\n keysArray.forEach((prefix) => {\n if (data !== undefined) {\n IgniterCallerClientCache.replacePrefix(prefix, data)\n } else {\n IgniterCallerClientCache.clearPrefix(prefix)\n }\n\n listeners.forEach((refetchFns, registeredKey) => {\n if (registeredKey.startsWith(prefix)) {\n refetchFns.forEach((refetch) => refetch(true))\n }\n })\n })\n },\n [listeners],\n )\n\n const setConfig = useCallback(\n <TKey extends IgniterCallerClientConfigKey>(\n callerKey: keyof TCallers,\n key: TKey,\n value: IgniterCallerClientConfigValue<TKey>,\n ) => {\n setConfigState((prev) => ({\n ...prev,\n [callerKey]: {\n ...(prev[callerKey] || {}),\n [key]: value,\n },\n }))\n },\n [],\n )\n\n const setConfigBatch = useCallback(\n (callerKey: keyof TCallers, config: Partial<IgniterCallerClientConfig>) => {\n setConfigState((prev) => ({\n ...prev,\n [callerKey]: {\n ...(prev[callerKey] || {}),\n ...config,\n },\n }))\n },\n [],\n )\n\n const getMergedConfig = useCallback(\n (callerKey: keyof TCallers) =>\n mergeConfig(globalConfig, configState[callerKey]),\n [globalConfig, configState],\n )\n\n const getConfig = useCallback(\n <TKey extends IgniterCallerClientConfigKey>(\n callerKey: keyof TCallers,\n key: TKey,\n ) => getMergedConfig(callerKey)[key],\n [getMergedConfig],\n )\n\n const value = useMemo<IgniterCallerClientContextValue<TCallers>>(\n () => ({\n callers,\n configs: configState,\n globalConfig,\n setConfig,\n setConfigBatch,\n getConfig,\n getMergedConfig,\n register,\n unregister,\n invalidate,\n listeners,\n onError,\n }),\n [\n callers,\n configState,\n globalConfig,\n getConfig,\n getMergedConfig,\n invalidate,\n listeners,\n onError,\n register,\n setConfig,\n setConfigBatch,\n unregister,\n ],\n )\n\n return (\n <IgniterCallerClientContext.Provider value={value}>\n {children}\n </IgniterCallerClientContext.Provider>\n )\n}\n\nexport function useIgniterCallerContext<\n TCallers extends IgniterCallerClientMap,\n>() {\n const context = useContext(\n IgniterCallerClientContext,\n ) as IgniterCallerClientContextValue<TCallers> | undefined\n\n if (!context) {\n throw new Error(\n 'IgniterCallerProvider is missing. Wrap your app with <IgniterCallerProvider>.',\n )\n }\n\n return context\n}\n\nexport function useIgniterCaller<TCallers extends IgniterCallerClientMap>() {\n const context = useIgniterCallerContext<TCallers>()\n\n return <TKey extends keyof TCallers>(callerKey: TKey) =>\n createIgniterCallerClient(context, callerKey)\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/client/utils/cache.ts","../../src/client/utils/query-key.ts","../../src/client/utils/cookies.ts","../../src/client/builders/hooks.builder.tsx","../../src/client/builders/client.builder.ts","../../src/client/builders/provider.builder.tsx"],"names":["useState","useRef","useMemo","useCallback","useEffect","createContext","value","jsx","useContext"],"mappings":"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","file":"index.js","sourcesContent":["export class IgniterCallerClientCache {\n private static cache = new Map<\n string,\n { data: unknown; timestamp: number }\n >()\n\n static get<T>(key: string, staleTime?: number): T | undefined {\n const entry = IgniterCallerClientCache.cache.get(key)\n if (!entry) return undefined\n\n if (staleTime && Date.now() - entry.timestamp > staleTime) {\n IgniterCallerClientCache.cache.delete(key)\n return undefined\n }\n\n return entry.data as T\n }\n\n static set(key: string, data: unknown): void {\n IgniterCallerClientCache.cache.set(key, {\n data,\n timestamp: Date.now(),\n })\n }\n\n static replacePrefix(prefix: string, data: unknown): void {\n for (const [key, entry] of IgniterCallerClientCache.cache.entries()) {\n if (key.startsWith(prefix)) {\n IgniterCallerClientCache.cache.set(key, {\n data,\n timestamp: entry.timestamp,\n })\n }\n }\n }\n\n static clearPrefix(prefix: string): void {\n for (const key of IgniterCallerClientCache.cache.keys()) {\n if (key.startsWith(prefix)) {\n IgniterCallerClientCache.cache.delete(key)\n }\n }\n }\n}\n","import type { IgniterCallerClientQuery } from '../interfaces/config'\n\nconst EMPTY_KEY = '{}'\n\nfunction stableStringify(value: unknown): string {\n if (value === null || value === undefined) return EMPTY_KEY\n if (typeof value !== 'object') return JSON.stringify(value)\n if (Array.isArray(value)) {\n return `[${value.map((item) => stableStringify(item)).join(',')}]`\n }\n\n const entries = Object.entries(value as Record<string, unknown>).sort(\n ([a], [b]) => a.localeCompare(b),\n )\n\n return `{${entries\n .map(([key, val]) => `${JSON.stringify(key)}:${stableStringify(val)}`)\n .join(',')}}`\n}\n\nexport function buildQueryKey(params: {\n callerKey: string\n method: string\n path: string\n query?: IgniterCallerClientQuery\n params?: Record<string, string | number | boolean>\n}): string {\n const { callerKey, method, path, query, params: pathParams } = params\n const payload = {\n params: pathParams || {},\n query: query || {},\n }\n\n return `${callerKey}::${method.toUpperCase()}::${path}::${stableStringify(payload)}`\n}\n\nexport function buildQueryPrefix(params: {\n callerKey: string\n method: string\n path: string\n}): string {\n const { callerKey, method, path } = params\n return `${callerKey}::${method.toUpperCase()}::${path}`\n}\n","import type { IgniterCallerClientCookies } from '../interfaces/config'\n\nexport function buildCookieHeader(\n cookies?: IgniterCallerClientCookies,\n): string | undefined {\n if (!cookies || Object.keys(cookies).length === 0) return undefined\n\n return Object.entries(cookies)\n .map(([key, value]) => `${key}=${value}`)\n .join('; ')\n}\n","'use client'\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport type { IgniterError } from '@igniter-js/common'\nimport type { IgniterCallerApiResponse } from '../../types/response'\nimport type {\n IgniterCallerClientConfig,\n IgniterCallerClientQuery,\n} from '../interfaces/config'\nimport type { IgniterCallerClientRefetchFn } from '../interfaces/context'\nimport type {\n IgniterCallerUseMutateOptions,\n IgniterCallerUseMutateResult,\n IgniterCallerUseQueryOptions,\n IgniterCallerUseQueryResult,\n} from '../interfaces/hooks'\nimport { IgniterCallerClientCache } from '../utils/cache'\nimport { buildQueryKey, buildQueryPrefix } from '../utils/query-key'\nimport { buildCookieHeader } from '../utils/cookies'\n\nexport interface IgniterCallerClientRequestInput {\n params?: Record<string, string | number | boolean>\n query?: Record<string, string | number | boolean>\n headers?: Record<string, string>\n cookies?: Record<string, string>\n body?: unknown\n}\n\nexport type IgniterCallerClientRequestFactory<TResponse> = (\n method: string,\n path: string,\n input: IgniterCallerClientRequestInput,\n) => {\n execute: () => Promise<IgniterCallerApiResponse<TResponse>>\n}\n\ninterface UseQueryParams<TResponse, TVariables> {\n callerKey: string\n method: 'GET' | 'HEAD'\n path: string\n buildRequest: IgniterCallerClientRequestFactory<TResponse>\n register: (key: string, refetch: IgniterCallerClientRefetchFn) => void\n unregister: (key: string, refetch: IgniterCallerClientRefetchFn) => void\n invalidate: (keys: string | string[], data?: unknown) => void\n getMergedConfig: () => IgniterCallerClientConfig\n onError?: (error: IgniterError) => void\n}\n\ninterface UseMutateParams<TResponse, TVariables> {\n callerKey: string\n method: 'POST' | 'PUT' | 'PATCH' | 'DELETE'\n path: string\n buildRequest: IgniterCallerClientRequestFactory<TResponse>\n getMergedConfig: () => IgniterCallerClientConfig\n onError?: (error: IgniterError) => void\n}\n\nfunction mergeQueryInput(\n config: IgniterCallerClientConfig,\n options?: IgniterCallerClientRequestInput,\n variables?: IgniterCallerClientRequestInput,\n): IgniterCallerClientRequestInput {\n const headers = {\n ...(config.headers || {}),\n ...(options?.headers || {}),\n ...(variables?.headers || {}),\n }\n const cookies = {\n ...(config.cookies || {}),\n ...(options?.cookies || {}),\n ...(variables?.cookies || {}),\n }\n const query = {\n ...(config.query || {}),\n ...(options?.query || {}),\n ...(variables?.query || {}),\n ...(options?.params || {}),\n ...(variables?.params || {}),\n }\n\n const cookieHeader = buildCookieHeader(cookies)\n if (cookieHeader && !headers.Cookie) {\n headers.Cookie = cookieHeader\n }\n\n return {\n headers,\n cookies,\n query,\n params: variables?.params || options?.params,\n }\n}\n\nfunction mergeMutateInput(\n config: IgniterCallerClientConfig,\n options?: IgniterCallerClientRequestInput,\n variables?: IgniterCallerClientRequestInput,\n): IgniterCallerClientRequestInput {\n const merged = mergeQueryInput(config, options, variables)\n return {\n ...merged,\n body: variables?.body ?? options?.body,\n }\n}\n\nexport function createUseQuery<\n TResponse,\n TVariables extends {\n params?: Record<string, string | number | boolean>\n query?: IgniterCallerClientQuery\n },\n>(\n params: UseQueryParams<TResponse, TVariables>,\n): (\n options?: IgniterCallerUseQueryOptions<TResponse, TVariables>,\n) => IgniterCallerUseQueryResult<TResponse, TVariables> {\n const {\n callerKey,\n method,\n path,\n buildRequest,\n register,\n unregister,\n invalidate,\n getMergedConfig,\n onError,\n } = params\n\n return (options) => {\n const [status, setStatus] = useState<'loading' | 'error' | 'success'>(\n options?.initialData ? 'success' : 'loading',\n )\n const [isFetching, setIsFetching] = useState(false)\n const [response, setResponse] = useState<{\n data: TResponse | null\n error: IgniterError | null\n }>({\n data: options?.initialData ?? null,\n error: null,\n })\n const [variables, setVariables] = useState<TVariables | undefined>(\n undefined,\n )\n\n const optionsRef = useRef(options)\n optionsRef.current = options\n\n const lastVariablesRef = useRef<TVariables | undefined>(undefined)\n\n const stableKey = useMemo(() => {\n const mergedConfig = getMergedConfig()\n const mergedInput = mergeQueryInput(\n mergedConfig,\n options as IgniterCallerClientRequestInput | undefined,\n lastVariablesRef.current as IgniterCallerClientRequestInput | undefined,\n )\n\n return buildQueryKey({\n callerKey,\n method,\n path,\n query: mergedInput.query,\n params: mergedInput.params,\n })\n }, [\n callerKey,\n method,\n path,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n JSON.stringify(options?.params || {}),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n JSON.stringify(options?.query || {}),\n ])\n\n const execute = useCallback(\n async (nextVariables?: TVariables) => {\n if (optionsRef.current?.enabled === false) return\n\n const mergedConfig = getMergedConfig()\n const mergedInput = mergeQueryInput(\n mergedConfig,\n optionsRef.current as IgniterCallerClientRequestInput | undefined,\n nextVariables as IgniterCallerClientRequestInput | undefined,\n )\n\n const queryKey = buildQueryKey({\n callerKey,\n method,\n path,\n query: mergedInput.query,\n params: mergedInput.params,\n })\n\n lastVariablesRef.current = nextVariables\n setVariables(nextVariables)\n\n setIsFetching(true)\n setStatus('loading')\n optionsRef.current?.onLoading?.(true)\n mergedConfig.onQueryLoading?.(true)\n\n if (optionsRef.current?.staleTime) {\n const cached = IgniterCallerClientCache.get<TResponse>(\n queryKey,\n optionsRef.current.staleTime,\n )\n if (cached !== undefined) {\n setResponse({ data: cached, error: null })\n setStatus('success')\n optionsRef.current?.onSuccess?.(cached)\n mergedConfig.onQuerySuccess?.(cached)\n optionsRef.current?.onLoading?.(false)\n mergedConfig.onQueryLoading?.(false)\n setIsFetching(false)\n return {\n data: cached,\n error: undefined,\n }\n }\n }\n\n try {\n const result = await buildRequest(method, path, mergedInput).execute()\n optionsRef.current?.onRequest?.(result)\n if (result.error) {\n setResponse({ data: null, error: result.error })\n setStatus('error')\n optionsRef.current?.onError?.(result.error)\n mergedConfig.onQueryError?.(result.error)\n onError?.(result.error)\n } else {\n const data = (result.data ?? null) as TResponse | null\n setResponse({ data, error: null })\n setStatus('success')\n optionsRef.current?.onSuccess?.(data as TResponse)\n mergedConfig.onQuerySuccess?.(data)\n\n if (optionsRef.current?.staleTime && data !== null) {\n IgniterCallerClientCache.set(queryKey, data)\n }\n }\n\n optionsRef.current?.onSettled?.(\n result.data ?? null,\n result.error ?? null,\n )\n mergedConfig.onQuerySettled?.(\n result.data ?? null,\n result.error ?? null,\n )\n\n return result\n } catch (error) {\n const typedError = error as IgniterError\n setResponse({ data: null, error: typedError })\n setStatus('error')\n optionsRef.current?.onError?.(typedError)\n mergedConfig.onQueryError?.(typedError)\n onError?.(typedError)\n optionsRef.current?.onSettled?.(null, typedError)\n mergedConfig.onQuerySettled?.(null, typedError)\n } finally {\n setIsFetching(false)\n optionsRef.current?.onLoading?.(false)\n mergedConfig.onQueryLoading?.(false)\n }\n },\n [callerKey, method, path, buildRequest, getMergedConfig, onError],\n )\n\n const refetch = useCallback(() => {\n void execute(lastVariablesRef.current)\n }, [execute])\n\n const invalidateQuery = useCallback(\n (data?: TResponse) => {\n const prefix = buildQueryPrefix({ callerKey, method, path })\n invalidate(prefix, data)\n },\n [callerKey, method, path, invalidate],\n )\n\n useEffect(() => {\n register(stableKey, refetch)\n return () => unregister(stableKey, refetch)\n }, [register, unregister, refetch, stableKey])\n\n const initialFetchDoneRef = useRef(false)\n\n useEffect(() => {\n if (optionsRef.current?.enabled === false) return\n if (optionsRef.current?.refetchOnMount === false && initialFetchDoneRef.current) return\n\n initialFetchDoneRef.current = true\n void execute(lastVariablesRef.current)\n }, [stableKey, execute])\n\n useEffect(() => {\n const interval = optionsRef.current?.refetchInterval\n if (!interval) return\n\n const handler = setInterval(() => {\n if (\n optionsRef.current?.refetchIntervalInBackground === false &&\n typeof document !== 'undefined' &&\n document.hidden\n ) {\n return\n }\n void execute(lastVariablesRef.current)\n }, interval)\n\n return () => clearInterval(handler)\n }, [execute])\n\n useEffect(() => {\n if (optionsRef.current?.refetchOnWindowFocus === false) return\n if (typeof window === 'undefined') return\n\n const handler = () => {\n void execute(lastVariablesRef.current)\n }\n window.addEventListener('focus', handler)\n return () => window.removeEventListener('focus', handler)\n }, [execute])\n\n return {\n data: response.data,\n error: response.error,\n variables,\n isLoading: status === 'loading',\n isFetching,\n isSuccess: status === 'success',\n isError: status === 'error',\n status,\n refetch,\n invalidate: invalidateQuery,\n execute,\n }\n }\n}\n\nexport function createUseMutate<\n TResponse,\n TVariables extends {\n params?: Record<string, string | number | boolean>\n query?: IgniterCallerClientQuery\n body?: unknown\n },\n>(\n params: UseMutateParams<TResponse, TVariables>,\n): (\n options?: IgniterCallerUseMutateOptions<TResponse, TVariables>,\n) => IgniterCallerUseMutateResult<TResponse, TVariables> {\n const {\n callerKey,\n method,\n path,\n buildRequest,\n getMergedConfig,\n onError,\n } = params\n\n return (options) => {\n const [status, setStatus] = useState<'loading' | 'error' | 'success'>(\n 'success',\n )\n const [response, setResponse] = useState<{\n data: TResponse | null\n error: IgniterError | null\n }>({ data: null, error: null })\n const [variables, setVariables] = useState<TVariables | undefined>(\n undefined,\n )\n\n const optionsRef = useRef(options)\n optionsRef.current = options\n const lastVariablesRef = useRef<TVariables | undefined>(undefined)\n\n const mutate = useCallback(\n async (nextVariables?: TVariables) => {\n const mergedConfig = getMergedConfig()\n const mergedInput = mergeMutateInput(\n mergedConfig,\n optionsRef.current as IgniterCallerClientRequestInput | undefined,\n nextVariables as IgniterCallerClientRequestInput | undefined,\n )\n\n lastVariablesRef.current = nextVariables\n setVariables(nextVariables)\n\n setStatus('loading')\n optionsRef.current?.onLoading?.(true)\n mergedConfig.onMutationLoading?.(true)\n\n try {\n const result = await buildRequest(method, path, mergedInput).execute()\n optionsRef.current?.onRequest?.(result)\n if (result.error) {\n setResponse({ data: null, error: result.error })\n setStatus('error')\n optionsRef.current?.onError?.(result.error)\n mergedConfig.onMutationError?.(result.error)\n onError?.(result.error)\n } else {\n const data = (result.data ?? null) as TResponse | null\n setResponse({ data, error: null })\n setStatus('success')\n optionsRef.current?.onSuccess?.(data as TResponse)\n mergedConfig.onMutationSuccess?.(data)\n }\n\n optionsRef.current?.onSettled?.(\n result.data ?? null,\n result.error ?? null,\n )\n mergedConfig.onMutationSettled?.(\n result.data ?? null,\n result.error ?? null,\n )\n\n return result\n } catch (error) {\n const typedError = error as IgniterError\n setResponse({ data: null, error: typedError })\n setStatus('error')\n optionsRef.current?.onError?.(typedError)\n mergedConfig.onMutationError?.(typedError)\n onError?.(typedError)\n optionsRef.current?.onSettled?.(null, typedError)\n mergedConfig.onMutationSettled?.(null, typedError)\n } finally {\n optionsRef.current?.onLoading?.(false)\n mergedConfig.onMutationLoading?.(false)\n }\n },\n [method, path, buildRequest, getMergedConfig, onError],\n )\n\n const retry = useCallback(() => {\n void mutate(lastVariablesRef.current)\n }, [mutate])\n\n return {\n data: response.data,\n error: response.error,\n variables,\n isLoading: status === 'loading',\n isSuccess: status === 'success',\n isError: status === 'error',\n status,\n mutate,\n retry,\n }\n }\n}\n","import type { IgniterCallerManager } from '../../core/manager'\nimport type { IgniterCallerClientContextValue } from '../interfaces/context'\nimport type { IgniterCallerClientRequestInput } from './hooks.builder'\nimport {\n createUseMutate,\n createUseQuery,\n} from './hooks.builder'\nimport type {\n IgniterCallerClient,\n IgniterCallerClientConfigApi,\n} from '../interfaces/client'\nimport { buildQueryPrefix } from '../utils/query-key'\n\nfunction applyRequestInput(\n builder: { params: (params: Record<string, string | number | boolean>) => any; headers: (headers: Record<string, string>) => any; body: (body: unknown) => any },\n input: IgniterCallerClientRequestInput,\n) {\n if (input.query && Object.keys(input.query).length > 0) {\n builder.params(input.query)\n }\n\n if (input.headers && Object.keys(input.headers).length > 0) {\n builder.headers(input.headers)\n }\n\n if (input.body !== undefined) {\n builder.body(input.body)\n }\n}\n\nexport function createIgniterCallerClient<\n TCaller extends IgniterCallerManager<any>,\n TCallers extends Record<string, IgniterCallerManager<any>>,\n>(\n context: IgniterCallerClientContextValue<TCallers>,\n callerKey: keyof TCallers,\n): IgniterCallerClient<TCaller> {\n const caller = context.callers[callerKey] as unknown as TCaller\n\n const getMergedConfig = () => context.getMergedConfig(callerKey)\n\n const buildRequest = (\n method: string,\n path: string,\n input: IgniterCallerClientRequestInput,\n ) => {\n if (!path) {\n throw new Error(\n 'IgniterCallerClient: path is required when using hooks with Caller client.',\n )\n }\n\n const methodKey = method.toLowerCase() as\n | 'get'\n | 'post'\n | 'put'\n | 'patch'\n | 'delete'\n | 'head'\n\n const builder = (caller as any)[methodKey](path)\n applyRequestInput(builder, input)\n return builder as { execute: () => Promise<any> }\n }\n\n const invalidate = (pathOrPaths: string | string[], data?: unknown) => {\n const paths = Array.isArray(pathOrPaths) ? pathOrPaths : [pathOrPaths]\n const prefixes = paths.map((path) =>\n buildQueryPrefix({\n callerKey: String(callerKey),\n method: 'GET',\n path,\n }),\n )\n context.invalidate(prefixes, data)\n }\n\n const config: IgniterCallerClientConfigApi = {\n set: (key, value) => context.setConfig(callerKey, key, value),\n get: (key) => context.getConfig(callerKey, key),\n reset: () => context.setConfigBatch(callerKey, {}),\n }\n\n const get = (path?: string) => {\n const builder = caller.get(path as any)\n const useQuery = createUseQuery({\n callerKey: String(callerKey),\n method: 'GET',\n path: path || '',\n buildRequest,\n register: context.register,\n unregister: context.unregister,\n invalidate: context.invalidate,\n getMergedConfig,\n onError: context.onError,\n })\n ;(builder as any).useQuery = useQuery\n return builder as any\n }\n\n const head = (path?: string) => {\n const builder = caller.head(path as any)\n const useQuery = createUseQuery({\n callerKey: String(callerKey),\n method: 'HEAD',\n path: path || '',\n buildRequest,\n register: context.register,\n unregister: context.unregister,\n invalidate: context.invalidate,\n getMergedConfig,\n onError: context.onError,\n })\n ;(builder as any).useQuery = useQuery\n return builder as any\n }\n\n const post = (path?: string) => {\n const builder = caller.post(path as any)\n const useMutate = createUseMutate({\n callerKey: String(callerKey),\n method: 'POST',\n path: path || '',\n buildRequest,\n getMergedConfig,\n onError: context.onError,\n })\n ;(builder as any).useMutate = useMutate\n return builder as any\n }\n\n const put = (path?: string) => {\n const builder = caller.put(path as any)\n const useMutate = createUseMutate({\n callerKey: String(callerKey),\n method: 'PUT',\n path: path || '',\n buildRequest,\n getMergedConfig,\n onError: context.onError,\n })\n ;(builder as any).useMutate = useMutate\n return builder as any\n }\n\n const patch = (path?: string) => {\n const builder = caller.patch(path as any)\n const useMutate = createUseMutate({\n callerKey: String(callerKey),\n method: 'PATCH',\n path: path || '',\n buildRequest,\n getMergedConfig,\n onError: context.onError,\n })\n ;(builder as any).useMutate = useMutate\n return builder as any\n }\n\n const del = (path?: string) => {\n const builder = caller.delete(path as any)\n const useMutate = createUseMutate({\n callerKey: String(callerKey),\n method: 'DELETE',\n path: path || '',\n buildRequest,\n getMergedConfig,\n onError: context.onError,\n })\n ;(builder as any).useMutate = useMutate\n return builder as any\n }\n\n return {\n raw: caller,\n config,\n invalidate: invalidate as any,\n get: get as any,\n post: post as any,\n put: put as any,\n patch: patch as any,\n delete: del as any,\n head: head as any,\n }\n}\n","'use client'\n\nimport {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState,\n type PropsWithChildren,\n} from 'react'\nimport type { IgniterError } from '@igniter-js/common'\nimport type {\n IgniterCallerClientContextValue,\n IgniterCallerClientConfigs,\n IgniterCallerClientMap,\n IgniterCallerClientRefetchFn,\n} from '../interfaces/context'\nimport type {\n IgniterCallerClientConfig,\n IgniterCallerClientConfigKey,\n IgniterCallerClientConfigValue,\n} from '../interfaces/config'\nimport { IgniterCallerClientCache } from '../utils/cache'\nimport { createIgniterCallerClient } from './client.builder'\nimport type { IgniterCallerClient } from '../interfaces/client'\n\nconst IgniterCallerClientContext = createContext<\n IgniterCallerClientContextValue<any> | undefined\n>(undefined)\n\nexport interface IgniterCallerProviderProps<\n TCallers extends IgniterCallerClientMap,\n> extends PropsWithChildren {\n callers: TCallers\n configs?: IgniterCallerClientConfigs<TCallers>\n hooks?: IgniterCallerClientConfig\n onError?: (error: IgniterError) => void\n}\n\nfunction mergeConfig(\n globalConfig: IgniterCallerClientConfig,\n localConfig?: IgniterCallerClientConfig,\n): IgniterCallerClientConfig {\n return {\n ...globalConfig,\n ...localConfig,\n headers: {\n ...(globalConfig.headers || {}),\n ...(localConfig?.headers || {}),\n },\n cookies: {\n ...(globalConfig.cookies || {}),\n ...(localConfig?.cookies || {}),\n },\n query: {\n ...(globalConfig.query || {}),\n ...(localConfig?.query || {}),\n },\n }\n}\n\nexport function IgniterCallerProvider<\n TCallers extends IgniterCallerClientMap,\n>(props: IgniterCallerProviderProps<TCallers>) {\n const { callers, configs, hooks, onError, children } = props\n const [configState, setConfigState] = useState<\n IgniterCallerClientConfigs<TCallers>\n >(configs || {})\n const [listeners] = useState(\n () => new Map<string, Set<IgniterCallerClientRefetchFn>>(),\n )\n\n const globalConfig = useMemo<IgniterCallerClientConfig>(\n () => hooks || {},\n [hooks],\n )\n\n const register = useCallback(\n (key: string, refetch: IgniterCallerClientRefetchFn) => {\n const current = listeners.get(key) || new Set()\n current.add(refetch)\n listeners.set(key, current)\n },\n [listeners],\n )\n\n const unregister = useCallback(\n (key: string, refetch: IgniterCallerClientRefetchFn) => {\n const current = listeners.get(key)\n if (!current) return\n current.delete(refetch)\n if (current.size === 0) {\n listeners.delete(key)\n }\n },\n [listeners],\n )\n\n const invalidate = useCallback(\n (keys: string | string[], data?: unknown) => {\n const keysArray = Array.isArray(keys) ? keys : [keys]\n\n keysArray.forEach((prefix) => {\n if (data !== undefined) {\n IgniterCallerClientCache.replacePrefix(prefix, data)\n } else {\n IgniterCallerClientCache.clearPrefix(prefix)\n }\n\n listeners.forEach((refetchFns, registeredKey) => {\n if (registeredKey.startsWith(prefix)) {\n refetchFns.forEach((refetch) => refetch(true))\n }\n })\n })\n },\n [listeners],\n )\n\n const setConfig = useCallback(\n <TKey extends IgniterCallerClientConfigKey>(\n callerKey: keyof TCallers,\n key: TKey,\n value: IgniterCallerClientConfigValue<TKey>,\n ) => {\n setConfigState((prev) => ({\n ...prev,\n [callerKey]: {\n ...(prev[callerKey] || {}),\n [key]: value,\n },\n }))\n },\n [],\n )\n\n const setConfigBatch = useCallback(\n (callerKey: keyof TCallers, config: Partial<IgniterCallerClientConfig>) => {\n setConfigState((prev) => ({\n ...prev,\n [callerKey]: {\n ...(prev[callerKey] || {}),\n ...config,\n },\n }))\n },\n [],\n )\n\n const configStateRef = useMemo(() => ({ current: configState }), [])\n configStateRef.current = configState\n\n const globalConfigRef = useMemo(() => ({ current: globalConfig }), [])\n globalConfigRef.current = globalConfig\n\n const getMergedConfig = useCallback(\n (callerKey: keyof TCallers) =>\n mergeConfig(globalConfigRef.current, configStateRef.current[callerKey]),\n [globalConfigRef, configStateRef],\n )\n\n const getConfig = useCallback(\n <TKey extends IgniterCallerClientConfigKey>(\n callerKey: keyof TCallers,\n key: TKey,\n ) => getMergedConfig(callerKey)[key],\n [getMergedConfig],\n )\n\n const value = useMemo<IgniterCallerClientContextValue<TCallers>>(\n () => ({\n callers,\n configs: configState,\n globalConfig,\n setConfig,\n setConfigBatch,\n getConfig,\n getMergedConfig,\n register,\n unregister,\n invalidate,\n listeners,\n onError,\n }),\n [\n callers,\n getConfig,\n getMergedConfig,\n invalidate,\n listeners,\n onError,\n register,\n setConfig,\n setConfigBatch,\n unregister,\n ],\n )\n\n return (\n <IgniterCallerClientContext.Provider value={value}>\n {children}\n </IgniterCallerClientContext.Provider>\n )\n}\n\nexport function useIgniterCallerContext<\n TCallers extends IgniterCallerClientMap,\n>() {\n const context = useContext(\n IgniterCallerClientContext,\n ) as IgniterCallerClientContextValue<TCallers> | undefined\n\n if (!context) {\n throw new Error(\n 'IgniterCallerProvider is missing. Wrap your app with <IgniterCallerProvider>.',\n )\n }\n\n return context\n}\n\nexport function useIgniterCaller<TCallers extends IgniterCallerClientMap>() {\n const context = useIgniterCallerContext<TCallers>()\n\n return <TKey extends keyof TCallers>(\n callerKey: TKey,\n ): IgniterCallerClient<TCallers[TKey]> =>\n createIgniterCallerClient<TCallers[TKey], TCallers>(context, callerKey)\n}\n"]}
|
package/dist/client/index.mjs
CHANGED
|
@@ -155,8 +155,9 @@ function createUseQuery(params) {
|
|
|
155
155
|
callerKey,
|
|
156
156
|
method,
|
|
157
157
|
path,
|
|
158
|
-
|
|
158
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
159
159
|
JSON.stringify(options?.params || {}),
|
|
160
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
160
161
|
JSON.stringify(options?.query || {})
|
|
161
162
|
]);
|
|
162
163
|
const execute = useCallback(
|
|
@@ -259,9 +260,11 @@ function createUseQuery(params) {
|
|
|
259
260
|
register(stableKey, refetch);
|
|
260
261
|
return () => unregister(stableKey, refetch);
|
|
261
262
|
}, [register, unregister, refetch, stableKey]);
|
|
263
|
+
const initialFetchDoneRef = useRef(false);
|
|
262
264
|
useEffect(() => {
|
|
263
265
|
if (optionsRef.current?.enabled === false) return;
|
|
264
|
-
if (optionsRef.current?.refetchOnMount === false) return;
|
|
266
|
+
if (optionsRef.current?.refetchOnMount === false && initialFetchDoneRef.current) return;
|
|
267
|
+
initialFetchDoneRef.current = true;
|
|
265
268
|
void execute(lastVariablesRef.current);
|
|
266
269
|
}, [stableKey, execute]);
|
|
267
270
|
useEffect(() => {
|
|
@@ -618,9 +621,13 @@ function IgniterCallerProvider(props) {
|
|
|
618
621
|
},
|
|
619
622
|
[]
|
|
620
623
|
);
|
|
624
|
+
const configStateRef = useMemo(() => ({ current: configState }), []);
|
|
625
|
+
configStateRef.current = configState;
|
|
626
|
+
const globalConfigRef = useMemo(() => ({ current: globalConfig }), []);
|
|
627
|
+
globalConfigRef.current = globalConfig;
|
|
621
628
|
const getMergedConfig = useCallback(
|
|
622
|
-
(callerKey) => mergeConfig(
|
|
623
|
-
[
|
|
629
|
+
(callerKey) => mergeConfig(globalConfigRef.current, configStateRef.current[callerKey]),
|
|
630
|
+
[globalConfigRef, configStateRef]
|
|
624
631
|
);
|
|
625
632
|
const getConfig = useCallback(
|
|
626
633
|
(callerKey, key) => getMergedConfig(callerKey)[key],
|
|
@@ -643,8 +650,6 @@ function IgniterCallerProvider(props) {
|
|
|
643
650
|
}),
|
|
644
651
|
[
|
|
645
652
|
callers,
|
|
646
|
-
configState,
|
|
647
|
-
globalConfig,
|
|
648
653
|
getConfig,
|
|
649
654
|
getMergedConfig,
|
|
650
655
|
invalidate,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/client/utils/cache.ts","../../src/client/utils/query-key.ts","../../src/client/utils/cookies.ts","../../src/client/builders/hooks.builder.tsx","../../src/client/builders/client.builder.ts","../../src/client/builders/provider.builder.tsx"],"names":["useState","useMemo","useCallback","value"],"mappings":"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","file":"index.mjs","sourcesContent":["export class IgniterCallerClientCache {\n private static cache = new Map<\n string,\n { data: unknown; timestamp: number }\n >()\n\n static get<T>(key: string, staleTime?: number): T | undefined {\n const entry = IgniterCallerClientCache.cache.get(key)\n if (!entry) return undefined\n\n if (staleTime && Date.now() - entry.timestamp > staleTime) {\n IgniterCallerClientCache.cache.delete(key)\n return undefined\n }\n\n return entry.data as T\n }\n\n static set(key: string, data: unknown): void {\n IgniterCallerClientCache.cache.set(key, {\n data,\n timestamp: Date.now(),\n })\n }\n\n static replacePrefix(prefix: string, data: unknown): void {\n for (const [key, entry] of IgniterCallerClientCache.cache.entries()) {\n if (key.startsWith(prefix)) {\n IgniterCallerClientCache.cache.set(key, {\n data,\n timestamp: entry.timestamp,\n })\n }\n }\n }\n\n static clearPrefix(prefix: string): void {\n for (const key of IgniterCallerClientCache.cache.keys()) {\n if (key.startsWith(prefix)) {\n IgniterCallerClientCache.cache.delete(key)\n }\n }\n }\n}\n","import type { IgniterCallerClientQuery } from '../interfaces/config'\n\nconst EMPTY_KEY = '{}'\n\nfunction stableStringify(value: unknown): string {\n if (value === null || value === undefined) return EMPTY_KEY\n if (typeof value !== 'object') return JSON.stringify(value)\n if (Array.isArray(value)) {\n return `[${value.map((item) => stableStringify(item)).join(',')}]`\n }\n\n const entries = Object.entries(value as Record<string, unknown>).sort(\n ([a], [b]) => a.localeCompare(b),\n )\n\n return `{${entries\n .map(([key, val]) => `${JSON.stringify(key)}:${stableStringify(val)}`)\n .join(',')}}`\n}\n\nexport function buildQueryKey(params: {\n callerKey: string\n method: string\n path: string\n query?: IgniterCallerClientQuery\n params?: Record<string, string | number | boolean>\n}): string {\n const { callerKey, method, path, query, params: pathParams } = params\n const payload = {\n params: pathParams || {},\n query: query || {},\n }\n\n return `${callerKey}::${method.toUpperCase()}::${path}::${stableStringify(payload)}`\n}\n\nexport function buildQueryPrefix(params: {\n callerKey: string\n method: string\n path: string\n}): string {\n const { callerKey, method, path } = params\n return `${callerKey}::${method.toUpperCase()}::${path}`\n}\n","import type { IgniterCallerClientCookies } from '../interfaces/config'\n\nexport function buildCookieHeader(\n cookies?: IgniterCallerClientCookies,\n): string | undefined {\n if (!cookies || Object.keys(cookies).length === 0) return undefined\n\n return Object.entries(cookies)\n .map(([key, value]) => `${key}=${value}`)\n .join('; ')\n}\n","'use client'\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport type { IgniterError } from '@igniter-js/common'\nimport type { IgniterCallerApiResponse } from '../../types/response'\nimport type {\n IgniterCallerClientConfig,\n IgniterCallerClientQuery,\n} from '../interfaces/config'\nimport type { IgniterCallerClientRefetchFn } from '../interfaces/context'\nimport type {\n IgniterCallerUseMutateOptions,\n IgniterCallerUseMutateResult,\n IgniterCallerUseQueryOptions,\n IgniterCallerUseQueryResult,\n} from '../interfaces/hooks'\nimport { IgniterCallerClientCache } from '../utils/cache'\nimport { buildQueryKey, buildQueryPrefix } from '../utils/query-key'\nimport { buildCookieHeader } from '../utils/cookies'\n\nexport interface IgniterCallerClientRequestInput {\n params?: Record<string, string | number | boolean>\n query?: Record<string, string | number | boolean>\n headers?: Record<string, string>\n cookies?: Record<string, string>\n body?: unknown\n}\n\nexport type IgniterCallerClientRequestFactory<TResponse> = (\n method: string,\n path: string,\n input: IgniterCallerClientRequestInput,\n) => {\n execute: () => Promise<IgniterCallerApiResponse<TResponse>>\n}\n\ninterface UseQueryParams<TResponse, TVariables> {\n callerKey: string\n method: 'GET' | 'HEAD'\n path: string\n buildRequest: IgniterCallerClientRequestFactory<TResponse>\n register: (key: string, refetch: IgniterCallerClientRefetchFn) => void\n unregister: (key: string, refetch: IgniterCallerClientRefetchFn) => void\n invalidate: (keys: string | string[], data?: unknown) => void\n getMergedConfig: () => IgniterCallerClientConfig\n onError?: (error: IgniterError) => void\n}\n\ninterface UseMutateParams<TResponse, TVariables> {\n callerKey: string\n method: 'POST' | 'PUT' | 'PATCH' | 'DELETE'\n path: string\n buildRequest: IgniterCallerClientRequestFactory<TResponse>\n getMergedConfig: () => IgniterCallerClientConfig\n onError?: (error: IgniterError) => void\n}\n\nfunction mergeQueryInput(\n config: IgniterCallerClientConfig,\n options?: IgniterCallerClientRequestInput,\n variables?: IgniterCallerClientRequestInput,\n): IgniterCallerClientRequestInput {\n const headers = {\n ...(config.headers || {}),\n ...(options?.headers || {}),\n ...(variables?.headers || {}),\n }\n const cookies = {\n ...(config.cookies || {}),\n ...(options?.cookies || {}),\n ...(variables?.cookies || {}),\n }\n const query = {\n ...(config.query || {}),\n ...(options?.query || {}),\n ...(variables?.query || {}),\n ...(options?.params || {}),\n ...(variables?.params || {}),\n }\n\n const cookieHeader = buildCookieHeader(cookies)\n if (cookieHeader && !headers.Cookie) {\n headers.Cookie = cookieHeader\n }\n\n return {\n headers,\n cookies,\n query,\n params: variables?.params || options?.params,\n }\n}\n\nfunction mergeMutateInput(\n config: IgniterCallerClientConfig,\n options?: IgniterCallerClientRequestInput,\n variables?: IgniterCallerClientRequestInput,\n): IgniterCallerClientRequestInput {\n const merged = mergeQueryInput(config, options, variables)\n return {\n ...merged,\n body: variables?.body ?? options?.body,\n }\n}\n\nexport function createUseQuery<\n TResponse,\n TVariables extends {\n params?: Record<string, string | number | boolean>\n query?: IgniterCallerClientQuery\n },\n>(\n params: UseQueryParams<TResponse, TVariables>,\n): (\n options?: IgniterCallerUseQueryOptions<TResponse, TVariables>,\n) => IgniterCallerUseQueryResult<TResponse, TVariables> {\n const {\n callerKey,\n method,\n path,\n buildRequest,\n register,\n unregister,\n invalidate,\n getMergedConfig,\n onError,\n } = params\n\n return (options) => {\n const [status, setStatus] = useState<'loading' | 'error' | 'success'>(\n options?.initialData ? 'success' : 'loading',\n )\n const [isFetching, setIsFetching] = useState(false)\n const [response, setResponse] = useState<{\n data: TResponse | null\n error: IgniterError | null\n }>({\n data: options?.initialData ?? null,\n error: null,\n })\n const [variables, setVariables] = useState<TVariables | undefined>(\n undefined,\n )\n\n const optionsRef = useRef(options)\n optionsRef.current = options\n\n const lastVariablesRef = useRef<TVariables | undefined>(undefined)\n\n const stableKey = useMemo(() => {\n const mergedConfig = getMergedConfig()\n const mergedInput = mergeQueryInput(\n mergedConfig,\n options as IgniterCallerClientRequestInput | undefined,\n lastVariablesRef.current as IgniterCallerClientRequestInput | undefined,\n )\n\n return buildQueryKey({\n callerKey,\n method,\n path,\n query: mergedInput.query,\n params: mergedInput.params,\n })\n }, [\n callerKey,\n method,\n path,\n getMergedConfig,\n JSON.stringify(options?.params || {}),\n JSON.stringify(options?.query || {}),\n ])\n\n const execute = useCallback(\n async (nextVariables?: TVariables) => {\n if (optionsRef.current?.enabled === false) return\n\n const mergedConfig = getMergedConfig()\n const mergedInput = mergeQueryInput(\n mergedConfig,\n optionsRef.current as IgniterCallerClientRequestInput | undefined,\n nextVariables as IgniterCallerClientRequestInput | undefined,\n )\n\n const queryKey = buildQueryKey({\n callerKey,\n method,\n path,\n query: mergedInput.query,\n params: mergedInput.params,\n })\n\n lastVariablesRef.current = nextVariables\n setVariables(nextVariables)\n\n setIsFetching(true)\n setStatus('loading')\n optionsRef.current?.onLoading?.(true)\n mergedConfig.onQueryLoading?.(true)\n\n if (optionsRef.current?.staleTime) {\n const cached = IgniterCallerClientCache.get<TResponse>(\n queryKey,\n optionsRef.current.staleTime,\n )\n if (cached !== undefined) {\n setResponse({ data: cached, error: null })\n setStatus('success')\n optionsRef.current?.onSuccess?.(cached)\n mergedConfig.onQuerySuccess?.(cached)\n optionsRef.current?.onLoading?.(false)\n mergedConfig.onQueryLoading?.(false)\n setIsFetching(false)\n return {\n data: cached,\n error: undefined,\n }\n }\n }\n\n try {\n const result = await buildRequest(method, path, mergedInput).execute()\n optionsRef.current?.onRequest?.(result)\n if (result.error) {\n setResponse({ data: null, error: result.error })\n setStatus('error')\n optionsRef.current?.onError?.(result.error)\n mergedConfig.onQueryError?.(result.error)\n onError?.(result.error)\n } else {\n const data = (result.data ?? null) as TResponse | null\n setResponse({ data, error: null })\n setStatus('success')\n optionsRef.current?.onSuccess?.(data as TResponse)\n mergedConfig.onQuerySuccess?.(data)\n\n if (optionsRef.current?.staleTime && data !== null) {\n IgniterCallerClientCache.set(queryKey, data)\n }\n }\n\n optionsRef.current?.onSettled?.(\n result.data ?? null,\n result.error ?? null,\n )\n mergedConfig.onQuerySettled?.(\n result.data ?? null,\n result.error ?? null,\n )\n\n return result\n } catch (error) {\n const typedError = error as IgniterError\n setResponse({ data: null, error: typedError })\n setStatus('error')\n optionsRef.current?.onError?.(typedError)\n mergedConfig.onQueryError?.(typedError)\n onError?.(typedError)\n optionsRef.current?.onSettled?.(null, typedError)\n mergedConfig.onQuerySettled?.(null, typedError)\n } finally {\n setIsFetching(false)\n optionsRef.current?.onLoading?.(false)\n mergedConfig.onQueryLoading?.(false)\n }\n },\n [callerKey, method, path, buildRequest, getMergedConfig, onError],\n )\n\n const refetch = useCallback(() => {\n void execute(lastVariablesRef.current)\n }, [execute])\n\n const invalidateQuery = useCallback(\n (data?: TResponse) => {\n const prefix = buildQueryPrefix({ callerKey, method, path })\n invalidate(prefix, data)\n },\n [callerKey, method, path, invalidate],\n )\n\n useEffect(() => {\n register(stableKey, refetch)\n return () => unregister(stableKey, refetch)\n }, [register, unregister, refetch, stableKey])\n\n useEffect(() => {\n if (optionsRef.current?.enabled === false) return\n if (optionsRef.current?.refetchOnMount === false) return\n void execute(lastVariablesRef.current)\n }, [stableKey, execute])\n\n useEffect(() => {\n const interval = optionsRef.current?.refetchInterval\n if (!interval) return\n\n const handler = setInterval(() => {\n if (\n optionsRef.current?.refetchIntervalInBackground === false &&\n typeof document !== 'undefined' &&\n document.hidden\n ) {\n return\n }\n void execute(lastVariablesRef.current)\n }, interval)\n\n return () => clearInterval(handler)\n }, [execute])\n\n useEffect(() => {\n if (optionsRef.current?.refetchOnWindowFocus === false) return\n if (typeof window === 'undefined') return\n\n const handler = () => {\n void execute(lastVariablesRef.current)\n }\n window.addEventListener('focus', handler)\n return () => window.removeEventListener('focus', handler)\n }, [execute])\n\n return {\n data: response.data,\n error: response.error,\n variables,\n isLoading: status === 'loading',\n isFetching,\n isSuccess: status === 'success',\n isError: status === 'error',\n status,\n refetch,\n invalidate: invalidateQuery,\n execute,\n }\n }\n}\n\nexport function createUseMutate<\n TResponse,\n TVariables extends {\n params?: Record<string, string | number | boolean>\n query?: IgniterCallerClientQuery\n body?: unknown\n },\n>(\n params: UseMutateParams<TResponse, TVariables>,\n): (\n options?: IgniterCallerUseMutateOptions<TResponse, TVariables>,\n) => IgniterCallerUseMutateResult<TResponse, TVariables> {\n const {\n callerKey,\n method,\n path,\n buildRequest,\n getMergedConfig,\n onError,\n } = params\n\n return (options) => {\n const [status, setStatus] = useState<'loading' | 'error' | 'success'>(\n 'success',\n )\n const [response, setResponse] = useState<{\n data: TResponse | null\n error: IgniterError | null\n }>({ data: null, error: null })\n const [variables, setVariables] = useState<TVariables | undefined>(\n undefined,\n )\n\n const optionsRef = useRef(options)\n optionsRef.current = options\n const lastVariablesRef = useRef<TVariables | undefined>(undefined)\n\n const mutate = useCallback(\n async (nextVariables?: TVariables) => {\n const mergedConfig = getMergedConfig()\n const mergedInput = mergeMutateInput(\n mergedConfig,\n optionsRef.current as IgniterCallerClientRequestInput | undefined,\n nextVariables as IgniterCallerClientRequestInput | undefined,\n )\n\n lastVariablesRef.current = nextVariables\n setVariables(nextVariables)\n\n setStatus('loading')\n optionsRef.current?.onLoading?.(true)\n mergedConfig.onMutationLoading?.(true)\n\n try {\n const result = await buildRequest(method, path, mergedInput).execute()\n optionsRef.current?.onRequest?.(result)\n if (result.error) {\n setResponse({ data: null, error: result.error })\n setStatus('error')\n optionsRef.current?.onError?.(result.error)\n mergedConfig.onMutationError?.(result.error)\n onError?.(result.error)\n } else {\n const data = (result.data ?? null) as TResponse | null\n setResponse({ data, error: null })\n setStatus('success')\n optionsRef.current?.onSuccess?.(data as TResponse)\n mergedConfig.onMutationSuccess?.(data)\n }\n\n optionsRef.current?.onSettled?.(\n result.data ?? null,\n result.error ?? null,\n )\n mergedConfig.onMutationSettled?.(\n result.data ?? null,\n result.error ?? null,\n )\n\n return result\n } catch (error) {\n const typedError = error as IgniterError\n setResponse({ data: null, error: typedError })\n setStatus('error')\n optionsRef.current?.onError?.(typedError)\n mergedConfig.onMutationError?.(typedError)\n onError?.(typedError)\n optionsRef.current?.onSettled?.(null, typedError)\n mergedConfig.onMutationSettled?.(null, typedError)\n } finally {\n optionsRef.current?.onLoading?.(false)\n mergedConfig.onMutationLoading?.(false)\n }\n },\n [method, path, buildRequest, getMergedConfig, onError],\n )\n\n const retry = useCallback(() => {\n void mutate(lastVariablesRef.current)\n }, [mutate])\n\n return {\n data: response.data,\n error: response.error,\n variables,\n isLoading: status === 'loading',\n isSuccess: status === 'success',\n isError: status === 'error',\n status,\n mutate,\n retry,\n }\n }\n}\n","import type { IgniterCallerManager } from '../../core/manager'\nimport type { IgniterCallerClientContextValue } from '../interfaces/context'\nimport type { IgniterCallerClientRequestInput } from './hooks.builder'\nimport {\n createUseMutate,\n createUseQuery,\n} from './hooks.builder'\nimport type {\n IgniterCallerClient,\n IgniterCallerClientConfigApi,\n} from '../interfaces/client'\nimport { buildQueryPrefix } from '../utils/query-key'\n\nfunction applyRequestInput(\n builder: { params: (params: Record<string, string | number | boolean>) => any; headers: (headers: Record<string, string>) => any; body: (body: unknown) => any },\n input: IgniterCallerClientRequestInput,\n) {\n if (input.query && Object.keys(input.query).length > 0) {\n builder.params(input.query)\n }\n\n if (input.headers && Object.keys(input.headers).length > 0) {\n builder.headers(input.headers)\n }\n\n if (input.body !== undefined) {\n builder.body(input.body)\n }\n}\n\nexport function createIgniterCallerClient<\n TCaller extends IgniterCallerManager<any>,\n TCallers extends Record<string, IgniterCallerManager<any>>,\n>(\n context: IgniterCallerClientContextValue<TCallers>,\n callerKey: keyof TCallers,\n): IgniterCallerClient<TCaller> {\n const caller = context.callers[callerKey] as unknown as TCaller\n\n const getMergedConfig = () => context.getMergedConfig(callerKey)\n\n const buildRequest = (\n method: string,\n path: string,\n input: IgniterCallerClientRequestInput,\n ) => {\n if (!path) {\n throw new Error(\n 'IgniterCallerClient: path is required when using hooks with Caller client.',\n )\n }\n\n const methodKey = method.toLowerCase() as\n | 'get'\n | 'post'\n | 'put'\n | 'patch'\n | 'delete'\n | 'head'\n\n const builder = (caller as any)[methodKey](path)\n applyRequestInput(builder, input)\n return builder as { execute: () => Promise<any> }\n }\n\n const invalidate = (pathOrPaths: string | string[], data?: unknown) => {\n const paths = Array.isArray(pathOrPaths) ? pathOrPaths : [pathOrPaths]\n const prefixes = paths.map((path) =>\n buildQueryPrefix({\n callerKey: String(callerKey),\n method: 'GET',\n path,\n }),\n )\n context.invalidate(prefixes, data)\n }\n\n const config: IgniterCallerClientConfigApi = {\n set: (key, value) => context.setConfig(callerKey, key, value),\n get: (key) => context.getConfig(callerKey, key),\n reset: () => context.setConfigBatch(callerKey, {}),\n }\n\n const get = (path?: string) => {\n const builder = caller.get(path as any)\n const useQuery = createUseQuery({\n callerKey: String(callerKey),\n method: 'GET',\n path: path || '',\n buildRequest,\n register: context.register,\n unregister: context.unregister,\n invalidate: context.invalidate,\n getMergedConfig,\n onError: context.onError,\n })\n ;(builder as any).useQuery = useQuery\n return builder as any\n }\n\n const head = (path?: string) => {\n const builder = caller.head(path as any)\n const useQuery = createUseQuery({\n callerKey: String(callerKey),\n method: 'HEAD',\n path: path || '',\n buildRequest,\n register: context.register,\n unregister: context.unregister,\n invalidate: context.invalidate,\n getMergedConfig,\n onError: context.onError,\n })\n ;(builder as any).useQuery = useQuery\n return builder as any\n }\n\n const post = (path?: string) => {\n const builder = caller.post(path as any)\n const useMutate = createUseMutate({\n callerKey: String(callerKey),\n method: 'POST',\n path: path || '',\n buildRequest,\n getMergedConfig,\n onError: context.onError,\n })\n ;(builder as any).useMutate = useMutate\n return builder as any\n }\n\n const put = (path?: string) => {\n const builder = caller.put(path as any)\n const useMutate = createUseMutate({\n callerKey: String(callerKey),\n method: 'PUT',\n path: path || '',\n buildRequest,\n getMergedConfig,\n onError: context.onError,\n })\n ;(builder as any).useMutate = useMutate\n return builder as any\n }\n\n const patch = (path?: string) => {\n const builder = caller.patch(path as any)\n const useMutate = createUseMutate({\n callerKey: String(callerKey),\n method: 'PATCH',\n path: path || '',\n buildRequest,\n getMergedConfig,\n onError: context.onError,\n })\n ;(builder as any).useMutate = useMutate\n return builder as any\n }\n\n const del = (path?: string) => {\n const builder = caller.delete(path as any)\n const useMutate = createUseMutate({\n callerKey: String(callerKey),\n method: 'DELETE',\n path: path || '',\n buildRequest,\n getMergedConfig,\n onError: context.onError,\n })\n ;(builder as any).useMutate = useMutate\n return builder as any\n }\n\n return {\n raw: caller,\n config,\n invalidate: invalidate as any,\n get: get as any,\n post: post as any,\n put: put as any,\n patch: patch as any,\n delete: del as any,\n head: head as any,\n }\n}\n","'use client'\n\nimport {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState,\n type PropsWithChildren,\n} from 'react'\nimport type { IgniterError } from '@igniter-js/common'\nimport type {\n IgniterCallerClientContextValue,\n IgniterCallerClientConfigs,\n IgniterCallerClientMap,\n IgniterCallerClientRefetchFn,\n} from '../interfaces/context'\nimport type {\n IgniterCallerClientConfig,\n IgniterCallerClientConfigKey,\n IgniterCallerClientConfigValue,\n} from '../interfaces/config'\nimport { IgniterCallerClientCache } from '../utils/cache'\nimport { createIgniterCallerClient } from './client.builder'\n\nconst IgniterCallerClientContext = createContext<\n IgniterCallerClientContextValue<any> | undefined\n>(undefined)\n\nexport interface IgniterCallerProviderProps<\n TCallers extends IgniterCallerClientMap,\n> extends PropsWithChildren {\n callers: TCallers\n configs?: IgniterCallerClientConfigs<TCallers>\n hooks?: IgniterCallerClientConfig\n onError?: (error: IgniterError) => void\n}\n\nfunction mergeConfig(\n globalConfig: IgniterCallerClientConfig,\n localConfig?: IgniterCallerClientConfig,\n): IgniterCallerClientConfig {\n return {\n ...globalConfig,\n ...localConfig,\n headers: {\n ...(globalConfig.headers || {}),\n ...(localConfig?.headers || {}),\n },\n cookies: {\n ...(globalConfig.cookies || {}),\n ...(localConfig?.cookies || {}),\n },\n query: {\n ...(globalConfig.query || {}),\n ...(localConfig?.query || {}),\n },\n }\n}\n\nexport function IgniterCallerProvider<\n TCallers extends IgniterCallerClientMap,\n>(props: IgniterCallerProviderProps<TCallers>) {\n const { callers, configs, hooks, onError, children } = props\n const [configState, setConfigState] = useState<\n IgniterCallerClientConfigs<TCallers>\n >(configs || {})\n const [listeners] = useState(\n () => new Map<string, Set<IgniterCallerClientRefetchFn>>(),\n )\n\n const globalConfig = useMemo<IgniterCallerClientConfig>(\n () => hooks || {},\n [hooks],\n )\n\n const register = useCallback(\n (key: string, refetch: IgniterCallerClientRefetchFn) => {\n const current = listeners.get(key) || new Set()\n current.add(refetch)\n listeners.set(key, current)\n },\n [listeners],\n )\n\n const unregister = useCallback(\n (key: string, refetch: IgniterCallerClientRefetchFn) => {\n const current = listeners.get(key)\n if (!current) return\n current.delete(refetch)\n if (current.size === 0) {\n listeners.delete(key)\n }\n },\n [listeners],\n )\n\n const invalidate = useCallback(\n (keys: string | string[], data?: unknown) => {\n const keysArray = Array.isArray(keys) ? keys : [keys]\n\n keysArray.forEach((prefix) => {\n if (data !== undefined) {\n IgniterCallerClientCache.replacePrefix(prefix, data)\n } else {\n IgniterCallerClientCache.clearPrefix(prefix)\n }\n\n listeners.forEach((refetchFns, registeredKey) => {\n if (registeredKey.startsWith(prefix)) {\n refetchFns.forEach((refetch) => refetch(true))\n }\n })\n })\n },\n [listeners],\n )\n\n const setConfig = useCallback(\n <TKey extends IgniterCallerClientConfigKey>(\n callerKey: keyof TCallers,\n key: TKey,\n value: IgniterCallerClientConfigValue<TKey>,\n ) => {\n setConfigState((prev) => ({\n ...prev,\n [callerKey]: {\n ...(prev[callerKey] || {}),\n [key]: value,\n },\n }))\n },\n [],\n )\n\n const setConfigBatch = useCallback(\n (callerKey: keyof TCallers, config: Partial<IgniterCallerClientConfig>) => {\n setConfigState((prev) => ({\n ...prev,\n [callerKey]: {\n ...(prev[callerKey] || {}),\n ...config,\n },\n }))\n },\n [],\n )\n\n const getMergedConfig = useCallback(\n (callerKey: keyof TCallers) =>\n mergeConfig(globalConfig, configState[callerKey]),\n [globalConfig, configState],\n )\n\n const getConfig = useCallback(\n <TKey extends IgniterCallerClientConfigKey>(\n callerKey: keyof TCallers,\n key: TKey,\n ) => getMergedConfig(callerKey)[key],\n [getMergedConfig],\n )\n\n const value = useMemo<IgniterCallerClientContextValue<TCallers>>(\n () => ({\n callers,\n configs: configState,\n globalConfig,\n setConfig,\n setConfigBatch,\n getConfig,\n getMergedConfig,\n register,\n unregister,\n invalidate,\n listeners,\n onError,\n }),\n [\n callers,\n configState,\n globalConfig,\n getConfig,\n getMergedConfig,\n invalidate,\n listeners,\n onError,\n register,\n setConfig,\n setConfigBatch,\n unregister,\n ],\n )\n\n return (\n <IgniterCallerClientContext.Provider value={value}>\n {children}\n </IgniterCallerClientContext.Provider>\n )\n}\n\nexport function useIgniterCallerContext<\n TCallers extends IgniterCallerClientMap,\n>() {\n const context = useContext(\n IgniterCallerClientContext,\n ) as IgniterCallerClientContextValue<TCallers> | undefined\n\n if (!context) {\n throw new Error(\n 'IgniterCallerProvider is missing. Wrap your app with <IgniterCallerProvider>.',\n )\n }\n\n return context\n}\n\nexport function useIgniterCaller<TCallers extends IgniterCallerClientMap>() {\n const context = useIgniterCallerContext<TCallers>()\n\n return <TKey extends keyof TCallers>(callerKey: TKey) =>\n createIgniterCallerClient(context, callerKey)\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/client/utils/cache.ts","../../src/client/utils/query-key.ts","../../src/client/utils/cookies.ts","../../src/client/builders/hooks.builder.tsx","../../src/client/builders/client.builder.ts","../../src/client/builders/provider.builder.tsx"],"names":["useState","useMemo","useCallback","value"],"mappings":";;;;;;AAAO,IAAM,yBAAA,GAAN,MAAM,yBAAA,CAAyB;AAAA,EAMpC,OAAO,GAAA,CAAO,GAAA,EAAa,SAAA,EAAmC;AAC5D,IAAA,MAAM,KAAA,GAAQ,yBAAA,CAAyB,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AACpD,IAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AAEnB,IAAA,IAAI,aAAa,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA,CAAM,YAAY,SAAA,EAAW;AACzD,MAAA,yBAAA,CAAyB,KAAA,CAAM,OAAO,GAAG,CAAA;AACzC,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,OAAO,KAAA,CAAM,IAAA;AAAA,EACf;AAAA,EAEA,OAAO,GAAA,CAAI,GAAA,EAAa,IAAA,EAAqB;AAC3C,IAAA,yBAAA,CAAyB,KAAA,CAAM,IAAI,GAAA,EAAK;AAAA,MACtC,IAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA;AAAI,KACrB,CAAA;AAAA,EACH;AAAA,EAEA,OAAO,aAAA,CAAc,MAAA,EAAgB,IAAA,EAAqB;AACxD,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,yBAAA,CAAyB,KAAA,CAAM,SAAQ,EAAG;AACnE,MAAA,IAAI,GAAA,CAAI,UAAA,CAAW,MAAM,CAAA,EAAG;AAC1B,QAAA,yBAAA,CAAyB,KAAA,CAAM,IAAI,GAAA,EAAK;AAAA,UACtC,IAAA;AAAA,UACA,WAAW,KAAA,CAAM;AAAA,SAClB,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,YAAY,MAAA,EAAsB;AACvC,IAAA,KAAA,MAAW,GAAA,IAAO,yBAAA,CAAyB,KAAA,CAAM,IAAA,EAAK,EAAG;AACvD,MAAA,IAAI,GAAA,CAAI,UAAA,CAAW,MAAM,CAAA,EAAG;AAC1B,QAAA,yBAAA,CAAyB,KAAA,CAAM,OAAO,GAAG,CAAA;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AACF,CAAA;AA3Ca,yBAAA,CACI,KAAA,uBAAY,GAAA,EAGzB;AAJG,IAAM,wBAAA,GAAN;;;ACEP,IAAM,SAAA,GAAY,IAAA;AAElB,SAAS,gBAAgB,KAAA,EAAwB;AAC/C,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW,OAAO,SAAA;AAClD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAC1D,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,eAAA,CAAgB,IAAI,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,EACjE;AAEA,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,KAAgC,CAAA,CAAE,IAAA;AAAA,IAC/D,CAAC,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA,KAAM,CAAA,CAAE,aAAA,CAAc,CAAC;AAAA,GACjC;AAEA,EAAA,OAAO,CAAA,CAAA,EAAI,QACR,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,GAAG,MAAM,CAAA,EAAG,IAAA,CAAK,UAAU,GAAG,CAAC,IAAI,eAAA,CAAgB,GAAG,CAAC,CAAA,CAAE,CAAA,CACpE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AACd;AAEO,SAAS,cAAc,MAAA,EAMnB;AACT,EAAA,MAAM,EAAE,SAAA,EAAW,MAAA,EAAQ,MAAM,KAAA,EAAO,MAAA,EAAQ,YAAW,GAAI,MAAA;AAC/D,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,MAAA,EAAQ,cAAc,EAAC;AAAA,IACvB,KAAA,EAAO,SAAS;AAAC,GACnB;AAEA,EAAA,OAAO,CAAA,EAAG,SAAS,CAAA,EAAA,EAAK,MAAA,CAAO,WAAA,EAAa,CAAA,EAAA,EAAK,IAAI,CAAA,EAAA,EAAK,eAAA,CAAgB,OAAO,CAAC,CAAA,CAAA;AACpF;AAEO,SAAS,iBAAiB,MAAA,EAItB;AACT,EAAA,MAAM,EAAE,SAAA,EAAW,MAAA,EAAQ,IAAA,EAAK,GAAI,MAAA;AACpC,EAAA,OAAO,GAAG,SAAS,CAAA,EAAA,EAAK,OAAO,WAAA,EAAa,KAAK,IAAI,CAAA,CAAA;AACvD;;;ACzCO,SAAS,kBACd,OAAA,EACoB;AACpB,EAAA,IAAI,CAAC,WAAW,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,MAAA,KAAW,GAAG,OAAO,MAAA;AAE1D,EAAA,OAAO,OAAO,OAAA,CAAQ,OAAO,CAAA,CAC1B,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM,GAAG,GAAG,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAAA,CACvC,KAAK,IAAI,CAAA;AACd;;;AC+CA,SAAS,eAAA,CACP,MAAA,EACA,OAAA,EACA,SAAA,EACiC;AACjC,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,GAAI,MAAA,CAAO,OAAA,IAAW,EAAC;AAAA,IACvB,GAAI,OAAA,EAAS,OAAA,IAAW,EAAC;AAAA,IACzB,GAAI,SAAA,EAAW,OAAA,IAAW;AAAC,GAC7B;AACA,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,GAAI,MAAA,CAAO,OAAA,IAAW,EAAC;AAAA,IACvB,GAAI,OAAA,EAAS,OAAA,IAAW,EAAC;AAAA,IACzB,GAAI,SAAA,EAAW,OAAA,IAAW;AAAC,GAC7B;AACA,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,GAAI,MAAA,CAAO,KAAA,IAAS,EAAC;AAAA,IACrB,GAAI,OAAA,EAAS,KAAA,IAAS,EAAC;AAAA,IACvB,GAAI,SAAA,EAAW,KAAA,IAAS,EAAC;AAAA,IACzB,GAAI,OAAA,EAAS,MAAA,IAAU,EAAC;AAAA,IACxB,GAAI,SAAA,EAAW,MAAA,IAAU;AAAC,GAC5B;AAEA,EAAA,MAAM,YAAA,GAAe,kBAAkB,OAAO,CAAA;AAC9C,EAAA,IAAI,YAAA,IAAgB,CAAC,OAAA,CAAQ,MAAA,EAAQ;AACnC,IAAA,OAAA,CAAQ,MAAA,GAAS,YAAA;AAAA,EACnB;AAEA,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA,EAAQ,SAAA,EAAW,MAAA,IAAU,OAAA,EAAS;AAAA,GACxC;AACF;AAEA,SAAS,gBAAA,CACP,MAAA,EACA,OAAA,EACA,SAAA,EACiC;AACjC,EAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,MAAA,EAAQ,OAAA,EAAS,SAAS,CAAA;AACzD,EAAA,OAAO;AAAA,IACL,GAAG,MAAA;AAAA,IACH,IAAA,EAAM,SAAA,EAAW,IAAA,IAAQ,OAAA,EAAS;AAAA,GACpC;AACF;AAEO,SAAS,eAOd,MAAA,EAGsD;AACtD,EAAA,MAAM;AAAA,IACJ,SAAA;AAAA,IACA,MAAA;AAAA,IACA,IAAA;AAAA,IACA,YAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,GACF,GAAI,MAAA;AAEJ,EAAA,OAAO,CAAC,OAAA,KAAY;AAClB,IAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,QAAA;AAAA,MAC1B,OAAA,EAAS,cAAc,SAAA,GAAY;AAAA,KACrC;AACA,IAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,KAAK,CAAA;AAClD,IAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,QAAA,CAG7B;AAAA,MACD,IAAA,EAAM,SAAS,WAAA,IAAe,IAAA;AAAA,MAC9B,KAAA,EAAO;AAAA,KACR,CAAA;AACD,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,QAAA;AAAA,MAChC;AAAA,KACF;AAEA,IAAA,MAAM,UAAA,GAAa,OAAO,OAAO,CAAA;AACjC,IAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AAErB,IAAA,MAAM,gBAAA,GAAmB,OAA+B,MAAS,CAAA;AAEjE,IAAA,MAAM,SAAA,GAAY,QAAQ,MAAM;AAC9B,MAAA,MAAM,eAAe,eAAA,EAAgB;AACrC,MAAA,MAAM,WAAA,GAAc,eAAA;AAAA,QAClB,YAAA;AAAA,QACA,OAAA;AAAA,QACA,gBAAA,CAAiB;AAAA,OACnB;AAEA,MAAA,OAAO,aAAA,CAAc;AAAA,QACnB,SAAA;AAAA,QACA,MAAA;AAAA,QACA,IAAA;AAAA,QACA,OAAO,WAAA,CAAY,KAAA;AAAA,QACnB,QAAQ,WAAA,CAAY;AAAA,OACrB,CAAA;AAAA,IACH,CAAA,EAAG;AAAA,MACD,SAAA;AAAA,MACA,MAAA;AAAA,MACA,IAAA;AAAA;AAAA,MAEA,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,MAAA,IAAU,EAAE,CAAA;AAAA;AAAA,MAEpC,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,KAAA,IAAS,EAAE;AAAA,KACpC,CAAA;AAED,IAAA,MAAM,OAAA,GAAU,WAAA;AAAA,MACd,OAAO,aAAA,KAA+B;AACpC,QAAA,IAAI,UAAA,CAAW,OAAA,EAAS,OAAA,KAAY,KAAA,EAAO;AAE3C,QAAA,MAAM,eAAe,eAAA,EAAgB;AACrC,QAAA,MAAM,WAAA,GAAc,eAAA;AAAA,UAClB,YAAA;AAAA,UACA,UAAA,CAAW,OAAA;AAAA,UACX;AAAA,SACF;AAEA,QAAA,MAAM,WAAW,aAAA,CAAc;AAAA,UAC7B,SAAA;AAAA,UACA,MAAA;AAAA,UACA,IAAA;AAAA,UACA,OAAO,WAAA,CAAY,KAAA;AAAA,UACnB,QAAQ,WAAA,CAAY;AAAA,SACrB,CAAA;AAED,QAAA,gBAAA,CAAiB,OAAA,GAAU,aAAA;AAC3B,QAAA,YAAA,CAAa,aAAa,CAAA;AAE1B,QAAA,aAAA,CAAc,IAAI,CAAA;AAClB,QAAA,SAAA,CAAU,SAAS,CAAA;AACnB,QAAA,UAAA,CAAW,OAAA,EAAS,YAAY,IAAI,CAAA;AACpC,QAAA,YAAA,CAAa,iBAAiB,IAAI,CAAA;AAElC,QAAA,IAAI,UAAA,CAAW,SAAS,SAAA,EAAW;AACjC,UAAA,MAAM,SAAS,wBAAA,CAAyB,GAAA;AAAA,YACtC,QAAA;AAAA,YACA,WAAW,OAAA,CAAQ;AAAA,WACrB;AACA,UAAA,IAAI,WAAW,MAAA,EAAW;AACxB,YAAA,WAAA,CAAY,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,MAAM,CAAA;AACzC,YAAA,SAAA,CAAU,SAAS,CAAA;AACnB,YAAA,UAAA,CAAW,OAAA,EAAS,YAAY,MAAM,CAAA;AACtC,YAAA,YAAA,CAAa,iBAAiB,MAAM,CAAA;AACpC,YAAA,UAAA,CAAW,OAAA,EAAS,YAAY,KAAK,CAAA;AACrC,YAAA,YAAA,CAAa,iBAAiB,KAAK,CAAA;AACnC,YAAA,aAAA,CAAc,KAAK,CAAA;AACnB,YAAA,OAAO;AAAA,cACL,IAAA,EAAM,MAAA;AAAA,cACN,KAAA,EAAO;AAAA,aACT;AAAA,UACF;AAAA,QACF;AAEA,QAAA,IAAI;AACF,UAAA,MAAM,SAAS,MAAM,YAAA,CAAa,QAAQ,IAAA,EAAM,WAAW,EAAE,OAAA,EAAQ;AACrE,UAAA,UAAA,CAAW,OAAA,EAAS,YAAY,MAAM,CAAA;AACtC,UAAA,IAAI,OAAO,KAAA,EAAO;AAChB,YAAA,WAAA,CAAY,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,MAAA,CAAO,OAAO,CAAA;AAC/C,YAAA,SAAA,CAAU,OAAO,CAAA;AACjB,YAAA,UAAA,CAAW,OAAA,EAAS,OAAA,GAAU,MAAA,CAAO,KAAK,CAAA;AAC1C,YAAA,YAAA,CAAa,YAAA,GAAe,OAAO,KAAK,CAAA;AACxC,YAAA,OAAA,GAAU,OAAO,KAAK,CAAA;AAAA,UACxB,CAAA,MAAO;AACL,YAAA,MAAM,IAAA,GAAQ,OAAO,IAAA,IAAQ,IAAA;AAC7B,YAAA,WAAA,CAAY,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,CAAA;AACjC,YAAA,SAAA,CAAU,SAAS,CAAA;AACnB,YAAA,UAAA,CAAW,OAAA,EAAS,YAAY,IAAiB,CAAA;AACjD,YAAA,YAAA,CAAa,iBAAiB,IAAI,CAAA;AAElC,YAAA,IAAI,UAAA,CAAW,OAAA,EAAS,SAAA,IAAa,IAAA,KAAS,IAAA,EAAM;AAClD,cAAA,wBAAA,CAAyB,GAAA,CAAI,UAAU,IAAI,CAAA;AAAA,YAC7C;AAAA,UACF;AAEA,UAAA,UAAA,CAAW,OAAA,EAAS,SAAA;AAAA,YAClB,OAAO,IAAA,IAAQ,IAAA;AAAA,YACf,OAAO,KAAA,IAAS;AAAA,WAClB;AACA,UAAA,YAAA,CAAa,cAAA;AAAA,YACX,OAAO,IAAA,IAAQ,IAAA;AAAA,YACf,OAAO,KAAA,IAAS;AAAA,WAClB;AAEA,UAAA,OAAO,MAAA;AAAA,QACT,SAAS,KAAA,EAAO;AACd,UAAA,MAAM,UAAA,GAAa,KAAA;AACnB,UAAA,WAAA,CAAY,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,YAAY,CAAA;AAC7C,UAAA,SAAA,CAAU,OAAO,CAAA;AACjB,UAAA,UAAA,CAAW,OAAA,EAAS,UAAU,UAAU,CAAA;AACxC,UAAA,YAAA,CAAa,eAAe,UAAU,CAAA;AACtC,UAAA,OAAA,GAAU,UAAU,CAAA;AACpB,UAAA,UAAA,CAAW,OAAA,EAAS,SAAA,GAAY,IAAA,EAAM,UAAU,CAAA;AAChD,UAAA,YAAA,CAAa,cAAA,GAAiB,MAAM,UAAU,CAAA;AAAA,QAChD,CAAA,SAAE;AACA,UAAA,aAAA,CAAc,KAAK,CAAA;AACnB,UAAA,UAAA,CAAW,OAAA,EAAS,YAAY,KAAK,CAAA;AACrC,UAAA,YAAA,CAAa,iBAAiB,KAAK,CAAA;AAAA,QACrC;AAAA,MACF,CAAA;AAAA,MACA,CAAC,SAAA,EAAW,MAAA,EAAQ,IAAA,EAAM,YAAA,EAAc,iBAAiB,OAAO;AAAA,KAClE;AAEA,IAAA,MAAM,OAAA,GAAU,YAAY,MAAM;AAChC,MAAA,KAAK,OAAA,CAAQ,iBAAiB,OAAO,CAAA;AAAA,IACvC,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,IAAA,MAAM,eAAA,GAAkB,WAAA;AAAA,MACtB,CAAC,IAAA,KAAqB;AACpB,QAAA,MAAM,SAAS,gBAAA,CAAiB,EAAE,SAAA,EAAW,MAAA,EAAQ,MAAM,CAAA;AAC3D,QAAA,UAAA,CAAW,QAAQ,IAAI,CAAA;AAAA,MACzB,CAAA;AAAA,MACA,CAAC,SAAA,EAAW,MAAA,EAAQ,IAAA,EAAM,UAAU;AAAA,KACtC;AAEA,IAAA,SAAA,CAAU,MAAM;AACd,MAAA,QAAA,CAAS,WAAW,OAAO,CAAA;AAC3B,MAAA,OAAO,MAAM,UAAA,CAAW,SAAA,EAAW,OAAO,CAAA;AAAA,IAC5C,GAAG,CAAC,QAAA,EAAU,UAAA,EAAY,OAAA,EAAS,SAAS,CAAC,CAAA;AAE7C,IAAA,MAAM,mBAAA,GAAsB,OAAO,KAAK,CAAA;AAExC,IAAA,SAAA,CAAU,MAAM;AACd,MAAA,IAAI,UAAA,CAAW,OAAA,EAAS,OAAA,KAAY,KAAA,EAAO;AAC3C,MAAA,IAAI,UAAA,CAAW,OAAA,EAAS,cAAA,KAAmB,KAAA,IAAS,oBAAoB,OAAA,EAAS;AAEjF,MAAA,mBAAA,CAAoB,OAAA,GAAU,IAAA;AAC9B,MAAA,KAAK,OAAA,CAAQ,iBAAiB,OAAO,CAAA;AAAA,IACvC,CAAA,EAAG,CAAC,SAAA,EAAW,OAAO,CAAC,CAAA;AAEvB,IAAA,SAAA,CAAU,MAAM;AACd,MAAA,MAAM,QAAA,GAAW,WAAW,OAAA,EAAS,eAAA;AACrC,MAAA,IAAI,CAAC,QAAA,EAAU;AAEf,MAAA,MAAM,OAAA,GAAU,YAAY,MAAM;AAChC,QAAA,IACE,UAAA,CAAW,SAAS,2BAAA,KAAgC,KAAA,IACpD,OAAO,QAAA,KAAa,WAAA,IACpB,SAAS,MAAA,EACT;AACA,UAAA;AAAA,QACF;AACA,QAAA,KAAK,OAAA,CAAQ,iBAAiB,OAAO,CAAA;AAAA,MACvC,GAAG,QAAQ,CAAA;AAEX,MAAA,OAAO,MAAM,cAAc,OAAO,CAAA;AAAA,IACpC,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,IAAA,SAAA,CAAU,MAAM;AACd,MAAA,IAAI,UAAA,CAAW,OAAA,EAAS,oBAAA,KAAyB,KAAA,EAAO;AACxD,MAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAEnC,MAAA,MAAM,UAAU,MAAM;AACpB,QAAA,KAAK,OAAA,CAAQ,iBAAiB,OAAO,CAAA;AAAA,MACvC,CAAA;AACA,MAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,OAAO,CAAA;AACxC,MAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,OAAA,EAAS,OAAO,CAAA;AAAA,IAC1D,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,IAAA,OAAO;AAAA,MACL,MAAM,QAAA,CAAS,IAAA;AAAA,MACf,OAAO,QAAA,CAAS,KAAA;AAAA,MAChB,SAAA;AAAA,MACA,WAAW,MAAA,KAAW,SAAA;AAAA,MACtB,UAAA;AAAA,MACA,WAAW,MAAA,KAAW,SAAA;AAAA,MACtB,SAAS,MAAA,KAAW,OAAA;AAAA,MACpB,MAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA,EAAY,eAAA;AAAA,MACZ;AAAA,KACF;AAAA,EACF,CAAA;AACF;AAEO,SAAS,gBAQd,MAAA,EAGuD;AACvD,EAAA,MAAM;AAAA,IACJ,SAAA;AAAA,IACA,MAAA;AAAA,IACA,IAAA;AAAA,IACA,YAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,GACF,GAAI,MAAA;AAEJ,EAAA,OAAO,CAAC,OAAA,KAAY;AAClB,IAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,QAAA;AAAA,MAC1B;AAAA,KACF;AACA,IAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,QAAA,CAG7B,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,CAAA;AAC9B,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,QAAA;AAAA,MAChC;AAAA,KACF;AAEA,IAAA,MAAM,UAAA,GAAa,OAAO,OAAO,CAAA;AACjC,IAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AACrB,IAAA,MAAM,gBAAA,GAAmB,OAA+B,MAAS,CAAA;AAEjE,IAAA,MAAM,MAAA,GAAS,WAAA;AAAA,MACb,OAAO,aAAA,KAA+B;AACpC,QAAA,MAAM,eAAe,eAAA,EAAgB;AACrC,QAAA,MAAM,WAAA,GAAc,gBAAA;AAAA,UAClB,YAAA;AAAA,UACA,UAAA,CAAW,OAAA;AAAA,UACX;AAAA,SACF;AAEA,QAAA,gBAAA,CAAiB,OAAA,GAAU,aAAA;AAC3B,QAAA,YAAA,CAAa,aAAa,CAAA;AAE1B,QAAA,SAAA,CAAU,SAAS,CAAA;AACnB,QAAA,UAAA,CAAW,OAAA,EAAS,YAAY,IAAI,CAAA;AACpC,QAAA,YAAA,CAAa,oBAAoB,IAAI,CAAA;AAErC,QAAA,IAAI;AACF,UAAA,MAAM,SAAS,MAAM,YAAA,CAAa,QAAQ,IAAA,EAAM,WAAW,EAAE,OAAA,EAAQ;AACrE,UAAA,UAAA,CAAW,OAAA,EAAS,YAAY,MAAM,CAAA;AACtC,UAAA,IAAI,OAAO,KAAA,EAAO;AAChB,YAAA,WAAA,CAAY,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,MAAA,CAAO,OAAO,CAAA;AAC/C,YAAA,SAAA,CAAU,OAAO,CAAA;AACjB,YAAA,UAAA,CAAW,OAAA,EAAS,OAAA,GAAU,MAAA,CAAO,KAAK,CAAA;AAC1C,YAAA,YAAA,CAAa,eAAA,GAAkB,OAAO,KAAK,CAAA;AAC3C,YAAA,OAAA,GAAU,OAAO,KAAK,CAAA;AAAA,UACxB,CAAA,MAAO;AACL,YAAA,MAAM,IAAA,GAAQ,OAAO,IAAA,IAAQ,IAAA;AAC7B,YAAA,WAAA,CAAY,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,CAAA;AACjC,YAAA,SAAA,CAAU,SAAS,CAAA;AACnB,YAAA,UAAA,CAAW,OAAA,EAAS,YAAY,IAAiB,CAAA;AACjD,YAAA,YAAA,CAAa,oBAAoB,IAAI,CAAA;AAAA,UACvC;AAEA,UAAA,UAAA,CAAW,OAAA,EAAS,SAAA;AAAA,YAClB,OAAO,IAAA,IAAQ,IAAA;AAAA,YACf,OAAO,KAAA,IAAS;AAAA,WAClB;AACA,UAAA,YAAA,CAAa,iBAAA;AAAA,YACX,OAAO,IAAA,IAAQ,IAAA;AAAA,YACf,OAAO,KAAA,IAAS;AAAA,WAClB;AAEA,UAAA,OAAO,MAAA;AAAA,QACT,SAAS,KAAA,EAAO;AACd,UAAA,MAAM,UAAA,GAAa,KAAA;AACnB,UAAA,WAAA,CAAY,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,YAAY,CAAA;AAC7C,UAAA,SAAA,CAAU,OAAO,CAAA;AACjB,UAAA,UAAA,CAAW,OAAA,EAAS,UAAU,UAAU,CAAA;AACxC,UAAA,YAAA,CAAa,kBAAkB,UAAU,CAAA;AACzC,UAAA,OAAA,GAAU,UAAU,CAAA;AACpB,UAAA,UAAA,CAAW,OAAA,EAAS,SAAA,GAAY,IAAA,EAAM,UAAU,CAAA;AAChD,UAAA,YAAA,CAAa,iBAAA,GAAoB,MAAM,UAAU,CAAA;AAAA,QACnD,CAAA,SAAE;AACA,UAAA,UAAA,CAAW,OAAA,EAAS,YAAY,KAAK,CAAA;AACrC,UAAA,YAAA,CAAa,oBAAoB,KAAK,CAAA;AAAA,QACxC;AAAA,MACF,CAAA;AAAA,MACA,CAAC,MAAA,EAAQ,IAAA,EAAM,YAAA,EAAc,iBAAiB,OAAO;AAAA,KACvD;AAEA,IAAA,MAAM,KAAA,GAAQ,YAAY,MAAM;AAC9B,MAAA,KAAK,MAAA,CAAO,iBAAiB,OAAO,CAAA;AAAA,IACtC,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,IAAA,OAAO;AAAA,MACL,MAAM,QAAA,CAAS,IAAA;AAAA,MACf,OAAO,QAAA,CAAS,KAAA;AAAA,MAChB,SAAA;AAAA,MACA,WAAW,MAAA,KAAW,SAAA;AAAA,MACtB,WAAW,MAAA,KAAW,SAAA;AAAA,MACtB,SAAS,MAAA,KAAW,OAAA;AAAA,MACpB,MAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA;AACF;;;AC1bA,SAAS,iBAAA,CACP,SACA,KAAA,EACA;AACA,EAAA,IAAI,KAAA,CAAM,SAAS,MAAA,CAAO,IAAA,CAAK,MAAM,KAAK,CAAA,CAAE,SAAS,CAAA,EAAG;AACtD,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,KAAK,CAAA;AAAA,EAC5B;AAEA,EAAA,IAAI,KAAA,CAAM,WAAW,MAAA,CAAO,IAAA,CAAK,MAAM,OAAO,CAAA,CAAE,SAAS,CAAA,EAAG;AAC1D,IAAA,OAAA,CAAQ,OAAA,CAAQ,MAAM,OAAO,CAAA;AAAA,EAC/B;AAEA,EAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAW;AAC5B,IAAA,OAAA,CAAQ,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,EACzB;AACF;AAEO,SAAS,yBAAA,CAId,SACA,SAAA,EAC8B;AAC9B,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAA;AAExC,EAAA,MAAM,eAAA,GAAkB,MAAM,OAAA,CAAQ,eAAA,CAAgB,SAAS,CAAA;AAE/D,EAAA,MAAM,YAAA,GAAe,CACnB,MAAA,EACA,IAAA,EACA,KAAA,KACG;AACH,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,OAAO,WAAA,EAAY;AAQrC,IAAA,MAAM,OAAA,GAAW,MAAA,CAAe,SAAS,CAAA,CAAE,IAAI,CAAA;AAC/C,IAAA,iBAAA,CAAkB,SAAS,KAAK,CAAA;AAChC,IAAA,OAAO,OAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,WAAA,EAAgC,IAAA,KAAmB;AACrE,IAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,GAAI,WAAA,GAAc,CAAC,WAAW,CAAA;AACrE,IAAA,MAAM,WAAW,KAAA,CAAM,GAAA;AAAA,MAAI,CAAC,SAC1B,gBAAA,CAAiB;AAAA,QACf,SAAA,EAAW,OAAO,SAAS,CAAA;AAAA,QAC3B,MAAA,EAAQ,KAAA;AAAA,QACR;AAAA,OACD;AAAA,KACH;AACA,IAAA,OAAA,CAAQ,UAAA,CAAW,UAAU,IAAI,CAAA;AAAA,EACnC,CAAA;AAEA,EAAA,MAAM,MAAA,GAAuC;AAAA,IAC3C,GAAA,EAAK,CAAC,GAAA,EAAK,KAAA,KAAU,QAAQ,SAAA,CAAU,SAAA,EAAW,KAAK,KAAK,CAAA;AAAA,IAC5D,KAAK,CAAC,GAAA,KAAQ,OAAA,CAAQ,SAAA,CAAU,WAAW,GAAG,CAAA;AAAA,IAC9C,OAAO,MAAM,OAAA,CAAQ,cAAA,CAAe,SAAA,EAAW,EAAE;AAAA,GACnD;AAEA,EAAA,MAAM,GAAA,GAAM,CAAC,IAAA,KAAkB;AAC7B,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,GAAA,CAAI,IAAW,CAAA;AACtC,IAAA,MAAM,WAAW,cAAA,CAAe;AAAA,MAC9B,SAAA,EAAW,OAAO,SAAS,CAAA;AAAA,MAC3B,MAAA,EAAQ,KAAA;AAAA,MACR,MAAM,IAAA,IAAQ,EAAA;AAAA,MACd,YAAA;AAAA,MACA,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,eAAA;AAAA,MACA,SAAS,OAAA,CAAQ;AAAA,KAClB,CAAA;AACA,IAAC,QAAgB,QAAA,GAAW,QAAA;AAC7B,IAAA,OAAO,OAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,IAAA,GAAO,CAAC,IAAA,KAAkB;AAC9B,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,IAAW,CAAA;AACvC,IAAA,MAAM,WAAW,cAAA,CAAe;AAAA,MAC9B,SAAA,EAAW,OAAO,SAAS,CAAA;AAAA,MAC3B,MAAA,EAAQ,MAAA;AAAA,MACR,MAAM,IAAA,IAAQ,EAAA;AAAA,MACd,YAAA;AAAA,MACA,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,eAAA;AAAA,MACA,SAAS,OAAA,CAAQ;AAAA,KAClB,CAAA;AACA,IAAC,QAAgB,QAAA,GAAW,QAAA;AAC7B,IAAA,OAAO,OAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,IAAA,GAAO,CAAC,IAAA,KAAkB;AAC9B,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,IAAW,CAAA;AACvC,IAAA,MAAM,YAAY,eAAA,CAAgB;AAAA,MAChC,SAAA,EAAW,OAAO,SAAS,CAAA;AAAA,MAC3B,MAAA,EAAQ,MAAA;AAAA,MACR,MAAM,IAAA,IAAQ,EAAA;AAAA,MACd,YAAA;AAAA,MACA,eAAA;AAAA,MACA,SAAS,OAAA,CAAQ;AAAA,KAClB,CAAA;AACA,IAAC,QAAgB,SAAA,GAAY,SAAA;AAC9B,IAAA,OAAO,OAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,GAAA,GAAM,CAAC,IAAA,KAAkB;AAC7B,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,GAAA,CAAI,IAAW,CAAA;AACtC,IAAA,MAAM,YAAY,eAAA,CAAgB;AAAA,MAChC,SAAA,EAAW,OAAO,SAAS,CAAA;AAAA,MAC3B,MAAA,EAAQ,KAAA;AAAA,MACR,MAAM,IAAA,IAAQ,EAAA;AAAA,MACd,YAAA;AAAA,MACA,eAAA;AAAA,MACA,SAAS,OAAA,CAAQ;AAAA,KAClB,CAAA;AACA,IAAC,QAAgB,SAAA,GAAY,SAAA;AAC9B,IAAA,OAAO,OAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,KAAkB;AAC/B,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,KAAA,CAAM,IAAW,CAAA;AACxC,IAAA,MAAM,YAAY,eAAA,CAAgB;AAAA,MAChC,SAAA,EAAW,OAAO,SAAS,CAAA;AAAA,MAC3B,MAAA,EAAQ,OAAA;AAAA,MACR,MAAM,IAAA,IAAQ,EAAA;AAAA,MACd,YAAA;AAAA,MACA,eAAA;AAAA,MACA,SAAS,OAAA,CAAQ;AAAA,KAClB,CAAA;AACA,IAAC,QAAgB,SAAA,GAAY,SAAA;AAC9B,IAAA,OAAO,OAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,GAAA,GAAM,CAAC,IAAA,KAAkB;AAC7B,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,IAAW,CAAA;AACzC,IAAA,MAAM,YAAY,eAAA,CAAgB;AAAA,MAChC,SAAA,EAAW,OAAO,SAAS,CAAA;AAAA,MAC3B,MAAA,EAAQ,QAAA;AAAA,MACR,MAAM,IAAA,IAAQ,EAAA;AAAA,MACd,YAAA;AAAA,MACA,eAAA;AAAA,MACA,SAAS,OAAA,CAAQ;AAAA,KAClB,CAAA;AACA,IAAC,QAAgB,SAAA,GAAY,SAAA;AAC9B,IAAA,OAAO,OAAA;AAAA,EACT,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,MAAA;AAAA,IACL,MAAA;AAAA,IACA,UAAA;AAAA,IACA,GAAA;AAAA,IACA,IAAA;AAAA,IACA,GAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA,EAAQ,GAAA;AAAA,IACR;AAAA,GACF;AACF;AC9JA,IAAM,0BAAA,GAA6B,cAEjC,MAAS,CAAA;AAWX,SAAS,WAAA,CACP,cACA,WAAA,EAC2B;AAC3B,EAAA,OAAO;AAAA,IACL,GAAG,YAAA;AAAA,IACH,GAAG,WAAA;AAAA,IACH,OAAA,EAAS;AAAA,MACP,GAAI,YAAA,CAAa,OAAA,IAAW,EAAC;AAAA,MAC7B,GAAI,WAAA,EAAa,OAAA,IAAW;AAAC,KAC/B;AAAA,IACA,OAAA,EAAS;AAAA,MACP,GAAI,YAAA,CAAa,OAAA,IAAW,EAAC;AAAA,MAC7B,GAAI,WAAA,EAAa,OAAA,IAAW;AAAC,KAC/B;AAAA,IACA,KAAA,EAAO;AAAA,MACL,GAAI,YAAA,CAAa,KAAA,IAAS,EAAC;AAAA,MAC3B,GAAI,WAAA,EAAa,KAAA,IAAS;AAAC;AAC7B,GACF;AACF;AAEO,SAAS,sBAEd,KAAA,EAA6C;AAC7C,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,UAAS,GAAI,KAAA;AACvD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,IAAIA,QAAAA,CAEpC,OAAA,IAAW,EAAE,CAAA;AACf,EAAA,MAAM,CAAC,SAAS,CAAA,GAAIA,QAAAA;AAAA,IAClB,0BAAU,GAAA;AAA+C,GAC3D;AAEA,EAAA,MAAM,YAAA,GAAeC,OAAAA;AAAA,IACnB,MAAM,SAAS,EAAC;AAAA,IAChB,CAAC,KAAK;AAAA,GACR;AAEA,EAAA,MAAM,QAAA,GAAWC,WAAAA;AAAA,IACf,CAAC,KAAa,OAAA,KAA0C;AACtD,MAAA,MAAM,UAAU,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA,wBAAS,GAAA,EAAI;AAC9C,MAAA,OAAA,CAAQ,IAAI,OAAO,CAAA;AACnB,MAAA,SAAA,CAAU,GAAA,CAAI,KAAK,OAAO,CAAA;AAAA,IAC5B,CAAA;AAAA,IACA,CAAC,SAAS;AAAA,GACZ;AAEA,EAAA,MAAM,UAAA,GAAaA,WAAAA;AAAA,IACjB,CAAC,KAAa,OAAA,KAA0C;AACtD,MAAA,MAAM,OAAA,GAAU,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AACjC,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,OAAA,CAAQ,OAAO,OAAO,CAAA;AACtB,MAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,QAAA,SAAA,CAAU,OAAO,GAAG,CAAA;AAAA,MACtB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,SAAS;AAAA,GACZ;AAEA,EAAA,MAAM,UAAA,GAAaA,WAAAA;AAAA,IACjB,CAAC,MAAyB,IAAA,KAAmB;AAC3C,MAAA,MAAM,YAAY,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,IAAA,GAAO,CAAC,IAAI,CAAA;AAEpD,MAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,MAAA,KAAW;AAC5B,QAAA,IAAI,SAAS,MAAA,EAAW;AACtB,UAAA,wBAAA,CAAyB,aAAA,CAAc,QAAQ,IAAI,CAAA;AAAA,QACrD,CAAA,MAAO;AACL,UAAA,wBAAA,CAAyB,YAAY,MAAM,CAAA;AAAA,QAC7C;AAEA,QAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,UAAA,EAAY,aAAA,KAAkB;AAC/C,UAAA,IAAI,aAAA,CAAc,UAAA,CAAW,MAAM,CAAA,EAAG;AACpC,YAAA,UAAA,CAAW,OAAA,CAAQ,CAAC,OAAA,KAAY,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA,UAC/C;AAAA,QACF,CAAC,CAAA;AAAA,MACH,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,SAAS;AAAA,GACZ;AAEA,EAAA,MAAM,SAAA,GAAYA,WAAAA;AAAA,IAChB,CACE,SAAA,EACA,GAAA,EACAC,MAAAA,KACG;AACH,MAAA,cAAA,CAAe,CAAC,IAAA,MAAU;AAAA,QACxB,GAAG,IAAA;AAAA,QACH,CAAC,SAAS,GAAG;AAAA,UACX,GAAI,IAAA,CAAK,SAAS,CAAA,IAAK,EAAC;AAAA,UACxB,CAAC,GAAG,GAAGA;AAAA;AACT,OACF,CAAE,CAAA;AAAA,IACJ,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,MAAM,cAAA,GAAiBD,WAAAA;AAAA,IACrB,CAAC,WAA2B,MAAA,KAA+C;AACzE,MAAA,cAAA,CAAe,CAAC,IAAA,MAAU;AAAA,QACxB,GAAG,IAAA;AAAA,QACH,CAAC,SAAS,GAAG;AAAA,UACX,GAAI,IAAA,CAAK,SAAS,CAAA,IAAK,EAAC;AAAA,UACxB,GAAG;AAAA;AACL,OACF,CAAE,CAAA;AAAA,IACJ,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,MAAM,cAAA,GAAiBD,QAAQ,OAAO,EAAE,SAAS,WAAA,EAAY,CAAA,EAAI,EAAE,CAAA;AACnE,EAAA,cAAA,CAAe,OAAA,GAAU,WAAA;AAEzB,EAAA,MAAM,eAAA,GAAkBA,QAAQ,OAAO,EAAE,SAAS,YAAA,EAAa,CAAA,EAAI,EAAE,CAAA;AACrE,EAAA,eAAA,CAAgB,OAAA,GAAU,YAAA;AAE1B,EAAA,MAAM,eAAA,GAAkBC,WAAAA;AAAA,IACtB,CAAC,cACC,WAAA,CAAY,eAAA,CAAgB,SAAS,cAAA,CAAe,OAAA,CAAQ,SAAS,CAAC,CAAA;AAAA,IACxE,CAAC,iBAAiB,cAAc;AAAA,GAClC;AAEA,EAAA,MAAM,SAAA,GAAYA,WAAAA;AAAA,IAChB,CACE,SAAA,EACA,GAAA,KACG,eAAA,CAAgB,SAAS,EAAE,GAAG,CAAA;AAAA,IACnC,CAAC,eAAe;AAAA,GAClB;AAEA,EAAA,MAAM,KAAA,GAAQD,OAAAA;AAAA,IACZ,OAAO;AAAA,MACL,OAAA;AAAA,MACA,OAAA,EAAS,WAAA;AAAA,MACT,YAAA;AAAA,MACA,SAAA;AAAA,MACA,cAAA;AAAA,MACA,SAAA;AAAA,MACA,eAAA;AAAA,MACA,QAAA;AAAA,MACA,UAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA;AAAA,MACE,OAAA;AAAA,MACA,SAAA;AAAA,MACA,eAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,uBACE,GAAA,CAAC,0BAAA,CAA2B,QAAA,EAA3B,EAAoC,OAClC,QAAA,EACH,CAAA;AAEJ;AAEO,SAAS,uBAAA,GAEZ;AACF,EAAA,MAAM,OAAA,GAAU,UAAA;AAAA,IACd;AAAA,GACF;AAEA,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AAEO,SAAS,gBAAA,GAA4D;AAC1E,EAAA,MAAM,UAAU,uBAAA,EAAkC;AAElD,EAAA,OAAO,CACL,SAAA,KAEA,yBAAA,CAAoD,OAAA,EAAS,SAAS,CAAA;AAC1E","file":"index.mjs","sourcesContent":["export class IgniterCallerClientCache {\n private static cache = new Map<\n string,\n { data: unknown; timestamp: number }\n >()\n\n static get<T>(key: string, staleTime?: number): T | undefined {\n const entry = IgniterCallerClientCache.cache.get(key)\n if (!entry) return undefined\n\n if (staleTime && Date.now() - entry.timestamp > staleTime) {\n IgniterCallerClientCache.cache.delete(key)\n return undefined\n }\n\n return entry.data as T\n }\n\n static set(key: string, data: unknown): void {\n IgniterCallerClientCache.cache.set(key, {\n data,\n timestamp: Date.now(),\n })\n }\n\n static replacePrefix(prefix: string, data: unknown): void {\n for (const [key, entry] of IgniterCallerClientCache.cache.entries()) {\n if (key.startsWith(prefix)) {\n IgniterCallerClientCache.cache.set(key, {\n data,\n timestamp: entry.timestamp,\n })\n }\n }\n }\n\n static clearPrefix(prefix: string): void {\n for (const key of IgniterCallerClientCache.cache.keys()) {\n if (key.startsWith(prefix)) {\n IgniterCallerClientCache.cache.delete(key)\n }\n }\n }\n}\n","import type { IgniterCallerClientQuery } from '../interfaces/config'\n\nconst EMPTY_KEY = '{}'\n\nfunction stableStringify(value: unknown): string {\n if (value === null || value === undefined) return EMPTY_KEY\n if (typeof value !== 'object') return JSON.stringify(value)\n if (Array.isArray(value)) {\n return `[${value.map((item) => stableStringify(item)).join(',')}]`\n }\n\n const entries = Object.entries(value as Record<string, unknown>).sort(\n ([a], [b]) => a.localeCompare(b),\n )\n\n return `{${entries\n .map(([key, val]) => `${JSON.stringify(key)}:${stableStringify(val)}`)\n .join(',')}}`\n}\n\nexport function buildQueryKey(params: {\n callerKey: string\n method: string\n path: string\n query?: IgniterCallerClientQuery\n params?: Record<string, string | number | boolean>\n}): string {\n const { callerKey, method, path, query, params: pathParams } = params\n const payload = {\n params: pathParams || {},\n query: query || {},\n }\n\n return `${callerKey}::${method.toUpperCase()}::${path}::${stableStringify(payload)}`\n}\n\nexport function buildQueryPrefix(params: {\n callerKey: string\n method: string\n path: string\n}): string {\n const { callerKey, method, path } = params\n return `${callerKey}::${method.toUpperCase()}::${path}`\n}\n","import type { IgniterCallerClientCookies } from '../interfaces/config'\n\nexport function buildCookieHeader(\n cookies?: IgniterCallerClientCookies,\n): string | undefined {\n if (!cookies || Object.keys(cookies).length === 0) return undefined\n\n return Object.entries(cookies)\n .map(([key, value]) => `${key}=${value}`)\n .join('; ')\n}\n","'use client'\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport type { IgniterError } from '@igniter-js/common'\nimport type { IgniterCallerApiResponse } from '../../types/response'\nimport type {\n IgniterCallerClientConfig,\n IgniterCallerClientQuery,\n} from '../interfaces/config'\nimport type { IgniterCallerClientRefetchFn } from '../interfaces/context'\nimport type {\n IgniterCallerUseMutateOptions,\n IgniterCallerUseMutateResult,\n IgniterCallerUseQueryOptions,\n IgniterCallerUseQueryResult,\n} from '../interfaces/hooks'\nimport { IgniterCallerClientCache } from '../utils/cache'\nimport { buildQueryKey, buildQueryPrefix } from '../utils/query-key'\nimport { buildCookieHeader } from '../utils/cookies'\n\nexport interface IgniterCallerClientRequestInput {\n params?: Record<string, string | number | boolean>\n query?: Record<string, string | number | boolean>\n headers?: Record<string, string>\n cookies?: Record<string, string>\n body?: unknown\n}\n\nexport type IgniterCallerClientRequestFactory<TResponse> = (\n method: string,\n path: string,\n input: IgniterCallerClientRequestInput,\n) => {\n execute: () => Promise<IgniterCallerApiResponse<TResponse>>\n}\n\ninterface UseQueryParams<TResponse, TVariables> {\n callerKey: string\n method: 'GET' | 'HEAD'\n path: string\n buildRequest: IgniterCallerClientRequestFactory<TResponse>\n register: (key: string, refetch: IgniterCallerClientRefetchFn) => void\n unregister: (key: string, refetch: IgniterCallerClientRefetchFn) => void\n invalidate: (keys: string | string[], data?: unknown) => void\n getMergedConfig: () => IgniterCallerClientConfig\n onError?: (error: IgniterError) => void\n}\n\ninterface UseMutateParams<TResponse, TVariables> {\n callerKey: string\n method: 'POST' | 'PUT' | 'PATCH' | 'DELETE'\n path: string\n buildRequest: IgniterCallerClientRequestFactory<TResponse>\n getMergedConfig: () => IgniterCallerClientConfig\n onError?: (error: IgniterError) => void\n}\n\nfunction mergeQueryInput(\n config: IgniterCallerClientConfig,\n options?: IgniterCallerClientRequestInput,\n variables?: IgniterCallerClientRequestInput,\n): IgniterCallerClientRequestInput {\n const headers = {\n ...(config.headers || {}),\n ...(options?.headers || {}),\n ...(variables?.headers || {}),\n }\n const cookies = {\n ...(config.cookies || {}),\n ...(options?.cookies || {}),\n ...(variables?.cookies || {}),\n }\n const query = {\n ...(config.query || {}),\n ...(options?.query || {}),\n ...(variables?.query || {}),\n ...(options?.params || {}),\n ...(variables?.params || {}),\n }\n\n const cookieHeader = buildCookieHeader(cookies)\n if (cookieHeader && !headers.Cookie) {\n headers.Cookie = cookieHeader\n }\n\n return {\n headers,\n cookies,\n query,\n params: variables?.params || options?.params,\n }\n}\n\nfunction mergeMutateInput(\n config: IgniterCallerClientConfig,\n options?: IgniterCallerClientRequestInput,\n variables?: IgniterCallerClientRequestInput,\n): IgniterCallerClientRequestInput {\n const merged = mergeQueryInput(config, options, variables)\n return {\n ...merged,\n body: variables?.body ?? options?.body,\n }\n}\n\nexport function createUseQuery<\n TResponse,\n TVariables extends {\n params?: Record<string, string | number | boolean>\n query?: IgniterCallerClientQuery\n },\n>(\n params: UseQueryParams<TResponse, TVariables>,\n): (\n options?: IgniterCallerUseQueryOptions<TResponse, TVariables>,\n) => IgniterCallerUseQueryResult<TResponse, TVariables> {\n const {\n callerKey,\n method,\n path,\n buildRequest,\n register,\n unregister,\n invalidate,\n getMergedConfig,\n onError,\n } = params\n\n return (options) => {\n const [status, setStatus] = useState<'loading' | 'error' | 'success'>(\n options?.initialData ? 'success' : 'loading',\n )\n const [isFetching, setIsFetching] = useState(false)\n const [response, setResponse] = useState<{\n data: TResponse | null\n error: IgniterError | null\n }>({\n data: options?.initialData ?? null,\n error: null,\n })\n const [variables, setVariables] = useState<TVariables | undefined>(\n undefined,\n )\n\n const optionsRef = useRef(options)\n optionsRef.current = options\n\n const lastVariablesRef = useRef<TVariables | undefined>(undefined)\n\n const stableKey = useMemo(() => {\n const mergedConfig = getMergedConfig()\n const mergedInput = mergeQueryInput(\n mergedConfig,\n options as IgniterCallerClientRequestInput | undefined,\n lastVariablesRef.current as IgniterCallerClientRequestInput | undefined,\n )\n\n return buildQueryKey({\n callerKey,\n method,\n path,\n query: mergedInput.query,\n params: mergedInput.params,\n })\n }, [\n callerKey,\n method,\n path,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n JSON.stringify(options?.params || {}),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n JSON.stringify(options?.query || {}),\n ])\n\n const execute = useCallback(\n async (nextVariables?: TVariables) => {\n if (optionsRef.current?.enabled === false) return\n\n const mergedConfig = getMergedConfig()\n const mergedInput = mergeQueryInput(\n mergedConfig,\n optionsRef.current as IgniterCallerClientRequestInput | undefined,\n nextVariables as IgniterCallerClientRequestInput | undefined,\n )\n\n const queryKey = buildQueryKey({\n callerKey,\n method,\n path,\n query: mergedInput.query,\n params: mergedInput.params,\n })\n\n lastVariablesRef.current = nextVariables\n setVariables(nextVariables)\n\n setIsFetching(true)\n setStatus('loading')\n optionsRef.current?.onLoading?.(true)\n mergedConfig.onQueryLoading?.(true)\n\n if (optionsRef.current?.staleTime) {\n const cached = IgniterCallerClientCache.get<TResponse>(\n queryKey,\n optionsRef.current.staleTime,\n )\n if (cached !== undefined) {\n setResponse({ data: cached, error: null })\n setStatus('success')\n optionsRef.current?.onSuccess?.(cached)\n mergedConfig.onQuerySuccess?.(cached)\n optionsRef.current?.onLoading?.(false)\n mergedConfig.onQueryLoading?.(false)\n setIsFetching(false)\n return {\n data: cached,\n error: undefined,\n }\n }\n }\n\n try {\n const result = await buildRequest(method, path, mergedInput).execute()\n optionsRef.current?.onRequest?.(result)\n if (result.error) {\n setResponse({ data: null, error: result.error })\n setStatus('error')\n optionsRef.current?.onError?.(result.error)\n mergedConfig.onQueryError?.(result.error)\n onError?.(result.error)\n } else {\n const data = (result.data ?? null) as TResponse | null\n setResponse({ data, error: null })\n setStatus('success')\n optionsRef.current?.onSuccess?.(data as TResponse)\n mergedConfig.onQuerySuccess?.(data)\n\n if (optionsRef.current?.staleTime && data !== null) {\n IgniterCallerClientCache.set(queryKey, data)\n }\n }\n\n optionsRef.current?.onSettled?.(\n result.data ?? null,\n result.error ?? null,\n )\n mergedConfig.onQuerySettled?.(\n result.data ?? null,\n result.error ?? null,\n )\n\n return result\n } catch (error) {\n const typedError = error as IgniterError\n setResponse({ data: null, error: typedError })\n setStatus('error')\n optionsRef.current?.onError?.(typedError)\n mergedConfig.onQueryError?.(typedError)\n onError?.(typedError)\n optionsRef.current?.onSettled?.(null, typedError)\n mergedConfig.onQuerySettled?.(null, typedError)\n } finally {\n setIsFetching(false)\n optionsRef.current?.onLoading?.(false)\n mergedConfig.onQueryLoading?.(false)\n }\n },\n [callerKey, method, path, buildRequest, getMergedConfig, onError],\n )\n\n const refetch = useCallback(() => {\n void execute(lastVariablesRef.current)\n }, [execute])\n\n const invalidateQuery = useCallback(\n (data?: TResponse) => {\n const prefix = buildQueryPrefix({ callerKey, method, path })\n invalidate(prefix, data)\n },\n [callerKey, method, path, invalidate],\n )\n\n useEffect(() => {\n register(stableKey, refetch)\n return () => unregister(stableKey, refetch)\n }, [register, unregister, refetch, stableKey])\n\n const initialFetchDoneRef = useRef(false)\n\n useEffect(() => {\n if (optionsRef.current?.enabled === false) return\n if (optionsRef.current?.refetchOnMount === false && initialFetchDoneRef.current) return\n\n initialFetchDoneRef.current = true\n void execute(lastVariablesRef.current)\n }, [stableKey, execute])\n\n useEffect(() => {\n const interval = optionsRef.current?.refetchInterval\n if (!interval) return\n\n const handler = setInterval(() => {\n if (\n optionsRef.current?.refetchIntervalInBackground === false &&\n typeof document !== 'undefined' &&\n document.hidden\n ) {\n return\n }\n void execute(lastVariablesRef.current)\n }, interval)\n\n return () => clearInterval(handler)\n }, [execute])\n\n useEffect(() => {\n if (optionsRef.current?.refetchOnWindowFocus === false) return\n if (typeof window === 'undefined') return\n\n const handler = () => {\n void execute(lastVariablesRef.current)\n }\n window.addEventListener('focus', handler)\n return () => window.removeEventListener('focus', handler)\n }, [execute])\n\n return {\n data: response.data,\n error: response.error,\n variables,\n isLoading: status === 'loading',\n isFetching,\n isSuccess: status === 'success',\n isError: status === 'error',\n status,\n refetch,\n invalidate: invalidateQuery,\n execute,\n }\n }\n}\n\nexport function createUseMutate<\n TResponse,\n TVariables extends {\n params?: Record<string, string | number | boolean>\n query?: IgniterCallerClientQuery\n body?: unknown\n },\n>(\n params: UseMutateParams<TResponse, TVariables>,\n): (\n options?: IgniterCallerUseMutateOptions<TResponse, TVariables>,\n) => IgniterCallerUseMutateResult<TResponse, TVariables> {\n const {\n callerKey,\n method,\n path,\n buildRequest,\n getMergedConfig,\n onError,\n } = params\n\n return (options) => {\n const [status, setStatus] = useState<'loading' | 'error' | 'success'>(\n 'success',\n )\n const [response, setResponse] = useState<{\n data: TResponse | null\n error: IgniterError | null\n }>({ data: null, error: null })\n const [variables, setVariables] = useState<TVariables | undefined>(\n undefined,\n )\n\n const optionsRef = useRef(options)\n optionsRef.current = options\n const lastVariablesRef = useRef<TVariables | undefined>(undefined)\n\n const mutate = useCallback(\n async (nextVariables?: TVariables) => {\n const mergedConfig = getMergedConfig()\n const mergedInput = mergeMutateInput(\n mergedConfig,\n optionsRef.current as IgniterCallerClientRequestInput | undefined,\n nextVariables as IgniterCallerClientRequestInput | undefined,\n )\n\n lastVariablesRef.current = nextVariables\n setVariables(nextVariables)\n\n setStatus('loading')\n optionsRef.current?.onLoading?.(true)\n mergedConfig.onMutationLoading?.(true)\n\n try {\n const result = await buildRequest(method, path, mergedInput).execute()\n optionsRef.current?.onRequest?.(result)\n if (result.error) {\n setResponse({ data: null, error: result.error })\n setStatus('error')\n optionsRef.current?.onError?.(result.error)\n mergedConfig.onMutationError?.(result.error)\n onError?.(result.error)\n } else {\n const data = (result.data ?? null) as TResponse | null\n setResponse({ data, error: null })\n setStatus('success')\n optionsRef.current?.onSuccess?.(data as TResponse)\n mergedConfig.onMutationSuccess?.(data)\n }\n\n optionsRef.current?.onSettled?.(\n result.data ?? null,\n result.error ?? null,\n )\n mergedConfig.onMutationSettled?.(\n result.data ?? null,\n result.error ?? null,\n )\n\n return result\n } catch (error) {\n const typedError = error as IgniterError\n setResponse({ data: null, error: typedError })\n setStatus('error')\n optionsRef.current?.onError?.(typedError)\n mergedConfig.onMutationError?.(typedError)\n onError?.(typedError)\n optionsRef.current?.onSettled?.(null, typedError)\n mergedConfig.onMutationSettled?.(null, typedError)\n } finally {\n optionsRef.current?.onLoading?.(false)\n mergedConfig.onMutationLoading?.(false)\n }\n },\n [method, path, buildRequest, getMergedConfig, onError],\n )\n\n const retry = useCallback(() => {\n void mutate(lastVariablesRef.current)\n }, [mutate])\n\n return {\n data: response.data,\n error: response.error,\n variables,\n isLoading: status === 'loading',\n isSuccess: status === 'success',\n isError: status === 'error',\n status,\n mutate,\n retry,\n }\n }\n}\n","import type { IgniterCallerManager } from '../../core/manager'\nimport type { IgniterCallerClientContextValue } from '../interfaces/context'\nimport type { IgniterCallerClientRequestInput } from './hooks.builder'\nimport {\n createUseMutate,\n createUseQuery,\n} from './hooks.builder'\nimport type {\n IgniterCallerClient,\n IgniterCallerClientConfigApi,\n} from '../interfaces/client'\nimport { buildQueryPrefix } from '../utils/query-key'\n\nfunction applyRequestInput(\n builder: { params: (params: Record<string, string | number | boolean>) => any; headers: (headers: Record<string, string>) => any; body: (body: unknown) => any },\n input: IgniterCallerClientRequestInput,\n) {\n if (input.query && Object.keys(input.query).length > 0) {\n builder.params(input.query)\n }\n\n if (input.headers && Object.keys(input.headers).length > 0) {\n builder.headers(input.headers)\n }\n\n if (input.body !== undefined) {\n builder.body(input.body)\n }\n}\n\nexport function createIgniterCallerClient<\n TCaller extends IgniterCallerManager<any>,\n TCallers extends Record<string, IgniterCallerManager<any>>,\n>(\n context: IgniterCallerClientContextValue<TCallers>,\n callerKey: keyof TCallers,\n): IgniterCallerClient<TCaller> {\n const caller = context.callers[callerKey] as unknown as TCaller\n\n const getMergedConfig = () => context.getMergedConfig(callerKey)\n\n const buildRequest = (\n method: string,\n path: string,\n input: IgniterCallerClientRequestInput,\n ) => {\n if (!path) {\n throw new Error(\n 'IgniterCallerClient: path is required when using hooks with Caller client.',\n )\n }\n\n const methodKey = method.toLowerCase() as\n | 'get'\n | 'post'\n | 'put'\n | 'patch'\n | 'delete'\n | 'head'\n\n const builder = (caller as any)[methodKey](path)\n applyRequestInput(builder, input)\n return builder as { execute: () => Promise<any> }\n }\n\n const invalidate = (pathOrPaths: string | string[], data?: unknown) => {\n const paths = Array.isArray(pathOrPaths) ? pathOrPaths : [pathOrPaths]\n const prefixes = paths.map((path) =>\n buildQueryPrefix({\n callerKey: String(callerKey),\n method: 'GET',\n path,\n }),\n )\n context.invalidate(prefixes, data)\n }\n\n const config: IgniterCallerClientConfigApi = {\n set: (key, value) => context.setConfig(callerKey, key, value),\n get: (key) => context.getConfig(callerKey, key),\n reset: () => context.setConfigBatch(callerKey, {}),\n }\n\n const get = (path?: string) => {\n const builder = caller.get(path as any)\n const useQuery = createUseQuery({\n callerKey: String(callerKey),\n method: 'GET',\n path: path || '',\n buildRequest,\n register: context.register,\n unregister: context.unregister,\n invalidate: context.invalidate,\n getMergedConfig,\n onError: context.onError,\n })\n ;(builder as any).useQuery = useQuery\n return builder as any\n }\n\n const head = (path?: string) => {\n const builder = caller.head(path as any)\n const useQuery = createUseQuery({\n callerKey: String(callerKey),\n method: 'HEAD',\n path: path || '',\n buildRequest,\n register: context.register,\n unregister: context.unregister,\n invalidate: context.invalidate,\n getMergedConfig,\n onError: context.onError,\n })\n ;(builder as any).useQuery = useQuery\n return builder as any\n }\n\n const post = (path?: string) => {\n const builder = caller.post(path as any)\n const useMutate = createUseMutate({\n callerKey: String(callerKey),\n method: 'POST',\n path: path || '',\n buildRequest,\n getMergedConfig,\n onError: context.onError,\n })\n ;(builder as any).useMutate = useMutate\n return builder as any\n }\n\n const put = (path?: string) => {\n const builder = caller.put(path as any)\n const useMutate = createUseMutate({\n callerKey: String(callerKey),\n method: 'PUT',\n path: path || '',\n buildRequest,\n getMergedConfig,\n onError: context.onError,\n })\n ;(builder as any).useMutate = useMutate\n return builder as any\n }\n\n const patch = (path?: string) => {\n const builder = caller.patch(path as any)\n const useMutate = createUseMutate({\n callerKey: String(callerKey),\n method: 'PATCH',\n path: path || '',\n buildRequest,\n getMergedConfig,\n onError: context.onError,\n })\n ;(builder as any).useMutate = useMutate\n return builder as any\n }\n\n const del = (path?: string) => {\n const builder = caller.delete(path as any)\n const useMutate = createUseMutate({\n callerKey: String(callerKey),\n method: 'DELETE',\n path: path || '',\n buildRequest,\n getMergedConfig,\n onError: context.onError,\n })\n ;(builder as any).useMutate = useMutate\n return builder as any\n }\n\n return {\n raw: caller,\n config,\n invalidate: invalidate as any,\n get: get as any,\n post: post as any,\n put: put as any,\n patch: patch as any,\n delete: del as any,\n head: head as any,\n }\n}\n","'use client'\n\nimport {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState,\n type PropsWithChildren,\n} from 'react'\nimport type { IgniterError } from '@igniter-js/common'\nimport type {\n IgniterCallerClientContextValue,\n IgniterCallerClientConfigs,\n IgniterCallerClientMap,\n IgniterCallerClientRefetchFn,\n} from '../interfaces/context'\nimport type {\n IgniterCallerClientConfig,\n IgniterCallerClientConfigKey,\n IgniterCallerClientConfigValue,\n} from '../interfaces/config'\nimport { IgniterCallerClientCache } from '../utils/cache'\nimport { createIgniterCallerClient } from './client.builder'\nimport type { IgniterCallerClient } from '../interfaces/client'\n\nconst IgniterCallerClientContext = createContext<\n IgniterCallerClientContextValue<any> | undefined\n>(undefined)\n\nexport interface IgniterCallerProviderProps<\n TCallers extends IgniterCallerClientMap,\n> extends PropsWithChildren {\n callers: TCallers\n configs?: IgniterCallerClientConfigs<TCallers>\n hooks?: IgniterCallerClientConfig\n onError?: (error: IgniterError) => void\n}\n\nfunction mergeConfig(\n globalConfig: IgniterCallerClientConfig,\n localConfig?: IgniterCallerClientConfig,\n): IgniterCallerClientConfig {\n return {\n ...globalConfig,\n ...localConfig,\n headers: {\n ...(globalConfig.headers || {}),\n ...(localConfig?.headers || {}),\n },\n cookies: {\n ...(globalConfig.cookies || {}),\n ...(localConfig?.cookies || {}),\n },\n query: {\n ...(globalConfig.query || {}),\n ...(localConfig?.query || {}),\n },\n }\n}\n\nexport function IgniterCallerProvider<\n TCallers extends IgniterCallerClientMap,\n>(props: IgniterCallerProviderProps<TCallers>) {\n const { callers, configs, hooks, onError, children } = props\n const [configState, setConfigState] = useState<\n IgniterCallerClientConfigs<TCallers>\n >(configs || {})\n const [listeners] = useState(\n () => new Map<string, Set<IgniterCallerClientRefetchFn>>(),\n )\n\n const globalConfig = useMemo<IgniterCallerClientConfig>(\n () => hooks || {},\n [hooks],\n )\n\n const register = useCallback(\n (key: string, refetch: IgniterCallerClientRefetchFn) => {\n const current = listeners.get(key) || new Set()\n current.add(refetch)\n listeners.set(key, current)\n },\n [listeners],\n )\n\n const unregister = useCallback(\n (key: string, refetch: IgniterCallerClientRefetchFn) => {\n const current = listeners.get(key)\n if (!current) return\n current.delete(refetch)\n if (current.size === 0) {\n listeners.delete(key)\n }\n },\n [listeners],\n )\n\n const invalidate = useCallback(\n (keys: string | string[], data?: unknown) => {\n const keysArray = Array.isArray(keys) ? keys : [keys]\n\n keysArray.forEach((prefix) => {\n if (data !== undefined) {\n IgniterCallerClientCache.replacePrefix(prefix, data)\n } else {\n IgniterCallerClientCache.clearPrefix(prefix)\n }\n\n listeners.forEach((refetchFns, registeredKey) => {\n if (registeredKey.startsWith(prefix)) {\n refetchFns.forEach((refetch) => refetch(true))\n }\n })\n })\n },\n [listeners],\n )\n\n const setConfig = useCallback(\n <TKey extends IgniterCallerClientConfigKey>(\n callerKey: keyof TCallers,\n key: TKey,\n value: IgniterCallerClientConfigValue<TKey>,\n ) => {\n setConfigState((prev) => ({\n ...prev,\n [callerKey]: {\n ...(prev[callerKey] || {}),\n [key]: value,\n },\n }))\n },\n [],\n )\n\n const setConfigBatch = useCallback(\n (callerKey: keyof TCallers, config: Partial<IgniterCallerClientConfig>) => {\n setConfigState((prev) => ({\n ...prev,\n [callerKey]: {\n ...(prev[callerKey] || {}),\n ...config,\n },\n }))\n },\n [],\n )\n\n const configStateRef = useMemo(() => ({ current: configState }), [])\n configStateRef.current = configState\n\n const globalConfigRef = useMemo(() => ({ current: globalConfig }), [])\n globalConfigRef.current = globalConfig\n\n const getMergedConfig = useCallback(\n (callerKey: keyof TCallers) =>\n mergeConfig(globalConfigRef.current, configStateRef.current[callerKey]),\n [globalConfigRef, configStateRef],\n )\n\n const getConfig = useCallback(\n <TKey extends IgniterCallerClientConfigKey>(\n callerKey: keyof TCallers,\n key: TKey,\n ) => getMergedConfig(callerKey)[key],\n [getMergedConfig],\n )\n\n const value = useMemo<IgniterCallerClientContextValue<TCallers>>(\n () => ({\n callers,\n configs: configState,\n globalConfig,\n setConfig,\n setConfigBatch,\n getConfig,\n getMergedConfig,\n register,\n unregister,\n invalidate,\n listeners,\n onError,\n }),\n [\n callers,\n getConfig,\n getMergedConfig,\n invalidate,\n listeners,\n onError,\n register,\n setConfig,\n setConfigBatch,\n unregister,\n ],\n )\n\n return (\n <IgniterCallerClientContext.Provider value={value}>\n {children}\n </IgniterCallerClientContext.Provider>\n )\n}\n\nexport function useIgniterCallerContext<\n TCallers extends IgniterCallerClientMap,\n>() {\n const context = useContext(\n IgniterCallerClientContext,\n ) as IgniterCallerClientContextValue<TCallers> | undefined\n\n if (!context) {\n throw new Error(\n 'IgniterCallerProvider is missing. Wrap your app with <IgniterCallerProvider>.',\n )\n }\n\n return context\n}\n\nexport function useIgniterCaller<TCallers extends IgniterCallerClientMap>() {\n const context = useIgniterCallerContext<TCallers>()\n\n return <TKey extends keyof TCallers>(\n callerKey: TKey,\n ): IgniterCallerClient<TCallers[TKey]> =>\n createIgniterCallerClient<TCallers[TKey], TCallers>(context, callerKey)\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@igniter-js/caller",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.55",
|
|
4
4
|
"description": "Type-safe HTTP client for Igniter.js with interceptors, retries, caching, and StandardSchema validation",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -68,25 +68,24 @@
|
|
|
68
68
|
},
|
|
69
69
|
"homepage": "https://igniterjs.com",
|
|
70
70
|
"dependencies": {
|
|
71
|
-
"@igniter-js/common": ">=0.1.0"
|
|
72
|
-
"@igniter-js/telemetry": ">=0.1.12"
|
|
71
|
+
"@igniter-js/common": ">=0.1.0"
|
|
73
72
|
},
|
|
74
73
|
"devDependencies": {
|
|
75
74
|
"@igniter-js/common": "*",
|
|
76
75
|
"@igniter-js/telemetry": "*",
|
|
77
76
|
"@types/node": "^22.7.5",
|
|
77
|
+
"@types/react": "^18.3.12",
|
|
78
|
+
"react": "^18.3.1",
|
|
78
79
|
"tsup": "^8.3.0",
|
|
79
80
|
"typescript": "^5.6.3",
|
|
80
81
|
"vitest": "^2.1.4",
|
|
81
|
-
"zod": "^4.2.1"
|
|
82
|
-
"@types/react": "^18.3.12",
|
|
83
|
-
"react": "^18.3.1"
|
|
82
|
+
"zod": "^4.2.1"
|
|
84
83
|
},
|
|
85
84
|
"peerDependencies": {
|
|
86
85
|
"@igniter-js/common": ">=0.1.0",
|
|
87
86
|
"@igniter-js/telemetry": ">=0.1.12",
|
|
88
|
-
"
|
|
89
|
-
"
|
|
87
|
+
"react": ">=18.0.0",
|
|
88
|
+
"zod": ">=4.2.1"
|
|
90
89
|
},
|
|
91
90
|
"peerDependenciesMeta": {
|
|
92
91
|
"zod": {
|