{"version":3,"file":"LoadableFieldRenderer.mjs","names":[],"sources":["../../src/react/LoadableFieldRenderer.tsx"],"sourcesContent":["import * as React from 'react';\nimport { type FetchOptions } from '../core/check';\nimport type { ExtractParameters } from '../core/FragmentReference';\nimport { type UnknownTReadFromStore } from '../core/FragmentReference';\nimport { type NetworkRequestReaderOptions } from '../core/read';\nimport { type LoadableField } from '../core/reader';\nimport { useClientSideDefer } from '../loadable-hooks/useClientSideDefer';\nimport { useResult } from './useResult';\n\ntype ArgsWithoutProvidedArgs<\n  TReadFromStore extends UnknownTReadFromStore,\n  TProvidedArgs extends object,\n> = Omit<ExtractParameters<TReadFromStore>, keyof TProvidedArgs>;\n\ntype MaybeRequiredArgs<\n  TReadFromStore extends UnknownTReadFromStore,\n  TProvidedArgs extends object,\n> =\n  {} extends ArgsWithoutProvidedArgs<TReadFromStore, TProvidedArgs>\n    ? {\n        args?: ArgsWithoutProvidedArgs<TReadFromStore, TProvidedArgs>;\n      }\n    : {\n        args: ArgsWithoutProvidedArgs<TReadFromStore, TProvidedArgs>;\n      };\n\nexport function LoadableFieldRenderer<\n  TReadFromStore extends UnknownTReadFromStore,\n  TProvidedArgs extends object,\n  TChildrenResult,\n  TProps,\n>(\n  props: {\n    loadableField: LoadableField<\n      TReadFromStore,\n      React.FC<TProps>,\n      Omit<ExtractParameters<TReadFromStore>, keyof TProvidedArgs>\n    >;\n    fetchOptions?: FetchOptions<React.FC<TProps>, never>;\n    networkRequestOptions?: Partial<NetworkRequestReaderOptions>;\n    additionalProps: Omit<TProps, keyof JSX.IntrinsicAttributes>;\n  } & MaybeRequiredArgs<TReadFromStore, TProvidedArgs>,\n): TChildrenResult {\n  const { fragmentReference } = useClientSideDefer(\n    props.loadableField,\n    // @ts-expect-error\n    props.args,\n    props.fetchOptions,\n  );\n\n  const Component = useResult(fragmentReference, props.networkRequestOptions);\n\n  // TODO we probably can figure out a way to convince TypeScript of\n  // the validity of this.\n  // @ts-expect-error\n  return <Component {...props.additionalProps} />;\n}\n\n// @ts-ignore\nfunction tsTests() {\n  let neverArgs!: LoadableField<\n    {\n      parameters: Record<string, never>;\n      data: {};\n    },\n    () => React.ReactNode\n  >;\n\n  let optionalArgs!: LoadableField<\n    {\n      parameters: {\n        foo?: string;\n      };\n      data: {};\n    },\n    () => React.ReactNode\n  >;\n\n  let requiredArgs!: LoadableField<\n    {\n      parameters: {\n        foo: string;\n      };\n      data: {};\n    },\n    () => React.ReactNode\n  >;\n\n  <LoadableFieldRenderer loadableField={neverArgs} additionalProps={{}} />;\n  <LoadableFieldRenderer\n    loadableField={neverArgs}\n    additionalProps={{}}\n    args={{}}\n  />;\n  <LoadableFieldRenderer\n    loadableField={neverArgs}\n    additionalProps={{}}\n    args={{\n      // @ts-expect-error\n      foo: 'bar',\n    }}\n  />;\n\n  <LoadableFieldRenderer loadableField={optionalArgs} additionalProps={{}} />;\n  <LoadableFieldRenderer\n    loadableField={optionalArgs}\n    additionalProps={{}}\n    args={{}}\n  />;\n  <LoadableFieldRenderer\n    loadableField={optionalArgs}\n    additionalProps={{}}\n    args={{\n      foo: 'bar',\n    }}\n  />;\n  <LoadableFieldRenderer\n    loadableField={optionalArgs}\n    additionalProps={{}}\n    args={{\n      // @ts-expect-error\n      foo: 12,\n    }}\n  />;\n\n  // @ts-expect-error\n  <LoadableFieldRenderer loadableField={requiredArgs} additionalProps={{}} />;\n  <LoadableFieldRenderer\n    loadableField={requiredArgs}\n    additionalProps={{}}\n    // @ts-expect-error\n    args={{}}\n  />;\n  <LoadableFieldRenderer\n    loadableField={requiredArgs}\n    additionalProps={{}}\n    args={{\n      foo: 'bar',\n    }}\n  />;\n  <LoadableFieldRenderer\n    loadableField={requiredArgs}\n    additionalProps={{}}\n    args={{\n      // @ts-expect-error\n      foo: 12,\n    }}\n  />;\n}\n"],"mappings":";;;;;AA0BA,SAAgB,sBAMd,OAUiB;CACjB,MAAM,EAAE,sBAAsB,mBAC5B,MAAM,eAEN,MAAM,MACN,MAAM,aACP;CAED,MAAM,YAAY,UAAU,mBAAmB,MAAM,sBAAsB;AAK3E,QAAO,sCAAC,WAAc,MAAM,gBAAmB"}