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