{"version":3,"file":"logging.mjs","names":[],"sources":["../../src/core/logging.ts"],"sourcesContent":["import type { CleanupFn } from '@isograph/disposable-types';\nimport type { NetworkResponseObject, EncounteredIds } from './cache';\nimport type { CheckResult } from './check';\nimport type {\n  IsographEntrypoint,\n  RefetchQueryNormalizationArtifact,\n  NormalizationAstNodes,\n} from './entrypoint';\nimport type { FragmentReference, Variables } from './FragmentReference';\nimport type {\n  IsographEnvironment,\n  StoreRecord,\n  StoreLink,\n} from './IsographEnvironment';\nimport type { ReadDataResult } from './read';\nimport type { Arguments } from './util';\nimport type { StoreLayer } from './optimisticProxy';\n\n/**\n * Note: these types are unstable. We will add and remove items from this enum\n * and add and remove fields. Please do not rely on the specifics here (for now).\n *\n * Goals include:\n * - convenient debugging for Isograph developers\n * - eventual support for the Isograph devtools\n *\n * In some cases (e.g. in `AfterNormalization`), we include large objects and thus\n * prevent them from getting garbage collected (if the log message is printed).\n * Especially in cases like that, we intend to remove those!\n */\nexport type LogMessage =\n  | {\n      kind: 'AboutToNormalize';\n      normalizationAst: NormalizationAstNodes;\n      networkResponse: NetworkResponseObject;\n      variables: Variables;\n    }\n  | {\n      kind: 'AfterNormalization';\n      store: StoreLayer;\n      encounteredIds: EncounteredIds;\n    }\n  | {\n      kind: 'DeepEqualityCheck';\n      fragmentReference: FragmentReference<any, any>;\n      old: object;\n      new: object;\n      deeplyEqual: boolean;\n    }\n  | {\n      kind: 'ComponentRerendered';\n      componentName: string;\n      rootLink: StoreLink;\n    }\n  | {\n      kind: 'MakeNetworkRequest';\n      artifact:\n        | RefetchQueryNormalizationArtifact\n        | IsographEntrypoint<any, any, any, any>;\n      variables: Variables;\n      networkRequestId: string;\n    }\n  | {\n      kind: 'ReceivedNetworkResponse';\n      // TODO should be object\n      networkResponse: any;\n      networkRequestId: string;\n    }\n  | {\n      kind: 'ReceivedNetworkError';\n      error: any;\n      networkRequestId: string;\n    }\n  | {\n      kind: 'MissingFieldHandlerCalled';\n      root: StoreLink;\n      storeRecord: StoreRecord;\n      fieldName: string;\n      arguments: Arguments | null;\n      variables: Variables;\n    }\n  | {\n      kind: 'DoneReading';\n      response: ReadDataResult<any>;\n      fieldName: string;\n      root: StoreLink;\n    }\n  | {\n      kind: 'NonEntrypointReceived';\n      entrypoint: any;\n    }\n  | {\n      kind: 'EnvironmentCheck';\n      result: CheckResult;\n    }\n  | {\n      kind: 'EnvironmentCreated';\n    }\n  | {\n      kind: 'StartUpdateError';\n      error: any;\n    }\n  | {\n      kind: 'StartUpdateComplete';\n      updatedIds: EncounteredIds;\n    }\n  | {\n      kind: 'ErrorEncounteredInWithErrorHandling';\n      error: any;\n    };\n\nexport type LogFunction = (logMessage: LogMessage) => void;\n\n// wrapped so that items in the loggers set are unique.\nexport type WrappedLogFunction = {\n  log: LogFunction;\n};\n\nexport function logMessage(\n  environment: IsographEnvironment,\n  getMessage: () => LogMessage,\n) {\n  if (environment.loggers.size > 0) {\n    const message = getMessage();\n    for (const logger of environment.loggers) {\n      try {\n        logger.log(message);\n      } catch {}\n    }\n  }\n}\n\nexport function registerLogger(\n  environment: IsographEnvironment,\n  log: LogFunction,\n): CleanupFn {\n  const wrapped = { log };\n  environment.loggers.add(wrapped);\n  return () => {\n    environment.loggers.delete(wrapped);\n  };\n}\n"],"mappings":";AAsHA,SAAgB,WACd,aACA,YACA;AACA,KAAI,YAAY,QAAQ,OAAO,GAAG;EAChC,MAAM,UAAU,YAAY;AAC5B,OAAK,MAAM,UAAU,YAAY,QAC/B,KAAI;AACF,UAAO,IAAI,QAAQ;UACb;;;AAKd,SAAgB,eACd,aACA,KACW;CACX,MAAM,UAAU,EAAE,KAAK;AACvB,aAAY,QAAQ,IAAI,QAAQ;AAChC,cAAa;AACX,cAAY,QAAQ,OAAO,QAAQ"}