New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

@deepdub/graphql-combine-query

Package Overview
Dependencies
Maintainers
3
Versions
3
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@deepdub/graphql-combine-query

combine graphql query documents

  • 2.0.2
  • latest
  • Source
  • npm
  • Socket score

Version published
Maintainers
3
Created
Source

@deepdub/graphql-combine-query

This graphql-combine-query fork extends combinedQuery, adding a method that allows combining multiple queries, repeating or not, into one.

Previously, this was not possible:

const { document, variables } = (() =>
  combineQuery("CompositeMutation")
    .add(createFooMutation, { foo: { name: "A foo" } })
    .add(updateFooMutation, { foo: { id: "some-id", name: "Another foo" } })
    .add(createFooMutation, { foo: { name: "Yet another foo" } })

As both createFooMutation would collide (you could use addN, but that would re-order the mutations, making it impossible to do the update between both create's).

With the new addAssorted you could write this, instead:

const { document, variables } = (() =>
  combineQuery("CompositeMutation")
    .addAssorted([
      createFooMutation,
      updateFooMutation,
      createFooMutation
    ], [
      { foo: { name: "A foo" } },
      { foo: { id: "some-id", name: "Another foo" } },
      { foo: { name: "Yet another foo" } }
    ])

Test

Run

ts-node ./test/test.ts

Why?

  • There are situations where you do not know ahead of time what fields will need to be invoked with a mutation, so cannot prepate a single graphql document ahead of time
  • Some graphql servers, like Hasura will execute each mutation in a single database transaction, which is desirable for changes being made
  • It just might be easier to deal with state of a single query/mutation compared to making several calls to backend

Install

npm install graphql-combine-query

Usage / examples

combine several queries / mutations together

create query builder with combineQuery(newQueryName) and use .add(document, variables) to add queries to it. argument list & top level selections are concatenated

import combineQuery from "graphql-combine-query";

import gql from "graphql-tag";

const fooQuery = gql`
  query FooQuery($foo: String!) {
    getFoo(foo: $foo)
  }
`;

const barQuery = gql`
  query BarQuery($bar: String!) {
    getBar(bar: $bar)
  }
`;

const { document, variables } = combineQuery("FooBarQuery")
  .add(fooQuery, { foo: "some value" })
  .add(barQuery, { bar: "another value" });

console.log(variables);
// { foo: 'some value', bar: 'another value' }

print(document);
/*
query FooBarQuery($foo: String!, $bar: String!) {
   getFoo(foo: $foo)
   getBar(bar: $bar)
}
*/

add multiple instances of the same query / mutation

It's not uncommon to need to add the same mutation several times, eg when updating multiple objects. In this case use addN(document, variables[]) Arguments & top level selections will be renamed/aliased with index appended.

Let's say we want to create foo and update several bars by id:

import combineQuery from "graphql-combine-query";

import gql from "graphql-tag";

const createFooMutation = gql`
  mutation CreateFoo($foo: foo_input!) {
    createFoo(foo: $foo) {
      id
    }
  }
`;

const updateBarMutation = gql`
  mutation UpdateBar($bar_id: Int!, $bar: bar_update_input!) {
    updateBar(where: { id: { _eq: $bar_id } }, _set: $bar) {
      id
    }
  }
`;

const { document, variables } = (() =>
  combineQuery("CompositeMutation")
    .add(createFooMutation, { foo: { name: "A foo" } })
    .addN(updateBarMutation, [
      { bar_id: 1, bar: { name: "Some bar" } },
      { bar_id: 2, bar: { name: "Another bar" } },
    ]))();

console.log(variables);
/*
{
  foo: { name: 'A foo' },
  bar_id_0: 1,
  bar_0: { name: 'Some bar' },
  bar_id_1: 2,
  bar_1: { name: 'Another bar' }
}

*/

print(document);

/*
mutation CompositeMutation($foo: foo_input!, $bar_id_0: Int!, $bar_0: bar_update_input!, $bar_id_1: Int!, $bar_1: bar_update_input!) {
    createFoo(foo: $foo) {
      id
    }
    updateBar_0: updateBar(where: {id: {_eq: $bar_id_0}}, _set: $bar_0) {
      id
    }
    updateBar_1: updateBar(where: {id: {_eq: $bar_id_1}}, _set: $bar_1) {
      id
    }
  }
*/

Keywords

FAQs

Package last updated on 13 Apr 2022

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc