{"version":3,"file":"read.mjs","names":["mutableEncounteredRecords: EncounteredIds","target: { [index: string]: any }","ast","root","variables","networkRequest","entrypointLoaderState:\n                | {\n                    kind: 'EntrypointNotLoaded';\n                  }\n                | {\n                    kind: 'NetworkRequestStarted';\n                    disposeNetworkRequest: CleanupFn;\n                  }\n                | { kind: 'Disposed' }","result: Variables","childVars: Writable<Variables>","data","readData","link","result"],"sources":["../../src/core/read.ts"],"sourcesContent":["import type { CleanupFn, ItemCleanupPair } from '@isograph/disposable-types';\nimport {\n  getParentRecordKey,\n  insertEmptySetIfMissing,\n  onNextChangeToRecord,\n  type EncounteredIds,\n} from './cache';\nimport type { FetchOptions } from './check';\nimport { getOrCreateCachedComponent } from './componentCache';\nimport type {\n  IsographEntrypoint,\n  ReaderWithRefetchQueries,\n  RefetchQueryNormalizationArtifactWrapper,\n} from './entrypoint';\nimport type {\n  ExtractData,\n  FragmentReference,\n  UnknownTReadFromStore,\n  Variables,\n} from './FragmentReference';\nimport type { IsographEnvironment } from './IsographEnvironment';\nimport {\n  assertLink,\n  getOrLoadIsographArtifact,\n  getOrLoadReaderWithRefetchQueries,\n  type DataTypeValue,\n  type StoreLink,\n  type StoreRecord,\n} from './IsographEnvironment';\nimport { logMessage } from './logging';\nimport { maybeMakeNetworkRequest } from './makeNetworkRequest';\nimport { getStoreRecordProxy } from './optimisticProxy';\nimport type { PromiseWrapper } from './PromiseWrapper';\nimport {\n  getPromiseState,\n  NOT_SET,\n  readPromise,\n  wrapPromise,\n  wrapResolvedValue,\n} from './PromiseWrapper';\nimport type {\n  LoadablySelectedField,\n  ReaderAst,\n  ReaderClientPointer,\n  ReaderImperativelyLoadedField,\n  ReaderLinkedField,\n  ReaderNonLoadableResolverField,\n  ReaderScalarField,\n} from './reader';\nimport { getOrCreateCachedStartUpdate } from './startUpdate';\nimport type { Arguments } from './util';\n\nexport type WithEncounteredRecords<T> = {\n  readonly encounteredRecords: EncounteredIds;\n  readonly item: ExtractData<T>;\n};\n\nexport function readButDoNotEvaluate<\n  TReadFromStore extends UnknownTReadFromStore,\n>(\n  environment: IsographEnvironment,\n  fragmentReference: FragmentReference<TReadFromStore, unknown>,\n  networkRequestOptions: NetworkRequestReaderOptions,\n): WithEncounteredRecords<TReadFromStore> {\n  const mutableEncounteredRecords: EncounteredIds = new Map();\n\n  // TODO consider moving this to the outside\n  const readerWithRefetchQueries = readPromise(\n    fragmentReference.readerWithRefetchQueries,\n  );\n\n  const response = readData(\n    environment,\n    readerWithRefetchQueries.readerArtifact.readerAst,\n    fragmentReference.root,\n    fragmentReference.variables ?? {},\n    readerWithRefetchQueries.nestedRefetchQueries,\n    fragmentReference.networkRequest,\n    networkRequestOptions,\n    mutableEncounteredRecords,\n  );\n\n  logMessage(environment, () => ({\n    kind: 'DoneReading',\n    response,\n    fieldName: readerWithRefetchQueries.readerArtifact.fieldName,\n    root: fragmentReference.root,\n  }));\n\n  if (response.kind === 'MissingData') {\n    // There are two cases here that we care about:\n    // 1. the network request is in flight, we haven't suspended on it, and we want\n    //    to throw if it errors out. So, networkRequestOptions.suspendIfInFlight === false\n    //    and networkRequestOptions.throwOnNetworkError === true.\n    // 2. everything else\n    //\n    // In the first case, we cannot simply throw onNextChange, because if the network\n    // response errors out, we will not update the store, so the onNextChange promise\n    // will not resolve.\n    if (\n      !networkRequestOptions.suspendIfInFlight &&\n      networkRequestOptions.throwOnNetworkError\n    ) {\n      // What are we doing here? If the network response has errored out, we can do\n      // two things: throw a rejected promise, or throw an error. Both work identically\n      // in the browser. However, during initial SSR on NextJS, throwing a rejected\n      // promise results in an infinite loop (including re-issuing the query until the\n      // process OOM's or something.) Hence, we throw an error.\n\n      const result = fragmentReference.networkRequest.result;\n      if (result !== NOT_SET && result.kind === 'Err') {\n        throw new Error('NetworkError', { cause: result.error });\n      }\n\n      throw new Promise((resolve, reject) => {\n        onNextChangeToRecord(environment, response.recordLink).then(resolve);\n        fragmentReference.networkRequest.promise.catch(reject);\n      });\n    }\n    throw onNextChangeToRecord(environment, response.recordLink);\n  } else {\n    return {\n      encounteredRecords: mutableEncounteredRecords,\n      item: response.data,\n    };\n  }\n}\n\nexport type ReadDataResultSuccess<Data> = {\n  readonly kind: 'Success';\n  readonly data: Data;\n};\n\nexport type ReadDataResult<Data> =\n  | ReadDataResultSuccess<Data>\n  | {\n      readonly kind: 'MissingData';\n      readonly reason: string;\n      readonly nestedReason?: ReadDataResult<unknown>;\n      readonly recordLink: StoreLink;\n    };\n\nfunction readData<TReadFromStore>(\n  environment: IsographEnvironment,\n  ast: ReaderAst<TReadFromStore>,\n  root: StoreLink,\n  variables: Variables,\n  nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[],\n  networkRequest: PromiseWrapper<void, any>,\n  networkRequestOptions: NetworkRequestReaderOptions,\n  mutableEncounteredRecords: EncounteredIds,\n): ReadDataResult<ExtractData<TReadFromStore>> {\n  const encounteredIds = insertEmptySetIfMissing(\n    mutableEncounteredRecords,\n    root.__typename,\n  );\n  encounteredIds.add(root.__link);\n  let storeRecord = getStoreRecordProxy(environment.store, root);\n  if (storeRecord === undefined) {\n    return {\n      kind: 'MissingData',\n      reason: 'No record for root ' + root.__link,\n      recordLink: root,\n    };\n  }\n\n  if (storeRecord == null) {\n    return {\n      kind: 'Success',\n      data: null as any,\n    };\n  }\n\n  let target: { [index: string]: any } = {};\n\n  for (const field of ast) {\n    switch (field.kind) {\n      case 'Scalar': {\n        const data = readScalarFieldData(field, storeRecord, root, variables);\n\n        if (data.kind === 'MissingData') {\n          return data;\n        }\n        target[field.alias ?? field.fieldName] = data.data;\n        break;\n      }\n      case 'Link': {\n        target[field.alias] = root;\n        break;\n      }\n      case 'Linked': {\n        const data = readLinkedFieldData(\n          environment,\n          field,\n          storeRecord,\n          root,\n          variables,\n          nestedRefetchQueries,\n          networkRequest,\n          networkRequestOptions,\n          (ast, root) =>\n            readData(\n              environment,\n              ast,\n              root,\n              variables,\n              nestedRefetchQueries,\n              networkRequest,\n              networkRequestOptions,\n              mutableEncounteredRecords,\n            ),\n        );\n        if (data.kind === 'MissingData') {\n          return data;\n        }\n        target[field.alias ?? field.fieldName] = data.data;\n        break;\n      }\n      case 'ImperativelyLoadedField': {\n        const data = readImperativelyLoadedField(\n          environment,\n          field,\n          root,\n          variables,\n          nestedRefetchQueries,\n          networkRequest,\n          networkRequestOptions,\n          mutableEncounteredRecords,\n        );\n        if (data.kind === 'MissingData') {\n          return data;\n        }\n        target[field.alias] = data.data;\n        break;\n      }\n      case 'Resolver': {\n        const data = readResolverFieldData(\n          environment,\n          field,\n          root,\n          variables,\n          nestedRefetchQueries,\n          networkRequest,\n          networkRequestOptions,\n          mutableEncounteredRecords,\n        );\n        if (data.kind === 'MissingData') {\n          return data;\n        }\n        target[field.alias] = data.data;\n        break;\n      }\n      case 'LoadablySelectedField': {\n        const data = readLoadablySelectedFieldData(\n          environment,\n          field,\n          root,\n          variables,\n          networkRequest,\n          networkRequestOptions,\n          mutableEncounteredRecords,\n        );\n        if (data.kind === 'MissingData') {\n          return data;\n        }\n        target[field.alias] = data.data;\n        break;\n      }\n    }\n  }\n  return {\n    kind: 'Success',\n    data: target as any,\n  };\n}\n\nexport function readLoadablySelectedFieldData(\n  environment: IsographEnvironment,\n  field: LoadablySelectedField,\n  root: StoreLink,\n  variables: Variables,\n  networkRequest: PromiseWrapper<void, any>,\n  networkRequestOptions: NetworkRequestReaderOptions,\n  mutableEncounteredRecords: EncounteredIds,\n): ReadDataResult<unknown> {\n  const refetchReaderParams = readData(\n    environment,\n    field.refetchReaderAst,\n    root,\n    variables,\n    // Refetch fields just read the id, and don't need refetch query artifacts\n    [],\n    networkRequest,\n    networkRequestOptions,\n    mutableEncounteredRecords,\n  );\n\n  if (refetchReaderParams.kind === 'MissingData') {\n    return {\n      kind: 'MissingData',\n      reason: 'Missing data for ' + field.alias + ' on root ' + root.__link,\n      nestedReason: refetchReaderParams,\n      recordLink: refetchReaderParams.recordLink,\n    };\n  }\n\n  return {\n    kind: 'Success',\n    data: (\n      args: any,\n      // TODO get the associated type for FetchOptions from the loadably selected field\n      fetchOptions?: FetchOptions<any, never>,\n    ) => {\n      // TODO we should use the reader AST for this\n      const includeReadOutData = (variables: any, readOutData: any) => {\n        variables.id = readOutData.id;\n        return variables;\n      };\n      const localVariables = includeReadOutData(\n        args ?? {},\n        refetchReaderParams.data,\n      );\n      writeQueryArgsToVariables(\n        localVariables,\n        field.queryArguments,\n        variables,\n      );\n\n      return [\n        // Stable id\n        root.__typename +\n          ':' +\n          root.__link +\n          '/' +\n          field.name +\n          '/' +\n          stableStringifyArgs(localVariables),\n        // Fetcher\n        () => {\n          const fragmentReferenceAndDisposeFromEntrypoint = (\n            entrypoint: IsographEntrypoint<any, any, any, {}>,\n          ): [FragmentReference<any, any>, CleanupFn] => {\n            const { fieldName, readerArtifactKind, readerWithRefetchQueries } =\n              getOrLoadReaderWithRefetchQueries(\n                environment,\n                entrypoint.readerWithRefetchQueries,\n              );\n            const [networkRequest, disposeNetworkRequest] =\n              maybeMakeNetworkRequest(\n                environment,\n                entrypoint,\n                localVariables,\n                readerWithRefetchQueries,\n                fetchOptions ?? null,\n              );\n\n            const fragmentReference: FragmentReference<any, any> = {\n              kind: 'FragmentReference',\n              readerWithRefetchQueries,\n              fieldName,\n              readerArtifactKind,\n              // TODO localVariables is not guaranteed to have an id field\n              root,\n              variables: localVariables,\n              networkRequest,\n            };\n            return [fragmentReference, disposeNetworkRequest];\n          };\n\n          if (field.entrypoint.kind === 'Entrypoint') {\n            return fragmentReferenceAndDisposeFromEntrypoint(field.entrypoint);\n          } else {\n            const isographArtifactPromiseWrapper = getOrLoadIsographArtifact(\n              environment,\n              field.entrypoint.typeAndField,\n              field.entrypoint.loader,\n            );\n            const state = getPromiseState(isographArtifactPromiseWrapper);\n            if (state.kind === 'Ok') {\n              return fragmentReferenceAndDisposeFromEntrypoint(state.value);\n            } else {\n              // Promise is pending or thrown\n\n              let entrypointLoaderState:\n                | {\n                    kind: 'EntrypointNotLoaded';\n                  }\n                | {\n                    kind: 'NetworkRequestStarted';\n                    disposeNetworkRequest: CleanupFn;\n                  }\n                | { kind: 'Disposed' } = { kind: 'EntrypointNotLoaded' };\n\n              const readerWithRefetchQueries = wrapPromise(\n                isographArtifactPromiseWrapper.promise.then(\n                  (entrypoint) =>\n                    getOrLoadReaderWithRefetchQueries(\n                      environment,\n                      entrypoint.readerWithRefetchQueries,\n                    ).readerWithRefetchQueries.promise,\n                ),\n              );\n              const networkRequest = wrapPromise(\n                isographArtifactPromiseWrapper.promise.then((entrypoint) => {\n                  if (entrypointLoaderState.kind === 'EntrypointNotLoaded') {\n                    const [networkRequest, disposeNetworkRequest] =\n                      maybeMakeNetworkRequest(\n                        environment,\n                        entrypoint,\n                        localVariables,\n                        readerWithRefetchQueries,\n                        fetchOptions ?? null,\n                      );\n                    entrypointLoaderState = {\n                      kind: 'NetworkRequestStarted',\n                      disposeNetworkRequest,\n                    };\n                    return networkRequest.promise;\n                  }\n                }),\n              );\n\n              const fragmentReference: FragmentReference<any, any> = {\n                kind: 'FragmentReference',\n                readerWithRefetchQueries,\n                fieldName: field.name,\n                readerArtifactKind: field.entrypoint.readerArtifactKind,\n                // TODO localVariables is not guaranteed to have an id field\n                root,\n                variables: localVariables,\n                networkRequest,\n              };\n\n              return [\n                fragmentReference,\n                () => {\n                  if (entrypointLoaderState.kind === 'NetworkRequestStarted') {\n                    entrypointLoaderState.disposeNetworkRequest();\n                  }\n                  entrypointLoaderState = { kind: 'Disposed' };\n                },\n              ];\n            }\n          }\n        },\n      ];\n    },\n  };\n}\n\nfunction filterVariables(\n  variables: Variables,\n  allowedVariables: string[],\n): Variables {\n  const result: Variables = {};\n  for (const key of allowedVariables) {\n    // @ts-expect-error\n    result[key] = variables[key];\n  }\n  return result;\n}\n\nfunction generateChildVariableMap(\n  variables: Variables,\n  fieldArguments: Arguments | null,\n): Variables {\n  if (fieldArguments == null) {\n    return {};\n  }\n\n  type Writable<T> = { -readonly [P in keyof T]: T[P] };\n  const childVars: Writable<Variables> = {};\n  for (const [name, value] of fieldArguments) {\n    if (value.kind === 'Object') {\n      childVars[name] = generateChildVariableMap(variables, value.value);\n    } else if (value.kind === 'Variable') {\n      const variable = variables[value.name];\n      // Variable could be null if it was not provided but has a default case,\n      // so we allow the loop to continue rather than throwing an error.\n      if (variable != null) {\n        childVars[name] = variable;\n      }\n    } else {\n      childVars[name] = value.value;\n    }\n  }\n  return childVars;\n}\n\nfunction writeQueryArgsToVariables(\n  targetVariables: any,\n  queryArgs: Arguments | null,\n  variables: Variables,\n) {\n  if (queryArgs == null) {\n    return;\n  }\n  for (const [name, argType] of queryArgs) {\n    switch (argType.kind) {\n      case 'Object': {\n        writeQueryArgsToVariables(\n          (targetVariables[name] = {}),\n          argType.value,\n          variables,\n        );\n        break;\n      }\n      case 'Variable': {\n        targetVariables[name] = variables[argType.name];\n        break;\n      }\n      case 'Enum': {\n        targetVariables[name] = argType.value;\n        break;\n      }\n      case 'Literal': {\n        targetVariables[name] = argType.value;\n        break;\n      }\n      case 'String': {\n        targetVariables[name] = argType.value;\n        break;\n      }\n    }\n  }\n}\n\nexport function readResolverFieldData(\n  environment: IsographEnvironment,\n  field: ReaderNonLoadableResolverField,\n  root: StoreLink,\n  variables: Variables,\n  nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[],\n  networkRequest: PromiseWrapper<void, any>,\n  networkRequestOptions: NetworkRequestReaderOptions,\n  mutableEncounteredRecords: EncounteredIds,\n): ReadDataResult<unknown> {\n  const usedRefetchQueries = field.usedRefetchQueries;\n  const resolverRefetchQueries = usedRefetchQueries.map((index) => {\n    const resolverRefetchQuery = nestedRefetchQueries[index];\n    if (resolverRefetchQuery == null) {\n      throw new Error(\n        'resolverRefetchQuery is null in Resolver. This is indicative of a bug in Isograph.',\n      );\n    }\n    return resolverRefetchQuery;\n  });\n\n  const readerWithRefetchQueries = {\n    kind: 'ReaderWithRefetchQueries',\n    readerArtifact: field.readerArtifact,\n    nestedRefetchQueries: resolverRefetchQueries,\n  } satisfies ReaderWithRefetchQueries<any, any>;\n\n  const fragment = {\n    kind: 'FragmentReference',\n    readerWithRefetchQueries: wrapResolvedValue(readerWithRefetchQueries),\n    fieldName: field.readerArtifact.fieldName,\n    readerArtifactKind: field.readerArtifact.kind,\n    root,\n    variables: generateChildVariableMap(variables, field.arguments),\n    networkRequest,\n  } satisfies FragmentReference<any, any>;\n\n  switch (field.readerArtifact.kind) {\n    case 'EagerReaderArtifact': {\n      const data = readData(\n        environment,\n        field.readerArtifact.readerAst,\n        root,\n        generateChildVariableMap(variables, field.arguments),\n        resolverRefetchQueries,\n        networkRequest,\n        networkRequestOptions,\n        mutableEncounteredRecords,\n      );\n      if (data.kind === 'MissingData') {\n        return {\n          kind: 'MissingData',\n          reason: 'Missing data for ' + field.alias + ' on root ' + root.__link,\n          nestedReason: data,\n          recordLink: data.recordLink,\n        };\n      }\n      const firstParameter = {\n        data: data.data,\n        parameters: variables,\n        startUpdate: field.readerArtifact.hasUpdatable\n          ? getOrCreateCachedStartUpdate(\n              environment,\n              fragment,\n              networkRequestOptions,\n            )\n          : undefined,\n      };\n      return {\n        kind: 'Success',\n        data: field.readerArtifact.resolver(firstParameter),\n      };\n    }\n    case 'ComponentReaderArtifact': {\n      return {\n        kind: 'Success',\n        data: getOrCreateCachedComponent(\n          environment,\n          fragment,\n          networkRequestOptions,\n        ),\n      };\n    }\n  }\n}\n\nexport function readScalarFieldData(\n  field: ReaderScalarField,\n  storeRecord: StoreRecord,\n  root: StoreLink,\n  variables: Variables,\n): ReadDataResult<\n  string | number | boolean | StoreLink | readonly DataTypeValue[] | null\n> {\n  const storeRecordName = getParentRecordKey(field, variables);\n  const value = storeRecord[storeRecordName];\n  // TODO consider making scalars into discriminated unions. This probably has\n  // to happen for when we handle errors.\n  if (value === undefined) {\n    return {\n      kind: 'MissingData',\n      reason: 'No value for ' + storeRecordName + ' on root ' + root.__link,\n      recordLink: root,\n    };\n  }\n  return { kind: 'Success', data: value };\n}\n\nexport function readLinkedFieldData(\n  environment: IsographEnvironment,\n  field: ReaderLinkedField,\n  storeRecord: StoreRecord,\n  root: StoreLink,\n  variables: Variables,\n  nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[],\n  networkRequest: PromiseWrapper<void, any>,\n  networkRequestOptions: NetworkRequestReaderOptions,\n  readData: <TReadFromStore>(\n    ast: ReaderAst<TReadFromStore>,\n    root: StoreLink,\n  ) => ReadDataResult<object>,\n): ReadDataResult<unknown> {\n  const storeRecordName = getParentRecordKey(field, variables);\n  let value = storeRecord[storeRecordName];\n\n  if (field.condition != null) {\n    const data = readData(field.condition.readerAst, root);\n    if (data.kind === 'MissingData') {\n      return {\n        kind: 'MissingData',\n        reason:\n          'Missing data for ' + storeRecordName + ' on root ' + root.__link,\n        nestedReason: data,\n        recordLink: data.recordLink,\n      };\n    }\n\n    const readerWithRefetchQueries = {\n      kind: 'ReaderWithRefetchQueries',\n      readerArtifact: field.condition,\n      // TODO this is wrong\n      // should map field.condition.usedRefetchQueries\n      // but it doesn't exist\n      nestedRefetchQueries: [],\n    } satisfies ReaderWithRefetchQueries<any, any>;\n\n    const fragment = {\n      kind: 'FragmentReference',\n      readerWithRefetchQueries: wrapResolvedValue(readerWithRefetchQueries),\n      root,\n      fieldName: field.condition.fieldName,\n      readerArtifactKind: field.condition.kind,\n      variables: generateChildVariableMap(\n        variables,\n        // TODO this is wrong\n        // should use field.arguments\n        // but it doesn't exist\n        [],\n      ),\n      networkRequest,\n    } satisfies FragmentReference<any, any>;\n\n    const condition = field.condition.resolver({\n      data: data.data,\n      parameters: {},\n      ...(field.condition.hasUpdatable\n        ? {\n            startUpdate: getOrCreateCachedStartUpdate(\n              environment,\n              fragment,\n              networkRequestOptions,\n            ),\n          }\n        : undefined),\n    });\n    value = condition;\n  }\n\n  if (Array.isArray(value)) {\n    const results = [];\n    for (const item of value) {\n      const link = assertLink(item);\n      if (link === undefined) {\n        return {\n          kind: 'MissingData',\n          reason:\n            'No link for ' +\n            storeRecordName +\n            ' on root ' +\n            root.__link +\n            '. Link is ' +\n            JSON.stringify(item),\n          recordLink: root,\n        };\n      } else if (link == null) {\n        results.push(null);\n        continue;\n      }\n\n      if (isClientPointer(field)) {\n        const result = readClientPointerData(\n          environment,\n          field,\n          link,\n          variables,\n          nestedRefetchQueries,\n          readData,\n        );\n        if (result.kind === 'MissingData') {\n          return {\n            kind: 'MissingData',\n            reason:\n              'Missing data for ' +\n              storeRecordName +\n              ' on root ' +\n              root.__link +\n              '. Link is ' +\n              JSON.stringify(item),\n            nestedReason: result,\n            recordLink: result.recordLink,\n          };\n        }\n        results.push(result.data);\n        continue;\n      }\n\n      const result = readData(field.selections, link);\n      if (result.kind === 'MissingData') {\n        return {\n          kind: 'MissingData',\n          reason:\n            'Missing data for ' +\n            storeRecordName +\n            ' on root ' +\n            root.__link +\n            '. Link is ' +\n            JSON.stringify(item),\n          nestedReason: result,\n          recordLink: result.recordLink,\n        };\n      }\n      results.push(result.data);\n    }\n    return {\n      kind: 'Success',\n      data: results,\n    };\n  }\n  let link = assertLink(value);\n\n  if (link === undefined) {\n    // TODO make this configurable, and also generated and derived from the schema\n    const missingFieldHandler = environment.missingFieldHandler;\n\n    const altLink = missingFieldHandler?.(\n      storeRecord,\n      root,\n      field.fieldName,\n      field.arguments,\n      variables,\n    );\n    logMessage(environment, () => ({\n      kind: 'MissingFieldHandlerCalled',\n      root,\n      storeRecord,\n      fieldName: field.fieldName,\n      arguments: field.arguments,\n      variables,\n    }));\n\n    if (altLink === undefined) {\n      return {\n        kind: 'MissingData',\n        reason:\n          'No link for ' +\n          storeRecordName +\n          ' on root ' +\n          root.__link +\n          '. Link is ' +\n          JSON.stringify(value),\n        recordLink: root,\n      };\n    } else {\n      link = altLink;\n    }\n  } else if (link == null) {\n    return {\n      kind: 'Success',\n      data: null,\n    };\n  }\n\n  if (isClientPointer(field)) {\n    const data = readClientPointerData(\n      environment,\n      field,\n      link,\n      variables,\n      nestedRefetchQueries,\n      readData,\n    );\n    if (data.kind === 'MissingData') {\n      return {\n        kind: 'MissingData',\n        reason:\n          'Missing data for ' + storeRecordName + ' on root ' + root.__link,\n        nestedReason: data,\n        recordLink: data.recordLink,\n      };\n    }\n    return data;\n  }\n  const data = readData(field.selections, link);\n  if (data.kind === 'MissingData') {\n    return {\n      kind: 'MissingData',\n      reason: 'Missing data for ' + storeRecordName + ' on root ' + root.__link,\n      nestedReason: data,\n      recordLink: data.recordLink,\n    };\n  }\n  return data;\n}\n\nfunction isClientPointer(\n  field: ReaderLinkedField,\n): field is ReaderClientPointer {\n  return field.refetchQueryIndex != null;\n}\n\nexport function readClientPointerData(\n  environment: IsographEnvironment,\n  field: ReaderClientPointer,\n  root: StoreLink,\n  variables: Variables,\n  nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[],\n  readData: <TReadFromStore>(\n    ast: ReaderAst<TReadFromStore>,\n    root: StoreLink,\n  ) => ReadDataResult<object>,\n): ReadDataResult<unknown> {\n  const refetchReaderParams = readData(\n    [\n      {\n        kind: 'Scalar',\n        fieldName: 'id',\n        alias: null,\n        arguments: null,\n        isUpdatable: false,\n      },\n    ],\n    root,\n  );\n\n  if (refetchReaderParams.kind === 'MissingData') {\n    return {\n      kind: 'MissingData',\n      reason: 'Missing data for ' + field.alias + ' on root ' + root.__link,\n      nestedReason: refetchReaderParams,\n      recordLink: refetchReaderParams.recordLink,\n    };\n  }\n\n  const refetchQuery = nestedRefetchQueries[field.refetchQueryIndex];\n  if (refetchQuery == null) {\n    throw new Error(\n      'refetchQuery is null in RefetchField. This is indicative of a bug in Isograph.',\n    );\n  }\n  const refetchQueryArtifact = refetchQuery.artifact;\n  const allowedVariables = refetchQuery.allowedVariables;\n\n  return {\n    kind: 'Success',\n    data: (\n      args: any,\n      // TODO get the associated type for FetchOptions from the loadably selected field\n      fetchOptions?: FetchOptions<any, never>,\n    ) => {\n      const includeReadOutData = (variables: any, readOutData: any) => {\n        variables.id = readOutData.id;\n        return variables;\n      };\n      const localVariables = includeReadOutData(\n        args ?? {},\n        refetchReaderParams.data,\n      );\n      writeQueryArgsToVariables(localVariables, field.arguments, variables);\n\n      return [\n        // Stable id\n        root.__typename +\n          ':' +\n          root.__link +\n          '/' +\n          field.fieldName +\n          '/' +\n          stableStringifyArgs(localVariables),\n        // Fetcher\n        (): ItemCleanupPair<FragmentReference<any, any>> | undefined => {\n          const variables = includeReadOutData(\n            filterVariables({ ...args, ...localVariables }, allowedVariables),\n            refetchReaderParams.data,\n          );\n\n          const readerWithRefetchQueries = wrapResolvedValue({\n            kind: 'ReaderWithRefetchQueries',\n            readerArtifact: {\n              kind: 'EagerReaderArtifact',\n              fieldName: field.fieldName,\n              readerAst: field.selections,\n              resolver: ({ data }: { data: any }) => data,\n              hasUpdatable: false,\n            },\n            nestedRefetchQueries,\n          } as const);\n\n          const [networkRequest, disposeNetworkRequest] =\n            maybeMakeNetworkRequest(\n              environment,\n              refetchQueryArtifact,\n              variables,\n              readerWithRefetchQueries,\n              fetchOptions ?? null,\n            );\n\n          const fragmentReference: FragmentReference<any, any> = {\n            kind: 'FragmentReference',\n            fieldName: field.fieldName,\n            readerArtifactKind: 'EagerReaderArtifact',\n            readerWithRefetchQueries: readerWithRefetchQueries,\n            root,\n            variables,\n            networkRequest,\n          };\n          return [fragmentReference, disposeNetworkRequest];\n        },\n      ];\n    },\n  };\n}\n\nexport type NetworkRequestReaderOptions = {\n  suspendIfInFlight: boolean;\n  throwOnNetworkError: boolean;\n};\n\nexport function getNetworkRequestOptionsWithDefaults(\n  networkRequestOptions?: Partial<NetworkRequestReaderOptions> | void,\n): NetworkRequestReaderOptions {\n  return {\n    suspendIfInFlight: networkRequestOptions?.suspendIfInFlight ?? false,\n    throwOnNetworkError: networkRequestOptions?.throwOnNetworkError ?? true,\n  };\n}\n\n// TODO use a description of the params for this?\n// TODO call stableStringifyArgs on the variable values, as well.\n// This doesn't matter for now, since we are just using primitive values\n// in the demo.\nfunction stableStringifyArgs(args: object) {\n  const keys = Object.keys(args);\n  keys.sort();\n  let s = '';\n  for (const key of keys) {\n    // @ts-expect-error\n    s += `${key}=${JSON.stringify(args[key])};`;\n  }\n  return s;\n}\n\nexport function readImperativelyLoadedField(\n  environment: IsographEnvironment,\n  field: ReaderImperativelyLoadedField,\n  root: StoreLink,\n  variables: Variables,\n  nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[],\n  networkRequest: PromiseWrapper<void, any>,\n  networkRequestOptions: NetworkRequestReaderOptions,\n  mutableEncounteredRecords: EncounteredIds,\n): ReadDataResult<unknown> {\n  // First, we read the data using the refetch reader AST (i.e. read out the\n  // id field).\n  const data = readData(\n    environment,\n    field.refetchReaderArtifact.readerAst,\n    root,\n    variables,\n    // Refetch fields just read the id, and don't need refetch query artifacts\n    [],\n    // This is probably indicative of the fact that we are doing redundant checks\n    // on the status of this network request...\n    networkRequest,\n    networkRequestOptions,\n    mutableEncounteredRecords,\n  );\n  if (data.kind === 'MissingData') {\n    return {\n      kind: 'MissingData',\n      reason: 'Missing data for ' + field.alias + ' on root ' + root.__link,\n      nestedReason: data,\n      recordLink: data.recordLink,\n    };\n  } else {\n    const { refetchQueryIndex } = field;\n    const refetchQuery = nestedRefetchQueries[refetchQueryIndex];\n    if (refetchQuery == null) {\n      throw new Error(\n        'Refetch query not found. This is indicative of a bug in Isograph.',\n      );\n    }\n    const refetchQueryArtifact = refetchQuery.artifact;\n    const allowedVariables = refetchQuery.allowedVariables;\n\n    // Second, we allow the user to call the resolver, which will ultimately\n    // use the resolver reader AST to get the resolver parameters.\n    return {\n      kind: 'Success',\n      data: (args: any) => [\n        // Stable id\n        root.__typename + ':' + root.__link + '__' + field.name,\n        // Fetcher\n        field.refetchReaderArtifact.resolver(\n          environment,\n          refetchQueryArtifact,\n          data.data,\n          filterVariables({ ...args, ...variables }, allowedVariables),\n          root,\n          // TODO these params should be removed\n          null,\n          [],\n        ),\n      ],\n    };\n  }\n}\n"],"mappings":"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"}