From 075781d55e3fa1ae3bbb7a18dfdfeb2d063b9439 Mon Sep 17 00:00:00 2001
From: Maxime LUCE <maxime@touchify.co>
Date: Thu, 9 Sep 2021 11:03:25 +0200
Subject: [PATCH 1/2] fix: handle typescript $$Generic special type

---
 src/postprocess.js                             |  1 +
 test/samples/typescript-generics/.eslintrc.js  | 11 +++++++++++
 test/samples/typescript-generics/Input.svelte  | 14 ++++++++++++++
 test/samples/typescript-generics/expected.json |  1 +
 4 files changed, 27 insertions(+)
 create mode 100644 test/samples/typescript-generics/.eslintrc.js
 create mode 100644 test/samples/typescript-generics/Input.svelte
 create mode 100644 test/samples/typescript-generics/expected.json

diff --git a/src/postprocess.js b/src/postprocess.js
index 77f63e9..e38f789 100644
--- a/src/postprocess.js
+++ b/src/postprocess.js
@@ -99,6 +99,7 @@ const is_valid_message = (block, message, translation) => {
 		case 'no-restricted-syntax': return message.nodeType !== 'LabeledStatement' || get_identifier(get_referenced_string(block, message)) !== '$';
 		case 'no-self-assign': return !state.var_names.has(get_identifier(get_referenced_string(block, message)));
 		case 'no-unused-labels': return get_referenced_string(block, message) !== '$';
+		case 'no-undef': return get_referenced_string(block, message) !== '$$Generic';
 		case '@typescript-eslint/quotes':
 		case 'quotes': return !translation.options.in_quoted_attribute;
 	}
diff --git a/test/samples/typescript-generics/.eslintrc.js b/test/samples/typescript-generics/.eslintrc.js
new file mode 100644
index 0000000..5cbce11
--- /dev/null
+++ b/test/samples/typescript-generics/.eslintrc.js
@@ -0,0 +1,11 @@
+module.exports = {
+	parser: '@typescript-eslint/parser',
+	extends: ['plugin:@typescript-eslint/recommended'],
+	plugins: ['@typescript-eslint'],
+	settings: {
+		'svelte3/typescript': require('typescript'),
+	},
+	rules: {
+		'no-undef': 'error',
+	},
+};
diff --git a/test/samples/typescript-generics/Input.svelte b/test/samples/typescript-generics/Input.svelte
new file mode 100644
index 0000000..508cac7
--- /dev/null
+++ b/test/samples/typescript-generics/Input.svelte
@@ -0,0 +1,14 @@
+<script lang="ts">
+    type T = $$Generic;
+    type U = $$Generic<string>;
+    export let items: T[];
+    export let message: U;
+</script>
+
+{#each items as item}
+    <slot {item} />
+{/each}
+
+{#if message}
+    {message}
+{/if}
diff --git a/test/samples/typescript-generics/expected.json b/test/samples/typescript-generics/expected.json
new file mode 100644
index 0000000..fe51488
--- /dev/null
+++ b/test/samples/typescript-generics/expected.json
@@ -0,0 +1 @@
+[]

From 8ad3278dcf142b3c80aaaedd0e6268d141610521 Mon Sep 17 00:00:00 2001
From: Conduitry <git@chor.date>
Date: Thu, 9 Sep 2021 16:24:56 -0400
Subject: [PATCH 2/2] tidy formatting

---
 src/postprocess.js                            |  2 +-
 test/samples/typescript-generics/Input.svelte | 14 +++++++-------
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/src/postprocess.js b/src/postprocess.js
index e38f789..e1a9d60 100644
--- a/src/postprocess.js
+++ b/src/postprocess.js
@@ -98,8 +98,8 @@ const is_valid_message = (block, message, translation) => {
 		case 'no-labels': return get_identifier(get_referenced_string(block, message)) !== '$';
 		case 'no-restricted-syntax': return message.nodeType !== 'LabeledStatement' || get_identifier(get_referenced_string(block, message)) !== '$';
 		case 'no-self-assign': return !state.var_names.has(get_identifier(get_referenced_string(block, message)));
-		case 'no-unused-labels': return get_referenced_string(block, message) !== '$';
 		case 'no-undef': return get_referenced_string(block, message) !== '$$Generic';
+		case 'no-unused-labels': return get_referenced_string(block, message) !== '$';
 		case '@typescript-eslint/quotes':
 		case 'quotes': return !translation.options.in_quoted_attribute;
 	}
diff --git a/test/samples/typescript-generics/Input.svelte b/test/samples/typescript-generics/Input.svelte
index 508cac7..e120bfb 100644
--- a/test/samples/typescript-generics/Input.svelte
+++ b/test/samples/typescript-generics/Input.svelte
@@ -1,14 +1,14 @@
-<script lang="ts">
-    type T = $$Generic;
-    type U = $$Generic<string>;
-    export let items: T[];
-    export let message: U;
+<script lang='ts'>
+	type T = $$Generic;
+	type U = $$Generic<string>;
+	export let items: T[];
+	export let message: U;
 </script>
 
 {#each items as item}
-    <slot {item} />
+	<slot {item} />
 {/each}
 
 {#if message}
-    {message}
+	{message}
 {/if}