{"version":3,"file":"cache.mjs","names":["dataIds: (StoreLink | null)[]","argumentValue"],"sources":["../../src/core/cache.ts"],"sourcesContent":["import { type Factory, ParentCache } from '@isograph/react-disposable-state';\nimport type {\n  NormalizationAstNodes,\n  NormalizationInlineFragment,\n  NormalizationLinkedField,\n  NormalizationScalarField,\n} from './entrypoint';\nimport type {\n  FragmentReference,\n  UnknownTReadFromStore,\n  Variables,\n  VariableValue,\n} from './FragmentReference';\nimport {\n  type DataId,\n  type DataTypeValue,\n  getLink,\n  type IsographEnvironment,\n  ROOT_ID,\n  type StoreLink,\n  type StoreRecord,\n  type TypeName,\n} from './IsographEnvironment';\nimport { logMessage } from './logging';\nimport {\n  getMutableStoreRecordProxy,\n  type StoreLayerWithData,\n} from './optimisticProxy';\nimport type { ReaderLinkedField, ReaderScalarField } from './reader';\nimport { type Argument, type ArgumentValue, isArray, stableCopy } from './util';\n\nexport const TYPENAME_FIELD_NAME = '__typename';\n\nexport function getOrCreateItemInSuspenseCache<\n  TReadFromStore extends UnknownTReadFromStore,\n  TClientFieldValue,\n>(\n  environment: IsographEnvironment,\n  index: string,\n  factory: Factory<FragmentReference<TReadFromStore, TClientFieldValue>>,\n): ParentCache<FragmentReference<TReadFromStore, TClientFieldValue>> {\n  if (environment.fragmentCache[index] == null) {\n    environment.fragmentCache[index] = new ParentCache(factory);\n  }\n\n  return environment.fragmentCache[index];\n}\n\nexport type NetworkResponseScalarValue = string | number | boolean;\nexport type NetworkResponseValue =\n  | NetworkResponseScalarValue\n  | null\n  | NetworkResponseObject\n  | readonly (NetworkResponseObject | null)[]\n  | readonly (NetworkResponseScalarValue | null)[];\n\nexport type NetworkResponseObject = {\n  // N.B. undefined is here to support optional id's, but\n  // undefined should not *actually* be present in the network response.\n  readonly [index: string]: undefined | NetworkResponseValue;\n  readonly id?: DataId;\n  readonly __typename?: TypeName;\n};\n\nexport function normalizeData(\n  environment: IsographEnvironment,\n  storeLayer: StoreLayerWithData,\n  normalizationAst: NormalizationAstNodes,\n  networkResponse: NetworkResponseObject,\n  variables: Variables,\n  root: StoreLink,\n  encounteredIds: EncounteredIds,\n): EncounteredIds {\n  logMessage(environment, () => ({\n    kind: 'AboutToNormalize',\n    normalizationAst,\n    networkResponse,\n    variables,\n  }));\n\n  const newStoreRecord = getMutableStoreRecordProxy(storeLayer, root);\n\n  normalizeDataIntoRecord(\n    environment,\n    storeLayer,\n    normalizationAst,\n    networkResponse,\n    newStoreRecord,\n    root,\n    variables,\n    encounteredIds,\n  );\n\n  return encounteredIds;\n}\n\nexport function subscribeToAnyChange(\n  environment: IsographEnvironment,\n  callback: () => void,\n): () => void {\n  const subscription = {\n    kind: 'AnyRecords',\n    callback,\n  } as const;\n  environment.subscriptions.add(subscription);\n  return () => environment.subscriptions.delete(subscription);\n}\n\nexport function subscribeToAnyChangesToRecord(\n  environment: IsographEnvironment,\n  recordLink: StoreLink,\n  callback: () => void,\n): () => void {\n  const subscription = {\n    kind: 'AnyChangesToRecord',\n    recordLink,\n    callback,\n  } as const;\n  environment.subscriptions.add(subscription);\n  return () => environment.subscriptions.delete(subscription);\n}\n\nexport function onNextChangeToRecord(\n  environment: IsographEnvironment,\n  recordLink: StoreLink,\n): Promise<void> {\n  return new Promise((resolve) => {\n    const unsubscribe = subscribeToAnyChangesToRecord(\n      environment,\n      recordLink,\n      () => {\n        unsubscribe();\n        resolve();\n      },\n    );\n  });\n}\n\nexport type EncounteredIds = Map<TypeName, Set<DataId>>;\n/**\n * Mutate targetParentRecord according to the normalizationAst and networkResponseParentRecord.\n */\nfunction normalizeDataIntoRecord(\n  environment: IsographEnvironment,\n  storeLayer: StoreLayerWithData,\n  normalizationAst: NormalizationAstNodes,\n  networkResponseParentRecord: NetworkResponseObject,\n  targetParentRecord: StoreRecord,\n  targetParentRecordLink: StoreLink,\n  variables: Variables,\n  mutableEncounteredIds: EncounteredIds,\n): RecordHasBeenUpdated {\n  let recordHasBeenUpdated = false;\n  for (const normalizationNode of normalizationAst) {\n    switch (normalizationNode.kind) {\n      case 'Scalar': {\n        const scalarFieldResultedInChange = normalizeScalarField(\n          normalizationNode,\n          networkResponseParentRecord,\n          targetParentRecord,\n          variables,\n        );\n        recordHasBeenUpdated =\n          recordHasBeenUpdated || scalarFieldResultedInChange;\n        break;\n      }\n      case 'Linked': {\n        const linkedFieldResultedInChange = normalizeLinkedField(\n          environment,\n          storeLayer,\n          normalizationNode,\n          networkResponseParentRecord,\n          targetParentRecord,\n          targetParentRecordLink,\n          variables,\n          mutableEncounteredIds,\n        );\n        recordHasBeenUpdated =\n          recordHasBeenUpdated || linkedFieldResultedInChange;\n        break;\n      }\n      case 'InlineFragment': {\n        const inlineFragmentResultedInChange = normalizeInlineFragment(\n          environment,\n          storeLayer,\n          normalizationNode,\n          networkResponseParentRecord,\n          targetParentRecord,\n          targetParentRecordLink,\n          variables,\n          mutableEncounteredIds,\n        );\n        recordHasBeenUpdated =\n          recordHasBeenUpdated || inlineFragmentResultedInChange;\n        break;\n      }\n    }\n  }\n  if (recordHasBeenUpdated) {\n    let encounteredRecordsIds = insertEmptySetIfMissing(\n      mutableEncounteredIds,\n      targetParentRecordLink.__typename,\n    );\n\n    encounteredRecordsIds.add(targetParentRecordLink.__link);\n  }\n  return recordHasBeenUpdated;\n}\n\nexport function insertEmptySetIfMissing<K, V>(map: Map<K, Set<V>>, key: K) {\n  let result = map.get(key);\n  if (result === undefined) {\n    result = new Set();\n    map.set(key, result);\n  }\n  return result;\n}\n\ntype RecordHasBeenUpdated = boolean;\nfunction normalizeScalarField(\n  astNode: NormalizationScalarField,\n  networkResponseParentRecord: NetworkResponseObject,\n  targetStoreRecord: StoreRecord,\n  variables: Variables,\n): RecordHasBeenUpdated {\n  const networkResponseKey = getNetworkResponseKey(astNode);\n  const networkResponseData = networkResponseParentRecord[networkResponseKey];\n  const parentRecordKey = getParentRecordKey(astNode, variables);\n  const existingValue = targetStoreRecord[parentRecordKey];\n\n  if (networkResponseData == null) {\n    targetStoreRecord[parentRecordKey] = null;\n    return existingValue === undefined || existingValue != null;\n  }\n\n  if (isScalarOrEmptyArray(networkResponseData)) {\n    targetStoreRecord[parentRecordKey] = networkResponseData;\n    return existingValue !== networkResponseData;\n  } else {\n    throw new Error('Unexpected object array when normalizing scalar');\n  }\n}\n\n/**\n * Mutate targetParentRecord with a given linked field ast node.\n */\nfunction normalizeLinkedField(\n  environment: IsographEnvironment,\n  storeLayer: StoreLayerWithData,\n  astNode: NormalizationLinkedField,\n  networkResponseParentRecord: NetworkResponseObject,\n  targetParentRecord: StoreRecord,\n  targetParentRecordLink: StoreLink,\n  variables: Variables,\n  mutableEncounteredIds: EncounteredIds,\n): RecordHasBeenUpdated {\n  const networkResponseKey = getNetworkResponseKey(astNode);\n  const networkResponseData = networkResponseParentRecord[networkResponseKey];\n  const parentRecordKey = getParentRecordKey(astNode, variables);\n  const existingValue = targetParentRecord[parentRecordKey];\n\n  if (networkResponseData == null) {\n    targetParentRecord[parentRecordKey] = null;\n    return existingValue === undefined || existingValue != null;\n  }\n\n  if (\n    isScalarOrEmptyArray(networkResponseData) &&\n    !isNullOrEmptyArray(networkResponseData)\n  ) {\n    throw new Error(\n      'Unexpected scalar network response when normalizing a linked field',\n    );\n  }\n\n  if (isArray(networkResponseData)) {\n    // TODO check astNode.plural or the like\n    const dataIds: (StoreLink | null)[] = [];\n    for (let i = 0; i < networkResponseData.length; i++) {\n      const networkResponseObject = networkResponseData[i];\n      if (networkResponseObject == null) {\n        dataIds.push(null);\n        continue;\n      }\n      const newStoreRecordId = normalizeNetworkResponseObject(\n        environment,\n        storeLayer,\n        astNode,\n        networkResponseObject,\n        targetParentRecordLink,\n        variables,\n        i,\n        mutableEncounteredIds,\n      );\n\n      const __typename =\n        astNode.concreteType ?? networkResponseObject[TYPENAME_FIELD_NAME];\n      if (__typename == null) {\n        throw new Error(\n          'Unexpected missing __typename in network response when normalizing a linked field. ' +\n            'This is indicative of a bug in Isograph.',\n        );\n      }\n      dataIds.push({\n        __link: newStoreRecordId,\n        __typename,\n      });\n    }\n    targetParentRecord[parentRecordKey] = dataIds;\n    return !dataIdsAreTheSame(existingValue, dataIds);\n  } else {\n    const newStoreRecordId = normalizeNetworkResponseObject(\n      environment,\n      storeLayer,\n      astNode,\n      networkResponseData,\n      targetParentRecordLink,\n      variables,\n      null,\n      mutableEncounteredIds,\n    );\n\n    let __typename =\n      astNode.concreteType ?? networkResponseData[TYPENAME_FIELD_NAME];\n\n    if (__typename == null) {\n      throw new Error(\n        'Unexpected missing __typename in network response when normalizing a linked field. ' +\n          'This is indicative of a bug in Isograph.',\n      );\n    }\n\n    targetParentRecord[parentRecordKey] = {\n      __link: newStoreRecordId,\n      __typename,\n    };\n\n    const link = getLink(existingValue);\n    return link?.__link !== newStoreRecordId || link.__typename !== __typename;\n  }\n}\n\n/**\n * Mutate targetParentRecord with a given linked field ast node.\n */\nfunction normalizeInlineFragment(\n  environment: IsographEnvironment,\n  storeLayer: StoreLayerWithData,\n  astNode: NormalizationInlineFragment,\n  networkResponseParentRecord: NetworkResponseObject,\n  targetParentRecord: StoreRecord,\n  targetParentRecordLink: StoreLink,\n  variables: Variables,\n  mutableEncounteredIds: EncounteredIds,\n): RecordHasBeenUpdated {\n  const typeToRefineTo = astNode.type;\n  if (networkResponseParentRecord[TYPENAME_FIELD_NAME] === typeToRefineTo) {\n    const hasBeenModified = normalizeDataIntoRecord(\n      environment,\n      storeLayer,\n      astNode.selections,\n      networkResponseParentRecord,\n      targetParentRecord,\n      targetParentRecordLink,\n      variables,\n      mutableEncounteredIds,\n    );\n    return hasBeenModified;\n  }\n  return false;\n}\n\nfunction dataIdsAreTheSame(\n  existingValue: DataTypeValue,\n  newDataIds: (StoreLink | null)[],\n): boolean {\n  if (isArray(existingValue)) {\n    if (newDataIds.length !== existingValue.length) {\n      return false;\n    }\n    for (let i = 0; i < newDataIds.length; i++) {\n      const maybeLink = getLink(existingValue[i]);\n      if (\n        newDataIds[i]?.__link !== maybeLink?.__link ||\n        newDataIds[i]?.__typename !== maybeLink?.__typename\n      ) {\n        return false;\n      }\n    }\n    return true;\n  } else {\n    return false;\n  }\n}\n\nfunction normalizeNetworkResponseObject(\n  environment: IsographEnvironment,\n  storeLayer: StoreLayerWithData,\n  astNode: NormalizationLinkedField,\n  networkResponseData: NetworkResponseObject,\n  targetParentRecordLink: StoreLink,\n  variables: Variables,\n  index: number | null,\n  mutableEncounteredIds: EncounteredIds,\n): DataId /* The id of the modified or newly created item */ {\n  const newStoreRecordId = getDataIdOfNetworkResponse(\n    targetParentRecordLink,\n    networkResponseData,\n    astNode,\n    variables,\n    index,\n  );\n  const __typename =\n    astNode.concreteType ?? networkResponseData[TYPENAME_FIELD_NAME];\n\n  if (__typename == null) {\n    throw new Error(\n      'Unexpected missing __typename in network response object. ' +\n        'This is indicative of a bug in Isograph.',\n    );\n  }\n\n  const link = { __link: newStoreRecordId, __typename };\n  const newStoreRecord = getMutableStoreRecordProxy(storeLayer, link);\n\n  normalizeDataIntoRecord(\n    environment,\n    storeLayer,\n    astNode.selections,\n    networkResponseData,\n    newStoreRecord,\n    link,\n    variables,\n    mutableEncounteredIds,\n  );\n\n  return newStoreRecordId;\n}\n\nfunction isScalarOrEmptyArray(\n  data: NetworkResponseValue,\n): data is\n  | NetworkResponseScalarValue\n  | readonly (NetworkResponseScalarValue | null)[] {\n  // N.B. empty arrays count as empty arrays of scalar fields.\n  if (isArray(data)) {\n    return data.every((x) => isScalarOrEmptyArray(x));\n  }\n  const isScalarValue =\n    data == null ||\n    typeof data === 'string' ||\n    typeof data === 'number' ||\n    typeof data === 'boolean';\n  return isScalarValue;\n}\n\nfunction isNullOrEmptyArray(\n  data: unknown,\n): data is readonly never[] | null[] | null {\n  if (isArray(data)) {\n    if (data.length === 0) {\n      return true;\n    }\n    return data.every((x) => isNullOrEmptyArray(x));\n  }\n\n  return data == null;\n}\n\nexport function getParentRecordKey(\n  astNode:\n    | NormalizationLinkedField\n    | NormalizationScalarField\n    | ReaderLinkedField\n    | ReaderScalarField,\n  variables: Variables,\n): string {\n  let parentRecordKey = astNode.fieldName;\n  const fieldParameters = astNode.arguments;\n  if (fieldParameters != null) {\n    for (const fieldParameter of fieldParameters) {\n      parentRecordKey += getStoreKeyChunkForArgument(fieldParameter, variables);\n    }\n  }\n\n  return parentRecordKey;\n}\n\nfunction getStoreKeyChunkForArgumentValue(\n  argumentValue: ArgumentValue,\n  variables: Variables,\n): VariableValue {\n  switch (argumentValue.kind) {\n    case 'Object': {\n      return Object.fromEntries(\n        argumentValue.value.map(([argumentName, argumentValue]) => {\n          return [\n            argumentName,\n            //  substitute variables\n            getStoreKeyChunkForArgumentValue(argumentValue, variables),\n          ];\n        }),\n      );\n    }\n    case 'Literal': {\n      return argumentValue.value;\n    }\n    case 'Variable': {\n      return variables[argumentValue.name] ?? 'null';\n    }\n    case 'String': {\n      return argumentValue.value;\n    }\n    case 'Enum': {\n      return argumentValue.value;\n    }\n  }\n}\n\nfunction getStoreKeyChunkForArgument(argument: Argument, variables: Variables) {\n  const [argumentName, argumentValue] = argument;\n  let chunk = getStoreKeyChunkForArgumentValue(argumentValue, variables);\n\n  if (typeof chunk === 'object') {\n    chunk = JSON.stringify(stableCopy(chunk));\n  }\n\n  return `${FIRST_SPLIT_KEY}${argumentName}${SECOND_SPLIT_KEY}${chunk}`;\n}\n\nfunction getNetworkResponseKey(\n  astNode: NormalizationLinkedField | NormalizationScalarField,\n): string {\n  let networkResponseKey = astNode.fieldName;\n  const fieldParameters = astNode.arguments;\n\n  if (fieldParameters != null) {\n    for (const [argumentName, argumentValue] of fieldParameters) {\n      let argumentValueChunk = getArgumentValueChunk(argumentValue);\n      networkResponseKey += `${FIRST_SPLIT_KEY}${argumentName}${SECOND_SPLIT_KEY}${argumentValueChunk}`;\n    }\n  }\n\n  return networkResponseKey;\n}\n\nfunction getArgumentValueChunk(argumentValue: ArgumentValue): string {\n  switch (argumentValue.kind) {\n    case 'Object': {\n      return (\n        'o_' +\n        argumentValue.value\n          .map(([argumentName, argumentValue]) => {\n            return (\n              argumentName +\n              THIRD_SPLIT_KEY +\n              getArgumentValueChunk(argumentValue)\n            );\n          })\n          .join('_') +\n        '_c'\n      );\n    }\n    case 'Literal': {\n      return 'l_' + argumentValue.value;\n    }\n    case 'Variable': {\n      return 'v_' + argumentValue.name;\n    }\n    case 'String': {\n      // replace all non-word characters (alphanumeric & underscore) with underscores\n      return 's_' + argumentValue.value.replaceAll(/\\W/g, '_');\n    }\n    case 'Enum': {\n      return 'e_' + argumentValue.value;\n    }\n  }\n}\n\n// an alias might be pullRequests____first___first____after___cursor\nexport const FIRST_SPLIT_KEY = '____';\nexport const SECOND_SPLIT_KEY = '___';\nexport const THIRD_SPLIT_KEY = '__';\n\n// Returns a key to look up an item in the store\nfunction getDataIdOfNetworkResponse(\n  parentRecordLink: StoreLink,\n  dataToNormalize: NetworkResponseObject,\n  astNode: NormalizationLinkedField,\n  variables: Variables,\n  index: number | null,\n): DataId {\n  // If we are dealing with nested Query, use __ROOT as id\n  // TODO do not hard code this value here\n  if (astNode.concreteType === 'Query') {\n    return ROOT_ID;\n  }\n\n  // Check whether the dataToNormalize has an id field. If so, that is the key.\n  // If not, we construct an id from the parentRecordId and the field parameters.\n\n  const dataId = dataToNormalize.id;\n  if (dataId != null) {\n    return dataId;\n  }\n\n  let storeKey = `${parentRecordLink.__typename}:${parentRecordLink.__link}.${astNode.fieldName}`;\n  if (index != null) {\n    storeKey += `.${index}`;\n  }\n\n  const fieldParameters = astNode.arguments;\n  if (fieldParameters == null) {\n    return storeKey;\n  }\n\n  for (const fieldParameter of fieldParameters) {\n    storeKey += getStoreKeyChunkForArgument(fieldParameter, variables);\n  }\n  return storeKey;\n}\n"],"mappings":"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"}