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
`})
`