Skip to content

Commit e158622

Browse files
committed
fix: Safe parse everywhere
- Fix actual printout (wrong interpolation) - Improve DX by printing which key failed to parse
1 parent dc76b24 commit e158622

File tree

4 files changed

+19
-8
lines changed

4 files changed

+19
-8
lines changed

packages/nuqs/src/parsers.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -277,10 +277,11 @@ export function parseAsArrayOf<ItemType>(
277277
}
278278
return query
279279
.split(separator)
280-
.map(item =>
280+
.map((item, index) =>
281281
safeParse(
282282
itemParser.parse,
283-
item.replaceAll(encodedSeparator, separator)
283+
item.replaceAll(encodedSeparator, separator),
284+
`[${index}]`
284285
)
285286
)
286287
.filter(value => value !== null && value !== undefined) as ItemType[]

packages/nuqs/src/useQueryState.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ export function useQueryState<T = string>(
230230
: // Components mounted after page load must use the current URL value
231231
new URLSearchParams(location.search).get(key) ?? null
232232
const value = queueValue ?? urlValue
233-
return value === null ? null : safeParse(parse, value)
233+
return value === null ? null : safeParse(parse, value, key)
234234
})
235235
const stateRef = React.useRef(internalState)
236236
debug(
@@ -243,7 +243,7 @@ export function useQueryState<T = string>(
243243
if (process.env.__NEXT_WINDOW_HISTORY_SUPPORT) {
244244
React.useEffect(() => {
245245
const value = initialSearchParams.get(key) ?? null
246-
const state = value === null ? null : parse(value)
246+
const state = value === null ? null : safeParse(parse, value, key)
247247
debug('[nuqs `%s`] syncFromUseSearchParams %O', key, state)
248248
stateRef.current = state
249249
setInternalState(state)
@@ -259,7 +259,7 @@ export function useQueryState<T = string>(
259259
}
260260
function syncFromURL(search: URLSearchParams) {
261261
const value = search.get(key) ?? null
262-
const state = value === null ? null : parse(value)
262+
const state = value === null ? null : safeParse(parse, value, key)
263263
debug('[nuqs `%s`] syncFromURL %O', key, state)
264264
updateInternalState(state)
265265
}

packages/nuqs/src/useQueryStates.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ function parseMap<KeyMap extends UseQueryStatesKeysMap>(
178178
const urlQuery = searchParams?.get(key) ?? null
179179
const queueQuery = getQueuedValue(key)
180180
const query = queueQuery ?? urlQuery
181-
const value = query === null ? null : safeParse(parse, query)
181+
const value = query === null ? null : safeParse(parse, query, key)
182182
obj[key as keyof KeyMap] = value ?? defaultValue ?? null
183183
return obj
184184
}, {} as Values<KeyMap>)

packages/nuqs/src/utils.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,21 @@
11
import { warn } from './debug'
22
import type { Parser } from './parsers'
33

4-
export function safeParse<T>(parser: Parser<T>['parse'], value: string) {
4+
export function safeParse<T>(
5+
parser: Parser<T>['parse'],
6+
value: string,
7+
key?: string
8+
) {
59
try {
610
return parser(value)
711
} catch (error) {
8-
warn('[nuqs] Error while parsing value `%s`: %O', error)
12+
warn(
13+
'[nuqs] Error while parsing value `%s`: %O' +
14+
(key ? ' (for key `%s`)' : ''),
15+
value,
16+
error,
17+
key
18+
)
919
return null
1020
}
1121
}

0 commit comments

Comments
 (0)