{"version":3,"file":"useLazyReference.mjs","names":[],"sources":["../../src/react/useLazyReference.ts"],"sourcesContent":["import { useLazyDisposableState } from '@isograph/react-disposable-state';\nimport { type NetworkResponseObject } from '../core/cache';\nimport type { FetchOptions } from '../core/check';\nimport { type RequiredFetchOptions } from '../core/check';\nimport type { IsographEntrypoint } from '../core/entrypoint';\nimport {\n  type NormalizationAst,\n  type NormalizationAstLoader,\n} from '../core/entrypoint';\nimport type {\n  ExtractParameters,\n  FragmentReference,\n} from '../core/FragmentReference';\nimport { type UnknownTReadFromStore } from '../core/FragmentReference';\nimport { logMessage } from '../core/logging';\nimport { useIsographEnvironment } from './IsographEnvironmentProvider';\nimport { getOrCreateCacheForArtifact } from '../core/getOrCreateCacheForArtifact';\n\nexport function useLazyReference<\n  TReadFromStore extends UnknownTReadFromStore,\n  TClientFieldValue,\n  TNormalizationAst extends NormalizationAst | NormalizationAstLoader,\n  TRawResponseType extends NetworkResponseObject,\n>(\n  entrypoint: IsographEntrypoint<\n    TReadFromStore,\n    TClientFieldValue,\n    TNormalizationAst,\n    TRawResponseType\n  >,\n  variables: ExtractParameters<TReadFromStore>,\n  ...[fetchOptions]: TNormalizationAst extends NormalizationAstLoader\n    ? [fetchOptions: RequiredFetchOptions<TClientFieldValue>]\n    : [fetchOptions?: FetchOptions<TClientFieldValue, TRawResponseType>]\n): NormalizationAst | NormalizationAstLoader extends TNormalizationAst\n  ? unknown\n  : {\n      fragmentReference: FragmentReference<TReadFromStore, TClientFieldValue>;\n    } {\n  const environment = useIsographEnvironment();\n\n  if (entrypoint?.kind !== 'Entrypoint') {\n    // TODO have a separate error logger\n    logMessage(environment, () => ({\n      kind: 'NonEntrypointReceived',\n      entrypoint,\n    }));\n  }\n\n  const cache = getOrCreateCacheForArtifact(\n    environment,\n    entrypoint,\n    variables,\n    fetchOptions,\n  );\n\n  return {\n    fragmentReference: useLazyDisposableState(cache).state,\n  };\n}\n\n// @ts-ignore\nfunction tsTests() {\n  let withAst!: IsographEntrypoint<any, unknown, NormalizationAst, any>;\n  let withAstLoader!: IsographEntrypoint<\n    any,\n    unknown,\n    NormalizationAstLoader,\n    {}\n  >;\n  let withAstOrLoader!: IsographEntrypoint<\n    any,\n    unknown,\n    NormalizationAst | NormalizationAstLoader,\n    {}\n  >;\n\n  useLazyReference(withAst, {}) satisfies {};\n  useLazyReference(withAst, {}, { shouldFetch: 'Yes' }) satisfies {};\n  useLazyReference(withAst, {}, { shouldFetch: 'IfNecessary' }) satisfies {};\n\n  // @ts-expect-error if there's no ast, require `shouldFetch` to be specified\n  useLazyReference(withAstLoader, {});\n  useLazyReference(withAstLoader, {}, { shouldFetch: 'Yes' }) satisfies {};\n  // @ts-expect-error if there's no ast, `shouldFetch` can't be `IfNecessary`\n  useLazyReference(withAstLoader, {}, { shouldFetch: 'IfNecessary' });\n\n  // if the type is unknown there can be no ast so we should use the same rules\n  // but because of TS bugs with inference we just return unknown\n  // @ts-expect-error this returns unknown which doesn't satisfy the constraint\n  useLazyReference(withAstOrLoader, {}) satisfies {};\n  // @ts-expect-error this returns unknown which doesn't satisfy the constraint\n  useLazyReference(withAstOrLoader, {}, { shouldFetch: 'Yes' }) satisfies {};\n  useLazyReference(\n    withAstOrLoader,\n    {},\n    { shouldFetch: 'IfNecessary' },\n    // @ts-expect-error this returns unknown which doesn't satisfy the constraint\n  ) satisfies {};\n}\n"],"mappings":";;;;;;AAkBA,SAAgB,iBAMd,YAMA,WACA,GAAG,CAAC,eAOA;CACJ,MAAM,cAAc,wBAAwB;AAE5C,KAAI,YAAY,SAAS,aAEvB,YAAW,oBAAoB;EAC7B,MAAM;EACN;EACD,EAAE;AAUL,QAAO,EACL,mBAAmB,uBARP,4BACZ,aACA,YACA,WACA,aACD,CAGiD,CAAC,OAClD"}