node package manager
Stop writing boring code. Discover, share, and reuse within your team. Create a free org »

pelorus

GraphQL adapter for Waterline

Pelorus can help find what you're looking for using GraphQL and Waterline queries.

Forked from waterline-graphql adapter

Installation

Install the latest stable release with the npm command-line tool:

$ npm install pelorus

Configuration

{
  collections: orm.collections // Required attributes 
  exposeQueryLanguage: true|false // Allows you to pass in waterline queries 
}

Note: If you are using standalone Waterline models, your models need to be patched with an associations array. See the issue here.

module.exports = {
    associations: [], // <-- required if using standalone Waterline models 
    identity: 'user',
    attributes: {
        firstName: {
            type: 'string'
        }
    }
};

Usage

From Waterline collections to GraphQL schemas

// Import the adapter 
const Pelorus = require('pelorus');
 
// Convert Waterline collections to GraphQL schemas 
const schemas = Pelorus.getGraphQlSchema({
  collections: orm.collections,
  exposeQueryLanguage: true
});

Execute GraphQL queries

const graphql = require('graphql').graphql();
 
// Build your query 
const query = '{ users {firstName lastName articles { title comments { text }}}}';
 
// Execute the query 
graphql(schemas, query)
  .then(result => console.log(result))
  .catch(error => console.log(error));

Complex queries

You can execute more complex queries like this.

This example will return 10 user's records sorted alphabetically by firstName:

const query = '{ users (limit: 10, sort: "firstName ASC") { firstName lastName articles { title comments { text }}}}';

Using both skip and limit can be used to build a pagination system.

const query = '{ users (limit: 10, sort: "firstName ASC", skip: 10) { firstName lastName articles { title comments { text }}}}';

You can also utilise Waterline's query language by adding criteria modifiers.

Return all users where their first name starts with Sam e.g Samantha, Samuel, Sam...

const query = '{ users (firstName: {startsWith: "Sam"}) { firstName lastName } }';

Return the first 5 users in firstName descending order whose name is not Sam or John and their age is over 21

const query = '{ users (where: {firstName: {"!": ["Sam", "John"]}, age: {">": 21}}, limit: 5, sort: "firstName DESC") { firstName lastName age } }';