Skip to content
This repository was archived by the owner on May 1, 2021. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,20 @@ Examples in this table assume query parameter named `qp`.
| DelimitedArrayParam | string[] | `['a','b','c']` | `?qp=a_b_c'` |
| DelimitedNumericArrayParam | number[] | `[1, 2, 3]` | `?qp=1_2_3'` |

**Setting a default value**

If you'd like to have a default value, you can wrap your param with `withDefault()`:

```js
import { withDefault, ArrayParam } from 'serialize-query-params';

// by default, nulls are converted to defaults
const NeverNullArrayParam = withDefault(ArrayParam, []);

// if you don't want nulls to be included, pass false as a third arg
const NeverUndefinedArrayParam = withDefault(ArrayParam, [], false);
```

**Example with Custom Param**

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.
Expand Down
4 changes: 0 additions & 4 deletions src/decodeQueryParams.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,6 @@ export function decodeQueryParams<QPCMap extends QueryParamConfigMap>(
const paramNames = Object.keys(encodedQuery);
for (const paramName of paramNames) {
const encodedValue = encodedQuery[paramName];
if (encodedValue === undefined) {
decodedQuery[paramName as keyof QPCMap] = undefined;
continue;
}

if (!paramConfigMap[paramName]) {
if (process.env.NODE_ENV === 'development') {
Expand Down
4 changes: 0 additions & 4 deletions src/encodeQueryParams.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,6 @@ export function encodeQueryParams<QPCMap extends QueryParamConfigMap>(
const paramNames = Object.keys(query);
for (const paramName of paramNames) {
const decodedValue = query[paramName];
if (decodedValue === undefined) {
encodedQuery[paramName as keyof QPCMap] = undefined;
continue;
}

if (!paramConfigMap[paramName]) {
if (process.env.NODE_ENV === 'development') {
Expand Down
2 changes: 2 additions & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
export { withDefault } from './withDefault';

export {
encodeDate,
decodeDate,
Expand Down
2 changes: 1 addition & 1 deletion src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ export interface QueryParamConfig<D, D2 = D> {
encode: (value: D) => string | (string | null)[] | null | undefined;

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

/**
Expand Down
44 changes: 44 additions & 0 deletions src/withDefault.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import { QueryParamConfig } from './types';

/**
* Wrap a given parameter with a default value when undefined or null (optionally, default includes null)
* @param param QueryParamConfig - { encode, decode} to serialize a parameter
* @param defaultValue A default value
* @param includeNull
*/
export function withDefault<D, DefaultType extends D2, D2 = D>(
param: QueryParamConfig<D, D2>,
defaultValue: DefaultType,
includeNull?: false | undefined
): QueryParamConfig<D, Exclude<D2, undefined> | DefaultType>;
export function withDefault<D, DefaultType extends D2, D2 = D>(
param: QueryParamConfig<D, D2>,
defaultValue: DefaultType,
includeNull?: true
): QueryParamConfig<D, Exclude<D2, null | undefined> | DefaultType>;
export function withDefault<D, DefaultType extends D2, D2 = D>(
param: QueryParamConfig<D, D2>,
defaultValue: DefaultType,
includeNull: boolean = true
): QueryParamConfig<D, any | DefaultType> {
const decodeWithDefault = (
...args: Parameters<typeof param.decode>
): Exclude<D2, null | undefined> | Exclude<D2, undefined> | DefaultType => {
const decodedValue = param.decode(...args);

if (decodedValue === undefined) {
return defaultValue;
}
if (includeNull) {
if (decodedValue === null) {
return defaultValue;
} else {
return decodedValue as Exclude<D2, undefined>;
}
}

return decodedValue as Exclude<D2, undefined | null>;
};
return { encode: param.encode, decode: decodeWithDefault };
}
export default withDefault;