Skip to content

Commit f6ca270

Browse files
committed
fix: Handle clearOnDefault in createSerializer
1 parent 97a1ea8 commit f6ca270

File tree

2 files changed

+37
-2
lines changed

2 files changed

+37
-2
lines changed

packages/nuqs/src/serializer.test.ts

+30-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
import { describe, expect, test } from 'vitest'
2-
import { parseAsBoolean, parseAsInteger, parseAsString } from './parsers'
2+
import {
3+
parseAsBoolean,
4+
parseAsInteger,
5+
parseAsString,
6+
parseAsJson,
7+
parseAsArrayOf
8+
} from './parsers'
39
import { createSerializer } from './serializer'
410

511
const parsers = {
@@ -62,4 +68,27 @@ describe('serializer', () => {
6268
const result = serialize('?str=bar&int=-1', { str: 'foo', int: null })
6369
expect(result).toBe('?str=foo')
6470
})
71+
test('clears value when setting the default value when `clearOnDefault` is used', () => {
72+
const serialize = createSerializer({
73+
int: parseAsInteger.withOptions({ clearOnDefault: true }).withDefault(0),
74+
str: parseAsString.withOptions({ clearOnDefault: true }).withDefault(''),
75+
bool: parseAsBoolean
76+
.withOptions({ clearOnDefault: true })
77+
.withDefault(false),
78+
arr: parseAsArrayOf(parseAsString)
79+
.withOptions({ clearOnDefault: true })
80+
.withDefault([]),
81+
json: parseAsJson()
82+
.withOptions({ clearOnDefault: true })
83+
.withDefault({ foo: 'bar' })
84+
})
85+
const result = serialize({
86+
int: 0,
87+
str: '',
88+
bool: false,
89+
arr: [],
90+
json: { foo: 'bar' }
91+
})
92+
expect(result).toBe('')
93+
})
6594
})

packages/nuqs/src/serializer.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,13 @@ export function createSerializer<
4141
if (!parser || value === undefined) {
4242
continue
4343
}
44-
if (value === null) {
44+
const isMatchingDefault =
45+
// @ts-expect-error
46+
parser.defaultValue !== undefined &&
47+
// @ts-expect-error
48+
(parser.eq ?? ((a, b) => a === b))(value, parser.defaultValue)
49+
50+
if (value === null || (parser.clearOnDefault && isMatchingDefault)) {
4551
search.delete(key)
4652
} else {
4753
search.set(key, parser.serialize(value))

0 commit comments

Comments
 (0)