{"version":3,"sources":["../../src/useAll/index.ts"],"names":["useContext","ErrorBoundaryContext_default","SuspenseContext_default","_value","_root","_awaitOnly","useSyncExternalStore","_subscribeWithError","_valueToggler","state","err","l","i","handleSuspense_default","alwaysNoop_default","noop"],"mappings":"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","file":"chunk-N7FURDXM.cjs","sourcesContent":["import { useContext, useSyncExternalStore } from 'react';\nimport type {\n  AnyAsyncState,\n  Falsy,\n  ExtractValues,\n  AsyncState,\n  ExtractErrors,\n} from '../types';\nimport noop from 'lodash.noop';\nimport ErrorBoundaryContext from '../utils/ErrorBoundaryContext';\nimport handleSuspense from '../utils/handleSuspense';\nimport SuspenseContext from '../utils/SuspenseContext';\nimport alwaysNoop from '../utils/alwaysNoop';\n\n/**\n * A hook to retrieve the current values and errors from multiple {@link states}.\n * If any of {@link states} isn't loaded, the component using this hook suspends.\n * Ensure the component is wrapped in a <Suspense> component to handle the loading state.\n * If any of {@link states} fails and {@link safeReturn} is not enabled, an error is thrown.\n *\n * @example\n * ```jsx\n * const DataComponent = () => {\n *   const [data1, data2] = useAll([asyncState1, asyncState2]);\n *\n *   return (\n *     <div>\n *       <div>Data: {JSON.stringify(data1)}</div>\n *       <div>Data: {JSON.stringify(data2)}</div>\n *     </div>\n *   );\n * };\n *\n * const SafeComponent = () => {\n *   const [[data1, data2], errors] = useAll([asyncState1, asyncState2], true);\n *\n *   if (errors.some((error) => error)) {\n *     return <div>Error occurred</div>;\n *   }\n *\n *   return (\n *     <div>\n *       <div>Data: {JSON.stringify(data1)}</div>\n *       <div>Data: {JSON.stringify(data2)}</div>\n *     </div>\n *   );\n * };\n *\n * const App = () => (\n *   <>\n *     <Suspense fallback={<div>Loading...</div>}>\n *       <DataComponent />\n *     </Suspense>\n *     <Suspense fallback={<div>Loading...</div>}>\n *       <SafeComponent />\n *     </Suspense>\n *   </>\n * );\n * ```\n */\nconst useAll = <\n  const S extends Array<AsyncState | Falsy>,\n  SafeReturn extends boolean = false,\n>(\n  states: S,\n  safeReturn?: SafeReturn\n): SafeReturn extends false\n  ? ExtractValues<S>\n  : Readonly<\n      | [\n          values: ExtractValues<S>,\n          errors: Readonly<{\n            [index in keyof S]: undefined;\n          }>,\n        ]\n      | [values: ExtractValues<S, true>, errors: ExtractErrors<S>]\n    > => {\n  const l = states.length;\n\n  const values = new Array(l);\n\n  const errors = new Array(l);\n\n  const errorBoundaryCtx = useContext(ErrorBoundaryContext);\n\n  const suspenseCtx = useContext(SuspenseContext);\n\n  for (let i = 0; i < l; i++) {\n    const state = states[i];\n\n    if (state) {\n      const errorState = state.error;\n\n      const err = errorState._value;\n\n      const isError = err !== undefined;\n\n      if (isError && !safeReturn) {\n        throw err;\n      }\n\n      const root = state._root;\n\n      if (root._value !== undefined || isError) {\n        const withValueWatching = !state._awaitOnly;\n\n        useSyncExternalStore(state._subscribeWithError, () =>\n          withValueWatching\n            ? (errorState._valueToggler << 1) | state._valueToggler\n            : (((errorState._value === undefined) as any) << 1) |\n              ((root._value !== undefined) as any)\n        );\n\n        if (withValueWatching) {\n          values[i] = state.get();\n        }\n\n        errors[i] = err;\n      } else {\n        const unloadedStates: AnyAsyncState[] = [state];\n\n        while (++i < l) {\n          const state = states[i];\n\n          if (state) {\n            const err = state.error._value;\n\n            if (err === undefined) {\n              if (state._root._value === undefined) {\n                unloadedStates.push(state);\n              }\n            } else if (!safeReturn) {\n              throw err;\n            }\n          }\n        }\n\n        throw new Promise<void>((res) => {\n          const l = unloadedStates.length;\n\n          let inProgressCount = l;\n\n          const onResolve = () => {\n            if (!--inProgressCount) {\n              res();\n            }\n          };\n\n          const rej = safeReturn ? onResolve : res;\n\n          for (let i = 0; i < l; i++) {\n            handleSuspense(\n              unloadedStates[i]._root,\n              errorBoundaryCtx,\n              suspenseCtx\n            ).then(onResolve, rej);\n          }\n        });\n      }\n    } else {\n      useSyncExternalStore(alwaysNoop, noop);\n    }\n  }\n\n  return safeReturn ? [values, errors] : (values as any);\n};\n\nexport default useAll;\n"]}