{"id":13406292,"url":"https://github.com/atulmy/gql-query-builder","last_synced_at":"2025-04-08T08:11:59.142Z","repository":{"id":41459717,"uuid":"150949151","full_name":"atulmy/gql-query-builder","owner":"atulmy","description":"🔧 Simple GraphQL Query Builder","archived":false,"fork":false,"pushed_at":"2023-12-18T15:32:47.000Z","size":742,"stargazers_count":398,"open_issues_count":25,"forks_count":47,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-04-01T05:33:56.380Z","etag":null,"topics":["generator","graphql","nodejs","query-builder","query-generator"],"latest_commit_sha":null,"homepage":"https://npmjs.com/package/gql-query-builder","language":"TypeScript","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/atulmy.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":"2018-09-30T08:44:32.000Z","updated_at":"2025-02-02T21:19:47.000Z","dependencies_parsed_at":"2024-01-15T20:49:04.725Z","dependency_job_id":"1b7382fe-6a7f-4c8b-a70a-cd65a304d132","html_url":"https://github.com/atulmy/gql-query-builder","commit_stats":{"total_commits":126,"total_committers":20,"mean_commits":6.3,"dds":0.2142857142857143,"last_synced_commit":"cbd7c38519ac63e3292c40e304c068e43e6a48f2"},"previous_names":[],"tags_count":20,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/atulmy%2Fgql-query-builder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/atulmy%2Fgql-query-builder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/atulmy%2Fgql-query-builder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/atulmy%2Fgql-query-builder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/atulmy","download_url":"https://codeload.github.com/atulmy/gql-query-builder/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247801170,"owners_count":20998339,"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":["generator","graphql","nodejs","query-builder","query-generator"],"created_at":"2024-07-30T19:02:26.393Z","updated_at":"2025-04-08T08:11:59.112Z","avatar_url":"https://github.com/atulmy.png","language":"TypeScript","funding_links":["http://paypal.me/atulmy"],"categories":["TypeScript"],"sub_categories":[],"readme":"# GraphQL Query Builder\n\nA simple helper function to generate GraphQL queries using plain JavaScript Objects (JSON).\n\n\u003ca href=\"https://www.npmjs.com/package/gql-query-builder\"\u003e\n\u003cimg src=\"https://img.shields.io/npm/dt/gql-query-builder?label=Downloads\" alt=\"downloads\" /\u003e\n\u003c/a\u003e\n\n\u003ca href=\"https://replit.com/@atulmy/gql-query-builder#index.js\"\u003e\n\u003cimg src=\"https://img.shields.io/badge/Demo-replit-blue\" alt=\"demo\" /\u003e\n\u003c/a\u003e\n\n## Install\n\n`npm install gql-query-builder --save` or `yarn add gql-query-builder`\n\n## Usage\n\n```typescript\nimport * as gql from 'gql-query-builder'\n\nconst query = gql.query(options: object)\nconst mutation = gql.mutation(options: object)\nconst subscription = gql.subscription(options: object)\n```\n\nYou can also import `query` or `mutation` or `subscription` individually:\n\n```typescript\nimport  { query, mutation, subscription } from 'gql-query-builder'\n\nquery(options: object)\nmutation(options: object)\nsubscription(options: object)\n```\n\n### Options\n\n`options` is `{ operation, fields, variables }` or an array of `options`\n\n\u003ctable width=\"100%\"\u003e\n  \u003cthead\u003e\n\n  \u003ctr\u003e\n    \u003cth\u003eName\u003c/th\u003e\n    \u003cth\u003eDescription\u003c/th\u003e\n    \u003cth\u003eType\u003c/th\u003e\n    \u003cth\u003eRequired\u003c/th\u003e\n    \u003cth\u003eExample\u003c/th\u003e\n\n  \u003c/tr\u003e\n\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n\n  \u003ctr\u003e\n    \u003ctd\u003eoperation\u003c/td\u003e\n    \u003ctd\u003eName of operation to be executed on server\u003c/td\u003e\n    \u003ctd\u003eString | Object\u003c/td\u003e\n    \u003ctd\u003eYes\u003c/td\u003e\n    \u003ctd\u003e\n      getThoughts, createThought\n      \u003cbr/\u003e\u003cbr /\u003e\n      \u003ccode\u003e{ name: 'getUser', alias: 'getAdminUser' }\u003c/code\u003e\n    \u003c/td\u003e\n\n  \u003c/tr\u003e\n\n  \u003ctr\u003e\n    \u003ctd\u003efields\u003c/td\u003e\n    \u003ctd\u003eSelection of fields\u003c/td\u003e\n    \u003ctd\u003eArray\u003c/td\u003e\n    \u003ctd\u003eNo\u003c/td\u003e\n    \u003ctd\u003e\n      \u003ccode\u003e['id', 'name', 'thought']\u003c/code\u003e\n      \u003cbr/\u003e\u003cbr /\u003e\n      \u003ccode\u003e['id', 'name', 'thought', { user: ['id', 'email'] }]\u003c/code\u003e\n    \u003c/td\u003e\n\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003evariables\u003c/td\u003e\n    \u003ctd\u003eVariables sent to the operation\u003c/td\u003e\n    \u003ctd\u003eObject\u003c/td\u003e\n    \u003ctd\u003eNo\u003c/td\u003e\n    \u003ctd\u003e\n      { key: value } eg: \u003ccode\u003e{ id: 1 }\u003c/code\u003e\n      \u003cbr/\u003e\u003cbr/\u003e\n      { key: { value: value, required: true, type: GQL type, list: true, name: argument name } eg:\n      \u003cbr /\u003e\n      \u003ccode\u003e\n      {\n        email: { value: \"user@example.com\", required: true },\n        password: { value: \"123456\", required: true },\n        secondaryEmails: { value: [], required: false, type: 'String', list: true, name: secondaryEmail }\n      }\n      \u003c/code\u003e\n    \u003c/td\u003e\n\n  \u003c/tr\u003e\n\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n### Adapter\n\nAn optional second argument `adapter` is a typescript/javascript class that implements `src/adapters/IQueryAdapter` or `src/adapters/IMutationAdapter`.\n\nIf adapter is undefined then `src/adapters/DefaultQueryAdapter` or `src/adapters/DefaultMutationAdapter` is used.\n\n```\nimport * as gql from 'gql-query-builder'\n\nconst query = gql.query(options: object, adapter?: MyCustomQueryAdapter,config?: object)\nconst mutation = gql.mutation(options: object, adapter?: MyCustomQueryAdapter)\nconst subscription = gql.subscription(options: object, adapter?: MyCustomSubscriptionAdapter)\n```\n\n### Config\n\n\u003ctable width=\"100%\"\u003e\n  \u003cthead\u003e\n\n  \u003ctr\u003e\n    \u003cth\u003eName\u003c/th\u003e\n    \u003cth\u003eDescription\u003c/th\u003e\n    \u003cth\u003eType\u003c/th\u003e\n    \u003cth\u003eRequired\u003c/th\u003e\n    \u003cth\u003eExample\u003c/th\u003e\n  \u003c/tr\u003e\n\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n\n  \u003ctr\u003e\n    \u003ctd\u003eoperationName\u003c/td\u003e\n    \u003ctd\u003eName of operation to be sent to the server\u003c/td\u003e\n    \u003ctd\u003eString\u003c/td\u003e\n    \u003ctd\u003eNo\u003c/td\u003e\n    \u003ctd\u003e\n      getThoughts, createThought\n    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n## Examples\n\n1. \u003ca href=\"#query\"\u003eQuery\u003c/a\u003e\n2. \u003ca href=\"#query-with-variables\"\u003eQuery (with variables)\u003c/a\u003e\n3. \u003ca href=\"#query-with-nested-fields-selection\"\u003eQuery (with nested fields selection)\u003c/a\u003e\n4. \u003ca href=\"#query-with-required-variables\"\u003eQuery (with required variables)\u003c/a\u003e\n5. \u003ca href=\"#query-with-custom-argument-name\"\u003eQuery (with custom argument name)\u003c/a\u003e\n6. \u003ca href=\"#query-with-operation-name\"\u003eQuery (with operation name)\u003c/a\u003e\n7. \u003ca href=\"#query-with-empty-fields\"\u003eQuery (with empty fields)\u003c/a\u003e\n8. \u003ca href=\"#query-with-alias\"\u003eQuery (with alias)\u003c/a\u003e\n9. \u003ca href=\"#query-with-adapter-defined\"\u003eQuery (with adapter defined)\u003c/a\u003e\n10. \u003ca href=\"#mutation\"\u003eMutation\u003c/a\u003e\n11. \u003ca href=\"#mutation-with-required-variables\"\u003eMutation (with required variables)\u003c/a\u003e\n12. \u003ca href=\"#mutation-with-custom-types\"\u003eMutation (with custom types)\u003c/a\u003e\n13. \u003ca href=\"#mutation-with-adapter-defined\"\u003eMutation (with adapter defined)\u003c/a\u003e\n14. \u003ca href=\"#mutation-with-operation-name\"\u003eMutation (with operation name)\u003c/a\u003e\n15. \u003ca href=\"#subscription\"\u003eSubscription\u003c/a\u003e\n16. \u003ca href=\"#subscription-with-adapter-defined\"\u003eSubscription (with adapter defined)\u003c/a\u003e\n17. \u003ca href=\"#example-with-axios\"\u003eExample with Axios\u003c/a\u003e\n\n#### Query:\n\n```javascript\nimport * as gql from 'gql-query-builder'\n\nconst query = gql.query({\n  operation: 'thoughts',\n  fields: ['id', 'name', 'thought']\n})\n\nconsole.log(query)\n\n// Output\nquery {\n  thoughts {\n    id,\n    name,\n    thought\n  }\n}\n```\n\n[↑ all examples](#examples)\n\n#### Query (with variables):\n\n```javascript\nimport * as gql from 'gql-query-builder'\n\nconst query = gql.query({\n  operation: 'thought',\n  variables: { id: 1 },\n  fields: ['id', 'name', 'thought']\n})\n\nconsole.log(query)\n\n// Output\nquery ($id: Int) {\n  thought (id: $id) {\n    id, name, thought\n  }\n}\n\n// Variables\n{ \"id\": 1 }\n```\n\n[↑ all examples](#examples)\n\n#### Query (with nested fields selection):\n\n```javascript\nimport * as gql from 'gql-query-builder'\n\nconst query = gql({\n  operation: 'orders',\n  fields: [\n    'id',\n    'amount',\n    {\n     user: [\n        'id',\n        'name',\n        'email',\n        {\n          address: [\n            'city',\n            'country'\n          ]\n        }\n      ]\n    }\n  ]\n})\n\nconsole.log(query)\n\n// Output\nquery {\n  orders  {\n    id,\n    amount,\n    user {\n      id,\n      name,\n      email,\n      address {\n        city,\n        country\n      }\n    }\n  }\n}\n```\n\n[↑ all examples](#examples)\n\n#### Query (with required variables):\n\n```javascript\nimport * as gql from 'gql-query-builder'\n\nconst query = gql.query({\n  operation: 'userLogin',\n  variables: {\n    email: { value: 'jon.doe@example.com', required: true },\n    password: { value: '123456', required: true }\n  },\n  fields: ['userId', 'token']\n})\n\nconsole.log(query)\n\n// Output\nquery ($email: String!, $password: String!) {\n  userLogin (email: $email, password: $password) {\n    userId, token\n  }\n}\n\n// Variables\n{\n  email: \"jon.doe@example.com\",\n  password: \"123456\"\n}\n```\n\n[↑ all examples](#examples)\n\n#### Query (with custom argument name):\n\n```javascript\nimport * as gql from 'gql-query-builder'\n\nconst query = gql.query([{\n  operation: \"someoperation\",\n  fields: [{\n    operation: \"nestedoperation\",\n    fields: [\"field1\"],\n    variables: {\n      id2: {\n        name: \"id\",\n        type: \"ID\",\n        value: 123,\n      },\n    },\n  }, ],\n  variables: {\n    id1: {\n      name: \"id\",\n      type: \"ID\",\n      value: 456,\n    },\n  },\n}, ]);\n\nconsole.log(query)\n\n// Output\nquery($id2: ID, $id1: ID) {\n  someoperation(id: $id1) {\n    nestedoperation(id: $id2) {\n      field1\n    }\n  }\n}\n\n// Variables\n{\n  \"id1\": 1,\n  \"id2\": 1\n}\n```\n\n[↑ all examples](#examples)\n\n#### Query (with operation name):\n\n```javascript\nimport * as gql from 'gql-query-builder'\n\nconst query = gql.query({\n  operation: 'userLogin',\n  fields: ['userId', 'token']\n}, null, {\n  operationName: 'someoperation'\n})\n\nconsole.log(query)\n\n// Output\nquery someoperation {\n  userLogin {\n    userId\n    token\n  }\n}\n```\n\n[↑ all examples](#examples)\n\n#### Query (with empty fields):\n\n```javascript\nimport * as gql from 'gql-query-builder'\n\nconst query = gql.query([{\n  operation: \"getFilteredUsersCount\",\n},\n  {\n    operation: \"getAllUsersCount\",\n    fields: []\n  },\n  operation: \"getFilteredUsers\",\n  fields: [{\n  count: [],\n}, ],\n]);\n\nconsole.log(query)\n\n// Output\nquery {\n  getFilteredUsersCount\n  getAllUsersCount\n  getFilteredUsers {\n    count\n  }\n}\n```\n\n[↑ all examples](#examples)\n\n#### Query (with alias):\n\n```javascript\nimport * as gql from 'gql-query-builder'\n\nconst query = gql.query({\n  operation: {\n    name: 'thoughts',\n    alias: 'myThoughts',\n  },\n  fields: ['id', 'name', 'thought']\n})\n\nconsole.log(query)\n\n// Output\nquery {\n  myThoughts: thoughts {\n    id,\n    name,\n    thought\n  }\n}\n```\n\n[↑ all examples](#examples)\n\n#### Query (with inline fragment):\n\n```javascript\nimport * as gql from 'gql-query-builder'\n\nconst query = gql.query({\n    operation: \"thought\",\n    fields: [\n        \"id\",\n        \"name\",\n        \"thought\",\n        {\n            operation: \"FragmentType\",\n            fields: [\"emotion\"],\n            fragment: true,\n        },\n    ],\n});\n\nconsole.log(query)\n\n// Output\nquery {\n    thought {\n        id,\n        name,\n        thought,\n        ... on FragmentType {\n            emotion\n        }\n    }\n}\n```\n\n[↑ all examples](#examples)\n\n#### Query (with adapter defined):\n\nFor example, to inject `SomethingIDidInMyAdapter` in the `operationWrapperTemplate` method.\n\n```javascript\nimport * as gql from 'gql-query-builder'\nimport MyQueryAdapter from 'where/adapters/live/MyQueryAdapter'\n\nconst query = gql.query({\n  operation: 'thoughts',\n  fields: ['id', 'name', 'thought']\n}, MyQueryAdapter)\n\nconsole.log(query)\n\n// Output\nquery SomethingIDidInMyAdapter {\n  thoughts {\n    id,\n    name,\n    thought\n  }\n}\n```\n\nTake a peek at [DefaultQueryAdapter](src/adapters/DefaultQueryAdapter.ts) to get an understanding of how to make a new adapter.\n\n[↑ all examples](#examples)\n\n#### Mutation:\n\n```javascript\nimport * as gql from 'gql-query-builder'\n\nconst query = gql.mutation({\n  operation: 'thoughtCreate',\n  variables: {\n    name: 'Tyrion Lannister',\n    thought: 'I drink and I know things.'\n  },\n  fields: ['id']\n})\n\nconsole.log(query)\n\n// Output\nmutation ($name: String, $thought: String) {\n  thoughtCreate (name: $name, thought: $thought) {\n    id\n  }\n}\n\n// Variables\n{\n  \"name\": \"Tyrion Lannister\",\n  \"thought\": \"I drink and I know things.\"\n}\n```\n\n[↑ all examples](#examples)\n\n#### Mutation (with required variables):\n\n```javascript\nimport * as gql from 'gql-query-builder'\n\nconst query = gql.mutation({\n  operation: 'userSignup',\n  variables: {\n    name: { value: 'Jon Doe' },\n    email: { value: 'jon.doe@example.com', required: true },\n    password: { value: '123456', required: true }\n  },\n  fields: ['userId']\n})\n\nconsole.log(query)\n\n// Output\nmutation ($name: String, $email: String!, $password: String!) {\n  userSignup (name: $name, email: $email, password: $password) {\n    userId\n  }\n}\n\n// Variables\n{\n  name: \"Jon Doe\",\n  email: \"jon.doe@example.com\",\n  password: \"123456\"\n}\n```\n\n[↑ all examples](#examples)\n\n#### Mutation (with custom types):\n\n```javascript\nimport * as gql from 'gql-query-builder'\n\nconst query = gql.mutation({\n  operation: \"userPhoneNumber\",\n  variables: {\n    phone: {\n      value: { prefix: \"+91\", number: \"9876543210\" },\n      type: \"PhoneNumber\",\n      required: true\n    }\n  },\n  fields: [\"id\"]\n})\n\nconsole.log(query)\n\n// Output\nmutation ($phone: PhoneNumber!) {\n  userPhoneNumber (phone: $phone) {\n    id\n  }\n}\n\n// Variables\n{\n  phone: {\n    prefix: \"+91\", number: \"9876543210\"\n  }\n}\n```\n\n[↑ all examples](#examples)\n\n#### Mutation (with adapter defined):\n\nFor example, to inject `SomethingIDidInMyAdapter` in the `operationWrapperTemplate` method.\n\n```javascript\nimport * as gql from 'gql-query-builder'\nimport MyMutationAdapter from 'where/adapters/live/MyQueryAdapter'\n\nconst query = gql.mutation({\n  operation: 'thoughts',\n  fields: ['id', 'name', 'thought']\n}, MyMutationAdapter)\n\nconsole.log(query)\n\n// Output\nmutation SomethingIDidInMyAdapter {\n  thoughts {\n    id,\n    name,\n    thought\n  }\n}\n```\n\n[↑ all examples](#examples)\n\nTake a peek at [DefaultMutationAdapter](src/adapters/DefaultMutationAdapter.ts) to get an understanding of how to make a new adapter.\n\n#### Mutation (with operation name):\n\n```javascript\nimport * as gql from 'gql-query-builder'\n\nconst query = gql.mutation({\n  operation: 'thoughts',\n  fields: ['id', 'name', 'thought']\n}, undefined, {\n  operationName: 'someoperation'\n})\n\nconsole.log(query)\n\n// Output\nmutation someoperation {\n  thoughts {\n    id\n    name\n    thought\n  }\n}\n```\n\n[↑ all examples](#examples)\n\n#### Subscription:\n\n```javascript\nimport axios from \"axios\";\nimport { subscription } from \"gql-query-builder\";\n\nasync function saveThought() {\n  try {\n    const response = await axios.post(\n      \"http://api.example.com/graphql\",\n      subscription({\n        operation: \"thoughtCreate\",\n        variables: {\n          name: \"Tyrion Lannister\",\n          thought: \"I drink and I know things.\",\n        },\n        fields: [\"id\"],\n      })\n    );\n\n    console.log(response);\n  } catch (error) {\n    console.log(error);\n  }\n}\n```\n\n[↑ all examples](#examples)\n\n#### Subscription (with adapter defined):\n\nFor example, to inject `SomethingIDidInMyAdapter` in the `operationWrapperTemplate` method.\n\n```javascript\nimport * as gql from 'gql-query-builder'\nimport MySubscriptionAdapter from 'where/adapters/live/MyQueryAdapter'\n\nconst query = gql.subscription({\n  operation: 'thoughts',\n  fields: ['id', 'name', 'thought']\n}, MySubscriptionAdapter)\n\nconsole.log(query)\n\n// Output\nsubscription SomethingIDidInMyAdapter {\n  thoughts {\n    id,\n    name,\n    thought\n  }\n}\n```\n\nTake a peek at [DefaultSubscriptionAdapter](src/adapters/DefaultSubscriptionAdapter.ts) to get an understanding of how to make a new adapter.\n\n[↑ all examples](#examples)\n\n#### Example with [Axios](https://github.com/axios/axios)\n\n**Query:**\n\n```javascript\nimport axios from \"axios\";\nimport { query } from \"gql-query-builder\";\n\nasync function getThoughts() {\n  try {\n    const response = await axios.post(\n      \"http://api.example.com/graphql\",\n      query({\n        operation: \"thoughts\",\n        fields: [\"id\", \"name\", \"thought\"],\n      })\n    );\n\n    console.log(response);\n  } catch (error) {\n    console.log(error);\n  }\n}\n```\n\n[↑ all examples](#examples)\n\n**Mutation:**\n\n```javascript\nimport axios from \"axios\";\nimport { mutation } from \"gql-query-builder\";\n\nasync function saveThought() {\n  try {\n    const response = await axios.post(\n      \"http://api.example.com/graphql\",\n      mutation({\n        operation: \"thoughtCreate\",\n        variables: {\n          name: \"Tyrion Lannister\",\n          thought: \"I drink and I know things.\",\n        },\n        fields: [\"id\"],\n      })\n    );\n\n    console.log(response);\n  } catch (error) {\n    console.log(error);\n  }\n}\n```\n\n[↑ all examples](#examples)\n\n# Showcase\n\nFollowing projects are using [gql-query-builder](https://github.com/atulmy/gql-query-builder)\n\n- Crate - Get monthly subscription of trendy clothes and accessories - [GitHub](https://github.com/atulmy/crate)\n- Fullstack GraphQL Application - [GitHub](https://github.com/atulmy/fullstack-graphql)\n- Would really appreciate if you add your project to this list by sending a PR\n\n## Author\n\n- Atul Yadav - [GitHub](https://github.com/atulmy) · [Twitter](https://twitter.com/atulmy)\n\n## Contributors\n\n**If you are interested in actively maintaining / enhancing this project, get in \u003ca href=\"mailto:atul.12788@gmail.com\"\u003etouch\u003c/a\u003e.**\n\n- Juho Vepsäläinen - [GitHub](https://github.com/bebraw) · [Twitter](https://twitter.com/bebraw)\n- Daniel Hreben - [GitHub](https://github.com/DanielHreben) · [Twitter](https://twitter.com/DanielHreben)\n- Todd Baur - [GitHub](https://github.com/toadkicker) · [Twitter](https://twitter.com/toadkicker)\n- Alireza Hariri - [GitHub](https://github.com/ARHariri)\n- Cédric - [GitHub](https://github.com/cbonaudo)\n- Clayton Collie - [GitHub](https://github.com/ccollie)\n- Devon Reid - [GitHub](https://github.com/Devorein)\n- Harry Brundage - [GitHub](https://github.com/airhorns) · [Twitter](https://twitter.com/harrybrundage)\n- Clément Berard - [GitHub](https://github.com/clement-berard) · [Twitter](https://twitter.com/clementberard)\n- Lee Rose - [GitHub](https://github.com/leeroyrose)\n- Christian Westgaard - [GitHub](https://github.com/ComLock)\n- [YOUR NAME HERE] - Feel free to contribute to the codebase by resolving any open issues, refactoring, adding new features, writing test cases or any other way to make the project better and helpful to the community. Feel free to fork and send pull requests.\n\n## Donate\n\nIf you liked this project, you can donate to support it ❤️\n\n[![Donate via PayPal](https://raw.githubusercontent.com/atulmy/atulmy.github.io/master/images/mix/paypal-me-smaller.png)](http://paypal.me/atulmy)\n\n## License\n\nCopyright (c) 2018 Atul Yadav \u003chttp://github.com/atulmy\u003e\n\nThe MIT License (\u003chttp://www.opensource.org/licenses/mit-license.php\u003e)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fatulmy%2Fgql-query-builder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fatulmy%2Fgql-query-builder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fatulmy%2Fgql-query-builder/lists"}