@ttt-productions/query-core 0.14.24 → 0.14.25

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.
@@ -1,7 +1,6 @@
1
- import type { UseMutationResult } from '@tanstack/react-query';
2
1
  import type { ExpectedCallableAnswerCode } from '@ttt-productions/firebase-helpers';
3
2
  import { type FunctionsProvider } from '@ttt-productions/firebase-helpers/client';
4
- import { type SessionMutationOptions } from '../session-mutation.js';
3
+ import { type SessionMutationOptions, type SessionMutationResult } from '../session-mutation.js';
5
4
  export interface CallableErrorRouting {
6
5
  showErrorToast: boolean;
7
6
  answeredRefusals: readonly ExpectedCallableAnswerCode[];
@@ -28,10 +27,10 @@ export type ResumableOutcome<TResult> = TResult & {
28
27
  interruption: Error | null;
29
28
  };
30
29
  export interface Callables {
31
- createCallableHook<TInput, TResult>(functionName: string, declaration?: CallableDeclaration): <TOnMutateResult = unknown>(options?: CallableMutationOptions<TInput, TResult, TOnMutateResult>) => UseMutationResult<TResult, Error, TInput, TOnMutateResult>;
30
+ createCallableHook<TInput, TResult>(functionName: string, declaration?: CallableDeclaration): <TOnMutateResult = unknown>(options?: CallableMutationOptions<TInput, TResult, TOnMutateResult>) => SessionMutationResult<TResult, Error, TInput, TOnMutateResult>;
32
31
  createResumableCallableHook<TInput, TResult extends {
33
32
  complete: boolean;
34
- }>(functionName: string, merge: (earlier: TResult, later: TResult) => TResult, declaration?: CallableDeclaration): <TOnMutateResult = unknown>(options?: CallableMutationOptions<TInput, ResumableOutcome<TResult>, TOnMutateResult>) => UseMutationResult<ResumableOutcome<TResult>, Error, TInput, TOnMutateResult>;
33
+ }>(functionName: string, merge: (earlier: TResult, later: TResult) => TResult, declaration?: CallableDeclaration): <TOnMutateResult = unknown>(options?: CallableMutationOptions<TInput, ResumableOutcome<TResult>, TOnMutateResult>) => SessionMutationResult<ResumableOutcome<TResult>, Error, TInput, TOnMutateResult>;
35
34
  createCallableReader<TInput, TResult>(functionName: string, declaration?: CallableDeclaration): () => (input: TInput) => Promise<TResult>;
36
35
  createCallableInvoker<TInput, TResult>(functionName: string, declaration?: CallableDeclaration): () => (input: TInput) => Promise<TResult>;
37
36
  }
@@ -1 +1 @@
1
- {"version":3,"file":"create-callables.d.ts","sourceRoot":"","sources":["../../../src/react/callables/create-callables.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create-callables.d.ts","sourceRoot":"","sources":["../../../src/react/callables/create-callables.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"create-callables.js","sourceRoot":"","sources":["../../../src/react/callables/create-callables.ts"],"names":[],"mappings":"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","sourcesContent":["'use client';\n\nimport { useCallback, useMemo, useRef } from 'react';\nimport type { UseMutationResult } from '@tanstack/react-query';\nimport type { ExpectedCallableAnswerCode } from '@ttt-productions/firebase-helpers';\nimport {\n callCallable,\n isRecoveredFallbackReport,\n type FunctionsProvider,\n} from '@ttt-productions/firebase-helpers/client';\nimport {\n useMutationSessionCapture,\n useSessionMutation,\n type MutationSession,\n type SessionMutationOptions,\n} from '../session-mutation.js';\n\nexport interface CallableErrorRouting {\n showErrorToast: boolean;\n answeredRefusals: readonly ExpectedCallableAnswerCode[];\n isAnswerSurfacedByCaller?: (error: unknown) => boolean;\n}\n\nexport type CallableCaptureContext = Record<string, unknown>;\n\nexport interface CallablePolicy {\n getFunctions: FunctionsProvider;\n timeoutMs: number;\n resolveLimitedUseAppCheck: (requested: boolean) => boolean;\n captureFault: (error: unknown, context: CallableCaptureContext) => void;\n captureRecoveredFallback: (error: unknown, context: CallableCaptureContext) => void;\n onActionError: (error: unknown, routing: CallableErrorRouting) => void;\n}\n\nexport interface CallableDeclaration {\n limitedUseAppCheck?: true;\n}\n\ninterface CallableTransportOptions extends Partial<CallableErrorRouting> {\n captureFaults?: boolean;\n}\n\nexport type CallableMutationOptions<TInput, TResult, TOnMutateResult = unknown> = Omit<\n SessionMutationOptions<TResult, Error, TInput, TOnMutateResult>,\n 'mutationFn' | 'retry'\n> &\n Pick<\n CallableTransportOptions,\n 'showErrorToast' | 'answeredRefusals' | 'isAnswerSurfacedByCaller' | 'captureFaults'\n >;\n\nexport const MAX_RESUMABLE_CALLS = 12;\n\nexport type ResumableOutcome<TResult> = TResult & { interruption: Error | null };\n\nexport interface Callables {\n createCallableHook<TInput, TResult>(\n functionName: string,\n declaration?: CallableDeclaration,\n ): <TOnMutateResult = unknown>(\n options?: CallableMutationOptions<TInput, TResult, TOnMutateResult>,\n ) => UseMutationResult<TResult, Error, TInput, TOnMutateResult>;\n createResumableCallableHook<TInput, TResult extends { complete: boolean }>(\n functionName: string,\n merge: (earlier: TResult, later: TResult) => TResult,\n declaration?: CallableDeclaration,\n ): <TOnMutateResult = unknown>(\n options?: CallableMutationOptions<TInput, ResumableOutcome<TResult>, TOnMutateResult>,\n ) => UseMutationResult<ResumableOutcome<TResult>, Error, TInput, TOnMutateResult>;\n createCallableReader<TInput, TResult>(\n functionName: string,\n declaration?: CallableDeclaration,\n ): () => (input: TInput) => Promise<TResult>;\n createCallableInvoker<TInput, TResult>(\n functionName: string,\n declaration?: CallableDeclaration,\n ): () => (input: TInput) => Promise<TResult>;\n}\n\ntype CallableTransport = <TInput, TResult>(\n input: TInput,\n session: MutationSession,\n) => Promise<TResult>;\n\nexport function createCallables(policy: CallablePolicy): Callables {\n function useCallableTransport(\n functionName: string,\n declaration: CallableDeclaration,\n options: CallableTransportOptions,\n ): CallableTransport {\n const optionsRef = useRef(options);\n optionsRef.current = options;\n const limitedUseAppCheck = policy.resolveLimitedUseAppCheck(\n declaration.limitedUseAppCheck === true,\n );\n\n return useCallback(\n <TInput, TResult>(input: TInput, session: MutationSession) =>\n callCallable<TInput, TResult>(\n policy.getFunctions,\n functionName,\n input,\n {\n captureException: (error, context) => {\n if (optionsRef.current.captureFaults !== false) policy.captureFault(error, context);\n else if (isRecoveredFallbackReport(context))\n policy.captureRecoveredFallback(error, context);\n },\n onError: (error) => {\n if (!session.isCurrent()) return;\n const {\n showErrorToast = true,\n answeredRefusals = [],\n isAnswerSurfacedByCaller,\n } = optionsRef.current;\n policy.onActionError(error, {\n showErrorToast,\n answeredRefusals,\n isAnswerSurfacedByCaller,\n });\n },\n },\n { timeoutMs: policy.timeoutMs, limitedUseAppCheck },\n ),\n [functionName, limitedUseAppCheck],\n );\n }\n\n function useSessionBoundCall<TInput, TResult>(\n call: CallableTransport,\n ): (input: TInput) => Promise<TResult> {\n const captureSession = useMutationSessionCapture();\n return useMemo(\n () => (input: TInput) => call<TInput, TResult>(input, captureSession()),\n [call, captureSession],\n );\n }\n\n return {\n createCallableHook<TInput, TResult>(\n functionName: string,\n declaration: CallableDeclaration = {},\n ) {\n return function useNamedCallable<TOnMutateResult = unknown>(\n options: CallableMutationOptions<TInput, TResult, TOnMutateResult> = {},\n ): UseMutationResult<TResult, Error, TInput, TOnMutateResult> {\n const {\n showErrorToast,\n answeredRefusals,\n isAnswerSurfacedByCaller,\n captureFaults,\n ...mutationOptions\n } = options;\n const call = useCallableTransport(functionName, declaration, {\n showErrorToast,\n answeredRefusals,\n isAnswerSurfacedByCaller,\n captureFaults,\n });\n // `retry: false` comes last so nothing overrides it: a deadline expiry is an unknown outcome,\n // and a retry after a committed first attempt writes twice.\n return useSessionMutation<TResult, Error, TInput, TOnMutateResult>({\n ...mutationOptions,\n retry: false,\n mutationFn: (input, { session }) => call<TInput, TResult>(input, session),\n });\n };\n },\n\n createResumableCallableHook<TInput, TResult extends { complete: boolean }>(\n functionName: string,\n merge: (earlier: TResult, later: TResult) => TResult,\n declaration: CallableDeclaration = {},\n ) {\n return function useNamedResumableCallable<TOnMutateResult = unknown>(\n options: CallableMutationOptions<TInput, ResumableOutcome<TResult>, TOnMutateResult> = {},\n ): UseMutationResult<ResumableOutcome<TResult>, Error, TInput, TOnMutateResult> {\n const {\n showErrorToast,\n answeredRefusals,\n isAnswerSurfacedByCaller,\n captureFaults,\n ...mutationOptions\n } = options;\n const call = useCallableTransport(functionName, declaration, {\n showErrorToast,\n answeredRefusals,\n isAnswerSurfacedByCaller,\n captureFaults,\n });\n return useSessionMutation<ResumableOutcome<TResult>, Error, TInput, TOnMutateResult>({\n ...mutationOptions,\n retry: false,\n mutationFn: async (input, { session }): Promise<ResumableOutcome<TResult>> => {\n let progress = await call<TInput, TResult>(input, session);\n for (let calls = 1; !progress.complete && calls < MAX_RESUMABLE_CALLS; calls += 1) {\n session.assertCurrent();\n let later: TResult;\n try {\n later = await call<TInput, TResult>(input, session);\n } catch (error) {\n const interruption = error instanceof Error ? error : new Error(String(error));\n return { ...progress, complete: false, interruption };\n }\n progress = merge(progress, later);\n }\n return { ...progress, interruption: null };\n },\n });\n };\n },\n\n createCallableReader<TInput, TResult>(\n functionName: string,\n declaration: CallableDeclaration = {},\n ) {\n return function useNamedCallableReader(): (input: TInput) => Promise<TResult> {\n const call = useCallableTransport(functionName, declaration, {\n showErrorToast: false,\n captureFaults: false,\n });\n return useSessionBoundCall<TInput, TResult>(call);\n };\n },\n\n createCallableInvoker<TInput, TResult>(\n functionName: string,\n declaration: CallableDeclaration = {},\n ) {\n return function useNamedCallableInvoker(): (input: TInput) => Promise<TResult> {\n const call = useCallableTransport(functionName, declaration, {});\n return useSessionBoundCall<TInput, TResult>(call);\n };\n },\n };\n}\n"]}
1
+ {"version":3,"file":"create-callables.js","sourceRoot":"","sources":["../../../src/react/callables/create-callables.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAErD,OAAO,EACL,YAAY,EACZ,yBAAyB,GAE1B,MAAM,0CAA0C,CAAC;AAClD,OAAO,EACL,yBAAyB,EACzB,kBAAkB,GAInB,MAAM,wBAAwB,CAAC;AAoChC,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAiCtC,MAAM,UAAU,eAAe,CAAC,MAAsB;IACpD,SAAS,oBAAoB,CAC3B,YAAoB,EACpB,WAAgC,EAChC,OAAiC;QAEjC,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QACnC,UAAU,CAAC,OAAO,GAAG,OAAO,CAAC;QAC7B,MAAM,kBAAkB,GAAG,MAAM,CAAC,yBAAyB,CACzD,WAAW,CAAC,kBAAkB,KAAK,IAAI,CACxC,CAAC;QAEF,OAAO,WAAW,CAChB,CAAkB,KAAa,EAAE,OAAwB,EAAE,EAAE,CAC3D,YAAY,CACV,MAAM,CAAC,YAAY,EACnB,YAAY,EACZ,KAAK,EACL;YACE,gBAAgB,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;gBACnC,IAAI,UAAU,CAAC,OAAO,CAAC,aAAa,KAAK,KAAK;oBAAE,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;qBAC/E,IAAI,yBAAyB,CAAC,OAAO,CAAC;oBACzC,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACpD,CAAC;YACD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBACjB,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;oBAAE,OAAO;gBACjC,MAAM,EACJ,cAAc,GAAG,IAAI,EACrB,gBAAgB,GAAG,EAAE,EACrB,wBAAwB,GACzB,GAAG,UAAU,CAAC,OAAO,CAAC;gBACvB,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE;oBAC1B,cAAc;oBACd,gBAAgB;oBAChB,wBAAwB;iBACzB,CAAC,CAAC;YACL,CAAC;SACF,EACD,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,kBAAkB,EAAE,CACpD,EACH,CAAC,YAAY,EAAE,kBAAkB,CAAC,CACnC,CAAC;IACJ,CAAC;IAED,SAAS,mBAAmB,CAC1B,IAAuB;QAEvB,MAAM,cAAc,GAAG,yBAAyB,EAAE,CAAC;QACnD,OAAO,OAAO,CACZ,GAAG,EAAE,CAAC,CAAC,KAAa,EAAE,EAAE,CAAC,IAAI,CAAkB,KAAK,EAAE,cAAc,EAAE,CAAC,EACvE,CAAC,IAAI,EAAE,cAAc,CAAC,CACvB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,kBAAkB,CAChB,YAAoB,EACpB,cAAmC,EAAE;YAErC,OAAO,SAAS,gBAAgB,CAC9B,UAAqE,EAAE;gBAEvE,MAAM,EACJ,cAAc,EACd,gBAAgB,EAChB,wBAAwB,EACxB,aAAa,EACb,GAAG,eAAe,EACnB,GAAG,OAAO,CAAC;gBACZ,MAAM,IAAI,GAAG,oBAAoB,CAAC,YAAY,EAAE,WAAW,EAAE;oBAC3D,cAAc;oBACd,gBAAgB;oBAChB,wBAAwB;oBACxB,aAAa;iBACd,CAAC,CAAC;gBACH,8FAA8F;gBAC9F,4DAA4D;gBAC5D,OAAO,kBAAkB,CAA0C;oBACjE,GAAG,eAAe;oBAClB,KAAK,EAAE,KAAK;oBACZ,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,IAAI,CAAkB,KAAK,EAAE,OAAO,CAAC;iBAC1E,CAAC,CAAC;YACL,CAAC,CAAC;QACJ,CAAC;QAED,2BAA2B,CACzB,YAAoB,EACpB,KAAoD,EACpD,cAAmC,EAAE;YAErC,OAAO,SAAS,yBAAyB,CACvC,UAAuF,EAAE;gBAEzF,MAAM,EACJ,cAAc,EACd,gBAAgB,EAChB,wBAAwB,EACxB,aAAa,EACb,GAAG,eAAe,EACnB,GAAG,OAAO,CAAC;gBACZ,MAAM,IAAI,GAAG,oBAAoB,CAAC,YAAY,EAAE,WAAW,EAAE;oBAC3D,cAAc;oBACd,gBAAgB;oBAChB,wBAAwB;oBACxB,aAAa;iBACd,CAAC,CAAC;gBACH,OAAO,kBAAkB,CAA4D;oBACnF,GAAG,eAAe;oBAClB,KAAK,EAAE,KAAK;oBACZ,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAsC,EAAE;wBAC3E,IAAI,QAAQ,GAAG,MAAM,IAAI,CAAkB,KAAK,EAAE,OAAO,CAAC,CAAC;wBAC3D,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,IAAI,KAAK,GAAG,mBAAmB,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;4BAClF,OAAO,CAAC,aAAa,EAAE,CAAC;4BACxB,IAAI,KAAc,CAAC;4BACnB,IAAI,CAAC;gCACH,KAAK,GAAG,MAAM,IAAI,CAAkB,KAAK,EAAE,OAAO,CAAC,CAAC;4BACtD,CAAC;4BAAC,OAAO,KAAK,EAAE,CAAC;gCACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gCAC/E,OAAO,EAAE,GAAG,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;4BACxD,CAAC;4BACD,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;wBACpC,CAAC;wBACD,OAAO,EAAE,GAAG,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;oBAC7C,CAAC;iBACF,CAAC,CAAC;YACL,CAAC,CAAC;QACJ,CAAC;QAED,oBAAoB,CAClB,YAAoB,EACpB,cAAmC,EAAE;YAErC,OAAO,SAAS,sBAAsB;gBACpC,MAAM,IAAI,GAAG,oBAAoB,CAAC,YAAY,EAAE,WAAW,EAAE;oBAC3D,cAAc,EAAE,KAAK;oBACrB,aAAa,EAAE,KAAK;iBACrB,CAAC,CAAC;gBACH,OAAO,mBAAmB,CAAkB,IAAI,CAAC,CAAC;YACpD,CAAC,CAAC;QACJ,CAAC;QAED,qBAAqB,CACnB,YAAoB,EACpB,cAAmC,EAAE;YAErC,OAAO,SAAS,uBAAuB;gBACrC,MAAM,IAAI,GAAG,oBAAoB,CAAC,YAAY,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;gBACjE,OAAO,mBAAmB,CAAkB,IAAI,CAAC,CAAC;YACpD,CAAC,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["'use client';\n\nimport { useCallback, useMemo, useRef } from 'react';\nimport type { ExpectedCallableAnswerCode } from '@ttt-productions/firebase-helpers';\nimport {\n callCallable,\n isRecoveredFallbackReport,\n type FunctionsProvider,\n} from '@ttt-productions/firebase-helpers/client';\nimport {\n useMutationSessionCapture,\n useSessionMutation,\n type MutationSession,\n type SessionMutationOptions,\n type SessionMutationResult,\n} from '../session-mutation.js';\n\nexport interface CallableErrorRouting {\n showErrorToast: boolean;\n answeredRefusals: readonly ExpectedCallableAnswerCode[];\n isAnswerSurfacedByCaller?: (error: unknown) => boolean;\n}\n\nexport type CallableCaptureContext = Record<string, unknown>;\n\nexport interface CallablePolicy {\n getFunctions: FunctionsProvider;\n timeoutMs: number;\n resolveLimitedUseAppCheck: (requested: boolean) => boolean;\n captureFault: (error: unknown, context: CallableCaptureContext) => void;\n captureRecoveredFallback: (error: unknown, context: CallableCaptureContext) => void;\n onActionError: (error: unknown, routing: CallableErrorRouting) => void;\n}\n\nexport interface CallableDeclaration {\n limitedUseAppCheck?: true;\n}\n\ninterface CallableTransportOptions extends Partial<CallableErrorRouting> {\n captureFaults?: boolean;\n}\n\nexport type CallableMutationOptions<TInput, TResult, TOnMutateResult = unknown> = Omit<\n SessionMutationOptions<TResult, Error, TInput, TOnMutateResult>,\n 'mutationFn' | 'retry'\n> &\n Pick<\n CallableTransportOptions,\n 'showErrorToast' | 'answeredRefusals' | 'isAnswerSurfacedByCaller' | 'captureFaults'\n >;\n\nexport const MAX_RESUMABLE_CALLS = 12;\n\nexport type ResumableOutcome<TResult> = TResult & { interruption: Error | null };\n\nexport interface Callables {\n createCallableHook<TInput, TResult>(\n functionName: string,\n declaration?: CallableDeclaration,\n ): <TOnMutateResult = unknown>(\n options?: CallableMutationOptions<TInput, TResult, TOnMutateResult>,\n ) => SessionMutationResult<TResult, Error, TInput, TOnMutateResult>;\n createResumableCallableHook<TInput, TResult extends { complete: boolean }>(\n functionName: string,\n merge: (earlier: TResult, later: TResult) => TResult,\n declaration?: CallableDeclaration,\n ): <TOnMutateResult = unknown>(\n options?: CallableMutationOptions<TInput, ResumableOutcome<TResult>, TOnMutateResult>,\n ) => SessionMutationResult<ResumableOutcome<TResult>, Error, TInput, TOnMutateResult>;\n createCallableReader<TInput, TResult>(\n functionName: string,\n declaration?: CallableDeclaration,\n ): () => (input: TInput) => Promise<TResult>;\n createCallableInvoker<TInput, TResult>(\n functionName: string,\n declaration?: CallableDeclaration,\n ): () => (input: TInput) => Promise<TResult>;\n}\n\ntype CallableTransport = <TInput, TResult>(\n input: TInput,\n session: MutationSession,\n) => Promise<TResult>;\n\nexport function createCallables(policy: CallablePolicy): Callables {\n function useCallableTransport(\n functionName: string,\n declaration: CallableDeclaration,\n options: CallableTransportOptions,\n ): CallableTransport {\n const optionsRef = useRef(options);\n optionsRef.current = options;\n const limitedUseAppCheck = policy.resolveLimitedUseAppCheck(\n declaration.limitedUseAppCheck === true,\n );\n\n return useCallback(\n <TInput, TResult>(input: TInput, session: MutationSession) =>\n callCallable<TInput, TResult>(\n policy.getFunctions,\n functionName,\n input,\n {\n captureException: (error, context) => {\n if (optionsRef.current.captureFaults !== false) policy.captureFault(error, context);\n else if (isRecoveredFallbackReport(context))\n policy.captureRecoveredFallback(error, context);\n },\n onError: (error) => {\n if (!session.isCurrent()) return;\n const {\n showErrorToast = true,\n answeredRefusals = [],\n isAnswerSurfacedByCaller,\n } = optionsRef.current;\n policy.onActionError(error, {\n showErrorToast,\n answeredRefusals,\n isAnswerSurfacedByCaller,\n });\n },\n },\n { timeoutMs: policy.timeoutMs, limitedUseAppCheck },\n ),\n [functionName, limitedUseAppCheck],\n );\n }\n\n function useSessionBoundCall<TInput, TResult>(\n call: CallableTransport,\n ): (input: TInput) => Promise<TResult> {\n const captureSession = useMutationSessionCapture();\n return useMemo(\n () => (input: TInput) => call<TInput, TResult>(input, captureSession()),\n [call, captureSession],\n );\n }\n\n return {\n createCallableHook<TInput, TResult>(\n functionName: string,\n declaration: CallableDeclaration = {},\n ) {\n return function useNamedCallable<TOnMutateResult = unknown>(\n options: CallableMutationOptions<TInput, TResult, TOnMutateResult> = {},\n ): SessionMutationResult<TResult, Error, TInput, TOnMutateResult> {\n const {\n showErrorToast,\n answeredRefusals,\n isAnswerSurfacedByCaller,\n captureFaults,\n ...mutationOptions\n } = options;\n const call = useCallableTransport(functionName, declaration, {\n showErrorToast,\n answeredRefusals,\n isAnswerSurfacedByCaller,\n captureFaults,\n });\n // `retry: false` comes last so nothing overrides it: a deadline expiry is an unknown outcome,\n // and a retry after a committed first attempt writes twice.\n return useSessionMutation<TResult, Error, TInput, TOnMutateResult>({\n ...mutationOptions,\n retry: false,\n mutationFn: (input, { session }) => call<TInput, TResult>(input, session),\n });\n };\n },\n\n createResumableCallableHook<TInput, TResult extends { complete: boolean }>(\n functionName: string,\n merge: (earlier: TResult, later: TResult) => TResult,\n declaration: CallableDeclaration = {},\n ) {\n return function useNamedResumableCallable<TOnMutateResult = unknown>(\n options: CallableMutationOptions<TInput, ResumableOutcome<TResult>, TOnMutateResult> = {},\n ): SessionMutationResult<ResumableOutcome<TResult>, Error, TInput, TOnMutateResult> {\n const {\n showErrorToast,\n answeredRefusals,\n isAnswerSurfacedByCaller,\n captureFaults,\n ...mutationOptions\n } = options;\n const call = useCallableTransport(functionName, declaration, {\n showErrorToast,\n answeredRefusals,\n isAnswerSurfacedByCaller,\n captureFaults,\n });\n return useSessionMutation<ResumableOutcome<TResult>, Error, TInput, TOnMutateResult>({\n ...mutationOptions,\n retry: false,\n mutationFn: async (input, { session }): Promise<ResumableOutcome<TResult>> => {\n let progress = await call<TInput, TResult>(input, session);\n for (let calls = 1; !progress.complete && calls < MAX_RESUMABLE_CALLS; calls += 1) {\n session.assertCurrent();\n let later: TResult;\n try {\n later = await call<TInput, TResult>(input, session);\n } catch (error) {\n const interruption = error instanceof Error ? error : new Error(String(error));\n return { ...progress, complete: false, interruption };\n }\n progress = merge(progress, later);\n }\n return { ...progress, interruption: null };\n },\n });\n };\n },\n\n createCallableReader<TInput, TResult>(\n functionName: string,\n declaration: CallableDeclaration = {},\n ) {\n return function useNamedCallableReader(): (input: TInput) => Promise<TResult> {\n const call = useCallableTransport(functionName, declaration, {\n showErrorToast: false,\n captureFaults: false,\n });\n return useSessionBoundCall<TInput, TResult>(call);\n };\n },\n\n createCallableInvoker<TInput, TResult>(\n functionName: string,\n declaration: CallableDeclaration = {},\n ) {\n return function useNamedCallableInvoker(): (input: TInput) => Promise<TResult> {\n const call = useCallableTransport(functionName, declaration, {});\n return useSessionBoundCall<TInput, TResult>(call);\n };\n },\n };\n}\n"]}
@@ -1,17 +1,18 @@
1
- import { type QueryKey, type UseMutationResult } from '@tanstack/react-query';
1
+ import { type QueryKey } from '@tanstack/react-query';
2
2
  import { type DocumentData } from 'firebase/firestore';
3
+ import { type SessionMutationResult } from '../session-mutation.js';
3
4
  import type { FirestoreMutationOptions, FirestoreBatchOptions } from '../../firestore/types.js';
4
5
  import type { MutationOperation } from './types.js';
5
6
  interface SetResult<T> {
6
7
  id: string;
7
8
  data: T;
8
9
  }
9
- export declare function useFirestoreSet<T extends DocumentData>({ invalidateKeys, }?: Pick<FirestoreMutationOptions<T>, 'invalidateKeys'>): UseMutationResult<SetResult<T>, Error, {
10
+ export declare function useFirestoreSet<T extends DocumentData>({ invalidateKeys, }?: Pick<FirestoreMutationOptions<T>, 'invalidateKeys'>): SessionMutationResult<SetResult<T>, Error, {
10
11
  docPath: string;
11
12
  data: T;
12
13
  merge?: boolean;
13
14
  }>;
14
- export declare function useFirestoreUpdate<T extends DocumentData>({ invalidateKeys, optimistic, }?: FirestoreMutationOptions<T>): UseMutationResult<Partial<T>, Error, {
15
+ export declare function useFirestoreUpdate<T extends DocumentData>({ invalidateKeys, optimistic, }?: FirestoreMutationOptions<T>): SessionMutationResult<Partial<T>, Error, {
15
16
  docPath: string;
16
17
  data: Partial<T>;
17
18
  }, {
@@ -23,7 +24,7 @@ export declare function useFirestoreDelete<T = unknown>({ invalidateKeys, optimi
23
24
  queryKey: QueryKey;
24
25
  updater: (oldData: T | undefined, docPath: string) => T;
25
26
  };
26
- }): UseMutationResult<string, Error, {
27
+ }): SessionMutationResult<string, Error, {
27
28
  docPath: string;
28
29
  }, {
29
30
  previousData: T | undefined;
@@ -32,7 +33,7 @@ interface BatchResult {
32
33
  committed: number;
33
34
  batches: number;
34
35
  }
35
- export declare function useFirestoreBatch({ invalidateKeys, batchSize, }?: FirestoreBatchOptions): UseMutationResult<BatchResult, Error, {
36
+ export declare function useFirestoreBatch({ invalidateKeys, batchSize, }?: FirestoreBatchOptions): SessionMutationResult<BatchResult, Error, {
36
37
  operations: MutationOperation[];
37
38
  }>;
38
39
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"use-firestore-mutations.d.ts","sourceRoot":"","sources":["../../../src/react/firestore/use-firestore-mutations.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkB,KAAK,QAAQ,EAAE,KAAK,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC9F,OAAO,EAML,KAAK,YAAY,EAClB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,KAAK,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAIpD,UAAU,SAAS,CAAC,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,CAAC,CAAC;CACT;AAED,wBAAgB,eAAe,CAAC,CAAC,SAAS,YAAY,EAAE,EACtD,cAAmB,GACpB,GAAE,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,gBAAgB,CAAM,GAAG,iBAAiB,CAC7E,SAAS,CAAC,CAAC,CAAC,EACZ,KAAK,EACL;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,CAAC,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,CAC9C,CAwBA;AAED,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,YAAY,EAAE,EACzD,cAAmB,EACnB,UAAU,GACX,GAAE,wBAAwB,CAAC,CAAC,CAAM,GAAG,iBAAiB,CACrD,OAAO,CAAC,CAAC,CAAC,EACV,KAAK,EACL;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;CAAE,EACrC;IAAE,YAAY,EAAE,CAAC,GAAG,SAAS,CAAA;CAAE,GAAG,SAAS,CAC5C,CAoCA;AAED,wBAAgB,kBAAkB,CAAC,CAAC,GAAG,OAAO,EAAE,EAC9C,cAAmB,EACnB,UAAU,GACX,GAAE;IACD,cAAc,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;IACrC,UAAU,CAAC,EAAE;QACX,QAAQ,EAAE,QAAQ,CAAC;QACnB,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC,CAAC;KACzD,CAAC;CACE,GAAG,iBAAiB,CACxB,MAAM,EACN,KAAK,EACL;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,EACnB;IAAE,YAAY,EAAE,CAAC,GAAG,SAAS,CAAA;CAAE,GAAG,SAAS,CAC5C,CAkCA;AAED,UAAU,WAAW;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,iBAAiB,CAAC,EAChC,cAAmB,EACnB,SAA8B,GAC/B,GAAE,qBAA0B,GAAG,iBAAiB,CAC/C,WAAW,EACX,KAAK,EACL;IAAE,UAAU,EAAE,iBAAiB,EAAE,CAAA;CAAE,CACpC,CAmDA"}
1
+ {"version":3,"file":"use-firestore-mutations.d.ts","sourceRoot":"","sources":["../../../src/react/firestore/use-firestore-mutations.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAML,KAAK,YAAY,EAClB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAsB,KAAK,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACxF,OAAO,KAAK,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAIpD,UAAU,SAAS,CAAC,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,CAAC,CAAC;CACT;AAED,wBAAgB,eAAe,CAAC,CAAC,SAAS,YAAY,EAAE,EACtD,cAAmB,GACpB,GAAE,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,gBAAgB,CAAM,GAAG,qBAAqB,CACjF,SAAS,CAAC,CAAC,CAAC,EACZ,KAAK,EACL;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,CAAC,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,CAC9C,CAwBA;AAED,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,YAAY,EAAE,EACzD,cAAmB,EACnB,UAAU,GACX,GAAE,wBAAwB,CAAC,CAAC,CAAM,GAAG,qBAAqB,CACzD,OAAO,CAAC,CAAC,CAAC,EACV,KAAK,EACL;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;CAAE,EACrC;IAAE,YAAY,EAAE,CAAC,GAAG,SAAS,CAAA;CAAE,GAAG,SAAS,CAC5C,CAoCA;AAED,wBAAgB,kBAAkB,CAAC,CAAC,GAAG,OAAO,EAAE,EAC9C,cAAmB,EACnB,UAAU,GACX,GAAE;IACD,cAAc,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;IACrC,UAAU,CAAC,EAAE;QACX,QAAQ,EAAE,QAAQ,CAAC;QACnB,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC,CAAC;KACzD,CAAC;CACE,GAAG,qBAAqB,CAC5B,MAAM,EACN,KAAK,EACL;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,EACnB;IAAE,YAAY,EAAE,CAAC,GAAG,SAAS,CAAA;CAAE,GAAG,SAAS,CAC5C,CAkCA;AAED,UAAU,WAAW;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,iBAAiB,CAAC,EAChC,cAAmB,EACnB,SAA8B,GAC/B,GAAE,qBAA0B,GAAG,qBAAqB,CACnD,WAAW,EACX,KAAK,EACL;IAAE,UAAU,EAAE,iBAAiB,EAAE,CAAA;CAAE,CACpC,CAmDA"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-firestore-mutations.js","sourceRoot":"","sources":["../../../src/react/firestore/use-firestore-mutations.ts"],"names":[],"mappings":"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","sourcesContent":["'use client';\n\nimport { useQueryClient, type QueryKey, type UseMutationResult } from '@tanstack/react-query';\nimport {\n doc,\n setDoc,\n updateDoc,\n deleteDoc,\n writeBatch,\n type DocumentData,\n} from 'firebase/firestore';\nimport { useFirestoreDb } from './context.js';\nimport { useSessionMutation } from '../session-mutation.js';\nimport type { FirestoreMutationOptions, FirestoreBatchOptions } from '../../firestore/types.js';\nimport type { MutationOperation } from './types.js';\n\nconst DEFAULT_BATCH_SIZE = 450;\n\ninterface SetResult<T> {\n id: string;\n data: T;\n}\n\nexport function useFirestoreSet<T extends DocumentData>({\n invalidateKeys = [],\n}: Pick<FirestoreMutationOptions<T>, 'invalidateKeys'> = {}): UseMutationResult<\n SetResult<T>,\n Error,\n { docPath: string; data: T; merge?: boolean }\n> {\n const db = useFirestoreDb();\n const queryClient = useQueryClient();\n\n return useSessionMutation({\n mutationFn: async ({\n docPath,\n data,\n merge = false,\n }: {\n docPath: string;\n data: T;\n merge?: boolean;\n }) => {\n const docRef = doc(db, docPath);\n await setDoc(docRef, data, { merge });\n return { id: docRef.id, data };\n },\n onSuccess: () => {\n invalidateKeys.forEach((key) => {\n queryClient.invalidateQueries({ queryKey: key });\n });\n },\n });\n}\n\nexport function useFirestoreUpdate<T extends DocumentData>({\n invalidateKeys = [],\n optimistic,\n}: FirestoreMutationOptions<T> = {}): UseMutationResult<\n Partial<T>,\n Error,\n { docPath: string; data: Partial<T> },\n { previousData: T | undefined } | undefined\n> {\n const db = useFirestoreDb();\n const queryClient = useQueryClient();\n\n return useSessionMutation({\n mutationFn: async ({ docPath, data }: { docPath: string; data: Partial<T> }) => {\n const docRef = doc(db, docPath);\n await updateDoc(docRef, data as DocumentData);\n return data;\n },\n onMutate: async ({ data }) => {\n if (!optimistic) return undefined;\n\n await queryClient.cancelQueries({ queryKey: optimistic.queryKey });\n const previousData = queryClient.getQueryData<T>(optimistic.queryKey);\n\n queryClient.setQueryData<T>(optimistic.queryKey, (old) =>\n optimistic.updater(old, data as Partial<T>),\n );\n\n return { previousData };\n },\n onError: (_error, _variables, context) => {\n if (optimistic && context?.previousData !== undefined) {\n queryClient.setQueryData(optimistic.queryKey, context.previousData);\n }\n },\n onSettled: () => {\n invalidateKeys.forEach((key) => {\n queryClient.invalidateQueries({ queryKey: key });\n });\n if (optimistic) {\n queryClient.invalidateQueries({ queryKey: optimistic.queryKey });\n }\n },\n });\n}\n\nexport function useFirestoreDelete<T = unknown>({\n invalidateKeys = [],\n optimistic,\n}: {\n invalidateKeys?: readonly QueryKey[];\n optimistic?: {\n queryKey: QueryKey;\n updater: (oldData: T | undefined, docPath: string) => T;\n };\n} = {}): UseMutationResult<\n string,\n Error,\n { docPath: string },\n { previousData: T | undefined } | undefined\n> {\n const db = useFirestoreDb();\n const queryClient = useQueryClient();\n\n return useSessionMutation({\n mutationFn: async ({ docPath }: { docPath: string }) => {\n const docRef = doc(db, docPath);\n await deleteDoc(docRef);\n return docPath;\n },\n onMutate: async ({ docPath }) => {\n if (!optimistic) return undefined;\n\n await queryClient.cancelQueries({ queryKey: optimistic.queryKey });\n const previousData = queryClient.getQueryData<T>(optimistic.queryKey);\n\n queryClient.setQueryData<T>(optimistic.queryKey, (old) => optimistic.updater(old, docPath));\n\n return { previousData };\n },\n onError: (_error, _variables, context) => {\n if (optimistic && context?.previousData !== undefined) {\n queryClient.setQueryData(optimistic.queryKey, context.previousData);\n }\n },\n onSettled: () => {\n invalidateKeys.forEach((key) => {\n queryClient.invalidateQueries({ queryKey: key });\n });\n if (optimistic) {\n queryClient.invalidateQueries({ queryKey: optimistic.queryKey });\n }\n },\n });\n}\n\ninterface BatchResult {\n committed: number;\n batches: number;\n}\n\nexport function useFirestoreBatch({\n invalidateKeys = [],\n batchSize = DEFAULT_BATCH_SIZE,\n}: FirestoreBatchOptions = {}): UseMutationResult<\n BatchResult,\n Error,\n { operations: MutationOperation[] }\n> {\n const db = useFirestoreDb();\n const queryClient = useQueryClient();\n\n return useSessionMutation({\n mutationFn: async ({ operations }: { operations: MutationOperation[] }) => {\n const chunks: MutationOperation[][] = [];\n for (let i = 0; i < operations.length; i += batchSize) {\n chunks.push(operations.slice(i, i + batchSize));\n }\n\n let totalCommitted = 0;\n\n for (const chunk of chunks) {\n const batch = writeBatch(db);\n\n for (const op of chunk) {\n const docRef = doc(db, op.docPath);\n\n switch (op.type) {\n case 'set':\n if (op.merge) {\n batch.set(docRef, op.data, { merge: true });\n } else {\n batch.set(docRef, op.data);\n }\n break;\n case 'update':\n batch.update(docRef, op.data);\n break;\n case 'delete':\n batch.delete(docRef);\n break;\n }\n }\n\n await batch.commit();\n totalCommitted += chunk.length;\n }\n\n return {\n committed: totalCommitted,\n batches: chunks.length,\n };\n },\n onSuccess: () => {\n invalidateKeys.forEach((key) => {\n queryClient.invalidateQueries({ queryKey: key });\n });\n },\n });\n}\n"]}
1
+ {"version":3,"file":"use-firestore-mutations.js","sourceRoot":"","sources":["../../../src/react/firestore/use-firestore-mutations.ts"],"names":[],"mappings":"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","sourcesContent":["'use client';\n\nimport { useQueryClient, type QueryKey } from '@tanstack/react-query';\nimport {\n doc,\n setDoc,\n updateDoc,\n deleteDoc,\n writeBatch,\n type DocumentData,\n} from 'firebase/firestore';\nimport { useFirestoreDb } from './context.js';\nimport { useSessionMutation, type SessionMutationResult } from '../session-mutation.js';\nimport type { FirestoreMutationOptions, FirestoreBatchOptions } from '../../firestore/types.js';\nimport type { MutationOperation } from './types.js';\n\nconst DEFAULT_BATCH_SIZE = 450;\n\ninterface SetResult<T> {\n id: string;\n data: T;\n}\n\nexport function useFirestoreSet<T extends DocumentData>({\n invalidateKeys = [],\n}: Pick<FirestoreMutationOptions<T>, 'invalidateKeys'> = {}): SessionMutationResult<\n SetResult<T>,\n Error,\n { docPath: string; data: T; merge?: boolean }\n> {\n const db = useFirestoreDb();\n const queryClient = useQueryClient();\n\n return useSessionMutation({\n mutationFn: async ({\n docPath,\n data,\n merge = false,\n }: {\n docPath: string;\n data: T;\n merge?: boolean;\n }) => {\n const docRef = doc(db, docPath);\n await setDoc(docRef, data, { merge });\n return { id: docRef.id, data };\n },\n onSuccess: () => {\n invalidateKeys.forEach((key) => {\n queryClient.invalidateQueries({ queryKey: key });\n });\n },\n });\n}\n\nexport function useFirestoreUpdate<T extends DocumentData>({\n invalidateKeys = [],\n optimistic,\n}: FirestoreMutationOptions<T> = {}): SessionMutationResult<\n Partial<T>,\n Error,\n { docPath: string; data: Partial<T> },\n { previousData: T | undefined } | undefined\n> {\n const db = useFirestoreDb();\n const queryClient = useQueryClient();\n\n return useSessionMutation({\n mutationFn: async ({ docPath, data }: { docPath: string; data: Partial<T> }) => {\n const docRef = doc(db, docPath);\n await updateDoc(docRef, data as DocumentData);\n return data;\n },\n onMutate: async ({ data }) => {\n if (!optimistic) return undefined;\n\n await queryClient.cancelQueries({ queryKey: optimistic.queryKey });\n const previousData = queryClient.getQueryData<T>(optimistic.queryKey);\n\n queryClient.setQueryData<T>(optimistic.queryKey, (old) =>\n optimistic.updater(old, data as Partial<T>),\n );\n\n return { previousData };\n },\n onError: (_error, _variables, context) => {\n if (optimistic && context?.previousData !== undefined) {\n queryClient.setQueryData(optimistic.queryKey, context.previousData);\n }\n },\n onSettled: () => {\n invalidateKeys.forEach((key) => {\n queryClient.invalidateQueries({ queryKey: key });\n });\n if (optimistic) {\n queryClient.invalidateQueries({ queryKey: optimistic.queryKey });\n }\n },\n });\n}\n\nexport function useFirestoreDelete<T = unknown>({\n invalidateKeys = [],\n optimistic,\n}: {\n invalidateKeys?: readonly QueryKey[];\n optimistic?: {\n queryKey: QueryKey;\n updater: (oldData: T | undefined, docPath: string) => T;\n };\n} = {}): SessionMutationResult<\n string,\n Error,\n { docPath: string },\n { previousData: T | undefined } | undefined\n> {\n const db = useFirestoreDb();\n const queryClient = useQueryClient();\n\n return useSessionMutation({\n mutationFn: async ({ docPath }: { docPath: string }) => {\n const docRef = doc(db, docPath);\n await deleteDoc(docRef);\n return docPath;\n },\n onMutate: async ({ docPath }) => {\n if (!optimistic) return undefined;\n\n await queryClient.cancelQueries({ queryKey: optimistic.queryKey });\n const previousData = queryClient.getQueryData<T>(optimistic.queryKey);\n\n queryClient.setQueryData<T>(optimistic.queryKey, (old) => optimistic.updater(old, docPath));\n\n return { previousData };\n },\n onError: (_error, _variables, context) => {\n if (optimistic && context?.previousData !== undefined) {\n queryClient.setQueryData(optimistic.queryKey, context.previousData);\n }\n },\n onSettled: () => {\n invalidateKeys.forEach((key) => {\n queryClient.invalidateQueries({ queryKey: key });\n });\n if (optimistic) {\n queryClient.invalidateQueries({ queryKey: optimistic.queryKey });\n }\n },\n });\n}\n\ninterface BatchResult {\n committed: number;\n batches: number;\n}\n\nexport function useFirestoreBatch({\n invalidateKeys = [],\n batchSize = DEFAULT_BATCH_SIZE,\n}: FirestoreBatchOptions = {}): SessionMutationResult<\n BatchResult,\n Error,\n { operations: MutationOperation[] }\n> {\n const db = useFirestoreDb();\n const queryClient = useQueryClient();\n\n return useSessionMutation({\n mutationFn: async ({ operations }: { operations: MutationOperation[] }) => {\n const chunks: MutationOperation[][] = [];\n for (let i = 0; i < operations.length; i += batchSize) {\n chunks.push(operations.slice(i, i + batchSize));\n }\n\n let totalCommitted = 0;\n\n for (const chunk of chunks) {\n const batch = writeBatch(db);\n\n for (const op of chunk) {\n const docRef = doc(db, op.docPath);\n\n switch (op.type) {\n case 'set':\n if (op.merge) {\n batch.set(docRef, op.data, { merge: true });\n } else {\n batch.set(docRef, op.data);\n }\n break;\n case 'update':\n batch.update(docRef, op.data);\n break;\n case 'delete':\n batch.delete(docRef);\n break;\n }\n }\n\n await batch.commit();\n totalCommitted += chunk.length;\n }\n\n return {\n committed: totalCommitted,\n batches: chunks.length,\n };\n },\n onSuccess: () => {\n invalidateKeys.forEach((key) => {\n queryClient.invalidateQueries({ queryKey: key });\n });\n },\n });\n}\n"]}
@@ -30,7 +30,7 @@ export type { FirestoreSearchOptions } from './search/types.js';
30
30
  export { useReadRetryState, useReadRetryStates } from './use-read-retry-state.js';
31
31
  export type { ReadRetryEntry, ReadRetrySource, ReadRetryState } from './use-read-retry-state.js';
32
32
  export { MutationSessionProvider, MutationSessionEndedError, useSessionMutation, } from './session-mutation.js';
33
- export type { MutationSession, MutationSessionProviderProps, SessionMutationFunctionContext, SessionMutationOptions, } from './session-mutation.js';
33
+ export type { MutationSession, MutationSessionProviderProps, SessionMutateOptions, SessionMutationFunctionContext, SessionMutationOptions, SessionMutationResult, } from './session-mutation.js';
34
34
  export { createCallables, MAX_RESUMABLE_CALLS } from './callables/create-callables.js';
35
35
  export type { CallableCaptureContext, CallableDeclaration, CallableErrorRouting, CallableMutationOptions, CallablePolicy, Callables, ResumableOutcome, } from './callables/create-callables.js';
36
36
  export { usePendingMutationVariables, pendingMutationVariables, usePendingMutationTargets, hasPendingMutation, duplicateSubmissionError, useDuplicateGuardedMutation, } from './pending-mutations.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAGtD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAG9C,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAG3E,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AACjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AAE/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AAGtF,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,wCAAwC,CAAC;AAEhD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAM7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAE1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAEtE,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,2BAA2B,EAC3B,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,4BAA4B,EAAE,MAAM,oDAAoD,CAAC;AAClG,OAAO,EACL,KAAK,EACL,MAAM,EACN,SAAS,EACT,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,uCAAuC,CAAC;AAW/C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAYjD,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAG5F,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAGlF,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EACzB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAQ/B,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAWvF,OAAO,EACL,2BAA2B,EAC3B,wBAAwB,EACxB,yBAAyB,EACzB,kBAAkB,EAClB,wBAAwB,EACxB,2BAA2B,GAC5B,MAAM,wBAAwB,CAAC","sourcesContent":["'use client';\n\nexport { createQueryClient } from './query-client.js';\nexport type { CreateQueryClientOptions } from './query-client.js';\n\nexport { QueryProvider } from './provider.js';\nexport type { QueryProviderProps } from './provider.js';\n\nexport { FirestoreProvider, useFirestoreDb } from './firestore/context.js';\nexport type { FirestoreProviderProps } from './firestore/context.js';\n\nexport { useFirestoreDoc } from './firestore/use-firestore-doc.js';\nexport { useFirestoreCollection } from './firestore/use-firestore-collection.js';\nexport { useFirestoreInfinite } from './firestore/use-firestore-infinite.js';\nexport { useFirestorePaginated } from './firestore/use-firestore-paginated.js';\nexport type { UseFirestorePaginatedResult } from './firestore/use-firestore-paginated.js';\nexport { useFirestoreCount } from './firestore/use-firestore-count.js';\nexport { useFirestoreLiveInfinite } from './firestore/use-firestore-live-infinite.js';\nexport type { FirestoreLiveInfiniteResult } from './firestore/use-firestore-live-infinite.js';\n\nexport {\n useFirestoreSet,\n useFirestoreUpdate,\n useFirestoreDelete,\n useFirestoreBatch,\n} from './firestore/use-firestore-mutations.js';\n\nexport { useBatchFirestoreDocs } from './firestore/useBatchFirestoreDocs.js';\nexport type {\n BatchFirestoreDocsOptions,\n BatchFirestoreDocsResult,\n BatchFirestoreDocsTransport,\n} from './firestore/useBatchFirestoreDocs.js';\nexport { ABSENT_RETRY_DELAYS_MS } from './firestore/absence-scheduler.js';\n\nexport { useFirestoreSearch } from './search/use-firestore-search.js';\n\nexport {\n invalidateByPrefix,\n removeByPrefix,\n updateQueryData,\n paginatedPageKey,\n mapPaginatedItems,\n prependToFirstPaginatedPage,\n placeRowInPages,\n} from './cache-helpers.js';\nexport type { PagedRows } from './cache-helpers.js';\n\nexport { createDomainEventInvalidator } from './domain-events/create-domain-event-invalidator.js';\nexport {\n exact,\n prefix,\n predicate,\n serializeInvalidation,\n applyInvalidations,\n} from './domain-events/cache-invalidation.js';\nexport type {\n DomainEventInvalidator,\n DomainEventInvalidationRegistry,\n} from './domain-events/create-domain-event-invalidator.js';\nexport type {\n CacheAction,\n CacheInvalidation,\n RefetchType,\n} from './domain-events/cache-invalidation.js';\n\nexport { docWithId } from './firestore/types.js';\nexport type {\n FirestoreDocOptions,\n FirestoreCollectionOptions,\n FirestoreInfiniteOptions,\n FirestorePaginatedOptions,\n FirestoreCountOptions,\n FirestoreLiveInfiniteOptions,\n InfinitePage,\n PaginatedPage,\n MutationOperation,\n} from './firestore/types.js';\nexport { flattenInfiniteData, getInfiniteDataCount } from './firestore/infinite-helpers.js';\nexport type { FirestoreSearchOptions } from './search/types.js';\n\nexport { useReadRetryState, useReadRetryStates } from './use-read-retry-state.js';\nexport type { ReadRetryEntry, ReadRetrySource, ReadRetryState } from './use-read-retry-state.js';\n\nexport {\n MutationSessionProvider,\n MutationSessionEndedError,\n useSessionMutation,\n} from './session-mutation.js';\nexport type {\n MutationSession,\n MutationSessionProviderProps,\n SessionMutationFunctionContext,\n SessionMutationOptions,\n} from './session-mutation.js';\n\nexport { createCallables, MAX_RESUMABLE_CALLS } from './callables/create-callables.js';\nexport type {\n CallableCaptureContext,\n CallableDeclaration,\n CallableErrorRouting,\n CallableMutationOptions,\n CallablePolicy,\n Callables,\n ResumableOutcome,\n} from './callables/create-callables.js';\n\nexport {\n usePendingMutationVariables,\n pendingMutationVariables,\n usePendingMutationTargets,\n hasPendingMutation,\n duplicateSubmissionError,\n useDuplicateGuardedMutation,\n} from './pending-mutations.js';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAGtD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAG9C,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAG3E,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AACjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AAE/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AAGtF,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,wCAAwC,CAAC;AAEhD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAM7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAE1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAEtE,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,2BAA2B,EAC3B,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,4BAA4B,EAAE,MAAM,oDAAoD,CAAC;AAClG,OAAO,EACL,KAAK,EACL,MAAM,EACN,SAAS,EACT,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,uCAAuC,CAAC;AAW/C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAYjD,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAG5F,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAGlF,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EACzB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAU/B,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAWvF,OAAO,EACL,2BAA2B,EAC3B,wBAAwB,EACxB,yBAAyB,EACzB,kBAAkB,EAClB,wBAAwB,EACxB,2BAA2B,GAC5B,MAAM,wBAAwB,CAAC","sourcesContent":["'use client';\n\nexport { createQueryClient } from './query-client.js';\nexport type { CreateQueryClientOptions } from './query-client.js';\n\nexport { QueryProvider } from './provider.js';\nexport type { QueryProviderProps } from './provider.js';\n\nexport { FirestoreProvider, useFirestoreDb } from './firestore/context.js';\nexport type { FirestoreProviderProps } from './firestore/context.js';\n\nexport { useFirestoreDoc } from './firestore/use-firestore-doc.js';\nexport { useFirestoreCollection } from './firestore/use-firestore-collection.js';\nexport { useFirestoreInfinite } from './firestore/use-firestore-infinite.js';\nexport { useFirestorePaginated } from './firestore/use-firestore-paginated.js';\nexport type { UseFirestorePaginatedResult } from './firestore/use-firestore-paginated.js';\nexport { useFirestoreCount } from './firestore/use-firestore-count.js';\nexport { useFirestoreLiveInfinite } from './firestore/use-firestore-live-infinite.js';\nexport type { FirestoreLiveInfiniteResult } from './firestore/use-firestore-live-infinite.js';\n\nexport {\n useFirestoreSet,\n useFirestoreUpdate,\n useFirestoreDelete,\n useFirestoreBatch,\n} from './firestore/use-firestore-mutations.js';\n\nexport { useBatchFirestoreDocs } from './firestore/useBatchFirestoreDocs.js';\nexport type {\n BatchFirestoreDocsOptions,\n BatchFirestoreDocsResult,\n BatchFirestoreDocsTransport,\n} from './firestore/useBatchFirestoreDocs.js';\nexport { ABSENT_RETRY_DELAYS_MS } from './firestore/absence-scheduler.js';\n\nexport { useFirestoreSearch } from './search/use-firestore-search.js';\n\nexport {\n invalidateByPrefix,\n removeByPrefix,\n updateQueryData,\n paginatedPageKey,\n mapPaginatedItems,\n prependToFirstPaginatedPage,\n placeRowInPages,\n} from './cache-helpers.js';\nexport type { PagedRows } from './cache-helpers.js';\n\nexport { createDomainEventInvalidator } from './domain-events/create-domain-event-invalidator.js';\nexport {\n exact,\n prefix,\n predicate,\n serializeInvalidation,\n applyInvalidations,\n} from './domain-events/cache-invalidation.js';\nexport type {\n DomainEventInvalidator,\n DomainEventInvalidationRegistry,\n} from './domain-events/create-domain-event-invalidator.js';\nexport type {\n CacheAction,\n CacheInvalidation,\n RefetchType,\n} from './domain-events/cache-invalidation.js';\n\nexport { docWithId } from './firestore/types.js';\nexport type {\n FirestoreDocOptions,\n FirestoreCollectionOptions,\n FirestoreInfiniteOptions,\n FirestorePaginatedOptions,\n FirestoreCountOptions,\n FirestoreLiveInfiniteOptions,\n InfinitePage,\n PaginatedPage,\n MutationOperation,\n} from './firestore/types.js';\nexport { flattenInfiniteData, getInfiniteDataCount } from './firestore/infinite-helpers.js';\nexport type { FirestoreSearchOptions } from './search/types.js';\n\nexport { useReadRetryState, useReadRetryStates } from './use-read-retry-state.js';\nexport type { ReadRetryEntry, ReadRetrySource, ReadRetryState } from './use-read-retry-state.js';\n\nexport {\n MutationSessionProvider,\n MutationSessionEndedError,\n useSessionMutation,\n} from './session-mutation.js';\nexport type {\n MutationSession,\n MutationSessionProviderProps,\n SessionMutateOptions,\n SessionMutationFunctionContext,\n SessionMutationOptions,\n SessionMutationResult,\n} from './session-mutation.js';\n\nexport { createCallables, MAX_RESUMABLE_CALLS } from './callables/create-callables.js';\nexport type {\n CallableCaptureContext,\n CallableDeclaration,\n CallableErrorRouting,\n CallableMutationOptions,\n CallablePolicy,\n Callables,\n ResumableOutcome,\n} from './callables/create-callables.js';\n\nexport {\n usePendingMutationVariables,\n pendingMutationVariables,\n usePendingMutationTargets,\n hasPendingMutation,\n duplicateSubmissionError,\n useDuplicateGuardedMutation,\n} from './pending-mutations.js';\n"]}
@@ -8,8 +8,22 @@ export interface MutationSession {
8
8
  export type SessionMutationFunctionContext = MutationFunctionContext & {
9
9
  session: MutationSession;
10
10
  };
11
- export type SessionMutationOptions<TData = unknown, TError = DefaultError, TVariables = void, TOnMutateResult = unknown> = Omit<UseMutationOptions<TData, TError, TVariables, TOnMutateResult>, 'mutationFn'> & {
11
+ export type SessionMutationOptions<TData = unknown, TError = DefaultError, TVariables = void, TOnMutateResult = unknown> = Omit<UseMutationOptions<TData, TError, TVariables, TOnMutateResult>, 'mutationFn' | 'onMutate' | 'onSuccess' | 'onError' | 'onSettled'> & {
12
12
  mutationFn: (variables: TVariables, context: SessionMutationFunctionContext) => Promise<TData>;
13
+ onMutate?: (variables: TVariables, context: SessionMutationFunctionContext) => Promise<TOnMutateResult> | TOnMutateResult;
14
+ onSuccess?: (data: TData, variables: TVariables, onMutateResult: TOnMutateResult, context: SessionMutationFunctionContext) => Promise<unknown> | unknown;
15
+ onError?: (error: TError, variables: TVariables, onMutateResult: TOnMutateResult | undefined, context: SessionMutationFunctionContext) => Promise<unknown> | unknown;
16
+ onSettled?: (data: TData | undefined, error: TError | null, variables: TVariables, onMutateResult: TOnMutateResult | undefined, context: SessionMutationFunctionContext) => Promise<unknown> | unknown;
17
+ };
18
+ export interface SessionMutateOptions<TData, TError, TVariables, TOnMutateResult> {
19
+ onSuccess?: (data: TData, variables: TVariables, onMutateResult: TOnMutateResult | undefined, context: SessionMutationFunctionContext) => void;
20
+ onError?: (error: TError, variables: TVariables, onMutateResult: TOnMutateResult | undefined, context: SessionMutationFunctionContext) => void;
21
+ onSettled?: (data: TData | undefined, error: TError | null, variables: TVariables, onMutateResult: TOnMutateResult | undefined, context: SessionMutationFunctionContext) => void;
22
+ }
23
+ type DistributiveOmit<T, K extends PropertyKey> = T extends unknown ? Omit<T, K> : never;
24
+ export type SessionMutationResult<TData = unknown, TError = DefaultError, TVariables = void, TOnMutateResult = unknown> = DistributiveOmit<UseMutationResult<TData, TError, TVariables, TOnMutateResult>, 'mutate' | 'mutateAsync'> & {
25
+ mutate: (variables: TVariables, options?: SessionMutateOptions<TData, TError, TVariables, TOnMutateResult>) => void;
26
+ mutateAsync: (variables: TVariables, options?: SessionMutateOptions<TData, TError, TVariables, TOnMutateResult>) => Promise<TData>;
13
27
  };
14
28
  export declare class MutationSessionEndedError extends Error {
15
29
  name: string;
@@ -23,5 +37,6 @@ export interface MutationSessionProviderProps {
23
37
  }
24
38
  export declare function MutationSessionProvider({ currentUid, children }: MutationSessionProviderProps): import("react").JSX.Element;
25
39
  export declare function useMutationSessionCapture(): () => MutationSession;
26
- export declare function useSessionMutation<TData = unknown, TError = DefaultError, TVariables = void, TOnMutateResult = unknown>(options: SessionMutationOptions<TData, TError, TVariables, TOnMutateResult>): UseMutationResult<TData, TError, TVariables, TOnMutateResult>;
40
+ export declare function useSessionMutation<TData = unknown, TError = DefaultError, TVariables = void, TOnMutateResult = unknown>(options: SessionMutationOptions<TData, TError, TVariables, TOnMutateResult>): SessionMutationResult<TData, TError, TVariables, TOnMutateResult>;
41
+ export {};
27
42
  //# sourceMappingURL=session-mutation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-mutation.d.ts","sourceRoot":"","sources":["../../src/react/session-mutation.tsx"],"names":[],"mappings":"AAEA,OAAO,EAML,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,EAGL,KAAK,YAAY,EAEjB,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACvB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,SAAS,IAAI,OAAO,CAAC;IACrB,aAAa,IAAI,IAAI,CAAC;CACvB;AAED,MAAM,MAAM,8BAA8B,GAAG,uBAAuB,GAAG;IACrE,OAAO,EAAE,eAAe,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,sBAAsB,CAChC,KAAK,GAAG,OAAO,EACf,MAAM,GAAG,YAAY,EACrB,UAAU,GAAG,IAAI,EACjB,eAAe,GAAG,OAAO,IACvB,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe,CAAC,EAAE,YAAY,CAAC,GAAG;IACvF,UAAU,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,8BAA8B,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC;CAChG,CAAC;AAEF,qBAAa,yBAA0B,SAAQ,KAAK;IACzC,IAAI,SAAgB;gBAEjB,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAG1C;AAQD,MAAM,WAAW,4BAA4B;IAC3C,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,wBAAgB,uBAAuB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,4BAA4B,+BAc7F;AAqBD,wBAAgB,yBAAyB,IAAI,MAAM,eAAe,CAGjE;AAsDD,wBAAgB,kBAAkB,CAChC,KAAK,GAAG,OAAO,EACf,MAAM,GAAG,YAAY,EACrB,UAAU,GAAG,IAAI,EACjB,eAAe,GAAG,OAAO,EAEzB,OAAO,EAAE,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe,CAAC,GAC1E,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe,CAAC,CAmE/D"}
1
+ {"version":3,"file":"session-mutation.d.ts","sourceRoot":"","sources":["../../src/react/session-mutation.tsx"],"names":[],"mappings":"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"}
@@ -67,33 +67,51 @@ function throwsToBoundary(throwOnError, error) {
67
67
  return throwOnError(error);
68
68
  return throwOnError === true;
69
69
  }
70
+ function withSession(context, session) {
71
+ return { ...context, session };
72
+ }
70
73
  function fenceCallOptions(session, options) {
71
74
  if (!options)
72
75
  return undefined;
73
76
  const { onSuccess, onError, onSettled } = options;
74
77
  return {
75
78
  onSuccess: onSuccess
76
- ? (...args) => {
77
- if (session.isCurrent())
78
- onSuccess(...args);
79
+ ? (data, variables, onMutateResult, context) => {
80
+ if (session.isCurrent()) {
81
+ onSuccess(data, variables, onMutateResult, withSession(context, session));
82
+ }
79
83
  }
80
84
  : undefined,
81
85
  onError: onError
82
- ? (error, ...rest) => {
86
+ ? (error, variables, onMutateResult, context) => {
83
87
  if (!(error instanceof MutationSessionEndedError) && session.isCurrent()) {
84
- onError(error, ...rest);
88
+ onError(error, variables, onMutateResult, withSession(context, session));
85
89
  }
86
90
  }
87
91
  : undefined,
88
92
  onSettled: onSettled
89
- ? (data, error, ...rest) => {
93
+ ? (data, error, variables, onMutateResult, context) => {
90
94
  if (!(error instanceof MutationSessionEndedError) && session.isCurrent()) {
91
- onSettled(data, error, ...rest);
95
+ onSettled(data, error, variables, onMutateResult, withSession(context, session));
92
96
  }
93
97
  }
94
98
  : undefined,
95
99
  };
96
100
  }
101
+ async function settleInSession(session, settled) {
102
+ let data;
103
+ try {
104
+ data = await settled;
105
+ }
106
+ catch (error) {
107
+ if (!(error instanceof MutationSessionEndedError) && !session.isCurrent()) {
108
+ throw new MutationSessionEndedError({ cause: error });
109
+ }
110
+ throw error;
111
+ }
112
+ session.assertCurrent();
113
+ return data;
114
+ }
97
115
  export function useSessionMutation(options) {
98
116
  const store = useContext(MutationSessionContext);
99
117
  const queryClient = useQueryClient();
@@ -106,9 +124,10 @@ export function useSessionMutation(options) {
106
124
  retry: (failureCount, error) => retriesAfter(baseRetry, failureCount, error),
107
125
  throwOnError: (error) => throwsToBoundary(baseThrowOnError, error),
108
126
  onMutate: (variables, context) => {
127
+ const session = store ? captureSession(store) : ALWAYS_CURRENT;
109
128
  if (store)
110
- runSessions.set(context, captureSession(store));
111
- return onMutate?.(variables, context);
129
+ runSessions.set(context, session);
130
+ return onMutate?.(variables, withSession(context, session));
112
131
  },
113
132
  mutationFn: async (variables, context) => {
114
133
  const session = store ? runSessions.get(context) : ALWAYS_CURRENT;
@@ -129,22 +148,28 @@ export function useSessionMutation(options) {
129
148
  onSuccess: (data, variables, onMutateResult, context) => {
130
149
  if (runHasEnded(store, context))
131
150
  return;
132
- return onSuccess?.(data, variables, onMutateResult, context);
151
+ return onSuccess?.(data, variables, onMutateResult, withSession(context, runSession(context)));
133
152
  },
134
153
  onError: (error, variables, onMutateResult, context) => {
135
154
  if (error instanceof MutationSessionEndedError || runHasEnded(store, context))
136
155
  return;
137
- return onError?.(error, variables, onMutateResult, context);
156
+ return onError?.(error, variables, onMutateResult, withSession(context, runSession(context)));
138
157
  },
139
158
  onSettled: (data, error, variables, onMutateResult, context) => {
140
159
  if (error instanceof MutationSessionEndedError || runHasEnded(store, context))
141
160
  return;
142
- return onSettled?.(data, error, variables, onMutateResult, context);
161
+ return onSettled?.(data, error, variables, onMutateResult, withSession(context, runSession(context)));
143
162
  },
144
163
  });
164
+ function runSession(context) {
165
+ return (store && runSessions.get(context)) || ALWAYS_CURRENT;
166
+ }
145
167
  const { mutate: rawMutate, mutateAsync: rawMutateAsync } = mutation;
146
168
  const mutate = useCallback((variables, callOptions) => rawMutate(variables, fenceCallOptions(captureSession(store), callOptions)), [rawMutate, store]);
147
- const mutateAsync = useCallback((variables, callOptions) => rawMutateAsync(variables, fenceCallOptions(captureSession(store), callOptions)), [rawMutateAsync, store]);
169
+ const mutateAsync = useCallback((variables, callOptions) => {
170
+ const session = captureSession(store);
171
+ return settleInSession(session, rawMutateAsync(variables, fenceCallOptions(session, callOptions)));
172
+ }, [rawMutateAsync, store]);
148
173
  return { ...mutation, mutate, mutateAsync };
149
174
  }
150
175
  //# sourceMappingURL=session-mutation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-mutation.js","sourceRoot":"","sources":["../../src/react/session-mutation.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EACL,aAAa,EACb,WAAW,EACX,UAAU,EACV,kBAAkB,EAClB,QAAQ,GAET,MAAM,OAAO,CAAC;AACf,OAAO,EACL,WAAW,EACX,cAAc,GAMf,MAAM,uBAAuB,CAAC;AAqB/B,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IACzC,IAAI,GAAG,YAAY,CAAC;IAE7B,YAAY,OAA6B;QACvC,KAAK,CAAC,mDAAmD,EAAE,OAAO,CAAC,CAAC;IACtE,CAAC;CACF;AAMD,MAAM,sBAAsB,GAAG,aAAa,CAAsB,IAAI,CAAC,CAAC;AAOxE,MAAM,UAAU,uBAAuB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAgC;IAC5F,MAAM,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAe,GAAG,EAAE,CAAC,CAAC;QAC5C,OAAO,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,EAAE;KAC5C,CAAC,CAAC,CAAC;IACJ,2FAA2F;IAC3F,0DAA0D;IAC1D,kBAAkB,CAAC,GAAG,EAAE;QACtB,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,KAAK,UAAU,EAAE,CAAC;YACrC,KAAK,CAAC,OAAO,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;QAChF,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;IACxB,OAAO,CACL,KAAC,sBAAsB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAAmC,CAC5F,CAAC;AACJ,CAAC;AAED,MAAM,cAAc,GAAoB;IACtC,GAAG,EAAE,IAAI;IACT,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI;IACrB,aAAa,EAAE,GAAG,EAAE,GAAE,CAAC;CACxB,CAAC;AAEF,SAAS,cAAc,CAAC,KAA0B;IAChD,IAAI,CAAC,KAAK;QAAE,OAAO,cAAc,CAAC;IAClC,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC;IAC1C,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,KAAK,UAAU,CAAC;IAChE,OAAO;QACL,GAAG;QACH,SAAS;QACT,aAAa,EAAE,GAAG,EAAE;YAClB,IAAI,CAAC,SAAS,EAAE;gBAAE,MAAM,IAAI,yBAAyB,EAAE,CAAC;QAC1D,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB;IACvC,MAAM,KAAK,GAAG,UAAU,CAAC,sBAAsB,CAAC,CAAC;IACjD,OAAO,WAAW,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,WAAW,GAAG,IAAI,OAAO,EAA4C,CAAC;AAE5E,SAAS,WAAW,CAAC,KAA0B,EAAE,OAAgC;IAC/E,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,OAAO,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,KAAK,CAAC,CAAC;AAC3D,CAAC;AAKD,SAAS,YAAY,CAAS,KAAoB,EAAE,YAAoB,EAAE,KAAa;IACrF,IAAI,KAAK,YAAY,yBAAyB;QAAE,OAAO,KAAK,CAAC;IAC7D,IAAI,OAAO,KAAK,KAAK,UAAU;QAAE,OAAO,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IACnE,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,YAAY,GAAG,KAAK,CAAC;IAC3D,OAAO,KAAK,KAAK,IAAI,CAAC;AACxB,CAAC;AAED,SAAS,gBAAgB,CAAS,YAAkC,EAAE,KAAa;IACjF,IAAI,KAAK,YAAY,yBAAyB;QAAE,OAAO,KAAK,CAAC;IAC7D,IAAI,OAAO,YAAY,KAAK,UAAU;QAAE,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;IACnE,OAAO,YAAY,KAAK,IAAI,CAAC;AAC/B,CAAC;AAED,SAAS,gBAAgB,CACvB,OAAwB,EACxB,OAA8E;IAE9E,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAClD,OAAO;QACL,SAAS,EAAE,SAAS;YAClB,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE;gBACV,IAAI,OAAO,CAAC,SAAS,EAAE;oBAAE,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC;YAC9C,CAAC;YACH,CAAC,CAAC,SAAS;QACb,OAAO,EAAE,OAAO;YACd,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,IAAI,EAAE,EAAE;gBACjB,IAAI,CAAC,CAAC,KAAK,YAAY,yBAAyB,CAAC,IAAI,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;oBACzE,OAAO,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC;YACH,CAAC,CAAC,SAAS;QACb,SAAS,EAAE,SAAS;YAClB,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,EAAE;gBACvB,IAAI,CAAC,CAAC,KAAK,YAAY,yBAAyB,CAAC,IAAI,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;oBACzE,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;gBAClC,CAAC;YACH,CAAC;YACH,CAAC,CAAC,SAAS;KACd,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAMhC,OAA2E;IAE3E,MAAM,KAAK,GAAG,UAAU,CAAC,sBAAsB,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,IAAI,EAAE,GACzF,OAAO,CAAC;IACV,MAAM,QAAQ,GAAG,WAAW,CAAC,sBAAsB,CAEjD,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAkB,CAAC;IAC7D,MAAM,gBAAgB,GAAG,CAAC,YAAY,IAAI,QAAQ,CAAC,YAAY,CAAyB,CAAC;IAEzF,MAAM,QAAQ,GAAG,WAAW,CAA6C;QACvE,GAAG,IAAI;QACP,KAAK,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,YAAY,EAAE,KAAK,CAAC;QAC5E,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,KAAK,CAAC;QAClE,QAAQ,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE;YAC/B,IAAI,KAAK;gBAAE,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;YAC3D,OAAO,QAAQ,EAAE,CAAC,SAAS,EAAE,OAAO,CAA+C,CAAC;QACtF,CAAC;QACD,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE;YACvC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;YAClE,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;gBAAE,MAAM,IAAI,yBAAyB,EAAE,CAAC;YAC5E,IAAI,IAAW,CAAC;YAChB,IAAI,CAAC;gBACH,IAAI,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YAC9D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;oBAAE,MAAM,IAAI,yBAAyB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;gBAChF,MAAM,KAAK,CAAC;YACd,CAAC;YACD,OAAO,CAAC,aAAa,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,SAAS,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,EAAE;YACtD,IAAI,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC;gBAAE,OAAO;YACxC,OAAO,SAAS,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,EAAE;YACrD,IAAI,KAAK,YAAY,yBAAyB,IAAI,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC;gBAAE,OAAO;YACtF,OAAO,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;QAC9D,CAAC;QACD,SAAS,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,EAAE;YAC7D,IAAI,KAAK,YAAY,yBAAyB,IAAI,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC;gBAAE,OAAO;YACtF,OAAO,SAAS,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;QACtE,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,GAAG,QAAQ,CAAC;IACpE,MAAM,MAAM,GAAG,WAAW,CACxB,CACE,SAAqB,EACrB,WAAuE,EACvE,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,gBAAgB,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC,EAC/E,CAAC,SAAS,EAAE,KAAK,CAAC,CACnB,CAAC;IACF,MAAM,WAAW,GAAG,WAAW,CAC7B,CACE,SAAqB,EACrB,WAAuE,EACvE,EAAE,CAAC,cAAc,CAAC,SAAS,EAAE,gBAAgB,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC,EACpF,CAAC,cAAc,EAAE,KAAK,CAAC,CACxB,CAAC;IACF,OAAO,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,WAAW,EAKxC,CAAC;AACJ,CAAC","sourcesContent":["'use client';\n\nimport {\n createContext,\n useCallback,\n useContext,\n useInsertionEffect,\n useState,\n type ReactNode,\n} from 'react';\nimport {\n useMutation,\n useQueryClient,\n type DefaultError,\n type MutateOptions,\n type MutationFunctionContext,\n type UseMutationOptions,\n type UseMutationResult,\n} from '@tanstack/react-query';\n\nexport interface MutationSession {\n uid: string | null;\n isCurrent(): boolean;\n assertCurrent(): void;\n}\n\nexport type SessionMutationFunctionContext = MutationFunctionContext & {\n session: MutationSession;\n};\n\nexport type SessionMutationOptions<\n TData = unknown,\n TError = DefaultError,\n TVariables = void,\n TOnMutateResult = unknown,\n> = Omit<UseMutationOptions<TData, TError, TVariables, TOnMutateResult>, 'mutationFn'> & {\n mutationFn: (variables: TVariables, context: SessionMutationFunctionContext) => Promise<TData>;\n};\n\nexport class MutationSessionEndedError extends Error {\n override name = 'AbortError';\n\n constructor(options?: { cause?: unknown }) {\n super('The session that started this mutation has ended.', options);\n }\n}\n\ninterface SessionStore {\n current: { uid: string | null; generation: number };\n}\n\nconst MutationSessionContext = createContext<SessionStore | null>(null);\n\nexport interface MutationSessionProviderProps {\n currentUid: string | null;\n children?: ReactNode;\n}\n\nexport function MutationSessionProvider({ currentUid, children }: MutationSessionProviderProps) {\n const [store] = useState<SessionStore>(() => ({\n current: { uid: currentUid, generation: 0 },\n }));\n // Insertion effects run before any layout effect of the commit, so a child's layout effect\n // never starts a mutation under the uid this commit ends.\n useInsertionEffect(() => {\n if (store.current.uid !== currentUid) {\n store.current = { uid: currentUid, generation: store.current.generation + 1 };\n }\n }, [store, currentUid]);\n return (\n <MutationSessionContext.Provider value={store}>{children}</MutationSessionContext.Provider>\n );\n}\n\nconst ALWAYS_CURRENT: MutationSession = {\n uid: null,\n isCurrent: () => true,\n assertCurrent: () => {},\n};\n\nfunction captureSession(store: SessionStore | null): MutationSession {\n if (!store) return ALWAYS_CURRENT;\n const { uid, generation } = store.current;\n const isCurrent = () => store.current.generation === generation;\n return {\n uid,\n isCurrent,\n assertCurrent: () => {\n if (!isCurrent()) throw new MutationSessionEndedError();\n },\n };\n}\n\nexport function useMutationSessionCapture(): () => MutationSession {\n const store = useContext(MutationSessionContext);\n return useCallback(() => captureSession(store), [store]);\n}\n\nconst runSessions = new WeakMap<MutationFunctionContext, MutationSession>();\n\nfunction runHasEnded(store: SessionStore | null, context: MutationFunctionContext): boolean {\n if (!store) return false;\n return !(runSessions.get(context)?.isCurrent() ?? false);\n}\n\ntype Retry<TError> = UseMutationOptions<unknown, TError, unknown, unknown>['retry'];\ntype ThrowOnError<TError> = UseMutationOptions<unknown, TError, unknown, unknown>['throwOnError'];\n\nfunction retriesAfter<TError>(retry: Retry<TError>, failureCount: number, error: TError): boolean {\n if (error instanceof MutationSessionEndedError) return false;\n if (typeof retry === 'function') return retry(failureCount, error);\n if (typeof retry === 'number') return failureCount < retry;\n return retry === true;\n}\n\nfunction throwsToBoundary<TError>(throwOnError: ThrowOnError<TError>, error: TError): boolean {\n if (error instanceof MutationSessionEndedError) return false;\n if (typeof throwOnError === 'function') return throwOnError(error);\n return throwOnError === true;\n}\n\nfunction fenceCallOptions<TData, TError, TVariables, TOnMutateResult>(\n session: MutationSession,\n options: MutateOptions<TData, TError, TVariables, TOnMutateResult> | undefined,\n): MutateOptions<TData, TError, TVariables, TOnMutateResult> | undefined {\n if (!options) return undefined;\n const { onSuccess, onError, onSettled } = options;\n return {\n onSuccess: onSuccess\n ? (...args) => {\n if (session.isCurrent()) onSuccess(...args);\n }\n : undefined,\n onError: onError\n ? (error, ...rest) => {\n if (!(error instanceof MutationSessionEndedError) && session.isCurrent()) {\n onError(error, ...rest);\n }\n }\n : undefined,\n onSettled: onSettled\n ? (data, error, ...rest) => {\n if (!(error instanceof MutationSessionEndedError) && session.isCurrent()) {\n onSettled(data, error, ...rest);\n }\n }\n : undefined,\n };\n}\n\nexport function useSessionMutation<\n TData = unknown,\n TError = DefaultError,\n TVariables = void,\n TOnMutateResult = unknown,\n>(\n options: SessionMutationOptions<TData, TError, TVariables, TOnMutateResult>,\n): UseMutationResult<TData, TError, TVariables, TOnMutateResult> {\n const store = useContext(MutationSessionContext);\n const queryClient = useQueryClient();\n const { mutationFn, onMutate, onSuccess, onError, onSettled, retry, throwOnError, ...rest } =\n options;\n const defaults = queryClient.defaultMutationOptions<\n UseMutationOptions<unknown, TError, unknown, unknown>\n >({ mutationKey: options.mutationKey });\n const baseRetry = (retry ?? defaults.retry) as Retry<TError>;\n const baseThrowOnError = (throwOnError ?? defaults.throwOnError) as ThrowOnError<TError>;\n\n const mutation = useMutation<TData, TError, TVariables, TOnMutateResult>({\n ...rest,\n retry: (failureCount, error) => retriesAfter(baseRetry, failureCount, error),\n throwOnError: (error) => throwsToBoundary(baseThrowOnError, error),\n onMutate: (variables, context) => {\n if (store) runSessions.set(context, captureSession(store));\n return onMutate?.(variables, context) as TOnMutateResult | Promise<TOnMutateResult>;\n },\n mutationFn: async (variables, context) => {\n const session = store ? runSessions.get(context) : ALWAYS_CURRENT;\n if (!session || !session.isCurrent()) throw new MutationSessionEndedError();\n let data: TData;\n try {\n data = await mutationFn(variables, { ...context, session });\n } catch (error) {\n if (!session.isCurrent()) throw new MutationSessionEndedError({ cause: error });\n throw error;\n }\n session.assertCurrent();\n return data;\n },\n onSuccess: (data, variables, onMutateResult, context) => {\n if (runHasEnded(store, context)) return;\n return onSuccess?.(data, variables, onMutateResult, context);\n },\n onError: (error, variables, onMutateResult, context) => {\n if (error instanceof MutationSessionEndedError || runHasEnded(store, context)) return;\n return onError?.(error, variables, onMutateResult, context);\n },\n onSettled: (data, error, variables, onMutateResult, context) => {\n if (error instanceof MutationSessionEndedError || runHasEnded(store, context)) return;\n return onSettled?.(data, error, variables, onMutateResult, context);\n },\n });\n\n const { mutate: rawMutate, mutateAsync: rawMutateAsync } = mutation;\n const mutate = useCallback(\n (\n variables: TVariables,\n callOptions?: MutateOptions<TData, TError, TVariables, TOnMutateResult>,\n ) => rawMutate(variables, fenceCallOptions(captureSession(store), callOptions)),\n [rawMutate, store],\n );\n const mutateAsync = useCallback(\n (\n variables: TVariables,\n callOptions?: MutateOptions<TData, TError, TVariables, TOnMutateResult>,\n ) => rawMutateAsync(variables, fenceCallOptions(captureSession(store), callOptions)),\n [rawMutateAsync, store],\n );\n return { ...mutation, mutate, mutateAsync } as UseMutationResult<\n TData,\n TError,\n TVariables,\n TOnMutateResult\n >;\n}\n"]}
1
+ {"version":3,"file":"session-mutation.js","sourceRoot":"","sources":["../../src/react/session-mutation.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EACL,aAAa,EACb,WAAW,EACX,UAAU,EACV,kBAAkB,EAClB,QAAQ,GAET,MAAM,OAAO,CAAC;AACf,OAAO,EACL,WAAW,EACX,cAAc,GAMf,MAAM,uBAAuB,CAAC;AA0F/B,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IACzC,IAAI,GAAG,YAAY,CAAC;IAE7B,YAAY,OAA6B;QACvC,KAAK,CAAC,mDAAmD,EAAE,OAAO,CAAC,CAAC;IACtE,CAAC;CACF;AAMD,MAAM,sBAAsB,GAAG,aAAa,CAAsB,IAAI,CAAC,CAAC;AAOxE,MAAM,UAAU,uBAAuB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAgC;IAC5F,MAAM,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAe,GAAG,EAAE,CAAC,CAAC;QAC5C,OAAO,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,EAAE;KAC5C,CAAC,CAAC,CAAC;IACJ,2FAA2F;IAC3F,0DAA0D;IAC1D,kBAAkB,CAAC,GAAG,EAAE;QACtB,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,KAAK,UAAU,EAAE,CAAC;YACrC,KAAK,CAAC,OAAO,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;QAChF,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;IACxB,OAAO,CACL,KAAC,sBAAsB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAAmC,CAC5F,CAAC;AACJ,CAAC;AAED,MAAM,cAAc,GAAoB;IACtC,GAAG,EAAE,IAAI;IACT,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI;IACrB,aAAa,EAAE,GAAG,EAAE,GAAE,CAAC;CACxB,CAAC;AAEF,SAAS,cAAc,CAAC,KAA0B;IAChD,IAAI,CAAC,KAAK;QAAE,OAAO,cAAc,CAAC;IAClC,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC;IAC1C,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,KAAK,UAAU,CAAC;IAChE,OAAO;QACL,GAAG;QACH,SAAS;QACT,aAAa,EAAE,GAAG,EAAE;YAClB,IAAI,CAAC,SAAS,EAAE;gBAAE,MAAM,IAAI,yBAAyB,EAAE,CAAC;QAC1D,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB;IACvC,MAAM,KAAK,GAAG,UAAU,CAAC,sBAAsB,CAAC,CAAC;IACjD,OAAO,WAAW,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,WAAW,GAAG,IAAI,OAAO,EAA4C,CAAC;AAE5E,SAAS,WAAW,CAAC,KAA0B,EAAE,OAAgC;IAC/E,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,OAAO,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,KAAK,CAAC,CAAC;AAC3D,CAAC;AAKD,SAAS,YAAY,CAAS,KAAoB,EAAE,YAAoB,EAAE,KAAa;IACrF,IAAI,KAAK,YAAY,yBAAyB;QAAE,OAAO,KAAK,CAAC;IAC7D,IAAI,OAAO,KAAK,KAAK,UAAU;QAAE,OAAO,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IACnE,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,YAAY,GAAG,KAAK,CAAC;IAC3D,OAAO,KAAK,KAAK,IAAI,CAAC;AACxB,CAAC;AAED,SAAS,gBAAgB,CAAS,YAAkC,EAAE,KAAa;IACjF,IAAI,KAAK,YAAY,yBAAyB;QAAE,OAAO,KAAK,CAAC;IAC7D,IAAI,OAAO,YAAY,KAAK,UAAU;QAAE,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;IACnE,OAAO,YAAY,KAAK,IAAI,CAAC;AAC/B,CAAC;AAED,SAAS,WAAW,CAClB,OAAgC,EAChC,OAAwB;IAExB,OAAO,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC;AACjC,CAAC;AAED,SAAS,gBAAgB,CACvB,OAAwB,EACxB,OAAqF;IAErF,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAClD,OAAO;QACL,SAAS,EAAE,SAAS;YAClB,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,EAAE;gBAC3C,IAAI,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;oBACxB,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC5E,CAAC;YACH,CAAC;YACH,CAAC,CAAC,SAAS;QACb,OAAO,EAAE,OAAO;YACd,CAAC,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,EAAE;gBAC5C,IAAI,CAAC,CAAC,KAAK,YAAY,yBAAyB,CAAC,IAAI,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;oBACzE,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC3E,CAAC;YACH,CAAC;YACH,CAAC,CAAC,SAAS;QACb,SAAS,EAAE,SAAS;YAClB,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,EAAE;gBAClD,IAAI,CAAC,CAAC,KAAK,YAAY,yBAAyB,CAAC,IAAI,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;oBACzE,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;gBACnF,CAAC;YACH,CAAC;YACH,CAAC,CAAC,SAAS;KACd,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,OAAwB,EACxB,OAAuB;IAEvB,IAAI,IAAW,CAAC;IAChB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,OAAO,CAAC;IACvB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,CAAC,KAAK,YAAY,yBAAyB,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;YAC1E,MAAM,IAAI,yBAAyB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACxD,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IACD,OAAO,CAAC,aAAa,EAAE,CAAC;IACxB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,kBAAkB,CAMhC,OAA2E;IAE3E,MAAM,KAAK,GAAG,UAAU,CAAC,sBAAsB,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,IAAI,EAAE,GACzF,OAAO,CAAC;IACV,MAAM,QAAQ,GAAG,WAAW,CAAC,sBAAsB,CAEjD,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAkB,CAAC;IAC7D,MAAM,gBAAgB,GAAG,CAAC,YAAY,IAAI,QAAQ,CAAC,YAAY,CAAyB,CAAC;IAEzF,MAAM,QAAQ,GAAG,WAAW,CAA6C;QACvE,GAAG,IAAI;QACP,KAAK,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,YAAY,EAAE,KAAK,CAAC;QAC5E,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,KAAK,CAAC;QAClE,QAAQ,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE;YAC/B,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;YAC/D,IAAI,KAAK;gBAAE,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7C,OAAO,QAAQ,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CACd,CAAC;QAC/C,CAAC;QACD,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE;YACvC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;YAClE,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;gBAAE,MAAM,IAAI,yBAAyB,EAAE,CAAC;YAC5E,IAAI,IAAW,CAAC;YAChB,IAAI,CAAC;gBACH,IAAI,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YAC9D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;oBAAE,MAAM,IAAI,yBAAyB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;gBAChF,MAAM,KAAK,CAAC;YACd,CAAC;YACD,OAAO,CAAC,aAAa,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,SAAS,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,EAAE;YACtD,IAAI,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC;gBAAE,OAAO;YACxC,OAAO,SAAS,EAAE,CAChB,IAAI,EACJ,SAAS,EACT,cAAc,EACd,WAAW,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAC1C,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,EAAE;YACrD,IAAI,KAAK,YAAY,yBAAyB,IAAI,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC;gBAAE,OAAO;YACtF,OAAO,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAChG,CAAC;QACD,SAAS,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,EAAE;YAC7D,IAAI,KAAK,YAAY,yBAAyB,IAAI,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC;gBAAE,OAAO;YACtF,OAAO,SAAS,EAAE,CAChB,IAAI,EACJ,KAAK,EACL,SAAS,EACT,cAAc,EACd,WAAW,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAC1C,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;IAEH,SAAS,UAAU,CAAC,OAAgC;QAClD,OAAO,CAAC,KAAK,IAAI,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,cAAc,CAAC;IAC/D,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,GAAG,QAAQ,CAAC;IACpE,MAAM,MAAM,GAAG,WAAW,CACxB,CACE,SAAqB,EACrB,WAA8E,EAC9E,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,gBAAgB,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC,EAC/E,CAAC,SAAS,EAAE,KAAK,CAAC,CACnB,CAAC;IACF,MAAM,WAAW,GAAG,WAAW,CAC7B,CACE,SAAqB,EACrB,WAA8E,EAC9E,EAAE;QACF,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QACtC,OAAO,eAAe,CACpB,OAAO,EACP,cAAc,CAAC,SAAS,EAAE,gBAAgB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAClE,CAAC;IACJ,CAAC,EACD,CAAC,cAAc,EAAE,KAAK,CAAC,CACxB,CAAC;IACF,OAAO,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,WAAW,EAKxC,CAAC;AACJ,CAAC","sourcesContent":["'use client';\n\nimport {\n createContext,\n useCallback,\n useContext,\n useInsertionEffect,\n useState,\n type ReactNode,\n} from 'react';\nimport {\n useMutation,\n useQueryClient,\n type DefaultError,\n type MutateOptions,\n type MutationFunctionContext,\n type UseMutationOptions,\n type UseMutationResult,\n} from '@tanstack/react-query';\n\nexport interface MutationSession {\n uid: string | null;\n isCurrent(): boolean;\n assertCurrent(): void;\n}\n\nexport type SessionMutationFunctionContext = MutationFunctionContext & {\n session: MutationSession;\n};\n\nexport type SessionMutationOptions<\n TData = unknown,\n TError = DefaultError,\n TVariables = void,\n TOnMutateResult = unknown,\n> = Omit<\n UseMutationOptions<TData, TError, TVariables, TOnMutateResult>,\n 'mutationFn' | 'onMutate' | 'onSuccess' | 'onError' | 'onSettled'\n> & {\n mutationFn: (variables: TVariables, context: SessionMutationFunctionContext) => Promise<TData>;\n onMutate?: (\n variables: TVariables,\n context: SessionMutationFunctionContext,\n ) => Promise<TOnMutateResult> | TOnMutateResult;\n onSuccess?: (\n data: TData,\n variables: TVariables,\n onMutateResult: TOnMutateResult,\n context: SessionMutationFunctionContext,\n ) => Promise<unknown> | unknown;\n onError?: (\n error: TError,\n variables: TVariables,\n onMutateResult: TOnMutateResult | undefined,\n context: SessionMutationFunctionContext,\n ) => Promise<unknown> | unknown;\n onSettled?: (\n data: TData | undefined,\n error: TError | null,\n variables: TVariables,\n onMutateResult: TOnMutateResult | undefined,\n context: SessionMutationFunctionContext,\n ) => Promise<unknown> | unknown;\n};\n\nexport interface SessionMutateOptions<TData, TError, TVariables, TOnMutateResult> {\n onSuccess?: (\n data: TData,\n variables: TVariables,\n onMutateResult: TOnMutateResult | undefined,\n context: SessionMutationFunctionContext,\n ) => void;\n onError?: (\n error: TError,\n variables: TVariables,\n onMutateResult: TOnMutateResult | undefined,\n context: SessionMutationFunctionContext,\n ) => void;\n onSettled?: (\n data: TData | undefined,\n error: TError | null,\n variables: TVariables,\n onMutateResult: TOnMutateResult | undefined,\n context: SessionMutationFunctionContext,\n ) => void;\n}\n\ntype DistributiveOmit<T, K extends PropertyKey> = T extends unknown ? Omit<T, K> : never;\n\nexport type SessionMutationResult<\n TData = unknown,\n TError = DefaultError,\n TVariables = void,\n TOnMutateResult = unknown,\n> = DistributiveOmit<\n UseMutationResult<TData, TError, TVariables, TOnMutateResult>,\n 'mutate' | 'mutateAsync'\n> & {\n mutate: (\n variables: TVariables,\n options?: SessionMutateOptions<TData, TError, TVariables, TOnMutateResult>,\n ) => void;\n mutateAsync: (\n variables: TVariables,\n options?: SessionMutateOptions<TData, TError, TVariables, TOnMutateResult>,\n ) => Promise<TData>;\n};\n\nexport class MutationSessionEndedError extends Error {\n override name = 'AbortError';\n\n constructor(options?: { cause?: unknown }) {\n super('The session that started this mutation has ended.', options);\n }\n}\n\ninterface SessionStore {\n current: { uid: string | null; generation: number };\n}\n\nconst MutationSessionContext = createContext<SessionStore | null>(null);\n\nexport interface MutationSessionProviderProps {\n currentUid: string | null;\n children?: ReactNode;\n}\n\nexport function MutationSessionProvider({ currentUid, children }: MutationSessionProviderProps) {\n const [store] = useState<SessionStore>(() => ({\n current: { uid: currentUid, generation: 0 },\n }));\n // Insertion effects run before any layout effect of the commit, so a child's layout effect\n // never starts a mutation under the uid this commit ends.\n useInsertionEffect(() => {\n if (store.current.uid !== currentUid) {\n store.current = { uid: currentUid, generation: store.current.generation + 1 };\n }\n }, [store, currentUid]);\n return (\n <MutationSessionContext.Provider value={store}>{children}</MutationSessionContext.Provider>\n );\n}\n\nconst ALWAYS_CURRENT: MutationSession = {\n uid: null,\n isCurrent: () => true,\n assertCurrent: () => {},\n};\n\nfunction captureSession(store: SessionStore | null): MutationSession {\n if (!store) return ALWAYS_CURRENT;\n const { uid, generation } = store.current;\n const isCurrent = () => store.current.generation === generation;\n return {\n uid,\n isCurrent,\n assertCurrent: () => {\n if (!isCurrent()) throw new MutationSessionEndedError();\n },\n };\n}\n\nexport function useMutationSessionCapture(): () => MutationSession {\n const store = useContext(MutationSessionContext);\n return useCallback(() => captureSession(store), [store]);\n}\n\nconst runSessions = new WeakMap<MutationFunctionContext, MutationSession>();\n\nfunction runHasEnded(store: SessionStore | null, context: MutationFunctionContext): boolean {\n if (!store) return false;\n return !(runSessions.get(context)?.isCurrent() ?? false);\n}\n\ntype Retry<TError> = UseMutationOptions<unknown, TError, unknown, unknown>['retry'];\ntype ThrowOnError<TError> = UseMutationOptions<unknown, TError, unknown, unknown>['throwOnError'];\n\nfunction retriesAfter<TError>(retry: Retry<TError>, failureCount: number, error: TError): boolean {\n if (error instanceof MutationSessionEndedError) return false;\n if (typeof retry === 'function') return retry(failureCount, error);\n if (typeof retry === 'number') return failureCount < retry;\n return retry === true;\n}\n\nfunction throwsToBoundary<TError>(throwOnError: ThrowOnError<TError>, error: TError): boolean {\n if (error instanceof MutationSessionEndedError) return false;\n if (typeof throwOnError === 'function') return throwOnError(error);\n return throwOnError === true;\n}\n\nfunction withSession(\n context: MutationFunctionContext,\n session: MutationSession,\n): SessionMutationFunctionContext {\n return { ...context, session };\n}\n\nfunction fenceCallOptions<TData, TError, TVariables, TOnMutateResult>(\n session: MutationSession,\n options: SessionMutateOptions<TData, TError, TVariables, TOnMutateResult> | undefined,\n): MutateOptions<TData, TError, TVariables, TOnMutateResult> | undefined {\n if (!options) return undefined;\n const { onSuccess, onError, onSettled } = options;\n return {\n onSuccess: onSuccess\n ? (data, variables, onMutateResult, context) => {\n if (session.isCurrent()) {\n onSuccess(data, variables, onMutateResult, withSession(context, session));\n }\n }\n : undefined,\n onError: onError\n ? (error, variables, onMutateResult, context) => {\n if (!(error instanceof MutationSessionEndedError) && session.isCurrent()) {\n onError(error, variables, onMutateResult, withSession(context, session));\n }\n }\n : undefined,\n onSettled: onSettled\n ? (data, error, variables, onMutateResult, context) => {\n if (!(error instanceof MutationSessionEndedError) && session.isCurrent()) {\n onSettled(data, error, variables, onMutateResult, withSession(context, session));\n }\n }\n : undefined,\n };\n}\n\nasync function settleInSession<TData>(\n session: MutationSession,\n settled: Promise<TData>,\n): Promise<TData> {\n let data: TData;\n try {\n data = await settled;\n } catch (error) {\n if (!(error instanceof MutationSessionEndedError) && !session.isCurrent()) {\n throw new MutationSessionEndedError({ cause: error });\n }\n throw error;\n }\n session.assertCurrent();\n return data;\n}\n\nexport function useSessionMutation<\n TData = unknown,\n TError = DefaultError,\n TVariables = void,\n TOnMutateResult = unknown,\n>(\n options: SessionMutationOptions<TData, TError, TVariables, TOnMutateResult>,\n): SessionMutationResult<TData, TError, TVariables, TOnMutateResult> {\n const store = useContext(MutationSessionContext);\n const queryClient = useQueryClient();\n const { mutationFn, onMutate, onSuccess, onError, onSettled, retry, throwOnError, ...rest } =\n options;\n const defaults = queryClient.defaultMutationOptions<\n UseMutationOptions<unknown, TError, unknown, unknown>\n >({ mutationKey: options.mutationKey });\n const baseRetry = (retry ?? defaults.retry) as Retry<TError>;\n const baseThrowOnError = (throwOnError ?? defaults.throwOnError) as ThrowOnError<TError>;\n\n const mutation = useMutation<TData, TError, TVariables, TOnMutateResult>({\n ...rest,\n retry: (failureCount, error) => retriesAfter(baseRetry, failureCount, error),\n throwOnError: (error) => throwsToBoundary(baseThrowOnError, error),\n onMutate: (variables, context) => {\n const session = store ? captureSession(store) : ALWAYS_CURRENT;\n if (store) runSessions.set(context, session);\n return onMutate?.(variables, withSession(context, session)) as\n TOnMutateResult | Promise<TOnMutateResult>;\n },\n mutationFn: async (variables, context) => {\n const session = store ? runSessions.get(context) : ALWAYS_CURRENT;\n if (!session || !session.isCurrent()) throw new MutationSessionEndedError();\n let data: TData;\n try {\n data = await mutationFn(variables, { ...context, session });\n } catch (error) {\n if (!session.isCurrent()) throw new MutationSessionEndedError({ cause: error });\n throw error;\n }\n session.assertCurrent();\n return data;\n },\n onSuccess: (data, variables, onMutateResult, context) => {\n if (runHasEnded(store, context)) return;\n return onSuccess?.(\n data,\n variables,\n onMutateResult,\n withSession(context, runSession(context)),\n );\n },\n onError: (error, variables, onMutateResult, context) => {\n if (error instanceof MutationSessionEndedError || runHasEnded(store, context)) return;\n return onError?.(error, variables, onMutateResult, withSession(context, runSession(context)));\n },\n onSettled: (data, error, variables, onMutateResult, context) => {\n if (error instanceof MutationSessionEndedError || runHasEnded(store, context)) return;\n return onSettled?.(\n data,\n error,\n variables,\n onMutateResult,\n withSession(context, runSession(context)),\n );\n },\n });\n\n function runSession(context: MutationFunctionContext): MutationSession {\n return (store && runSessions.get(context)) || ALWAYS_CURRENT;\n }\n\n const { mutate: rawMutate, mutateAsync: rawMutateAsync } = mutation;\n const mutate = useCallback(\n (\n variables: TVariables,\n callOptions?: SessionMutateOptions<TData, TError, TVariables, TOnMutateResult>,\n ) => rawMutate(variables, fenceCallOptions(captureSession(store), callOptions)),\n [rawMutate, store],\n );\n const mutateAsync = useCallback(\n (\n variables: TVariables,\n callOptions?: SessionMutateOptions<TData, TError, TVariables, TOnMutateResult>,\n ) => {\n const session = captureSession(store);\n return settleInSession(\n session,\n rawMutateAsync(variables, fenceCallOptions(session, callOptions)),\n );\n },\n [rawMutateAsync, store],\n );\n return { ...mutation, mutate, mutateAsync } as SessionMutationResult<\n TData,\n TError,\n TVariables,\n TOnMutateResult\n >;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ttt-productions/query-core",
3
- "version": "0.14.24",
3
+ "version": "0.14.25",
4
4
  "description": "Shared TanStack Query (React Query) client defaults, query key helpers, and Firestore integration hooks for TTT Productions apps",
5
5
  "repository": {
6
6
  "type": "git",