diff --git a/.changeset/slimy-donkeys-pump.md b/.changeset/slimy-donkeys-pump.md
new file mode 100644
index 000000000..c516398d2
--- /dev/null
+++ b/.changeset/slimy-donkeys-pump.md
@@ -0,0 +1,5 @@
+---
+"eslint-plugin-svelte": minor
+---
+
+feat: added the `svelte/block-lang` rule
diff --git a/README.md b/README.md
index 4ae387077..2cb25d651 100644
--- a/README.md
+++ b/README.md
@@ -330,6 +330,7 @@ These rules relate to better ways of doing things to help you avoid problems:
| Rule ID | Description | |
|:--------|:------------|:---|
+| [svelte/block-lang](https://ota-meshi.github.io/eslint-plugin-svelte/rules/block-lang/) | disallows the use of languages other than those specified in the configuration for the lang attribute of `
+```
+
+
+
+
+
+
+
+```svelte
+
+
+
+
+```
+
+
+
+
+
+
+
+```svelte
+
+
+```
+
+
+
+## :wrench: Options
+
+```json
+{
+ "svelte/block-lang": [
+ "error",
+ {
+ "enforceScriptPresent": true,
+ "enforceStylePresent": false,
+ "script": ["ts", null], // a list of languages or null to signify no language specified
+ "style": "scss" // same as for script, a single value can be used instead of an array.
+ }
+ ]
+}
+```
+
+- `enforceScriptPresent` ... Whether to enforce the presence of a `
+
+
diff --git a/tests/fixtures/rules/block-lang/invalid/script/javascript/js01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/script/javascript/js01-errors.yaml
new file mode 100644
index 000000000..f660dd594
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/script/javascript/js01-errors.yaml
@@ -0,0 +1,4 @@
+- message: The lang attribute of the
diff --git a/tests/fixtures/rules/block-lang/invalid/script/javascript/null01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/script/javascript/null01-errors.yaml
new file mode 100644
index 000000000..f660dd594
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/script/javascript/null01-errors.yaml
@@ -0,0 +1,4 @@
+- message: The lang attribute of the
diff --git a/tests/fixtures/rules/block-lang/invalid/script/javascript/ts01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/script/javascript/ts01-errors.yaml
new file mode 100644
index 000000000..f660dd594
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/script/javascript/ts01-errors.yaml
@@ -0,0 +1,4 @@
+- message: The lang attribute of the
diff --git a/tests/fixtures/rules/block-lang/invalid/script/javascript/typescript01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/script/javascript/typescript01-errors.yaml
new file mode 100644
index 000000000..f660dd594
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/script/javascript/typescript01-errors.yaml
@@ -0,0 +1,4 @@
+- message: The lang attribute of the
diff --git a/tests/fixtures/rules/block-lang/invalid/script/js/_config.json b/tests/fixtures/rules/block-lang/invalid/script/js/_config.json
new file mode 100644
index 000000000..5390733e0
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/script/js/_config.json
@@ -0,0 +1,3 @@
+{
+ "options": [{ "script": ["js"], "style": ["js", null] }]
+}
diff --git a/tests/fixtures/rules/block-lang/invalid/script/js/javascript01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/script/js/javascript01-errors.yaml
new file mode 100644
index 000000000..c49ef5c85
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/script/js/javascript01-errors.yaml
@@ -0,0 +1,4 @@
+- message: The lang attribute of the
diff --git a/tests/fixtures/rules/block-lang/invalid/script/js/js-as-style-lang01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/script/js/js-as-style-lang01-errors.yaml
new file mode 100644
index 000000000..c49ef5c85
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/script/js/js-as-style-lang01-errors.yaml
@@ -0,0 +1,4 @@
+- message: The lang attribute of the
+
+
diff --git a/tests/fixtures/rules/block-lang/invalid/script/js/null01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/script/js/null01-errors.yaml
new file mode 100644
index 000000000..c49ef5c85
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/script/js/null01-errors.yaml
@@ -0,0 +1,4 @@
+- message: The lang attribute of the
diff --git a/tests/fixtures/rules/block-lang/invalid/script/js/ts01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/script/js/ts01-errors.yaml
new file mode 100644
index 000000000..c49ef5c85
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/script/js/ts01-errors.yaml
@@ -0,0 +1,4 @@
+- message: The lang attribute of the
diff --git a/tests/fixtures/rules/block-lang/invalid/script/js/typescript01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/script/js/typescript01-errors.yaml
new file mode 100644
index 000000000..c49ef5c85
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/script/js/typescript01-errors.yaml
@@ -0,0 +1,4 @@
+- message: The lang attribute of the
diff --git a/tests/fixtures/rules/block-lang/invalid/script/multiple/_config.json b/tests/fixtures/rules/block-lang/invalid/script/multiple/_config.json
new file mode 100644
index 000000000..2d369c1af
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/script/multiple/_config.json
@@ -0,0 +1,8 @@
+{
+ "options": [
+ {
+ "script": ["ts", "typescript", null],
+ "style": ["ts", "typescript", null]
+ }
+ ]
+}
diff --git a/tests/fixtures/rules/block-lang/invalid/script/multiple/javascript01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/script/multiple/javascript01-errors.yaml
new file mode 100644
index 000000000..90ac8a74e
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/script/multiple/javascript01-errors.yaml
@@ -0,0 +1,5 @@
+- message: The lang attribute of the
diff --git a/tests/fixtures/rules/block-lang/invalid/script/multiple/js01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/script/multiple/js01-errors.yaml
new file mode 100644
index 000000000..90ac8a74e
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/script/multiple/js01-errors.yaml
@@ -0,0 +1,5 @@
+- message: The lang attribute of the
diff --git a/tests/fixtures/rules/block-lang/invalid/script/multiple/null-as-style-lang01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/script/multiple/null-as-style-lang01-errors.yaml
new file mode 100644
index 000000000..90ac8a74e
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/script/multiple/null-as-style-lang01-errors.yaml
@@ -0,0 +1,5 @@
+- message: The lang attribute of the
+
+
diff --git a/tests/fixtures/rules/block-lang/invalid/script/multiple/ts-as-style-lang01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/script/multiple/ts-as-style-lang01-errors.yaml
new file mode 100644
index 000000000..90ac8a74e
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/script/multiple/ts-as-style-lang01-errors.yaml
@@ -0,0 +1,5 @@
+- message: The lang attribute of the
+
+
diff --git a/tests/fixtures/rules/block-lang/invalid/script/multiple/typescript-as-style-lang01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/script/multiple/typescript-as-style-lang01-errors.yaml
new file mode 100644
index 000000000..90ac8a74e
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/script/multiple/typescript-as-style-lang01-errors.yaml
@@ -0,0 +1,5 @@
+- message: The lang attribute of the
+
+
diff --git a/tests/fixtures/rules/block-lang/invalid/script/null/_config.json b/tests/fixtures/rules/block-lang/invalid/script/null/_config.json
new file mode 100644
index 000000000..8725dee1c
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/script/null/_config.json
@@ -0,0 +1,3 @@
+{
+ "options": [{ "script": [null] }]
+}
diff --git a/tests/fixtures/rules/block-lang/invalid/script/null/javascript01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/script/null/javascript01-errors.yaml
new file mode 100644
index 000000000..b2d700cdf
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/script/null/javascript01-errors.yaml
@@ -0,0 +1,4 @@
+- message: The lang attribute of the
diff --git a/tests/fixtures/rules/block-lang/invalid/script/null/js01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/script/null/js01-errors.yaml
new file mode 100644
index 000000000..b2d700cdf
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/script/null/js01-errors.yaml
@@ -0,0 +1,4 @@
+- message: The lang attribute of the
diff --git a/tests/fixtures/rules/block-lang/invalid/script/null/null-as-style-lang01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/script/null/null-as-style-lang01-errors.yaml
new file mode 100644
index 000000000..b2d700cdf
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/script/null/null-as-style-lang01-errors.yaml
@@ -0,0 +1,4 @@
+- message: The lang attribute of the
+
+
diff --git a/tests/fixtures/rules/block-lang/invalid/script/null/ts01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/script/null/ts01-errors.yaml
new file mode 100644
index 000000000..b2d700cdf
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/script/null/ts01-errors.yaml
@@ -0,0 +1,4 @@
+- message: The lang attribute of the
diff --git a/tests/fixtures/rules/block-lang/invalid/script/null/typescript01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/script/null/typescript01-errors.yaml
new file mode 100644
index 000000000..b2d700cdf
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/script/null/typescript01-errors.yaml
@@ -0,0 +1,4 @@
+- message: The lang attribute of the
diff --git a/tests/fixtures/rules/block-lang/invalid/script/shorthand/_config.json b/tests/fixtures/rules/block-lang/invalid/script/shorthand/_config.json
new file mode 100644
index 000000000..d17bbc3da
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/script/shorthand/_config.json
@@ -0,0 +1,3 @@
+{
+ "options": [{ "script": "ts", "style": ["ts", null] }]
+}
diff --git a/tests/fixtures/rules/block-lang/invalid/script/shorthand/javascript01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/script/shorthand/javascript01-errors.yaml
new file mode 100644
index 000000000..b42a142cf
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/script/shorthand/javascript01-errors.yaml
@@ -0,0 +1,4 @@
+- message: The lang attribute of the
diff --git a/tests/fixtures/rules/block-lang/invalid/script/shorthand/js01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/script/shorthand/js01-errors.yaml
new file mode 100644
index 000000000..b42a142cf
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/script/shorthand/js01-errors.yaml
@@ -0,0 +1,4 @@
+- message: The lang attribute of the
diff --git a/tests/fixtures/rules/block-lang/invalid/script/shorthand/null01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/script/shorthand/null01-errors.yaml
new file mode 100644
index 000000000..b42a142cf
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/script/shorthand/null01-errors.yaml
@@ -0,0 +1,4 @@
+- message: The lang attribute of the
diff --git a/tests/fixtures/rules/block-lang/invalid/script/shorthand/ts-as-style-lang01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/script/shorthand/ts-as-style-lang01-errors.yaml
new file mode 100644
index 000000000..b42a142cf
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/script/shorthand/ts-as-style-lang01-errors.yaml
@@ -0,0 +1,4 @@
+- message: The lang attribute of the
+
+
diff --git a/tests/fixtures/rules/block-lang/invalid/script/shorthand/typescript01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/script/shorthand/typescript01-errors.yaml
new file mode 100644
index 000000000..b42a142cf
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/script/shorthand/typescript01-errors.yaml
@@ -0,0 +1,4 @@
+- message: The lang attribute of the
diff --git a/tests/fixtures/rules/block-lang/invalid/script/ts/_config.json b/tests/fixtures/rules/block-lang/invalid/script/ts/_config.json
new file mode 100644
index 000000000..1e4c8d24c
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/script/ts/_config.json
@@ -0,0 +1,3 @@
+{
+ "options": [{ "script": ["ts"], "style": ["ts", null] }]
+}
diff --git a/tests/fixtures/rules/block-lang/invalid/script/ts/javascript01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/script/ts/javascript01-errors.yaml
new file mode 100644
index 000000000..b42a142cf
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/script/ts/javascript01-errors.yaml
@@ -0,0 +1,4 @@
+- message: The lang attribute of the
diff --git a/tests/fixtures/rules/block-lang/invalid/script/ts/js01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/script/ts/js01-errors.yaml
new file mode 100644
index 000000000..b42a142cf
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/script/ts/js01-errors.yaml
@@ -0,0 +1,4 @@
+- message: The lang attribute of the
diff --git a/tests/fixtures/rules/block-lang/invalid/script/ts/null01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/script/ts/null01-errors.yaml
new file mode 100644
index 000000000..b42a142cf
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/script/ts/null01-errors.yaml
@@ -0,0 +1,4 @@
+- message: The lang attribute of the
diff --git a/tests/fixtures/rules/block-lang/invalid/script/ts/ts-as-style-lang01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/script/ts/ts-as-style-lang01-errors.yaml
new file mode 100644
index 000000000..b42a142cf
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/script/ts/ts-as-style-lang01-errors.yaml
@@ -0,0 +1,4 @@
+- message: The lang attribute of the
+
+
diff --git a/tests/fixtures/rules/block-lang/invalid/script/ts/typescript01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/script/ts/typescript01-errors.yaml
new file mode 100644
index 000000000..b42a142cf
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/script/ts/typescript01-errors.yaml
@@ -0,0 +1,4 @@
+- message: The lang attribute of the
diff --git a/tests/fixtures/rules/block-lang/invalid/script/typescript/_config.json b/tests/fixtures/rules/block-lang/invalid/script/typescript/_config.json
new file mode 100644
index 000000000..2c7f534ab
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/script/typescript/_config.json
@@ -0,0 +1,3 @@
+{
+ "options": [{ "script": ["typescript"], "style": ["typescript", null] }]
+}
diff --git a/tests/fixtures/rules/block-lang/invalid/script/typescript/javascript01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/script/typescript/javascript01-errors.yaml
new file mode 100644
index 000000000..a16e8f39a
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/script/typescript/javascript01-errors.yaml
@@ -0,0 +1,4 @@
+- message: The lang attribute of the
diff --git a/tests/fixtures/rules/block-lang/invalid/script/typescript/js01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/script/typescript/js01-errors.yaml
new file mode 100644
index 000000000..a16e8f39a
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/script/typescript/js01-errors.yaml
@@ -0,0 +1,4 @@
+- message: The lang attribute of the
diff --git a/tests/fixtures/rules/block-lang/invalid/script/typescript/null01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/script/typescript/null01-errors.yaml
new file mode 100644
index 000000000..a16e8f39a
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/script/typescript/null01-errors.yaml
@@ -0,0 +1,4 @@
+- message: The lang attribute of the
diff --git a/tests/fixtures/rules/block-lang/invalid/script/typescript/ts01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/script/typescript/ts01-errors.yaml
new file mode 100644
index 000000000..a16e8f39a
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/script/typescript/ts01-errors.yaml
@@ -0,0 +1,4 @@
+- message: The lang attribute of the
diff --git a/tests/fixtures/rules/block-lang/invalid/script/typescript/typescript-as-style-lang01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/script/typescript/typescript-as-style-lang01-errors.yaml
new file mode 100644
index 000000000..a16e8f39a
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/script/typescript/typescript-as-style-lang01-errors.yaml
@@ -0,0 +1,4 @@
+- message: The lang attribute of the
+
+
diff --git a/tests/fixtures/rules/block-lang/invalid/style/enforce/_config.json b/tests/fixtures/rules/block-lang/invalid/style/enforce/_config.json
new file mode 100644
index 000000000..cee6050d5
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/style/enforce/_config.json
@@ -0,0 +1,3 @@
+{
+ "options": [{ "enforceStylePresent": true }]
+}
diff --git a/tests/fixtures/rules/block-lang/invalid/style/enforce/no-style01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/style/enforce/no-style01-errors.yaml
new file mode 100644
index 000000000..68033f635
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/style/enforce/no-style01-errors.yaml
@@ -0,0 +1,4 @@
+- message: The
diff --git a/tests/fixtures/rules/block-lang/invalid/style/null/sass01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/style/null/sass01-errors.yaml
new file mode 100644
index 000000000..3685a4a45
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/style/null/sass01-errors.yaml
@@ -0,0 +1,4 @@
+- message: The lang attribute of the
diff --git a/tests/fixtures/rules/block-lang/invalid/style/null/scss01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/style/null/scss01-errors.yaml
new file mode 100644
index 000000000..3685a4a45
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/style/null/scss01-errors.yaml
@@ -0,0 +1,4 @@
+- message: The lang attribute of the
diff --git a/tests/fixtures/rules/block-lang/invalid/style/sass/_config.json b/tests/fixtures/rules/block-lang/invalid/style/sass/_config.json
new file mode 100644
index 000000000..34b5b4cf6
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/style/sass/_config.json
@@ -0,0 +1,3 @@
+{
+ "options": [{ "script": ["sass", null], "style": ["sass"] }]
+}
diff --git a/tests/fixtures/rules/block-lang/invalid/style/sass/null01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/style/sass/null01-errors.yaml
new file mode 100644
index 000000000..9eec70357
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/style/sass/null01-errors.yaml
@@ -0,0 +1,4 @@
+- message: The lang attribute of the
diff --git a/tests/fixtures/rules/block-lang/invalid/style/sass/sass-as-script-lang01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/style/sass/sass-as-script-lang01-errors.yaml
new file mode 100644
index 000000000..3cd86cbd2
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/style/sass/sass-as-script-lang01-errors.yaml
@@ -0,0 +1,4 @@
+- message: The lang attribute of the
diff --git a/tests/fixtures/rules/block-lang/invalid/style/sass/scss01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/style/sass/scss01-errors.yaml
new file mode 100644
index 000000000..9eec70357
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/style/sass/scss01-errors.yaml
@@ -0,0 +1,4 @@
+- message: The lang attribute of the
diff --git a/tests/fixtures/rules/block-lang/invalid/style/scss/_config.json b/tests/fixtures/rules/block-lang/invalid/style/scss/_config.json
new file mode 100644
index 000000000..d62a21060
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/style/scss/_config.json
@@ -0,0 +1,3 @@
+{
+ "options": [{ "script": ["scss", null], "style": ["scss"] }]
+}
diff --git a/tests/fixtures/rules/block-lang/invalid/style/scss/null01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/style/scss/null01-errors.yaml
new file mode 100644
index 000000000..7663cab19
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/style/scss/null01-errors.yaml
@@ -0,0 +1,4 @@
+- message: The lang attribute of the
diff --git a/tests/fixtures/rules/block-lang/invalid/style/scss/sass01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/style/scss/sass01-errors.yaml
new file mode 100644
index 000000000..7663cab19
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/style/scss/sass01-errors.yaml
@@ -0,0 +1,4 @@
+- message: The lang attribute of the
diff --git a/tests/fixtures/rules/block-lang/invalid/style/scss/scss-as-script-lang01-errors.yaml b/tests/fixtures/rules/block-lang/invalid/style/scss/scss-as-script-lang01-errors.yaml
new file mode 100644
index 000000000..748d36368
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/invalid/style/scss/scss-as-script-lang01-errors.yaml
@@ -0,0 +1,4 @@
+- message: The lang attribute of the
diff --git a/tests/fixtures/rules/block-lang/valid/script/enforce/_config.json b/tests/fixtures/rules/block-lang/valid/script/enforce/_config.json
new file mode 100644
index 000000000..8a49d9a86
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/script/enforce/_config.json
@@ -0,0 +1,3 @@
+{
+ "options": [{ "enforceScriptPresent": true }]
+}
diff --git a/tests/fixtures/rules/block-lang/valid/script/enforce/script-present01-input.svelte b/tests/fixtures/rules/block-lang/valid/script/enforce/script-present01-input.svelte
new file mode 100644
index 000000000..5d2a3a05b
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/script/enforce/script-present01-input.svelte
@@ -0,0 +1 @@
+
diff --git a/tests/fixtures/rules/block-lang/valid/script/javascript/_config.json b/tests/fixtures/rules/block-lang/valid/script/javascript/_config.json
new file mode 100644
index 000000000..d3821a72b
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/script/javascript/_config.json
@@ -0,0 +1,3 @@
+{
+ "options": [{ "script": ["javascript"], "style": ["scss", null] }]
+}
diff --git a/tests/fixtures/rules/block-lang/valid/script/javascript/correct-lang01-input.svelte b/tests/fixtures/rules/block-lang/valid/script/javascript/correct-lang01-input.svelte
new file mode 100644
index 000000000..9cd8f894c
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/script/javascript/correct-lang01-input.svelte
@@ -0,0 +1,3 @@
+
+
+
diff --git a/tests/fixtures/rules/block-lang/valid/script/javascript/no-script01-input.svelte b/tests/fixtures/rules/block-lang/valid/script/javascript/no-script01-input.svelte
new file mode 100644
index 000000000..8a73be9fa
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/script/javascript/no-script01-input.svelte
@@ -0,0 +1 @@
+Hello World!
diff --git a/tests/fixtures/rules/block-lang/valid/script/javascript/style-lang01-input.svelte b/tests/fixtures/rules/block-lang/valid/script/javascript/style-lang01-input.svelte
new file mode 100644
index 000000000..8d0654b10
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/script/javascript/style-lang01-input.svelte
@@ -0,0 +1,3 @@
+
+
+
diff --git a/tests/fixtures/rules/block-lang/valid/script/js/_config.json b/tests/fixtures/rules/block-lang/valid/script/js/_config.json
new file mode 100644
index 000000000..a74c6fc72
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/script/js/_config.json
@@ -0,0 +1,3 @@
+{
+ "options": [{ "script": ["js"], "style": ["scss", null] }]
+}
diff --git a/tests/fixtures/rules/block-lang/valid/script/js/correct-lang01-input.svelte b/tests/fixtures/rules/block-lang/valid/script/js/correct-lang01-input.svelte
new file mode 100644
index 000000000..2c9136f49
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/script/js/correct-lang01-input.svelte
@@ -0,0 +1,3 @@
+
+
+
diff --git a/tests/fixtures/rules/block-lang/valid/script/js/no-script01-input.svelte b/tests/fixtures/rules/block-lang/valid/script/js/no-script01-input.svelte
new file mode 100644
index 000000000..8a73be9fa
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/script/js/no-script01-input.svelte
@@ -0,0 +1 @@
+Hello World!
diff --git a/tests/fixtures/rules/block-lang/valid/script/js/style-lang01-input.svelte b/tests/fixtures/rules/block-lang/valid/script/js/style-lang01-input.svelte
new file mode 100644
index 000000000..78191fcf3
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/script/js/style-lang01-input.svelte
@@ -0,0 +1,3 @@
+
+
+
diff --git a/tests/fixtures/rules/block-lang/valid/script/multiple/_config.json b/tests/fixtures/rules/block-lang/valid/script/multiple/_config.json
new file mode 100644
index 000000000..8a367b319
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/script/multiple/_config.json
@@ -0,0 +1,3 @@
+{
+ "options": [{ "script": ["ts"], "style": ["scss", null] }]
+}
diff --git a/tests/fixtures/rules/block-lang/valid/script/multiple/correct-lang01-input.svelte b/tests/fixtures/rules/block-lang/valid/script/multiple/correct-lang01-input.svelte
new file mode 100644
index 000000000..4bcdbdb9b
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/script/multiple/correct-lang01-input.svelte
@@ -0,0 +1,3 @@
+
+
+
diff --git a/tests/fixtures/rules/block-lang/valid/script/multiple/no-script01-input.svelte b/tests/fixtures/rules/block-lang/valid/script/multiple/no-script01-input.svelte
new file mode 100644
index 000000000..8a73be9fa
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/script/multiple/no-script01-input.svelte
@@ -0,0 +1 @@
+Hello World!
diff --git a/tests/fixtures/rules/block-lang/valid/script/multiple/style-lang01-input.svelte b/tests/fixtures/rules/block-lang/valid/script/multiple/style-lang01-input.svelte
new file mode 100644
index 000000000..b995c06ab
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/script/multiple/style-lang01-input.svelte
@@ -0,0 +1,3 @@
+
+
+
diff --git a/tests/fixtures/rules/block-lang/valid/script/null/_config.json b/tests/fixtures/rules/block-lang/valid/script/null/_config.json
new file mode 100644
index 000000000..14768e256
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/script/null/_config.json
@@ -0,0 +1,3 @@
+{
+ "options": [{ "script": [null], "style": ["scss", null] }]
+}
diff --git a/tests/fixtures/rules/block-lang/valid/script/null/no-lang01-input.svelte b/tests/fixtures/rules/block-lang/valid/script/null/no-lang01-input.svelte
new file mode 100644
index 000000000..fda97fce1
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/script/null/no-lang01-input.svelte
@@ -0,0 +1,3 @@
+
+
+
diff --git a/tests/fixtures/rules/block-lang/valid/script/null/no-script01-input.svelte b/tests/fixtures/rules/block-lang/valid/script/null/no-script01-input.svelte
new file mode 100644
index 000000000..8a73be9fa
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/script/null/no-script01-input.svelte
@@ -0,0 +1 @@
+Hello World!
diff --git a/tests/fixtures/rules/block-lang/valid/script/null/style-lang01-input.svelte b/tests/fixtures/rules/block-lang/valid/script/null/style-lang01-input.svelte
new file mode 100644
index 000000000..9c1c647da
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/script/null/style-lang01-input.svelte
@@ -0,0 +1,3 @@
+
+
+
diff --git a/tests/fixtures/rules/block-lang/valid/script/shorthand/_config.json b/tests/fixtures/rules/block-lang/valid/script/shorthand/_config.json
new file mode 100644
index 000000000..0532deae6
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/script/shorthand/_config.json
@@ -0,0 +1,3 @@
+{
+ "options": [{ "script": "ts", "style": ["scss", null] }]
+}
diff --git a/tests/fixtures/rules/block-lang/valid/script/shorthand/correct-lang01-input.svelte b/tests/fixtures/rules/block-lang/valid/script/shorthand/correct-lang01-input.svelte
new file mode 100644
index 000000000..4bcdbdb9b
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/script/shorthand/correct-lang01-input.svelte
@@ -0,0 +1,3 @@
+
+
+
diff --git a/tests/fixtures/rules/block-lang/valid/script/shorthand/no-script01-input.svelte b/tests/fixtures/rules/block-lang/valid/script/shorthand/no-script01-input.svelte
new file mode 100644
index 000000000..8a73be9fa
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/script/shorthand/no-script01-input.svelte
@@ -0,0 +1 @@
+Hello World!
diff --git a/tests/fixtures/rules/block-lang/valid/script/shorthand/style-lang01-input.svelte b/tests/fixtures/rules/block-lang/valid/script/shorthand/style-lang01-input.svelte
new file mode 100644
index 000000000..b995c06ab
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/script/shorthand/style-lang01-input.svelte
@@ -0,0 +1,3 @@
+
+
+
diff --git a/tests/fixtures/rules/block-lang/valid/script/ts/_config.json b/tests/fixtures/rules/block-lang/valid/script/ts/_config.json
new file mode 100644
index 000000000..476786668
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/script/ts/_config.json
@@ -0,0 +1,3 @@
+{
+ "options": [{ "script": ["ts", "typescript", null], "style": ["scss", null] }]
+}
diff --git a/tests/fixtures/rules/block-lang/valid/script/ts/correct-lang01-input.svelte b/tests/fixtures/rules/block-lang/valid/script/ts/correct-lang01-input.svelte
new file mode 100644
index 000000000..4bcdbdb9b
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/script/ts/correct-lang01-input.svelte
@@ -0,0 +1,3 @@
+
+
+
diff --git a/tests/fixtures/rules/block-lang/valid/script/ts/correct-lang02-input.svelte b/tests/fixtures/rules/block-lang/valid/script/ts/correct-lang02-input.svelte
new file mode 100644
index 000000000..091a3f97a
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/script/ts/correct-lang02-input.svelte
@@ -0,0 +1,3 @@
+
+
+
diff --git a/tests/fixtures/rules/block-lang/valid/script/ts/correct-lang03-input.svelte b/tests/fixtures/rules/block-lang/valid/script/ts/correct-lang03-input.svelte
new file mode 100644
index 000000000..fda97fce1
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/script/ts/correct-lang03-input.svelte
@@ -0,0 +1,3 @@
+
+
+
diff --git a/tests/fixtures/rules/block-lang/valid/script/ts/no-script01-input.svelte b/tests/fixtures/rules/block-lang/valid/script/ts/no-script01-input.svelte
new file mode 100644
index 000000000..8a73be9fa
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/script/ts/no-script01-input.svelte
@@ -0,0 +1 @@
+Hello World!
diff --git a/tests/fixtures/rules/block-lang/valid/script/ts/style-lang01-input.svelte b/tests/fixtures/rules/block-lang/valid/script/ts/style-lang01-input.svelte
new file mode 100644
index 000000000..b995c06ab
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/script/ts/style-lang01-input.svelte
@@ -0,0 +1,3 @@
+
+
+
diff --git a/tests/fixtures/rules/block-lang/valid/script/ts/style-lang02-input.svelte b/tests/fixtures/rules/block-lang/valid/script/ts/style-lang02-input.svelte
new file mode 100644
index 000000000..ffd69ac3b
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/script/ts/style-lang02-input.svelte
@@ -0,0 +1,3 @@
+
+
+
diff --git a/tests/fixtures/rules/block-lang/valid/script/ts/style-lang03-input.svelte b/tests/fixtures/rules/block-lang/valid/script/ts/style-lang03-input.svelte
new file mode 100644
index 000000000..9c1c647da
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/script/ts/style-lang03-input.svelte
@@ -0,0 +1,3 @@
+
+
+
diff --git a/tests/fixtures/rules/block-lang/valid/script/typescript/_config.json b/tests/fixtures/rules/block-lang/valid/script/typescript/_config.json
new file mode 100644
index 000000000..f5c283dde
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/script/typescript/_config.json
@@ -0,0 +1,3 @@
+{
+ "options": [{ "script": ["typescript"], "style": ["scss", null] }]
+}
diff --git a/tests/fixtures/rules/block-lang/valid/script/typescript/correct-lang01-input.svelte b/tests/fixtures/rules/block-lang/valid/script/typescript/correct-lang01-input.svelte
new file mode 100644
index 000000000..091a3f97a
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/script/typescript/correct-lang01-input.svelte
@@ -0,0 +1,3 @@
+
+
+
diff --git a/tests/fixtures/rules/block-lang/valid/script/typescript/no-script01-input.svelte b/tests/fixtures/rules/block-lang/valid/script/typescript/no-script01-input.svelte
new file mode 100644
index 000000000..8a73be9fa
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/script/typescript/no-script01-input.svelte
@@ -0,0 +1 @@
+Hello World!
diff --git a/tests/fixtures/rules/block-lang/valid/script/typescript/style-lang01-input.svelte b/tests/fixtures/rules/block-lang/valid/script/typescript/style-lang01-input.svelte
new file mode 100644
index 000000000..ffd69ac3b
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/script/typescript/style-lang01-input.svelte
@@ -0,0 +1,3 @@
+
+
+
diff --git a/tests/fixtures/rules/block-lang/valid/style/enforce/_config.json b/tests/fixtures/rules/block-lang/valid/style/enforce/_config.json
new file mode 100644
index 000000000..cee6050d5
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/style/enforce/_config.json
@@ -0,0 +1,3 @@
+{
+ "options": [{ "enforceStylePresent": true }]
+}
diff --git a/tests/fixtures/rules/block-lang/valid/style/enforce/style-present01-input.svelte b/tests/fixtures/rules/block-lang/valid/style/enforce/style-present01-input.svelte
new file mode 100644
index 000000000..6f29e9e9f
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/style/enforce/style-present01-input.svelte
@@ -0,0 +1 @@
+
diff --git a/tests/fixtures/rules/block-lang/valid/style/null/_config.json b/tests/fixtures/rules/block-lang/valid/style/null/_config.json
new file mode 100644
index 000000000..d59d17654
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/style/null/_config.json
@@ -0,0 +1,3 @@
+{
+ "options": [{ "script": ["js", null], "style": [null] }]
+}
diff --git a/tests/fixtures/rules/block-lang/valid/style/null/no-lang01-input.svelte b/tests/fixtures/rules/block-lang/valid/style/null/no-lang01-input.svelte
new file mode 100644
index 000000000..fda97fce1
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/style/null/no-lang01-input.svelte
@@ -0,0 +1,3 @@
+
+
+
diff --git a/tests/fixtures/rules/block-lang/valid/style/null/no-style01-input.svelte b/tests/fixtures/rules/block-lang/valid/style/null/no-style01-input.svelte
new file mode 100644
index 000000000..8a73be9fa
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/style/null/no-style01-input.svelte
@@ -0,0 +1 @@
+Hello World!
diff --git a/tests/fixtures/rules/block-lang/valid/style/null/script-lang01-input.svelte b/tests/fixtures/rules/block-lang/valid/style/null/script-lang01-input.svelte
new file mode 100644
index 000000000..2c9136f49
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/style/null/script-lang01-input.svelte
@@ -0,0 +1,3 @@
+
+
+
diff --git a/tests/fixtures/rules/block-lang/valid/style/sass/_config.json b/tests/fixtures/rules/block-lang/valid/style/sass/_config.json
new file mode 100644
index 000000000..4f1f5a75d
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/style/sass/_config.json
@@ -0,0 +1,3 @@
+{
+ "options": [{ "script": ["ts", null], "style": ["sass"] }]
+}
diff --git a/tests/fixtures/rules/block-lang/valid/style/sass/correct-lang01-input.svelte b/tests/fixtures/rules/block-lang/valid/style/sass/correct-lang01-input.svelte
new file mode 100644
index 000000000..d64de58f5
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/style/sass/correct-lang01-input.svelte
@@ -0,0 +1,5 @@
+
+
+
diff --git a/tests/fixtures/rules/block-lang/valid/style/sass/no-style01-input.svelte b/tests/fixtures/rules/block-lang/valid/style/sass/no-style01-input.svelte
new file mode 100644
index 000000000..8a73be9fa
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/style/sass/no-style01-input.svelte
@@ -0,0 +1 @@
+Hello World!
diff --git a/tests/fixtures/rules/block-lang/valid/style/sass/script-lang01-input.svelte b/tests/fixtures/rules/block-lang/valid/style/sass/script-lang01-input.svelte
new file mode 100644
index 000000000..25a97b328
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/style/sass/script-lang01-input.svelte
@@ -0,0 +1,5 @@
+
+
+
diff --git a/tests/fixtures/rules/block-lang/valid/style/scss/_config.json b/tests/fixtures/rules/block-lang/valid/style/scss/_config.json
new file mode 100644
index 000000000..6c2d7f657
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/style/scss/_config.json
@@ -0,0 +1,3 @@
+{
+ "options": [{ "script": ["js", null], "style": ["scss"] }]
+}
diff --git a/tests/fixtures/rules/block-lang/valid/style/scss/correct-lang01-input.svelte b/tests/fixtures/rules/block-lang/valid/style/scss/correct-lang01-input.svelte
new file mode 100644
index 000000000..9c1c647da
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/style/scss/correct-lang01-input.svelte
@@ -0,0 +1,3 @@
+
+
+
diff --git a/tests/fixtures/rules/block-lang/valid/style/scss/no-style01-input.svelte b/tests/fixtures/rules/block-lang/valid/style/scss/no-style01-input.svelte
new file mode 100644
index 000000000..8a73be9fa
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/style/scss/no-style01-input.svelte
@@ -0,0 +1 @@
+Hello World!
diff --git a/tests/fixtures/rules/block-lang/valid/style/scss/script-lang01-input.svelte b/tests/fixtures/rules/block-lang/valid/style/scss/script-lang01-input.svelte
new file mode 100644
index 000000000..78191fcf3
--- /dev/null
+++ b/tests/fixtures/rules/block-lang/valid/style/scss/script-lang01-input.svelte
@@ -0,0 +1,3 @@
+
+
+
diff --git a/tests/src/rules/block-lang.ts b/tests/src/rules/block-lang.ts
new file mode 100644
index 000000000..4453576e1
--- /dev/null
+++ b/tests/src/rules/block-lang.ts
@@ -0,0 +1,12 @@
+import { RuleTester } from "eslint"
+import rule from "../../../src/rules/block-lang"
+import { loadTestCases } from "../../utils/utils"
+
+const tester = new RuleTester({
+ parserOptions: {
+ ecmaVersion: 2020,
+ sourceType: "module",
+ },
+})
+
+tester.run("block-lang", rule as any, loadTestCases("block-lang"))