feat: force array type raw param parsers · vuejs/router@7a68b87 (original) (raw)
`@@ -9,6 +9,7 @@ import {
`
9
9
`import { ImportsMap } from '../core/utils'
`
10
10
`import type { ParamParsersMap } from './generateParamParsers'
`
11
11
`import { generateAliasWarnings } from './generateAliasWarnings'
`
``
12
`+
import { mockWarn } from '../../tests/vitest-mock-warn'
`
12
13
``
13
14
`const DEFAULT_OPTIONS = resolveOptions({})
`
14
15
`let DEFAULT_STATE: Parameters[0]['state'] = {
`
`@@ -231,6 +232,100 @@ describe('generateRouteRecordQuery', () => {
`
231
232
` ],"
`
232
233
`` `)
``
233
234
`})
`
``
235
+
``
236
`+
describe('raw param parsers', () => {
`
``
237
`+
mockWarn()
`
``
238
+
``
239
`+
function rawParsersMap(name: string): ParamParsersMap {
`
``
240
`+
return new Map([
`
``
241
`+
[
`
``
242
`+
name,
`
``
243
`+
{
`
``
244
`+
name,
`
``
245
`` +
typeName: Param_${name},
``
``
246
`` +
relativePath: parsers/${name},
``
``
247
`` +
absolutePath: /abs/parsers/${name},
``
``
248
`+
isRaw: true,
`
``
249
`+
},
`
``
250
`+
],
`
``
251
`+
])
`
``
252
`+
}
`
``
253
+
``
254
`+
it('forces format=array for raw query parsers without user format', () => {
`
``
255
`+
const node = new PrefixTree(DEFAULT_OPTIONS).insert('a', 'a.vue')
`
``
256
`+
node.value.setEditOverride('params', {
`
``
257
`+
query: { tags: { parser: 'set' } },
`
``
258
`+
})
`
``
259
`+
const result = generateRouteRecordQuery({
`
``
260
`+
importsMap,
`
``
261
`+
node,
`
``
262
`+
paramParsersMap: rawParsersMap('set'),
`
``
263
`+
})
`
``
264
`+
expect(result).toContain(
`
``
265
`` +
new MatcherPatternQueryParam('tags', 'tags', 'array', _normalized_PARAM_PARSER__set)
``
``
266
`+
)
`
``
267
`+
})
`
``
268
+
``
269
`+
it('forces format=array and warns when user specifies format=value', () => {
`
``
270
`+
const node = new PrefixTree(DEFAULT_OPTIONS).insert('a', 'a.vue')
`
``
271
`+
node.value.setEditOverride('params', {
`
``
272
`+
query: { tags: { parser: 'set', format: 'value' } },
`
``
273
`+
})
`
``
274
`+
const result = generateRouteRecordQuery({
`
``
275
`+
importsMap,
`
``
276
`+
node,
`
``
277
`+
paramParsersMap: rawParsersMap('set'),
`
``
278
`+
})
`
``
279
`+
expect(result).toContain(
`
``
280
`` +
new MatcherPatternQueryParam('tags', 'tags', 'array', _normalized_PARAM_PARSER__set)
``
``
281
`+
)
`
``
282
`+
expect(
`
``
283
`` +
Query param "tags" in route "/a" uses raw param parser "set"
``
``
284
`+
).toHaveBeenWarned()
`
``
285
`+
})
`
``
286
+
``
287
`+
it('keeps user format=array for raw parsers without warning', () => {
`
``
288
`+
const node = new PrefixTree(DEFAULT_OPTIONS).insert('a', 'a.vue')
`
``
289
`+
node.value.setEditOverride('params', {
`
``
290
`+
query: { tags: { parser: 'set', format: 'array' } },
`
``
291
`+
})
`
``
292
`+
const result = generateRouteRecordQuery({
`
``
293
`+
importsMap,
`
``
294
`+
node,
`
``
295
`+
paramParsersMap: rawParsersMap('set'),
`
``
296
`+
})
`
``
297
`+
expect(result).toContain(
`
``
298
`` +
new MatcherPatternQueryParam('tags', 'tags', 'array', _normalized_PARAM_PARSER__set)
``
``
299
`+
)
`
``
300
`+
})
`
``
301
+
``
302
`+
it('does not force array for non-raw parsers', () => {
`
``
303
`+
const node = new PrefixTree(DEFAULT_OPTIONS).insert('a', 'a.vue')
`
``
304
`+
node.value.setEditOverride('params', {
`
``
305
`+
query: { page: { parser: 'date', format: 'value' } },
`
``
306
`+
})
`
``
307
`+
const paramParsersMap: ParamParsersMap = new Map([
`
``
308
`+
[
`
``
309
`+
'date',
`
``
310
`+
{
`
``
311
`+
name: 'date',
`
``
312
`+
typeName: 'Param_date',
`
``
313
`+
relativePath: 'parsers/date',
`
``
314
`+
absolutePath: '/abs/parsers/date',
`
``
315
`+
isRaw: false,
`
``
316
`+
},
`
``
317
`+
],
`
``
318
`+
])
`
``
319
`+
const result = generateRouteRecordQuery({
`
``
320
`+
importsMap,
`
``
321
`+
node,
`
``
322
`+
paramParsersMap,
`
``
323
`+
})
`
``
324
`+
expect(result).toContain(
`
``
325
`` +
new MatcherPatternQueryParam('page', 'page', 'value', _normalized_PARAM_PARSER__date)
``
``
326
`+
)
`
``
327
`+
})
`
``
328
`+
})
`
234
329
`})
`
235
330
``
236
331
`describe('generateRouteRecord', () => {
`
`@@ -1407,18 +1502,18 @@ describe('generateRouteResolver', () => {
`
1407
1502
``
1408
1503
`describe('param parser filtering', () => {
`
1409
1504
`type ParamParserEntry = NonNullable<ReturnType<ParamParsersMap['get']>>
`
1410
``
`-
const uuidEntry = {
`
``
1505
`+
const uuidEntry: ParamParserEntry = {
`
1411
1506
`name: 'uuid',
`
1412
1507
`typeName: 'Param_uuid',
`
1413
1508
`relativePath: 'parsers/uuid',
`
1414
1509
`absolutePath: '/abs/parsers/uuid',
`
1415
``
`-
} satisfies ParamParserEntry
`
1416
``
`-
const slugEntry = {
`
``
1510
`+
}
`
``
1511
`+
const slugEntry: ParamParserEntry = {
`
1417
1512
`name: 'slug',
`
1418
1513
`typeName: 'Param_slug',
`
1419
1514
`relativePath: 'parsers/slug',
`
1420
1515
`absolutePath: '/abs/parsers/slug',
`
1421
``
`-
} satisfies ParamParserEntry
`
``
1516
`+
}
`
1422
1517
``
1423
1518
`it('omits imports and normalized declarations for unused parsers', () => {
`
1424
1519
`const tree = new PrefixTree(DEFAULT_OPTIONS)
`