next-unified-query
Version:
React hooks and components for next-unified-query-core
1 lines • 61.7 kB
Source Map (JSON)
{"version":3,"sources":["../src/query-client-provider.tsx","../src/hooks/use-query.ts","../src/hooks/use-mutation.ts","../src/error-boundary.tsx","../src/error-reset-boundary.tsx"],"names":["React","useRef","useCallback","fetcher","isFunction","useEffect","createContext","useContext"],"mappings":"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","file":"react.mjs","sourcesContent":["import React, { createContext, useContext, useRef, useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { QueryClient, QueryState, QueryClientOptions } from \"next-unified-query-core\";\nimport { getQueryClient, configureQueryClient } from \"next-unified-query-core\";\n\nconst QueryClientContext = createContext<QueryClient | null>(null);\nconst QueryConfigContext = createContext<QueryClientOptions | undefined>(undefined);\n\nexport function HydrationBoundary({\n\tstate,\n\tchildren,\n}: {\n\tstate?: Record<string, QueryState>;\n\tchildren: ReactNode;\n}) {\n\tconst client = useQueryClient();\n\tconst hydratedRef = useRef(false);\n\n\t// 한 번만 hydration 수행\n\tif (state && !hydratedRef.current) {\n\t\tclient.hydrate(state);\n\t\thydratedRef.current = true;\n\t}\n\n\treturn <>{children}</>;\n}\n\nexport interface QueryClientProviderProps {\n\t/**\n\t * QueryClient 인스턴스 (선택사항)\n\t * 제공하지 않으면 자동으로 환경에 맞는 인스턴스를 생성합니다.\n\t */\n\tclient?: QueryClient;\n\t/**\n\t * QueryClient 설정 (권장)\n\t * client가 제공되지 않은 경우 이 설정으로 QueryClient를 생성합니다.\n\t * SSR과 Client 모두에서 동일한 설정이 적용됩니다.\n\t */\n\tconfig?: QueryClientOptions;\n\tchildren: ReactNode;\n}\n\nexport function QueryClientProvider({ client, config, children }: QueryClientProviderProps) {\n\t// config가 제공되면 즉시 전역 설정으로 저장 (서버/클라이언트 모두에서 동작)\n\tif (config && typeof window !== \"undefined\") {\n\t\t// 클라이언트에서만 전역 설정 저장\n\t\tconfigureQueryClient(config);\n\t}\n\t\n\t// client가 제공되지 않으면 자동으로 생성\n\tconst queryClient = useMemo(\n\t\t() => client || getQueryClient(config),\n\t\t[client, config]\n\t);\n\n\treturn (\n\t\t<QueryConfigContext.Provider value={config}>\n\t\t\t<QueryClientContext.Provider value={queryClient}>\n\t\t\t\t{children}\n\t\t\t</QueryClientContext.Provider>\n\t\t</QueryConfigContext.Provider>\n\t);\n}\n\nexport function useQueryClient(): QueryClient {\n\tconst ctx = useContext(QueryClientContext);\n\tif (!ctx) throw new Error(\"You must wrap your component tree with <QueryClientProvider>.\");\n\treturn ctx;\n}\n\n/**\n * QueryClient 설정에 접근하는 Hook\n * SSR 환경에서 설정을 공유하기 위해 사용됩니다.\n */\nexport function useQueryConfig(): QueryClientOptions | undefined {\n\treturn useContext(QueryConfigContext);\n}\n","import { useEffect, useRef, useSyncExternalStore, useCallback } from \"react\";\nimport type { ZodType, FetchConfig, FetchError, QueryFetcher } from \"next-unified-query-core\";\nimport { isObject, isFunction } from \"es-toolkit/compat\";\nimport { useQueryClient } from \"../query-client-provider\";\nimport type { QueryConfig, ExtractParams, ExtractQueryData } from \"next-unified-query-core\";\nimport { validateQueryConfig } from \"next-unified-query-core\";\nimport { QueryObserver, type QueryObserverOptions, type QueryObserverResult } from \"next-unified-query-core\";\n\n/**\n * 기본 UseQuery 옵션 (공통 속성)\n */\ninterface BaseUseQueryOptions<T = any> {\n\tcacheKey: readonly unknown[];\n\tparams?: Record<string, any>;\n\tschema?: ZodType;\n\tfetchConfig?: Omit<FetchConfig, \"url\" | \"method\" | \"params\" | \"data\">;\n\tenabled?: boolean;\n\tstaleTime?: number;\n\tselect?: (data: T) => any;\n\tselectDeps?: any[];\n\t/**\n\t * placeholderData: fetch 전 임시 데이터 또는 이전 데이터 유지\n\t * 값 또는 함수(prevData, prevQuery) 모두 지원\n\t * ReactNode(JSX)도 허용\n\t */\n\tplaceholderData?:\n\t\t| T\n\t\t| React.ReactNode\n\t\t| ((prevData: T | React.ReactNode | undefined, prevQuery?: any) => T | React.ReactNode);\n\t/**\n\t * gcTime: 쿼리 데이터가 사용되지 않을 때(구독자가 0이 될 때) 가비지 컬렉션까지의 시간(ms)\n\t * 이는 생명주기 관리 전략으로, maxQueries(메모리 보호)와는 별개로 동작합니다.\n\t * @default 300000 (5분)\n\t */\n\tgcTime?: number;\n\t/**\n\t * 에러 발생 시 Error Boundary로 전파할지 여부\n\t * - boolean: true면 모든 에러를 Error Boundary로 전파\n\t * - function: 조건부 전파 (예: (error) => error.response?.status >= 500)\n\t * @default false\n\t */\n\tthrowOnError?: boolean | ((error: FetchError) => boolean);\n\t/**\n\t * Suspense 모드 활성화 여부\n\t * true로 설정하면 로딩 중일 때 Promise를 throw하여 React Suspense와 통합됩니다.\n\t * @default false\n\t */\n\tsuspense?: boolean;\n}\n\n/**\n * URL 기반 UseQuery 옵션\n */\ninterface UrlBasedUseQueryOptions<T = any> extends BaseUseQueryOptions<T> {\n\t/**\n\t * API 요청 URL\n\t */\n\turl: string;\n\n\t/**\n\t * queryFn이 있으면 안됨 (상호 배제)\n\t */\n\tqueryFn?: never;\n}\n\n/**\n * Custom Function 기반 UseQuery 옵션\n */\ninterface FunctionBasedUseQueryOptions<T = any> extends BaseUseQueryOptions<T> {\n\t/**\n\t * 복잡한 요청을 위한 커스텀 쿼리 함수\n\t * Options 방식에서는 QueryFetcher만 전달 (GET/HEAD 메서드만 허용)\n\t * 인자: fetcher (QueryFetcher 인스턴스)\n\t */\n\tqueryFn: (fetcher: QueryFetcher) => Promise<T>;\n\n\t/**\n\t * url이 있으면 안됨 (상호 배제)\n\t */\n\turl?: never;\n}\n\n/**\n * UseQuery 옵션\n * URL 방식 또는 Custom Function 방식 중 하나를 선택할 수 있음\n */\nexport type UseQueryOptions<T = any> = UrlBasedUseQueryOptions<T> | FunctionBasedUseQueryOptions<T>;\n\n/**\n * UseQuery 결과 타입\n * QueryObserverResult의 alias로, 쿼리 상태와 데이터를 포함합니다.\n */\nexport type UseQueryResult<TData = unknown, TError = FetchError> = QueryObserverResult<TData, TError>;\n\n/**\n * Schema에서 타입을 추출하는 도우미 타입\n */\ntype InferSchemaType<T> = T extends { schema: infer S }\n\t? S extends ZodType\n\t\t? import(\"next-unified-query-core\").z.infer<S>\n\t\t: any\n\t: any;\n\ntype UseQueryFactoryOptions<P, T> = Omit<\n\tUseQueryOptions<T>,\n\t\"cacheKey\" | \"url\" | \"queryFn\" | \"params\" | \"schema\" | \"fetchConfig\"\n> &\n\t(P extends void ? { params?: P } : keyof P extends never ? { params?: P } : { params: P });\n\n/**\n * 캐싱과 상태 관리를 제공하는 데이터 페칭 React 훅입니다.\n *\n * **환경 호환성:**\n * - ❌ 서버사이드: 서버 컴포넌트와 호환되지 않음 (React context 사용)\n * - ✅ 클라이언트사이드: React context가 있는 React 컴포넌트에서 사용\n * - ⚠️ SSR: \"use client\" 지시어가 있는 클라이언트 컴포넌트에서만 사용\n *\n * @example\n * ```typescript\n * // 클라이언트 컴포넌트에서만 사용\n * \"use client\";\n * import { useQuery } from 'next-unified-query/react';\n *\n * function UserProfile({ userId }: { userId: number }) {\n * const { data, isLoading, error } = useQuery(api.getUser, { params: userId });\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n * return <div>Hello {data.name}</div>;\n * }\n * ```\n */\n// 1. 명시적 타입을 가진 Factory 기반 (최고 우선순위): useQuery<T>(query, options)\nexport function useQuery<T, E = FetchError>(\n\tquery: QueryConfig<any, any>,\n\toptions: UseQueryFactoryOptions<ExtractParams<typeof query>, T>,\n): UseQueryResult<T, E>;\n\n// 2. 스키마 추론을 가진 Factory 기반 (높은 우선순위): useQuery(query, options)\nexport function useQuery<Q extends QueryConfig<any, any>, E = FetchError>(\n\tquery: Q,\n\toptions: UseQueryFactoryOptions<ExtractParams<Q>, ExtractQueryData<Q>>,\n): UseQueryResult<ExtractQueryData<Q>, E>;\n\n// 3. Options-based with schema inference (MEDIUM-HIGH priority): useQuery(options) - schema 있는 경우\nexport function useQuery<O extends UseQueryOptions<any> & { schema: ZodType }, E = FetchError>(\n\toptions: O,\n): UseQueryResult<InferSchemaType<O>, E>;\n\n// 4. Options-based with explicit type (MEDIUM priority): useQuery<T>(options) - 모든 옵션 허용\nexport function useQuery<T, E = FetchError>(options: UseQueryOptions<T>): UseQueryResult<T, E>;\n\n// 구현부\nexport function useQuery(arg1: any, arg2?: any): any {\n\t// QueryConfig 기반\n\tif (isObject(arg1) && \"cacheKey\" in arg1 && isFunction((arg1 as QueryConfig<any, any>).cacheKey)) {\n\t\tconst query = arg1 as QueryConfig<any, any>;\n\n\t\t// QueryConfig 런타임 검증\n\t\tvalidateQueryConfig(query);\n\n\t\tconst options = arg2 ?? {};\n\t\tconst params = options.params;\n\t\tconst cacheKey = query.cacheKey?.(params);\n\t\tconst url = query.url?.(params);\n\t\tconst queryFn = query.queryFn;\n\t\tconst schema = query.schema;\n\t\tconst placeholderData = options.placeholderData ?? query.placeholderData;\n\t\tconst fetchConfig = options.fetchConfig ?? query.fetchConfig;\n\t\tconst select = options.select ?? query.select;\n\t\tconst selectDeps = options.selectDeps ?? query.selectDeps;\n\t\tconst enabled = \"enabled\" in options\n\t\t\t? options.enabled // 명시적으로 전달된 경우 해당 값 사용\n\t\t\t: isFunction(query.enabled)\n\t\t\t\t? query.enabled(params) // Factory의 enabled 함수 호출\n\t\t\t\t: query.enabled; // Factory의 enabled 불린 값 사용\n\n\t\treturn _useQueryObserver({\n\t\t\t...query,\n\t\t\t...options,\n\t\t\tenabled,\n\t\t\tcacheKey,\n\t\t\turl,\n\t\t\tqueryFn,\n\t\t\tparams,\n\t\t\tschema,\n\t\t\tplaceholderData,\n\t\t\tfetchConfig,\n\t\t\tselect,\n\t\t\tselectDeps,\n\t\t});\n\t}\n\t// 명시적 타입 지정 방식\n\treturn _useQueryObserver({\n\t\t...arg1,\n\t});\n}\n\nfunction _useQueryObserver<T = unknown, E = FetchError>(options: UseQueryOptions<T>): UseQueryResult<T, E> {\n\t// UseQueryOptions 런타임 검증 (factory의 validateQueryConfig 사용)\n\tvalidateQueryConfig(options);\n\n\tconst queryClient = useQueryClient();\n\tconst defaultOptions = queryClient.getDefaultOptions();\n\tconst observerRef = useRef<QueryObserver<T, E> | undefined>(undefined);\n\n\t// 기본 결과 객체를 캐싱하여 안정적인 참조 제공\n\tconst defaultResultRef = useRef<UseQueryResult<T, E>>({\n\t\tdata: undefined,\n\t\terror: undefined,\n\t\tisLoading: true,\n\t\tisFetching: true,\n\t\tisError: false,\n\t\tisSuccess: false,\n\t\tisStale: true,\n\t\tisPlaceholderData: false,\n\t\trefetch: () => {},\n\t});\n\n\t// 전역 기본값과 개별 옵션 병합 (useMemo 없이 직접 병합)\n\tconst defaults = defaultOptions?.queries || {};\n\tconst mergedOptions = {\n\t\t...defaults,\n\t\t...options,\n\t\t// 명시적으로 undefined인 경우에만 기본값 사용\n\t\tthrowOnError: options.throwOnError !== undefined \n\t\t\t? options.throwOnError \n\t\t\t: defaults.throwOnError,\n\t\tsuspense: options.suspense !== undefined \n\t\t\t? options.suspense \n\t\t\t: defaults.suspense,\n\t\tstaleTime: options.staleTime !== undefined \n\t\t\t? options.staleTime \n\t\t\t: defaults.staleTime,\n\t\tgcTime: options.gcTime !== undefined \n\t\t\t? options.gcTime \n\t\t\t: defaults.gcTime,\n\t};\n\n\t// Observer 생성 또는 옵션 업데이트 (렌더링 중 직접 처리)\n\tif (!observerRef.current) {\n\t\tobserverRef.current = new QueryObserver<T, E>(queryClient, {\n\t\t\t...mergedOptions,\n\t\t\tkey: mergedOptions.cacheKey,\n\t\t} as QueryObserverOptions<T>);\n\t} else {\n\t\t// setOptions가 내부적으로 변경 여부를 체크하므로 항상 호출\n\t\tobserverRef.current.setOptions({\n\t\t\t...mergedOptions,\n\t\t\tkey: mergedOptions.cacheKey,\n\t\t} as QueryObserverOptions<T>);\n\t}\n\n\t// 안정적인 subscribe 함수\n\tconst subscribe = useCallback((callback: () => void) => {\n\t\treturn observerRef.current!.subscribe(callback);\n\t}, []);\n\n\t// 최적화된 getSnapshot 함수\n\tconst getSnapshot = useCallback(() => {\n\t\tif (!observerRef.current) {\n\t\t\t// Observer가 없는 경우 캐시된 기본 결과 반환\n\t\t\treturn defaultResultRef.current;\n\t\t}\n\n\t\t// QueryObserver에서 이미 Tracked Properties와 Structural Sharing이 처리됨\n\t\t// 추가적인 비교 없이 결과를 그대로 반환\n\t\treturn observerRef.current.getCurrentResult();\n\t}, []);\n\n\t// useSyncExternalStore로 Observer 구독\n\tconst result = useSyncExternalStore(\n\t\tsubscribe,\n\t\tgetSnapshot,\n\t\tgetSnapshot, // getServerSnapshot도 동일하게\n\t);\n\n\t// Observer 시작 (컴포넌트 마운트 후)\n\tuseEffect(() => {\n\t\tobserverRef.current?.start();\n\t}, []);\n\n\t// Suspense 지원: 데이터가 없을 때 Promise throw\n\tif (mergedOptions.suspense && !result.data && !result.error) {\n\t\t// Observer가 내부적으로 관리하는 Promise를 가져옴\n\t\tconst promise = observerRef.current?.getPromise();\n\t\tif (promise) {\n\t\t\t// 개발/테스트 환경에서 Suspense boundary 경고\n\t\t\tif (process.env.NODE_ENV !== 'production') {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t'[next-unified-query] Warning: suspense: true is enabled but no Suspense boundary detected.\\n' +\n\t\t\t\t\t'This will cause your app to crash if a Suspense boundary is not present.\\n\\n' +\n\t\t\t\t\t'To fix this issue:\\n' +\n\t\t\t\t\t'1. Wrap your component with <Suspense>:\\n' +\n\t\t\t\t\t' <Suspense fallback={<div>Loading...</div>}>\\n' +\n\t\t\t\t\t' <YourComponent />\\n' +\n\t\t\t\t\t' </Suspense>\\n\\n' +\n\t\t\t\t\t'2. Or disable suspense mode:\\n' +\n\t\t\t\t\t' useQuery({ suspense: false, ... })'\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow promise;\n\t\t}\n\t}\n\n\t// throwOnError를 안정적인 값으로 추출하여 useEffect dependency 최적화\n\tconst throwOnError = mergedOptions.throwOnError;\n\t\n\t// Error Boundary로 에러 전파\n\tuseEffect(() => {\n\t\tif (result.error && throwOnError) {\n\t\t\tconst shouldThrow = typeof throwOnError === 'function' \n\t\t\t\t? throwOnError(result.error as unknown as FetchError)\n\t\t\t\t: throwOnError;\n\t\t\t\n\t\t\tif (shouldThrow) {\n\t\t\t\t// 개발/테스트 환경에서 Error Boundary 경고\n\t\t\t\tif (process.env.NODE_ENV !== 'production') {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t'[next-unified-query] Warning: throwOnError is enabled but no Error Boundary detected.\\n' +\n\t\t\t\t\t\t'This will cause your app to crash if an Error Boundary is not present.\\n\\n' +\n\t\t\t\t\t\t'To fix this issue:\\n' +\n\t\t\t\t\t\t'1. Wrap your component with an Error Boundary:\\n' +\n\t\t\t\t\t\t' <ErrorBoundary fallback={<ErrorFallback />}>\\n' +\n\t\t\t\t\t\t' <YourComponent />\\n' +\n\t\t\t\t\t\t' </ErrorBoundary>\\n\\n' +\n\t\t\t\t\t\t'2. Or disable throwOnError:\\n' +\n\t\t\t\t\t\t' useQuery({ throwOnError: false, ... })\\n\\n' +\n\t\t\t\t\t\t'Original error:', result.error\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthrow result.error;\n\t\t\t}\n\t\t}\n\t\t// 안정적인 throwOnError 참조 사용\n\t}, [result.error, throwOnError]);\n\n\t// 컴포넌트 언마운트 시 Observer 정리\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tobserverRef.current?.destroy();\n\t\t};\n\t}, []);\n\n\treturn result;\n}\n","import { useReducer, useCallback, useRef, useEffect } from \"react\";\nimport {\n\tFetchError,\n\ttype ApiErrorResponse,\n\ttype MutationMethod,\n\ttype RequestConfig,\n\ttype NextTypeFetch,\n} from \"next-unified-query-core\";\nimport { validateMutationConfig, type MutationConfig, type InferIfZodSchema } from \"next-unified-query-core\";\nimport { useQueryClient } from \"../query-client-provider\";\nimport { z, type ZodType } from \"next-unified-query-core\";\nimport { merge, isArray, isFunction } from \"es-toolkit/compat\";\n\n/**\n * Mutation 상태 인터페이스\n */\nexport interface MutationState<TData = unknown, TError = FetchError<ApiErrorResponse>, TVariables = void> {\n\tdata: TData | undefined;\n\terror: TError | null;\n\tisPending: boolean;\n\tisSuccess: boolean;\n\tisError: boolean;\n}\n\n/**\n * 기본 UseMutation 옵션 (공통 속성)\n * 간소화된 타입 파라미터: TVariables, TData, TError\n */\ninterface BaseUseMutationOptions<\n\tTVariables = any,\n\tTData = unknown,\n\tTError = FetchError<ApiErrorResponse>,\n> {\n\t/**\n\t * Mutation 실행 전 호출되는 콜백 (Optimistic Update 등에 사용)\n\t * 반환값은 context로 다른 콜백에 전달됨\n\t */\n\tonMutate?: (variables: TVariables) => Promise<any> | any;\n\t\n\t/**\n\t * Mutation 성공 시 호출되는 콜백\n\t */\n\tonSuccess?: (\n\t\tdata: TData,\n\t\tvariables: TVariables,\n\t\tcontext: any,\n\t) => Promise<void> | void;\n\t\n\t/**\n\t * Mutation 실패 시 호출되는 콜백\n\t */\n\tonError?: (error: TError, variables: TVariables, context: any) => Promise<void> | void;\n\t\n\t/**\n\t * Mutation 완료 시 (성공/실패 무관) 호출되는 콜백\n\t */\n\tonSettled?: (\n\t\tdata: TData | undefined,\n\t\terror: TError | null,\n\t\tvariables: TVariables,\n\t\tcontext: any,\n\t) => Promise<void> | void;\n\t\n\t/**\n\t * Mutation 성공 시 무효화할 쿼리 키 목록\n\t */\n\tinvalidateQueries?:\n\t\t| string[][]\n\t\t| ((\n\t\t\t\tdata: TData,\n\t\t\t\tvariables: TVariables,\n\t\t\t\tcontext: any,\n\t\t ) => string[][]);\n\t\n\t/**\n\t * 추가 fetch 설정 (baseURL, headers, timeout 등)\n\t */\n\tfetchConfig?: Omit<RequestConfig, \"url\" | \"method\" | \"params\" | \"data\" | \"schema\">;\n\t\n\t/**\n\t * 요청 데이터 검증용 Zod 스키마 (선택적)\n\t */\n\trequestSchema?: ZodType<TVariables>;\n\t\n\t/**\n\t * 응답 데이터 검증용 Zod 스키마 (선택적)\n\t */\n\tresponseSchema?: ZodType<TData>;\n\t\n\t/**\n\t * Mutation 에러 발생 시 Error Boundary로 전파할지 여부\n\t * - boolean: true면 모든 에러를 Error Boundary로 전파\n\t * - function: 조건부 전파 (예: (error) => error.response?.status >= 500)\n\t * @default false\n\t */\n\tthrowOnError?: boolean | ((error: TError) => boolean);\n}\n\n/**\n * URL 기반 UseMutation 옵션\n */\ninterface UrlBasedUseMutationOptions<\n\tTVariables = any,\n\tTData = unknown,\n\tTError = FetchError<ApiErrorResponse>,\n> extends BaseUseMutationOptions<TVariables, TData, TError> {\n\t/**\n\t * API 요청 URL\n\t */\n\turl: string | ((variables: TVariables) => string);\n\n\t/**\n\t * HTTP 메서드 (Mutation 가능한 메서드만)\n\t */\n\tmethod: MutationMethod;\n\n\t/**\n\t * mutationFn이 있으면 안됨 (상호 배제)\n\t */\n\tmutationFn?: never;\n}\n\n/**\n * Function 기반 UseMutation 옵션 (통일된 시그니처)\n */\ninterface FunctionBasedUseMutationOptions<\n\tTVariables = any,\n\tTData = unknown,\n\tTError = FetchError<ApiErrorResponse>,\n> extends BaseUseMutationOptions<TVariables, TData, TError> {\n\t/**\n\t * Custom mutation function - (variables, fetcher) 패턴 사용\n\t */\n\tmutationFn: (variables: TVariables, fetcher: NextTypeFetch) => Promise<TData>;\n\n\t/**\n\t * url/method가 있으면 안됨 (상호 배제)\n\t */\n\turl?: never;\n\tmethod?: never;\n}\n\n/**\n * UseMutation 옵션\n * URL 방식 또는 Custom Function 방식 중 하나를 선택할 수 있음\n * 순서 변경: TVariables, TData, TError (사용 빈도 순)\n */\nexport type UseMutationOptions<\n\tTVariables = any,\n\tTData = unknown,\n\tTError = FetchError<ApiErrorResponse>,\n> =\n\t| UrlBasedUseMutationOptions<TVariables, TData, TError>\n\t| FunctionBasedUseMutationOptions<TVariables, TData, TError>;\n\n/**\n * UseMutation 결과 인터페이스 (단순화된 시그니처)\n */\nexport interface UseMutationResult<TData = unknown, TError = FetchError<ApiErrorResponse>, TVariables = any>\n\textends MutationState<TData, TError, TVariables> {\n\tmutate: (\n\t\tvariables: TVariables,\n\t\toptions?: {\n\t\t\tonSuccess?: (data: TData, variables: TVariables, context: any) => void;\n\t\t\tonError?: (error: TError, variables: TVariables, context: any) => void;\n\t\t\tonSettled?: (data: TData | undefined, error: TError | null, variables: TVariables, context: any) => void;\n\t\t},\n\t) => void;\n\tmutateAsync: (\n\t\tvariables?: TVariables,\n\t\toptions?: {\n\t\t\tonSuccess?: (data: TData, variables: TVariables, context: any) => void;\n\t\t\tonError?: (error: TError, variables: TVariables, context: any) => void;\n\t\t\tonSettled?: (data: TData | undefined, error: TError | null, variables: TVariables, context: any) => void;\n\t\t},\n\t) => Promise<TData>;\n\treset: () => void;\n}\n\ntype MutationAction<TData, TError, TVariables> =\n\t| { type: \"MUTATE\"; variables: TVariables }\n\t| { type: \"SUCCESS\"; data: TData }\n\t| { type: \"ERROR\"; error: TError }\n\t| { type: \"RESET\" };\n\nconst getInitialState = <TData, TError, TVariables>(): MutationState<TData, TError, TVariables> => ({\n\tdata: undefined,\n\terror: null,\n\tisPending: false,\n\tisSuccess: false,\n\tisError: false,\n});\n\n/**\n * useMutation 오버로드 선언\n * 새로운 순서: TVariables, TData, TError\n */\n\n// 1. 가장 일반적인 사용: 2개 타입 파라미터 (Variables, Data)\nexport function useMutation<TVariables = any, TData = unknown>(\n\toptions: UseMutationOptions<TVariables, TData>\n): UseMutationResult<TData, FetchError, TVariables>;\n\n// 2. 커스텀 에러 타입 포함: 3개 타입 파라미터\nexport function useMutation<\n\tTVariables = any,\n\tTData = unknown,\n\tTError = FetchError<ApiErrorResponse>,\n>(\n\toptions: UseMutationOptions<TVariables, TData, TError>\n): UseMutationResult<TData, TError, TVariables>;\n\n// 3. responseSchema가 명시적으로 제공될 때 (스키마에서 타입 추론)\nexport function useMutation<\n\tTVariables = any,\n\tResponseSchema extends ZodType = ZodType,\n\tTError = FetchError<ApiErrorResponse>,\n>(\n\toptions: UseMutationOptions<TVariables, any, TError> & {\n\t\tresponseSchema: ResponseSchema;\n\t},\n): UseMutationResult<z.infer<ResponseSchema>, TError, TVariables>;\n\n// 4. Factory 기반 (하위 호환성 유지, 순서는 새로운 방식)\nexport function useMutation<\n\tTVariables = any,\n\tTData = unknown,\n\tTError = FetchError<ApiErrorResponse>,\n>(\n\tfactoryConfig: MutationConfig<TVariables, TData, TError>,\n\toverrideOptions?: Partial<BaseUseMutationOptions<TVariables, TData, TError>>,\n): UseMutationResult<TData, TError, TVariables>;\n\n// 구현부\nexport function useMutation<\n\tTVariables = any,\n\tTData = unknown,\n\tTError = FetchError<ApiErrorResponse>,\n>(\n\tconfigOrOptions:\n\t\t| MutationConfig<TVariables, TData, TError>\n\t\t| UseMutationOptions<TVariables, TData, TError>,\n\toverrideOptions?: Partial<BaseUseMutationOptions<TVariables, TData, TError>>,\n): UseMutationResult<TData, TError, TVariables> {\n\t// Factory 기반인지 확인 (cacheKey 등 factory 특성이 있는지 확인)\n\tconst isFactoryConfig = \"url\" in configOrOptions || \"mutationFn\" in configOrOptions;\n\n\tif (isFactoryConfig && overrideOptions) {\n\t\t// Factory 기반 + override options\n\t\tconst factoryConfig = configOrOptions as MutationConfig<TVariables, TData, TError>;\n\t\tconst mergedOptions = mergeMutationOptions(factoryConfig, overrideOptions);\n\t\treturn _useMutationInternal(mergedOptions);\n\t} else {\n\t\t// Options 기반 또는 Factory 기반 (override 없음)\n\t\treturn _useMutationInternal(configOrOptions as any);\n\t}\n}\n\n/**\n * Factory 옵션과 useMutation 옵션을 병합하는 함수\n */\nfunction mergeMutationOptions<TVariables, TData, TError>(\n\tfactoryConfig: MutationConfig<TVariables, TData, TError>,\n\toverrideOptions: Partial<BaseUseMutationOptions<TVariables, TData, TError>>,\n): UseMutationOptions<TVariables, TData, TError> {\n\t// Factory 콜백들\n\tconst factoryOnMutate = factoryConfig.onMutate;\n\tconst factoryOnSuccess = factoryConfig.onSuccess;\n\tconst factoryOnError = factoryConfig.onError;\n\tconst factoryOnSettled = factoryConfig.onSettled;\n\n\t// Override 콜백들\n\tconst overrideOnMutate = overrideOptions.onMutate;\n\tconst overrideOnSuccess = overrideOptions.onSuccess;\n\tconst overrideOnError = overrideOptions.onError;\n\tconst overrideOnSettled = overrideOptions.onSettled;\n\n\treturn {\n\t\t// Factory 기본 속성들\n\t\t...factoryConfig,\n\n\t\t// Override 옵션들로 덮어쓰기 (콜백 제외)\n\t\t...overrideOptions,\n\n\t\t// 콜백들은 양쪽 모두 실행하도록 병합\n\t\tonMutate: combinedCallback(factoryOnMutate, overrideOnMutate),\n\t\tonSuccess: combinedCallback(factoryOnSuccess, overrideOnSuccess),\n\t\tonError: combinedCallback(factoryOnError, overrideOnError),\n\t\tonSettled: combinedCallback(factoryOnSettled, overrideOnSettled),\n\t} as UseMutationOptions<TVariables, TData, TError>;\n}\n\n/**\n * 두 콜백을 결합하여 순서대로 실행하는 함수 생성\n */\nfunction combinedCallback<T extends (...args: any[]) => any>(first?: T, second?: T): T | undefined {\n\tif (!first && !second) return undefined;\n\tif (!first) return second;\n\tif (!second) return first;\n\n\treturn ((...args: Parameters<T>) => {\n\t\t// Factory 콜백 먼저 실행\n\t\tconst firstResult = first(...args);\n\t\t// Override 콜백 실행\n\t\tconst secondResult = second(...args);\n\n\t\t// Promise인 경우 체인으로 연결\n\t\tif (firstResult && typeof firstResult.then === \"function\") {\n\t\t\treturn firstResult.then(() => secondResult);\n\t\t}\n\n\t\treturn secondResult;\n\t}) as T;\n}\n\n/**\n * 내부 구현 함수\n */\nfunction _useMutationInternal<\n\tTVariables = any,\n\tTData = unknown,\n\tTError = FetchError<ApiErrorResponse>,\n>(options: UseMutationOptions<TVariables, TData, TError>): UseMutationResult<TData, TError, TVariables> {\n\tconst queryClient = useQueryClient();\n\tconst fetcher = queryClient.getFetcher();\n\tconst defaultOptions = queryClient.getDefaultOptions();\n\t\n\t// 전역 기본값과 개별 옵션 병합 - 직접 병합으로 단순화\n\tconst defaults = defaultOptions?.mutations || {};\n\tconst mergedThrowOnError = options.throwOnError !== undefined \n\t\t? options.throwOnError \n\t\t: defaults.throwOnError;\n\n\t// 런타임 검증 (개발 환경에서만)\n\tif (process.env.NODE_ENV !== \"production\") {\n\t\ttry {\n\t\t\tvalidateMutationConfig(options as any);\n\t\t} catch (error) {\n\t\t\tthrow error; // 검증 실패 시 에러를 그대로 던짐\n\t\t}\n\t}\n\n\t// 통일된 시그니처 사용: 모든 mutation이 (variables, fetcher) 패턴 사용\n\n\tconst [state, dispatch] = useReducer(\n\t\t(\n\t\t\tprevState: MutationState<TData, TError, TVariables>,\n\t\t\taction: MutationAction<TData, TError, TVariables>,\n\t\t): MutationState<TData, TError, TVariables> => {\n\t\t\tswitch (action.type) {\n\t\t\t\tcase \"MUTATE\":\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...prevState,\n\t\t\t\t\t\tisPending: true,\n\t\t\t\t\t\tisSuccess: false,\n\t\t\t\t\t\tisError: false,\n\t\t\t\t\t\terror: null,\n\t\t\t\t\t};\n\t\t\t\tcase \"SUCCESS\":\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...prevState,\n\t\t\t\t\t\tisPending: false,\n\t\t\t\t\t\tisSuccess: true,\n\t\t\t\t\t\tisError: false,\n\t\t\t\t\t\tdata: action.data,\n\t\t\t\t\t\terror: null,\n\t\t\t\t\t};\n\t\t\t\tcase \"ERROR\":\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...prevState,\n\t\t\t\t\t\tisPending: false,\n\t\t\t\t\t\tisSuccess: false,\n\t\t\t\t\t\tisError: true,\n\t\t\t\t\t\terror: action.error,\n\t\t\t\t\t};\n\t\t\t\tcase \"RESET\":\n\t\t\t\t\treturn getInitialState();\n\t\t\t\tdefault:\n\t\t\t\t\treturn prevState;\n\t\t\t}\n\t\t},\n\t\tgetInitialState<TData, TError, TVariables>(),\n\t);\n\n\tconst latestOptions = useRef(options);\n\tlatestOptions.current = options;\n\n\t// Mutation 함수 생성\n\tconst getMutationFn = useCallback(() => {\n\t\tif (\"mutationFn\" in options && options.mutationFn) {\n\t\t\t// 통일된 시그니처: 모든 mutationFn은 (variables, fetcher) 패턴을 사용\n\t\t\treturn options.mutationFn;\n\t\t}\n\n\t\t// URL + Method 기반 mutation 함수 생성\n\t\treturn async (variables: TVariables, fetcher: NextTypeFetch) => {\n\t\t\tconst urlBasedOptions = options as UrlBasedUseMutationOptions<TVariables, TData, TError>;\n\t\t\tconst url = isFunction(urlBasedOptions.url) ? urlBasedOptions.url(variables) : urlBasedOptions.url;\n\t\t\tconst method = urlBasedOptions.method;\n\n\t\t\t// 요청 데이터 검증\n\t\t\tlet dataForRequest: any = variables;\n\t\t\tif (options.requestSchema) {\n\t\t\t\ttry {\n\t\t\t\t\tdataForRequest = options.requestSchema.parse(variables);\n\t\t\t\t} catch (e) {\n\t\t\t\t\tif (e instanceof z.ZodError) {\n\t\t\t\t\t\tconst config = {\n\t\t\t\t\t\t\turl: url as string,\n\t\t\t\t\t\t\tmethod: method as MutationMethod,\n\t\t\t\t\t\t\tdata: variables,\n\t\t\t\t\t\t} as RequestConfig;\n\n\t\t\t\t\t\tconst fetchError = new FetchError(\n\t\t\t\t\t\t\t`Request validation failed: ${e.issues.map((issue) => issue.message).join(\", \")}`,\n\t\t\t\t\t\t\tconfig,\n\t\t\t\t\t\t\t\"ERR_VALIDATION\",\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tfetchError.name = \"ValidationError\";\n\t\t\t\t\t\tfetchError.cause = e;\n\t\t\t\t\t\t(fetchError as any).isValidationError = true;\n\t\t\t\t\t\tthrow fetchError;\n\t\t\t\t\t}\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst requestConfig: RequestConfig = merge(\n\t\t\t\t{ schema: options.responseSchema },\n\t\t\t\t// fetcher.defaults에서 baseURL을 가져와서 기본값으로 설정\n\t\t\t\t{ baseURL: fetcher.defaults.baseURL },\n\t\t\t\toptions.fetchConfig || {},\n\t\t\t\t{\n\t\t\t\t\turl: url as string,\n\t\t\t\t\tmethod: method as any, // MutationMethod는 HttpMethod의 부분집합이므로 안전\n\t\t\t\t\tdata: dataForRequest,\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tconst response = await fetcher.request(requestConfig);\n\t\t\treturn response.data;\n\t\t};\n\t}, [options, fetcher]);\n\n\tconst mutateCallback = useCallback(\n\t\tasync (\n\t\t\tvariables?: TVariables,\n\t\t\tmutateLocalOptions?: {\n\t\t\t\tonSuccess?: (data: TData, variables: TVariables, context: any) => void;\n\t\t\t\tonError?: (error: TError, variables: TVariables, context: any) => void;\n\t\t\t\tonSettled?: (\n\t\t\t\t\tdata: TData | undefined,\n\t\t\t\t\terror: TError | null,\n\t\t\t\t\tvariables: TVariables,\n\t\t\t\t\tcontext: any,\n\t\t\t\t) => void;\n\t\t\t},\n\t\t): Promise<TData> => {\n\t\t\tdispatch({ type: \"MUTATE\", variables: variables as TVariables });\n\t\t\tlet context: any;\n\n\t\t\ttry {\n\t\t\t\t// onMutate 콜백\n\t\t\t\tconst onMutateCb = latestOptions.current.onMutate;\n\t\t\t\tif (onMutateCb) {\n\t\t\t\t\tcontext = await onMutateCb(variables as any);\n\t\t\t\t}\n\n\t\t\t\t// 실제 mutation 함수 실행\n\t\t\t\tconst mutationFn = getMutationFn();\n\t\t\t\tconst data = (await mutationFn(variables as TVariables, fetcher)) as TData;\n\t\t\t\tdispatch({ type: \"SUCCESS\", data });\n\n\t\t\t\t// onSuccess 콜백들 실행\n\t\t\t\tif (latestOptions.current.onSuccess) {\n\t\t\t\t\tawait latestOptions.current.onSuccess(data, variables as any, context);\n\t\t\t\t}\n\t\t\t\tif (mutateLocalOptions?.onSuccess) {\n\t\t\t\t\tmutateLocalOptions.onSuccess(data, variables as any, context);\n\t\t\t\t}\n\n\t\t\t\t// invalidateQueries 처리\n\t\t\t\tconst invalidateQueriesOption = latestOptions.current.invalidateQueries;\n\t\t\t\tif (invalidateQueriesOption) {\n\t\t\t\t\tlet keysToInvalidate: string[][];\n\n\t\t\t\t\tif (isFunction(invalidateQueriesOption)) {\n\t\t\t\t\t\tkeysToInvalidate = invalidateQueriesOption(data, variables as any, context) as string[][];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tkeysToInvalidate = invalidateQueriesOption as string[][];\n\t\t\t\t\t}\n\n\t\t\t\t\tif (isArray(keysToInvalidate)) {\n\t\t\t\t\t\tkeysToInvalidate.forEach((queryKey) => {\n\t\t\t\t\t\t\tqueryClient.invalidateQueries(queryKey);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// onSettled 콜백들 실행\n\t\t\t\tif (latestOptions.current.onSettled) {\n\t\t\t\t\tawait latestOptions.current.onSettled(data, null, variables as any, context);\n\t\t\t\t}\n\t\t\t\tif (mutateLocalOptions?.onSettled) {\n\t\t\t\t\tmutateLocalOptions.onSettled(data, null, variables as any, context);\n\t\t\t\t}\n\n\t\t\t\treturn data as TData;\n\t\t\t} catch (err) {\n\t\t\t\tconst error = err as TError;\n\t\t\t\tdispatch({ type: \"ERROR\", error });\n\n\t\t\t\t// onError 콜백들 실행\n\t\t\t\tif (latestOptions.current.onError) {\n\t\t\t\t\tawait latestOptions.current.onError(error, variables as any, context);\n\t\t\t\t}\n\t\t\t\tif (mutateLocalOptions?.onError) {\n\t\t\t\t\tmutateLocalOptions.onError(error, variables as any, context);\n\t\t\t\t}\n\n\t\t\t\t// onSettled 콜백들 실행\n\t\t\t\tif (latestOptions.current.onSettled) {\n\t\t\t\t\tawait latestOptions.current.onSettled(undefined, error, variables as any, context);\n\t\t\t\t}\n\t\t\t\tif (mutateLocalOptions?.onSettled) {\n\t\t\t\t\tmutateLocalOptions.onSettled(undefined, error, variables as any, context);\n\t\t\t\t}\n\n\t\t\t\t// 항상 에러를 throw (throwOnError와 관계없이 mutateAsync는 에러를 throw해야 함)\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t},\n\t\t[getMutationFn, queryClient, fetcher],\n\t);\n\n\tconst mutate = useCallback(\n\t\t(variables?: TVariables, localOptions?: any) => {\n\t\t\tmutateCallback(variables, localOptions).catch(() => {\n\t\t\t\t// 에러는 state에 저장되고 useEffect에서 처리됨\n\t\t\t});\n\t\t},\n\t\t[mutateCallback],\n\t);\n\n\tconst mutateAsync = useCallback(\n\t\t(variables?: TVariables, localOptions?: any): Promise<TData> => {\n\t\t\treturn mutateCallback(variables, localOptions);\n\t\t},\n\t\t[mutateCallback],\n\t);\n\n\tconst reset = useCallback(() => {\n\t\tdispatch({ type: \"RESET\" });\n\t}, []);\n\n\t// Error Boundary로 에러 전파\n\t// React 18+에서는 useEffect에서 throw한 에러가 Error Boundary로 전파됨\n\tuseEffect(() => {\n\t\tif (state.error && mergedThrowOnError) {\n\t\t\tconst shouldThrow = typeof mergedThrowOnError === 'function'\n\t\t\t\t? mergedThrowOnError(state.error)\n\t\t\t\t: mergedThrowOnError;\n\t\t\t\n\t\t\tif (shouldThrow) {\n\t\t\t\t// 개발/테스트 환경에서 Error Boundary 경고\n\t\t\t\tif (process.env.NODE_ENV !== 'production') {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t'[next-unified-query] Warning: Mutation throwOnError is enabled.\\n' +\n\t\t\t\t\t\t'This will propagate the error to the nearest Error Boundary.\\n' +\n\t\t\t\t\t\t'Make sure you have an Error Boundary set up.\\n\\n' +\n\t\t\t\t\t\t'To fix this issue:\\n' +\n\t\t\t\t\t\t'1. Wrap your component with an Error Boundary:\\n' +\n\t\t\t\t\t\t' <ErrorBoundary fallback={<ErrorFallback />}>\\n' +\n\t\t\t\t\t\t' <YourComponent />\\n' +\n\t\t\t\t\t\t' </ErrorBoundary>\\n\\n' +\n\t\t\t\t\t\t'2. Or disable throwOnError:\\n' +\n\t\t\t\t\t\t' useMutation({ throwOnError: false, ... })\\n\\n' +\n\t\t\t\t\t\t'Original error:', state.error\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t// Error Boundary로 에러 전파\n\t\t\t\tthrow state.error;\n\t\t\t}\n\t\t}\n\t\t// 안정적인 mergedThrowOnError 참조 사용\n\t}, [state.error, mergedThrowOnError]);\n\n\treturn {\n\t\t...state,\n\t\tmutate: mutate as any,\n\t\tmutateAsync: mutateAsync as any,\n\t\treset,\n\t};\n}\n","import * as React from 'react';\nimport type { FetchError } from 'next-unified-query-core';\n\n/**\n * Error Boundary Props\n */\nexport interface QueryErrorBoundaryProps {\n\t/**\n\t * Fallback UI를 렌더링하는 함수\n\t * @param error - 발생한 에러\n\t * @param reset - Error Boundary를 리셋하는 함수\n\t */\n\tfallback?: (error: Error, reset: () => void) => React.ReactNode;\n\t\n\t/**\n\t * 에러 발생 시 호출되는 콜백\n\t * 에러 로깅이나 모니터링 서비스 전송에 사용\n\t */\n\tonError?: (error: Error, errorInfo: { componentStack: string }) => void;\n\t\n\t/**\n\t * Error Boundary가 리셋될 때 호출되는 콜백\n\t */\n\tonReset?: () => void;\n\t\n\t/**\n\t * 이 키들이 변경되면 Error Boundary가 자동으로 리셋됨\n\t */\n\tresetKeys?: Array<string | number>;\n\t\n\t/**\n\t * Error Boundary로 감쌀 컴포넌트\n\t */\n\tchildren: React.ReactNode;\n}\n\ninterface QueryErrorBoundaryState {\n\thasError: boolean;\n\terror: Error | null;\n}\n\n/**\n * 내부 Error Boundary 클래스 컴포넌트\n * React 18과 19 호환을 위한 타입 처리\n */\nclass QueryErrorBoundaryClass extends React.Component<\n\tQueryErrorBoundaryProps,\n\tQueryErrorBoundaryState\n> {\n\tconstructor(props: QueryErrorBoundaryProps) {\n\t\tsuper(props);\n\t\tthis.state = { hasError: false, error: null };\n\t}\n\n\t/**\n\t * React 공식 Error Boundary 메서드\n\t * 에러 발생 시 state를 업데이트하여 fallback UI를 렌더링합니다.\n\t */\n\tstatic getDerivedStateFromError(error: Error): QueryErrorBoundaryState {\n\t\t// 다음 렌더링에서 fallback UI를 표시하도록 state 업데이트\n\t\treturn { hasError: true,