/restql

RESTful API Resolver for Nested-Linked Resources | 🕸 🕷

Primary LanguageJavaScriptMIT LicenseMIT

RestQL.js

RESTful API Resolver for Nested-Linked Resources | 🕸 🕷


npm build maintainability coverage code style

RestQL allows you to dynamically resolve the nested-linked resources of a RESTful API.

By specifying a set of properties to describe the paths.

Installation

npm

npm install restql --save

Yarn

yarn add restql

CDN

<script src="https://unpkg.com/restql/dist/umd/index.min.js"></script>

Parameters

resource

{string} The resource to fetch.

Description

Self-explanatory.

e.g.:

'https://pokeapi.co/api/v2/pokemon/1/'

resolver

{Object} The resolver to apply.

Description

At each level, each property describes a path to the nested resources within the current one.

RestQL resolves the sames and call the subsequent resolver against them...

Until the base case (null) is reached; from which it returns back the merged responses.

Quantifiers

Following is a table of the quantifiers you can use:

Quantifier Description
[] Collection of properties.
? Optional property.

e.g.:

{
  'abilities[]?.ability.url': {
    'generation.url': {
      'main_region.url': null,
    },
  },
  'stats[].stat.url?': {
    'affecting_natures.increase[].url': null,
    'affecting_natures.decrease[].url': null,
  },
  'moves[].move?.url': null,
}

[options]

{Object} The options to bypass.

Description

Request Config

e.g.:

{
  // ...
}

Usage

// External Packages
import restql from 'restql'

/**
 * @constant {string} resource The resource to fetch.
 */
const resource = 'https://pokeapi.co/api/v2/pokemon/1/'

/**
 * @constant {Object} resolver The resolver to apply.
 */
const resolver = {
  'abilities[]?.ability.url': {
    'generation.url': {
      'main_region.url': null,
    },
  },
  'stats[].stat.url?': {
    'affecting_natures.increase[].url': null,
    'affecting_natures.decrease[].url': null,
  },
  'moves[].move?.url': null,
}

/**
 * @constant {Object} options The options to bypass.
 */
const options = {
  // ...
};

(async () => {
  try {
    const data = await restql(resource, resolver, options)

    console.log(data)
  } catch (error) {
    console.error(error.message)
  }
})()

Test RestQL in your browser.

Roadmap

  • Support for authentication
  • Support for optional resolvers
  • Improve package bundler
  • Ability to cache responses
  • Support for recursive resolvers

Take 🍰, Folks! 🌮 🐴 💨