@@ -97,11 +97,11 @@ export default createRule('no-navigation-without-resolve', {
97
97
}
98
98
if (
99
99
( node . value [ 0 ] . type === 'SvelteLiteral' &&
100
- ! expressionIsAbsolute ( node . value [ 0 ] ) &&
101
- ! expressionIsFragment ( node . value [ 0 ] ) ) ||
100
+ ! expressionIsAbsolute ( new FindVariableContext ( context ) , node . value [ 0 ] ) &&
101
+ ! expressionIsFragment ( new FindVariableContext ( context ) , node . value [ 0 ] ) ) ||
102
102
( node . value [ 0 ] . type === 'SvelteMustacheTag' &&
103
- ! expressionIsAbsolute ( node . value [ 0 ] . expression ) &&
104
- ! expressionIsFragment ( node . value [ 0 ] . expression ) &&
103
+ ! expressionIsAbsolute ( new FindVariableContext ( context ) , node . value [ 0 ] . expression ) &&
104
+ ! expressionIsFragment ( new FindVariableContext ( context ) , node . value [ 0 ] . expression ) &&
105
105
! isResolveCall (
106
106
new FindVariableContext ( context ) ,
107
107
node . value [ 0 ] . expression ,
@@ -235,19 +235,19 @@ function isResolveCall(
235
235
) {
236
236
return true ;
237
237
}
238
- if ( node . type === 'Identifier' ) {
239
- const variable = ctx . findVariable ( node ) ;
240
- if (
241
- variable !== null &&
242
- variable . identifiers . length > 0 &&
243
- variable . identifiers [ 0 ] . parent . type === 'VariableDeclarator' &&
244
- variable . identifiers [ 0 ] . parent . init !== null &&
245
- isResolveCall ( ctx , variable . identifiers [ 0 ] . parent . init , resolveReferences )
246
- ) {
247
- return true ;
248
- }
238
+ if ( node . type !== 'Identifier' ) {
239
+ return false ;
249
240
}
250
- return false ;
241
+ const variable = ctx . findVariable ( node ) ;
242
+ if (
243
+ variable === null ||
244
+ variable . identifiers . length === 0 ||
245
+ variable . identifiers [ 0 ] . parent . type !== 'VariableDeclarator' ||
246
+ variable . identifiers [ 0 ] . parent . init === null
247
+ ) {
248
+ return false ;
249
+ }
250
+ return isResolveCall ( ctx , variable . identifiers [ 0 ] . parent . init , resolveReferences ) ;
251
251
}
252
252
253
253
function expressionIsEmpty ( url : TSESTree . CallExpressionArgument ) : boolean {
@@ -260,31 +260,55 @@ function expressionIsEmpty(url: TSESTree.CallExpressionArgument): boolean {
260
260
) ;
261
261
}
262
262
263
- function expressionIsAbsolute ( url : AST . SvelteLiteral | TSESTree . Expression ) : boolean {
263
+ function expressionIsAbsolute (
264
+ ctx : FindVariableContext ,
265
+ url : AST . SvelteLiteral | TSESTree . Expression
266
+ ) : boolean {
264
267
switch ( url . type ) {
265
268
case 'BinaryExpression' :
266
- return binaryExpressionIsAbsolute ( url ) ;
269
+ return binaryExpressionIsAbsolute ( ctx , url ) ;
270
+ case 'Identifier' :
271
+ return identifierIsAbsolute ( ctx , url ) ;
267
272
case 'Literal' :
268
273
return typeof url . value === 'string' && urlValueIsAbsolute ( url . value ) ;
269
274
case 'SvelteLiteral' :
270
275
return urlValueIsAbsolute ( url . value ) ;
271
276
case 'TemplateLiteral' :
272
- return templateLiteralIsAbsolute ( url ) ;
277
+ return templateLiteralIsAbsolute ( ctx , url ) ;
273
278
default :
274
279
return false ;
275
280
}
276
281
}
277
282
278
- function binaryExpressionIsAbsolute ( url : TSESTree . BinaryExpression ) : boolean {
283
+ function binaryExpressionIsAbsolute (
284
+ ctx : FindVariableContext ,
285
+ url : TSESTree . BinaryExpression
286
+ ) : boolean {
279
287
return (
280
- ( url . left . type !== 'PrivateIdentifier' && expressionIsAbsolute ( url . left ) ) ||
281
- expressionIsAbsolute ( url . right )
288
+ ( url . left . type !== 'PrivateIdentifier' && expressionIsAbsolute ( ctx , url . left ) ) ||
289
+ expressionIsAbsolute ( ctx , url . right )
282
290
) ;
283
291
}
284
292
285
- function templateLiteralIsAbsolute ( url : TSESTree . TemplateLiteral ) : boolean {
293
+ function identifierIsAbsolute ( ctx : FindVariableContext , url : TSESTree . Identifier ) : boolean {
294
+ const variable = ctx . findVariable ( url ) ;
295
+ if (
296
+ variable === null ||
297
+ variable . identifiers . length === 0 ||
298
+ variable . identifiers [ 0 ] . parent . type !== 'VariableDeclarator' ||
299
+ variable . identifiers [ 0 ] . parent . init === null
300
+ ) {
301
+ return false ;
302
+ }
303
+ return expressionIsAbsolute ( ctx , variable . identifiers [ 0 ] . parent . init ) ;
304
+ }
305
+
306
+ function templateLiteralIsAbsolute (
307
+ ctx : FindVariableContext ,
308
+ url : TSESTree . TemplateLiteral
309
+ ) : boolean {
286
310
return (
287
- url . expressions . some ( expressionIsAbsolute ) ||
311
+ url . expressions . some ( ( expression ) => expressionIsAbsolute ( ctx , expression ) ) ||
288
312
url . quasis . some ( ( quasi ) => urlValueIsAbsolute ( quasi . value . raw ) )
289
313
) ;
290
314
}
@@ -293,28 +317,52 @@ function urlValueIsAbsolute(url: string): boolean {
293
317
return / ^ [ + a - z ] * : / i. test ( url ) ;
294
318
}
295
319
296
- function expressionIsFragment ( url : AST . SvelteLiteral | TSESTree . Expression ) : boolean {
320
+ function expressionIsFragment (
321
+ ctx : FindVariableContext ,
322
+ url : AST . SvelteLiteral | TSESTree . Expression
323
+ ) : boolean {
297
324
switch ( url . type ) {
298
325
case 'BinaryExpression' :
299
- return binaryExpressionIsFragment ( url ) ;
326
+ return binaryExpressionIsFragment ( ctx , url ) ;
327
+ case 'Identifier' :
328
+ return identifierIsFragment ( ctx , url ) ;
300
329
case 'Literal' :
301
330
return typeof url . value === 'string' && urlValueIsFragment ( url . value ) ;
302
331
case 'SvelteLiteral' :
303
332
return urlValueIsFragment ( url . value ) ;
304
333
case 'TemplateLiteral' :
305
- return templateLiteralIsFragment ( url ) ;
334
+ return templateLiteralIsFragment ( ctx , url ) ;
306
335
default :
307
336
return false ;
308
337
}
309
338
}
310
339
311
- function binaryExpressionIsFragment ( url : TSESTree . BinaryExpression ) : boolean {
312
- return url . left . type !== 'PrivateIdentifier' && expressionIsFragment ( url . left ) ;
340
+ function binaryExpressionIsFragment (
341
+ ctx : FindVariableContext ,
342
+ url : TSESTree . BinaryExpression
343
+ ) : boolean {
344
+ return url . left . type !== 'PrivateIdentifier' && expressionIsFragment ( ctx , url . left ) ;
313
345
}
314
346
315
- function templateLiteralIsFragment ( url : TSESTree . TemplateLiteral ) : boolean {
347
+ function identifierIsFragment ( ctx : FindVariableContext , url : TSESTree . Identifier ) : boolean {
348
+ const variable = ctx . findVariable ( url ) ;
349
+ if (
350
+ variable === null ||
351
+ variable . identifiers . length === 0 ||
352
+ variable . identifiers [ 0 ] . parent . type !== 'VariableDeclarator' ||
353
+ variable . identifiers [ 0 ] . parent . init === null
354
+ ) {
355
+ return false ;
356
+ }
357
+ return expressionIsFragment ( ctx , variable . identifiers [ 0 ] . parent . init ) ;
358
+ }
359
+
360
+ function templateLiteralIsFragment (
361
+ ctx : FindVariableContext ,
362
+ url : TSESTree . TemplateLiteral
363
+ ) : boolean {
316
364
return (
317
- ( url . expressions . length >= 1 && expressionIsFragment ( url . expressions [ 0 ] ) ) ||
365
+ ( url . expressions . length >= 1 && expressionIsFragment ( ctx , url . expressions [ 0 ] ) ) ||
318
366
( url . quasis . length >= 1 && urlValueIsFragment ( url . quasis [ 0 ] . value . raw ) )
319
367
) ;
320
368
}
0 commit comments