{"version":3,"file":"react-query.mjs","names":["errorFallbackProps: FallbackProps","errorFallbackProps: FallbackProps"],"sources":["../src/components/Boundaries/helpers.ts","../src/components/Boundaries/QueriesBoundary.tsx","../src/components/Boundaries/QueryBoundary.tsx","../src/components/Boundaries/SuspenseBoundary.tsx"],"sourcesContent":["import type {\n  DefinedQueryObserverResult,\n  QueryObserverLoadingErrorResult,\n  QueryObserverLoadingResult,\n  UseQueryResult,\n} from \"@tanstack/react-query\";\n\n/**\n * Returns whether a given query has a defined result. This includes the success state of the query, as well as the\n * states for refetch in progress, as well as the refetch error state with stale data.\n * @param query React Query query\n */\nexport function isDefinedQueryObserverResult<TData = unknown, TError = unknown>(\n  query: UseQueryResult<TData, TError>,\n): query is DefinedQueryObserverResult<TData, TError> {\n  return query.data !== undefined;\n}\n\n/**\n * Returns whether a given query is in the error state with no defined result. This includes the error state when data\n * is refetching.\n * @param query React Query query\n */\nexport function isQueryObserverLoadingErrorResult<\n  TData = unknown,\n  TError = unknown,\n>(\n  query: UseQueryResult<TData, TError>,\n): query is QueryObserverLoadingErrorResult<TData, TError> {\n  return query.data === undefined && query.isError;\n}\n\n/**\n * Returns whether a given query is in the loading state with no defined result. This includes the error state when data\n * is refetching.\n * @param query React Query query\n */\nexport function isQueryObserverLoadingResult<TData = unknown, TError = unknown>(\n  query: UseQueryResult<TData, TError>,\n): query is QueryObserverLoadingResult<TData, TError> {\n  return query.data === undefined && query.isPending;\n}\n","import type {\n  QueryObserverSuccessResult,\n  UseQueryResult,\n} from \"@tanstack/react-query\";\nimport * as React from \"react\";\nimport type { FallbackProps } from \"react-error-boundary\";\nimport {\n  isQueryObserverLoadingErrorResult,\n  isQueryObserverLoadingResult,\n} from \"./helpers\";\nimport type { ErrorFallbackProps } from \"./types\";\n\n/**\n * Provides a type for the children function of `<QueriesBoundary queries={[query1, query2]} />`\n * that allows the types of a successful query to be inferred for ease of use\n * @example\n * ```ts\n * type C = ChildrenFn<readonly [\n *   UseQueryResult<Query1Data>,\n *   UseQueryResult<Query2Data>,\n * ]>;\n * // Equivalent to\n * type C = (queries: readonly [\n *   QueryObserverSuccessResult<Query1Data>,\n *   QueryObserverSuccessResult<Query2Data>,\n * ]) => React.ReactNode;\n * ```\n */\ntype ChildrenFn<TQueries extends ReadonlyArray<UseQueryResult>> = (queries: {\n  [Key in keyof TQueries]: TQueries[Key] extends UseQueryResult<\n    infer TData,\n    infer TError\n  >\n    ? QueryObserverSuccessResult<TData, TError>\n    : TQueries[Key];\n}) => React.ReactNode;\n\nexport type QueriesBoundaryProps<\n  TQueries extends ReadonlyArray<UseQueryResult>,\n> = {\n  children: React.ReactNode | ChildrenFn<TQueries>;\n  loadingFallback: React.ReactNode;\n  queries: TQueries;\n} & ErrorFallbackProps;\n\nexport class AggregateQueriesError extends AggregateError {}\n\n/**\n * Utility component for managing the loading and error states for multiple React Query queries. Specifying the queries\n * automatically infers the types of the success state of the queries in the render prop children (if used).\n *\n * There are three mutually exclusive options for specifying an error fallback:\n * - `errorFallback` - JSX element\n * - `errorFallbackRender` - a function which takes `FallbackProps` and renders JSX\n * - `ErrorFallbackComponent` - a React component which takes `FallbackProps`\n *\n * @example\n * ```tsx\n * const MyComponent = () => {\n *   const query1: UseQueryResult<{ items: readonly string[] }> = useMyQuery1();\n *   const query2: UseQueryResult<{ balance: number }> = useMyQuery2();\n *\n *   return (\n *     <QueriesBoundary\n *       errorFallbackRender={({ resetErrorBoundary }) => (\n *         <>\n *           Something went wrong.{\" \"}\n *           <button type=\"button\" onClick={resetErrorBoundary}>Try again</button>\n *         </>\n *       )}\n *       loadingFallback={<SkeletonComponent />}\n *       queries={[query1, query2]}\n *     >\n *       {([{ data: { items } }, { data: { balance } }]) => (\n *         <>\n *           <p>\n *             Your balance:{\" \"}\n *             {new Intl.NumberFormat(\"en-AU\", { style: \"currency\", currency: \"AUD\" }).format(balance)}\n *           </p>\n *           <p>\n *             You have:{\" \"}\n *             {new Intl.ListFormat(\"en\", { style: \"long\", type: \"conunction\" }).format(data.items)}\n *           </p>\n *         </>\n *       )}\n *     </QueryBoundary>\n *   );\n * };\n * ```\n *\n * @param props\n */\nconst QueriesBoundary = <\n  // Including a newline here to fix broken syntax highlighting\n  const TQueries extends ReadonlyArray<UseQueryResult>,\n>({\n  children,\n  errorFallback,\n  errorFallbackRender,\n  ErrorFallbackComponent,\n  loadingFallback,\n  queries,\n}: QueriesBoundaryProps<TQueries>): React.JSX.Element => {\n  /**\n   * If any of the queries are in the error state, combine them into a single `AggregateError`\n   */\n  const error = React.useMemo(() => {\n    const errors = queries\n      .filter(isQueryObserverLoadingErrorResult)\n      .map((query) => query.error);\n    return errors.length\n      ? new AggregateQueriesError(\n          errors,\n          \"One or more queries are in the LoadingErrorResult state:\",\n        )\n      : undefined;\n  }, [queries]);\n\n  /**\n   * If any of the queries have a status of `\"error\"`, this will trigger a refetch of each\n   */\n  const resetErrorBoundary = React.useCallback(\n    () =>\n      queries\n        .filter(\n          (query): query is Extract<typeof query, { status: \"error\" }> =>\n            query.status === \"error\",\n        )\n        .forEach((query) => void query.refetch()),\n    [queries],\n  );\n\n  if (error) {\n    if (React.isValidElement(errorFallback)) {\n      return <>{errorFallback}</>;\n    }\n\n    const errorFallbackProps: FallbackProps = {\n      error,\n      resetErrorBoundary,\n    };\n\n    if (typeof errorFallbackRender === \"function\") {\n      return <>{errorFallbackRender(errorFallbackProps)}</>;\n    }\n\n    if (ErrorFallbackComponent) {\n      return <ErrorFallbackComponent {...errorFallbackProps} />;\n    }\n\n    /* istanbul ignore next */\n    throw new Error(\n      \"QueriesBoundary requires either errorFallback, errorFallbackRender, or ErrorFallbackComponent prop\",\n    );\n  }\n\n  if (queries.some((query) => isQueryObserverLoadingResult(query))) {\n    return <>{loadingFallback}</>;\n  }\n\n  return (\n    <>\n      {typeof children === \"function\"\n        ? children(queries as Parameters<ChildrenFn<TQueries>>[0])\n        : children}\n    </>\n  );\n};\n\nexport default QueriesBoundary;\n","import type {\n  DefinedQueryObserverResult,\n  UseQueryResult,\n} from \"@tanstack/react-query\";\nimport * as React from \"react\";\nimport type { FallbackProps } from \"react-error-boundary\";\nimport { isDefinedQueryObserverResult } from \"./helpers\";\nimport type { ErrorFallbackProps } from \"./types\";\n\nexport type QueryBoundaryProps<TData = unknown, TError = unknown> = {\n  children:\n    | React.ReactNode\n    | ((query: DefinedQueryObserverResult<TData, TError>) => React.ReactNode);\n  loadingFallback: React.ReactNode;\n  query: UseQueryResult<TData, TError>;\n} & ErrorFallbackProps;\n\n/**\n * Utility component for managing the loading and error states for a single React Query query. Specifying the query\n * automatically infers the type of the success state of the query in the render prop children (if used).\n *\n * There are three mutually exclusive options for specifying an error fallback:\n * - `errorFallback` - JSX element\n * - `errorFallbackRender` - a function which takes `FallbackProps` and renders JSX\n * - `ErrorFallbackComponent` - a React component which takes `FallbackProps`\n *\n * @example\n * ```tsx\n * const MyComponent = () => {\n *   const query: UseQueryResult<{ items: readonly string[] }> = useMyQuery();\n *   return (\n *     <QueryBoundary\n *       errorFallbackRender={({ resetErrorBoundary }) => (\n *         <>\n *           Something went wrong.{\" \"}\n *           <button type=\"button\" onClick={resetErrorBoundary}>Try again</button>\n *         </>\n *       )}\n *       loadingFallback={<LoadingSpinner />}\n *       query={query}\n *     >\n *       {({ data }) => (\n *         <p>\n *           You have:{\" \"}\n *           {new Intl.ListFormat(\"en\", { style: \"long\", type: \"conunction\" }).format(data.items)}\n *         </p>\n *       )}\n *     </QueryBoundary>\n *   );\n * };\n * ```\n *\n * @param props\n */\nconst QueryBoundary = <\n  // Including a newline here to fix broken syntax highlighting\n  TData = unknown,\n  TError = unknown,\n>({\n  children,\n  errorFallback,\n  errorFallbackRender,\n  ErrorFallbackComponent,\n  loadingFallback,\n  query,\n}: QueryBoundaryProps<TData, TError>): React.JSX.Element => {\n  const { refetch } = query;\n  const resetErrorBoundary = React.useCallback(() => {\n    void refetch();\n  }, [refetch]);\n\n  // A \"defined\" result means that we have usable data\n  if (isDefinedQueryObserverResult(query)) {\n    return <>{typeof children === \"function\" ? children(query) : children}</>;\n  }\n\n  if (query.isPending) {\n    return <>{loadingFallback}</>;\n  }\n\n  if (React.isValidElement(errorFallback)) {\n    return <>{errorFallback}</>;\n  }\n\n  const errorFallbackProps: FallbackProps = {\n    error: query.error,\n    resetErrorBoundary,\n  };\n\n  if (typeof errorFallbackRender === \"function\") {\n    return <>{errorFallbackRender(errorFallbackProps)}</>;\n  }\n\n  if (ErrorFallbackComponent) {\n    return <ErrorFallbackComponent {...errorFallbackProps} />;\n  }\n\n  throw new Error(\n    \"QueryBoundary requires either errorFallback, errorFallbackRender, or ErrorFallbackComponent prop\",\n  );\n};\n\nexport default QueryBoundary;\n","/* eslint-disable import/no-extraneous-dependencies */\n\nimport { QueryErrorResetBoundary } from \"@tanstack/react-query\";\nimport * as React from \"react\";\nimport { ErrorBoundary, type ErrorBoundaryProps } from \"react-error-boundary\";\nimport type { ErrorFallbackProps } from \"./types\";\n\nexport type SuspenseBoundaryProps = {\n  children: React.ReactNode;\n  loadingFallback: React.ReactNode;\n} & ErrorFallbackProps;\n\n/**\n * Utility component for managing loading and error states for Suspense components. Also integrates with React Query to\n * provide a QueryErrorResetBoundary.\n *\n * There are three mutually exclusive options for specifying an error fallback:\n * - `errorFallback` - JSX element\n * - `errorFallbackRender` - a function which takes `FallbackProps` and renders JSX\n * - `ErrorFallbackComponent` - a React component which takes `FallbackProps`\n *\n * @example\n * ```tsx\n * const SuspendingComponent = () => {\n *   const query: UseSuspensQueryResult<{ balance: number }> = useMySuspenseQuery();\n *   return (\n *     <p>\n *       Your balance:{\" \"}\n *       {new Intl.NumberFormat(\"en-AU\", { style: \"currency\", currency: \"AUD\" }).format(balance)}\n *     </p>\n *   );\n * };\n *\n * const MyComponent = () => (\n *   <SuspenseBoundary\n *     errorFallbackRender={({ resetErrorBoundary }) => (\n *       <>\n *         Something went wrong.{\" \"}\n *         <button type=\"button\" onClick={resetErrorBoundary}>Try again</button>\n *       </>\n *     )}\n *     loadingFallback={<LoadingSpinner />}\n *   >\n *     <SuspendingComponent />\n *   </SuspenseBoundary>\n * );\n * ```\n *\n * @param props\n */\nconst SuspenseBoundary = ({\n  children,\n  errorFallback,\n  errorFallbackRender,\n  ErrorFallbackComponent,\n  loadingFallback,\n}: SuspenseBoundaryProps) => {\n  return (\n    <QueryErrorResetBoundary>\n      {({ reset }) => (\n        <ErrorBoundary\n          {...({\n            fallback: errorFallback,\n            fallbackRender: errorFallbackRender,\n            FallbackComponent: ErrorFallbackComponent,\n          } as ErrorBoundaryProps)}\n          onReset={reset}\n        >\n          <React.Suspense fallback={loadingFallback}>{children}</React.Suspense>\n        </ErrorBoundary>\n      )}\n    </QueryErrorResetBoundary>\n  );\n};\n\nexport default SuspenseBoundary;\n"],"mappings":";;;;;;;;;;;AAYA,SAAgB,6BACd,OACoD;AACpD,QAAO,MAAM,SAAS;;;;;;;AAQxB,SAAgB,kCAId,OACyD;AACzD,QAAO,MAAM,SAAS,UAAa,MAAM;;;;;;;AAQ3C,SAAgB,6BACd,OACoD;AACpD,QAAO,MAAM,SAAS,UAAa,MAAM;;;;;ACK3C,IAAa,wBAAb,cAA2C,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+C1D,MAAM,mBAGJ,EACA,UACA,eACA,qBACA,wBACA,iBACA,cACuD;;;;CAIvD,MAAM,QAAQ,MAAM,cAAc;EAChC,MAAM,SAAS,QACZ,OAAO,kCAAkC,CACzC,KAAK,UAAU,MAAM,MAAM;AAC9B,SAAO,OAAO,SACV,IAAI,sBACF,QACA,2DACD,GACD;IACH,CAAC,QAAQ,CAAC;;;;CAKb,MAAM,qBAAqB,MAAM,kBAE7B,QACG,QACE,UACC,MAAM,WAAW,QACpB,CACA,SAAS,UAAU,KAAK,MAAM,SAAS,CAAC,EAC7C,CAAC,QAAQ,CACV;AAED,KAAI,OAAO;AACT,MAAI,MAAM,eAAe,cAAc,CACrC,QAAO,0CAAG,gBAAiB;EAG7B,MAAMA,qBAAoC;GACxC;GACA;GACD;AAED,MAAI,OAAO,wBAAwB,WACjC,QAAO,0CAAG,oBAAoB,mBAAmB,GAAI;AAGvD,MAAI,uBACF,QAAO,oBAAC,0BAAuB,GAAI,qBAAsB;;AAI3D,QAAM,IAAI,MACR,qGACD;;AAGH,KAAI,QAAQ,MAAM,UAAU,6BAA6B,MAAM,CAAC,CAC9D,QAAO,0CAAG,kBAAmB;AAG/B,QACE,0CACG,OAAO,aAAa,aACjB,SAAS,QAA+C,GACxD,WACH;;AAIP,8BAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnHf,MAAM,iBAIJ,EACA,UACA,eACA,qBACA,wBACA,iBACA,YAC0D;CAC1D,MAAM,EAAE,YAAY;CACpB,MAAM,qBAAqB,MAAM,kBAAkB;AACjD,EAAK,SAAS;IACb,CAAC,QAAQ,CAAC;AAGb,KAAI,6BAA6B,MAAM,CACrC,QAAO,0CAAG,OAAO,aAAa,aAAa,SAAS,MAAM,GAAG,WAAY;AAG3E,KAAI,MAAM,UACR,QAAO,0CAAG,kBAAmB;AAG/B,KAAI,MAAM,eAAe,cAAc,CACrC,QAAO,0CAAG,gBAAiB;CAG7B,MAAMC,qBAAoC;EACxC,OAAO,MAAM;EACb;EACD;AAED,KAAI,OAAO,wBAAwB,WACjC,QAAO,0CAAG,oBAAoB,mBAAmB,GAAI;AAGvD,KAAI,uBACF,QAAO,oBAAC,0BAAuB,GAAI,qBAAsB;AAG3D,OAAM,IAAI,MACR,mGACD;;AAGH,4BAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACpDf,MAAM,oBAAoB,EACxB,UACA,eACA,qBACA,wBACA,sBAC2B;AAC3B,QACE,oBAAC,sCACG,EAAE,YACF,oBAAC;EAEG,UAAU;EACV,gBAAgB;EAChB,mBAAmB;EAErB,SAAS;YAET,oBAAC,MAAM;GAAS,UAAU;GAAkB;IAA0B;GACxD,GAEM;;AAI9B,+BAAe"}