/query-fns

๐Ÿ” Parse and stringify URL search params.

Primary LanguageJavaScriptMIT LicenseMIT

query-fns ยท GitHub license Coverage Status CircleCI Status PRs Welcome

Parse and stringify URL search params.

  • Modular โ€“ only import the stuff you need.
  • Extendable - write your own formatters to support any query string format.

Installation

yarn add query-fns

or

npm install query-fns

Usage

Import the package using:

import { stringify, parse } from 'query-fns';

or specify what to import to save some bytes:

import stringify from 'query-fns/stringify';
import parse from 'query-fns/parse';

Parse

Use the parse method to convert a query string in to an object.

parse('?foo=bar');
// => { foo: 'bar' }

parse('?foo=bar&baz=qee');
// => { foo: 'bar', baz: 'qee' }

Stringify

Use the stringify method to convert an object in to a query string.

stringify({ foo: 'bar' });
// => foo=bar

stringify({ foo: 'bar', baz: 'qee' });
// => foo=bar&baz=qee

API

parse(string, options) => Object

option default description
decode true Use decodeURIComponent on the keys and values before adding them to the returned object.
formatter default See formatters section.

stringify(object, options) => string

option default description
encode true Use encodeURIComponent on the keys and values before adding them to the returned string.
formatter default See formatters section.

Formatters

Since there is more than one way of formatting a query string, we need a way of telling the library how to stringify and parse the input. For this we have formatters.

There is a default formatter used that will work for most cases, but if you need something more advanced like arrays or nested objects you can use a custom formatter.

To use a custom formatter, simply import it and tell the parse or stringify method to use it.

import { JSONAPIFormatter } from 'query-fns/formatters';
// import JSONAPIFormatter from 'query-fns/formatters/jsonapi';

parse('?foo[bar]=qux', { formatter: JSONAPIFormatter });
// => { foo: { bar: ['qux'] } }

Built-in formatters

defaultFormatter

The default formatter will be used if you don't specify a formatter in the options object.

stringify parse
foo=bar { foo: 'bar' }
foo=bar&bar=baz { foo: 'bar', bar: 'baz' }
foo=bar&foo=baz { foo: ['bar', 'baz'] }

bracketFormatter

The brackets formatter adds support for creating arrays using brackets.

stringify parse
?foo[]=bar { foo: ['bar'] }
?foo[]=bar&foo[]=baz { foo: ['bar', 'baz'] }
?foo[]=bar&baz=qux { foo: ['bar'], baz: 'qux' }

JSONAPIFormatter

The JSONAPI formatter aims to support the format recommended on the JSONAPI website.

stringify parse
?foo[bar]=qux { foo: { bar: ['qux'] } }
?foo[bar]=qux,baz { foo: { bar: ['qux', 'baz'] } }
?foo[bar]=qux&bar[foo]=baz { foo: { bar: ['qux'] }, bar: { foo: ['baz'] } }

Create your own formatter

If none of the built-in formatters supports your format, it's easy to build your own. A formatter is an object with two properties with functions as values; parse and stringify.

const myCustomFormatter = {
  parse: (key, value, accumulator, options) => { key: '', value: {} },
  stringify: (key, value, source, options) => '',
};

parse('?foo=bar', { formatter: myCustomFormatter });
stringify({ foo: 'bar' }, { formatter: myCustomFormatter });

parse(key, value, accumulator, options) => { key: string, value: any }

The parse function will split the query string at every & and run your formatter on every value in that array.

The expected return is an Object containing { key: string, value: any }.

parameter type description
key string Whatever is on the left side of the =.
value string Whatever is on the right side of the =.
accumulator string The current output value.
options Object The options object.

Important: If you build your own formatter, it's up to you to consider the user options like decode. The library won't do any formatting for you.

stringify(key, value, source, options) => string

The stringify function will run your formatter for every key: value of the input value, and it's up to your formatter to reduce that in to an string.

The expected return is a string.

parameter type description
key string The property key.
value any The value for the current key.
source Object The object the user put in.
options Object The options object.

Important: If you build your own formatter, it's up to you to consider the user options like encode. The library won't do any formatting for you.

Develop

If you want to improve the library, the easiest way to get started is by cloning the repo, and then running:

yarn install
yarn start

This will start jest in watch mode. In this way you can develop new features and make sure that everything is working as it should.

The recommended way of creating new features or formatters is to first create the tests in either test/parse.test.js or test/stringify.test.js, and then make sure that they pass.

It's also recommended that you run yarn start with the --coverage flag before submitting any pull requests, to make sure that all your new code has test coverage.

Contributing

You can contribute by submitting an issue or by creating a new pull request.

Issues and bugs

If you've discoved a bug, please create a new issue including the steps to reproduce the problem.

Pull requests

If you want to help improve this library, feel free to create a pull request with new features or bugfixes.

The aim is to have:

  • 90%+ flow coverage
  • 100% test coverage

To check this, refer to the develop section.