• Stars
    star
    1,123
  • Rank 41,432 (Top 0.9 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created about 9 years ago
  • Updated about 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

🐕 Modern fetch-based alternative to axios/superagent/request. Great for React Native.

Frisbee

Slack Status npm version npm downloads build status code coverage code style styled with prettier made with lass license

❤️ Love this project? Support @niftylettuce's FOSS on Patreon or PayPal 🦄

Modern fetch-based alternative to axios/superagent/request. Great for React Native.

New in v2.0.4++: baseURI is now optional and you can pass raw: true as a global or request-based option to get the raw fetch() response (e.g. if you want to use res.arrayBuffer() or any other method manually).

Table of Contents

Install

Node (Koa, Express, React Native, ...)

  1. Install the required package:

    npm install --save frisbee
  2. See usage example and API below

Browser

VanillaJS

  1. Load the package via <script> tag (note you will need to polyfill with required features):
<script crossorigin="anonymous" src="https://polyfill.io/v3/polyfill.min.js?features=es6,Array.from,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Promise,Promise.race,Promise.reject,Promise.resolve,Reflect,Symbol.for,Symbol.iterator,Symbol.prototype,Symbol.species,Symbol.toPrimitive,Symbol.toStringTag,Uint8Array"></script>
<script src="https://unpkg.com/frisbee"></script>
<script type="text/javascript">
  (function() {
    // create a new instance of Frisbee
    var api = new Frisbee({
      baseURI: 'https://api.startup.com', // optional
      headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json'
      }
    });

    // this is a simple example using `.then` and `.catch`
    api.get('/hello-world').then(console.log).catch(console.error);

    //
    // see the Usage section below in Frisbee's README for more information
    // https://github.com/niftylettuce/frisbee
    //
  })();
</script>
  1. See usage example and API below for a more complete example.

Bundler

  1. Install the required package:

    npm install frisbee
  2. Ensure that your environment is polyfilled with required features (e.g. use @babel/polyfill globally or a service like polyfill.io)

  3. See usage example and API below

Usage

Example

const Frisbee = require('frisbee');

// create a new instance of Frisbee
const api = new Frisbee({
  baseURI: 'https://api.startup.com', // optional
  headers: {
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  }
});

// this is a simple example using `.then` and `.catch`
api.get('/hello-world').then(console.log).catch(console.error);

// this is a more complex example using async/await and basic auth
(async () => {
  // log in to our API with a user/pass
  try {
    // make the request
    let res = await api.post('/v1/login');

    // handle HTTP or API errors
    if (res.err) throw res.err;

    // set basic auth headers for all
    // future API requests we make
    api.auth(res.body.api_token);

    // now let's post a message to our API
    res = await api.post('/v1/messages', { body: 'Hello' });

    // handle HTTP or API errors
    if (res.err) throw res.err;

    // now let's get a list of messages filtered by page and limit
    res = await api.get('/v1/messages', {
      body: {
        limit: 10,
        page: 2
      }
    });

    // handle HTTP or API errors
    if (res.err) throw res.err;

    // now let's logout
    res = api.post('/v1/logout');

    // handle HTTP or API errors
    if (res.err) throw res.err;

    // unset auth now since we logged out
    api.auth();

    // for more information on `fetch` headers and
    // how to send and expect various types of data:
    // <https://github.com/github/fetch>
  } catch (err) {
    console.error(err);
  }
})();

API

const Frisbee = require('frisbee');

Frisbee is a function that optionally accepts an argument options, which is an object full of options for constructing your API instance.

  • Frisbee - accepts an options object, with the following accepted options:

    • baseURI (String) - the default URI to use as a prefix for all HTTP requests (optional as of v2.0.4+)

      • If your API server is running on http://localhost:8080, then use that as the value for this option

      • If you use React Native, then you most likely want to set baseURI as follows (e.g. making use of __DEV__ global variable):

        const api = new Frisbee({
          baseURI: __DEV__
            ? process.env.API_BASE_URI || 'http://localhost:8080'
            : 'https://api.startup.com'
        });
      • You could also set API_BASE_URI as an environment variable, and then set the value of this option to process.env.API_BASE_URI (e.g. API_BASE_URI=http://localhost:8080 node app)

      • Using React Native? You might want to read this article about automatic IP configuration.

    • headers (Object) - an object containing default headers to send with every request

      • Tip: You'll most likely want to set the "Accept" header to "application/json" and the "Content-Type" header to "application/json"
    • body (Object) - an object containing default body payload to send with every request. Either the default body set in options will be used or it will be overridden with a request provided body. Body will not merge nor deep merge.

    • params (Object) - an object containing default querystring parameters to send with every request (API method specific params options will override or extend properties defined here, but will not deep merge)

    • logRequest (Function) - a function that accepts two arguments path (String) and opts (Object) and will be called with before a fetch request is made with (e.g. fetch(path, opts) – see Logging and Debugging below for example usage) - this defaults to false so no log request function is called out of the box

    • logResponse (Function) - a function that accepts three arguments path (String), opts (Object), and response (Object) and has the same parameters as logRequest, with the exception of the third response, which is the raw response object returned from fetch (see Logging and Debugging below for example usage) - this defaults to false so no log response function is called out of the box

    • auth - will call the auth() function below and set it as a default

    • parse - options passed to qs.parse method (see qs for all available options)

      • ignoreQueryPrefix (Boolean) - defaults to true, and parses querystrings from URL's properly
    • stringify - options passed to qs.stringify method (see qs for all available options)

      • addQueryPrefix (Boolean) - defaults to true, and affixes the path with required ? parameter if a querystring is to be passed

      • format (String) - defaults to RFC1738

      • arrayFormat (String) - defaults to 'indices'

    • preventBodyOnMethods (Array) - defaults to [ 'GET', 'HEAD', 'DELETE', 'CONNECT' ], and is an Array of HTTP method names that we will convert a body option to be querystringified URL parameters (e.g. api.get('/v1/users', { search: 'foo' }) will result in GET /v1/users?search=foo). According to RFC 7231, the default methods defined here have no defined semantics for having a payload body, and having one may cause some implementations to reject the request (which is why we set this as a default). If you wish to disable this, you may pass preventBodyOnMethods: false or your own custom Array preventBodyOnMethods: [ ... ]

    • interceptableMethods (Array) - defaults to all API methods supported below (defaults to GET, HEAD, POST, PUT, DELETE, OPTIONS, PATCH)

    • raw (Boolean) - return a raw fetch response (new as of v2.0.4+)

    • abortToken (Symbol) - some Symbol that you can use to abort one or more frisbee requests

    • signal (Object) - an AbortController Signal used to cancel a fetch request

    • mode (String) - passed to fetch, defaults to "same-origin" (see Fetch's documentation for more info)

    • cache (String) - passed to fetch, defaults to "default" (see Fetch's documentation for more info)

    • credentials (String) - passed to fetch, defaults to "same-origin" (see Fetch's documentation for more info)

    • redirect (String) - passed to fetch, defaults to "follow" (see Fetch's documentation for more info)

    • referrer (String) - passed to fetch, defaults to "client" (see Fetch's documentation for more info)

Upon being invoked, Frisbee returns an object with the following chainable methods:

  • api.auth(creds) - helper function that sets BasicAuth headers, and it accepts user and pass arguments

    • You can pass creds user and pass as an array, arguments, or string: ([user, pass]), (user, pass), or ("user:pass"), so you shouldn't have any problems!
    • If you don't pass both user and pass arguments, then it removes any previously set BasicAuth headers from prior auth() calls
    • If you pass only a user, then it will set pass to an empty string '')
    • If you pass : then it will assume you are trying to set BasicAuth headers using your own user:pass string
    • If you pass more than two keys, then it will throw an error (since BasicAuth only consists of user and pass anyways)
  • api.setOptions(opts) - helper function to update instance options (note this does not call api.auth internally again even if opts.auth is passed)

  • api.jwt(token) - helper function that sets a JWT Bearer header. It accepts the jwt_token as a single string argument. If you simply invoke the function null as the argument for your token, it will remove JWT headers.

  • api.abort(token) - aborts all current/queued requests that were created using token

  • api.abortAll() - aborts all current/queued - i.e. await-ing in an interceptor - requests

  • All exposed HTTP methods return a Promise, and they require a path string, and accept an optional options object:

    • Accepted method arguments:

      • path required - the path for the HTTP request (e.g. /v1/login, will be prefixed with the value of baseURI if set)

      • options optional - an object containing options, such as header values, a request body, form data, or a querystring to send along with the request. These options by default are inherited from global options passed to new Frisbee({ options }). For the GET method (and the DELETE method as of version 1.3.0), body data will be encoded in the query string. **This options object is passed to the native Fetch API method, which means you can use native Fetch API method options as well from Fetch's documentation

        To make only a certain request be raw and not parsed by Frisbee:

        const res = await api.get('/v1/messages', { raw: false });

        Here are a few examples (you can override/merge your set default headers as well per request):

        • To turn off caching, pass cache: 'reload' to native fetch options:

          const res = await api.get('/v1/messages', { cache: 'reload' });
        • To set a custom header value of X-Reply-To on a POST request:

          const res = await api.post('/messages', {
            headers: {
              'X-Reply-To': '7s9inuna748y4l1azchi'
            }
          });
      • raw optional - will override a global raw option if set, and if it is true it will return a raw fetch response (new as of v2.0.4+)

    • List of available HTTP methods:

      • api.get(path, options) - GET
      • api.head(path, options) - HEAD (does not currently work - see tests)
      • api.post(path, options) - POST
      • api.put(path, options) - PUT
      • api.del(path, options) - DELETE
      • api.delete(path, options) - DELETE
      • api.options(path, options) - OPTIONS (does not currently work - see tests)
      • api.patch(path, options) - PATCH
    • Note that you can chain the auth method and a HTTP method together:

      const res = await api.auth('foo:bar').get('/');
  • interceptor - object that can be used to manipulate request and response interceptors. It has the following methods:

    • api.interceptor.register(interceptor): Accepts an interceptor object that can have one or more of the following functions

      {
      request: function (path, options) {
          // Read/Modify the path or options
          // ...
          return [path, options];
      },
      requestError: function (err) {
          // Handle an error occured in the request method
          // ...
          return Promise.reject(err);
      },
      response: function (response) {
          // Read/Modify the response
          // ...
          return response;
      },
      responseError: function (err) {
          // Handle error occured in api/response methods
          return Promise.reject(err);
      }

      the register method returns an unregister() function so that you can unregister the added interceptor.

    • api.interceptor.unregister(interceptor): Accepts the interceptor reference that you want to delete.

    • api.interceptor.clear(): Removes all the added interceptors.

    • Note that when interceptors are added in the order ONE->TWO->THREE:

      • The request/requestError functions will run in the same order ONE->TWO->THREE.
      • The response/responseError functions will run in reversed order THREE->TWO->ONE.

Logging and Debugging

We highly recommend to use CabinJS as your Node.js and JavaScript logging utility (see Automatic Request Logging for complete examples).

Logging Requests and Responses

You can log both requests and/or responses made to fetch internally in Frisbee. Simply pass a logRequest and/or logResponse function.

logRequest accepts two arguments path (String) and opts (Object) and these two arguments are what we call fetch with internally (e.g. fetch(path, opts)):

const cabin = require('cabin');
const frisbee = require('frisbee');
const pino = require('pino')({
  customLevels: {
    log: 30
  },
  hooks: {
    // <https://github.com/pinojs/pino/blob/master/docs/api.md#logmethod>
    logMethod(inputArgs, method) {
      return method.call(this, {
        // <https://github.com/pinojs/pino/issues/854>
        // message: inputArgs[0],
        msg: inputArgs[0],
        meta: inputArgs[1]
      });
    }
  }
});

const logger = new Cabin({
  // (optional: your free API key from https://cabinjs.com)
  // key: 'YOUR-CABIN-API-KEY',
  axe: { logger: pino }
});

const api = new Frisbee({
  logRequest: (path, opts) => {
    logger.info('fetch request', { path, opts });
  }
});

logResponse accepts three arguments, the first two are the same as logRequest (e.g. path and opts), but the third argument is response (Object) and is the raw response object returned from fetch (e.g. const response = await fetch(path, opts)):

const cabin = require('cabin');
const frisbee = require('frisbee');
const pino = require('pino')({
  customLevels: {
    log: 30
  }
});

const logger = new Cabin({
  // (optional: your free API key from https://cabinjs.com)
  // key: 'YOUR-CABIN-API-KEY',
  axe: { logger: pino }
});

const api = new Frisbee({
  logResponse: (path, opts, res) => {
    logger.info('fetch response', { path, opts, res });
  }
});

Debug Statements

You can run your application with DEBUG=frisbee node app.js to output debug logging statements with Frisbee.

Common Issues

Required Features

This list is sourced from ESLint output and polyfilled settings through eslint-plugin-compat.

  • Array.from() is not supported in IE 11
  • Object.getOwnPropertyDescriptors() is not supported in IE 11
  • Object.getOwnPropertySymbols() is not supported in IE 11
  • Promise is not supported in Opera Mini all, IE Mobile 11, IE 11
  • Promise.race() is not supported in Opera Mini all, IE Mobile 11, IE 11
  • Promise.reject() is not supported in Opera Mini all, IE Mobile 11, IE 11
  • Promise.resolve() is not supported in Opera Mini all, IE Mobile 11, IE 11
  • Reflect is not supported in IE 11
  • Symbol.for() is not supported in IE 11
  • Symbol.iterator() is not supported in IE 11
  • Symbol.prototype() is not supported in IE 11
  • Symbol.species() is not supported in IE 11
  • Symbol.toPrimitive() is not supported in IE 11
  • Symbol.toStringTag() is not supported in IE 11
  • Uint8Array is not supported in IE Mobile 11

Frequently Asked Questions

How do I unset a default header

Simply set its value to null, '', or undefined – and it will be unset and removed from the headers sent with your request.

A common use case for this is when you are attempting to use FormData and need the content boundary automatically added.

Why do my form uploads randomly fail with React Native

This is due to a bug with setting the boundary. For more information and temporary workaround if you are affected please see facebook/react-native#7564 (comment).

Does this support callbacks, promises, or both

As of version 1.0.0 we have dropped support for callbacks, it now only supports Promises.

What is the fetch method

It is a WHATWG browser API specification. You can read more about at the following links:

Does the Browser or Node.js support fetch yet

Yes, a lot of browsers are now supporting it! See this reference for more information http://caniuse.com/#feat=fetch.

If my engine does not support fetch yet, is there a polyfill

Yes you can use the fetch method (polyfill) from whatwg-fetch or node-fetch.

By default, React Native already has a built-in fetch out of the box!

Can I make fetch support older browsers

Yes, but you'll need a promise polyfill for older browsers.

What is this project about

Use this package as a universal API wrapper for integrating your API in your client-side or server-side projects.

It's a better working alternative (and with less headaches; at least for me) – for talking to your API – than superagent and the default fetch Network method provide.

Use it for projects in Node, React, Angular, React Native, ...

It supports and is tested for both client-side usage (e.g. with Bower, Browserify, or Webpack, with whatwg-fetch) and also server-side (with node-fetch).

Why not just use superagent or fetch

See Background for more information.

Want to build an API back-end with Node.js

See Lad as a great starting point, and read this article about building Node.js API's with authentication.

Need help or want to request a feature

File an issue on GitHub and we'll try our best help you out.

Tests

This package is tested to work with whatwg-fetch and node-fetch.

This means that it is compatible for both client-side and server-side usage.

Development

  1. Fork/clone this repository
  2. Run npm install
  3. Run npm run watch to watch the src directory for changes
  4. Make changes in src directory
  5. Write unit tests in /test/ if you add more stuff
  6. Run npm test when you're done
  7. Submit a pull request

Background

The docs suggest that you use superagent with React Native, but in our experience it did not work properly, therefore we went with the next best solution, the Github fetch API polyfill included with React Native. After having several issues trying to use fetch and writing our own API wrapper for a project with it (and running into roadblocks along the way) – we decided to publish this.

Here were the issues we discovered/filed related to this:

We know that solutions like superagent exist, but they don't seem to work well with React Native (which was our use case for this package).

In addition, the authors of WHATWG's fetch API only support throwing errors instead of catching them and bubbling them up to the callback/promise (for example, with Frisbee any HTTP or API errors are found in the res.err object).

Therefore we created frisbee to serve as our API glue, and hopefully it'll serve as yours too.

Contributors

Name Website
Nick Baugh http://niftylettuce.com/
Alexis Tyler
Assem-Hafez
Jordan Denison
James
Sampsa Saarela
Julien Moutte
Charles Soetan
Kesha Antonov
Ben Turley
Richard Evans
Hawken Rives
Fernando Montoya
Brent Vatne
Hosmel Quintana
Kyle Kirbatski
Adam Jenkins

Credits

License

MIT © Nick Baugh

More Repositories

1

superagent

Ajax for Node.js and browsers (JS HTTP client). Maintained for @forwardemail, @ladjs, @spamscanner, @breejs, @cabinjs, and @lassjs.
JavaScript
16,475
star
2

supertest

🕷 Super-agent driven library for testing node.js HTTP servers using a fluent API. Maintained for @forwardemail, @ladjs, @spamscanner, @breejs, @cabinjs, and @lassjs.
JavaScript
13,355
star
3

lad

Node.js framework made by a former @expressjs TC and @koajs team member. Built for @forwardemail, @spamscanner, @breejs, @cabinjs, and @lassjs.
JavaScript
2,250
star
4

react-native-loading-spinner-overlay

💈 React Native loading spinner overlay
JavaScript
1,583
star
5

express-cdn

☁️ Node module for delivering optimized, minified, mangled, gzipped assets with Express and Amazon's CDN (S3/CloudFront)
JavaScript
662
star
6

react-native-phone-verification

The best React Native example for phone verification (an alternative to Twitter Digits).
JavaScript
374
star
7

frappe

🆓 Remotely shake your Android devices (including emulators) using a menubar applet and the hotkey ⌘+SHIFT+R
JavaScript
215
star
8

dotenv-parse-variables

Parse dotenv files for Boolean, Array, and Number variable types, built for Lad
JavaScript
122
star
9

i18n-locales

List of locales for i18n
JavaScript
72
star
10

graceful

Gracefully exit HTTP servers (Express/Koa/Fastify/etc), databases (Mongo/Mongoose), Redis clients, Bree job schedulers, and custom handlers.
JavaScript
66
star
11

koa-better-error-handler

A better error-handler for Lad and Koa. Makes `ctx.throw` awesome (best used with koa-404-handler)
JavaScript
52
star
12

chalkline

💄 Draw a big chalkline in your terminal! Great for debugging and reading your log output locally!
JavaScript
35
star
13

cache-pug-templates

Cache Pug templates for Lad/Koa/Express/Connect with Redis
JavaScript
26
star
14

mongoose-slug-plugin

Slugs for Mongoose with history and i18n support (uses speakingurl by default, but you can use any slug library such as limax, slugify, mollusc, or slugme)
JavaScript
22
star
15

express-cachebuster

Provides cross-browser version-control/cache-busting as a dynamic view helper in express.
JavaScript
22
star
16

gulp-jade-usemin

Gulp plugin for running usemin on Jade files
JavaScript
21
star
17

max-listeners-exceeded-warning

Debug and detect "MaxListenersExceededWarning: Possible EventEmitter memory leak detected warnings"
JavaScript
19
star
18

country-language

Query any country's spoken languages or countries where a language is spoken.
JavaScript
12
star
19

mandarin

Automatic i18n phrase translation using Google Translate
JavaScript
12
star
20

i18n

i18n wrapper and Koa middleware for Lad
JavaScript
10
star
21

naivebayes

A ladjs naivebayes package forked from `https://github.com/surmon-china/naivebayes`
JavaScript
10
star
22

web

Web server for Lad
JavaScript
9
star
23

koa-better-flash

Flash message middleware for Koa and Passport
JavaScript
9
star
24

env

Environment configuration loader for Lad
JavaScript
8
star
25

mongoose-common-plugin

Common plugin for Mongoose with standard schema fields and localization support
JavaScript
8
star
26

check-chai

✅ Adds chai helper function `chai.check` for asynchronous testing with multiple expect or assert statements
JavaScript
8
star
27

koa-404-handler

404 handler for Lad and Koa (best used with koa-better-error-handler)
JavaScript
7
star
28

mongoose-validation-error-transform

Automatically transform Mongoose validation error message(s) to a humanized and readable format
JavaScript
7
star
29

express-cdn-cloudfront

Add-on module for express-cdn to provide Amazon CloudFront integration with Amazon S3.
7
star
30

passport

Passport for Lad
JavaScript
6
star
31

lad.sh

Demo for Lad - The Best Node.js Framework
JavaScript
6
star
32

remark-preset-github

GitHub markdown and prose style
JavaScript
6
star
33

dayjs-with-plugins

Day.js with all plugins and locales added out of the box, no need to use dayjs.extend!
JavaScript
6
star
34

is-string-and-not-blank

3x as fast as is-whitespace and whitespace-regex thanks to is-string-blank. This package is a simple function that accepts an argument and returns true if it is a string AND it is not blank.
JavaScript
5
star
35

redis

Redis for Lad
JavaScript
5
star
36

koa-meta

SEO <title> and <meta name="description"> middleware for Koa and Lad
JavaScript
5
star
37

koa-cache-responses

Caching middleware for Koa using koa-cash and route pattern-based matching with path-to-regexp. Made for Lad.
JavaScript
5
star
38

express-cdn-cloudfiles

Add-on module for express-cdn to provide Rackspace CloudFiles integration with built-in Akamai CDN delivery.
5
star
39

lookerupper

✨ :octocat: Copy to your clipboard a package's name and use `CmdOrCtrl+Shift+L` to lookup its documentation on GitHub
JavaScript
5
star
40

express-redirect-loop

Prevent redirect loops with sessions since HTTP referrer header is unreliable
JavaScript
4
star
41

get-paths

Helper function to get an absolute path for a template engine view
JavaScript
4
star
42

spdy-or-http2

Node.js ponyfill for HTTP/2 support (uses native http2 module or falls back to spdy)
JavaScript
4
star
43

proxy

Proxy for Lad
JavaScript
4
star
44

api

API server for Lad
JavaScript
4
star
45

koa-views-render

Simple render(page, locals) middleware for Koa and Lad (uses koa-views)
JavaScript
4
star
46

koa-better-timeout

Response timeout middleware for Koa and Lad (uses Boom by default)
JavaScript
4
star
47

express-jade

Express middleware to compile client-side Jade templates as template functions in the `window.jade` namespace.
JavaScript
4
star
48

koa-redis-ratelimit

*DOES NOT WORK DUE TO `ratelimiter`, PLEASE USE https://github.com/scttcper/koa-simple-ratelimit INSTEAD* Rate limiting middleware backed by Redis for Koa v2+, built for 🐊 CrocodileJS
JavaScript
3
star
49

mongoose

Mongoose helper for Lad
JavaScript
3
star
50

koa-redirect-loop

Prevent redirect loops with sessions since HTTP referrer header is unreliable and ensures sessions are saved upon redirect
JavaScript
3
star
51

store-ip-address

Stores a user's IP address in the background for Lad
JavaScript
3
star
52

message-headers

Automatically updated list of RFC HTTP permanent and provisional headers from IANA (https://www.iana.org/assignments/message-headers/message-headers.xhtml)
JavaScript
3
star
53

mongoose-omit-common-fields

Array of common fields to emit for Mongoose toObject/toJSON (helpful for security)
JavaScript
3
star
54

mongoose-model-agenda

Mongoose model for Agenda
JavaScript
3
star
55

express-cdn-cloudflare

Add-on module for express-cdn to provide CloudFlare CDN integration with Amazon S3.
3
star
56

koa-better-static

Static file serving middleware for Koa. Forked from an inactive project and maintained for Lad.
JavaScript
3
star
57

koa-manifest-rev

Dynamically load assets into your views from your `rev-manifest.json` manifest revision file.
JavaScript
3
star
58

stop-agenda

Gracefully stop Agenda and cancel recurring jobs
JavaScript
2
star
59

assets

Assets for Lad
JavaScript
2
star
60

policies

Policies helper for Lad
JavaScript
2
star
61

shared-config

Shared configuration for Lad's API and Web servers
JavaScript
2
star
62

manifest-rev

Dynamically load assets into your views, emails, etc. from your `rev-manifest.json` manifest revision file.
JavaScript
2
star
63

gulp-envify

Gulp plugin for envify without browserify (maintained fork of https://github.com/tomashanacek/gulp-envify)
JavaScript
2
star
64

preserve-qs

Preserve querystrings during redirect and creating new URLs for Node.js and browser environments (supports Lad, Koa, Express, and Connect)
JavaScript
2
star
65

juice-resources-promise

Simple helper function to convert juice.juiceResources into a Promise
JavaScript
2
star
66

gulp-haschanged-deps-async

Deep dependency recursive modified time comparison to ensure your files only re-compile when needed
JavaScript
2
star
67

pick-original

Transform an Object that was transformed to return only the original properties recursively picked if they are not undefined.
JavaScript
1
star
68

koa-cors-gate

JavaScript
1
star
69

store-sessions

Store/manage user sessions in the background for Lad
JavaScript
1
star
70

mongoose-error-messages

Better error messages for Mongoose, built for Lad
JavaScript
1
star
71

lad-template

sao template for lad
JavaScript
1
star
72

state-helper

State helper for Lad
JavaScript
1
star
73

agenda

Agenda for Lad
JavaScript
1
star
74

bull

Bull for Lad
JavaScript
1
star
75

browserslist-config

Browserslist config for Lad
JavaScript
1
star