Parse and stringify URL query strings
import * as queryString from "https://deno.land/x/[email protected]/mod.js";
const query = { foo: "foo", ilike: ["ilike", 1] };
console.log(queryString.stringify(query, { arrayFormat: "comma" }));
//=> foo=foo&ilike=ilike,1
Parse a query string into an object. Leading ?
or #
are ignored, so you can pass location.search
or location.hash
directly.
The returned object is created with Object.create(null)
and thus does not have a prototype
.
Type: object
Type: boolean
Default: true
Decode the keys and values. URL components are decoded with decode-uri-component
.
Type: string
Default: 'none'
'bracket'
: Parse arrays with bracket representation:
import * as queryString from "https://deno.land/x/[email protected]/mod.js";
queryString.parse("foo[]=1&foo[]=2&foo[]=3", { arrayFormat: "bracket" });
//=> {foo: ['1', '2', '3']}
'index'
: Parse arrays with index representation:
import * as queryString from "https://deno.land/x/[email protected]/mod.js";
queryString.parse("foo[0]=1&foo[1]=2&foo[3]=3", { arrayFormat: "index" });
//=> {foo: ['1', '2', '3']}
'comma'
: Parse arrays with elements separated by comma:
import * as queryString from "https://deno.land/x/[email protected]/mod.js";
queryString.parse("foo=1,2,3", { arrayFormat: "comma" });
//=> {foo: ['1', '2', '3']}
'separator'
: Parse arrays with elements separated by a custom character:
import * as queryString from "https://deno.land/x/[email protected]/mod.js";
queryString.parse("foo=1|2|3", { arrayFormat: "separator", arrayFormatSeparator: "|" });
//=> {foo: ['1', '2', '3']}
'bracket-separator'
: Parse arrays (that are explicitly marked with brackets) with elements separated by a custom character:
import * as queryString from "https://deno.land/x/[email protected]/mod.js";
queryString.parse("foo[]", { arrayFormat: "bracket-separator", arrayFormatSeparator: "|" });
//=> {foo: []}
queryString.parse("foo[]=", { arrayFormat: "bracket-separator", arrayFormatSeparator: "|" });
//=> {foo: ['']}
queryString.parse("foo[]=1", { arrayFormat: "bracket-separator", arrayFormatSeparator: "|" });
//=> {foo: ['1']}
queryString.parse("foo[]=1|2|3", { arrayFormat: "bracket-separator", arrayFormatSeparator: "|" });
//=> {foo: ['1', '2', '3']}
queryString.parse("foo[]=1||3|||6", { arrayFormat: "bracket-separator", arrayFormatSeparator: "|" });
//=> {foo: ['1', '', 3, '', '', '6']}
queryString.parse("foo[]=1|2|3&bar=fluffy&baz[]=4", { arrayFormat: "bracket-separator", arrayFormatSeparator: "|" });
//=> {foo: ['1', '2', '3'], bar: 'fluffy', baz:['4']}
'none'
: Parse arrays with elements using duplicate keys:
import * as queryString from "https://deno.land/x/[email protected]/mod.js";
queryString.parse("foo=1&foo=2&foo=3");
//=> {foo: ['1', '2', '3']}
Type: string
Default: ','
The character used to separate array elements when using {arrayFormat: 'separator'}
.
Type: Function | boolean
Default: true
Supports both Function
as a custom sorting function or false
to disable sorting.
Type: boolean
Default: false
import * as queryString from "https://deno.land/x/[email protected]/mod.js";
queryString.parse("foo=1", { parseNumbers: true });
//=> {foo: 1}
Parse the value as a number type instead of string type if it's a number.
Type: boolean
Default: false
import * as queryString from "https://deno.land/x/[email protected]/mod.js";
queryString.parse("foo=true", { parseBooleans: true });
//=> {foo: true}
Parse the value as a boolean type instead of string type if it's a boolean.
Stringify an object into a query string and sorting the keys.
Type: object
Type: boolean
Default: true
Strictly encode URI components with strict-uri-encode. It uses encodeURIComponent if set to false. You probably don't care about this option.
Type: boolean
Default: true
URL encode the keys and values.
Type: string
Default: 'none'
'bracket'
: Serialize arrays using bracket representation:
import * as queryString from "https://deno.land/x/[email protected]/mod.js";
queryString.stringify({ foo: [1, 2, 3] }, { arrayFormat: "bracket" });
//=> 'foo[]=1&foo[]=2&foo[]=3'
'index'
: Serialize arrays using index representation:
import * as queryString from "https://deno.land/x/[email protected]/mod.js";
queryString.stringify({ foo: [1, 2, 3] }, { arrayFormat: "index" });
//=> 'foo[0]=1&foo[1]=2&foo[2]=3'
'comma'
: Serialize arrays by separating elements with comma:
import * as queryString from "https://deno.land/x/[email protected]/mod.js";
queryString.stringify({ foo: [1, 2, 3] }, { arrayFormat: "comma" });
//=> 'foo=1,2,3'
queryString.stringify({ foo: [1, null, ""] }, { arrayFormat: "comma" });
//=> 'foo=1,,'
// Note that typing information for null values is lost
// and `.parse('foo=1,,')` would return `{foo: [1, '', '']}`.
'separator'
: Serialize arrays by separating elements with a custom character:
import * as queryString from "https://deno.land/x/[email protected]/mod.js";
queryString.stringify({ foo: [1, 2, 3] }, { arrayFormat: "separator", arrayFormatSeparator: "|" });
//=> 'foo=1|2|3'
'bracket-separator'
: Serialize arrays by explicitly post-fixing array names with brackets and separating elements with a custom character:
import * as queryString from "https://deno.land/x/[email protected]/mod.js";
queryString.stringify({ foo: [] }, { arrayFormat: "bracket-separator", arrayFormatSeparator: "|" });
//=> 'foo[]'
queryString.stringify({ foo: [""] }, { arrayFormat: "bracket-separator", arrayFormatSeparator: "|" });
//=> 'foo[]='
queryString.stringify({ foo: [1] }, { arrayFormat: "bracket-separator", arrayFormatSeparator: "|" });
//=> 'foo[]=1'
queryString.stringify({ foo: [1, 2, 3] }, { arrayFormat: "bracket-separator", arrayFormatSeparator: "|" });
//=> 'foo[]=1|2|3'
queryString.stringify({ foo: [1, "", 3, null, null, 6] }, { arrayFormat: "bracket-separator", arrayFormatSeparator: "|" });
//=> 'foo[]=1||3|||6'
queryString.stringify(
{ foo: [1, "", 3, null, null, 6] },
{ arrayFormat: "bracket-separator", arrayFormatSeparator: "|", skipNull: true }
);
//=> 'foo[]=1||3|6'
queryString.stringify(
{ foo: [1, 2, 3], bar: "fluffy", baz: [4] },
{ arrayFormat: "bracket-separator", arrayFormatSeparator: "|" }
);
//=> 'foo[]=1|2|3&bar=fluffy&baz[]=4'
'none'
: Serialize arrays by using duplicate keys:
import * as queryString from "https://deno.land/x/[email protected]/mod.js";
queryString.stringify({ foo: [1, 2, 3] });
//=> 'foo=1&foo=2&foo=3'
Type: string
Default: ','
The character used to separate array elements when using {arrayFormat: 'separator'}
.
Type: Function | boolean
Supports both Function
as a custom sorting function or false
to disable sorting.
import * as queryString from "https://deno.land/x/[email protected]/mod.js";
const order = ["c", "a", "b"];
queryString.stringify(
{ a: 1, b: 2, c: 3 },
{
sort: (a, b) => order.indexOf(a) - order.indexOf(b),
}
);
//=> 'c=3&a=1&b=2'
import * as queryString from "https://deno.land/x/[email protected]/mod.js";
queryString.stringify({ b: 1, c: 2, a: 3 }, { sort: false });
//=> 'b=1&c=2&a=3'
If omitted, keys are sorted using Array#sort()
, which means, converting them to strings and comparing strings in Unicode code point order.
Skip keys with null
as the value.
Note that keys with undefined
as the value are always skipped.
Type: boolean
Default: false
import * as queryString from "https://deno.land/x/[email protected]/mod.js";
queryString.stringify(
{ a: 1, b: undefined, c: null, d: 4 },
{
skipNull: true,
}
);
//=> 'a=1&d=4'
import * as queryString from "https://deno.land/x/[email protected]/mod.js";
queryString.stringify(
{ a: undefined, b: null },
{
skipNull: true,
}
);
//=> ''
Skip keys with an empty string as the value.
Type: boolean
Default: false
import * as queryString from "https://deno.land/x/[email protected]/mod.js";
queryString.stringify(
{ a: 1, b: "", c: "", d: 4 },
{
skipEmptyString: true,
}
);
//=> 'a=1&d=4'
import * as queryString from "https://deno.land/x/[email protected]/mod.js";
queryString.stringify(
{ a: "", b: "" },
{
skipEmptyString: true,
}
);
//=> ''
Extract a query string from a URL that can be passed into .parse()
.
Note: This behaviour can be changed with the skipNull
option.
Extract the URL and the query string as an object.
Returns an object with a url
and query
property.
If the parseFragmentIdentifier
option is true
, the object will also contain a fragmentIdentifier
property.
import * as queryString from "https://deno.land/x/[email protected]/mod.js";
queryString.parseUrl("https://foo.bar?foo=bar");
//=> {url: 'https://foo.bar', query: {foo: 'bar'}}
queryString.parseUrl("https://foo.bar?foo=bar#xyz", { parseFragmentIdentifier: true });
//=> {url: 'https://foo.bar', query: {foo: 'bar'}, fragmentIdentifier: 'xyz'}
Type: object
The options are the same as for .parse()
.
Extra options are as below.
Parse the fragment identifier from the URL.
Type: boolean
Default: false
import * as queryString from "https://deno.land/x/[email protected]/mod.js";
queryString.parseUrl("https://foo.bar?foo=bar#xyz", { parseFragmentIdentifier: true });
//=> {url: 'https://foo.bar', query: {foo: 'bar'}, fragmentIdentifier: 'xyz'}
Stringify an object into a URL with a query string and sorting the keys. The inverse of .parseUrl()
The options
are the same as for .stringify()
.
Returns a string with the URL and a query string.
Query items in the query
property overrides queries in the url
property.
The fragmentIdentifier
property overrides the fragment identifier in the url
property.
queryString.stringifyUrl({ url: "https://foo.bar", query: { foo: "bar" } });
//=> 'https://foo.bar?foo=bar'
queryString.stringifyUrl({ url: "https://foo.bar?foo=baz", query: { foo: "bar" } });
//=> 'https://foo.bar?foo=bar'
queryString.stringifyUrl({
url: "https://foo.bar",
query: {
top: "foo",
},
fragmentIdentifier: "bar",
});
//=> 'https://foo.bar?top=foo#bar'
Type: object
Type: string
The URL to stringify.
Type: object
Query items to add to the URL.
Pick query parameters from a URL.
Returns a string with the new URL.
import * as queryString from "https://deno.land/x/[email protected]/mod.js";
queryString.pick("https://foo.bar?foo=1&bar=2#hello", ["foo"]);
//=> 'https://foo.bar?foo=1#hello'
queryString.pick("https://foo.bar?foo=1&bar=2#hello", (name, value) => value === 2, { parseNumbers: true });
//=> 'https://foo.bar?bar=2#hello'
Exclude query parameters from a URL.
Returns a string with the new URL.
import * as queryString from "https://deno.land/x/[email protected]/mod.js";
queryString.exclude("https://foo.bar?foo=1&bar=2#hello", ["foo"]);
//=> 'https://foo.bar?bar=2#hello'
queryString.exclude("https://foo.bar?foo=1&bar=2#hello", (name, value) => value === 2, { parseNumbers: true });
//=> 'https://foo.bar?foo=1#hello'
Type: string
The URL containing the query parameters to filter.
Type: string[]
The names of the query parameters to filter based on the function used.
Type: (key, value) => boolean
A filter predicate that will be provided the name of each query parameter and its value. The parseNumbers
and parseBooleans
options also affect value
.
Type: object
Parse options and stringify options.
This module intentionally doesn't support nesting as it's not spec'd and varies between implementations, which causes a lot of edge cases.
You're much better off just converting the object to a JSON string:
import * as queryString from "https://deno.land/x/[email protected]/mod.js";
queryString.stringify({
foo: "bar",
nested: JSON.stringify({
unicorn: "cake",
}),
});
//=> 'foo=bar&nested=%7B%22unicorn%22%3A%22cake%22%7D'
However, there is support for multiple instances of the same key:
import * as queryString from "https://deno.land/x/[email protected]/mod.js";
queryString.parse("likes=cake&name=bob&likes=icecream");
//=> {likes: ['cake', 'icecream'], name: 'bob'}
queryString.stringify({ color: ["taupe", "chartreuse"], id: "515" });
//=> 'color=taupe&color=chartreuse&id=515'
Sometimes you want to unset a key, or maybe just make it present without assigning a value to it. Here is how falsy values are stringified:
import * as queryString from "https://deno.land/x/[email protected]/mod.js";
queryString.stringify({ foo: false });
//=> 'foo=false'
queryString.stringify({ foo: null });
//=> 'foo'
queryString.stringify({ foo: undefined });
//=> ''