|
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<typeof generateRouteRecord>[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) |
|
0 commit comments