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)

`