Skip to content

Commit f958329

Browse files
felixoisindresorhus
authored andcommitted
Add parseBooleans option to .parse() (#183)
1 parent 3ccd68d commit f958329

5 files changed

Lines changed: 49 additions & 4 deletions

File tree

index.d.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,23 @@ export interface ParseOptions {
7474
```
7575
*/
7676
readonly parseNumbers?: boolean;
77+
78+
/**
79+
Parse the value as a boolean type instead of string type if it's a boolean.
80+
81+
@default false
82+
83+
@example
84+
```
85+
queryString.parse('foo=true', {parseBooleans: true});
86+
//=> {foo: true}
87+
```
88+
*/
89+
readonly parseBooleans?: boolean;
7790
}
7891

7992
export interface ParsedQuery {
80-
readonly [key: string]: string | number | Array<string | number> | null | undefined;
93+
readonly [key: string]: string | number | boolean | Array<string | number | boolean> | null | undefined;
8194
}
8295

8396
/**

index.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,8 @@ function parse(input, options) {
176176
decode: true,
177177
sort: true,
178178
arrayFormat: 'none',
179-
parseNumbers: false
179+
parseNumbers: false,
180+
parseBooleans: false
180181
}, options);
181182

182183
const formatter = parserForArrayFormat(options);
@@ -205,6 +206,10 @@ function parse(input, options) {
205206
value = Number(value);
206207
}
207208

209+
if (options.parseBooleans && value !== null && (value.toLowerCase() === 'true' || value.toLowerCase() === 'false')) {
210+
value = value.toLowerCase() === 'true';
211+
}
212+
208213
formatter(decode(key, options), value, ret);
209214
}
210215

index.test-d.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ expectType<queryString.ParsedQuery>(
5454
expectType<queryString.ParsedQuery>(
5555
queryString.parse('?foo=1', {parseNumbers: true})
5656
);
57+
expectType<queryString.ParsedQuery>(
58+
queryString.parse('?foo=true', {parseBooleans: true})
59+
);
5760

5861
// Parse URL
5962
expectType<queryString.ParsedUrl>(queryString.parseUrl('?foo=bar'));
@@ -73,8 +76,11 @@ expectType<queryString.ParsedUrl>(
7376
expectType<queryString.ParsedUrl>(
7477
queryString.parseUrl('?foo=bar', {arrayFormat: 'comma'})
7578
);
76-
expectType<queryString.ParsedQuery>(
77-
queryString.parse('?foo=1', {parseNumbers: true})
79+
expectType<queryString.ParsedUrl>(
80+
queryString.parseUrl('?foo=1', {parseNumbers: true})
81+
);
82+
expectType<queryString.ParsedUrl>(
83+
queryString.parseUrl('?foo=true', {parseBooleans: true})
7884
);
7985

8086
// Extract

readme.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,18 @@ queryString.parse('foo=1', {parseNumbers: true});
115115

116116
Parse the value as a number type instead of string type if it's a number.
117117

118+
##### parseBooleans
119+
120+
Type: `boolean`<br>
121+
Default: `false`
122+
123+
```js
124+
queryString.parse('foo=true', {parseBooleans: true});
125+
//=> {foo: true}
126+
```
127+
128+
Parse the value as a boolean type instead of string type if it's a boolean.
129+
118130
### .stringify(object, [options])
119131

120132
Stringify an object into a query string and sorting the keys.

test/parse.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,3 +244,12 @@ test('NaN value returns as string if option is set', t => {
244244
t.deepEqual(queryString.parse('foo=undefined', {parseNumbers: true}), {foo: 'undefined'});
245245
t.deepEqual(queryString.parse('foo=100a&bar=100', {parseNumbers: true}), {foo: '100a', bar: 100});
246246
});
247+
248+
test('boolean value returns as string by default', t => {
249+
t.deepEqual(queryString.parse('foo=true'), {foo: 'true'});
250+
});
251+
252+
test('boolean value returns as boolean if option is set', t => {
253+
t.deepEqual(queryString.parse('foo=true', {parseBooleans: true}), {foo: true});
254+
t.deepEqual(queryString.parse('foo=false&bar=true', {parseBooleans: true}), {foo: false, bar: true});
255+
});

0 commit comments

Comments
 (0)