{"version":3,"file":"remote_operation.mjs","sources":["../../../../src/remote_operation.ts"],"sourcesContent":["import {\n  type Effect,\n  type EffectParams,\n  type EffectResult,\n  type Event,\n  type EventCallable,\n  type Store,\n  createEffect,\n  createEvent,\n  createStore,\n  merge,\n  sample,\n} from \"effector\"\n\nimport type { ApolloError } from \"@apollo/client\"\n\nimport { patchHandler } from \"./dragons\"\nimport { readonly } from \"./lib/readonly\"\nimport { type OperationStatus, type ViewStatus, status, viewStatus } from \"./lib/status\"\n\nexport interface ExecutionParams<Variables, Meta> {\n  variables: Variables\n  meta: Meta\n}\n\ninterface CreateRemoteOperationOptions<Data, Variables, Meta> {\n  handler: (params: ExecutionParams<Variables, Meta>) => Promise<Data>\n\n  name?: string\n}\n\nexport interface RemoteOperationInternals<Data, Variables, Meta> {\n  $variables: Store<Variables>\n\n  execute: EventCallable<ExecutionParams<Variables, Meta>>\n  executeFx: Effect<ExecutionParams<Variables, Meta>, Data, ApolloError>\n\n  called: Event<Promise<Data>>\n}\n\nexport interface RemoteOperation<Data, Variables, Meta> extends ViewStatus {\n  /** Reset operation state to `initial`. */\n  reset: EventCallable<void>\n\n  /** Current operation status. */\n  $status: Store<OperationStatus>\n\n  /** Set of events that signal the end of your operation. */\n  finished: {\n    /** The operation has succeeded, use `data` freely. */\n    success: Event<{ variables: Variables; meta: Meta; data: Data }>\n    /** The operation has failed, and you need to handle `error`. */\n    failure: Event<{ variables: Variables; meta: Meta; error: ApolloError }>\n\n    finally: Event<\n      { variables: Variables; meta: Meta } & (\n        | { status: \"done\"; data: Data }\n        | { status: \"fail\"; error: ApolloError }\n      )\n    >\n  }\n\n  /**\n   * Internal tools, useful for testing.\n   */\n  __: RemoteOperationInternals<Data, Variables, Meta>\n}\n\nexport type OperationParams<Q extends RemoteOperation<any, any, any>> = EffectParams<\n  Q[\"__\"][\"executeFx\"]\n>\nexport type OperationResult<Q extends RemoteOperation<any, any, any>> = EffectResult<\n  Q[\"__\"][\"executeFx\"]\n>\n\nexport function createRemoteOperation</* opaque */ Data, Variables, Meta>({\n  handler,\n\n  name = \"unknown\",\n}: CreateRemoteOperationOptions<Data, Variables, Meta>): RemoteOperation<Data, Variables, Meta> {\n  const reset = createEvent<void>({ name: `${name}.reset` })\n  const execute = createEvent<ExecutionParams<Variables, Meta>>({ name: `${name}.execute` })\n  const called = createEvent<Promise<Data>>({ name: `${name}.called` })\n\n  // Should not be used before being populated by executeFx\n  const $variables = createStore({} as Variables, {\n    name: `${name}.variables`,\n    sid: `apollo.${name}.$variables`,\n    skipVoid: false,\n  })\n\n  const executeFx = createEffect<ExecutionParams<Variables, Meta>, Data, ApolloError>({\n    name: `${name}.executeFx`,\n    handler,\n  })\n\n  const $status = status(executeFx, { name: `${name}.status`, sid: `apollo.${name}.$status` })\n\n  const success = executeFx.done.map(({ params, result: data }) => ({ ...params, data }))\n  const failure = executeFx.fail.map(({ params, error }) => ({ ...params, error }))\n\n  sample({ clock: execute, fn: ({ variables }) => variables, target: $variables })\n\n  sample({ clock: execute, target: executeFx })\n  sample({ clock: reset, target: $status.reinit })\n\n  patchHandler(executeFx, called)\n\n  return {\n    reset,\n\n    $status: readonly($status),\n    ...viewStatus($status),\n\n    finished: {\n      success,\n      failure,\n      finally: merge([\n        success.map((payload) => ({ status: \"done\", ...payload })),\n        failure.map((payload) => ({ status: \"fail\", ...payload })),\n      ]),\n    },\n\n    __: { execute, executeFx, called, $variables },\n  }\n}\n"],"names":[],"mappings":";;;;AA2EO,SAAS,sBAA0D;AAAA,EACxE;AAAA,EAEA,OAAO;AACT,GAAgG;AAC9F,QAAM,QAAQ,YAAkB,EAAE,MAAM,GAAG,IAAI,UAAU;AACzD,QAAM,UAAU,YAA8C,EAAE,MAAM,GAAG,IAAI,YAAY;AACzF,QAAM,SAAS,YAA2B,EAAE,MAAM,GAAG,IAAI,WAAW;AAG9D,QAAA,aAAa,YAAY,IAAiB;AAAA,IAC9C,MAAM,GAAG,IAAI;AAAA,IACb,KAAK,UAAU,IAAI;AAAA,IACnB,UAAU;AAAA,EAAA,CACX;AAED,QAAM,YAAY,aAAkE;AAAA,IAClF,MAAM,GAAG,IAAI;AAAA,IACb;AAAA,EAAA,CACD;AAED,QAAM,UAAU,OAAO,WAAW,EAAE,MAAM,GAAG,IAAI,WAAW,KAAK,UAAU,IAAI,WAAA,CAAY;AAE3F,QAAM,UAAU,UAAU,KAAK,IAAI,CAAC,EAAE,QAAQ,QAAQ,KAAA,OAAY,EAAE,GAAG,QAAQ,KAAO,EAAA;AACtF,QAAM,UAAU,UAAU,KAAK,IAAI,CAAC,EAAE,QAAQ,MAAa,OAAA,EAAE,GAAG,QAAQ,MAAQ,EAAA;AAEzE,SAAA,EAAE,OAAO,SAAS,IAAI,CAAC,EAAE,UAAA,MAAgB,WAAW,QAAQ,YAAY;AAE/E,SAAO,EAAE,OAAO,SAAS,QAAQ,WAAW;AAC5C,SAAO,EAAE,OAAO,OAAO,QAAQ,QAAQ,QAAQ;AAE/C,eAAa,WAAW,MAAM;AAEvB,SAAA;AAAA,IACL;AAAA,IAEA,SAAS,SAAS,OAAO;AAAA,IACzB,GAAG,WAAW,OAAO;AAAA,IAErB,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA,SAAS,MAAM;AAAA,QACb,QAAQ,IAAI,CAAC,aAAa,EAAE,QAAQ,QAAQ,GAAG,QAAA,EAAU;AAAA,QACzD,QAAQ,IAAI,CAAC,aAAa,EAAE,QAAQ,QAAQ,GAAG,UAAU;AAAA,MAC1D,CAAA;AAAA,IACH;AAAA,IAEA,IAAI,EAAE,SAAS,WAAW,QAAQ,WAAW;AAAA,EAC/C;AACF;"}