{"version":3,"file":"check.mjs","names":["DEFAULT_SHOULD_FETCH_VALUE: ShouldFetch"],"sources":["../../src/core/check.ts"],"sourcesContent":["import { getParentRecordKey } from './cache';\nimport type { NormalizationAstNodes } from './entrypoint';\nimport type { Variables } from './FragmentReference';\nimport type {\n  IsographEnvironment,\n  StoreLink,\n  StoreRecord,\n} from './IsographEnvironment';\nimport { getLink } from './IsographEnvironment';\nimport { logMessage } from './logging';\nimport { getStoreRecordProxy } from './optimisticProxy';\n\nexport type ShouldFetch = RequiredShouldFetch | 'IfNecessary';\nexport type RequiredShouldFetch = 'Yes' | 'No';\n\nexport const DEFAULT_SHOULD_FETCH_VALUE: ShouldFetch = 'IfNecessary';\n\ntype FetchOptionsShared<TReadOutData> = {\n  onComplete?: (data: TReadOutData) => void;\n  onError?: () => void;\n};\n\nexport interface FetchOptions<TReadOutData, TRawResponseType>\n  extends FetchOptionsShared<TReadOutData> {\n  shouldFetch?: ShouldFetch;\n  optimisticNetworkResponse?: TRawResponseType;\n}\n\nexport interface RequiredFetchOptions<TReadOutData>\n  extends FetchOptionsShared<TReadOutData> {\n  shouldFetch: RequiredShouldFetch;\n}\n\nexport type CheckResult =\n  | {\n      kind: 'EnoughData';\n    }\n  | {\n      kind: 'MissingData';\n      record: StoreLink;\n    };\n\nexport function check(\n  environment: IsographEnvironment,\n  normalizationAst: NormalizationAstNodes,\n  variables: Variables,\n  root: StoreLink,\n): CheckResult {\n  const newStoreRecord = getStoreRecordProxy(environment.store, root);\n\n  if (newStoreRecord == null) {\n    return {\n      kind: 'MissingData',\n      record: root,\n    };\n  }\n\n  const checkResult = checkFromRecord(\n    environment,\n    normalizationAst,\n    variables,\n    newStoreRecord,\n    root,\n  );\n  logMessage(environment, () => ({\n    kind: 'EnvironmentCheck',\n    result: checkResult,\n  }));\n  return checkResult;\n}\n\nfunction checkFromRecord(\n  environment: IsographEnvironment,\n  normalizationAst: NormalizationAstNodes,\n  variables: Variables,\n  record: StoreRecord,\n  recordLink: StoreLink,\n): CheckResult {\n  normalizationAstLoop: for (const normalizationAstNode of normalizationAst) {\n    switch (normalizationAstNode.kind) {\n      case 'Scalar': {\n        const parentRecordKey = getParentRecordKey(\n          normalizationAstNode,\n          variables,\n        );\n        const scalarValue = record[parentRecordKey];\n\n        // null means the value is known to be missing, so it must\n        // be exactly undefined\n        if (scalarValue === undefined) {\n          return {\n            kind: 'MissingData',\n            record: recordLink,\n          };\n        }\n        continue normalizationAstLoop;\n      }\n      case 'Linked': {\n        const parentRecordKey = getParentRecordKey(\n          normalizationAstNode,\n          variables,\n        );\n\n        const linkedValue = record[parentRecordKey];\n\n        if (linkedValue === undefined) {\n          return {\n            kind: 'MissingData',\n            record: recordLink,\n          };\n        } else if (linkedValue == null) {\n          continue;\n        } else if (Array.isArray(linkedValue)) {\n          arrayItemsLoop: for (const item of linkedValue) {\n            const link = getLink(item);\n            if (link == null) {\n              throw new Error(\n                'Unexpected non-link in the Isograph store. ' +\n                  'This is indicative of a bug in Isograph.',\n              );\n            }\n\n            const linkedRecord = getStoreRecordProxy(environment.store, link);\n\n            if (linkedRecord === undefined) {\n              return {\n                kind: 'MissingData',\n                record: link,\n              };\n            } else if (linkedRecord == null) {\n              continue arrayItemsLoop;\n            } else {\n              // TODO in __DEV__ assert linkedRecord is an object\n              const result = checkFromRecord(\n                environment,\n                normalizationAstNode.selections,\n                variables,\n                linkedRecord,\n                link,\n              );\n\n              if (result.kind === 'MissingData') {\n                return result;\n              }\n            }\n          }\n        } else {\n          const link = getLink(linkedValue);\n          if (link == null) {\n            throw new Error(\n              'Unexpected non-link in the Isograph store. ' +\n                'This is indicative of a bug in Isograph.',\n            );\n          }\n\n          const linkedRecord = getStoreRecordProxy(environment.store, link);\n\n          if (linkedRecord === undefined) {\n            return {\n              kind: 'MissingData',\n              record: link,\n            };\n          } else if (linkedRecord == null) {\n            continue normalizationAstLoop;\n          } else {\n            // TODO in __DEV__ assert linkedRecord is an object\n            const result = checkFromRecord(\n              environment,\n              normalizationAstNode.selections,\n              variables,\n              linkedRecord,\n              link,\n            );\n\n            if (result.kind === 'MissingData') {\n              return result;\n            }\n          }\n        }\n\n        continue normalizationAstLoop;\n      }\n      case 'InlineFragment': {\n        const existingRecordTypename = record['__typename'];\n\n        if (existingRecordTypename == null) {\n          return {\n            kind: 'MissingData',\n            record: recordLink,\n          };\n        }\n\n        if (existingRecordTypename === normalizationAstNode.type) {\n          const result = checkFromRecord(\n            environment,\n            normalizationAstNode.selections,\n            variables,\n            record,\n            recordLink,\n          );\n\n          if (result.kind === 'MissingData') {\n            return result;\n          }\n        }\n\n        continue normalizationAstLoop;\n      }\n    }\n  }\n\n  return {\n    kind: 'EnoughData',\n  };\n}\n"],"mappings":";;;;;;AAeA,MAAaA,6BAA0C;AA2BvD,SAAgB,MACd,aACA,kBACA,WACA,MACa;CACb,MAAM,iBAAiB,oBAAoB,YAAY,OAAO,KAAK;AAEnE,KAAI,kBAAkB,KACpB,QAAO;EACL,MAAM;EACN,QAAQ;EACT;CAGH,MAAM,cAAc,gBAClB,aACA,kBACA,WACA,gBACA,KACD;AACD,YAAW,oBAAoB;EAC7B,MAAM;EACN,QAAQ;EACT,EAAE;AACH,QAAO;;AAGT,SAAS,gBACP,aACA,kBACA,WACA,QACA,YACa;AACb,sBAAsB,MAAK,MAAM,wBAAwB,iBACvD,SAAQ,qBAAqB,MAA7B;EACE,KAAK;AASH,OAJoB,OAJI,mBACtB,sBACA,UACD,MAKmB,OAClB,QAAO;IACL,MAAM;IACN,QAAQ;IACT;AAEH,YAAS;EAEX,KAAK,UAAU;GAMb,MAAM,cAAc,OALI,mBACtB,sBACA,UACD;AAID,OAAI,gBAAgB,OAClB,QAAO;IACL,MAAM;IACN,QAAQ;IACT;YACQ,eAAe,KACxB;YACS,MAAM,QAAQ,YAAY,CACnC,gBAAgB,MAAK,MAAM,QAAQ,aAAa;IAC9C,MAAM,OAAO,QAAQ,KAAK;AAC1B,QAAI,QAAQ,KACV,OAAM,IAAI,MACR,sFAED;IAGH,MAAM,eAAe,oBAAoB,YAAY,OAAO,KAAK;AAEjE,QAAI,iBAAiB,OACnB,QAAO;KACL,MAAM;KACN,QAAQ;KACT;aACQ,gBAAgB,KACzB,UAAS;SACJ;KAEL,MAAM,SAAS,gBACb,aACA,qBAAqB,YACrB,WACA,cACA,KACD;AAED,SAAI,OAAO,SAAS,cAClB,QAAO;;;QAIR;IACL,MAAM,OAAO,QAAQ,YAAY;AACjC,QAAI,QAAQ,KACV,OAAM,IAAI,MACR,sFAED;IAGH,MAAM,eAAe,oBAAoB,YAAY,OAAO,KAAK;AAEjE,QAAI,iBAAiB,OACnB,QAAO;KACL,MAAM;KACN,QAAQ;KACT;aACQ,gBAAgB,KACzB,UAAS;SACJ;KAEL,MAAM,SAAS,gBACb,aACA,qBAAqB,YACrB,WACA,cACA,KACD;AAED,SAAI,OAAO,SAAS,cAClB,QAAO;;;AAKb,YAAS;;EAEX,KAAK,kBAAkB;GACrB,MAAM,yBAAyB,OAAO;AAEtC,OAAI,0BAA0B,KAC5B,QAAO;IACL,MAAM;IACN,QAAQ;IACT;AAGH,OAAI,2BAA2B,qBAAqB,MAAM;IACxD,MAAM,SAAS,gBACb,aACA,qBAAqB,YACrB,WACA,QACA,WACD;AAED,QAAI,OAAO,SAAS,cAClB,QAAO;;AAIX,YAAS;;;AAKf,QAAO,EACL,MAAM,cACP"}