{"version":3,"sources":["../src/server-fn-client.ts","../src/client-observers.ts","../src/mutation-retry.ts"],"sourcesContent":["\"use client\";\n\nimport {\n  createElement,\n  useCallback,\n  useMemo,\n  useRef,\n  useState,\n  type ComponentType,\n  type FormHTMLAttributes,\n} from \"react\";\nimport type { ServerFn } from \"./server-fn\";\nimport type { RetryOptions } from \"./api/client\";\nimport { notifyClientObserver } from \"./client-observers\";\nimport { invokeMutationWithRetry } from \"./mutation-retry\";\n\nexport type ServerFnActionStatus = \"idle\" | \"pending\" | \"success\" | \"error\";\n\nexport type ServerFnSubmit<TInput, TResult> = [unknown] extends [TInput]\n  ? (input?: TInput | FormData) => Promise<TResult>\n  : (input: TInput | FormData) => Promise<TResult>;\n\nexport type ServerFnOptimisticContext<TInput, TResult> = {\n  input: TInput | FormData | undefined;\n  formData?: FormData;\n  current: TResult | null;\n};\n\nexport type UseServerFnOptions<TResult, TError extends Error = Error, TInput = unknown> = {\n  initialResult?: TResult | null;\n  resetOnSubmit?: boolean;\n  throwOnFormError?: boolean;\n  optimistic?: (context: ServerFnOptimisticContext<TInput, TResult>) => TResult | null | undefined;\n  rollbackOnError?: boolean;\n  /** Retry failed submissions with the API client's retry shape. Defaults to no retries. */\n  retry?: RetryOptions;\n  onSuccess?: (result: TResult) => void;\n  onError?: (error: TError) => void;\n  onSettled?: (result: TResult | null, error: TError | null) => void;\n};\n\nexport type UseServerFnReturn<TInput, TResult, TError extends Error = Error> = {\n  pending: boolean;\n  status: ServerFnActionStatus;\n  result: TResult | null;\n  error: TError | null;\n  submit: ServerFnSubmit<TInput, TResult>;\n  formAction: (formData: FormData) => Promise<void>;\n  reset: () => void;\n};\n\nexport type UseActionFormProps = Omit<FormHTMLAttributes<HTMLFormElement>, \"action\">;\n\nexport type RouteActionTarget<TServerFn extends ServerFn<any, any, any>> = {\n  readonly action: TServerFn;\n};\n\nexport type UseActionReturn<TInput, TResult, TError extends Error = Error> = ServerFnSubmit<\n  TInput,\n  TResult\n> & {\n  pending: boolean;\n  status: ServerFnActionStatus;\n  data: TResult | null;\n  result: TResult | null;\n  error: TError | null;\n  formAction: (formData: FormData) => Promise<void>;\n  Form: ComponentType<UseActionFormProps>;\n  reset: () => void;\n};\n\ntype ServerFnActionState<TResult, TError extends Error> = {\n  pendingCount: number;\n  status: ServerFnActionStatus;\n  result: TResult | null;\n  error: TError | null;\n};\n\ntype ServerFnActionCallbacks<TResult, TError extends Error> = Pick<\n  UseServerFnOptions<TResult, TError, unknown>,\n  \"onError\" | \"onSettled\" | \"onSuccess\" | \"throwOnFormError\"\n>;\n\nexport function useServerFn<TInput, TResult, TError extends Error = Error>(\n  serverFn: ServerFn<TInput, TResult, TError>,\n  options: UseServerFnOptions<TResult, TError, TInput> = {},\n): UseServerFnReturn<TInput, TResult, TError> {\n  const { initialResult = null, resetOnSubmit = true } = options;\n  const callbacksRef = useRef<ServerFnActionCallbacks<TResult, TError>>({});\n  const requestIdRef = useRef(0);\n  const lastResetIdRef = useRef(0);\n  const initialState: ServerFnActionState<TResult, TError> = {\n    pendingCount: 0,\n    status: \"idle\",\n    result: initialResult,\n    error: null,\n  };\n  const stateRef = useRef<ServerFnActionState<TResult, TError>>(initialState);\n  const [state, setState] = useState<ServerFnActionState<TResult, TError>>(initialState);\n  const setActionState = useCallback(\n    (\n      value:\n        | ServerFnActionState<TResult, TError>\n        | ((current: ServerFnActionState<TResult, TError>) => ServerFnActionState<TResult, TError>),\n    ) => {\n      // Later submissions in the same React batch must see this transition.\n      const next = typeof value === \"function\" ? value(stateRef.current) : value;\n      stateRef.current = next;\n      setState(next);\n    },\n    [],\n  );\n\n  callbacksRef.current = {\n    onError: options.onError,\n    onSettled: options.onSettled,\n    onSuccess: options.onSuccess,\n    throwOnFormError: options.throwOnFormError,\n  };\n\n  const submit = useCallback(\n    async (input?: TInput | FormData) => {\n      const requestId = ++requestIdRef.current;\n      const formData = isFormData(input) ? input : undefined;\n      const previousResult = stateRef.current.result;\n      const optimisticResult = options.optimistic?.({\n        input,\n        formData,\n        current: previousResult,\n      });\n      const hasOptimisticResult = optimisticResult !== undefined;\n\n      setActionState((current) => {\n        // Optimistic callbacks are app code and may reset or submit again.\n        if (requestId < lastResetIdRef.current) return current;\n        const pendingCount = current.pendingCount + 1;\n        if (requestId !== requestIdRef.current) return { ...current, pendingCount };\n        return {\n          pendingCount,\n          status: \"pending\",\n          result: hasOptimisticResult ? optimisticResult : resetOnSubmit ? null : current.result,\n          error: null,\n        };\n      });\n\n      try {\n        const result = await invokeMutationWithRetry(\n          () => serverFn(input as TInput | FormData),\n          options.retry,\n          // A reset disowns this submission; stop scheduling retries then.\n          () => requestId >= lastResetIdRef.current,\n        );\n        const isLatestRequest = requestId === requestIdRef.current;\n\n        setActionState((current) => {\n          // Reset starts a new pending-count generation, not just a new result.\n          if (requestId < lastResetIdRef.current) return current;\n          const pendingCount = Math.max(0, current.pendingCount - 1);\n\n          if (!isLatestRequest) {\n            return {\n              ...current,\n              pendingCount,\n            };\n          }\n\n          return {\n            pendingCount,\n            status: \"success\",\n            result,\n            error: null,\n          };\n        });\n\n        if (isLatestRequest) {\n          notifyClientObserver(callbacksRef.current.onSuccess, [result], \"Action onSuccess\");\n          if (requestId === requestIdRef.current) {\n            notifyClientObserver(\n              callbacksRef.current.onSettled,\n              [result, null],\n              \"Action onSettled\",\n            );\n          }\n        }\n\n        return result;\n      } catch (cause) {\n        const error = normalizeServerFnError(cause) as TError;\n        const isLatestRequest = requestId === requestIdRef.current;\n\n        setActionState((current) => {\n          if (requestId < lastResetIdRef.current) return current;\n          const pendingCount = Math.max(0, current.pendingCount - 1);\n\n          if (!isLatestRequest) {\n            return {\n              ...current,\n              pendingCount,\n            };\n          }\n\n          return {\n            pendingCount,\n            status: \"error\",\n            result:\n              hasOptimisticResult && options.rollbackOnError\n                ? previousResult\n                : resetOnSubmit\n                  ? null\n                  : current.result,\n            error,\n          };\n        });\n\n        if (isLatestRequest) {\n          notifyClientObserver(callbacksRef.current.onError, [error], \"Action onError\");\n          if (requestId === requestIdRef.current) {\n            notifyClientObserver(callbacksRef.current.onSettled, [null, error], \"Action onSettled\");\n          }\n        }\n\n        throw error;\n      }\n    },\n    [\n      options.optimistic,\n      options.retry,\n      options.rollbackOnError,\n      resetOnSubmit,\n      serverFn,\n      setActionState,\n    ],\n  ) as ServerFnSubmit<TInput, TResult>;\n\n  const formAction = useCallback(\n    async (formData: FormData) => {\n      try {\n        await submit(formData as TInput | FormData);\n      } catch (error) {\n        if (callbacksRef.current.throwOnFormError) {\n          throw error;\n        }\n      }\n    },\n    [submit],\n  );\n\n  const reset = useCallback(() => {\n    lastResetIdRef.current = ++requestIdRef.current;\n    setActionState({\n      pendingCount: 0,\n      status: \"idle\",\n      result: initialResult,\n      error: null,\n    });\n  }, [initialResult, setActionState]);\n\n  return useMemo(\n    () => ({\n      pending: state.pendingCount > 0,\n      status: state.status,\n      result: state.result,\n      error: state.error,\n      submit,\n      formAction,\n      reset,\n    }),\n    [formAction, reset, state.error, state.pendingCount, state.result, state.status, submit],\n  );\n}\n\n/**\n * Wrap a server function, or a route's default server function, as a callable\n * RPC with React mutation state.\n */\nexport function useAction<TInput, TResult, TError extends Error = Error>(\n  route: RouteActionTarget<ServerFn<TInput, TResult, TError>>,\n  options?: UseServerFnOptions<TResult, TError, TInput>,\n): UseActionReturn<TInput, TResult, TError>;\nexport function useAction<TInput, TResult, TError extends Error = Error>(\n  serverFn: ServerFn<TInput, TResult, TError>,\n  options?: UseServerFnOptions<TResult, TError, TInput>,\n): UseActionReturn<TInput, TResult, TError>;\nexport function useAction<TInput, TResult, TError extends Error = Error>(\n  target: ServerFn<TInput, TResult, TError> | RouteActionTarget<ServerFn<TInput, TResult, TError>>,\n  options: UseServerFnOptions<TResult, TError, TInput> = {},\n): UseActionReturn<TInput, TResult, TError> {\n  const serverFn = resolveServerFnTarget(target);\n  const action = useServerFn(serverFn, options);\n  const formActionRef = useRef(action.formAction);\n  formActionRef.current = action.formAction;\n\n  const Form = useMemo(() => {\n    // Keep both the component and its action stable, even when a parent caches\n    // the form element. Resolve the latest target/options at submission time.\n    const submitForm = (formData: FormData) => formActionRef.current(formData);\n    const ActionForm = (props: UseActionFormProps) =>\n      createElement(\"form\", {\n        ...props,\n        action: submitForm,\n      });\n\n    ActionForm.displayName = \"FarmActionForm\";\n    return ActionForm;\n  }, []);\n\n  return useMemo(() => {\n    const call = ((input?: TInput | FormData) =>\n      action.submit(input as TInput | FormData)) as ServerFnSubmit<TInput, TResult>;\n\n    return Object.assign(call, {\n      pending: action.pending,\n      status: action.status,\n      data: action.result,\n      result: action.result,\n      error: action.error,\n      formAction: action.formAction,\n      Form,\n      reset: action.reset,\n    });\n  }, [\n    Form,\n    action.error,\n    action.formAction,\n    action.pending,\n    action.reset,\n    action.result,\n    action.status,\n    action.submit,\n  ]);\n}\n\nfunction resolveServerFnTarget<TInput, TResult, TError extends Error>(\n  target: ServerFn<TInput, TResult, TError> | RouteActionTarget<ServerFn<TInput, TResult, TError>>,\n): ServerFn<TInput, TResult, TError> {\n  if (typeof target === \"function\") return target;\n  if (target && typeof target.action === \"function\") return target.action;\n\n  throw new TypeError(\n    \"useAction requires a server function or a route with at least one declared action\",\n  );\n}\n\nfunction normalizeServerFnError(error: unknown) {\n  if (error instanceof Error) return error;\n\n  const normalized = new Error(typeof error === \"string\" ? error : \"Server function failed\");\n  (normalized as Error & { cause?: unknown }).cause = error;\n  return normalized;\n}\n\nfunction isFormData(value: unknown): value is FormData {\n  if (!value || typeof value !== \"object\") return false;\n\n  if (typeof FormData !== \"undefined\" && value instanceof FormData) {\n    return true;\n  }\n\n  return (\n    Object.prototype.toString.call(value) === \"[object FormData]\" &&\n    typeof (value as { entries?: unknown }).entries === \"function\"\n  );\n}\n","/** Metadata shared by app-route and integration execution attempts. */\nexport type ClientRequestEvent = {\n  requestId: string;\n  method: string;\n  path: string;\n  attempt: number;\n  timestamp: number;\n};\n\nexport type ClientResponseEvent<TData = unknown> = ClientRequestEvent & {\n  response?: Response;\n  data?: TData;\n  error?: Error;\n  ok?: boolean;\n  status?: number;\n};\n\n/** Observers compose with per-call hooks; return values never replace the result. */\nexport type ClientLifecycleHooks<TData = unknown> = {\n  onRequest?: (event: ClientRequestEvent) => void;\n  onResponse?: (\n    data: TData | undefined,\n    error: Error | null,\n    event: ClientResponseEvent<TData>,\n  ) => void;\n  onError?: (error: Error) => void;\n};\n\nexport function notifyClientObserver(\n  observer: ((...args: any[]) => unknown) | undefined,\n  args: unknown[],\n  label = \"Client lifecycle\",\n): void {\n  if (!observer) return;\n  const report = (error: unknown) => {\n    const reportError = (\n      globalThis as typeof globalThis & { reportError?: (error: unknown) => void }\n    ).reportError;\n    if (typeof reportError === \"function\") {\n      try {\n        reportError.call(globalThis, error);\n        return;\n      } catch {\n        /* Try the console fallback. */\n      }\n    }\n    try {\n      console.error(`[Farm.js] ${label} callback failed:`, error);\n    } catch {\n      /* Reporting must not affect a call. */\n    }\n  };\n  try {\n    const result = observer(...args);\n    if (result && typeof (result as PromiseLike<unknown>).then === \"function\")\n      void Promise.resolve(result).catch(report);\n  } catch (error) {\n    report(error);\n  }\n}\n","import type { RetryOptions } from \"./api/client\";\n\n/**\n * Retry a server-function mutation with the API client's retry shape.\n *\n * Attempts run until success, until `count` retries are exhausted, or until\n * `shouldContinue` reports that the owning lifecycle was reset. The delay\n * callback receives the upcoming attempt number starting at 1, matching the\n * API client. Defaults to zero retries so existing behavior is unchanged.\n */\nexport async function invokeMutationWithRetry<T>(\n  invoke: () => Promise<T>,\n  retry: RetryOptions | undefined,\n  shouldContinue: () => boolean,\n): Promise<T> {\n  const maxRetries = Math.max(0, retry?.count ?? 0);\n  let attempt = 0;\n\n  while (true) {\n    try {\n      return await invoke();\n    } catch (error) {\n      if (attempt >= maxRetries || !shouldContinue()) throw error;\n\n      attempt += 1;\n      const delay = typeof retry?.delay === \"function\" ? retry.delay(attempt) : (retry?.delay ?? 0);\n      if (delay > 0) {\n        await new Promise<void>((resolve) => setTimeout(resolve, delay));\n        // The lifecycle may have been reset while this attempt waited.\n        if (!shouldContinue()) throw error;\n      }\n    }\n  }\n}\n"],"mappings":"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","names":[]}