{"version":3,"sources":["../src/constants.ts","../src/errors.ts","../src/utils.ts","../src/context.tsx","../src/swrkit.ts","../src/subscription.ts","../src/middleware.ts","../src/testing.ts"],"names":["DEFAULT_TIMEOUT","DEFAULT_HEADERS","DEFAULT_AUTH_CONFIG","DEFAULT_SWR_CONFIG","DEFAULT_SWRKIT_CONFIG","METHODS_WITH_BODY","READ_METHODS","WRITE_METHODS","SWRKitError","_SWRKitError","message","problem","response","SWRKitClientError","PROBLEM_CODE","SWRKitServerError","SWRKitNetworkError","SWRKitConnectionError","SWRKitTimeoutError","SWRKitCancelError","createErrorFromResponse","buildCacheKey","key","params","url","sortedParams","k","extractUrlFromKey","applyRequestTransforms","config","transforms","transform","applyResponseTransforms","notifyMonitors","monitors","monitor","error","shouldHaveBody","method","normalizeResponse","data","duration","headersToObject","classifyProblem","normalizeErrorResponse","status","createFetcher","baseURL","defaultHeaders","defaultTimeout","requestTransforms","responseTransforms","startTime","fullUrl","buildUrl","headers","mergeHeaders","body","prepareRequestBody","fetchConfig","fetchWithTimeout","parseResponseBody","swrKitResponse","mergeConfigs","configs","merged","extractResponseFromError","SWRKitContext","createContext","SWRKitProvider","userConfig","children","getAccessToken","authTransform","React","authConfig","token","authHeader","authValue","setConfig","fetcher","useMemo","addRequestTransform","prev","addResponseTransform","addMonitor","setHeader","name","value","newHeaders","existingIndex","setHeaders","deleteHeader","setBaseURL","contextValue","jsx","SWRConfig","useSWRKitContext","context","useContext","useSWRKitConfig","useSWRKitFetcher","useSWRKitCache","cache","mutate","useSWRConfig","useSWRKitPreload","useCallback","cacheKey","wrappedFetcher","globalMutate","useSWRKitMutate","shouldRevalidate","useFetch","options","contextFetcher","swrConfig","requestConfig","skip","fallbackData","keepPreviousData","suspense","revalidateIfStale","revalidateOnMount","refreshInterval","refreshWhenHidden","refreshWhenOffline","shouldRetryOnError","errorRetryInterval","errorRetryCount","onErrorRetry","compare","isPaused","use","loadingTimeout","onLoadingSlow","onSuccess","onError","onDiscarded","resolvedKey","stableRequestConfig","fetchKey","finalSWRConfig","isValidating","isLoading","useSWR","responseData","useMutation","invalidateKeys","optimisticData","populateCache","rollbackOnError","revalidate","throwOnError","swrMutationFetcher","_key","arg","trigger","isMutating","reset","useSWRMutation","err","variables","overrideConfig","mergedConfig","useInfiniteScroll","getKey","pageSize","size","setSize","useSWRInfinite","hasMore","lastPage","items","loadMore","isLoadingMore","refresh","preload","useSubscription","subscribe","useSWRSubscription","laggyMiddleware","useSWRNext","laggyDataRef","useRef","swr","useEffect","isLagging","loggerMiddleware","logRequests","logResponses","logErrors","prefix","timingMiddleware","threshold","onSlowRequest","startTimeRef","args","result","retryMiddleware","maxRetries","baseDelay","maxDelay","opts","retryCount","delay","localStorageMiddleware","ttl","swrKey","cached","parsed","dedupeMiddleware","interval","conditionalMiddleware","shouldFetch","createTestCache","SWRKitTestProvider","createMockFetcher","responses","resolve","createDelayedMockFetcher","baseFetcher","createTrackingMockFetcher","requests","createFailingMockFetcher","successData","failAfter","requestCount","createStatusMockFetcher","isOk"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { SWRConfiguration } from 'swr';\nimport type { SWRKitConfig } from './types';\n\n/**\n * Default timeout in milliseconds (10 seconds)\n */\nexport const DEFAULT_TIMEOUT = 10000;\n\n/**\n * Default headers\n */\nexport const DEFAULT_HEADERS = {\n  'Content-Type': 'application/json',\n  Accept: 'application/json',\n} as const;\n\n/**\n * Default authentication configuration\n */\nexport const DEFAULT_AUTH_CONFIG = {\n  /**\n   * Cookie name for access token\n   */\n  accessTokenCookie: 'access_token',\n\n  /**\n   * Header name for authorization\n   */\n  authHeader: 'Authorization',\n\n  /**\n   * Token prefix (e.g., 'Bearer')\n   */\n  tokenPrefix: 'Bearer',\n\n  /**\n   * Whether to automatically add auth token from cookies\n   */\n  autoAuth: true,\n} as const;\n\n/**\n * Default SWR configuration\n */\nexport const DEFAULT_SWR_CONFIG: SWRConfiguration = {\n  // Revalidate on window focus (default: true)\n  revalidateOnFocus: true,\n\n  // Revalidate on network reconnection (default: true)\n  revalidateOnReconnect: true,\n\n  // Dedupe requests with same key within this time window (default: 2000ms)\n  dedupingInterval: 2000,\n\n  // Cache time-to-live (default: 5 minutes)\n  focusThrottleInterval: 5000,\n\n  // Retry on error\n  shouldRetryOnError: true,\n\n  // Error retry count\n  errorRetryCount: 3,\n\n  // Error retry interval\n  errorRetryInterval: 5000,\n\n  // Keep previous data while revalidating\n  keepPreviousData: false,\n};\n\n/**\n * Default SWRKit configuration\n */\nexport const DEFAULT_SWRKIT_CONFIG: SWRKitConfig = {\n  headers: DEFAULT_HEADERS,\n  timeout: DEFAULT_TIMEOUT,\n  swr: DEFAULT_SWR_CONFIG,\n  requestTransforms: [],\n  responseTransforms: [],\n  monitors: [],\n};\n\n/**\n * HTTP methods that should have a body\n */\nexport const METHODS_WITH_BODY = ['POST', 'PUT', 'PATCH'] as const;\n\n/**\n * HTTP methods for read operations\n */\nexport const READ_METHODS = ['GET', 'HEAD'] as const;\n\n/**\n * HTTP methods for write operations\n */\nexport const WRITE_METHODS = ['POST', 'PUT', 'PATCH', 'DELETE'] as const;\n","import type { SWRKitResponse } from './types';\nimport { PROBLEM_CODE } from '@mshindi-labs/refetch';\n\n/**\n * Base error class for SWRKit errors\n */\nexport class SWRKitError extends Error {\n  public readonly response?: SWRKitResponse<any>;\n  public readonly problem: PROBLEM_CODE;\n  public readonly status?: number;\n\n  constructor(\n    message: string,\n    problem: PROBLEM_CODE,\n    response?: SWRKitResponse<any>,\n  ) {\n    super(message);\n    this.name = 'SWRKitError';\n    this.problem = problem;\n    this.response = response;\n    this.status = response?.status;\n\n    // Maintains proper stack trace for where our error was thrown (only available on V8)\n    if (Error.captureStackTrace) {\n      Error.captureStackTrace(this, SWRKitError);\n    }\n  }\n}\n\n/**\n * Client error (4xx status codes)\n */\nexport class SWRKitClientError extends SWRKitError {\n  constructor(message: string, response?: SWRKitResponse<any>) {\n    super(message, PROBLEM_CODE.CLIENT_ERROR, response);\n    this.name = 'SWRKitClientError';\n  }\n}\n\n/**\n * Server error (5xx status codes)\n */\nexport class SWRKitServerError extends SWRKitError {\n  constructor(message: string, response?: SWRKitResponse<any>) {\n    super(message, PROBLEM_CODE.SERVER_ERROR, response);\n    this.name = 'SWRKitServerError';\n  }\n}\n\n/**\n * Network error (no connection, DNS failure, etc.)\n */\nexport class SWRKitNetworkError extends SWRKitError {\n  constructor(message: string, response?: SWRKitResponse<any>) {\n    super(message, PROBLEM_CODE.NETWORK_ERROR, response);\n    this.name = 'SWRKitNetworkError';\n  }\n}\n\n/**\n * Connection error (cannot connect to server)\n */\nexport class SWRKitConnectionError extends SWRKitError {\n  constructor(message: string, response?: SWRKitResponse<any>) {\n    super(message, PROBLEM_CODE.CONNECTION_ERROR, response);\n    this.name = 'SWRKitConnectionError';\n  }\n}\n\n/**\n * Timeout error (request exceeded timeout)\n */\nexport class SWRKitTimeoutError extends SWRKitError {\n  constructor(message: string, response?: SWRKitResponse<any>) {\n    super(message, PROBLEM_CODE.TIMEOUT_ERROR, response);\n    this.name = 'SWRKitTimeoutError';\n  }\n}\n\n/**\n * Cancel error (request was cancelled)\n */\nexport class SWRKitCancelError extends SWRKitError {\n  constructor(message: string, response?: SWRKitResponse<any>) {\n    super(message, PROBLEM_CODE.CANCEL_ERROR, response);\n    this.name = 'SWRKitCancelError';\n  }\n}\n\n/**\n * Create appropriate error instance based on problem code\n */\nexport function createErrorFromResponse<T>(\n  response: SWRKitResponse<T>,\n): SWRKitError {\n  const message =\n    response.originalError?.message ||\n    `Request failed with status ${response.status}`;\n\n  switch (response.problem) {\n    case PROBLEM_CODE.CLIENT_ERROR:\n      return new SWRKitClientError(message, response);\n    case PROBLEM_CODE.SERVER_ERROR:\n      return new SWRKitServerError(message, response);\n    case PROBLEM_CODE.NETWORK_ERROR:\n      return new SWRKitNetworkError(message, response);\n    case PROBLEM_CODE.CONNECTION_ERROR:\n      return new SWRKitConnectionError(message, response);\n    case PROBLEM_CODE.TIMEOUT_ERROR:\n      return new SWRKitTimeoutError(message, response);\n    case PROBLEM_CODE.CANCEL_ERROR:\n      return new SWRKitCancelError(message, response);\n    default:\n      return new SWRKitError(message, PROBLEM_CODE.UNKNOWN_ERROR, response);\n  }\n}\n","import {\n  type SWRKitResponse,\n  type SWRKitRequestConfig,\n  type RequestTransform,\n  type AsyncRequestTransform,\n  type ResponseTransform,\n  type AsyncResponseTransform,\n  type Monitor,\n  type CacheKey,\n} from './types';\nimport {\n  PROBLEM_CODE,\n  classifyProblem,\n  buildUrl,\n  mergeHeaders,\n  headersToObject,\n  fetchWithTimeout,\n  parseResponseBody,\n  prepareRequestBody,\n} from '@mshindi-labs/refetch';\n\nimport { METHODS_WITH_BODY, DEFAULT_TIMEOUT } from './constants';\nimport { createErrorFromResponse } from './errors';\n\n/**\n * Build a cache key for SWR\n * Supports strings, arrays, and objects (SWR will serialize them)\n */\nexport function buildCacheKey(\n  key: CacheKey,\n  params?: Record<string, any>,\n): CacheKey {\n  // Null or undefined - no fetching\n  if (key === null || key === undefined) {\n    return null;\n  }\n\n  // If it's already an array or object, let SWR handle serialization\n  if (Array.isArray(key)) {\n    return key;\n  }\n\n  if (typeof key === 'object' && !(key instanceof String)) {\n    return key;\n  }\n\n  // String URL - add params if provided\n  const url = key as string;\n\n  if (params && Object.keys(params).length > 0) {\n    const sortedParams = Object.keys(params)\n      .sort()\n      .map((k) => `${k}=${JSON.stringify(params[k])}`)\n      .join('&');\n    return `${url}?${sortedParams}`;\n  }\n\n  return url;\n}\n\n/**\n * Extract URL from cache key (handles strings, arrays, objects)\n */\nexport function extractUrlFromKey(key: CacheKey): string | null {\n  if (!key) return null;\n\n  if (typeof key === 'string') {\n    return key;\n  }\n\n  if (Array.isArray(key) && key.length > 0) {\n    return String(key[0]);\n  }\n\n  if (typeof key === 'object' && 'url' in key) {\n    return String(key.url);\n  }\n\n  return null;\n}\n\n/**\n * Apply request transforms\n */\nexport async function applyRequestTransforms(\n  config: SWRKitRequestConfig,\n  transforms: Array<RequestTransform | AsyncRequestTransform>,\n): Promise<void> {\n  for (const transform of transforms) {\n    await transform(config);\n  }\n}\n\n/**\n * Apply response transforms\n */\nexport async function applyResponseTransforms<T>(\n  response: SWRKitResponse<T>,\n  transforms: Array<ResponseTransform | AsyncResponseTransform>,\n): Promise<void> {\n  for (const transform of transforms) {\n    await transform(response);\n  }\n}\n\n/**\n * Notify monitors\n */\nexport function notifyMonitors<T>(\n  response: SWRKitResponse<T>,\n  monitors: Monitor[],\n): void {\n  monitors.forEach((monitor) => {\n    try {\n      monitor(response);\n    } catch (error) {\n      console.error('Monitor error:', error);\n    }\n  });\n}\n\n/**\n * Check if method should have a body\n */\nexport function shouldHaveBody(method: string): boolean {\n  return METHODS_WITH_BODY.includes(\n    method.toUpperCase() as (typeof METHODS_WITH_BODY)[number],\n  );\n}\n\n/**\n * Normalize response to SWRKit format\n */\nexport function normalizeResponse<T>(\n  data: T,\n  response: Response,\n  duration: number,\n): SWRKitResponse<T> {\n  const isOk = response.ok;\n\n  if (isOk) {\n    return {\n      ok: true,\n      problem: null,\n      originalError: null,\n      data,\n      status: response.status,\n      headers: headersToObject(response.headers),\n      duration,\n    };\n  } else {\n    const error = new Error(\n      `HTTP Error ${response.status}: ${response.statusText}`,\n    );\n    return {\n      ok: false,\n      problem: classifyProblem(response.status),\n      originalError: error,\n      data,\n      status: response.status,\n      headers: headersToObject(response.headers),\n      duration,\n    };\n  }\n}\n\n/**\n * Normalize error response\n */\nexport function normalizeErrorResponse<T>(\n  error: Error,\n  response?: Response,\n  duration?: number,\n): SWRKitResponse<T> {\n  const status = response?.status;\n  const problem = classifyProblem(status, error);\n\n  return {\n    ok: false,\n    problem,\n    originalError: error,\n    data: undefined,\n    status,\n    headers: response ? headersToObject(response.headers) : undefined,\n    duration,\n  };\n}\n\n/**\n * Create a fetcher function with configuration\n */\nexport function createFetcher(\n  baseURL?: string,\n  defaultHeaders?: HeadersInit,\n  defaultTimeout?: number,\n  requestTransforms?: Array<RequestTransform | AsyncRequestTransform>,\n  responseTransforms?: Array<ResponseTransform | AsyncResponseTransform>,\n  monitors?: Monitor[],\n) {\n  return async function fetcher<T = any>(\n    config: SWRKitRequestConfig,\n  ): Promise<SWRKitResponse<T>> {\n    const startTime = Date.now();\n\n    try {\n      // Apply request transforms\n      if (requestTransforms && requestTransforms.length > 0) {\n        await applyRequestTransforms(config, requestTransforms);\n      }\n\n      // Build URL\n      const fullUrl = buildUrl(baseURL, config.url || '', config.params);\n\n      // Merge headers\n      const headers = mergeHeaders(defaultHeaders, config.headers);\n\n      // Prepare body\n      const method = config.method?.toUpperCase() || 'GET';\n      const body = shouldHaveBody(method)\n        ? prepareRequestBody(config.data)\n        : undefined;\n\n      // Make request\n      const fetchConfig: RequestInit & { timeout?: number } = {\n        method,\n        headers,\n        body,\n        timeout: config.timeout || defaultTimeout || DEFAULT_TIMEOUT,\n        ...config.options,\n      };\n\n      const response = await fetchWithTimeout(fullUrl, fetchConfig);\n      const duration = Date.now() - startTime;\n\n      // Parse response\n      const data = await parseResponseBody<T>(response);\n\n      // Normalize response\n      let swrKitResponse = normalizeResponse(data as T, response, duration);\n\n      // Apply response transforms\n      if (responseTransforms && responseTransforms.length > 0) {\n        await applyResponseTransforms(swrKitResponse, responseTransforms);\n      }\n\n      // Notify monitors\n      if (monitors && monitors.length > 0) {\n        notifyMonitors(swrKitResponse, monitors);\n      }\n\n      // Throw error if not ok (for SWR error handling)\n      if (!swrKitResponse.ok) {\n        const error = createErrorFromResponse(swrKitResponse);\n        throw error;\n      }\n\n      return swrKitResponse;\n    } catch (error) {\n      const duration = Date.now() - startTime;\n      const swrKitResponse = normalizeErrorResponse<T>(\n        error as Error,\n        undefined,\n        duration,\n      );\n\n      // Apply response transforms even for errors\n      if (responseTransforms && responseTransforms.length > 0) {\n        await applyResponseTransforms(swrKitResponse, responseTransforms);\n      }\n\n      // Notify monitors\n      if (monitors && monitors.length > 0) {\n        notifyMonitors(swrKitResponse, monitors);\n      }\n\n      // Create typed error\n      const typedError = createErrorFromResponse(swrKitResponse);\n      throw typedError;\n    }\n  };\n}\n\n/**\n * Merge configurations\n */\nexport function mergeConfigs(\n  ...configs: (SWRKitRequestConfig | undefined)[]\n): SWRKitRequestConfig {\n  const merged: SWRKitRequestConfig = {};\n\n  for (const config of configs) {\n    if (!config) continue;\n\n    Object.assign(merged, config);\n\n    // Merge headers specifically\n    if (config.headers) {\n      merged.headers = mergeHeaders(merged.headers, config.headers);\n    }\n\n    // Merge params specifically\n    if (config.params) {\n      merged.params = { ...merged.params, ...config.params };\n    }\n  }\n\n  return merged;\n}\n\n/**\n * Extract response data from SWR error\n */\nexport function extractResponseFromError(\n  error: any,\n): SWRKitResponse<any> | null {\n  return error?.response || null;\n}\n\n// Re-export utilities from refetch for convenience\nexport {\n  buildUrl,\n  mergeHeaders,\n  headersToObject,\n  classifyProblem,\n  PROBLEM_CODE,\n};\n","'use client';\n\nimport React, { createContext, useContext, useMemo, useCallback } from 'react';\nimport { SWRConfig, useSWRConfig } from 'swr';\nimport { mutate as globalMutate } from 'swr';\nimport type {\n  SWRKitConfig,\n  Fetcher,\n  RequestTransform,\n  AsyncRequestTransform,\n  ResponseTransform,\n  AsyncResponseTransform,\n  Monitor,\n  CacheKey,\n} from './types';\nimport { DEFAULT_SWRKIT_CONFIG, DEFAULT_AUTH_CONFIG } from './constants';\nimport { createFetcher, buildCacheKey, extractUrlFromKey } from './utils';\n\n/**\n * SWRKit context value\n */\ninterface SWRKitContextValue {\n  config: SWRKitConfig;\n  fetcher: Fetcher;\n  addRequestTransform: (\n    transform: RequestTransform | AsyncRequestTransform,\n  ) => void;\n  addResponseTransform: (\n    transform: ResponseTransform | AsyncResponseTransform,\n  ) => void;\n  addMonitor: (monitor: Monitor) => void;\n  setHeader: (name: string, value: string) => void;\n  setHeaders: (headers: Record<string, string>) => void;\n  deleteHeader: (name: string) => void;\n  setBaseURL: (baseURL: string) => void;\n}\n\n/**\n * SWRKit context\n */\nconst SWRKitContext = createContext<SWRKitContextValue | null>(null);\n\n/**\n * SWRKit provider props\n */\ninterface SWRKitProviderProps {\n  config?: SWRKitConfig;\n  children: React.ReactNode;\n  getAccessToken?: (cookieName?: string) => string | null;\n}\n\n/**\n * SWRKit provider component\n */\nexport function SWRKitProvider({\n  config: userConfig,\n  children,\n  getAccessToken,\n}: SWRKitProviderProps) {\n  // Create auth request transform\n  const authTransform: RequestTransform = React.useCallback(\n    (config) => {\n      const authConfig = {\n        ...DEFAULT_AUTH_CONFIG,\n        ...userConfig?.auth,\n      };\n\n      // Only add auth if autoAuth is enabled\n      if (authConfig.autoAuth !== false && getAccessToken) {\n        const token = getAccessToken(authConfig.accessTokenCookie);\n\n        if (token) {\n          const authHeader = authConfig.authHeader || 'Authorization';\n          const tokenPrefix = authConfig.tokenPrefix || 'Bearer';\n          const authValue = `${tokenPrefix} ${token}`;\n\n          // Add authorization header\n          if (!config.headers) {\n            config.headers = {};\n          }\n\n          if (config.headers instanceof Headers) {\n            config.headers.set(authHeader, authValue);\n          } else if (Array.isArray(config.headers)) {\n            // Check if header already exists\n            const existingIndex = config.headers.findIndex(\n              ([key]) => key.toLowerCase() === authHeader.toLowerCase(),\n            );\n            if (existingIndex === -1) {\n              config.headers.push([authHeader, authValue]);\n            }\n          } else {\n            // Only add if not already present\n            if (!config.headers[authHeader]) {\n              config.headers[authHeader] = authValue;\n            }\n          }\n        }\n      }\n    },\n    [userConfig?.auth],\n  );\n\n  // Merge user config with defaults\n  const [config, setConfig] = React.useState<SWRKitConfig>(() => ({\n    ...DEFAULT_SWRKIT_CONFIG,\n    ...userConfig,\n    headers: { ...DEFAULT_SWRKIT_CONFIG.headers, ...userConfig?.headers },\n    auth: { ...DEFAULT_AUTH_CONFIG, ...userConfig?.auth },\n    swr: { ...DEFAULT_SWRKIT_CONFIG.swr, ...userConfig?.swr },\n    requestTransforms: [\n      // Add auth transform first\n      authTransform,\n      ...(DEFAULT_SWRKIT_CONFIG.requestTransforms || []),\n      ...(userConfig?.requestTransforms || []),\n    ],\n    responseTransforms: [\n      ...(DEFAULT_SWRKIT_CONFIG.responseTransforms || []),\n      ...(userConfig?.responseTransforms || []),\n    ],\n    monitors: [\n      ...(DEFAULT_SWRKIT_CONFIG.monitors || []),\n      ...(userConfig?.monitors || []),\n    ],\n  }));\n\n  // Create fetcher\n  const fetcher = useMemo(\n    () =>\n      config.fetcher ||\n      createFetcher(\n        config.baseURL,\n        config.headers,\n        config.timeout,\n        config.requestTransforms,\n        config.responseTransforms,\n        config.monitors,\n      ),\n    [\n      config.fetcher,\n      config.baseURL,\n      config.headers,\n      config.timeout,\n      config.requestTransforms,\n      config.responseTransforms,\n      config.monitors,\n    ],\n  );\n\n  // Helper functions to update config\n  const addRequestTransform = React.useCallback(\n    (transform: RequestTransform | AsyncRequestTransform) => {\n      setConfig((prev) => ({\n        ...prev,\n        requestTransforms: [...(prev.requestTransforms || []), transform],\n      }));\n    },\n    [],\n  );\n\n  const addResponseTransform = React.useCallback(\n    (transform: ResponseTransform | AsyncResponseTransform) => {\n      setConfig((prev) => ({\n        ...prev,\n        responseTransforms: [...(prev.responseTransforms || []), transform],\n      }));\n    },\n    [],\n  );\n\n  const addMonitor = React.useCallback((monitor: Monitor) => {\n    setConfig((prev) => ({\n      ...prev,\n      monitors: [...(prev.monitors || []), monitor],\n    }));\n  }, []);\n\n  const setHeader = React.useCallback((name: string, value: string) => {\n    setConfig((prev) => {\n      const headers = prev.headers || {};\n      if (headers instanceof Headers) {\n        headers.set(name, value);\n        return { ...prev, headers };\n      } else if (Array.isArray(headers)) {\n        const newHeaders = [...headers];\n        const existingIndex = newHeaders.findIndex(\n          ([key]) => key.toLowerCase() === name.toLowerCase(),\n        );\n        if (existingIndex !== -1) {\n          newHeaders[existingIndex] = [name, value];\n        } else {\n          newHeaders.push([name, value]);\n        }\n        return { ...prev, headers: newHeaders };\n      } else {\n        return { ...prev, headers: { ...headers, [name]: value } };\n      }\n    });\n  }, []);\n\n  const setHeaders = React.useCallback(\n    (headers: Record<string, string>) => {\n      Object.entries(headers).forEach(([name, value]) => {\n        setHeader(name, value);\n      });\n    },\n    [setHeader],\n  );\n\n  const deleteHeader = React.useCallback((name: string) => {\n    setConfig((prev) => {\n      const headers = prev.headers;\n      if (!headers) return prev;\n\n      if (headers instanceof Headers) {\n        headers.delete(name);\n        return { ...prev, headers };\n      } else if (Array.isArray(headers)) {\n        return {\n          ...prev,\n          headers: headers.filter(\n            ([key]) => key.toLowerCase() !== name.toLowerCase(),\n          ),\n        };\n      } else {\n        const newHeaders = { ...headers };\n        delete newHeaders[name];\n        return { ...prev, headers: newHeaders };\n      }\n    });\n  }, []);\n\n  const setBaseURL = React.useCallback((baseURL: string) => {\n    setConfig((prev) => ({ ...prev, baseURL }));\n  }, []);\n\n  const contextValue = useMemo<SWRKitContextValue>(\n    () => ({\n      config,\n      fetcher,\n      addRequestTransform,\n      addResponseTransform,\n      addMonitor,\n      setHeader,\n      setHeaders,\n      deleteHeader,\n      setBaseURL,\n    }),\n    [\n      config,\n      fetcher,\n      addRequestTransform,\n      addResponseTransform,\n      addMonitor,\n      setHeader,\n      setHeaders,\n      deleteHeader,\n      setBaseURL,\n    ],\n  );\n\n  return (\n    <SWRKitContext.Provider value={contextValue}>\n      <SWRConfig value={config.swr || {}}>{children}</SWRConfig>\n    </SWRKitContext.Provider>\n  );\n}\n\n/**\n * Hook to access SWRKit context\n */\nexport function useSWRKitContext(): SWRKitContextValue {\n  const context = useContext(SWRKitContext);\n\n  if (!context) {\n    throw new Error('useSWRKitContext must be used within a SWRKitProvider');\n  }\n\n  return context;\n}\n\n/**\n * Hook to access SWRKit config\n */\nexport function useSWRKitConfig(): SWRKitConfig {\n  const { config } = useSWRKitContext();\n  return config;\n}\n\n/**\n * Hook to access SWRKit fetcher\n */\nexport function useSWRKitFetcher(): Fetcher {\n  const { fetcher } = useSWRKitContext();\n  return fetcher;\n}\n\n/**\n * Hook to access SWR cache and mutate function\n *\n * @example\n * const { cache, mutate } = useSWRKitCache();\n * // Access cache entries\n * for (const key of cache.keys()) {\n *   console.log(key, cache.get(key));\n * }\n */\nexport function useSWRKitCache() {\n  const { cache, mutate } = useSWRConfig();\n  return { cache, mutate };\n}\n\n/**\n * Hook for preloading data with automatic fetcher integration\n *\n * @example\n * function ProductCard() {\n *   const preload = useSWRKitPreload();\n *\n *   return (\n *     <Link\n *       href=\"/product/123\"\n *       onMouseEnter={() => preload('/api/product/123')}\n *     >\n *       View Product\n *     </Link>\n *   );\n * }\n */\nexport function useSWRKitPreload() {\n  const { fetcher } = useSWRKitContext();\n\n  return useCallback(\n    async <T = any>(key: CacheKey, params?: Record<string, any>) => {\n      const cacheKey = buildCacheKey(key, params);\n      if (!cacheKey) return;\n\n      const url = extractUrlFromKey(cacheKey);\n      if (!url) return;\n\n      const wrappedFetcher = async () => {\n        const response = await fetcher<T>({\n          url,\n          method: 'GET',\n          params,\n        });\n\n        if (!response.ok) throw response.originalError;\n        return response.data;\n      };\n\n      try {\n        const data = await wrappedFetcher();\n        if (data) {\n          await globalMutate(cacheKey, data, false);\n        }\n      } catch (error) {\n        // Silently fail for preload\n        console.debug('Preload failed for', key, error);\n      }\n    },\n    [fetcher],\n  );\n}\n\n/**\n * Hook for imperative cache mutation with bound fetcher context\n *\n * @example\n * const mutateCache = useSWRKitMutate();\n * // Update cache\n * await mutateCache('/api/user', updatedUser);\n * // Invalidate cache\n * await mutateCache('/api/user');\n */\nexport function useSWRKitMutate() {\n  const { mutate } = useSWRConfig();\n\n  return useCallback(\n    async <T = any>(\n      key: CacheKey,\n      data?: T | Promise<T> | ((currentData?: T) => T | Promise<T>),\n      shouldRevalidate = true,\n    ) => {\n      return mutate(key, data, shouldRevalidate);\n    },\n    [mutate],\n  );\n}\n","'use client';\n\nimport { useCallback, useMemo } from 'react';\nimport useSWR from 'swr';\nimport useSWRMutation from 'swr/mutation';\nimport useSWRInfinite from 'swr/infinite';\nimport { mutate as globalMutate } from 'swr';\nimport type {\n  UseFetchOptions,\n  UseFetchReturn,\n  UseMutationOptions,\n  UseMutationReturn,\n  UseInfiniteScrollOptions,\n  UseInfiniteScrollReturn,\n  SWRKitRequestConfig,\n  SWRKitResponse,\n  CacheKey,\n} from './types';\nimport { useSWRKitContext } from './context';\nimport {\n  buildCacheKey,\n  mergeConfigs,\n  extractResponseFromError,\n  extractUrlFromKey,\n} from './utils';\n\n/**\n * Main hook for GET requests with SWR\n *\n * @template T - The expected data type\n *\n * @param key - Cache key (URL, array, or object)\n * @param options - Configuration options\n *\n * @returns Object containing data, loading state, error, and mutate function\n *\n * @example\n * // Simple fetch\n * const { data, isLoading } = useFetch<User>('/api/user/123');\n *\n * @example\n * // With query parameters\n * const { data } = useFetch('/api/users', {\n *   params: { page: 1, limit: 10 },\n * });\n *\n * @example\n * // Multiple arguments (for dynamic fetching)\n * const { data } = useFetch(['/api/user', userId, token]);\n *\n * @example\n * // Conditional fetching\n * const { data } = useFetch(userId ? `/api/user/${userId}` : null);\n *\n * @example\n * // With polling\n * const { data } = useFetch('/api/stats', {\n *   refreshInterval: 5000, // Poll every 5 seconds\n * });\n */\nexport function useFetch<T = any>(\n  key: CacheKey | (() => CacheKey),\n  options: UseFetchOptions<T> = {},\n): UseFetchReturn<T> {\n  const { fetcher: contextFetcher } = useSWRKitContext();\n  const {\n    swr: swrConfig,\n    request: requestConfig,\n    params,\n    skip,\n    // Extract convenience options\n    fallbackData,\n    keepPreviousData,\n    suspense,\n    revalidateIfStale,\n    revalidateOnMount,\n    refreshInterval,\n    refreshWhenHidden,\n    refreshWhenOffline,\n    shouldRetryOnError,\n    errorRetryInterval,\n    errorRetryCount,\n    onErrorRetry,\n    compare,\n    isPaused,\n    use,\n    loadingTimeout,\n    onLoadingSlow,\n    onSuccess,\n    onError,\n    onDiscarded,\n  } = options;\n\n  // Resolve key if it's a function\n  const resolvedKey = typeof key === 'function' ? key() : key;\n\n  // Build cache key with stable reference\n  const cacheKey = useMemo(() => {\n    if (skip || !resolvedKey) return null;\n    return buildCacheKey(resolvedKey, params);\n  }, [resolvedKey, params, skip]);\n\n  // Stable request config reference\n  const stableRequestConfig = useMemo(\n    () => requestConfig,\n    [JSON.stringify(requestConfig)],\n  );\n\n  // Create fetcher function that extracts URL from various key formats\n  const fetcher = useCallback(\n    async (fetchKey: CacheKey): Promise<T> => {\n      // Extract URL from key (handles strings, arrays, objects)\n      const url = extractUrlFromKey(fetchKey);\n      if (!url) {\n        throw new Error('Invalid cache key: could not extract URL');\n      }\n\n      const fetchConfig: SWRKitRequestConfig = mergeConfigs(\n        {\n          url,\n          method: 'GET',\n          params,\n        },\n        stableRequestConfig,\n      );\n\n      const response = await contextFetcher<T>(fetchConfig);\n      return response.data as T;\n    },\n    [params, stableRequestConfig, contextFetcher],\n  );\n\n  // Merge all SWR options\n  const finalSWRConfig = useMemo(\n    () => ({\n      ...swrConfig,\n      fallbackData,\n      keepPreviousData,\n      suspense,\n      revalidateIfStale,\n      revalidateOnMount,\n      refreshInterval,\n      refreshWhenHidden,\n      refreshWhenOffline,\n      shouldRetryOnError,\n      errorRetryInterval,\n      errorRetryCount,\n      onErrorRetry,\n      compare,\n      isPaused,\n      use,\n      loadingTimeout,\n      onLoadingSlow,\n      onSuccess,\n      onError,\n      onDiscarded,\n    }),\n    [\n      swrConfig,\n      fallbackData,\n      keepPreviousData,\n      suspense,\n      revalidateIfStale,\n      revalidateOnMount,\n      refreshInterval,\n      refreshWhenHidden,\n      refreshWhenOffline,\n      shouldRetryOnError,\n      errorRetryInterval,\n      errorRetryCount,\n      onErrorRetry,\n      compare,\n      isPaused,\n      use,\n      loadingTimeout,\n      onLoadingSlow,\n      onSuccess,\n      onError,\n      onDiscarded,\n    ],\n  );\n\n  // Use SWR - cast finalSWRConfig to any to avoid complex type conflicts\n  const { data, error, isValidating, mutate, isLoading } = useSWR<T, Error>(\n    cacheKey as any,\n    cacheKey ? fetcher : null,\n    finalSWRConfig as any,\n  );\n\n  // Extract problem code and status from error\n  const responseData = error ? extractResponseFromError(error) : null;\n  const problem = responseData?.problem || null;\n  const status = responseData?.status;\n  const headers = responseData?.headers;\n\n  return {\n    data,\n    isLoading: isLoading || (!data && !error && !suspense),\n    isValidating,\n    error,\n    problem,\n    status,\n    headers,\n    mutate,\n  };\n}\n\n/**\n * Hook for mutations (POST, PUT, PATCH, DELETE) using SWR's useSWRMutation\n *\n * @template TData - The expected response data type\n * @template TVariables - The mutation variables type\n *\n * @param options - Mutation configuration\n *\n * @returns Object containing trigger function, loading state, data, and error\n *\n * @example\n * // Simple mutation\n * const { trigger, isMutating } = useMutation<User, CreateUserData>({\n *   url: '/api/users',\n *   method: 'POST',\n * });\n *\n * @example\n * // With optimistic updates\n * const { trigger } = useMutation<Post>({\n *   url: '/api/posts/123/like',\n *   method: 'POST',\n *   optimisticData: (current) => ({\n *     ...current,\n *     liked: true,\n *     likes: (current?.likes || 0) + 1,\n *   }),\n *   rollbackOnError: true,\n * });\n */\nexport function useMutation<TData = any, TVariables = any>(\n  options: UseMutationOptions<TData, TVariables>,\n): UseMutationReturn<TData, TVariables> {\n  const { fetcher: contextFetcher } = useSWRKitContext();\n  const {\n    url,\n    method = 'POST',\n    request: requestConfig,\n    onSuccess,\n    onError,\n    invalidateKeys = [],\n    optimisticData,\n    populateCache = false,\n    rollbackOnError = true,\n    revalidate = true,\n    throwOnError = true,\n  } = options;\n\n  // Wrap fetcher for useSWRMutation\n  const swrMutationFetcher = useCallback(\n    async (_key: string, { arg }: { arg: TVariables }): Promise<TData> => {\n      const fetchConfig: SWRKitRequestConfig = mergeConfigs(\n        { url, method, data: arg },\n        requestConfig,\n      );\n\n      const response = await contextFetcher<TData>(fetchConfig);\n\n      if (!response.ok) {\n        const error = response.originalError || new Error('Mutation failed');\n        (error as any).response = response;\n        throw error;\n      }\n\n      return response.data as TData;\n    },\n    [url, method, requestConfig, contextFetcher],\n  );\n\n  const { trigger, data, error, isMutating, reset } = useSWRMutation(\n    url,\n    swrMutationFetcher,\n    {\n      optimisticData,\n      populateCache,\n      rollbackOnError,\n      revalidate,\n      throwOnError,\n      onSuccess: async (data, key) => {\n        // Invalidate specified keys\n        if (invalidateKeys.length > 0) {\n          await Promise.all(invalidateKeys.map((k) => globalMutate(k)));\n        }\n        // Call user callback\n        if (onSuccess) {\n          await onSuccess(data as TData, key as TVariables);\n        }\n      },\n      onError: async (err, key) => {\n        if (onError) {\n          await onError(err, key as TVariables);\n        }\n      },\n    },\n  );\n\n  // Extract problem code from error\n  const responseData = error ? extractResponseFromError(error) : null;\n  const problem = responseData?.problem || null;\n\n  // Wrap trigger to support override config\n  const wrappedTrigger = useCallback(\n    async (\n      variables: TVariables,\n      overrideConfig?: Partial<SWRKitRequestConfig>,\n    ): Promise<SWRKitResponse<TData>> => {\n      // If override config provided, bypass SWR and call fetcher directly\n      if (overrideConfig) {\n        const mergedConfig = mergeConfigs(\n          { url, method, data: variables },\n          requestConfig,\n          overrideConfig,\n        );\n        const response = await contextFetcher<TData>(mergedConfig);\n        return response;\n      }\n\n      // Use SWR mutation\n      try {\n        // Type cast to bypass union type issues\n        const triggerFn = trigger as (arg: TVariables) => Promise<TData>;\n        const result = await triggerFn(variables);\n\n        // Return SWRKitResponse format\n        return {\n          ok: true,\n          problem: null,\n          originalError: null,\n          data: result,\n        } as SWRKitResponse<TData>;\n      } catch (error) {\n        // Extract response from error\n        const responseData = extractResponseFromError(error);\n        if (responseData) {\n          return responseData as SWRKitResponse<TData>;\n        }\n        throw error;\n      }\n    },\n    [trigger, url, method, requestConfig, contextFetcher],\n  );\n\n  return {\n    trigger: wrappedTrigger,\n    isMutating,\n    data: data as TData | undefined,\n    error,\n    problem,\n    reset,\n  };\n}\n\n/**\n * Hook for infinite scroll / pagination\n *\n * @template T - The expected data type for each page\n *\n * @param options - Configuration options including getKey function\n *\n * @returns Object containing data array, loading states, and loadMore function\n *\n * @example\n * const { data, loadMore, hasMore, isLoadingMore } = useInfiniteScroll<User[]>({\n *   getKey: (pageIndex, previousPageData) => {\n *     if (previousPageData && previousPageData.length === 0) return null;\n *     return `/api/users?page=${pageIndex + 1}&limit=20`;\n *   },\n *   pageSize: 20,\n * });\n */\nexport function useInfiniteScroll<T = any>(\n  options: UseInfiniteScrollOptions<T>,\n): UseInfiniteScrollReturn<T> {\n  const { fetcher: contextFetcher } = useSWRKitContext();\n  const {\n    getKey,\n    swr: swrConfig,\n    request: requestConfig,\n    pageSize = 10,\n  } = options;\n\n  // Create fetcher for each page\n  const fetcher = useCallback(\n    async (key: string): Promise<T> => {\n      // Extract URL from key (getKey should return full URL with params)\n      const fetchConfig: SWRKitRequestConfig = mergeConfigs(\n        {\n          url: key,\n          method: 'GET',\n        },\n        requestConfig,\n      );\n\n      const response = await contextFetcher<T>(fetchConfig);\n      return response.data as T;\n    },\n    [requestConfig, contextFetcher],\n  );\n\n  // Use SWR infinite\n  const { data, error, size, setSize, isValidating, mutate, isLoading } =\n    useSWRInfinite<T, Error>(getKey, fetcher, swrConfig);\n\n  // Calculate if there are more pages\n  const hasMore = useMemo(() => {\n    if (!data) return false;\n    const lastPage = data[data.length - 1];\n\n    // If last page is empty or has fewer items than pageSize, no more pages\n    if (!lastPage) return false;\n    if (Array.isArray(lastPage)) {\n      return lastPage.length >= pageSize;\n    }\n\n    // For paginated responses with metadata\n    if (typeof lastPage === 'object' && 'data' in lastPage) {\n      const items = (lastPage as any).data;\n      return Array.isArray(items) && items.length >= pageSize;\n    }\n\n    return true;\n  }, [data, pageSize]);\n\n  // Load more function\n  const loadMore = useCallback(() => {\n    if (!isValidating && hasMore) {\n      setSize(size + 1);\n    }\n  }, [isValidating, hasMore, size, setSize]);\n\n  // Check if loading more\n  const isLoadingMore = useMemo(() => {\n    return isValidating && !!data && data.length > 0;\n  }, [isValidating, data]);\n\n  // Refresh all pages\n  const refresh = useCallback(async () => {\n    return mutate();\n  }, [mutate]);\n\n  return {\n    data,\n    isLoading: isLoading || (!data && !error),\n    isValidating,\n    error,\n    loadMore,\n    hasMore,\n    isLoadingMore,\n    refresh,\n    size,\n  };\n}\n\n/**\n * Imperative function to mutate cache\n *\n * @param key - Cache key to mutate\n * @param data - New data or function to update data\n * @param shouldRevalidate - Whether to revalidate after mutation\n *\n * @example\n * // Update cache imperatively\n * await mutate('/api/user/123', updatedUser);\n *\n * @example\n * // Invalidate cache (trigger revalidation)\n * await mutate('/api/user/123');\n */\nexport function mutate(\n  key: CacheKey,\n  data?: any,\n  shouldRevalidate = true,\n): Promise<any> {\n  return globalMutate(key, data, shouldRevalidate);\n}\n\n/**\n * Preload data for a key\n *\n * Note: This function requires a fetcher. Use useSWRKitPreload() hook\n * for automatic fetcher integration.\n *\n * @param key - Cache key to preload\n * @param params - Query parameters\n * @param fetcher - Fetcher function\n *\n * @example\n * const fetcher = useSWRKitFetcher();\n * await preload('/api/user/123', undefined, fetcher);\n */\nexport async function preload<T = any>(\n  key: CacheKey,\n  params?: Record<string, any>,\n  fetcher?: (config: SWRKitRequestConfig) => Promise<SWRKitResponse<T>>,\n): Promise<void> {\n  if (!fetcher) {\n    throw new Error(\n      'Fetcher is required for preload. Use useSWRKitPreload() hook to get one.',\n    );\n  }\n\n  const cacheKey = buildCacheKey(key, params);\n  if (!cacheKey) return;\n\n  const url = extractUrlFromKey(cacheKey);\n  if (!url) return;\n\n  const fetchConfig: SWRKitRequestConfig = {\n    url,\n    method: 'GET',\n    params,\n  };\n\n  const response = await fetcher(fetchConfig);\n\n  if (response.ok && response.data) {\n    await globalMutate(cacheKey, response.data, false);\n  }\n}\n","'use client';\n\nimport useSWRSubscription from 'swr/subscription';\nimport type { SWRConfiguration } from 'swr';\n\n/**\n * Options for useSubscription hook\n */\nexport interface UseSubscriptionOptions<T = any> {\n  /**\n   * SWR subscription configuration\n   */\n  swr?: SWRConfiguration<T>;\n}\n\n/**\n * Return type for useSubscription hook\n */\nexport interface UseSubscriptionReturn<T> {\n  /**\n   * Subscription data\n   */\n  data: T | undefined;\n\n  /**\n   * Subscription error\n   */\n  error: Error | undefined;\n\n  /**\n   * Whether the subscription is loading\n   */\n  isLoading: boolean;\n}\n\n/**\n * Hook for WebSocket subscriptions and real-time data\n *\n * @template T - The expected data type\n *\n * @param key - Subscription key\n * @param subscribe - Subscribe function that receives key and next callback\n * @param options - Configuration options\n *\n * @returns Object containing data, error, and loading state\n *\n * @example\n * // WebSocket subscription\n * const { data, error } = useSubscription(\n *   'ws://localhost:3000/live',\n *   (key, { next }) => {\n *     const socket = new WebSocket(key);\n *     socket.addEventListener('message', (event) => next(null, event.data));\n *     socket.addEventListener('error', (event) => next(event.error));\n *     return () => socket.close();\n *   }\n * );\n *\n * @example\n * // Server-Sent Events\n * const { data } = useSubscription(\n *   '/api/events',\n *   (key, { next }) => {\n *     const es = new EventSource(key);\n *     es.onmessage = (event) => next(null, JSON.parse(event.data));\n *     es.onerror = (error) => next(error);\n *     return () => es.close();\n *   }\n * );\n */\nexport function useSubscription<T = any>(\n  key: string,\n  subscribe: (\n    key: string,\n    options: { next: (error?: Error | null, data?: T) => void },\n  ) => (() => void) | void,\n  options: UseSubscriptionOptions<T> = {},\n): UseSubscriptionReturn<T> {\n  const { swr: swrConfig } = options;\n\n  const { data, error } = useSWRSubscription(key, subscribe, swrConfig);\n\n  return {\n    data,\n    error,\n    isLoading: !data && !error,\n  };\n}\n","'use client';\n\nimport { useRef, useEffect } from 'react';\nimport type { Middleware } from 'swr';\n\n/**\n * Middleware for laggy data - keeps previous data during revalidation\n * Useful for smooth UI transitions without showing loading states\n *\n * @example\n * const { data } = useFetch('/api/user', {\n *   use: [laggyMiddleware()],\n * });\n */\nexport function laggyMiddleware(): Middleware {\n  return (useSWRNext) => {\n    return (key, fetcher, config) => {\n      const laggyDataRef = useRef<any>(undefined);\n      const swr = useSWRNext(key, fetcher, config);\n\n      useEffect(() => {\n        if (swr.data !== undefined) {\n          laggyDataRef.current = swr.data;\n        }\n      }, [swr.data]);\n\n      const isLagging = swr.data === undefined && swr.isValidating;\n\n      return {\n        ...swr,\n        data: isLagging ? laggyDataRef.current : swr.data,\n      } as any;\n    };\n  };\n}\n\n/**\n * Middleware for request logging\n * Logs all SWR requests, responses, and errors to console\n *\n * @param options - Configuration options\n *\n * @example\n * const { data } = useFetch('/api/user', {\n *   use: [loggerMiddleware({ logErrors: true })],\n * });\n */\nexport function loggerMiddleware(\n  options: {\n    logRequests?: boolean;\n    logResponses?: boolean;\n    logErrors?: boolean;\n    prefix?: string;\n  } = {},\n): Middleware {\n  const {\n    logRequests = true,\n    logResponses = true,\n    logErrors = true,\n    prefix = '[SWRKit]',\n  } = options;\n\n  return (useSWRNext) => {\n    return (key, fetcher, config) => {\n      if (logRequests) {\n        console.log(`${prefix} Request:`, key);\n      }\n\n      const swr = useSWRNext(key, fetcher, config);\n\n      useEffect(() => {\n        if (logErrors && swr.error) {\n          console.error(`${prefix} Error:`, key, swr.error);\n        }\n        if (logResponses && swr.data) {\n          console.log(`${prefix} Success:`, key, swr.data);\n        }\n      }, [swr.data, swr.error]);\n\n      return swr;\n    };\n  };\n}\n\n/**\n * Middleware for request timing\n * Measures and logs request duration\n *\n * @param options - Configuration options\n *\n * @example\n * const { data } = useFetch('/api/user', {\n *   use: [timingMiddleware({ threshold: 1000 })],\n * });\n */\nexport function timingMiddleware(\n  options: {\n    threshold?: number; // Warn if request takes longer than this (ms)\n    onSlowRequest?: (key: string, duration: number) => void;\n    prefix?: string;\n  } = {},\n): Middleware {\n  const { threshold = 3000, onSlowRequest, prefix = '[SWRKit Timing]' } =\n    options;\n\n  return (useSWRNext) => {\n    return (key, fetcher, config) => {\n      const startTimeRef = useRef<number>(0);\n\n      const wrappedFetcher = async (...args: any[]) => {\n        startTimeRef.current = Date.now();\n        const result = await fetcher?.(...args);\n        const duration = Date.now() - (startTimeRef.current || 0);\n\n        if (duration > threshold) {\n          console.warn(\n            `${prefix} Slow request detected: ${key} (${duration}ms)`,\n          );\n          if (onSlowRequest) {\n            onSlowRequest(String(key), duration);\n          }\n        }\n\n        return result;\n      };\n\n      return useSWRNext(key, wrappedFetcher as any, config);\n    };\n  };\n}\n\n/**\n * Middleware for retry with backoff\n * Implements exponential backoff for failed requests\n *\n * @param options - Configuration options\n *\n * @example\n * const { data } = useFetch('/api/user', {\n *   use: [retryMiddleware({ maxRetries: 5 })],\n * });\n */\nexport function retryMiddleware(\n  options: {\n    maxRetries?: number;\n    baseDelay?: number; // Base delay in ms for exponential backoff\n    maxDelay?: number; // Maximum delay in ms\n  } = {},\n): Middleware {\n  const { maxRetries = 3, baseDelay = 1000, maxDelay = 30000 } = options;\n\n  return (useSWRNext) => {\n    return (key, fetcher, config) => {\n      return useSWRNext(key, fetcher, {\n        ...config,\n        onErrorRetry: (error: any, key: any, config: any, revalidate: any, opts: any) => {\n          const retryCount = opts.retryCount || 0;\n\n          // Stop retrying if max retries reached\n          if (retryCount >= maxRetries) {\n            return;\n          }\n\n          // Don't retry on 4xx errors (client errors)\n          if (error.status && error.status >= 400 && error.status < 500) {\n            return;\n          }\n\n          // Calculate exponential backoff delay\n          const delay = Math.min(baseDelay * Math.pow(2, retryCount), maxDelay);\n\n          setTimeout(() => revalidate(opts), delay);\n        },\n      } as any);\n    };\n  };\n}\n\n/**\n * Middleware for caching to localStorage\n * Persists SWR cache data to localStorage for offline access\n *\n * @param options - Configuration options\n *\n * @example\n * const { data } = useFetch('/api/user', {\n *   use: [localStorageMiddleware({ key: 'user-cache' })],\n * });\n */\nexport function localStorageMiddleware(\n  options: {\n    key: string; // localStorage key to use\n    ttl?: number; // Time to live in ms (default: 24 hours)\n  } = { key: 'swrkit-cache' },\n): Middleware {\n  const { key, ttl = 24 * 60 * 60 * 1000 } = options;\n\n  return (useSWRNext) => {\n    return (swrKey, fetcher, config) => {\n      const swr = useSWRNext(swrKey, fetcher, {\n        ...config,\n        fallbackData: config?.fallbackData ?? (() => {\n          // Try to load from localStorage\n          if (typeof window === 'undefined') return undefined;\n\n          try {\n            const cached = localStorage.getItem(`${key}:${String(swrKey)}`);\n            if (!cached) return undefined;\n\n            const parsed = JSON.parse(cached);\n            if (Date.now() - parsed.timestamp > ttl) {\n              // Expired\n              localStorage.removeItem(`${key}:${String(swrKey)}`);\n              return undefined;\n            }\n\n            return parsed.data;\n          } catch (error) {\n            return undefined;\n          }\n        })(),\n      } as any);\n\n      // Save to localStorage when data changes\n      useEffect(() => {\n        if (typeof window === 'undefined') return;\n        if (swr.data === undefined) return;\n\n        try {\n          localStorage.setItem(\n            `${key}:${String(swrKey)}`,\n            JSON.stringify({\n              data: swr.data,\n              timestamp: Date.now(),\n            }),\n          );\n        } catch (error) {\n          console.error('Failed to save to localStorage:', error);\n        }\n      }, [swr.data]);\n\n      return swr;\n    };\n  };\n}\n\n/**\n * Middleware for request deduplication with custom interval\n * Prevents duplicate requests within a specified time window\n *\n * @param interval - Deduplication interval in ms\n *\n * @example\n * const { data } = useFetch('/api/user', {\n *   use: [dedupeMiddleware(5000)], // Dedupe for 5 seconds\n * });\n */\nexport function dedupeMiddleware(interval: number = 2000): Middleware {\n  return (useSWRNext) => {\n    return (key, fetcher, config) => {\n      return useSWRNext(key, fetcher, {\n        ...config,\n        dedupingInterval: interval,\n      });\n    };\n  };\n}\n\n/**\n * Middleware for conditional fetching based on predicate\n * Pauses/resumes requests based on a condition\n *\n * @param shouldFetch - Function that returns whether to fetch\n *\n * @example\n * const { data } = useFetch('/api/user', {\n *   use: [conditionalMiddleware(() => isOnline)],\n * });\n */\nexport function conditionalMiddleware(\n  shouldFetch: () => boolean,\n): Middleware {\n  return (useSWRNext) => {\n    return (key, fetcher, config) => {\n      return useSWRNext(key, fetcher, {\n        ...config,\n        isPaused: () => !shouldFetch(),\n      });\n    };\n  };\n}\n","import React from 'react';\nimport { SWRConfig } from 'swr';\nimport type { Cache } from 'swr';\nimport { SWRKitProvider } from './context';\nimport type {\n  SWRKitConfig,\n  SWRKitRequestConfig,\n  SWRKitResponse,\n  Fetcher,\n} from './types';\nimport { PROBLEM_CODE } from '@mshindi-labs/refetch';\n\n/**\n * Create an isolated cache for testing\n * Each test can have its own cache to avoid interference\n *\n * @example\n * const cache = createTestCache();\n */\nexport function createTestCache(): Cache {\n  return new Map();\n}\n\n/**\n * Wrapper for testing SWRKit components\n * Provides isolated cache and configuration\n *\n * @example\n * import { render } from '@testing-library/react';\n *\n * test('fetches user data', () => {\n *   const cache = createTestCache();\n *   const { getByText } = render(\n *     <SWRKitTestProvider cache={cache}>\n *       <UserProfile userId=\"123\" />\n *     </SWRKitTestProvider>\n *   );\n * });\n */\nexport function SWRKitTestProvider({\n  children,\n  cache = createTestCache(),\n  config = {},\n  getAccessToken,\n}: {\n  children: React.ReactNode;\n  cache?: Cache;\n  config?: Partial<SWRKitConfig>;\n  getAccessToken?: (cookieName?: string) => string | null;\n}) {\n  return React.createElement(\n    SWRConfig,\n    {\n      value: {\n        provider: () => cache,\n        dedupingInterval: 0, // Disable deduping for tests\n      },\n    },\n    React.createElement(\n      SWRKitProvider,\n      { config, getAccessToken, children },\n    ),\n  );\n}\n\n/**\n * Create a mock fetcher for testing\n * Returns predefined responses for specific URLs\n *\n * @param responses - Map of URL to response data or error\n *\n * @example\n * const fetcher = createMockFetcher({\n *   '/api/user/123': { id: '123', name: 'John' },\n *   '/api/error': new Error('Not found'),\n * });\n */\nexport function createMockFetcher(\n  responses: Record<string, any | Error>,\n): Fetcher {\n  return async (config: SWRKitRequestConfig): Promise<SWRKitResponse<any>> => {\n    const url = config.url || '';\n    const response = responses[url];\n\n    // Simulate network delay\n    await new Promise((resolve) => setTimeout(resolve, 10));\n\n    if (response instanceof Error) {\n      return {\n        ok: false,\n        problem: PROBLEM_CODE.UNKNOWN_ERROR,\n        originalError: response,\n        data: undefined,\n        status: 500,\n        headers: {},\n      };\n    }\n\n    return {\n      ok: true,\n      problem: null,\n      originalError: null,\n      data: response,\n      status: 200,\n      headers: {\n        'content-type': 'application/json',\n      },\n    };\n  };\n}\n\n/**\n * Create a mock fetcher with delay for testing loading states\n *\n * @param responses - Map of URL to response data or error\n * @param delay - Delay in milliseconds\n *\n * @example\n * const fetcher = createDelayedMockFetcher(\n *   { '/api/user': { name: 'John' } },\n *   1000\n * );\n */\nexport function createDelayedMockFetcher(\n  responses: Record<string, any | Error>,\n  delay: number,\n): Fetcher {\n  const baseFetcher = createMockFetcher(responses);\n\n  return async (\n    config: SWRKitRequestConfig,\n  ): Promise<SWRKitResponse<any>> => {\n    await new Promise((resolve) => setTimeout(resolve, delay));\n    return baseFetcher(config);\n  };\n}\n\n/**\n * Create a mock fetcher that tracks all requests\n * Useful for verifying that requests are made with correct parameters\n *\n * @param responses - Map of URL to response data or error\n *\n * @example\n * const { fetcher, requests } = createTrackingMockFetcher({\n *   '/api/user': { name: 'John' },\n * });\n *\n * // After test\n * expect(requests).toHaveLength(1);\n * expect(requests[0].url).toBe('/api/user');\n */\nexport function createTrackingMockFetcher(responses: Record<\n  string,\n  any | Error\n>): {\n  fetcher: Fetcher;\n  requests: SWRKitRequestConfig[];\n  clearRequests: () => void;\n} {\n  const requests: SWRKitRequestConfig[] = [];\n  const baseFetcher = createMockFetcher(responses);\n\n  const fetcher: Fetcher = async (\n    config: SWRKitRequestConfig,\n  ): Promise<SWRKitResponse<any>> => {\n    requests.push({ ...config });\n    return baseFetcher(config);\n  };\n\n  return {\n    fetcher,\n    requests,\n    clearRequests: () => {\n      requests.length = 0;\n    },\n  };\n}\n\n/**\n * Create a mock fetcher that fails after N successful requests\n * Useful for testing error recovery and retry logic\n *\n * @param successData - Data to return on success\n * @param failAfter - Number of successful requests before failing\n *\n * @example\n * const fetcher = createFailingMockFetcher({ name: 'John' }, 2);\n * // First 2 requests succeed, subsequent requests fail\n */\nexport function createFailingMockFetcher(\n  successData: any,\n  failAfter: number,\n): Fetcher {\n  let requestCount = 0;\n\n  return async (\n    config: SWRKitRequestConfig,\n  ): Promise<SWRKitResponse<any>> => {\n    requestCount++;\n\n    await new Promise((resolve) => setTimeout(resolve, 10));\n\n    if (requestCount > failAfter) {\n      return {\n        ok: false,\n        problem: PROBLEM_CODE.SERVER_ERROR,\n        originalError: new Error('Mock error'),\n        data: undefined,\n        status: 500,\n        headers: {},\n      };\n    }\n\n    return {\n      ok: true,\n      problem: null,\n      originalError: null,\n      data: successData,\n      status: 200,\n      headers: {\n        'content-type': 'application/json',\n      },\n    };\n  };\n}\n\n/**\n * Create a mock fetcher with HTTP status code control\n * Useful for testing different HTTP status scenarios\n *\n * @param responses - Map of URL to response with status\n *\n * @example\n * const fetcher = createStatusMockFetcher({\n *   '/api/success': { status: 200, data: { name: 'John' } },\n *   '/api/not-found': { status: 404, data: null },\n *   '/api/error': { status: 500, data: null },\n * });\n */\nexport function createStatusMockFetcher(responses: Record<\n  string,\n  { status: number; data: any | null }\n>): Fetcher {\n  return async (config: SWRKitRequestConfig): Promise<SWRKitResponse<any>> => {\n    const url = config.url || '';\n    const response = responses[url];\n\n    await new Promise((resolve) => setTimeout(resolve, 10));\n\n    if (!response) {\n      return {\n        ok: false,\n        problem: PROBLEM_CODE.CLIENT_ERROR,\n        originalError: new Error('Not found'),\n        data: undefined,\n        status: 404,\n        headers: {},\n      };\n    }\n\n    const isOk = response.status >= 200 && response.status < 300;\n    const problem = isOk\n      ? null\n      : response.status >= 500\n        ? PROBLEM_CODE.SERVER_ERROR\n        : PROBLEM_CODE.CLIENT_ERROR;\n\n    return {\n      ok: isOk,\n      problem,\n      originalError: isOk ? null : new Error(`HTTP ${response.status}`),\n      data: response.data,\n      status: response.status,\n      headers: {\n        'content-type': 'application/json',\n      },\n    };\n  };\n}\n"]}