{"version":3,"file":"startUpdate.mjs","names":["mutableUpdatedIds: EncounteredIds","startUpdate: StartUpdateStoreLayer['startUpdate']","value:\n    | { kind: 'Set'; value: T; validatedAt: number }\n    | {\n        kind: 'NotSet';\n      }","target: { [index: string]: any }","storeRecord","ast","root"],"sources":["../../src/core/startUpdate.ts"],"sourcesContent":["import {\n  getParentRecordKey,\n  insertEmptySetIfMissing,\n  type EncounteredIds,\n} from './cache';\nimport type { RefetchQueryNormalizationArtifactWrapper } from './entrypoint';\nimport {\n  stableIdForFragmentReference,\n  type ExtractParameters,\n  type ExtractStartUpdate,\n  type ExtractUpdatableData,\n  type FragmentReference,\n  type UnknownTReadFromStore,\n} from './FragmentReference';\nimport {\n  assertLink,\n  type IsographEnvironment,\n  type StoreLink,\n} from './IsographEnvironment';\nimport { logMessage } from './logging';\nimport {\n  addStartUpdateStoreLayer,\n  getMutableStoreRecordProxy,\n  getOrInsertRecord,\n  type StartUpdateStoreLayer,\n  type StoreLayer,\n} from './optimisticProxy';\nimport { readPromise, type PromiseWrapper } from './PromiseWrapper';\nimport {\n  readImperativelyLoadedField,\n  readLinkedFieldData,\n  readLoadablySelectedFieldData,\n  readResolverFieldData,\n  readScalarFieldData,\n  type NetworkRequestReaderOptions,\n  type ReadDataResultSuccess,\n} from './read';\nimport type { ReaderAst } from './reader';\nimport { callSubscriptions } from './subscribe';\n\nexport function getOrCreateCachedStartUpdate<\n  TReadFromStore extends UnknownTReadFromStore,\n>(\n  environment: IsographEnvironment,\n  fragmentReference: FragmentReference<TReadFromStore, unknown>,\n  networkRequestOptions: NetworkRequestReaderOptions,\n): ExtractStartUpdate<TReadFromStore> {\n  return (environment.eagerReaderCache[\n    stableIdForFragmentReference(fragmentReference)\n  ] ??= createStartUpdate(\n    environment,\n    fragmentReference,\n    networkRequestOptions,\n  ));\n}\n\nexport function createStartUpdate<TReadFromStore extends UnknownTReadFromStore>(\n  environment: IsographEnvironment,\n  fragmentReference: FragmentReference<TReadFromStore, unknown>,\n  networkRequestOptions: NetworkRequestReaderOptions,\n): ExtractStartUpdate<TReadFromStore> {\n  return (updater) => {\n    let mutableUpdatedIds: EncounteredIds = new Map();\n\n    const startUpdate: StartUpdateStoreLayer['startUpdate'] = (storeLayer) => {\n      mutableUpdatedIds.clear();\n      let updatableData = createUpdatableProxy(\n        environment,\n        storeLayer,\n        fragmentReference,\n        networkRequestOptions,\n        mutableUpdatedIds,\n      );\n\n      try {\n        updater({ updatableData });\n      } catch (e) {\n        logMessage(environment, () => ({\n          kind: 'StartUpdateError',\n          error: e,\n        }));\n        throw e;\n      }\n    };\n\n    environment.store = addStartUpdateStoreLayer(\n      environment.store,\n      startUpdate,\n    );\n\n    logMessage(environment, () => ({\n      kind: 'StartUpdateComplete',\n      updatedIds: mutableUpdatedIds,\n    }));\n\n    callSubscriptions(environment, mutableUpdatedIds);\n  };\n}\n\nexport function createUpdatableProxy<\n  TReadFromStore extends UnknownTReadFromStore,\n>(\n  environment: IsographEnvironment,\n  storeLayer: StoreLayer,\n  fragmentReference: FragmentReference<TReadFromStore, unknown>,\n  networkRequestOptions: NetworkRequestReaderOptions,\n  mutableUpdatedIds: EncounteredIds,\n): ExtractUpdatableData<TReadFromStore> {\n  const readerWithRefetchQueries = readPromise(\n    fragmentReference.readerWithRefetchQueries,\n  );\n\n  return readUpdatableData(\n    environment,\n    storeLayer,\n    readerWithRefetchQueries.readerArtifact.readerAst,\n    fragmentReference.root,\n    fragmentReference.variables ?? {},\n    readerWithRefetchQueries.nestedRefetchQueries,\n    fragmentReference.networkRequest,\n    networkRequestOptions,\n    {\n      lastInvalidated: 0,\n    },\n    mutableUpdatedIds,\n  ).data;\n}\n\ntype MutableInvalidationState = {\n  lastInvalidated: number;\n};\n\nfunction defineCachedProperty<T>(\n  target: T,\n  property: PropertyKey,\n  mutableState: MutableInvalidationState,\n  get: () => any,\n  set?: (v: any) => void,\n) {\n  let value:\n    | { kind: 'Set'; value: T; validatedAt: number }\n    | {\n        kind: 'NotSet';\n      } = {\n    kind: 'NotSet',\n  };\n\n  Object.defineProperty(target, property, {\n    configurable: false,\n    enumerable: true,\n    get: () => {\n      if (\n        value.kind === 'NotSet' ||\n        value.validatedAt < mutableState.lastInvalidated\n      ) {\n        value = {\n          kind: 'Set',\n          value: get(),\n          validatedAt: mutableState.lastInvalidated,\n        };\n      }\n      return value.value;\n    },\n    ...(set != null && {\n      set: (newValue) => {\n        set(newValue);\n        mutableState.lastInvalidated++;\n      },\n    }),\n  });\n}\n\nfunction readUpdatableData<TReadFromStore extends UnknownTReadFromStore>(\n  environment: IsographEnvironment,\n  storeLayer: StoreLayer,\n  ast: ReaderAst<TReadFromStore>,\n  root: StoreLink,\n  variables: ExtractParameters<TReadFromStore>,\n  nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[],\n  networkRequest: PromiseWrapper<void, any>,\n  networkRequestOptions: NetworkRequestReaderOptions,\n  mutableState: MutableInvalidationState,\n  mutableUpdatedIds: EncounteredIds,\n): ReadDataResultSuccess<ExtractUpdatableData<TReadFromStore>> {\n  const storeRecord = getMutableStoreRecordProxy(storeLayer, root);\n  let target: { [index: string]: any } = {};\n\n  for (const field of ast) {\n    switch (field.kind) {\n      case 'Scalar': {\n        const storeRecordName = getParentRecordKey(field, variables);\n\n        defineCachedProperty(\n          target,\n          field.alias ?? field.fieldName,\n          mutableState,\n          () => {\n            const data = readScalarFieldData(\n              field,\n              storeRecord,\n              root,\n              variables,\n            );\n            if (data.kind === 'MissingData') {\n              throw new Error(data.reason);\n            }\n            return data.data;\n          },\n          field.isUpdatable\n            ? (newValue) => {\n                const storeRecord = getOrInsertRecord(storeLayer.data, root);\n                storeRecord[storeRecordName] = newValue;\n                const updatedIds = insertEmptySetIfMissing(\n                  mutableUpdatedIds,\n                  root.__typename,\n                );\n                updatedIds.add(root.__link);\n              }\n            : undefined,\n        );\n        break;\n      }\n      case 'Linked': {\n        const storeRecordName = getParentRecordKey(field, variables);\n        defineCachedProperty(\n          target,\n          field.alias ?? field.fieldName,\n          mutableState,\n          () => {\n            const data = readLinkedFieldData(\n              environment,\n              field,\n              storeRecord,\n              root,\n              variables,\n              nestedRefetchQueries,\n              networkRequest,\n              networkRequestOptions,\n              (ast, root) =>\n                readUpdatableData(\n                  environment,\n                  storeLayer,\n                  ast,\n                  root,\n                  variables,\n                  nestedRefetchQueries,\n                  networkRequest,\n                  networkRequestOptions,\n                  mutableState,\n                  mutableUpdatedIds,\n                ),\n            );\n            if (data.kind === 'MissingData') {\n              throw new Error(data.reason);\n            }\n            return data.data;\n          },\n          'isUpdatable' in field && field.isUpdatable\n            ? (newValue) => {\n                const storeRecord = getOrInsertRecord(storeLayer.data, root);\n                if (Array.isArray(newValue)) {\n                  storeRecord[storeRecordName] = newValue.map((node) =>\n                    assertLink(node?.__link),\n                  );\n                } else {\n                  storeRecord[storeRecordName] = assertLink(newValue?.__link);\n                }\n                const updatedIds = insertEmptySetIfMissing(\n                  mutableUpdatedIds,\n                  root.__typename,\n                );\n                updatedIds.add(root.__link);\n              }\n            : undefined,\n        );\n        break;\n      }\n      case 'ImperativelyLoadedField': {\n        defineCachedProperty(target, field.alias, mutableState, () => {\n          const data = readImperativelyLoadedField(\n            environment,\n            field,\n            root,\n            variables,\n            nestedRefetchQueries,\n            networkRequest,\n            networkRequestOptions,\n            new Map(),\n          );\n          if (data.kind === 'MissingData') {\n            throw new Error(data.reason);\n          }\n          return data.data;\n        });\n        break;\n      }\n      case 'Resolver': {\n        defineCachedProperty(target, field.alias, mutableState, () => {\n          const data = readResolverFieldData(\n            environment,\n            field,\n            root,\n            variables,\n            nestedRefetchQueries,\n            networkRequest,\n            networkRequestOptions,\n            new Map(),\n          );\n          if (data.kind === 'MissingData') {\n            throw new Error(data.reason);\n          }\n          return data.data;\n        });\n        break;\n      }\n      case 'LoadablySelectedField': {\n        defineCachedProperty(target, field.alias, mutableState, () => {\n          const data = readLoadablySelectedFieldData(\n            environment,\n            field,\n            root,\n            variables,\n            networkRequest,\n            networkRequestOptions,\n            new Map(),\n          );\n          if (data.kind === 'MissingData') {\n            throw new Error(data.reason);\n          }\n          return data.data;\n        });\n        break;\n      }\n      case 'Link': {\n        target[field.alias] = root;\n        break;\n      }\n    }\n  }\n\n  return {\n    kind: 'Success',\n    data: target as any,\n  };\n}\n"],"mappings":";;;;;;;;;;AAwCA,SAAgB,6BAGd,aACA,mBACA,uBACoC;AACpC,QAAQ,YAAY,iBAClB,6BAA6B,kBAAkB,MAC3C,kBACJ,aACA,mBACA,sBACD;;AAGH,SAAgB,kBACd,aACA,mBACA,uBACoC;AACpC,SAAQ,YAAY;EAClB,IAAIA,oCAAoC,IAAI,KAAK;EAEjD,MAAMC,eAAqD,eAAe;AACxE,qBAAkB,OAAO;GACzB,IAAI,gBAAgB,qBAClB,aACA,YACA,mBACA,uBACA,kBACD;AAED,OAAI;AACF,YAAQ,EAAE,eAAe,CAAC;YACnB,GAAG;AACV,eAAW,oBAAoB;KAC7B,MAAM;KACN,OAAO;KACR,EAAE;AACH,UAAM;;;AAIV,cAAY,QAAQ,yBAClB,YAAY,OACZ,YACD;AAED,aAAW,oBAAoB;GAC7B,MAAM;GACN,YAAY;GACb,EAAE;AAEH,oBAAkB,aAAa,kBAAkB;;;AAIrD,SAAgB,qBAGd,aACA,YACA,mBACA,uBACA,mBACsC;CACtC,MAAM,2BAA2B,YAC/B,kBAAkB,yBACnB;AAED,QAAO,kBACL,aACA,YACA,yBAAyB,eAAe,WACxC,kBAAkB,MAClB,kBAAkB,aAAa,EAAE,EACjC,yBAAyB,sBACzB,kBAAkB,gBAClB,uBACA,EACE,iBAAiB,GAClB,EACD,kBACD,CAAC;;AAOJ,SAAS,qBACP,QACA,UACA,cACA,KACA,KACA;CACA,IAAIC,QAII,EACN,MAAM,UACP;AAED,QAAO,eAAe,QAAQ,UAAU;EACtC,cAAc;EACd,YAAY;EACZ,WAAW;AACT,OACE,MAAM,SAAS,YACf,MAAM,cAAc,aAAa,gBAEjC,SAAQ;IACN,MAAM;IACN,OAAO,KAAK;IACZ,aAAa,aAAa;IAC3B;AAEH,UAAO,MAAM;;EAEf,GAAI,OAAO,QAAQ,EACjB,MAAM,aAAa;AACjB,OAAI,SAAS;AACb,gBAAa;KAEhB;EACF,CAAC;;AAGJ,SAAS,kBACP,aACA,YACA,KACA,MACA,WACA,sBACA,gBACA,uBACA,cACA,mBAC6D;CAC7D,MAAM,cAAc,2BAA2B,YAAY,KAAK;CAChE,IAAIC,SAAmC,EAAE;AAEzC,MAAK,MAAM,SAAS,IAClB,SAAQ,MAAM,MAAd;EACE,KAAK,UAAU;GACb,MAAM,kBAAkB,mBAAmB,OAAO,UAAU;AAE5D,wBACE,QACA,MAAM,SAAS,MAAM,WACrB,oBACM;IACJ,MAAM,OAAO,oBACX,OACA,aACA,MACA,UACD;AACD,QAAI,KAAK,SAAS,cAChB,OAAM,IAAI,MAAM,KAAK,OAAO;AAE9B,WAAO,KAAK;MAEd,MAAM,eACD,aAAa;IACZ,MAAMC,gBAAc,kBAAkB,WAAW,MAAM,KAAK;AAC5D,kBAAY,mBAAmB;AAK/B,IAJmB,wBACjB,mBACA,KAAK,WACN,CACU,IAAI,KAAK,OAAO;OAE7B,OACL;AACD;;EAEF,KAAK,UAAU;GACb,MAAM,kBAAkB,mBAAmB,OAAO,UAAU;AAC5D,wBACE,QACA,MAAM,SAAS,MAAM,WACrB,oBACM;IACJ,MAAM,OAAO,oBACX,aACA,OACA,aACA,MACA,WACA,sBACA,gBACA,wBACC,OAAK,WACJ,kBACE,aACA,YACAC,OACAC,QACA,WACA,sBACA,gBACA,uBACA,cACA,kBACD,CACJ;AACD,QAAI,KAAK,SAAS,cAChB,OAAM,IAAI,MAAM,KAAK,OAAO;AAE9B,WAAO,KAAK;MAEd,iBAAiB,SAAS,MAAM,eAC3B,aAAa;IACZ,MAAMF,gBAAc,kBAAkB,WAAW,MAAM,KAAK;AAC5D,QAAI,MAAM,QAAQ,SAAS,CACzB,eAAY,mBAAmB,SAAS,KAAK,SAC3C,WAAW,MAAM,OAAO,CACzB;QAED,eAAY,mBAAmB,WAAW,UAAU,OAAO;AAM7D,IAJmB,wBACjB,mBACA,KAAK,WACN,CACU,IAAI,KAAK,OAAO;OAE7B,OACL;AACD;;EAEF,KAAK;AACH,wBAAqB,QAAQ,MAAM,OAAO,oBAAoB;IAC5D,MAAM,OAAO,4BACX,aACA,OACA,MACA,WACA,sBACA,gBACA,uCACA,IAAI,KAAK,CACV;AACD,QAAI,KAAK,SAAS,cAChB,OAAM,IAAI,MAAM,KAAK,OAAO;AAE9B,WAAO,KAAK;KACZ;AACF;EAEF,KAAK;AACH,wBAAqB,QAAQ,MAAM,OAAO,oBAAoB;IAC5D,MAAM,OAAO,sBACX,aACA,OACA,MACA,WACA,sBACA,gBACA,uCACA,IAAI,KAAK,CACV;AACD,QAAI,KAAK,SAAS,cAChB,OAAM,IAAI,MAAM,KAAK,OAAO;AAE9B,WAAO,KAAK;KACZ;AACF;EAEF,KAAK;AACH,wBAAqB,QAAQ,MAAM,OAAO,oBAAoB;IAC5D,MAAM,OAAO,8BACX,aACA,OACA,MACA,WACA,gBACA,uCACA,IAAI,KAAK,CACV;AACD,QAAI,KAAK,SAAS,cAChB,OAAM,IAAI,MAAM,KAAK,OAAO;AAE9B,WAAO,KAAK;KACZ;AACF;EAEF,KAAK;AACH,UAAO,MAAM,SAAS;AACtB;;AAKN,QAAO;EACL,MAAM;EACN,MAAM;EACP"}