{"version":3,"file":"useClientSideDefer.mjs","names":[],"sources":["../../src/loadable-hooks/useClientSideDefer.ts"],"sourcesContent":["import { useLazyDisposableState } from '@isograph/react-disposable-state';\nimport { getOrCreateItemInSuspenseCache } from '../core/cache';\nimport type { FetchOptions } from '../core/check';\nimport type {\n  ExtractParameters,\n  FragmentReference,\n} from '../core/FragmentReference';\nimport { type UnknownTReadFromStore } from '../core/FragmentReference';\nimport type { LoadableField } from '../core/reader';\nimport { useIsographEnvironment } from '../react/IsographEnvironmentProvider';\n\ntype ArgsWithoutProvidedArgs<\n  TReadFromStore extends UnknownTReadFromStore,\n  TProvidedArgs extends object,\n> = Omit<ExtractParameters<TReadFromStore>, keyof TProvidedArgs>;\n\nexport function useClientSideDefer<\n  TReadFromStore extends UnknownTReadFromStore,\n  TResult,\n  TProvidedArgs extends object,\n>(\n  loadableField: LoadableField<\n    TReadFromStore,\n    TResult,\n    Omit<ExtractParameters<TReadFromStore>, keyof TProvidedArgs>\n  >,\n  ...maybeRequiredArgs: {} extends ArgsWithoutProvidedArgs<\n    TReadFromStore,\n    TProvidedArgs\n  >\n    ? [\n        args?: ArgsWithoutProvidedArgs<TReadFromStore, TProvidedArgs>,\n        fetchOptions?: FetchOptions<TResult, never>,\n      ]\n    : [\n        args: ArgsWithoutProvidedArgs<TReadFromStore, TProvidedArgs>,\n        fetchOptions?: FetchOptions<TResult, never>,\n      ]\n): { fragmentReference: FragmentReference<TReadFromStore, TResult> } {\n  const [args, fetchOptions] = maybeRequiredArgs;\n\n  const [id, loader] = loadableField(args, fetchOptions ?? {});\n  const environment = useIsographEnvironment();\n  const cache = getOrCreateItemInSuspenseCache(environment, id, loader);\n\n  const fragmentReference = useLazyDisposableState(cache).state;\n\n  return { fragmentReference };\n}\n\n// @ts-ignore\nfunction tsTests() {\n  let neverArgs!: LoadableField<\n    {\n      parameters: Record<string, never>;\n      data: {};\n    },\n    unknown\n  >;\n\n  let optionalArgs!: LoadableField<\n    {\n      parameters: {\n        foo?: string;\n      };\n      data: {};\n    },\n    unknown\n  >;\n\n  let requiredArgs!: LoadableField<\n    {\n      parameters: {\n        foo: string;\n      };\n      data: {};\n    },\n    unknown\n  >;\n\n  useClientSideDefer(neverArgs);\n  useClientSideDefer(neverArgs, {});\n  useClientSideDefer(neverArgs, {\n    // @ts-expect-error\n    foo: 'bar',\n  });\n\n  useClientSideDefer(optionalArgs);\n  useClientSideDefer(optionalArgs, {});\n  useClientSideDefer(optionalArgs, {\n    foo: 'bar',\n  });\n  useClientSideDefer(optionalArgs, {\n    // @ts-expect-error\n    foo: 12,\n  });\n\n  // @ts-expect-error\n  useClientSideDefer(requiredArgs);\n  // @ts-expect-error\n  useClientSideDefer(requiredArgs, {});\n  useClientSideDefer(requiredArgs, {\n    foo: 'bar',\n  });\n  useClientSideDefer(requiredArgs, {\n    // @ts-expect-error\n    foo: 12,\n  });\n}\n"],"mappings":";;;;;AAgBA,SAAgB,mBAKd,eAKA,GAAG,mBAYgE;CACnE,MAAM,CAAC,MAAM,gBAAgB;CAE7B,MAAM,CAAC,IAAI,UAAU,cAAc,MAAM,gBAAgB,EAAE,CAAC;AAM5D,QAAO,EAAE,mBAFiB,uBAFZ,+BADM,wBAAwB,EACc,IAAI,OAAO,CAEd,CAAC,OAE5B"}