diff --git a/.changeset/six-pugs-camp.md b/.changeset/six-pugs-camp.md
new file mode 100644
index 000000000..bd26d81e3
--- /dev/null
+++ b/.changeset/six-pugs-camp.md
@@ -0,0 +1,5 @@
+---
+'eslint-plugin-svelte': patch
+---
+
+fix: Not reporting mailto: and other unusual schema addresses in no-nmavigation-without-resolve (and its deprecated versions)
diff --git a/packages/eslint-plugin-svelte/src/rules/no-goto-without-base.ts b/packages/eslint-plugin-svelte/src/rules/no-goto-without-base.ts
index 610b0922b..8cc710cbf 100644
--- a/packages/eslint-plugin-svelte/src/rules/no-goto-without-base.ts
+++ b/packages/eslint-plugin-svelte/src/rules/no-goto-without-base.ts
@@ -71,8 +71,7 @@ function checkTemplateLiteral(
}
function checkLiteral(context: RuleContext, path: TSESTree.Literal): void {
- const absolutePathRegex = /^(?:[+a-z]+:)?\/\//i;
- if (!absolutePathRegex.test(path.value?.toString() ?? '')) {
+ if (!/^[+a-z]*:/i.test(path.value?.toString() ?? '')) {
context.report({ loc: path.loc, messageId: 'isNotPrefixedWithBasePath' });
}
}
diff --git a/packages/eslint-plugin-svelte/src/rules/no-navigation-without-base.ts b/packages/eslint-plugin-svelte/src/rules/no-navigation-without-base.ts
index 9a1e89e27..c3eeeecf7 100644
--- a/packages/eslint-plugin-svelte/src/rules/no-navigation-without-base.ts
+++ b/packages/eslint-plugin-svelte/src/rules/no-navigation-without-base.ts
@@ -268,7 +268,7 @@ function templateLiteralIsAbsolute(url: TSESTree.TemplateLiteral): boolean {
}
function urlValueIsAbsolute(url: string): boolean {
- return url.includes('://');
+ return /^[+a-z]*:/i.test(url);
}
function expressionIsFragment(url: AST.SvelteLiteral | TSESTree.Expression): boolean {
diff --git a/packages/eslint-plugin-svelte/src/rules/no-navigation-without-resolve.ts b/packages/eslint-plugin-svelte/src/rules/no-navigation-without-resolve.ts
index d3a45e5a2..98c34b9c3 100644
--- a/packages/eslint-plugin-svelte/src/rules/no-navigation-without-resolve.ts
+++ b/packages/eslint-plugin-svelte/src/rules/no-navigation-without-resolve.ts
@@ -282,7 +282,7 @@ function templateLiteralIsAbsolute(url: TSESTree.TemplateLiteral): boolean {
}
function urlValueIsAbsolute(url: string): boolean {
- return url.includes('://');
+ return /^[+a-z]*:/i.test(url);
}
function expressionIsFragment(url: AST.SvelteLiteral | TSESTree.Expression): boolean {
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-goto-without-base/invalid/no-base01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-goto-without-base/invalid/no-base01-errors.yaml
index 658fcb47d..4e7a86d22 100644
--- a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-goto-without-base/invalid/no-base01-errors.yaml
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-goto-without-base/invalid/no-base01-errors.yaml
@@ -2,3 +2,7 @@
line: 4
column: 7
suggestions: null
+- message: Found a goto() call with a url that isn't prefixed with the base path.
+ line: 5
+ column: 7
+ suggestions: null
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-goto-without-base/invalid/no-base01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-goto-without-base/invalid/no-base01-input.svelte
index 6f011fe2d..b5d9b20d6 100644
--- a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-goto-without-base/invalid/no-base01-input.svelte
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-goto-without-base/invalid/no-base01-input.svelte
@@ -2,4 +2,5 @@
import { goto } from '$app/navigation';
goto('/foo');
+ goto('/user:42');
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-goto-without-base/valid/absolute-uri01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-goto-without-base/valid/absolute-uri01-input.svelte
index 87ee8abf3..6deb380e8 100644
--- a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-goto-without-base/valid/absolute-uri01-input.svelte
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-goto-without-base/valid/absolute-uri01-input.svelte
@@ -3,4 +3,6 @@
goto('http://localhost/foo/');
goto('https://localhost/foo/');
+ goto('mailto:user@example.com');
+ goto('tel:+123456789');
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/link-no-base01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/link-no-base01-errors.yaml
index e006d4d27..2a5d2071b 100644
--- a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/link-no-base01-errors.yaml
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/link-no-base01-errors.yaml
@@ -14,3 +14,7 @@
line: 7
column: 9
suggestions: null
+- message: Found a link with a url that isn't prefixed with the base path.
+ line: 8
+ column: 9
+ suggestions: null
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/link-no-base01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/link-no-base01-input.svelte
index 0e0f6df25..eaf1747b0 100644
--- a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/link-no-base01-input.svelte
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/link-no-base01-input.svelte
@@ -5,3 +5,4 @@
Click me!
Click me!
Click me!
+Click me!
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/link-with-fragment01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/link-with-fragment01-errors.yaml
index e006d4d27..2a5d2071b 100644
--- a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/link-with-fragment01-errors.yaml
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/link-with-fragment01-errors.yaml
@@ -14,3 +14,7 @@
line: 7
column: 9
suggestions: null
+- message: Found a link with a url that isn't prefixed with the base path.
+ line: 8
+ column: 9
+ suggestions: null
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/link-with-fragment01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/link-with-fragment01-input.svelte
index 2e6a11df8..912b11378 100644
--- a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/link-with-fragment01-input.svelte
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/invalid/link-with-fragment01-input.svelte
@@ -5,3 +5,4 @@
Click me!
Click me!
Click me!
+Click me!
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/link-absolute-url01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/link-absolute-url01-input.svelte
index b7896c265..115109a28 100644
--- a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/link-absolute-url01-input.svelte
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/link-absolute-url01-input.svelte
@@ -11,3 +11,5 @@
Click me!
Click me!
Click me!
+Click me!
+Click me!
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/link-fragment-url01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/link-fragment-url01-input.svelte
index eeaa16267..9c931237b 100644
--- a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/link-fragment-url01-input.svelte
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-base/valid/link-fragment-url01-input.svelte
@@ -8,3 +8,4 @@
Click me!
Click me!
Click me!
+Click me!
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-with-fragment01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-with-fragment01-errors.yaml
index bfe0aa41b..f6888e8c1 100644
--- a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-with-fragment01-errors.yaml
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-with-fragment01-errors.yaml
@@ -14,3 +14,7 @@
line: 8
column: 9
suggestions: null
+- message: Found a link with a url that isn't resolved.
+ line: 9
+ column: 9
+ suggestions: null
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-with-fragment01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-with-fragment01-input.svelte
index ae42ef579..2a2d1d418 100644
--- a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-with-fragment01-input.svelte
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-with-fragment01-input.svelte
@@ -6,3 +6,4 @@
Click me!
Click me!
Click me!
+Click me!
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-without-resolve01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-without-resolve01-errors.yaml
index bfe0aa41b..f6888e8c1 100644
--- a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-without-resolve01-errors.yaml
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-without-resolve01-errors.yaml
@@ -14,3 +14,7 @@
line: 8
column: 9
suggestions: null
+- message: Found a link with a url that isn't resolved.
+ line: 9
+ column: 9
+ suggestions: null
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-without-resolve01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-without-resolve01-input.svelte
index 7e3bfb730..4ae6bc7ec 100644
--- a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-without-resolve01-input.svelte
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/invalid/link-without-resolve01-input.svelte
@@ -6,3 +6,4 @@
Click me!
Click me!
Click me!
+Click me!
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/link-absolute-url01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/link-absolute-url01-input.svelte
index b7896c265..115109a28 100644
--- a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/link-absolute-url01-input.svelte
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/link-absolute-url01-input.svelte
@@ -11,3 +11,5 @@
Click me!
Click me!
Click me!
+Click me!
+Click me!
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/link-fragment-url01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/link-fragment-url01-input.svelte
index eeaa16267..9c931237b 100644
--- a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/link-fragment-url01-input.svelte
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-navigation-without-resolve/valid/link-fragment-url01-input.svelte
@@ -8,3 +8,4 @@
Click me!
Click me!
Click me!
+Click me!