{"version":3,"file":"index.cjs","names":[],"sources":["../../src/react-query/hooks/useActionMutation.ts","../../src/react-query/hooks/useActionQuery.ts"],"sourcesContent":["import {\n  type UseMutationOptions,\n  type UseMutationResult,\n  useMutation,\n} from \"@tanstack/react-query\";\nimport { useRef } from \"react\";\nimport type { ActionCore } from \"../../ActionDefinition/Action/Core/ActionCore\";\nimport type {\n  IActionDomain,\n  TInferInputFromSchema,\n  TInferOutputFromSchema,\n} from \"../../ActionDefinition/Domain/ActionDomain.types\";\nimport type { ActionSchema, TActionThrownError } from \"../../ActionDefinition/Schema/ActionSchema\";\n\n/** When an action has no input schema (Input = never), use void so mutate() needs no arguments. */\nexport type TActionMutationVars<SCH extends ActionSchema<any, any, any>> = [\n  TInferInputFromSchema<SCH>[\"Input\"],\n] extends [never]\n  ? void\n  : TInferInputFromSchema<SCH>[\"Input\"];\n\nexport type TUseNiceMutationOptions<\n  DOM extends IActionDomain,\n  ID extends keyof DOM[\"actionSchema\"] & string,\n  SCH extends DOM[\"actionSchema\"][ID] = DOM[\"actionSchema\"][ID],\n  TContext = unknown,\n> = Omit<\n  UseMutationOptions<\n    TInferOutputFromSchema<SCH>[\"Output\"],\n    TActionThrownError<SCH>,\n    TActionMutationVars<SCH>,\n    TContext\n  >,\n  \"mutationFn\"\n>;\n\nexport function useActionMutation<\n  DOM extends IActionDomain,\n  ID extends keyof DOM[\"actionSchema\"] & string,\n  SCH extends DOM[\"actionSchema\"][ID],\n  TContext = unknown,\n>(\n  action: ActionCore<DOM, ID>,\n  options?: TUseNiceMutationOptions<DOM, ID, SCH, TContext>,\n): UseMutationResult<\n  TInferOutputFromSchema<SCH>[\"Output\"],\n  TActionThrownError<SCH>,\n  TActionMutationVars<SCH>,\n  TContext\n> {\n  const mutationOptions = options ?? {};\n\n  // Side-channel for the call site: mutate() writes it synchronously, mutationFn reads it.\n  // React Query calls mutationFn synchronously within mutate(), so the ref is always fresh.\n  const callSiteRef = useRef<string | undefined>(undefined);\n\n  const result = useMutation({\n    mutationFn: (input: TActionMutationVars<SCH>) => {\n      const req = action.request(input as unknown as TInferInputFromSchema<SCH>[\"Input\"]);\n      req._callSite = callSiteRef.current;\n      callSiteRef.current = undefined;\n      return req.runToOutput();\n    },\n    ...mutationOptions,\n  });\n\n  // Wrap mutate/mutateAsync so the call site is captured at the user's invocation point.\n  // By the time mutationFn runs inside React Query's scheduler the user's frames are gone.\n  return {\n    ...result,\n    mutate: (...args: Parameters<typeof result.mutate>) => {\n      callSiteRef.current = new Error().stack;\n      return result.mutate(...args);\n    },\n    mutateAsync: (...args: Parameters<typeof result.mutateAsync>) => {\n      callSiteRef.current = new Error().stack;\n      return result.mutateAsync(...args);\n    },\n  };\n}\n","import {\n  type QueryKey,\n  type UseQueryOptions,\n  type UseQueryResult,\n  useQuery,\n} from \"@tanstack/react-query\";\nimport { useRef } from \"react\";\nimport type { ActionCore } from \"../../ActionDefinition/Action/Core/ActionCore\";\nimport type {\n  IActionDomain,\n  TInferInputFromSchema,\n  TInferOutputFromSchema,\n} from \"../../ActionDefinition/Domain/ActionDomain.types\";\nimport type { TActionThrownError } from \"../../ActionDefinition/Schema/ActionSchema\";\n\nexport function actionQueryKey<\n  DOM extends IActionDomain,\n  ID extends keyof DOM[\"actionSchema\"] & string,\n>(action: ActionCore<DOM, ID>): readonly [\"nice-action\", DOM[\"domain\"], DOM[\"allDomains\"], ID];\n\nexport function actionQueryKey<\n  DOM extends IActionDomain,\n  ID extends keyof DOM[\"actionSchema\"] & string,\n>(\n  action: ActionCore<DOM, ID>,\n  input: TInferInputFromSchema<DOM[\"actionSchema\"][ID]>[\"Input\"],\n): readonly [\n  \"nice-action\",\n  DOM[\"domain\"],\n  DOM[\"allDomains\"],\n  ID,\n  TInferInputFromSchema<DOM[\"actionSchema\"][ID]>[\"Input\"],\n];\n\nexport function actionQueryKey(action: ActionCore<any, any>, input?: unknown): QueryKey {\n  if (input === undefined) {\n    return [\"nice-action\", action.domain, action.allDomains, action.id] as const;\n  }\n\n  return [\"nice-action\", action.domain, action.allDomains, action.id, input] as const;\n}\n\nexport type TUseActionQueryOptions<\n  DOM extends IActionDomain,\n  ID extends keyof DOM[\"actionSchema\"] & string,\n  SCH extends DOM[\"actionSchema\"][ID] = DOM[\"actionSchema\"][ID],\n  TSelect = TInferOutputFromSchema<SCH>[\"Output\"],\n> = Omit<\n  UseQueryOptions<\n    TInferOutputFromSchema<SCH>[\"Output\"],\n    TActionThrownError<SCH>,\n    TSelect,\n    QueryKey\n  >,\n  \"queryKey\" | \"queryFn\"\n>;\n\nexport function useActionQuery<\n  DOM extends IActionDomain,\n  ID extends keyof DOM[\"actionSchema\"] & string,\n  SCH extends DOM[\"actionSchema\"][ID],\n  TSelect = TInferOutputFromSchema<SCH>[\"Output\"],\n>(\n  action: ActionCore<DOM, ID>,\n  ...args: [TInferInputFromSchema<SCH>[\"Input\"]] extends [never]\n    ? [options?: TUseActionQueryOptions<DOM, ID, SCH, TSelect>]\n    : [\n        input: TInferInputFromSchema<SCH>[\"Input\"] | null | undefined,\n        options?: TUseActionQueryOptions<DOM, ID, SCH, TSelect>,\n      ]\n): UseQueryResult<TSelect, TActionThrownError<SCH>> {\n  const hasInputSchema = action.schema.inputSchema != null;\n\n  let input: TInferInputFromSchema<SCH>[\"Input\"] | null | undefined;\n  let options: TUseActionQueryOptions<DOM, ID, SCH, TSelect> | undefined;\n\n  if (hasInputSchema) {\n    [input, options] = args as [\n      TInferInputFromSchema<SCH>[\"Input\"] | null | undefined,\n      TUseActionQueryOptions<DOM, ID, SCH, TSelect>?,\n    ];\n  } else {\n    [options] = args as [TUseActionQueryOptions<DOM, ID, SCH, TSelect>?];\n  }\n\n  const { enabled, ...queryOptions } = options ?? {};\n\n  // Capture the call site synchronously here — the user's component frame is on the\n  // stack now. By the time queryFn runs inside React Query's scheduler it's gone.\n  const callSiteRef = useRef(new Error().stack);\n\n  return useQuery({\n    queryKey: input != null ? actionQueryKey(action, input) : actionQueryKey(action),\n    queryFn: () => {\n      const req = (action.request as (input: any) => any)(input);\n      req._callSite = callSiteRef.current;\n      return req.runToOutput();\n    },\n    enabled: hasInputSchema ? input != null && (enabled ?? true) : (enabled ?? true),\n    ...queryOptions,\n  } as UseQueryOptions<TInferOutputFromSchema<SCH>[\"Output\"], TActionThrownError<SCH>, TSelect>);\n}\n"],"mappings":";;;;AAoCA,SAAgB,kBAMd,QACA,SAMA;CACA,MAAM,kBAAkB,WAAW,CAAC;CAIpC,MAAM,eAAA,GAAA,MAAA,OAAA,CAAyC,KAAA,CAAS;CAExD,MAAM,UAAA,GAAA,sBAAA,YAAA,CAAqB;EACzB,aAAa,UAAoC;GAC/C,MAAM,MAAM,OAAO,QAAQ,KAAuD;GAClF,IAAI,YAAY,YAAY;GAC5B,YAAY,UAAU,KAAA;GACtB,OAAO,IAAI,YAAY;EACzB;EACA,GAAG;CACL,CAAC;CAID,OAAO;EACL,GAAG;EACH,SAAS,GAAG,SAA2C;GACrD,YAAY,2BAAU,IAAI,MAAM,EAAA,CAAE;GAClC,OAAO,OAAO,OAAO,GAAG,IAAI;EAC9B;EACA,cAAc,GAAG,SAAgD;GAC/D,YAAY,2BAAU,IAAI,MAAM,EAAA,CAAE;GAClC,OAAO,OAAO,YAAY,GAAG,IAAI;EACnC;CACF;AACF;;;AC7CA,SAAgB,eAAe,QAA8B,OAA2B;CACtF,IAAI,UAAU,KAAA,GACZ,OAAO;EAAC;EAAe,OAAO;EAAQ,OAAO;EAAY,OAAO;CAAE;CAGpE,OAAO;EAAC;EAAe,OAAO;EAAQ,OAAO;EAAY,OAAO;EAAI;CAAK;AAC3E;AAiBA,SAAgB,eAMd,QACA,GAAG,MAM+C;CAClD,MAAM,iBAAiB,OAAO,OAAO,eAAe;CAEpD,IAAI;CACJ,IAAI;CAEJ,IAAI,gBACF,CAAC,OAAO,WAAW;MAKnB,CAAC,WAAW;CAGd,MAAM,EAAE,SAAS,GAAG,iBAAiB,WAAW,CAAC;CAIjD,MAAM,eAAA,GAAA,MAAA,OAAA,kBAAqB,IAAI,MAAM,EAAA,CAAE,KAAK;CAE5C,QAAA,GAAA,sBAAA,SAAA,CAAgB;EACd,UAAU,SAAS,OAAO,eAAe,QAAQ,KAAK,IAAI,eAAe,MAAM;EAC/E,eAAe;GACb,MAAM,MAAO,OAAO,QAAgC,KAAK;GACzD,IAAI,YAAY,YAAY;GAC5B,OAAO,IAAI,YAAY;EACzB;EACA,SAAS,iBAAiB,SAAS,SAAS,WAAW,QAAS,WAAW;EAC3E,GAAG;CACL,CAA6F;AAC/F"}