![RipHunter](https://nitrogenlabs.com/logos/gh-rip-hunter.png "RipHunter")

#### JS utilities for GraphQL

RipHunter is a small utility to parse objects formatted for GraphQL requests as well as use fetch to send query and 
mutation requests, returning a promise. Some helpers include sending an authorization token as well as custom headers.

[![npm version](https://img.shields.io/npm/v/rip-hunter.svg?style=flat-square)](https://www.npmjs.com/package/rip-hunter)
[![Travis](https://img.shields.io/travis/nitrogenlabs/rip-hunter.svg?style=flat-square)](https://travis-ci.org/nitrogenlabs/rip-hunter)
[![npm downloads](https://img.shields.io/npm/dm/rip-hunter.svg?style=flat-square)](https://www.npmjs.com/package/rip-hunter)
[![Issues](http://img.shields.io/github/issues/nitrogenlabs/rip-hunter.svg?style=flat-square)](https://github.com/nitrogenlabs/rip-hunter/issues)
[![MIT license](http://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](http://opensource.org/licenses/MIT)

### Installation

Using [npm](https://www.npmjs.com/):

    $ npm install rip-hunter

###App Usage
Then with a module bundler like [webpack](https://webpack.github.io/) that supports either CommonJS or ES2015 modules, use as you would anything else:

```js
import {Hunter} from 'rip-hunter';
```

### How to use

**Example:**
```js
import {Hunter} from 'rip-hunter';

const AppActions = {
  getData: () => {
    // Variables
    const url = 'http://www.example.com/graphql';
    const gql = '{ app { ping } }';
    
    // Query data
    return Hunter.query(url, gql)
      .then(results => {
        console.log(results);
        // Assuming the results will return the JSON object, {status: 'ok'}
        // Output: {status: 'ok'}
      })
      .catch(error => {
        // ApiError will be returned if any problems occur.
      });
  },

  updateData: () => {
    // Variables
    const url = 'http://www.example.com/graphql';
    const data = {hello: 'world'};
    const gql = `{ user { update(data: ${Hunter.toGQL(data)}) } }`;
    
    // Mutate data
    return Hunter.mutation(url, gql)
      .then(results => {
        console.log(results);
        // Assuming the results will return the JSON object, {id: 'test', hello: 'world'}
        // Output: {id: 'test', hello: 'world'}
      })
      .catch(error => {
        // ApiError will be returned if any problems occur.
      });
  }
}

```

## API

### Formatting

#### `toGQL(data)`
Parses an immutable object, JSON object, string, or number into a GraphQL formatted string. This string is used when
sending variables in a request.
* [`data`] \(* Any *): An immutable object, JSON object, string or number to format for use with a GQL request.
##### Returns
A string formatted for use with GQL.


### Events

#### `on(eventType, data)`
Adds an event listener. The only event emitted is when an error occurs. The error event is _rip_hunter_error_.
* [`eventType`] \(*String*): Event to subscribe for store updates.
* [`listener`] \(*Function*): The callback to be invoked any time an action has been dispatched.

#### `off(eventType, data)`
Removes an event listener.
* [`eventType`] \(*String*): Event to unsubscribe.
* [`listener`] \(*Function*): The callback associated with the subscribed event.


### AJAX

#### `ajax(url, method, params, options)`
AJAX request.
* [`url`] \(*String*): URL to send the request. Must be an absolute url.
* [`method`] \(*String*): The HTTP method for the request.
* [`params`] \(*Object*): Data to be sent with the request. Params will be converted to a query string for GET methods. 
* [`options`] \(*Object*): Rip Hunter options.
  * [`headers`] \(*Object*): Overwrite the default headers.
  * [`immutable`] \(*Boolean*): Converts result to an Immutable object if set to true. Default: false.
  * [`token`] \(*String*): Add an _Authorization_ header with the value _Bearer [token]_.
    
##### Returns
A promise with either the response data or ApiError.

#### `get(url, params, options)`
Server request using HTTP GET.
* [`url`] \(*String*): URL to send the request. Must be an absolute url.
* [`params`] \(*Object*): Data to be sent with the request.
* [`options`] \(*Object*): Rip Hunter options.
  * [`headers`] \(*Object*): Overwrite the default headers.
  * [`immutable`] \(*Boolean*): Converts result to an Immutable object if set to true. Default: false.
  * [`token`] \(*String*): Add an _Authorization_ header with the value _Bearer [token]_.
    
##### Returns
A promise with either the response data or ApiError.

#### `post(url, params, options)`
Server request using HTTP POST.
* [`url`] \(*String*): URL to send the request. Must be an absolute url.
* [`params`] \(*Object*): Data to be sent with the request.
* [`options`] \(*Object*): Rip Hunter options.
  * [`headers`] \(*Object*): Overwrite the default headers.
  * [`immutable`] \(*Boolean*): Converts result to an Immutable object if set to true. Default: false.
  * [`token`] \(*String*): Add an _Authorization_ header with the value _Bearer [token]_.
    
##### Returns
A promise with either the response data or ApiError.

#### `put(url, params, options)`
Server request using HTTP PUT.
* [`url`] \(*String*): URL to send the request. Must be an absolute url.
* [`params`] \(*Object*): Data to be sent with the request.
* [`options`] \(*Object*): Rip Hunter options.
  * [`headers`] \(*Object*): Overwrite the default headers.
  * [`immutable`] \(*Boolean*): Converts result to an Immutable object if set to true. Default: false.
  * [`token`] \(*String*): Add an _Authorization_ header with the value _Bearer [token]_.
    
##### Returns
A promise with either the response data or ApiError.

#### `del(url, params, options)`
Server request using HTTP DEL.
* [`url`] \(*String*): GraphQL server endpoint. Must be an absolute url.
* [`params`] \(*Object*): Data to be sent with the request.
* [`options`] \(*Object*): Rip Hunter options.
  * [`headers`] \(*Object*): Overwrite the default headers.
  * [`immutable`] \(*Boolean*): Converts result to an Immutable object if set to true. Default: false.
  * [`token`] \(*String*): Add an _Authorization_ header with the value _Bearer [token]_.
    
##### Returns
A promise with either the response data or ApiError.

### GraphQL

#### `query(url, body, options)`
Queries a GraphQL server.
* [`url`] \(*String*): GraphQL server endpoint. Must be an absolute url.
* [`body`] \(*String*): GraphQL query.
* [`options`] \(*Object*): Rip Hunter options.
  * [`headers`] \(*Object*): Overwrite the default headers.
  * [`immutable`] \(*Boolean*): Converts result to an Immutable object if set to true. Default: false.
  * [`token`] \(*String*): Add an _Authorization_ header with the value _Bearer [token]_.
    
##### Returns
A promise with either the response data or ApiError.

#### `mutation(url, body, token, headers)`
Modifies data on a GraphQL server.
* [`url`] \(*String*): GraphQL server endpoint. Must be an absolute url.
* [`body`] \(*String*): GraphQL query.
* [`options`] \(*Object*): Rip Hunter options.
  * [`headers`] \(*Object*): Overwrite the default headers.
  * [`immutable`] \(*Boolean*): Converts result to an Immutable object if set to true. Default: false.
  * [`token`] \(*String*): Add an _Authorization_ header with the value _Bearer [token]_.

##### Returns
A promise with either the response data or ApiError.
