{"id":13726727,"url":"https://github.com/reasonml-community/reason-apollo-hooks","last_synced_at":"2025-05-07T22:30:30.591Z","repository":{"id":74854849,"uuid":"183062154","full_name":"reasonml-community/reason-apollo-hooks","owner":"reasonml-community","description":"Deprecated in favor of https://github.com/reasonml-community/graphql-ppx","archived":true,"fork":false,"pushed_at":"2020-11-19T12:35:42.000Z","size":1383,"stargazers_count":136,"open_issues_count":24,"forks_count":28,"subscribers_count":11,"default_branch":"master","last_synced_at":"2024-11-14T17:47:25.524Z","etag":null,"topics":["apollo","graphql","reasonml"],"latest_commit_sha":null,"homepage":"https://reasonml-community.github.io/reason-apollo-hooks/","language":"Reason","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/reasonml-community.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2019-04-23T17:16:19.000Z","updated_at":"2024-11-05T00:49:13.000Z","dependencies_parsed_at":"2024-01-06T07:44:33.284Z","dependency_job_id":"1d2ab305-26e9-4d23-a567-7404624471df","html_url":"https://github.com/reasonml-community/reason-apollo-hooks","commit_stats":null,"previous_names":[],"tags_count":21,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reasonml-community%2Freason-apollo-hooks","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reasonml-community%2Freason-apollo-hooks/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reasonml-community%2Freason-apollo-hooks/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reasonml-community%2Freason-apollo-hooks/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/reasonml-community","download_url":"https://codeload.github.com/reasonml-community/reason-apollo-hooks/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252965069,"owners_count":21832817,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["apollo","graphql","reasonml"],"created_at":"2024-08-03T01:03:17.910Z","updated_at":"2025-05-07T22:30:29.933Z","avatar_url":"https://github.com/reasonml-community.png","language":"Reason","funding_links":[],"categories":["Reason"],"sub_categories":[],"readme":"# ⚠️ Prefer the new https://github.com/reasonml-community/reason-apollo-client instead\n\n---\n\n# reason-apollo-hooks\n\n\u003c!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section --\u003e\n\n[![All Contributors](https://img.shields.io/badge/all_contributors-18-orange.svg?style=flat-square)](#contributors-)\n\n\u003c!-- ALL-CONTRIBUTORS-BADGE:END --\u003e\n\nReason bindings for the official [@apollo/react-hooks](https://www.npmjs.com/package/@apollo/react-hooks)\n\n## Table of contents\n\n- [reason-apollo-hooks](#reason-apollo-hooks)\n  - [Table of contents](#table-of-contents)\n  - [Installation :arrow_up:](#installation-arrowup)\n  - [Setting up :arrow_up:](#setting-up-arrowup)\n    - [Usage with reason-apollo :arrow_up:](#usage-with-reason-apollo-arrowup)\n  - [Available hooks :arrow_up:](#available-hooks-arrowup)\n    - [useQuery :arrow_up:](#usequery-arrowup)\n    - [useMutation :arrow_up:](#usemutation-arrowup)\n    - [useSubscription :arrow_up:](#usesubscription-arrowup)\n  - [Cache :arrow_up:](#cache-arrowup)\n  - [Fragment :arrow_up:](#fragment-arrowup)\n  - [Getting it running](#getting-it-running)\n  - [Contributors ✨](#contributors-%e2%9c%a8)\n\n## Installation [:arrow_up:](#table-of-contents)\n\n```\nyarn add reason-apollo-hooks reason-apollo@0.19.0 @apollo/react-hooks\n```\n\nBuckleScript \u003c= 5.0.0\n\n```\nyarn add reason-apollo-hooks@3.0.0 reason-apollo@0.17.0 @apollo/react-hooks\n```\n\nFollow the installation instructions of [graphql_ppx_re](https://github.com/baransu/graphql_ppx_re).\n\nThen update your bsconfig.json\n\n```diff\n\"bs-dependencies\": [\n  ...\n+ \"reason-apollo-hooks\",\n+ \"reason-apollo\"\n]\n```\n\n## Setting up [:arrow_up:](#table-of-contents)\n\nAdd the provider in the top of the tree\n\n```reason\n/* Create an InMemoryCache */\nlet inMemoryCache = ApolloInMemoryCache.createInMemoryCache();\n\n/* Create an HTTP Link */\nlet httpLink =\n  ApolloLinks.createHttpLink(~uri=\"http://localhost:3010/graphql\", ());\n\nlet client =\n  ReasonApollo.createApolloClient(~link=httpLink, ~cache=inMemoryCache, ());\n\nlet app =\n \u003cApolloHooks.Provider client\u003e\n   ...\n \u003c/ApolloHooks.Provider\u003e\n```\n\n### Usage with reason-apollo [:arrow_up:](#table-of-contents)\n\nTo use with `reason-apollo`'s `ReasonApollo.Provider` already present in your project:\n\n```reason\nlet client = ... // create Apollo client\n\nReactDOMRe.renderToElementWithId(\n  \u003cReasonApollo.Provider client\u003e\n    \u003cApolloHooks.Provider client\u003e\n      \u003cApp /\u003e\n    \u003c/ApolloHooks.Provider\u003e\n  \u003c/ReasonApollo.Provider\u003e,\n  \"root\",\n);\n```\n\n## Available hooks [:arrow_up:](#table-of-contents)\n\n### useQuery [:arrow_up:](#table-of-contents)\n\n```reason\nopen ApolloHooks\n\nmodule UserQuery = [%graphql {|\n  query UserQuery {\n    currentUser {\n      name\n    }\n  }\n|}];\n\n[@react.component]\nlet make = () =\u003e {\n  /* Both variant and records available */\n  let (simple, _full) = useQuery(UserQuery.definition);\n\n  \u003cdiv\u003e\n  {\n    switch(simple) {\n      | Loading =\u003e \u003cp\u003e{React.string(\"Loading...\")}\u003c/p\u003e\n      | Data(data) =\u003e\n        \u003cp\u003e{React.string(data##currentUser##name)}\u003c/p\u003e\n      | NoData\n      | Error(_) =\u003e \u003cp\u003e{React.string(\"Get off my lawn!\")}\u003c/p\u003e\n    }\n  }\n  \u003c/div\u003e\n}\n```\n\nUsing the `full` record for more advanced cases\n\n```reason\n[@react.component]\nlet make = () =\u003e {\n  /* Both variant and records available */\n  let (_simple, full) = useQuery(UserQuery.definition);\n\n  \u003cdiv\u003e\n  {\n    switch(full) {\n      | { loading: true }=\u003e \u003cp\u003e{React.string(\"Loading...\")}\u003c/p\u003e\n      | { data: Some(data) } =\u003e\n        \u003cp\u003e{React.string(data##currentUser##name)}\u003c/p\u003e\n      | any other possibilities =\u003e\n      | { error: Some(_) } =\u003e \u003cp\u003e{React.string(\"Get off my lawn!\")}\u003c/p\u003e\n    }\n  }\n  \u003c/div\u003e\n}\n```\n\nUsing `fetchPolicy` to change interactions with the `apollo` cache, see [apollo docs](https://www.apollographql.com/docs/react/api/react-apollo/#optionsfetchpolicy).\n\n```reason\nlet (_simple, full) = useQuery(~fetchPolicy=NetworkOnly, UserQuery.definition);\n```\n\nUsing `errorPolicy` to change how errors are handled, see [apollo docs](https://www.apollographql.com/docs/react/api/react-apollo/#optionserrorpolicy).\n\n```reason\nlet (simple, _full) = useQuery(~errorPolicy=All, UserQuery.definition);\n```\n\nUsing `skip` to skip query entirely, see [apollo docs](https://www.apollographql.com/docs/react/api/react-apollo/#configskip).\n\n```reason\nlet (simple, _full) =\n  useQuery(\n    ~skip=\n      switch (value) {\n      | None =\u003e true\n      | _ =\u003e false\n      },\n    UserQuery.definition,\n  );\n```\n\n### useMutation [:arrow_up:](#table-of-contents)\n\n```reason\nmodule ScreamMutation = [%graphql {|\n  mutation ScreamMutation($screamLevel: Int!) {\n    scream(level: $screamLevel) {\n      error\n    }\n  }\n|}];\n\n[@react.component]\nlet make = () =\u003e {\n  /* Both variant and records available */\n  let ( screamMutation, simple, _full ) =\n    useMutation(~variables=ScreamMutation.makeVariables(~screamLevel=10, ()), ScreamMutation.definition);\n  let scream = (_) =\u003e {\n    screamMutation()\n      |\u003e Js.Promise.then_(((simple, _full)) =\u003e {\n           // Trigger side effects by chaining the promise returned by screamMutation()\n           switch (simple) {\n             // You *must* set the error policy to be able to handle errors\n             // in then_. See EditPersons.re for more\n           | ApolloHooks.Mutation.Errors(_theErrors) =\u003e Js.log(\"OH NO!\")\n           | NoData =\u003e Js.log(\"NO DATA?\")\n           | Data(_theData) =\u003e Js.log(\"DATA!\")\n           };\n           Js.Promise.resolve();\n         })\n      |\u003e ignore\n  }\n\n  // Use simple (and/or full) for (most) UI feedback\n  \u003cdiv\u003e\n    {switch (simple) {\n     | NotCalled\n     | Data(_) =\u003e React.null\n     | Loading =\u003e \u003cdiv\u003e \"Screaming!\"-\u003eReact.string \u003c/div\u003e\n     | NoData\n     | Error(_) =\u003e \u003cdiv\u003e \"Something went wrong!\"-\u003eReact.string \u003c/div\u003e\n     }}\n    \u003cbutton onClick={scream} disabled={simple === Loading}\u003e\n      {React.string(\"You kids get off my lawn!\")}\n    \u003c/button\u003e\n  \u003c/div\u003e\n}\n```\n\nIf you don't know the value of the variables yet you can pass them in later\n\n```reason\n[@react.component]\nlet make = () =\u003e {\n  /* Both variant and records available */\n  let ( screamMutation, _simple, _full ) = useMutation(ScreamMutation.definition);\n  let scream = (_) =\u003e {\n    screamMutation(~variables=ScreamMutation.makeVariables(~screamLevel=10, ()), ())\n      |\u003e Js.Promise.then_(((simple, _full)) =\u003e {\n           ...\n         })\n      |\u003e ignore\n  }\n\n  \u003cdiv\u003e\n    \u003cbutton onClick={scream}\u003e\n      {React.string(\"You kids get off my lawn!\")}\n    \u003c/button\u003e\n  \u003c/div\u003e\n}\n```\n\n### useSubscription [:arrow_up:](#table-of-contents)\n\nIn order to use subscriptions, you first need to set up your websocket link:\n\n```diff\n/* Create an InMemoryCache */\nlet inMemoryCache = ApolloInMemoryCache.createInMemoryCache();\n\n/* Create an HTTP Link */\nlet httpLink =\n  ApolloLinks.createHttpLink(~uri=\"http://localhost:3010/graphql\", ());\n+\n+/* Create a WS Link */\n+let webSocketLink =\n+  ApolloLinks.webSocketLink({\n+    uri: \"wss://localhost:3010/graphql\",\n+    options: {\n+      reconnect: true,\n+      connectionParams: None,\n+    },\n+  });\n+\n+/* Using the ability to split links, you can send data to each link\n+   depending on what kind of operation is being sent */\n+let link =\n+  ApolloLinks.split(\n+    operation =\u003e {\n+      let operationDefition =\n+        ApolloUtilities.getMainDefinition(operation.query);\n+      operationDefition.kind == \"OperationDefinition\"\n+      \u0026\u0026 operationDefition.operation == \"subscription\";\n+    },\n+    webSocketLink,\n+    httpLink,\n+  );\n\nlet client =\n-  ReasonApollo.createApolloClient(~link=httpLink, ~cache=inMemoryCache, ());\n+  ReasonApollo.createApolloClient(~link, ~cache=inMemoryCache, ());\n\nlet app =\n \u003cApolloHooks.Provider client\u003e\n   ...\n \u003c/ApolloHooks.Provider\u003e\n```\n\nThen, you can implement `useSubscription` in a similar manner to `useQuery`\n\n```reason\nmodule UserAdded = [%graphql {|\n  subscription userAdded {\n    userAdded {\n      id\n      name\n    }\n  }\n|}];\n\n\n[@react.component]\nlet make = () =\u003e {\n  let (userAddedSubscription, _full) = ApolloHooks.useSubscription(UserAdded.definition);\n\n  switch (userAddedSubscription) {\n    | Loading =\u003e \u003cdiv\u003e {ReasonReact.string(\"Loading\")} \u003c/div\u003e\n    | Error(error) =\u003e \u003cdiv\u003e {ReasonReact.string(error##message)} \u003c/div\u003e\n    | Data(_response) =\u003e\n      \u003caudio autoPlay=true\u003e\n      \u003csource src=\"notification.ogg\" type_=\"audio/ogg\" /\u003e\n      \u003csource src=\"notification.mp3\" type_=\"audio/mpeg\" /\u003e\n    \u003c/audio\u003e\n  };\n};\n```\n\n## Cache [:arrow_up:](#table-of-contents)\n\nThere are a couple of caveats with manual cache updates.\n\n**TL;DR**\n\n1. If you need to remove items from cached data, it is enough to just filter them out and save the result into cache as is.\n2. If you need to add the result of a mutation to a list of items with the same shape, you simply concat it with the list and save into cache as it.\n3. When you need to update a field, you have to resort to raw javascript to use spread operator on `Js.t` object in order to preserve `__typename` that `apollo` adds to all queries by default.\n\nAn example of cache update could look like this:\n\n```reason\nmodule PersonsQuery = [%graphql\n{|\n  query getAllPersons  {\n    allPersons  {\n      id\n      age\n      name\n    }\n  }\n|}\n];\n\nmodule PersonsReadQuery = ApolloClient.ReadQuery(PersonsQuery);\nmodule PersonsWriteQuery = ApolloClient.WriteQuery(PersonsQuery);\n\nexternal cast: Js.Json.t =\u003e PersonsQuery.t = \"%identity\";\n\nlet updatePersons = (~client, ~name, ~age) =\u003e {\n  let query = PersonsQuery.make();\n  let readQueryOptions = ApolloHooks.Utils.toReadQueryOptions(query);\n\n  // can throw exception of cache is empty\n  switch (PersonsReadQuery.readQuery(client, readQueryOptions)) {\n  | exception _ =\u003e ()\n  | cachedResponse =\u003e\n    switch (cachedResponse |\u003e Js.Nullable.toOption) {\n    | None =\u003e ()\n    | Some(cachedPersons) =\u003e\n      // readQuery will return unparsed data with __typename field, need to cast it since\n      // it has type Json.t, but we know it will have the same type as PersonsReadQuery.t\n      let persons = cast(cachedPersons);\n\n      // to remove items, simply filter them out\n      let updatedPersons = {\n        \"allPersons\":\n          Belt.Array.keep(persons##allPersons, person =\u003e person##age !== age),\n      };\n\n      // when updating items, __typename must be preserved, but since it is not a record,\n      // can't use spread, so use JS to update items\n      let updatedPersons = {\n        \"allPersons\":\n          Belt.Array.map(persons##allPersons, person =\u003e\n            person##name === name ? [%bs.raw {| {...person, age } |}] : person\n          ),\n      };\n\n      PersonsWriteQuery.make(\n        ~client,\n        ~variables=query##variables,\n        ~data=updatedPersons,\n        (),\n      );\n    }\n  };\n};\n```\n\n`reason-apollo-hooks` parses response data from a query or mutation using parse function created by `graphql_ppx`. For example, when using `@bsRecord` directive, the response object will be parsed from a `Js.t` object to a reason record. In this case, the response data in reason code is not the same object that is stored in cache, since `react-apollo` saves data in cache before it is parsed and returned to the component. However, when updating cache, the data must be in the same format or apollo cache won't work correctly and throw errors.\n\nIf using directives like `@bsRecord`, `@bsDecoder` or `@bsVariant` in `graphql_ppx`, the data needs to be serialized back to JS object before it is written in cache. Since there is currently no way to serialize this data (see [this issue](https://github.com/mhallin/graphql_ppx/issues/71) in `graphql_ppx`), queries that will be updated in cache shouldn't use any of those directive, unless you will take care of the serialization yourself.\n\nBy default, apollo will add field `__typename` to the queries and will use it to normalize data and manipulate cache (see [normalization](https://www.apollographql.com/docs/react/advanced/caching/#normalization)). This field won't exist on parsed reason objects, since it is not included in the actual query you write, but is added by apollo before sending the query. Since `__typename` is crucial for the cache to work correctly, we need to read data from cache in its raw unparsed format, which is achieved with `readQuery` from `ApolloClient.ReadQuery` defined in `reason-apollo`.\n\n\n## Fragment [:arrow_up:](#table-of-contents)\n\nUsing [fragments](https://www.apollographql.com/docs/react/data/fragments/).\n\nFragments can be defined and used like this:\n\n```reason\n// Fragments.re\nmodule PersonFragment = [%graphql\n  {|\n  fragment person on Person {\n      id\n      name\n      age\n  }\n|}\n];\n\n```\n\n```reason\nmodule PersonsQuery = [%graphql\n{|\n  query getAllPersons  {\n    ...Fragments.PersonFragment.Person\n  }\n|}\n];\n```\n\nSee [examples/persons/src/fragments/LoadMoreFragments.re](examples/persons/src/fragments/LoadMoreFragments.re).\n\n## Getting it running\n\n```sh\nyarn\nyarn start\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --\u003e\n\u003c!-- prettier-ignore-start --\u003e\n\u003c!-- markdownlint-disable --\u003e\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"http://twitter.com/fakenickels\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/1283200?v=4\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eGabriel Rubens\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/Astrocoders/reason-apollo-hooks/commits?author=fakenickels\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/Astrocoders/reason-apollo-hooks/commits?author=fakenickels\" title=\"Documentation\"\u003e📖\u003c/a\u003e \u003ca href=\"#ideas-fakenickels\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/arielschiavoni\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/1364564?v=4\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eAriel Schiavoni\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/Astrocoders/reason-apollo-hooks/commits?author=arielschiavoni\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://playqup.com\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/3103241?v=4\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eMatt\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/Astrocoders/reason-apollo-hooks/commits?author=hew\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://twitter.com/_cichocinski\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/9558691?v=4\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eTomasz Cichocinski\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/Astrocoders/reason-apollo-hooks/issues?q=author%3Abaransu\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e \u003ca href=\"https://github.com/Astrocoders/reason-apollo-hooks/commits?author=baransu\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://tmattio.github.io/\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/6162008?v=4\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eThibaut Mattio\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/Astrocoders/reason-apollo-hooks/commits?author=tmattio\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/Emilios1995\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/12430923?v=4\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eEmilio Srougo\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/Astrocoders/reason-apollo-hooks/issues?q=author%3AEmilios1995\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"http://mkndrsn.com\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/1226972?v=4\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eMike Anderson\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/Astrocoders/reason-apollo-hooks/commits?author=athaeryn\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/yurijean\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/6414876?v=4\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eYuri Jean Fabris\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/Astrocoders/reason-apollo-hooks/commits?author=yurijean\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://twitter.com/rita_krutikova\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/5932274?v=4\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eMargarita Krutikova\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/Astrocoders/reason-apollo-hooks/commits?author=MargaretKrutikova\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/Astrocoders/reason-apollo-hooks/pulls?q=is%3Apr+reviewed-by%3AMargaretKrutikova\" title=\"Reviewed Pull Requests\"\u003e👀\u003c/a\u003e \u003ca href=\"#ideas-MargaretKrutikova\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/Yakimych\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/5010901?v=4\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eKyrylo Yakymenko\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/Astrocoders/reason-apollo-hooks/issues?q=author%3AYakimych\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e \u003ca href=\"https://github.com/Astrocoders/reason-apollo-hooks/commits?author=Yakimych\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/lukashambsch\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/7560008?v=4\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eLukas Hambsch\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/Astrocoders/reason-apollo-hooks/issues?q=author%3Alukashambsch\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"http://www.familyfive.app\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/579279?v=4\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eJaap Frolich\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/Astrocoders/reason-apollo-hooks/commits?author=jfrolich\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/Astrocoders/reason-apollo-hooks/pulls?q=is%3Apr+reviewed-by%3Ajfrolich\" title=\"Reviewed Pull Requests\"\u003e👀\u003c/a\u003e \u003ca href=\"#ideas-jfrolich\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://willcodefor.beer/\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/1478102?v=4\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eRickard Laurin\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/Astrocoders/reason-apollo-hooks/issues?q=author%3Abeliever\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"http://medson.me\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/17956325?v=4\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eMedson Oliveira\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/Astrocoders/reason-apollo-hooks/commits?author=medson10\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/Astrocoders/reason-apollo-hooks/pulls?q=is%3Apr+reviewed-by%3Amedson10\" title=\"Reviewed Pull Requests\"\u003e👀\u003c/a\u003e \u003ca href=\"#ideas-medson10\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/soulplant\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/16846?v=4\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003esoulplant\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/Astrocoders/reason-apollo-hooks/commits?author=soulplant\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/mbirkegaard\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/18616185?v=4\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003embirkegaard\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/Astrocoders/reason-apollo-hooks/commits?author=mbirkegaard\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://strdr4605.github.io\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/16056918?v=4\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eDragoș Străinu\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/Astrocoders/reason-apollo-hooks/commits?author=strdr4605\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/bdunn313\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/867683?v=4\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eBrad Dunn\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/Astrocoders/reason-apollo-hooks/commits?author=bdunn313\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003c!-- markdownlint-enable --\u003e\n\u003c!-- prettier-ignore-end --\u003e\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:END --\u003e\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Freasonml-community%2Freason-apollo-hooks","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Freasonml-community%2Freason-apollo-hooks","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Freasonml-community%2Freason-apollo-hooks/lists"}