From eaf5e6af1edab5a4d565b74be6bcc02c71c13ac6 Mon Sep 17 00:00:00 2001
From: Yosuke Ota <otameshiyo23@gmail.com>
Date: Mon, 25 Mar 2024 16:56:12 +0900
Subject: [PATCH] fix: suppress comment not working in flat config. (#719)

---
 .changeset/eighty-pillows-taste.md |  5 ++
 package.json                       |  2 +-
 src/configs/flat/base.ts           |  3 +-
 tests/src/configs/base.ts          | 85 ++++++++++++++++++++++++++++++
 tests/src/configs/recommended.ts   |  6 +--
 tools/update-rulesets.ts           |  1 +
 6 files changed, 97 insertions(+), 5 deletions(-)
 create mode 100644 .changeset/eighty-pillows-taste.md
 create mode 100644 tests/src/configs/base.ts

diff --git a/.changeset/eighty-pillows-taste.md b/.changeset/eighty-pillows-taste.md
new file mode 100644
index 000000000..4bb4fa0db
--- /dev/null
+++ b/.changeset/eighty-pillows-taste.md
@@ -0,0 +1,5 @@
+---
+"eslint-plugin-svelte": patch
+---
+
+fix: suppress comment not working in flat config.
diff --git a/package.json b/package.json
index 1100cb529..fe8b10640 100644
--- a/package.json
+++ b/package.json
@@ -163,7 +163,7 @@
     "rimraf": "^5.0.5",
     "sass": "^1.71.1",
     "source-map-js": "^1.0.2",
-    "stylelint": "^16.2.1",
+    "stylelint": "~16.2.1",
     "stylelint-config-standard": "^36.0.0",
     "stylus": "^0.63.0",
     "svelte": "^5.0.0-next.73",
diff --git a/src/configs/flat/base.ts b/src/configs/flat/base.ts
index ee1779aed..755a52831 100644
--- a/src/configs/flat/base.ts
+++ b/src/configs/flat/base.ts
@@ -27,6 +27,7 @@ export default [
 			// eslint-plugin-svelte rules
 			'svelte/comment-directive': 'error',
 			'svelte/system': 'error'
-		}
+		},
+		processor: 'svelte/svelte'
 	}
 ];
diff --git a/tests/src/configs/base.ts b/tests/src/configs/base.ts
new file mode 100644
index 000000000..5bdc838d5
--- /dev/null
+++ b/tests/src/configs/base.ts
@@ -0,0 +1,85 @@
+import assert from 'assert';
+import semver from 'semver';
+import plugin from '../../../src/index';
+import { LegacyESLint, ESLint } from '../../utils/eslint-compat';
+
+describe('`base` config', () => {
+	it('legacy `base` config should work. ', async () => {
+		const code = `<script>const a = 1, b = 2;</script>
+<!-- eslint-disable-next-line svelte/no-at-html-tags -->
+{@html a+b}
+{@html a+b}`;
+
+		const linter = new LegacyESLint({
+			plugins: {
+				svelte: plugin as never
+			},
+			baseConfig: {
+				parserOptions: {
+					ecmaVersion: 2020
+				},
+				extends: ['plugin:svelte/base'],
+				rules: {
+					'svelte/no-at-html-tags': 'error'
+				}
+			},
+			useEslintrc: false
+		});
+		const result = await linter.lintText(code, { filePath: 'test.svelte' });
+		const messages = result[0].messages;
+
+		assert.deepStrictEqual(
+			messages.map((m) => ({ ruleId: m.ruleId, line: m.line, message: m.message })),
+			[
+				{
+					ruleId: 'svelte/no-at-html-tags',
+					message: '`{@html}` can lead to XSS attack.',
+					line: 4
+				}
+			]
+		);
+	});
+	it('`base` config should work. ', async () => {
+		if (semver.satisfies(ESLint.version, '<8.0.0')) return;
+		const code = `<script>const a = 1, b = 2;</script>
+<!-- eslint-disable-next-line svelte/no-at-html-tags -->
+{@html a+b}
+{@html a+b}`;
+		const linter = new ESLint({
+			overrideConfigFile: true as never,
+			overrideConfig: [
+				...plugin.configs['flat/base'],
+				{
+					rules: {
+						'svelte/no-at-html-tags': 'error'
+					}
+				}
+			] as never
+		});
+		const result = await linter.lintText(code, { filePath: 'test.svelte' });
+		const messages = result[0].messages;
+
+		assert.deepStrictEqual(
+			messages.map((m) => ({ ruleId: m.ruleId, line: m.line, message: m.message })),
+			[
+				{
+					ruleId: 'svelte/no-at-html-tags',
+					message: '`{@html}` can lead to XSS attack.',
+					line: 4
+				}
+			]
+		);
+
+		const resultWithJs = await linter.lintText(';', { filePath: 'test.js' });
+		const messagesWithJs = resultWithJs[0].messages;
+
+		assert.deepStrictEqual(
+			messagesWithJs.map((m) => ({
+				ruleId: m.ruleId,
+				line: m.line,
+				message: m.message
+			})),
+			[]
+		);
+	});
+});
diff --git a/tests/src/configs/recommended.ts b/tests/src/configs/recommended.ts
index 73403a788..afb028fa8 100644
--- a/tests/src/configs/recommended.ts
+++ b/tests/src/configs/recommended.ts
@@ -3,8 +3,8 @@ import semver from 'semver';
 import plugin from '../../../src/index';
 import { LegacyESLint, ESLint } from '../../utils/eslint-compat';
 
-describe('`all` config', () => {
-	it('legacy `all` config should work. ', async () => {
+describe('`recommended` config', () => {
+	it('legacy `recommended` config should work. ', async () => {
 		const code = `<script>const a = 1, b = 2;</script>{@html a+b}`;
 
 		const linter = new LegacyESLint({
@@ -33,7 +33,7 @@ describe('`all` config', () => {
 			]
 		);
 	});
-	it('`all` config should work. ', async () => {
+	it('`recommended` config should work. ', async () => {
 		if (semver.satisfies(ESLint.version, '<8.0.0')) return;
 		const code = `<script>const a = 1, b = 2;</script>{@html a+b}`;
 
diff --git a/tools/update-rulesets.ts b/tools/update-rulesets.ts
index 6cc9e2d85..90e8b0139 100644
--- a/tools/update-rulesets.ts
+++ b/tools/update-rulesets.ts
@@ -139,6 +139,7 @@ export default [
 				})
 				.join(',\n        ')},
     },
+		processor: 'svelte/svelte'
   },
 ]
 `;