@@ -96,14 +96,15 @@ export default createRule('no-navigation-without-base', {
96
96
}
97
97
const hrefValue = node . value [ 0 ] ;
98
98
if ( hrefValue . type === 'SvelteLiteral' ) {
99
- if ( ! expressionIsAbsolute ( hrefValue ) ) {
99
+ if ( ! expressionIsAbsolute ( hrefValue ) && ! expressionIsFragment ( hrefValue ) ) {
100
100
context . report ( { loc : hrefValue . loc , messageId : 'linkNotPrefixed' } ) ;
101
101
}
102
102
return ;
103
103
}
104
104
if (
105
105
! expressionStartsWithBase ( context , hrefValue . expression , basePathNames ) &&
106
- ! expressionIsAbsolute ( hrefValue . expression )
106
+ ! expressionIsAbsolute ( hrefValue . expression ) &&
107
+ ! expressionIsFragment ( hrefValue . expression )
107
108
) {
108
109
context . report ( { loc : hrefValue . loc , messageId : 'linkNotPrefixed' } ) ;
109
110
}
@@ -348,3 +349,33 @@ function templateLiteralIsAbsolute(url: TSESTree.TemplateLiteral): boolean {
348
349
function urlValueIsAbsolute ( url : string ) : boolean {
349
350
return url . includes ( '://' ) ;
350
351
}
352
+
353
+ function expressionIsFragment ( url : SvelteLiteral | TSESTree . Expression ) : boolean {
354
+ switch ( url . type ) {
355
+ case 'BinaryExpression' :
356
+ return binaryExpressionIsFragment ( url ) ;
357
+ case 'Literal' :
358
+ return typeof url . value === 'string' && urlValueIsFragment ( url . value ) ;
359
+ case 'SvelteLiteral' :
360
+ return urlValueIsFragment ( url . value ) ;
361
+ case 'TemplateLiteral' :
362
+ return templateLiteralIsFragment ( url ) ;
363
+ default :
364
+ return false ;
365
+ }
366
+ }
367
+
368
+ function binaryExpressionIsFragment ( url : TSESTree . BinaryExpression ) : boolean {
369
+ return url . left . type !== 'PrivateIdentifier' && expressionIsFragment ( url . left ) ;
370
+ }
371
+
372
+ function templateLiteralIsFragment ( url : TSESTree . TemplateLiteral ) : boolean {
373
+ return (
374
+ ( url . expressions . length >= 1 && expressionIsFragment ( url . expressions [ 0 ] ) ) ||
375
+ ( url . quasis . length >= 1 && urlValueIsFragment ( url . quasis [ 0 ] . value . raw ) )
376
+ ) ;
377
+ }
378
+
379
+ function urlValueIsFragment ( url : string ) : boolean {
380
+ return url . startsWith ( '#' ) ;
381
+ }
0 commit comments