fix: allow undefined values for params in query · vuejs/router@4726e2b (original) (raw)

`@@ -13,6 +13,21 @@ describe('EXPERIMENTAL_generateRouteParams', () => {

`

13

13

`` return tree.insert(segment, ${segment}.vue)

``

14

14

`}

`

15

15

``

``

16

`+

function makeParsersMap(name: string, isRaw: boolean): ParamParsersMap {

`

``

17

`+

return new Map([

`

``

18

`+

[

`

``

19

`+

name,

`

``

20

`+

{

`

``

21

`+

name,

`

``

22

`` +

typeName: Param_${name},

``

``

23

`` +

relativePath: parsers/${name},

``

``

24

`` +

absolutePath: /abs/parsers/${name},

``

``

25

`+

isRaw,

`

``

26

`+

},

`

``

27

`+

],

`

``

28

`+

])

`

``

29

`+

}

`

``

30

+

16

31

`describe('excludes null from custom parser types', () => {

`

17

32

`it('required path param excludes null', () => {

`

18

33

`const node = createTreeWithParam('[version=semver]')

`

`@@ -74,21 +89,6 @@ describe('EXPERIMENTAL_generateRouteParams', () => {

`

74

89

`})

`

75

90

``

76

91

`describe('raw param parsers', () => {

`

77

``

`-

function makeParsersMap(name: string, isRaw: boolean): ParamParsersMap {

`

78

``

`-

return new Map([

`

79

``

`-

[

`

80

``

`-

name,

`

81

``

`-

{

`

82

``

`-

name,

`

83

``

`` -

typeName: Param_${name},

``

84

``

`` -

relativePath: parsers/${name},

``

85

``

`` -

absolutePath: /abs/parsers/${name},

``

86

``

`-

isRaw,

`

87

``

`-

},

`

88

``

`-

],

`

89

``

`-

])

`

90

``

`-

}

`

91

``

-

92

92

`it('emits Param_X /* raw param parser */ for raw path params', () => {

`

93

93

`const node = createTreeWithParam('[id=raw]')

`

94

94

`const result = EXPERIMENTAL_generateRouteParams(

`

`@@ -154,4 +154,76 @@ describe('EXPERIMENTAL_generateRouteParams', () => {

`

154

154

`expect(result).toBe('{ id: Exclude<Param_plain, unknown[] | null> }')

`

155

155

`})

`

156

156

`})

`

``

157

+

``

158

`+

describe('raw query param parsers', () => {

`

``

159

`+

function createNodeWithQueryParam(

`

``

160

`+

paramName: string,

`

``

161

`+

parserName: string

`

``

162

`+

): TreeNode {

`

``

163

`+

const tree = new PrefixTree(RESOLVED_OPTIONS)

`

``

164

`+

const node = tree.insert('b', 'b.vue')

`

``

165

`+

node.setCustomRouteBlock('b.vue', {

`

``

166

`+

params: {

`

``

167

`+

query: {

`

``

168

`+

[paramName]: { parser: parserName, format: 'value' },

`

``

169

`+

},

`

``

170

`+

},

`

``

171

`+

})

`

``

172

`+

return node

`

``

173

`+

}

`

``

174

+

``

175

`+

it('omits | undefined on route.params for raw query parsers', () => {

`

``

176

`+

const node = createNodeWithQueryParam('test', 'set')

`

``

177

`+

// route.params side (isRaw=false): runtime always calls the raw parser

`

``

178

`+

// with the array form, so the value never ends up undefined.

`

``

179

`+

const result = EXPERIMENTAL_generateRouteParams(

`

``

180

`+

node,

`

``

181

`+

['Param_set'],

`

``

182

`+

false,

`

``

183

`+

makeParsersMap('set', true)

`

``

184

`+

)

`

``

185

`+

expect(result).toBe('{ test: Param_set /* raw param parser */ }')

`

``

186

`+

})

`

``

187

+

``

188

`+

it('adds explicit | undefined on router.push for raw query parsers', () => {

`

``

189

`+

const node = createNodeWithQueryParam('test', 'set')

`

``

190

`` +

// router.push side (isRaw=true): allow users to pass undefined

``

``

191

`+

// explicitly even under exactOptionalPropertyTypes.

`

``

192

`+

const result = EXPERIMENTAL_generateRouteParams(

`

``

193

`+

node,

`

``

194

`+

['Param_set'],

`

``

195

`+

true,

`

``

196

`+

makeParsersMap('set', true)

`

``

197

`+

)

`

``

198

`+

expect(result).toBe(

`

``

199

`+

'{ test?: Param_set /* raw param parser */ | undefined }'

`

``

200

`+

)

`

``

201

`+

})

`

``

202

+

``

203

`+

it('keeps | undefined on route.params for non-raw query parsers', () => {

`

``

204

`+

const node = createNodeWithQueryParam('test', 'plain')

`

``

205

`+

const result = EXPERIMENTAL_generateRouteParams(

`

``

206

`+

node,

`

``

207

`+

['Param_plain'],

`

``

208

`+

false,

`

``

209

`+

makeParsersMap('plain', false)

`

``

210

`+

)

`

``

211

`+

expect(result).toBe(

`

``

212

`+

'{ test: Exclude<Param_plain, unknown[] | null> | undefined }'

`

``

213

`+

)

`

``

214

`+

})

`

``

215

+

``

216

`+

it('adds | undefined on router.push for non-raw query parsers', () => {

`

``

217

`+

const node = createNodeWithQueryParam('test', 'plain')

`

``

218

`+

const result = EXPERIMENTAL_generateRouteParams(

`

``

219

`+

node,

`

``

220

`+

['Param_plain'],

`

``

221

`+

true,

`

``

222

`+

makeParsersMap('plain', false)

`

``

223

`+

)

`

``

224

`+

expect(result).toBe(

`

``

225

`+

'{ test?: Exclude<Param_plain, unknown[] | null> | undefined }'

`

``

226

`+

)

`

``

227

`+

})

`

``

228

`+

})

`

157

229

`})

`