Skip to content
This repository was archived by the owner on May 1, 2021. It is now read-only.

Commit f6166a2

Browse files
committed
Add withDefault
1 parent 82b4ad0 commit f6166a2

File tree

6 files changed

+61
-9
lines changed

6 files changed

+61
-9
lines changed

README.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,20 @@ Examples in this table assume query parameter named `qp`.
6868
| DelimitedArrayParam | string[] | `['a','b','c']` | `?qp=a_b_c'` |
6969
| DelimitedNumericArrayParam | number[] | `[1, 2, 3]` | `?qp=1_2_3'` |
7070

71+
**Setting a default value**
72+
73+
If you'd like to have a default value, you can wrap your param with `withDefault()`:
74+
75+
```js
76+
import { withDefault, ArrayParam } from 'serialize-query-params';
77+
78+
// by default, nulls are converted to defaults
79+
const NeverNullArrayParam = withDefault(ArrayParam, []);
80+
81+
// if you don't want nulls to be included, pass false as a third arg
82+
const NeverUndefinedArrayParam = withDefault(ArrayParam, [], false);
83+
```
84+
7185
**Example with Custom Param**
7286

7387
You can define your own params if the ones shipped with this package don't work for you. There are included [serialization utility functions](https://github.com/pbeshai/serialize-query-params/blob/master/src/serialize.ts) to make this easier, but you can use whatever you like.

src/decodeQueryParams.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,6 @@ export function decodeQueryParams<QPCMap extends QueryParamConfigMap>(
1616
const paramNames = Object.keys(encodedQuery);
1717
for (const paramName of paramNames) {
1818
const encodedValue = encodedQuery[paramName];
19-
if (encodedValue === undefined) {
20-
decodedQuery[paramName as keyof QPCMap] = undefined;
21-
continue;
22-
}
2319

2420
if (!paramConfigMap[paramName]) {
2521
if (process.env.NODE_ENV === 'development') {

src/encodeQueryParams.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,6 @@ export function encodeQueryParams<QPCMap extends QueryParamConfigMap>(
1616
const paramNames = Object.keys(query);
1717
for (const paramName of paramNames) {
1818
const decodedValue = query[paramName];
19-
if (decodedValue === undefined) {
20-
encodedQuery[paramName as keyof QPCMap] = undefined;
21-
continue;
22-
}
2319

2420
if (!paramConfigMap[paramName]) {
2521
if (process.env.NODE_ENV === 'development') {

src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
export { withDefault } from './withDefault';
2+
13
export {
24
encodeDate,
35
decodeDate,

src/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ export interface QueryParamConfig<D, D2 = D> {
2424
encode: (value: D) => string | (string | null)[] | null | undefined;
2525

2626
/** Convert the query param string value to its native type */
27-
decode: (value: string | (string | null)[] | null) => D2;
27+
decode: (value: string | (string | null)[] | null | undefined) => D2;
2828
}
2929

3030
/**

src/withDefault.ts

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import { QueryParamConfig } from './types';
2+
3+
/**
4+
* Wrap a given parameter with a default value when undefined or null (optionally, default includes null)
5+
* @param param QueryParamConfig - { encode, decode} to serialize a parameter
6+
* @param defaultValue A default value
7+
* @param includeNull
8+
*/
9+
export function withDefault<D, DefaultType extends D2, D2 = D>(
10+
param: QueryParamConfig<D, D2>,
11+
defaultValue: DefaultType,
12+
includeNull?: false | undefined
13+
): QueryParamConfig<D, Exclude<D2, undefined> | DefaultType>;
14+
export function withDefault<D, DefaultType extends D2, D2 = D>(
15+
param: QueryParamConfig<D, D2>,
16+
defaultValue: DefaultType,
17+
includeNull?: true
18+
): QueryParamConfig<D, Exclude<D2, null | undefined> | DefaultType>;
19+
export function withDefault<D, DefaultType extends D2, D2 = D>(
20+
param: QueryParamConfig<D, D2>,
21+
defaultValue: DefaultType,
22+
includeNull: boolean = true
23+
): QueryParamConfig<D, any | DefaultType> {
24+
const decodeWithDefault = (
25+
...args: Parameters<typeof param.decode>
26+
): Exclude<D2, null | undefined> | Exclude<D2, undefined> | DefaultType => {
27+
const decodedValue = param.decode(...args);
28+
29+
if (decodedValue === undefined) {
30+
return defaultValue;
31+
}
32+
if (includeNull) {
33+
if (decodedValue === null) {
34+
return defaultValue;
35+
} else {
36+
return decodedValue as Exclude<D2, undefined>;
37+
}
38+
}
39+
40+
return decodedValue as Exclude<D2, undefined | null>;
41+
};
42+
return { encode: param.encode, decode: decodeWithDefault };
43+
}
44+
export default withDefault;

0 commit comments

Comments
 (0)