From 195dd5e48a2a787d0a69061861b5f763828288cc Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Tue, 5 Mar 2024 11:15:51 +0000 Subject: [PATCH 01/34] release: 1.6.0 --- package.json | 6 +++--- packages/@biomejs/biome/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 032a10b7dbe3..9ab29d52c7ef 100644 --- a/package.json +++ b/package.json @@ -3,9 +3,9 @@ "private": true, "version": "0.0.0", "scripts": { - "check:apply": "cargo biome-cli-dev check --apply-unsafe editors website packages/@biomejs/js-api packages/tailwindcss-config-analyzer", - "check": "cargo biome-cli-dev check editors website packages/@biomejs/js-api packages/tailwindcss-config-analyzer", - "ci": "cargo biome-cli-dev ci editors website packages/@biomejs/js-api packages/tailwindcss-config-analyzer" + "check:apply": "cargo biome-cli-dev check --apply-unsafe website packages/@biomejs/js-api packages/tailwindcss-config-analyzer", + "check": "cargo biome-cli-dev check website packages/@biomejs/js-api packages/tailwindcss-config-analyzer", + "ci": "cargo biome-cli-dev ci website packages/@biomejs/js-api packages/tailwindcss-config-analyzer" }, "keywords": [], "author": "", diff --git a/packages/@biomejs/biome/package.json b/packages/@biomejs/biome/package.json index 08fc97006d07..f58d32d76593 100644 --- a/packages/@biomejs/biome/package.json +++ b/packages/@biomejs/biome/package.json @@ -1,6 +1,6 @@ { "name": "@biomejs/biome", - "version": "1.5.3", + "version": "1.6.0", "bin": "bin/biome", "scripts": { "postinstall": "node scripts/postinstall.js" From 92391f7bd2155bf5723df3317aaeb076954b690a Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Tue, 5 Mar 2024 13:08:47 +0000 Subject: [PATCH 02/34] update some documentation --- .github/ISSUE_TEMPLATE/01_formatter_bug.yml | 2 +- .github/ISSUE_TEMPLATE/02_lint_bug.yml | 2 +- CHANGELOG.md | 2 +- website/astro.config.ts | 1 - .../content/docs/guides/getting-started.mdx | 21 +++++++++++++++- .../content/docs/guides/how-biome-works.mdx | 3 ++- .../src/content/docs/internals/changelog.md | 2 +- .../docs/internals/language-support.mdx | 24 +++++++++++++------ 8 files changed, 43 insertions(+), 14 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/01_formatter_bug.yml b/.github/ISSUE_TEMPLATE/01_formatter_bug.yml index a1481873634a..e0dbbb54e17f 100644 --- a/.github/ISSUE_TEMPLATE/01_formatter_bug.yml +++ b/.github/ISSUE_TEMPLATE/01_formatter_bug.yml @@ -15,7 +15,7 @@ body: id: environment attributes: label: Environment information - description: Run the command `biome rage` and paste its output here. Please review it, in case there are sensitive information you don't want to share. + description: Run the command `biome rage --formatter` and paste its output here. Please review it, in case there are sensitive information you don't want to share. render: bash validations: required: true diff --git a/.github/ISSUE_TEMPLATE/02_lint_bug.yml b/.github/ISSUE_TEMPLATE/02_lint_bug.yml index b3e32abd7cbb..592637aaac44 100644 --- a/.github/ISSUE_TEMPLATE/02_lint_bug.yml +++ b/.github/ISSUE_TEMPLATE/02_lint_bug.yml @@ -15,7 +15,7 @@ body: id: environment attributes: label: Environment information - description: Run the command `biome rage` and paste its output here. Please review it, in case there are sensitive information you don't want to share. + description: Run the command `biome rage --linter` and paste its output here. Please review it, in case there are sensitive information you don't want to share. render: bash validations: required: true diff --git a/CHANGELOG.md b/CHANGELOG.md index 015659497743..4c501a38d3aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ New entries must be placed in a section entitled `Unreleased`. Read our [guidelines for writing a good changelog entry](https://github.com/biomejs/biome/blob/main/CONTRIBUTING.md#changelog). -## Unreleased +## 1.6.0 (TBD) ### Analyzer diff --git a/website/astro.config.ts b/website/astro.config.ts index e621bae7139b..22e91ee22352 100644 --- a/website/astro.config.ts +++ b/website/astro.config.ts @@ -240,7 +240,6 @@ export default defineConfig({ { label: "Git Hooks", link: "/recipes/git-hooks", - badge: "New", }, ], }, diff --git a/website/src/content/docs/guides/getting-started.mdx b/website/src/content/docs/guides/getting-started.mdx index 79e029bf83ea..345ec86da323 100644 --- a/website/src/content/docs/guides/getting-started.mdx +++ b/website/src/content/docs/guides/getting-started.mdx @@ -59,9 +59,28 @@ After running the `init` command, you'll now have a new `biome.json` file in you } ``` +Alternatively, you can run `biome init --jsonc` , and emit a `biome.jsonc` file: + + + +```json title="biome.jsonc" +{ + "$schema": "https://biomejs.dev/schemas/1.5.3/schema.json", + "organizeImports": { + "enabled": false + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true + } + } +} +``` + The `linter.enabled: true` enables the linter and `rules.recommended: true` enables the [recommended rules](/linter/rules/). -Formatting is enabled because the configuration doesn't explicitly [disable](/reference/configuration/#formatterenabled) formatting with `formatter.enabled: false`. +Formatting is enabled **by default**, because the configuration doesn't explicitly [disable](/reference/configuration/#formatterenabled) formatting with `formatter.enabled: false`. ## Usage diff --git a/website/src/content/docs/guides/how-biome-works.mdx b/website/src/content/docs/guides/how-biome-works.mdx index 65ea04c30787..ac7fe9c4e606 100644 --- a/website/src/content/docs/guides/how-biome-works.mdx +++ b/website/src/content/docs/guides/how-biome-works.mdx @@ -125,9 +125,10 @@ From version `v1.6.0`, Biome is able to resolve configuration files from `node_m In order to do so, the first thing to do is to set up your "shared" Biome configuration in a certain way. Let's suppose that your library is called `@org/shared-configs`, and you want to import the Biome configuration using the specifier `@org/shared-configs/biome`. You have to set up the `package.json` is a specific way: -```json title="package.json" ins={4} +```json title="package.json" ins={5,3} { "name": "@org/shared-configs", + "type": "module", "exports": { "./biome": "./biome.json" } diff --git a/website/src/content/docs/internals/changelog.md b/website/src/content/docs/internals/changelog.md index e3c65ff75d08..795b3037da1b 100644 --- a/website/src/content/docs/internals/changelog.md +++ b/website/src/content/docs/internals/changelog.md @@ -15,7 +15,7 @@ New entries must be placed in a section entitled `Unreleased`. Read our [guidelines for writing a good changelog entry](https://github.com/biomejs/biome/blob/main/CONTRIBUTING.md#changelog). -## Unreleased +## 1.6.0 (TBD) ### Analyzer diff --git a/website/src/content/docs/internals/language-support.mdx b/website/src/content/docs/internals/language-support.mdx index 779d79e70b15..686f35afc41f 100644 --- a/website/src/content/docs/internals/language-support.mdx +++ b/website/src/content/docs/internals/language-support.mdx @@ -3,6 +3,12 @@ title: Language support description: Languages and features supported by Biome. --- +Legend: +- ✅: Supported +- đŸšĢ: Not in progress +- ⌛ī¸: In progress +- ⚠ī¸: Partially supported (with some caveats) + | Language | Parsing | Formatting | Linting | |-----------------------------------------|---------------------------------------------------------|---------------------------------------------------------|---------------------------------------------------------| | [JavaScript](#javascript-support) | ✅ | ✅ | ✅ | @@ -11,11 +17,11 @@ description: Languages and features supported by Biome. | TSX | ✅ | ✅ | ✅ | | JSON | ✅ | ✅ | ✅ | | JSONC | ✅ | ✅ | ✅ | -| HTML | đŸšĢ | đŸšĢ | đŸšĢ | -| [Vue](#html-super-languages-support) | đŸšĢ | đŸšĢ | đŸšĢ | -| [Svelte](#html-super-languages-support) | đŸšĢ | đŸšĢ | đŸšĢ | -| [Astro](#html-super-languages-support) | đŸšĢ | đŸšĢ | đŸšĢ | -| CSS | ⌛ī¸ | ⌛ī¸ | đŸšĢ | +| HTML | ⌛ī¸ | đŸšĢ | đŸšĢ | +| [Vue](#html-super-languages-support) | ⚠ī¸ | ⚠ī¸ | ⚠ī¸ | +| [Svelte](#html-super-languages-support) | ⚠ī¸ | ⚠ī¸ | ⚠ī¸ | +| [Astro](#html-super-languages-support) | ⚠ī¸ | ⚠ī¸ | ⚠ī¸ | +| CSS | ✅ī¸ | ⌛ī¸ | đŸšĢ | | Markdown | đŸšĢ | đŸšĢ | đŸšĢ | @@ -32,5 +38,9 @@ Biome supports TypeScript version 5.2. ## HTML super languages support -These languages require CSS, HTML and JavaScript parsing to be supported properly. Once those parsers are -available, the works around these super languages can start. +From version `v1.6.0`, these languages are **partially** supported. There are some expectations and limitations to take in considerations: +- For `.astro` file, **only** the **frontmatter** portion of the file is supported. +- For `.vue` and `.svelte` files, **only** the **\** tags portion of the file is supported. +- Diagnostics will only show code frames that belong to the portions before mentioned. +- When **formatting** `.vue` and `.svelte` files, the indentation of the JavaScript/TypeScript code will start from the beginning. +- When **linting** `.astro` files, you have to add `"Astro"` to `linter.globals`, to avoid possible false positives from some lint rules. From 1489b21943ffef2ea38f8b4f8a8286386126f50f Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Wed, 6 Mar 2024 11:54:22 +0000 Subject: [PATCH 03/34] chore: first draft of the blog post --- crates/biome_service/src/file_handlers/vue.rs | 2 +- .../assets/blog/biome-v1-6/astro-linter.png | Bin 0 -> 141021 bytes .../assets/blog/biome-v1-6/svelte-linter.png | Bin 0 -> 147723 bytes .../src/assets/blog/biome-v1-6/vue-linter.png | Bin 0 -> 148542 bytes website/src/components/BlogPostInfo.astro | 2 +- website/src/content/blog/biome-v1-5.md | 2 +- website/src/content/blog/biome-v1-6.mdx | 228 ++++++++++++++++++ .../docs/internals/language-support.mdx | 22 +- website/src/layouts/Blog.astro | 2 + website/src/styles/_card.scss | 7 +- 10 files changed, 248 insertions(+), 17 deletions(-) create mode 100644 website/src/assets/blog/biome-v1-6/astro-linter.png create mode 100644 website/src/assets/blog/biome-v1-6/svelte-linter.png create mode 100644 website/src/assets/blog/biome-v1-6/vue-linter.png create mode 100644 website/src/content/blog/biome-v1-6.mdx diff --git a/crates/biome_service/src/file_handlers/vue.rs b/crates/biome_service/src/file_handlers/vue.rs index ff38fc40f857..e24d292c9b74 100644 --- a/crates/biome_service/src/file_handlers/vue.rs +++ b/crates/biome_service/src/file_handlers/vue.rs @@ -63,7 +63,7 @@ impl VueFileHandler { /// Returns the start byte offset of the Vue ` + ``` - When **linting** `.astro` files, you have to add `"Astro"` to `linter.globals`, to avoid possible false positives from some lint rules. + + ```json title="biome.json" + { + "linter": { + "globals": "Astro" + } + } + ``` + +- When **linting** `.svelte` files, it's advised to turn off `useConst` to prevent compiler errors. Use the option `overrides` for that: + + ```json + { + "overrides": [ + { + "include": ["*.svelte"], + "linter": { + "rules": { + "style": { + "useConst": "off" + } + } + } + } + ] + } + ``` From c9420688a72aea1b576e3ed8ef6035f2997519ec Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Thu, 7 Mar 2024 10:20:15 +0000 Subject: [PATCH 16/34] fix diagnostics for `useJsxKeyInIterable` --- .../nursery/use_jsx_key_in_iterable.rs | 4 +- .../linter/rules/use-jsx-key-in-iterable.md | 23 +- .../src/pages/schemas/1.6.0/schema.json.js | 363 ++++++++++-------- 3 files changed, 211 insertions(+), 179 deletions(-) diff --git a/crates/biome_js_analyze/src/semantic_analyzers/nursery/use_jsx_key_in_iterable.rs b/crates/biome_js_analyze/src/semantic_analyzers/nursery/use_jsx_key_in_iterable.rs index ca78ff042f52..fd54b6faf6df 100644 --- a/crates/biome_js_analyze/src/semantic_analyzers/nursery/use_jsx_key_in_iterable.rs +++ b/crates/biome_js_analyze/src/semantic_analyzers/nursery/use_jsx_key_in_iterable.rs @@ -22,7 +22,9 @@ declare_rule! { /// ### Invalid /// /// ```js,expect_diagnostic - /// [, , ]; + /// []; + /// ``` + /// ```js,expect_diagnostic /// data.map((x) => {x}); /// ``` /// diff --git a/website/src/content/docs/linter/rules/use-jsx-key-in-iterable.md b/website/src/content/docs/linter/rules/use-jsx-key-in-iterable.md index d3d97de7db44..30f9f4ccaed8 100644 --- a/website/src/content/docs/linter/rules/use-jsx-key-in-iterable.md +++ b/website/src/content/docs/linter/rules/use-jsx-key-in-iterable.md @@ -24,31 +24,34 @@ Check out React documentation for [explanation on the why does React need keys.] ### Invalid ```jsx -[, , ]; -data.map((x) => {x}); +[]; ```
nursery/useJsxKeyInIterable.js:1:2 lint/nursery/useJsxKeyInIterable ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 
   ⚠ Missing key property for this element in iterable.
   
-  > 1 │ [<Hello />, <Hello />, <Hello />];
+  > 1 │ [<Hello />];
       │  ^^^^^^^^^
-    2 │ data.map((x) => <Hello>{x}</Hello>);
-    3 │ 
+    2 │ 
   
   ℹ The order of the items may change, and having a key can help React identify which item was moved.
   
   ℹ Check the React documentation. 
   
-nursery/useJsxKeyInIterable.js:1:13 lint/nursery/useJsxKeyInIterable ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+
+ +```jsx +data.map((x) => {x}); +``` + +
nursery/useJsxKeyInIterable.js:1:17 lint/nursery/useJsxKeyInIterable ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 
   ⚠ Missing key property for this element in iterable.
   
-  > 1 │ [<Hello />, <Hello />, <Hello />];
-      │             ^^^^^^^^^
-    2 │ data.map((x) => <Hello>{x}</Hello>);
-    3 │ 
+  > 1 │ data.map((x) => <Hello>{x}</Hello>);
+      │                 ^^^^^^^
+    2 │ 
   
   ℹ The order of the items may change, and having a key can help React identify which item was moved.
   
diff --git a/website/src/pages/schemas/1.6.0/schema.json.js b/website/src/pages/schemas/1.6.0/schema.json.js
index ebc8d7a62447..d6e540728d41 100644
--- a/website/src/pages/schemas/1.6.0/schema.json.js
+++ b/website/src/pages/schemas/1.6.0/schema.json.js
@@ -335,6 +335,14 @@ export function GET() {
 							{ type: "null" },
 						],
 					},
+					noEmptyTypeParameters: {
+						description:
+							"Disallow empty type parameters in type aliases and interfaces.",
+						anyOf: [
+							{ $ref: "#/definitions/RuleConfiguration" },
+							{ type: "null" },
+						],
+					},
 					noExcessiveCognitiveComplexity: {
 						description:
 							"Disallow functions that exceed a given Cognitive Complexity score.",
@@ -416,6 +424,13 @@ export function GET() {
 							{ type: "null" },
 						],
 					},
+					noUselessLoneBlockStatements: {
+						description: "Disallow unnecessary nested block statements.",
+						anyOf: [
+							{ $ref: "#/definitions/RuleConfiguration" },
+							{ type: "null" },
+						],
+					},
 					noUselessRename: {
 						description:
 							"Disallow renaming import, export, and destructured assignments to the same name.",
@@ -524,7 +539,7 @@ export function GET() {
 			ComplexityConfiguration: {
 				anyOf: [
 					{ $ref: "#/definitions/RulePlainConfiguration" },
-					{ $ref: "RuleWithComplexityOptions" },
+					{ $ref: "#/definitions/RuleWithComplexityOptions" },
 				],
 			},
 			ComplexityOptions: {
@@ -559,7 +574,7 @@ export function GET() {
 			ConsistentArrayTypeConfiguration: {
 				anyOf: [
 					{ $ref: "#/definitions/RulePlainConfiguration" },
-					{ $ref: "RuleWithConsistentArrayTypeOptions" },
+					{ $ref: "#/definitions/RuleWithConsistentArrayTypeOptions" },
 				],
 			},
 			ConsistentArrayTypeOptions: {
@@ -654,6 +669,14 @@ export function GET() {
 							{ type: "null" },
 						],
 					},
+					noInvalidUseBeforeDeclaration: {
+						description:
+							"Disallow the use of variables and function parameters before their declaration",
+						anyOf: [
+							{ $ref: "#/definitions/RuleConfiguration" },
+							{ type: "null" },
+						],
+					},
 					noNewSymbol: {
 						description: "Disallow new operators with the Symbol object.",
 						anyOf: [
@@ -759,6 +782,13 @@ export function GET() {
 							{ type: "null" },
 						],
 					},
+					noUnusedImports: {
+						description: "Disallow unused imports.",
+						anyOf: [
+							{ $ref: "#/definitions/RuleConfiguration" },
+							{ type: "null" },
+						],
+					},
 					noUnusedLabels: {
 						description: "Disallow unused labels.",
 						anyOf: [
@@ -766,6 +796,13 @@ export function GET() {
 							{ type: "null" },
 						],
 					},
+					noUnusedPrivateClassMembers: {
+						description: "Disallow unused private class members",
+						anyOf: [
+							{ $ref: "#/definitions/RuleConfiguration" },
+							{ type: "null" },
+						],
+					},
 					noUnusedVariables: {
 						description: "Disallow unused variables.",
 						anyOf: [
@@ -793,6 +830,13 @@ export function GET() {
 						description: "It enables the recommended rules for this group",
 						type: ["boolean", "null"],
 					},
+					useAwait: {
+						description: "Ensure async functions utilize await.",
+						anyOf: [
+							{ $ref: "#/definitions/RuleConfiguration" },
+							{ type: "null" },
+						],
+					},
 					useExhaustiveDependencies: {
 						description:
 							"Enforce all dependencies are correctly specified in a React hook.",
@@ -910,7 +954,7 @@ export function GET() {
 			DeprecatedHooksConfiguration: {
 				anyOf: [
 					{ $ref: "#/definitions/RulePlainConfiguration" },
-					{ $ref: "RuleWithDeprecatedHooksOptions" },
+					{ $ref: "#/definitions/RuleWithDeprecatedHooksOptions" },
 				],
 			},
 			DeprecatedHooksOptions: {
@@ -969,7 +1013,7 @@ export function GET() {
 			FilenamingConventionConfiguration: {
 				anyOf: [
 					{ $ref: "#/definitions/RulePlainConfiguration" },
-					{ $ref: "RuleWithFilenamingConventionOptions" },
+					{ $ref: "#/definitions/RuleWithFilenamingConventionOptions" },
 				],
 			},
 			FilenamingConventionOptions: {
@@ -1079,32 +1123,37 @@ export function GET() {
 				},
 				additionalProperties: false,
 			},
-			Hooks: {
+			Hook: {
 				type: "object",
-				required: ["name"],
+				required: ["name", "stableResult"],
 				properties: {
 					closureIndex: {
 						description:
-							'The "position" of the closure function, starting from zero.\n\n### Example',
+							'The "position" of the closure function, starting from zero.\n\nFor example, for React\'s `useEffect()` hook, the closure index is 0.',
 						type: ["integer", "null"],
-						format: "uint",
+						format: "uint8",
 						minimum: 0.0,
 					},
 					dependenciesIndex: {
 						description:
-							'The "position" of the array of dependencies, starting from zero.',
+							'The "position" of the array of dependencies, starting from zero.\n\nFor example, for React\'s `useEffect()` hook, the dependencies index is 1.',
 						type: ["integer", "null"],
-						format: "uint",
+						format: "uint8",
 						minimum: 0.0,
 					},
-					name: { description: "The name of the hook", type: "string" },
+					name: { description: "The name of the hook.", type: "string" },
+					stableResult: {
+						description:
+							"Whether the result of the hook is stable.\n\nSet to `true` to mark the identity of the hook's return value as stable, or use a number/an array of numbers to mark the \"positions\" in the return array as stable.\n\nFor example, for React's `useRef()` hook the value would be `true`, while for `useState()` it would be `[1]`.",
+						allOf: [{ $ref: "#/definitions/StableHookResult" }],
+					},
 				},
 				additionalProperties: false,
 			},
 			HooksConfiguration: {
 				anyOf: [
 					{ $ref: "#/definitions/RulePlainConfiguration" },
-					{ $ref: "RuleWithHooksOptions" },
+					{ $ref: "#/definitions/RuleWithHooksOptions" },
 				],
 			},
 			HooksOptions: {
@@ -1113,9 +1162,10 @@ export function GET() {
 				required: ["hooks"],
 				properties: {
 					hooks: {
-						description: "List of safe hooks",
+						description:
+							"List of hooks of which the dependencies should be validated.",
 						type: "array",
-						items: { $ref: "#/definitions/Hooks" },
+						items: { $ref: "#/definitions/Hook" },
 					},
 				},
 				additionalProperties: false,
@@ -1400,7 +1450,7 @@ export function GET() {
 			NamingConventionConfiguration: {
 				anyOf: [
 					{ $ref: "#/definitions/RulePlainConfiguration" },
-					{ $ref: "RuleWithNamingConventionOptions" },
+					{ $ref: "#/definitions/RuleWithNamingConventionOptions" },
 				],
 			},
 			NamingConventionOptions: {
@@ -1460,21 +1510,6 @@ export function GET() {
 							{ type: "null" },
 						],
 					},
-					noEmptyBlockStatements: {
-						description: "Disallow empty block statements and static blocks.",
-						anyOf: [
-							{ $ref: "#/definitions/RuleConfiguration" },
-							{ type: "null" },
-						],
-					},
-					noEmptyTypeParameters: {
-						description:
-							"Disallow empty type parameters in type aliases and interfaces.",
-						anyOf: [
-							{ $ref: "#/definitions/RuleConfiguration" },
-							{ type: "null" },
-						],
-					},
 					noExcessiveNestedTestSuites: {
 						description:
 							"This rule enforces a maximum depth to nested describe() in test files.",
@@ -1498,37 +1533,6 @@ export function GET() {
 							{ type: "null" },
 						],
 					},
-					noGlobalAssign: {
-						description:
-							"Disallow assignments to native objects and read-only global variables.",
-						anyOf: [
-							{ $ref: "#/definitions/RuleConfiguration" },
-							{ type: "null" },
-						],
-					},
-					noGlobalEval: {
-						description: "Disallow the use of global eval().",
-						anyOf: [
-							{ $ref: "#/definitions/RuleConfiguration" },
-							{ type: "null" },
-						],
-					},
-					noInvalidUseBeforeDeclaration: {
-						description:
-							"Disallow the use of variables and function parameters before their declaration",
-						anyOf: [
-							{ $ref: "#/definitions/RuleConfiguration" },
-							{ type: "null" },
-						],
-					},
-					noMisleadingCharacterClass: {
-						description:
-							"Disallow characters made with multiple code points in character class syntax.",
-						anyOf: [
-							{ $ref: "#/definitions/RuleConfiguration" },
-							{ type: "null" },
-						],
-					},
 					noNamespaceImport: {
 						description: "Disallow the use of namespace imports.",
 						anyOf: [
@@ -1573,13 +1577,6 @@ export function GET() {
 							{ type: "null" },
 						],
 					},
-					noThenProperty: {
-						description: "Disallow then property.",
-						anyOf: [
-							{ $ref: "#/definitions/RuleConfiguration" },
-							{ type: "null" },
-						],
-					},
 					noUndeclaredDependencies: {
 						description:
 							"Disallow the use of dependencies that aren't specified in the package.json.",
@@ -1588,27 +1585,6 @@ export function GET() {
 							{ type: "null" },
 						],
 					},
-					noUnusedImports: {
-						description: "Disallow unused imports.",
-						anyOf: [
-							{ $ref: "#/definitions/RuleConfiguration" },
-							{ type: "null" },
-						],
-					},
-					noUnusedPrivateClassMembers: {
-						description: "Disallow unused private class members",
-						anyOf: [
-							{ $ref: "#/definitions/RuleConfiguration" },
-							{ type: "null" },
-						],
-					},
-					noUselessLoneBlockStatements: {
-						description: "Disallow unnecessary nested block statements.",
-						anyOf: [
-							{ $ref: "#/definitions/RuleConfiguration" },
-							{ type: "null" },
-						],
-					},
 					noUselessTernary: {
 						description:
 							"Disallow ternary operators when simpler alternatives exist.",
@@ -1621,51 +1597,6 @@ export function GET() {
 						description: "It enables the recommended rules for this group",
 						type: ["boolean", "null"],
 					},
-					useAwait: {
-						description: "Ensure async functions utilize await.",
-						anyOf: [
-							{ $ref: "#/definitions/RuleConfiguration" },
-							{ type: "null" },
-						],
-					},
-					useConsistentArrayType: {
-						description: "Require consistently using either T[] or Array",
-						anyOf: [
-							{ $ref: "#/definitions/ConsistentArrayTypeConfiguration" },
-							{ type: "null" },
-						],
-					},
-					useExportType: {
-						description: "Promotes the use of export type for types.",
-						anyOf: [
-							{ $ref: "#/definitions/RuleConfiguration" },
-							{ type: "null" },
-						],
-					},
-					useFilenamingConvention: {
-						description:
-							"Enforce naming conventions for JavaScript and TypeScript filenames.",
-						anyOf: [
-							{ $ref: "#/definitions/FilenamingConventionConfiguration" },
-							{ type: "null" },
-						],
-					},
-					useForOf: {
-						description:
-							"This rule recommends a for-of loop when in a for loop, the index used to extract an item from the iterated array.",
-						anyOf: [
-							{ $ref: "#/definitions/RuleConfiguration" },
-							{ type: "null" },
-						],
-					},
-					useGroupedTypeImport: {
-						description:
-							"Enforce the use of import type when an import only has specifiers with type qualifier.",
-						anyOf: [
-							{ $ref: "#/definitions/RuleConfiguration" },
-							{ type: "null" },
-						],
-					},
 					useImportRestrictions: {
 						description: "Disallows package private imports.",
 						anyOf: [
@@ -1673,13 +1604,6 @@ export function GET() {
 							{ type: "null" },
 						],
 					},
-					useImportType: {
-						description: "Promotes the use of import type for types.",
-						anyOf: [
-							{ $ref: "#/definitions/RuleConfiguration" },
-							{ type: "null" },
-						],
-					},
 					useJsxKeyInIterable: {
 						description:
 							"Disallow missing key props in iterators/collection literals.",
@@ -1696,29 +1620,6 @@ export function GET() {
 							{ type: "null" },
 						],
 					},
-					useNodejsImportProtocol: {
-						description:
-							"Enforces using the node: protocol for Node.js builtin modules.",
-						anyOf: [
-							{ $ref: "#/definitions/RuleConfiguration" },
-							{ type: "null" },
-						],
-					},
-					useNumberNamespace: {
-						description: "Use the Number properties instead of global ones.",
-						anyOf: [
-							{ $ref: "#/definitions/RuleConfiguration" },
-							{ type: "null" },
-						],
-					},
-					useShorthandFunctionType: {
-						description:
-							"Enforce using function types instead of object type with call signatures.",
-						anyOf: [
-							{ $ref: "#/definitions/RuleConfiguration" },
-							{ type: "null" },
-						],
-					},
 					useSortedClasses: {
 						description: "Enforce the sorting of CSS utility classes.",
 						anyOf: [
@@ -1928,7 +1829,7 @@ export function GET() {
 			RestrictedGlobalsConfiguration: {
 				anyOf: [
 					{ $ref: "#/definitions/RulePlainConfiguration" },
-					{ $ref: "RuleWithRestrictedGlobalsOptions" },
+					{ $ref: "#/definitions/RuleWithRestrictedGlobalsOptions" },
 				],
 			},
 			RestrictedGlobalsOptions: {
@@ -1947,7 +1848,7 @@ export function GET() {
 			RestrictedImportsConfiguration: {
 				anyOf: [
 					{ $ref: "#/definitions/RulePlainConfiguration" },
-					{ $ref: "RuleWithRestrictedImportsOptions" },
+					{ $ref: "#/definitions/RuleWithRestrictedImportsOptions" },
 				],
 			},
 			RestrictedImportsOptions: {
@@ -2135,6 +2036,13 @@ export function GET() {
 							{ type: "null" },
 						],
 					},
+					noGlobalEval: {
+						description: "Disallow the use of global eval().",
+						anyOf: [
+							{ $ref: "#/definitions/RuleConfiguration" },
+							{ type: "null" },
+						],
+					},
 					recommended: {
 						description: "It enables the recommended rules for this group",
 						type: ["boolean", "null"],
@@ -2143,6 +2051,35 @@ export function GET() {
 				additionalProperties: false,
 			},
 			Semicolons: { type: "string", enum: ["always", "asNeeded"] },
+			StableHookResult: {
+				oneOf: [
+					{
+						description:
+							"Used to indicate the hook does not have a stable result.",
+						type: "string",
+						enum: ["None"],
+					},
+					{
+						description:
+							"Used to indicate the identity of the result value is stable.\n\nNote this does not imply internal stability. For instance, the ref objects returned by React's `useRef()` always have a stable identity, but their internal value may be mutable.",
+						type: "string",
+						enum: ["Identity"],
+					},
+					{
+						description:
+							"Used to indicate the hook returns an array and some of its indices have stable identities.\n\nFor example, React's `useState()` hook returns a stable function at index 1.",
+						type: "object",
+						required: ["Indices"],
+						properties: {
+							Indices: {
+								type: "array",
+								items: { type: "integer", format: "uint8", minimum: 0.0 },
+							},
+						},
+						additionalProperties: false,
+					},
+				],
+			},
 			StringSet: {
 				type: "array",
 				items: { type: "string" },
@@ -2296,6 +2233,13 @@ export function GET() {
 							{ type: "null" },
 						],
 					},
+					useConsistentArrayType: {
+						description: "Require consistently using either T[] or Array",
+						anyOf: [
+							{ $ref: "#/definitions/ConsistentArrayTypeConfiguration" },
+							{ type: "null" },
+						],
+					},
 					useConst: {
 						description:
 							"Require const declarations for variables that are never reassigned after declared.",
@@ -2328,6 +2272,29 @@ export function GET() {
 							{ type: "null" },
 						],
 					},
+					useExportType: {
+						description: "Promotes the use of export type for types.",
+						anyOf: [
+							{ $ref: "#/definitions/RuleConfiguration" },
+							{ type: "null" },
+						],
+					},
+					useFilenamingConvention: {
+						description:
+							"Enforce naming conventions for JavaScript and TypeScript filenames.",
+						anyOf: [
+							{ $ref: "#/definitions/FilenamingConventionConfiguration" },
+							{ type: "null" },
+						],
+					},
+					useForOf: {
+						description:
+							"This rule recommends a for-of loop when in a for loop, the index used to extract an item from the iterated array.",
+						anyOf: [
+							{ $ref: "#/definitions/RuleConfiguration" },
+							{ type: "null" },
+						],
+					},
 					useFragmentSyntax: {
 						description:
 							"This rule enforces the use of <>... over ....",
@@ -2336,6 +2303,13 @@ export function GET() {
 							{ type: "null" },
 						],
 					},
+					useImportType: {
+						description: "Promotes the use of import type for types.",
+						anyOf: [
+							{ $ref: "#/definitions/RuleConfiguration" },
+							{ type: "null" },
+						],
+					},
 					useLiteralEnumMembers: {
 						description: "Require all enum members to be literal values.",
 						anyOf: [
@@ -2351,6 +2325,21 @@ export function GET() {
 							{ type: "null" },
 						],
 					},
+					useNodejsImportProtocol: {
+						description:
+							"Enforces using the node: protocol for Node.js builtin modules.",
+						anyOf: [
+							{ $ref: "#/definitions/RuleConfiguration" },
+							{ type: "null" },
+						],
+					},
+					useNumberNamespace: {
+						description: "Use the Number properties instead of global ones.",
+						anyOf: [
+							{ $ref: "#/definitions/RuleConfiguration" },
+							{ type: "null" },
+						],
+					},
 					useNumericLiterals: {
 						description:
 							"Disallow parseInt() and Number.parseInt() in favor of binary, octal, and hexadecimal literals",
@@ -2383,6 +2372,14 @@ export function GET() {
 							{ type: "null" },
 						],
 					},
+					useShorthandFunctionType: {
+						description:
+							"Enforce using function types instead of object type with call signatures.",
+						anyOf: [
+							{ $ref: "#/definitions/RuleConfiguration" },
+							{ type: "null" },
+						],
+					},
 					useSingleCaseStatement: {
 						description:
 							"Enforces switch clauses have a single statement, emits a quick fix wrapping the statements in a block.",
@@ -2571,6 +2568,13 @@ export function GET() {
 							{ type: "null" },
 						],
 					},
+					noEmptyBlockStatements: {
+						description: "Disallow empty block statements and static blocks.",
+						anyOf: [
+							{ $ref: "#/definitions/RuleConfiguration" },
+							{ type: "null" },
+						],
+					},
 					noEmptyInterface: {
 						description: "Disallow the declaration of empty interfaces.",
 						anyOf: [
@@ -2607,6 +2611,14 @@ export function GET() {
 							{ type: "null" },
 						],
 					},
+					noGlobalAssign: {
+						description:
+							"Disallow assignments to native objects and read-only global variables.",
+						anyOf: [
+							{ $ref: "#/definitions/RuleConfiguration" },
+							{ type: "null" },
+						],
+					},
 					noGlobalIsFinite: {
 						description: "Use Number.isFinite instead of global isFinite.",
 						anyOf: [
@@ -2643,6 +2655,14 @@ export function GET() {
 							{ type: "null" },
 						],
 					},
+					noMisleadingCharacterClass: {
+						description:
+							"Disallow characters made with multiple code points in character class syntax.",
+						anyOf: [
+							{ $ref: "#/definitions/RuleConfiguration" },
+							{ type: "null" },
+						],
+					},
 					noMisleadingInstantiator: {
 						description: "Enforce proper usage of new and constructor.",
 						anyOf: [
@@ -2703,6 +2723,13 @@ export function GET() {
 							{ type: "null" },
 						],
 					},
+					noThenProperty: {
+						description: "Disallow then property.",
+						anyOf: [
+							{ $ref: "#/definitions/RuleConfiguration" },
+							{ type: "null" },
+						],
+					},
 					noUnsafeDeclarationMerging: {
 						description:
 							"Disallow unsafe declaration merging between interfaces and classes.",
@@ -2803,7 +2830,7 @@ export function GET() {
 			UtilityClassSortingConfiguration: {
 				anyOf: [
 					{ $ref: "#/definitions/RulePlainConfiguration" },
-					{ $ref: "RuleWithUtilityClassSortingOptions" },
+					{ $ref: "#/definitions/RuleWithUtilityClassSortingOptions" },
 				],
 			},
 			UtilityClassSortingOptions: {
@@ -2826,7 +2853,7 @@ export function GET() {
 			ValidAriaRoleConfiguration: {
 				anyOf: [
 					{ $ref: "#/definitions/RulePlainConfiguration" },
-					{ $ref: "RuleWithValidAriaRoleOptions" },
+					{ $ref: "#/definitions/RuleWithValidAriaRoleOptions" },
 				],
 			},
 			ValidAriaRoleOptions: {

From a69cdf2df1d68a5fbead87a363991e71fab1d0ef Mon Sep 17 00:00:00 2001
From: Victorien Elvinger 
Date: Thu, 7 Mar 2024 11:52:32 +0100
Subject: [PATCH 17/34] refacor: remove future dead links

---
 CHANGELOG.md                                    | 2 +-
 website/src/content/blog/biome-v1-6.mdx         | 2 +-
 website/src/content/docs/internals/changelog.md | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index fa9d686d179b..f36fac38f49a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -378,7 +378,7 @@ Additionally, the following rules are now recommended:
 
 #### Removed rules
 
-- [nursery/useGroupedTypeImport](https://biomejs.dev/linter/rules/use-grouped-type-import). The rule [style/useImportType](https://biomejs.dev/linter/rules/use-import-type) covers the behavior of this rule.
+- Re;ove `nursery/useGroupedTypeImport`. The rule [style/useImportType](https://biomejs.dev/linter/rules/use-import-type) covers the behavior of this rule.
 
   Note that removing a nursery rule is not breaking change according to our [semantic versioning](https://biomejs.dev/internals/versioning).
 
diff --git a/website/src/content/blog/biome-v1-6.mdx b/website/src/content/blog/biome-v1-6.mdx
index 4b2ea6f12bca..0a24acfde7e8 100644
--- a/website/src/content/blog/biome-v1-6.mdx
+++ b/website/src/content/blog/biome-v1-6.mdx
@@ -261,7 +261,7 @@ Additionally, the following rules are now recommended:
 
 #### Removed rules
 
-- [nursery/useGroupedTypeImport](https://biomejs.dev/linter/rules/use-grouped-type-import). The rule [style/useImportType](https://biomejs.dev/linter/rules/use-import-type) covers the behavior of this rule.
+- Remove `nursery/useGroupedTypeImport`. The rule [style/useImportType](https://biomejs.dev/linter/rules/use-import-type) covers the behavior of this rule.
 
 
 ### Miscellaneous
diff --git a/website/src/content/docs/internals/changelog.md b/website/src/content/docs/internals/changelog.md
index ae2ab8de279c..6c65e757af89 100644
--- a/website/src/content/docs/internals/changelog.md
+++ b/website/src/content/docs/internals/changelog.md
@@ -384,7 +384,7 @@ Additionally, the following rules are now recommended:
 
 #### Removed rules
 
-- [nursery/useGroupedTypeImport](https://biomejs.dev/linter/rules/use-grouped-type-import). The rule [style/useImportType](https://biomejs.dev/linter/rules/use-import-type) covers the behavior of this rule.
+- Re;ove `nursery/useGroupedTypeImport`. The rule [style/useImportType](https://biomejs.dev/linter/rules/use-import-type) covers the behavior of this rule.
 
   Note that removing a nursery rule is not breaking change according to our [semantic versioning](https://biomejs.dev/internals/versioning).
 

From 9cd09a0b6569ace736129aacde6d19b18a49f4f2 Mon Sep 17 00:00:00 2001
From: Victorien Elvinger 
Date: Thu, 7 Mar 2024 11:56:55 +0100
Subject: [PATCH 18/34] refactor(lint): set version of new rules

---
 .../src/analyzers/nursery/no_barrel_file.rs                 | 2 +-
 .../src/analyzers/nursery/no_duplicate_test_hooks.rs        | 2 +-
 .../analyzers/nursery/no_excessive_nested_test_suites.rs    | 2 +-
 .../src/analyzers/nursery/no_exports_in_test.rs             | 2 +-
 .../src/analyzers/nursery/no_focused_tests.rs               | 2 +-
 .../src/analyzers/nursery/no_namespace_import.rs            | 2 +-
 .../src/analyzers/nursery/no_restricted_imports.rs          | 2 +-
 .../src/analyzers/nursery/no_skipped_tests.rs               | 2 +-
 .../src/analyzers/nursery/no_undeclared_dependencies.rs     | 2 +-
 .../src/analyzers/nursery/use_node_assert_strict.rs         | 2 +-
 .../src/semantic_analyzers/nursery/no_console.rs            | 2 +-
 .../src/semantic_analyzers/nursery/no_re_export_all.rs      | 2 +-
 .../src/semantic_analyzers/nursery/no_semicolon_in_jsx.rs   | 2 +-
 .../semantic_analyzers/nursery/use_jsx_key_in_iterable.rs   | 2 +-
 .../src/semantic_analyzers/nursery/use_sorted_classes.rs    | 2 +-
 website/src/content/docs/linter/rules/no-barrel-file.md     | 6 +-----
 website/src/content/docs/linter/rules/no-console.md         | 6 +-----
 .../content/docs/linter/rules/no-duplicate-test-hooks.md    | 6 +-----
 .../docs/linter/rules/no-excessive-nested-test-suites.md    | 6 +-----
 website/src/content/docs/linter/rules/no-exports-in-test.md | 6 +-----
 website/src/content/docs/linter/rules/no-focused-tests.md   | 6 +-----
 .../src/content/docs/linter/rules/no-namespace-import.md    | 6 +-----
 website/src/content/docs/linter/rules/no-re-export-all.md   | 6 +-----
 .../src/content/docs/linter/rules/no-restricted-imports.md  | 6 +-----
 .../src/content/docs/linter/rules/no-semicolon-in-jsx.md    | 6 +-----
 website/src/content/docs/linter/rules/no-skipped-tests.md   | 6 +-----
 .../content/docs/linter/rules/no-undeclared-dependencies.md | 6 +-----
 .../content/docs/linter/rules/use-jsx-key-in-iterable.md    | 6 +-----
 .../src/content/docs/linter/rules/use-node-assert-strict.md | 6 +-----
 website/src/content/docs/linter/rules/use-sorted-classes.md | 6 +-----
 30 files changed, 30 insertions(+), 90 deletions(-)

diff --git a/crates/biome_js_analyze/src/analyzers/nursery/no_barrel_file.rs b/crates/biome_js_analyze/src/analyzers/nursery/no_barrel_file.rs
index fb0d89c4b80c..272f35a78d36 100644
--- a/crates/biome_js_analyze/src/analyzers/nursery/no_barrel_file.rs
+++ b/crates/biome_js_analyze/src/analyzers/nursery/no_barrel_file.rs
@@ -39,7 +39,7 @@ declare_rule! {
     /// ```
     ///
     pub NoBarrelFile {
-        version: "next",
+        version: "1.6.0",
         name: "noBarrelFile",
         recommended: false,
         source: RuleSource::EslintBarrelFiles("avoid-namespace-import"),
diff --git a/crates/biome_js_analyze/src/analyzers/nursery/no_duplicate_test_hooks.rs b/crates/biome_js_analyze/src/analyzers/nursery/no_duplicate_test_hooks.rs
index 0467074044cc..d62fee54d890 100644
--- a/crates/biome_js_analyze/src/analyzers/nursery/no_duplicate_test_hooks.rs
+++ b/crates/biome_js_analyze/src/analyzers/nursery/no_duplicate_test_hooks.rs
@@ -57,7 +57,7 @@ declare_rule! {
     /// ```
     ///
     pub NoDuplicateTestHooks {
-        version: "next",
+        version: "1.6.0",
         name: "noDuplicateTestHooks",
         recommended: true,
         source: RuleSource::EslintJest("no-focused-tests"),
diff --git a/crates/biome_js_analyze/src/analyzers/nursery/no_excessive_nested_test_suites.rs b/crates/biome_js_analyze/src/analyzers/nursery/no_excessive_nested_test_suites.rs
index 10523f5355da..b10649e8df02 100644
--- a/crates/biome_js_analyze/src/analyzers/nursery/no_excessive_nested_test_suites.rs
+++ b/crates/biome_js_analyze/src/analyzers/nursery/no_excessive_nested_test_suites.rs
@@ -52,7 +52,7 @@ declare_rule! {
     /// ```
     ///
     pub NoExcessiveNestedTestSuites {
-        version: "next",
+        version: "1.6.0",
         name: "noExcessiveNestedTestSuites",
         recommended: true,
         source: RuleSource::EslintJest("max-nested-describe"),
diff --git a/crates/biome_js_analyze/src/analyzers/nursery/no_exports_in_test.rs b/crates/biome_js_analyze/src/analyzers/nursery/no_exports_in_test.rs
index bcc0729c938f..44983b5d7437 100644
--- a/crates/biome_js_analyze/src/analyzers/nursery/no_exports_in_test.rs
+++ b/crates/biome_js_analyze/src/analyzers/nursery/no_exports_in_test.rs
@@ -37,7 +37,7 @@ declare_rule! {
     /// ```
     ///
     pub NoExportsInTest {
-        version: "next",
+        version: "1.6.0",
         name: "noExportsInTest",
         recommended: true,
         source: RuleSource::EslintJest("no-export"),
diff --git a/crates/biome_js_analyze/src/analyzers/nursery/no_focused_tests.rs b/crates/biome_js_analyze/src/analyzers/nursery/no_focused_tests.rs
index fc6861bb5c66..169cd3ee733a 100644
--- a/crates/biome_js_analyze/src/analyzers/nursery/no_focused_tests.rs
+++ b/crates/biome_js_analyze/src/analyzers/nursery/no_focused_tests.rs
@@ -34,7 +34,7 @@ declare_rule! {
     /// test("foo", () => {});
     /// ```
     pub NoFocusedTests {
-        version: "next",
+        version: "1.6.0",
         name: "noFocusedTests",
         recommended: true,
         source: RuleSource::EslintJest("no-focused-tests"),
diff --git a/crates/biome_js_analyze/src/analyzers/nursery/no_namespace_import.rs b/crates/biome_js_analyze/src/analyzers/nursery/no_namespace_import.rs
index 28cc8fa04430..f350009349bc 100644
--- a/crates/biome_js_analyze/src/analyzers/nursery/no_namespace_import.rs
+++ b/crates/biome_js_analyze/src/analyzers/nursery/no_namespace_import.rs
@@ -29,7 +29,7 @@ declare_rule! {
     /// ```
     ///
     pub NoNamespaceImport {
-        version: "next",
+        version: "1.6.0",
         name: "noNamespaceImport",
         recommended: false,
         source: RuleSource::EslintBarrelFiles("avoid-namespace-import"),
diff --git a/crates/biome_js_analyze/src/analyzers/nursery/no_restricted_imports.rs b/crates/biome_js_analyze/src/analyzers/nursery/no_restricted_imports.rs
index 463db90d6d42..179f770db507 100644
--- a/crates/biome_js_analyze/src/analyzers/nursery/no_restricted_imports.rs
+++ b/crates/biome_js_analyze/src/analyzers/nursery/no_restricted_imports.rs
@@ -25,7 +25,7 @@ declare_rule! {
     /// }
     /// ```
     pub NoRestrictedImports {
-        version: "next",
+        version: "1.6.0",
         name: "noRestrictedImports",
         source: RuleSource::Eslint("no-restricted-imports"),
         recommended: false,
diff --git a/crates/biome_js_analyze/src/analyzers/nursery/no_skipped_tests.rs b/crates/biome_js_analyze/src/analyzers/nursery/no_skipped_tests.rs
index 13d6b15d9ef2..eddc86b9b632 100644
--- a/crates/biome_js_analyze/src/analyzers/nursery/no_skipped_tests.rs
+++ b/crates/biome_js_analyze/src/analyzers/nursery/no_skipped_tests.rs
@@ -35,7 +35,7 @@ declare_rule! {
     /// ```
     ///
     pub NoSkippedTests {
-        version: "next",
+        version: "1.6.0",
         name: "noSkippedTests",
         recommended: false,
         source: RuleSource::EslintJest("no-disabled-tests"),
diff --git a/crates/biome_js_analyze/src/analyzers/nursery/no_undeclared_dependencies.rs b/crates/biome_js_analyze/src/analyzers/nursery/no_undeclared_dependencies.rs
index aeac0ee296aa..5110aec49765 100644
--- a/crates/biome_js_analyze/src/analyzers/nursery/no_undeclared_dependencies.rs
+++ b/crates/biome_js_analyze/src/analyzers/nursery/no_undeclared_dependencies.rs
@@ -30,7 +30,7 @@ declare_rule! {
     /// import assert from "node:assert";
     /// ```
     pub NoUndeclaredDependencies {
-        version: "next",
+        version: "1.6.0",
         name: "noUndeclaredDependencies",
         recommended: false,
     }
diff --git a/crates/biome_js_analyze/src/analyzers/nursery/use_node_assert_strict.rs b/crates/biome_js_analyze/src/analyzers/nursery/use_node_assert_strict.rs
index 958ddb5827f6..df0fcaf0a3f7 100644
--- a/crates/biome_js_analyze/src/analyzers/nursery/use_node_assert_strict.rs
+++ b/crates/biome_js_analyze/src/analyzers/nursery/use_node_assert_strict.rs
@@ -27,7 +27,7 @@ declare_rule! {
     /// ```
     ///
     pub UseNodeAssertStrict {
-        version: "next",
+        version: "1.6.0",
         name: "useNodeAssertStrict",
         recommended: false,
         fix_kind: FixKind::Safe,
diff --git a/crates/biome_js_analyze/src/semantic_analyzers/nursery/no_console.rs b/crates/biome_js_analyze/src/semantic_analyzers/nursery/no_console.rs
index 307f7513af04..ee0c18cb2260 100644
--- a/crates/biome_js_analyze/src/semantic_analyzers/nursery/no_console.rs
+++ b/crates/biome_js_analyze/src/semantic_analyzers/nursery/no_console.rs
@@ -21,7 +21,7 @@ declare_rule! {
     /// ```
     ///
     pub NoConsole {
-        version: "next",
+        version: "1.6.0",
         name: "noConsole",
         source: RuleSource::Eslint("no-console"),
         recommended: false,
diff --git a/crates/biome_js_analyze/src/semantic_analyzers/nursery/no_re_export_all.rs b/crates/biome_js_analyze/src/semantic_analyzers/nursery/no_re_export_all.rs
index 9c7c31f6a542..f4d8c44bc72b 100644
--- a/crates/biome_js_analyze/src/semantic_analyzers/nursery/no_re_export_all.rs
+++ b/crates/biome_js_analyze/src/semantic_analyzers/nursery/no_re_export_all.rs
@@ -31,7 +31,7 @@ declare_rule! {
     /// ```
     ///
     pub NoReExportAll {
-        version: "next",
+        version: "1.6.0",
         name: "noReExportAll",
         recommended: false,
         source: RuleSource::EslintBarrelFiles("avoid-re-export-all"),
diff --git a/crates/biome_js_analyze/src/semantic_analyzers/nursery/no_semicolon_in_jsx.rs b/crates/biome_js_analyze/src/semantic_analyzers/nursery/no_semicolon_in_jsx.rs
index 26eedb9905b1..57285e15d2c2 100644
--- a/crates/biome_js_analyze/src/semantic_analyzers/nursery/no_semicolon_in_jsx.rs
+++ b/crates/biome_js_analyze/src/semantic_analyzers/nursery/no_semicolon_in_jsx.rs
@@ -43,7 +43,7 @@ declare_rule! {
     /// ```
     ///
     pub NoSemicolonInJsx {
-        version: "next",
+        version: "1.6.0",
         name: "noSemicolonInJsx",
         recommended: true,
     }
diff --git a/crates/biome_js_analyze/src/semantic_analyzers/nursery/use_jsx_key_in_iterable.rs b/crates/biome_js_analyze/src/semantic_analyzers/nursery/use_jsx_key_in_iterable.rs
index fd54b6faf6df..a4b83e9c6a70 100644
--- a/crates/biome_js_analyze/src/semantic_analyzers/nursery/use_jsx_key_in_iterable.rs
+++ b/crates/biome_js_analyze/src/semantic_analyzers/nursery/use_jsx_key_in_iterable.rs
@@ -36,7 +36,7 @@ declare_rule! {
     /// ```
     ///
     pub UseJsxKeyInIterable {
-        version: "next",
+        version: "1.6.0",
         name: "useJsxKeyInIterable",
         source: RuleSource::EslintReact("jsx-key"),
         source_kind: RuleSourceKind::SameLogic,
diff --git a/crates/biome_js_analyze/src/semantic_analyzers/nursery/use_sorted_classes.rs b/crates/biome_js_analyze/src/semantic_analyzers/nursery/use_sorted_classes.rs
index 8519fde38484..2079012cdb29 100644
--- a/crates/biome_js_analyze/src/semantic_analyzers/nursery/use_sorted_classes.rs
+++ b/crates/biome_js_analyze/src/semantic_analyzers/nursery/use_sorted_classes.rs
@@ -139,7 +139,7 @@ declare_rule! {
     /// This is a deliberate decision. We're unsure about this behavior, and would appreciate feedback on it. If this is a problem for you, please share a detailed explanation of your use case in [the GitHub issue](https://github.com/biomejs/biome/issues/1274).
     ///
     pub UseSortedClasses {
-        version: "next",
+        version: "1.6.0",
         name: "useSortedClasses",
         recommended: false,
         fix_kind: FixKind::Unsafe,
diff --git a/website/src/content/docs/linter/rules/no-barrel-file.md b/website/src/content/docs/linter/rules/no-barrel-file.md
index 62a2cd5795b1..fef5fe240187 100644
--- a/website/src/content/docs/linter/rules/no-barrel-file.md
+++ b/website/src/content/docs/linter/rules/no-barrel-file.md
@@ -1,13 +1,9 @@
 ---
-title: noBarrelFile (not released)
+title: noBarrelFile (since v1.6.0)
 ---
 
 **Diagnostic Category: `lint/nursery/noBarrelFile`**
 
-:::danger
-This rule hasn't been released yet.
-:::
-
 :::caution
 This rule is part of the [nursery](/linter/rules/#nursery) group.
 :::
diff --git a/website/src/content/docs/linter/rules/no-console.md b/website/src/content/docs/linter/rules/no-console.md
index 17d00747dd92..920ba24333a3 100644
--- a/website/src/content/docs/linter/rules/no-console.md
+++ b/website/src/content/docs/linter/rules/no-console.md
@@ -1,13 +1,9 @@
 ---
-title: noConsole (not released)
+title: noConsole (since v1.6.0)
 ---
 
 **Diagnostic Category: `lint/nursery/noConsole`**
 
-:::danger
-This rule hasn't been released yet.
-:::
-
 :::caution
 This rule is part of the [nursery](/linter/rules/#nursery) group.
 :::
diff --git a/website/src/content/docs/linter/rules/no-duplicate-test-hooks.md b/website/src/content/docs/linter/rules/no-duplicate-test-hooks.md
index 59451ff58173..89cd0a488cc1 100644
--- a/website/src/content/docs/linter/rules/no-duplicate-test-hooks.md
+++ b/website/src/content/docs/linter/rules/no-duplicate-test-hooks.md
@@ -1,13 +1,9 @@
 ---
-title: noDuplicateTestHooks (not released)
+title: noDuplicateTestHooks (since v1.6.0)
 ---
 
 **Diagnostic Category: `lint/nursery/noDuplicateTestHooks`**
 
-:::danger
-This rule hasn't been released yet.
-:::
-
 :::caution
 This rule is part of the [nursery](/linter/rules/#nursery) group.
 :::
diff --git a/website/src/content/docs/linter/rules/no-excessive-nested-test-suites.md b/website/src/content/docs/linter/rules/no-excessive-nested-test-suites.md
index 7ea5a92de9ce..ca60175b36d7 100644
--- a/website/src/content/docs/linter/rules/no-excessive-nested-test-suites.md
+++ b/website/src/content/docs/linter/rules/no-excessive-nested-test-suites.md
@@ -1,13 +1,9 @@
 ---
-title: noExcessiveNestedTestSuites (not released)
+title: noExcessiveNestedTestSuites (since v1.6.0)
 ---
 
 **Diagnostic Category: `lint/nursery/noExcessiveNestedTestSuites`**
 
-:::danger
-This rule hasn't been released yet.
-:::
-
 :::caution
 This rule is part of the [nursery](/linter/rules/#nursery) group.
 :::
diff --git a/website/src/content/docs/linter/rules/no-exports-in-test.md b/website/src/content/docs/linter/rules/no-exports-in-test.md
index 75f92aafe01e..bb990ae77866 100644
--- a/website/src/content/docs/linter/rules/no-exports-in-test.md
+++ b/website/src/content/docs/linter/rules/no-exports-in-test.md
@@ -1,13 +1,9 @@
 ---
-title: noExportsInTest (not released)
+title: noExportsInTest (since v1.6.0)
 ---
 
 **Diagnostic Category: `lint/nursery/noExportsInTest`**
 
-:::danger
-This rule hasn't been released yet.
-:::
-
 :::caution
 This rule is part of the [nursery](/linter/rules/#nursery) group.
 :::
diff --git a/website/src/content/docs/linter/rules/no-focused-tests.md b/website/src/content/docs/linter/rules/no-focused-tests.md
index cc154fa6b71d..d30e95dcc216 100644
--- a/website/src/content/docs/linter/rules/no-focused-tests.md
+++ b/website/src/content/docs/linter/rules/no-focused-tests.md
@@ -1,13 +1,9 @@
 ---
-title: noFocusedTests (not released)
+title: noFocusedTests (since v1.6.0)
 ---
 
 **Diagnostic Category: `lint/nursery/noFocusedTests`**
 
-:::danger
-This rule hasn't been released yet.
-:::
-
 :::caution
 This rule is part of the [nursery](/linter/rules/#nursery) group.
 :::
diff --git a/website/src/content/docs/linter/rules/no-namespace-import.md b/website/src/content/docs/linter/rules/no-namespace-import.md
index 26bd3b432ad5..21ecd87f73d8 100644
--- a/website/src/content/docs/linter/rules/no-namespace-import.md
+++ b/website/src/content/docs/linter/rules/no-namespace-import.md
@@ -1,13 +1,9 @@
 ---
-title: noNamespaceImport (not released)
+title: noNamespaceImport (since v1.6.0)
 ---
 
 **Diagnostic Category: `lint/nursery/noNamespaceImport`**
 
-:::danger
-This rule hasn't been released yet.
-:::
-
 :::caution
 This rule is part of the [nursery](/linter/rules/#nursery) group.
 :::
diff --git a/website/src/content/docs/linter/rules/no-re-export-all.md b/website/src/content/docs/linter/rules/no-re-export-all.md
index b87596008e95..3344bf92b351 100644
--- a/website/src/content/docs/linter/rules/no-re-export-all.md
+++ b/website/src/content/docs/linter/rules/no-re-export-all.md
@@ -1,13 +1,9 @@
 ---
-title: noReExportAll (not released)
+title: noReExportAll (since v1.6.0)
 ---
 
 **Diagnostic Category: `lint/nursery/noReExportAll`**
 
-:::danger
-This rule hasn't been released yet.
-:::
-
 :::caution
 This rule is part of the [nursery](/linter/rules/#nursery) group.
 :::
diff --git a/website/src/content/docs/linter/rules/no-restricted-imports.md b/website/src/content/docs/linter/rules/no-restricted-imports.md
index 241866bfe2eb..cfdd336f18a5 100644
--- a/website/src/content/docs/linter/rules/no-restricted-imports.md
+++ b/website/src/content/docs/linter/rules/no-restricted-imports.md
@@ -1,13 +1,9 @@
 ---
-title: noRestrictedImports (not released)
+title: noRestrictedImports (since v1.6.0)
 ---
 
 **Diagnostic Category: `lint/nursery/noRestrictedImports`**
 
-:::danger
-This rule hasn't been released yet.
-:::
-
 :::caution
 This rule is part of the [nursery](/linter/rules/#nursery) group.
 :::
diff --git a/website/src/content/docs/linter/rules/no-semicolon-in-jsx.md b/website/src/content/docs/linter/rules/no-semicolon-in-jsx.md
index d1834c3e8acd..89f0597b2dcd 100644
--- a/website/src/content/docs/linter/rules/no-semicolon-in-jsx.md
+++ b/website/src/content/docs/linter/rules/no-semicolon-in-jsx.md
@@ -1,13 +1,9 @@
 ---
-title: noSemicolonInJsx (not released)
+title: noSemicolonInJsx (since v1.6.0)
 ---
 
 **Diagnostic Category: `lint/nursery/noSemicolonInJsx`**
 
-:::danger
-This rule hasn't been released yet.
-:::
-
 :::caution
 This rule is part of the [nursery](/linter/rules/#nursery) group.
 :::
diff --git a/website/src/content/docs/linter/rules/no-skipped-tests.md b/website/src/content/docs/linter/rules/no-skipped-tests.md
index 5d01aa7068bd..593f495f32c0 100644
--- a/website/src/content/docs/linter/rules/no-skipped-tests.md
+++ b/website/src/content/docs/linter/rules/no-skipped-tests.md
@@ -1,13 +1,9 @@
 ---
-title: noSkippedTests (not released)
+title: noSkippedTests (since v1.6.0)
 ---
 
 **Diagnostic Category: `lint/nursery/noSkippedTests`**
 
-:::danger
-This rule hasn't been released yet.
-:::
-
 :::caution
 This rule is part of the [nursery](/linter/rules/#nursery) group.
 :::
diff --git a/website/src/content/docs/linter/rules/no-undeclared-dependencies.md b/website/src/content/docs/linter/rules/no-undeclared-dependencies.md
index 3ac4010d751c..ef3a7b56c159 100644
--- a/website/src/content/docs/linter/rules/no-undeclared-dependencies.md
+++ b/website/src/content/docs/linter/rules/no-undeclared-dependencies.md
@@ -1,13 +1,9 @@
 ---
-title: noUndeclaredDependencies (not released)
+title: noUndeclaredDependencies (since v1.6.0)
 ---
 
 **Diagnostic Category: `lint/nursery/noUndeclaredDependencies`**
 
-:::danger
-This rule hasn't been released yet.
-:::
-
 :::caution
 This rule is part of the [nursery](/linter/rules/#nursery) group.
 :::
diff --git a/website/src/content/docs/linter/rules/use-jsx-key-in-iterable.md b/website/src/content/docs/linter/rules/use-jsx-key-in-iterable.md
index 30f9f4ccaed8..977cd4bca2fa 100644
--- a/website/src/content/docs/linter/rules/use-jsx-key-in-iterable.md
+++ b/website/src/content/docs/linter/rules/use-jsx-key-in-iterable.md
@@ -1,13 +1,9 @@
 ---
-title: useJsxKeyInIterable (not released)
+title: useJsxKeyInIterable (since v1.6.0)
 ---
 
 **Diagnostic Category: `lint/nursery/useJsxKeyInIterable`**
 
-:::danger
-This rule hasn't been released yet.
-:::
-
 :::caution
 This rule is part of the [nursery](/linter/rules/#nursery) group.
 :::
diff --git a/website/src/content/docs/linter/rules/use-node-assert-strict.md b/website/src/content/docs/linter/rules/use-node-assert-strict.md
index 46facf03acff..37cf49f348b5 100644
--- a/website/src/content/docs/linter/rules/use-node-assert-strict.md
+++ b/website/src/content/docs/linter/rules/use-node-assert-strict.md
@@ -1,13 +1,9 @@
 ---
-title: useNodeAssertStrict (not released)
+title: useNodeAssertStrict (since v1.6.0)
 ---
 
 **Diagnostic Category: `lint/nursery/useNodeAssertStrict`**
 
-:::danger
-This rule hasn't been released yet.
-:::
-
 :::caution
 This rule is part of the [nursery](/linter/rules/#nursery) group.
 :::
diff --git a/website/src/content/docs/linter/rules/use-sorted-classes.md b/website/src/content/docs/linter/rules/use-sorted-classes.md
index 612f7f3ca484..ea41fc604f18 100644
--- a/website/src/content/docs/linter/rules/use-sorted-classes.md
+++ b/website/src/content/docs/linter/rules/use-sorted-classes.md
@@ -1,13 +1,9 @@
 ---
-title: useSortedClasses (not released)
+title: useSortedClasses (since v1.6.0)
 ---
 
 **Diagnostic Category: `lint/nursery/useSortedClasses`**
 
-:::danger
-This rule hasn't been released yet.
-:::
-
 :::caution
 This rule is part of the [nursery](/linter/rules/#nursery) group.
 :::

From 3893b1d5cbb81344f2a61aace22ff44fcb402bdb Mon Sep 17 00:00:00 2001
From: Emanuele Stoppa 
Date: Thu, 7 Mar 2024 11:14:45 +0000
Subject: [PATCH 19/34] Update website/src/content/blog/biome-v1-6.mdx

Co-authored-by: Victorien Elvinger 
---
 website/src/content/blog/biome-v1-6.mdx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/website/src/content/blog/biome-v1-6.mdx b/website/src/content/blog/biome-v1-6.mdx
index 0a24acfde7e8..e39fc51d51a9 100644
--- a/website/src/content/blog/biome-v1-6.mdx
+++ b/website/src/content/blog/biome-v1-6.mdx
@@ -65,7 +65,7 @@ Biome now accepts the file `biome.jsonc` as configuration! Now, you can insert a
 
 ### `extends` resolves dependencies
 
-From this version, Biome can use the `extends` property to *resolve* other configuration files that are inside installed dependencies.
+From this version, Biome can use the `extends` property to _resolve_ other configuration files that are inside installed dependencies.
 
 There are few important steps in order to make the configuration discoverable. The file must be exported from a `"module"` package, and the file should be exported in your `package.json` like this:
 

From 7572772b6e7ba61f96db6fc422bcc6012dc4d02a Mon Sep 17 00:00:00 2001
From: Emanuele Stoppa 
Date: Thu, 7 Mar 2024 11:15:29 +0000
Subject: [PATCH 20/34] apply suggestion

---
 website/src/content/blog/biome-v1-6.mdx | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/website/src/content/blog/biome-v1-6.mdx b/website/src/content/blog/biome-v1-6.mdx
index e39fc51d51a9..b5439a65db07 100644
--- a/website/src/content/blog/biome-v1-6.mdx
+++ b/website/src/content/blog/biome-v1-6.mdx
@@ -113,8 +113,6 @@ Other than fixes, the formatter provides two new options that should improve the
 
 ### Option `attributePosition`
 
-The contributor [@octoshikari](https://github.com/octoshikari) implemented this new feature by themselves! Huge thank you for helping the Biome project.
-
 When `formatter.attributePosition` has the value `multiline`, all attributes of HTML-ish languages (JSX/TSX as for time of writing) will be collapsed on multiple lines regardless of their numbers:
 
 
@@ -145,6 +143,7 @@ When `formatter.attributePosition` has the value `multiline`, all attributes of
     
 
 
+The contributor [@octoshikari](https://github.com/octoshikari) implemented this new feature by themselves! Huge thank you for helping the Biome project.
 
 ### Option `json.formatter.trailingCommas`
 

From 054c0fa2f56bfcb166f1e588c2c8c620fb115931 Mon Sep 17 00:00:00 2001
From: Emanuele Stoppa 
Date: Thu, 7 Mar 2024 14:38:36 +0000
Subject: [PATCH 21/34] add warning

---
 website/src/content/blog/biome-v1-6.mdx | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/website/src/content/blog/biome-v1-6.mdx b/website/src/content/blog/biome-v1-6.mdx
index b5439a65db07..8da0fa23b651 100644
--- a/website/src/content/blog/biome-v1-6.mdx
+++ b/website/src/content/blog/biome-v1-6.mdx
@@ -262,10 +262,14 @@ Additionally, the following rules are now recommended:
 
 - Remove `nursery/useGroupedTypeImport`. The rule [style/useImportType](https://biomejs.dev/linter/rules/use-import-type) covers the behavior of this rule.
 
-
 ### Miscellaneous
 
-- We drastically reduced the protected files, which means you can now format your `package.json`, `tsconfig.json`, etc. with Biome. Lock files are still considered protected.
+:::caution
+Among other fixes, we fixed a bug where Biome traversed *ignored* folders. Biome doesn't traverse ignored folders anymore. This could cause unexpected changes in behaviour. For example, if you configured globs a way similar to `files.ignore: ["./src/**/__folder__"]` and
+`files.include: ["./src/**/*.ts"]`, the `./src` won't be traversed anymore because `files.ignore` is matched before, and the `src/**` matches all folders inside the `src` directory.
+:::
+
+- We drastically reduced the number of protected files, which means you can now format your `package.json`, `tsconfig.json`, etc. with Biome. Lock files are still considered protected.
 - The CLI now does a better job at reporting the total number of files and the files that were really changed.
 - When a diagnostic shows a file name on the terminal that is integrated with your editor, you can click it and the editor will open the file for you.
 - The command `biome rage` now accepts two nice options: `--formatter` and `--linter`.

From b5b7077e50579f2216c0dcf36155e73cfdc1a9de Mon Sep 17 00:00:00 2001
From: Victorien Elvinger 
Date: Thu, 7 Mar 2024 18:04:24 +0100
Subject: [PATCH 22/34] refactor: move useAwait in suspicious and set as not
 recommended

---
 CHANGELOG.md                                  |   4 +-
 .../incorrect_rule_name.snap                  |   1 -
 .../src/categories.rs                         |   2 +-
 .../src/analyzers/correctness.rs              |   2 -
 .../src/analyzers/suspicious.rs               |   2 +
 .../{correctness => suspicious}/use_await.rs  |   2 +-
 crates/biome_js_analyze/src/options.rs        |   2 +-
 .../useAwait/invalid.js                       |   0
 .../useAwait/invalid.js.snap                  |  26 ++---
 .../useAwait/valid.js                         |   0
 .../useAwait/valid.js.snap                    |   0
 .../src/configuration/linter/rules.rs         | 102 +++++++++---------
 .../@biomejs/backend-jsonrpc/src/workspace.ts |  10 +-
 .../@biomejs/biome/configuration_schema.json  |  14 +--
 .../generated/RecommendedRules.astro          |   1 -
 website/src/content/blog/biome-v1-6.mdx       |   2 +-
 .../src/content/docs/internals/changelog.md   |   4 +-
 .../src/content/docs/linter/rules/index.mdx   |   2 +-
 .../content/docs/linter/rules/use-await.md    |  10 +-
 19 files changed, 89 insertions(+), 97 deletions(-)
 rename crates/biome_js_analyze/src/analyzers/{correctness => suspicious}/use_await.rs (99%)
 rename crates/biome_js_analyze/tests/specs/{correctness => suspicious}/useAwait/invalid.js (100%)
 rename crates/biome_js_analyze/tests/specs/{correctness => suspicious}/useAwait/invalid.js.snap (86%)
 rename crates/biome_js_analyze/tests/specs/{correctness => suspicious}/useAwait/valid.js (100%)
 rename crates/biome_js_analyze/tests/specs/{correctness => suspicious}/useAwait/valid.js.snap (100%)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index f36fac38f49a..2102668ab949 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -353,10 +353,9 @@ The following rules are promoted:
 
 - [complexity/noEmptyTypeParameters](https://biomejs.dev/linter/rules/no-empty-type-parameters)
 - [complexity/noUselessLoneBlockStatements](https://biomejs.dev/linter/rules/no-useless-lone-block-statements)
-- [correctness/noUnusedImports](https://biomejs.dev/linter/rules/no-unused-imports)
 - [correctness/noInvalidUseBeforeDeclaration](https://biomejs.dev/linter/rules/no-invalid-use-before-declaration)
+- [correctness/noUnusedImports](https://biomejs.dev/linter/rules/no-unused-imports)
 - [correctness/noUnusedPrivateClassMembers](https://biomejs.dev/linter/rules/no-unused-private-class-members)
-- [correctness/useAwait](https://biomejs.dev/linter/rules/use-await)
 - [security/noGlobalEval](https://biomejs.dev/linter/rules/no-global-eval)
 - [style/useConsistentArrayType](https://biomejs.dev/linter/rules/use-consistent-array-type)
 - [style/useExportType](https://biomejs.dev/linter/rules/use-export-type)
@@ -370,6 +369,7 @@ The following rules are promoted:
 - [suspicious/noGlobalAssign](https://biomejs.dev/linter/rules/no-global-assign)
 - [suspicious/noMisleadingCharacterClass](https://biomejs.dev/linter/rules/no-misleading-character-class)
 - [suspicious/noThenProperty](https://biomejs.dev/linter/rules/no-then-property)
+- [suspicious/useAwait](https://biomejs.dev/linter/rules/use-await)
 
 Additionally, the following rules are now recommended:
 
diff --git a/crates/biome_cli/tests/snapshots/main_configuration/incorrect_rule_name.snap b/crates/biome_cli/tests/snapshots/main_configuration/incorrect_rule_name.snap
index 902ad10f9825..0869d667b2b7 100644
--- a/crates/biome_cli/tests/snapshots/main_configuration/incorrect_rule_name.snap
+++ b/crates/biome_cli/tests/snapshots/main_configuration/incorrect_rule_name.snap
@@ -80,7 +80,6 @@ biome.json:6:13 deserialize ━━━━━━━━━━━━━━━━━
   - noUnusedVariables
   - noVoidElementsWithChildren
   - noVoidTypeReturn
-  - useAwait
   - useExhaustiveDependencies
   - useHookAtTopLevel
   - useIsNan
diff --git a/crates/biome_diagnostics_categories/src/categories.rs b/crates/biome_diagnostics_categories/src/categories.rs
index 44d3028536db..25ee9b2ac3f4 100644
--- a/crates/biome_diagnostics_categories/src/categories.rs
+++ b/crates/biome_diagnostics_categories/src/categories.rs
@@ -101,7 +101,6 @@ define_categories! {
     "lint/correctness/noUnusedVariables": "https://biomejs.dev/linter/rules/no-unused-variables",
     "lint/correctness/noVoidElementsWithChildren": "https://biomejs.dev/linter/rules/no-void-elements-with-children",
     "lint/correctness/noVoidTypeReturn": "https://biomejs.dev/linter/rules/no-void-type-return",
-    "lint/correctness/useAwait": "https://biomejs.dev/linter/rules/use-await",
     "lint/correctness/useExhaustiveDependencies": "https://biomejs.dev/linter/rules/use-exhaustive-dependencies",
     "lint/correctness/useHookAtTopLevel": "https://biomejs.dev/linter/rules/use-hook-at-top-level",
     "lint/correctness/useIsNan": "https://biomejs.dev/linter/rules/use-is-nan",
@@ -219,6 +218,7 @@ define_categories! {
     "lint/suspicious/noThenProperty": "https://biomejs.dev/linter/rules/no-then-property",
     "lint/suspicious/noUnsafeDeclarationMerging": "https://biomejs.dev/linter/rules/no-unsafe-declaration-merging",
     "lint/suspicious/noUnsafeNegation": "https://biomejs.dev/linter/rules/no-unsafe-negation",
+    "lint/suspicious/useAwait": "https://biomejs.dev/linter/rules/use-await",
     "lint/suspicious/useDefaultSwitchClauseLast": "https://biomejs.dev/linter/rules/use-default-switch-clause-last",
     "lint/suspicious/useGetterReturn": "https://biomejs.dev/linter/rules/use-getter-return",
     "lint/suspicious/useIsArray": "https://biomejs.dev/linter/rules/use-is-array",
diff --git a/crates/biome_js_analyze/src/analyzers/correctness.rs b/crates/biome_js_analyze/src/analyzers/correctness.rs
index 19815f332413..ac667342da53 100644
--- a/crates/biome_js_analyze/src/analyzers/correctness.rs
+++ b/crates/biome_js_analyze/src/analyzers/correctness.rs
@@ -21,7 +21,6 @@ pub mod no_unsafe_optional_chaining;
 pub mod no_unused_labels;
 pub mod no_unused_private_class_members;
 pub mod no_void_type_return;
-pub mod use_await;
 pub mod use_valid_for_direction;
 pub mod use_yield;
 
@@ -48,7 +47,6 @@ declare_group! {
             self :: no_unused_labels :: NoUnusedLabels ,
             self :: no_unused_private_class_members :: NoUnusedPrivateClassMembers ,
             self :: no_void_type_return :: NoVoidTypeReturn ,
-            self :: use_await :: UseAwait ,
             self :: use_valid_for_direction :: UseValidForDirection ,
             self :: use_yield :: UseYield ,
         ]
diff --git a/crates/biome_js_analyze/src/analyzers/suspicious.rs b/crates/biome_js_analyze/src/analyzers/suspicious.rs
index 923e37e0bf5e..13b9e924f18d 100644
--- a/crates/biome_js_analyze/src/analyzers/suspicious.rs
+++ b/crates/biome_js_analyze/src/analyzers/suspicious.rs
@@ -31,6 +31,7 @@ pub mod no_self_compare;
 pub mod no_shadow_restricted_names;
 pub mod no_sparse_array;
 pub mod no_unsafe_negation;
+pub mod use_await;
 pub mod use_default_switch_clause_last;
 pub mod use_getter_return;
 pub mod use_namespace_keyword;
@@ -69,6 +70,7 @@ declare_group! {
             self :: no_shadow_restricted_names :: NoShadowRestrictedNames ,
             self :: no_sparse_array :: NoSparseArray ,
             self :: no_unsafe_negation :: NoUnsafeNegation ,
+            self :: use_await :: UseAwait ,
             self :: use_default_switch_clause_last :: UseDefaultSwitchClauseLast ,
             self :: use_getter_return :: UseGetterReturn ,
             self :: use_namespace_keyword :: UseNamespaceKeyword ,
diff --git a/crates/biome_js_analyze/src/analyzers/correctness/use_await.rs b/crates/biome_js_analyze/src/analyzers/suspicious/use_await.rs
similarity index 99%
rename from crates/biome_js_analyze/src/analyzers/correctness/use_await.rs
rename to crates/biome_js_analyze/src/analyzers/suspicious/use_await.rs
index 5a961db2f587..cdd8a9adab20 100644
--- a/crates/biome_js_analyze/src/analyzers/correctness/use_await.rs
+++ b/crates/biome_js_analyze/src/analyzers/suspicious/use_await.rs
@@ -49,7 +49,7 @@ declare_rule! {
         version: "1.4.0",
         name: "useAwait",
         source: RuleSource::Eslint("require-await"),
-        recommended: true,
+        recommended: false,
     }
 }
 
diff --git a/crates/biome_js_analyze/src/options.rs b/crates/biome_js_analyze/src/options.rs
index 09a7a620170f..1f50a01f1fda 100644
--- a/crates/biome_js_analyze/src/options.rs
+++ b/crates/biome_js_analyze/src/options.rs
@@ -210,7 +210,7 @@ pub type UseArrowFunction =
     ::Options;
 pub type UseAsConstAssertion =
     ::Options;
-pub type UseAwait = ::Options;
+pub type UseAwait = ::Options;
 pub type UseBlockStatements =
     ::Options;
 pub type UseButtonType =
diff --git a/crates/biome_js_analyze/tests/specs/correctness/useAwait/invalid.js b/crates/biome_js_analyze/tests/specs/suspicious/useAwait/invalid.js
similarity index 100%
rename from crates/biome_js_analyze/tests/specs/correctness/useAwait/invalid.js
rename to crates/biome_js_analyze/tests/specs/suspicious/useAwait/invalid.js
diff --git a/crates/biome_js_analyze/tests/specs/correctness/useAwait/invalid.js.snap b/crates/biome_js_analyze/tests/specs/suspicious/useAwait/invalid.js.snap
similarity index 86%
rename from crates/biome_js_analyze/tests/specs/correctness/useAwait/invalid.js.snap
rename to crates/biome_js_analyze/tests/specs/suspicious/useAwait/invalid.js.snap
index e5bbc713354d..de500344c6e7 100644
--- a/crates/biome_js_analyze/tests/specs/correctness/useAwait/invalid.js.snap
+++ b/crates/biome_js_analyze/tests/specs/suspicious/useAwait/invalid.js.snap
@@ -74,7 +74,7 @@ async function withoutForAwait () {
 
 # Diagnostics
 ```
-invalid.js:1:1 lint/correctness/useAwait ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+invalid.js:1:1 lint/suspicious/useAwait ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 
   ! This async function lacks an await expression.
   
@@ -102,7 +102,7 @@ invalid.js:1:1 lint/correctness/useAwait ━━━━━━━━━━━━━
 ```
 
 ```
-invalid.js:5:2 lint/correctness/useAwait ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+invalid.js:5:2 lint/suspicious/useAwait ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 
   ! This async function lacks an await expression.
   
@@ -134,7 +134,7 @@ invalid.js:5:2 lint/correctness/useAwait ━━━━━━━━━━━━━
 ```
 
 ```
-invalid.js:10:2 lint/correctness/useAwait ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+invalid.js:10:2 lint/suspicious/useAwait ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 
   ! This async function lacks an await expression.
   
@@ -164,7 +164,7 @@ invalid.js:10:2 lint/correctness/useAwait ━━━━━━━━━━━━
 ```
 
 ```
-invalid.js:16:2 lint/correctness/useAwait ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+invalid.js:16:2 lint/suspicious/useAwait ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 
   ! This async function lacks an await expression.
   
@@ -194,7 +194,7 @@ invalid.js:16:2 lint/correctness/useAwait ━━━━━━━━━━━━
 ```
 
 ```
-invalid.js:22:2 lint/correctness/useAwait ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+invalid.js:22:2 lint/suspicious/useAwait ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 
   ! This async function lacks an await expression.
   
@@ -224,7 +224,7 @@ invalid.js:22:2 lint/correctness/useAwait ━━━━━━━━━━━━
 ```
 
 ```
-invalid.js:21:1 lint/correctness/useAwait ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+invalid.js:21:1 lint/suspicious/useAwait ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 
   ! This async function lacks an await expression.
   
@@ -260,7 +260,7 @@ invalid.js:21:1 lint/correctness/useAwait ━━━━━━━━━━━━
 ```
 
 ```
-invalid.js:28:2 lint/correctness/useAwait ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+invalid.js:28:2 lint/suspicious/useAwait ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 
   ! This async function lacks an await expression.
   
@@ -290,7 +290,7 @@ invalid.js:28:2 lint/correctness/useAwait ━━━━━━━━━━━━
 ```
 
 ```
-invalid.js:27:1 lint/correctness/useAwait ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+invalid.js:27:1 lint/suspicious/useAwait ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 
   ! This async function lacks an await expression.
   
@@ -328,7 +328,7 @@ invalid.js:27:1 lint/correctness/useAwait ━━━━━━━━━━━━
 ```
 
 ```
-invalid.js:34:1 lint/correctness/useAwait ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+invalid.js:34:1 lint/suspicious/useAwait ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 
   ! This async function lacks an await expression.
   
@@ -366,7 +366,7 @@ invalid.js:34:1 lint/correctness/useAwait ━━━━━━━━━━━━
 ```
 
 ```
-invalid.js:43:3 lint/correctness/useAwait ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+invalid.js:43:3 lint/suspicious/useAwait ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 
   ! This async function lacks an await expression.
   
@@ -398,7 +398,7 @@ invalid.js:43:3 lint/correctness/useAwait ━━━━━━━━━━━━
 ```
 
 ```
-invalid.js:49:3 lint/correctness/useAwait ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+invalid.js:49:3 lint/suspicious/useAwait ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 
   ! This async function lacks an await expression.
   
@@ -428,7 +428,7 @@ invalid.js:49:3 lint/correctness/useAwait ━━━━━━━━━━━━
 ```
 
 ```
-invalid.js:41:1 lint/correctness/useAwait ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+invalid.js:41:1 lint/suspicious/useAwait ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 
   ! This async function lacks an await expression.
   
@@ -464,7 +464,7 @@ invalid.js:41:1 lint/correctness/useAwait ━━━━━━━━━━━━
 ```
 
 ```
-invalid.js:59:1 lint/correctness/useAwait ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+invalid.js:59:1 lint/suspicious/useAwait ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 
   ! This async function lacks an await expression.
   
diff --git a/crates/biome_js_analyze/tests/specs/correctness/useAwait/valid.js b/crates/biome_js_analyze/tests/specs/suspicious/useAwait/valid.js
similarity index 100%
rename from crates/biome_js_analyze/tests/specs/correctness/useAwait/valid.js
rename to crates/biome_js_analyze/tests/specs/suspicious/useAwait/valid.js
diff --git a/crates/biome_js_analyze/tests/specs/correctness/useAwait/valid.js.snap b/crates/biome_js_analyze/tests/specs/suspicious/useAwait/valid.js.snap
similarity index 100%
rename from crates/biome_js_analyze/tests/specs/correctness/useAwait/valid.js.snap
rename to crates/biome_js_analyze/tests/specs/suspicious/useAwait/valid.js.snap
diff --git a/crates/biome_service/src/configuration/linter/rules.rs b/crates/biome_service/src/configuration/linter/rules.rs
index 24f8971d7d5a..face9a53dea7 100644
--- a/crates/biome_service/src/configuration/linter/rules.rs
+++ b/crates/biome_service/src/configuration/linter/rules.rs
@@ -1845,9 +1845,6 @@ pub struct Correctness {
     #[doc = "Disallow returning a value from a function with the return type 'void'"]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub no_void_type_return: Option>,
-    #[doc = "Ensure async functions utilize await."]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub use_await: Option>,
     #[doc = "Enforce all dependencies are correctly specified in a React hook."]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub use_exhaustive_dependencies: Option>,
@@ -1880,7 +1877,7 @@ impl DeserializableValidator for Correctness {
 }
 impl Correctness {
     const GROUP_NAME: &'static str = "correctness";
-    pub(crate) const GROUP_RULES: [&'static str; 37] = [
+    pub(crate) const GROUP_RULES: [&'static str; 36] = [
         "noChildrenProp",
         "noConstAssign",
         "noConstantCondition",
@@ -1912,14 +1909,13 @@ impl Correctness {
         "noUnusedVariables",
         "noVoidElementsWithChildren",
         "noVoidTypeReturn",
-        "useAwait",
         "useExhaustiveDependencies",
         "useHookAtTopLevel",
         "useIsNan",
         "useValidForDirection",
         "useYield",
     ];
-    const RECOMMENDED_RULES: [&'static str; 31] = [
+    const RECOMMENDED_RULES: [&'static str; 30] = [
         "noChildrenProp",
         "noConstAssign",
         "noConstantCondition",
@@ -1946,13 +1942,12 @@ impl Correctness {
         "noUnusedLabels",
         "noVoidElementsWithChildren",
         "noVoidTypeReturn",
-        "useAwait",
         "useExhaustiveDependencies",
         "useIsNan",
         "useValidForDirection",
         "useYield",
     ];
-    const RECOMMENDED_RULES_AS_FILTERS: [RuleFilter<'static>; 31] = [
+    const RECOMMENDED_RULES_AS_FILTERS: [RuleFilter<'static>; 30] = [
         RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[0]),
         RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[1]),
         RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[2]),
@@ -1980,12 +1975,11 @@ impl Correctness {
         RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[29]),
         RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[30]),
         RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[31]),
-        RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[32]),
+        RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[33]),
         RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[34]),
         RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[35]),
-        RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[36]),
     ];
-    const ALL_RULES_AS_FILTERS: [RuleFilter<'static>; 37] = [
+    const ALL_RULES_AS_FILTERS: [RuleFilter<'static>; 36] = [
         RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[0]),
         RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[1]),
         RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[2]),
@@ -2022,7 +2016,6 @@ impl Correctness {
         RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[33]),
         RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[34]),
         RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[35]),
-        RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[36]),
     ];
     #[doc = r" Retrieves the recommended rules"]
     pub(crate) fn is_recommended(&self) -> bool {
@@ -2194,34 +2187,29 @@ impl Correctness {
                 index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[30]));
             }
         }
-        if let Some(rule) = self.use_await.as_ref() {
-            if rule.is_enabled() {
-                index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[31]));
-            }
-        }
         if let Some(rule) = self.use_exhaustive_dependencies.as_ref() {
             if rule.is_enabled() {
-                index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[32]));
+                index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[31]));
             }
         }
         if let Some(rule) = self.use_hook_at_top_level.as_ref() {
             if rule.is_enabled() {
-                index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[33]));
+                index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[32]));
             }
         }
         if let Some(rule) = self.use_is_nan.as_ref() {
             if rule.is_enabled() {
-                index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[34]));
+                index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[33]));
             }
         }
         if let Some(rule) = self.use_valid_for_direction.as_ref() {
             if rule.is_enabled() {
-                index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[35]));
+                index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[34]));
             }
         }
         if let Some(rule) = self.use_yield.as_ref() {
             if rule.is_enabled() {
-                index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[36]));
+                index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[35]));
             }
         }
         index_set
@@ -2383,34 +2371,29 @@ impl Correctness {
                 index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[30]));
             }
         }
-        if let Some(rule) = self.use_await.as_ref() {
-            if rule.is_disabled() {
-                index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[31]));
-            }
-        }
         if let Some(rule) = self.use_exhaustive_dependencies.as_ref() {
             if rule.is_disabled() {
-                index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[32]));
+                index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[31]));
             }
         }
         if let Some(rule) = self.use_hook_at_top_level.as_ref() {
             if rule.is_disabled() {
-                index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[33]));
+                index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[32]));
             }
         }
         if let Some(rule) = self.use_is_nan.as_ref() {
             if rule.is_disabled() {
-                index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[34]));
+                index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[33]));
             }
         }
         if let Some(rule) = self.use_valid_for_direction.as_ref() {
             if rule.is_disabled() {
-                index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[35]));
+                index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[34]));
             }
         }
         if let Some(rule) = self.use_yield.as_ref() {
             if rule.is_disabled() {
-                index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[36]));
+                index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[35]));
             }
         }
         index_set
@@ -2423,10 +2406,10 @@ impl Correctness {
     pub(crate) fn is_recommended_rule(rule_name: &str) -> bool {
         Self::RECOMMENDED_RULES.contains(&rule_name)
     }
-    pub(crate) fn recommended_rules_as_filters() -> [RuleFilter<'static>; 31] {
+    pub(crate) fn recommended_rules_as_filters() -> [RuleFilter<'static>; 30] {
         Self::RECOMMENDED_RULES_AS_FILTERS
     }
-    pub(crate) fn all_rules_as_filters() -> [RuleFilter<'static>; 37] {
+    pub(crate) fn all_rules_as_filters() -> [RuleFilter<'static>; 36] {
         Self::ALL_RULES_AS_FILTERS
     }
     #[doc = r" Select preset rules"]
@@ -2576,10 +2559,6 @@ impl Correctness {
                 .no_void_type_return
                 .as_ref()
                 .map(|conf| (conf.level(), conf.get_options())),
-            "useAwait" => self
-                .use_await
-                .as_ref()
-                .map(|conf| (conf.level(), conf.get_options())),
             "useExhaustiveDependencies" => self
                 .use_exhaustive_dependencies
                 .as_ref()
@@ -4448,6 +4427,9 @@ pub struct Suspicious {
     #[doc = "Disallow using unsafe negation."]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub no_unsafe_negation: Option>,
+    #[doc = "Ensure async functions utilize await."]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub use_await: Option>,
     #[doc = "Enforce default clauses in switch statements to be last"]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub use_default_switch_clause_last: Option>,
@@ -4480,7 +4462,7 @@ impl DeserializableValidator for Suspicious {
 }
 impl Suspicious {
     const GROUP_NAME: &'static str = "suspicious";
-    pub(crate) const GROUP_RULES: [&'static str; 49] = [
+    pub(crate) const GROUP_RULES: [&'static str; 50] = [
         "noApproximativeNumericConstant",
         "noArrayIndexKey",
         "noAssignInExpressions",
@@ -4525,6 +4507,7 @@ impl Suspicious {
         "noThenProperty",
         "noUnsafeDeclarationMerging",
         "noUnsafeNegation",
+        "useAwait",
         "useDefaultSwitchClauseLast",
         "useGetterReturn",
         "useIsArray",
@@ -4623,13 +4606,13 @@ impl Suspicious {
         RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[41]),
         RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[42]),
         RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[43]),
-        RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[44]),
         RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[45]),
         RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[46]),
         RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[47]),
         RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[48]),
+        RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[49]),
     ];
-    const ALL_RULES_AS_FILTERS: [RuleFilter<'static>; 49] = [
+    const ALL_RULES_AS_FILTERS: [RuleFilter<'static>; 50] = [
         RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[0]),
         RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[1]),
         RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[2]),
@@ -4679,6 +4662,7 @@ impl Suspicious {
         RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[46]),
         RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[47]),
         RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[48]),
+        RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[49]),
     ];
     #[doc = r" Retrieves the recommended rules"]
     pub(crate) fn is_recommended(&self) -> bool {
@@ -4915,31 +4899,36 @@ impl Suspicious {
                 index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[43]));
             }
         }
-        if let Some(rule) = self.use_default_switch_clause_last.as_ref() {
+        if let Some(rule) = self.use_await.as_ref() {
             if rule.is_enabled() {
                 index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[44]));
             }
         }
-        if let Some(rule) = self.use_getter_return.as_ref() {
+        if let Some(rule) = self.use_default_switch_clause_last.as_ref() {
             if rule.is_enabled() {
                 index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[45]));
             }
         }
-        if let Some(rule) = self.use_is_array.as_ref() {
+        if let Some(rule) = self.use_getter_return.as_ref() {
             if rule.is_enabled() {
                 index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[46]));
             }
         }
-        if let Some(rule) = self.use_namespace_keyword.as_ref() {
+        if let Some(rule) = self.use_is_array.as_ref() {
             if rule.is_enabled() {
                 index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[47]));
             }
         }
-        if let Some(rule) = self.use_valid_typeof.as_ref() {
+        if let Some(rule) = self.use_namespace_keyword.as_ref() {
             if rule.is_enabled() {
                 index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[48]));
             }
         }
+        if let Some(rule) = self.use_valid_typeof.as_ref() {
+            if rule.is_enabled() {
+                index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[49]));
+            }
+        }
         index_set
     }
     pub(crate) fn get_disabled_rules(&self) -> IndexSet {
@@ -5164,31 +5153,36 @@ impl Suspicious {
                 index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[43]));
             }
         }
-        if let Some(rule) = self.use_default_switch_clause_last.as_ref() {
+        if let Some(rule) = self.use_await.as_ref() {
             if rule.is_disabled() {
                 index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[44]));
             }
         }
-        if let Some(rule) = self.use_getter_return.as_ref() {
+        if let Some(rule) = self.use_default_switch_clause_last.as_ref() {
             if rule.is_disabled() {
                 index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[45]));
             }
         }
-        if let Some(rule) = self.use_is_array.as_ref() {
+        if let Some(rule) = self.use_getter_return.as_ref() {
             if rule.is_disabled() {
                 index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[46]));
             }
         }
-        if let Some(rule) = self.use_namespace_keyword.as_ref() {
+        if let Some(rule) = self.use_is_array.as_ref() {
             if rule.is_disabled() {
                 index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[47]));
             }
         }
-        if let Some(rule) = self.use_valid_typeof.as_ref() {
+        if let Some(rule) = self.use_namespace_keyword.as_ref() {
             if rule.is_disabled() {
                 index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[48]));
             }
         }
+        if let Some(rule) = self.use_valid_typeof.as_ref() {
+            if rule.is_disabled() {
+                index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[49]));
+            }
+        }
         index_set
     }
     #[doc = r" Checks if, given a rule name, matches one of the rules contained in this category"]
@@ -5202,7 +5196,7 @@ impl Suspicious {
     pub(crate) fn recommended_rules_as_filters() -> [RuleFilter<'static>; 47] {
         Self::RECOMMENDED_RULES_AS_FILTERS
     }
-    pub(crate) fn all_rules_as_filters() -> [RuleFilter<'static>; 49] {
+    pub(crate) fn all_rules_as_filters() -> [RuleFilter<'static>; 50] {
         Self::ALL_RULES_AS_FILTERS
     }
     #[doc = r" Select preset rules"]
@@ -5404,6 +5398,10 @@ impl Suspicious {
                 .no_unsafe_negation
                 .as_ref()
                 .map(|conf| (conf.level(), conf.get_options())),
+            "useAwait" => self
+                .use_await
+                .as_ref()
+                .map(|conf| (conf.level(), conf.get_options())),
             "useDefaultSwitchClauseLast" => self
                 .use_default_switch_clause_last
                 .as_ref()
diff --git a/packages/@biomejs/backend-jsonrpc/src/workspace.ts b/packages/@biomejs/backend-jsonrpc/src/workspace.ts
index 1f000d6c5921..e2198b6111d0 100644
--- a/packages/@biomejs/backend-jsonrpc/src/workspace.ts
+++ b/packages/@biomejs/backend-jsonrpc/src/workspace.ts
@@ -859,10 +859,6 @@ export interface Correctness {
 	 * It enables the recommended rules for this group
 	 */
 	recommended?: boolean;
-	/**
-	 * Ensure async functions utilize await.
-	 */
-	useAwait?: RuleConfiguration_for_Null;
 	/**
 	 * Enforce all dependencies are correctly specified in a React hook.
 	 */
@@ -1384,6 +1380,10 @@ export interface Suspicious {
 	 * It enables the recommended rules for this group
 	 */
 	recommended?: boolean;
+	/**
+	 * Ensure async functions utilize await.
+	 */
+	useAwait?: RuleConfiguration_for_Null;
 	/**
 	 * Enforce default clauses in switch statements to be last
 	 */
@@ -1874,7 +1874,6 @@ export type Category =
 	| "lint/correctness/noUnusedVariables"
 	| "lint/correctness/noVoidElementsWithChildren"
 	| "lint/correctness/noVoidTypeReturn"
-	| "lint/correctness/useAwait"
 	| "lint/correctness/useExhaustiveDependencies"
 	| "lint/correctness/useHookAtTopLevel"
 	| "lint/correctness/useIsNan"
@@ -1992,6 +1991,7 @@ export type Category =
 	| "lint/suspicious/noThenProperty"
 	| "lint/suspicious/noUnsafeDeclarationMerging"
 	| "lint/suspicious/noUnsafeNegation"
+	| "lint/suspicious/useAwait"
 	| "lint/suspicious/useDefaultSwitchClauseLast"
 	| "lint/suspicious/useGetterReturn"
 	| "lint/suspicious/useIsArray"
diff --git a/packages/@biomejs/biome/configuration_schema.json b/packages/@biomejs/biome/configuration_schema.json
index c3ad8616193e..3bba98735334 100644
--- a/packages/@biomejs/biome/configuration_schema.json
+++ b/packages/@biomejs/biome/configuration_schema.json
@@ -780,13 +780,6 @@
 					"description": "It enables the recommended rules for this group",
 					"type": ["boolean", "null"]
 				},
-				"useAwait": {
-					"description": "Ensure async functions utilize await.",
-					"anyOf": [
-						{ "$ref": "#/definitions/RuleConfiguration" },
-						{ "type": "null" }
-					]
-				},
 				"useExhaustiveDependencies": {
 					"description": "Enforce all dependencies are correctly specified in a React hook.",
 					"anyOf": [
@@ -2590,6 +2583,13 @@
 					"description": "It enables the recommended rules for this group",
 					"type": ["boolean", "null"]
 				},
+				"useAwait": {
+					"description": "Ensure async functions utilize await.",
+					"anyOf": [
+						{ "$ref": "#/definitions/RuleConfiguration" },
+						{ "type": "null" }
+					]
+				},
 				"useDefaultSwitchClauseLast": {
 					"description": "Enforce default clauses in switch statements to be last",
 					"anyOf": [
diff --git a/website/src/components/generated/RecommendedRules.astro b/website/src/components/generated/RecommendedRules.astro
index 4c4bbefb7dfe..61e73566d60d 100644
--- a/website/src/components/generated/RecommendedRules.astro
+++ b/website/src/components/generated/RecommendedRules.astro
@@ -80,7 +80,6 @@
 	
  • noUnusedLabels
  • noVoidElementsWithChildren
  • noVoidTypeReturn
  • -
  • useAwait
  • useExhaustiveDependencies
  • useIsNan
  • useValidForDirection
  • diff --git a/website/src/content/blog/biome-v1-6.mdx b/website/src/content/blog/biome-v1-6.mdx index 0a24acfde7e8..69759d4c380a 100644 --- a/website/src/content/blog/biome-v1-6.mdx +++ b/website/src/content/blog/biome-v1-6.mdx @@ -239,7 +239,7 @@ The following rules are promoted: - [correctness/noUnusedImports](https://biomejs.dev/linter/rules/no-unused-imports) - [correctness/noInvalidUseBeforeDeclaration](https://biomejs.dev/linter/rules/no-invalid-use-before-declaration) - [correctness/noUnusedPrivateClassMembers](https://biomejs.dev/linter/rules/no-unused-private-class-members) -- [correctness/useAwait](https://biomejs.dev/linter/rules/use-await) +- [suspicious/useAwait](https://biomejs.dev/linter/rules/use-await) - [security/noGlobalEval](https://biomejs.dev/linter/rules/no-global-eval) - [style/useConsistentArrayType](https://biomejs.dev/linter/rules/use-consistent-array-type) - [style/useExportType](https://biomejs.dev/linter/rules/use-export-type) diff --git a/website/src/content/docs/internals/changelog.md b/website/src/content/docs/internals/changelog.md index 6c65e757af89..022fbc815ce8 100644 --- a/website/src/content/docs/internals/changelog.md +++ b/website/src/content/docs/internals/changelog.md @@ -359,10 +359,9 @@ The following rules are promoted: - [complexity/noEmptyTypeParameters](https://biomejs.dev/linter/rules/no-empty-type-parameters) - [complexity/noUselessLoneBlockStatements](https://biomejs.dev/linter/rules/no-useless-lone-block-statements) -- [correctness/noUnusedImports](https://biomejs.dev/linter/rules/no-unused-imports) - [correctness/noInvalidUseBeforeDeclaration](https://biomejs.dev/linter/rules/no-invalid-use-before-declaration) +- [correctness/noUnusedImports](https://biomejs.dev/linter/rules/no-unused-imports) - [correctness/noUnusedPrivateClassMembers](https://biomejs.dev/linter/rules/no-unused-private-class-members) -- [correctness/useAwait](https://biomejs.dev/linter/rules/use-await) - [security/noGlobalEval](https://biomejs.dev/linter/rules/no-global-eval) - [style/useConsistentArrayType](https://biomejs.dev/linter/rules/use-consistent-array-type) - [style/useExportType](https://biomejs.dev/linter/rules/use-export-type) @@ -376,6 +375,7 @@ The following rules are promoted: - [suspicious/noGlobalAssign](https://biomejs.dev/linter/rules/no-global-assign) - [suspicious/noMisleadingCharacterClass](https://biomejs.dev/linter/rules/no-misleading-character-class) - [suspicious/noThenProperty](https://biomejs.dev/linter/rules/no-then-property) +- [suspicious/useAwait](https://biomejs.dev/linter/rules/use-await) Additionally, the following rules are now recommended: diff --git a/website/src/content/docs/linter/rules/index.mdx b/website/src/content/docs/linter/rules/index.mdx index 282d20d3c8fc..715282cedc13 100644 --- a/website/src/content/docs/linter/rules/index.mdx +++ b/website/src/content/docs/linter/rules/index.mdx @@ -113,7 +113,6 @@ Rules that detect code that is guaranteed to be incorrect or useless. | [noUnusedVariables](/linter/rules/no-unused-variables) | Disallow unused variables. | ⚠ī¸ | | [noVoidElementsWithChildren](/linter/rules/no-void-elements-with-children) | This rules prevents void elements (AKA self-closing elements) from having children. | ✅ ⚠ī¸ | | [noVoidTypeReturn](/linter/rules/no-void-type-return) | Disallow returning a value from a function with the return type 'void' | ✅ | -| [useAwait](/linter/rules/use-await) | Ensure async functions utilize await. | ✅ | | [useExhaustiveDependencies](/linter/rules/use-exhaustive-dependencies) | Enforce all dependencies are correctly specified in a React hook. | ✅ | | [useHookAtTopLevel](/linter/rules/use-hook-at-top-level) | Enforce that all React hooks are being called from the Top Level component functions. | | | [useIsNan](/linter/rules/use-is-nan) | Require calls to isNaN() when checking for NaN. | ✅ ⚠ī¸ | @@ -233,6 +232,7 @@ Rules that detect code that is likely to be incorrect or useless. | [noThenProperty](/linter/rules/no-then-property) | Disallow then property. | ✅ | | [noUnsafeDeclarationMerging](/linter/rules/no-unsafe-declaration-merging) | Disallow unsafe declaration merging between interfaces and classes. | ✅ | | [noUnsafeNegation](/linter/rules/no-unsafe-negation) | Disallow using unsafe negation. | ✅ ⚠ī¸ | +| [useAwait](/linter/rules/use-await) | Ensure async functions utilize await. | | | [useDefaultSwitchClauseLast](/linter/rules/use-default-switch-clause-last) | Enforce default clauses in switch statements to be last | ✅ | | [useGetterReturn](/linter/rules/use-getter-return) | Enforce get methods to always return a value. | ✅ | | [useIsArray](/linter/rules/use-is-array) | Use Array.isArray() instead of instanceof Array. | ✅ ⚠ī¸ | diff --git a/website/src/content/docs/linter/rules/use-await.md b/website/src/content/docs/linter/rules/use-await.md index 8526791a4d6d..e768f9f802dc 100644 --- a/website/src/content/docs/linter/rules/use-await.md +++ b/website/src/content/docs/linter/rules/use-await.md @@ -2,11 +2,7 @@ title: useAwait (since v1.4.0) --- -**Diagnostic Category: `lint/correctness/useAwait`** - -:::note -This rule is recommended by Biome. A diagnostic error will appear when linting your code. -::: +**Diagnostic Category: `lint/suspicious/useAwait`** Source: require-await @@ -29,9 +25,9 @@ async function fetchData() { } ``` -
    correctness/useAwait.js:1:1 lint/correctness/useAwait ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    +
    suspicious/useAwait.js:1:1 lint/suspicious/useAwait ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
     
    -  ✖ This async function lacks an await expression.
    +  ⚠ This async function lacks an await expression.
       
       > 1 │ async function fetchData() {
           │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    
    From b081455271785f1e6ff23b51ad3bde6acd09e7cc Mon Sep 17 00:00:00 2001
    From: Victorien Elvinger 
    Date: Fri, 8 Mar 2024 00:50:26 +0100
    Subject: [PATCH 23/34] Update CHANGELOG.md
    
    Co-authored-by: Superchupu <53496941+SuperchupuDev@users.noreply.github.com>
    ---
     CHANGELOG.md | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/CHANGELOG.md b/CHANGELOG.md
    index 2102668ab949..20987d0443ff 100644
    --- a/CHANGELOG.md
    +++ b/CHANGELOG.md
    @@ -378,9 +378,9 @@ Additionally, the following rules are now recommended:
     
     #### Removed rules
     
    -- Re;ove `nursery/useGroupedTypeImport`. The rule [style/useImportType](https://biomejs.dev/linter/rules/use-import-type) covers the behavior of this rule.
    +- Remove `nursery/useGroupedTypeImport`. The rule [style/useImportType](https://biomejs.dev/linter/rules/use-import-type) covers the behavior of this rule.
     
    -  Note that removing a nursery rule is not breaking change according to our [semantic versioning](https://biomejs.dev/internals/versioning).
    +  Note that removing a nursery rule is not considered a breaking change according to our [semantic versioning](https://biomejs.dev/internals/versioning).
     
       Contributed by @Conaclos
     
    
    From 6832badb7d30ee82890a9cb62c6f4a6605a70ae7 Mon Sep 17 00:00:00 2001
    From: Victorien Elvinger 
    Date: Fri, 8 Mar 2024 00:52:24 +0100
    Subject: [PATCH 24/34] Update website/src/content/blog/biome-v1-6.mdx
    
    Co-authored-by: Superchupu <53496941+SuperchupuDev@users.noreply.github.com>
    ---
     website/src/content/blog/biome-v1-6.mdx | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/website/src/content/blog/biome-v1-6.mdx b/website/src/content/blog/biome-v1-6.mdx
    index 1b3932ae9523..03ab27cd559d 100644
    --- a/website/src/content/blog/biome-v1-6.mdx
    +++ b/website/src/content/blog/biome-v1-6.mdx
    @@ -61,7 +61,7 @@ Make sure to read the [documentation about expectations and limitations](/intern
     
     ### Support for `biome.jsonc`
     
    -Biome now accepts the file `biome.jsonc` as configuration! Now, you can insert all the comments you want in a configuration.
    +Biome now accepts the `biome.jsonc` file as configuration! You can insert all the comments you want in there.
     
     ### `extends` resolves dependencies
     
    
    From 4206878e5c312e2bba1b62b3b58e370034f78dd4 Mon Sep 17 00:00:00 2001
    From: Victorien Elvinger 
    Date: Fri, 8 Mar 2024 00:52:40 +0100
    Subject: [PATCH 25/34] Update
     website/src/content/docs/internals/language-support.mdx
    
    Co-authored-by: Superchupu <53496941+SuperchupuDev@users.noreply.github.com>
    ---
     website/src/content/docs/internals/language-support.mdx | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/website/src/content/docs/internals/language-support.mdx b/website/src/content/docs/internals/language-support.mdx
    index 3da0ad0e0e0d..51bd02774c1f 100644
    --- a/website/src/content/docs/internals/language-support.mdx
    +++ b/website/src/content/docs/internals/language-support.mdx
    @@ -39,9 +39,9 @@ Biome supports TypeScript version 5.2.
     ## HTML super languages support
     
     From version `v1.6.0`, these languages are **partially** supported. Biome will get better over time, and it will provide more options to tweak your project. As for today, there are some expectations and limitations to take in considerations:
    -- For `.astro` file, **only** the **frontmatter** portion of the file is supported.
    +- For `.astro` files, **only** the **frontmatter** portion of the file is supported.
     - For `.vue` and `.svelte` files, **only** the **\** tags portion of the file is supported.
    -- Diagnostics will only show code frames that belong to the portions before mentioned.
    +- Diagnostics will only show code frames that belong to the portions mentioned above.
     - When **formatting** `.vue` and `.svelte` files, the indentation of the JavaScript/TypeScript code will start from the beginning.
     
       ```vue title="file.vue" del={2} ins={3}
    
    From 5f8b156a5142c0826226f6756c92b64216787c8b Mon Sep 17 00:00:00 2001
    From: Victorien Elvinger 
    Date: Fri, 8 Mar 2024 00:52:56 +0100
    Subject: [PATCH 26/34] Update
     website/src/content/docs/internals/language-support.mdx
    
    Co-authored-by: Superchupu <53496941+SuperchupuDev@users.noreply.github.com>
    ---
     website/src/content/docs/internals/language-support.mdx | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/website/src/content/docs/internals/language-support.mdx b/website/src/content/docs/internals/language-support.mdx
    index 51bd02774c1f..cb5b7ccdb9dd 100644
    --- a/website/src/content/docs/internals/language-support.mdx
    +++ b/website/src/content/docs/internals/language-support.mdx
    @@ -38,7 +38,7 @@ Biome supports TypeScript version 5.2.
     
     ## HTML super languages support
     
    -From version `v1.6.0`, these languages are **partially** supported. Biome will get better over time, and it will provide more options to tweak your project. As for today, there are some expectations and limitations to take in considerations:
    +As of version `1.6.0`, these languages are **partially** supported. Biome will get better over time, and it will provide more options to tweak your project. As for today, there are some expectations and limitations to take in consideration:
     - For `.astro` files, **only** the **frontmatter** portion of the file is supported.
     - For `.vue` and `.svelte` files, **only** the **\** tags portion of the file is supported.
     - Diagnostics will only show code frames that belong to the portions mentioned above.
    
    From 7024c4a233b0d59e08937a765e88fa39ed597b7c Mon Sep 17 00:00:00 2001
    From: Victorien Elvinger 
    Date: Fri, 8 Mar 2024 00:53:05 +0100
    Subject: [PATCH 27/34] Update
     website/src/content/docs/guides/getting-started.mdx
    
    Co-authored-by: Superchupu <53496941+SuperchupuDev@users.noreply.github.com>
    ---
     website/src/content/docs/guides/getting-started.mdx | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/website/src/content/docs/guides/getting-started.mdx b/website/src/content/docs/guides/getting-started.mdx
    index e624e4b49b83..9a024566e815 100644
    --- a/website/src/content/docs/guides/getting-started.mdx
    +++ b/website/src/content/docs/guides/getting-started.mdx
    @@ -80,7 +80,7 @@ Alternatively, you can run `biome init --jsonc` , and emit a `biome.jsonc` file:
     
     The `linter.enabled: true` enables the linter and `rules.recommended: true` enables the [recommended rules](/linter/rules/).
     
    -Formatting is enabled **by default**, because the configuration doesn't explicitly [disable](/reference/configuration/#formatterenabled) formatting with `formatter.enabled: false`.
    +Formatting is enabled **by default**, but you can [disable](/reference/configuration/#formatterenabled) it by explicitly using `formatter.enabled: false`.
     
     ## Usage
     
    
    From 3b4f49d2116429816c6414115ab3cc1df50d4fe8 Mon Sep 17 00:00:00 2001
    From: Victorien Elvinger 
    Date: Fri, 8 Mar 2024 00:53:15 +0100
    Subject: [PATCH 28/34] Update
     website/src/content/docs/guides/getting-started.mdx
    
    Co-authored-by: Superchupu <53496941+SuperchupuDev@users.noreply.github.com>
    ---
     website/src/content/docs/guides/getting-started.mdx | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/website/src/content/docs/guides/getting-started.mdx b/website/src/content/docs/guides/getting-started.mdx
    index 9a024566e815..850a992454f8 100644
    --- a/website/src/content/docs/guides/getting-started.mdx
    +++ b/website/src/content/docs/guides/getting-started.mdx
    @@ -59,7 +59,7 @@ After running the `init` command, you'll now have a new `biome.json` file in you
     }
     ```
     
    -Alternatively, you can run `biome init --jsonc` , and emit a `biome.jsonc` file:
    +Alternatively, you can run `biome init --jsonc` to emit a `biome.jsonc` file instead.
     
     
     
    
    From daf339b916ac8f08ec60e1510ff39f16f8362975 Mon Sep 17 00:00:00 2001
    From: Victorien Elvinger 
    Date: Fri, 8 Mar 2024 00:53:23 +0100
    Subject: [PATCH 29/34] Update website/src/content/blog/biome-v1-6.mdx
    
    Co-authored-by: Superchupu <53496941+SuperchupuDev@users.noreply.github.com>
    ---
     website/src/content/blog/biome-v1-6.mdx | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/website/src/content/blog/biome-v1-6.mdx b/website/src/content/blog/biome-v1-6.mdx
    index 03ab27cd559d..a0ce40f59669 100644
    --- a/website/src/content/blog/biome-v1-6.mdx
    +++ b/website/src/content/blog/biome-v1-6.mdx
    @@ -266,7 +266,7 @@ Additionally, the following rules are now recommended:
     
     :::caution
     Among other fixes, we fixed a bug where Biome traversed *ignored* folders. Biome doesn't traverse ignored folders anymore. This could cause unexpected changes in behaviour. For example, if you configured globs a way similar to `files.ignore: ["./src/**/__folder__"]` and
    -`files.include: ["./src/**/*.ts"]`, the `./src` won't be traversed anymore because `files.ignore` is matched before, and the `src/**` matches all folders inside the `src` directory.
    +`files.include: ["./src/**/*.ts"]`, `./src` won't be traversed anymore because `files.ignore` is matched before, and `src/**` matches all folders inside the `src` directory.
     :::
     
     - We drastically reduced the number of protected files, which means you can now format your `package.json`, `tsconfig.json`, etc. with Biome. Lock files are still considered protected.
    
    From 2d0b90e385d17951ccec0d0fcc5a790f6b78c18a Mon Sep 17 00:00:00 2001
    From: Victorien Elvinger 
    Date: Fri, 8 Mar 2024 00:57:12 +0100
    Subject: [PATCH 30/34] chore: update changelog
    
    ---
     website/src/content/docs/internals/changelog.md | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/website/src/content/docs/internals/changelog.md b/website/src/content/docs/internals/changelog.md
    index 022fbc815ce8..db4c6e6ec9ec 100644
    --- a/website/src/content/docs/internals/changelog.md
    +++ b/website/src/content/docs/internals/changelog.md
    @@ -384,9 +384,9 @@ Additionally, the following rules are now recommended:
     
     #### Removed rules
     
    -- Re;ove `nursery/useGroupedTypeImport`. The rule [style/useImportType](https://biomejs.dev/linter/rules/use-import-type) covers the behavior of this rule.
    +- Remove `nursery/useGroupedTypeImport`. The rule [style/useImportType](https://biomejs.dev/linter/rules/use-import-type) covers the behavior of this rule.
     
    -  Note that removing a nursery rule is not breaking change according to our [semantic versioning](https://biomejs.dev/internals/versioning).
    +  Note that removing a nursery rule is not considered a breaking change according to our [semantic versioning](https://biomejs.dev/internals/versioning).
     
       Contributed by @Conaclos
     
    
    From 6fdfdf571236519f090d865447d4fa35d3f34891 Mon Sep 17 00:00:00 2001
    From: Victorien Elvinger 
    Date: Fri, 8 Mar 2024 13:36:51 +0100
    Subject: [PATCH 31/34] fix: remove warning
    
    ---
     website/src/content/blog/biome-v1-6.mdx | 5 -----
     1 file changed, 5 deletions(-)
    
    diff --git a/website/src/content/blog/biome-v1-6.mdx b/website/src/content/blog/biome-v1-6.mdx
    index a0ce40f59669..004b5eff5544 100644
    --- a/website/src/content/blog/biome-v1-6.mdx
    +++ b/website/src/content/blog/biome-v1-6.mdx
    @@ -264,11 +264,6 @@ Additionally, the following rules are now recommended:
     
     ### Miscellaneous
     
    -:::caution
    -Among other fixes, we fixed a bug where Biome traversed *ignored* folders. Biome doesn't traverse ignored folders anymore. This could cause unexpected changes in behaviour. For example, if you configured globs a way similar to `files.ignore: ["./src/**/__folder__"]` and
    -`files.include: ["./src/**/*.ts"]`, `./src` won't be traversed anymore because `files.ignore` is matched before, and `src/**` matches all folders inside the `src` directory.
    -:::
    -
     - We drastically reduced the number of protected files, which means you can now format your `package.json`, `tsconfig.json`, etc. with Biome. Lock files are still considered protected.
     - The CLI now does a better job at reporting the total number of files and the files that were really changed.
     - When a diagnostic shows a file name on the terminal that is integrated with your editor, you can click it and the editor will open the file for you.
    
    From 1738773c67a9a2ab22fbc6d54ad7a7903221f57b Mon Sep 17 00:00:00 2001
    From: Victorien Elvinger 
    Date: Fri, 8 Mar 2024 13:44:35 +0100
    Subject: [PATCH 32/34] fix: update 1.6.0 config schema
    
    ---
     CONTRIBUTING.md                                | 11 +++++++----
     website/src/pages/schemas/1.6.0/schema.json.js | 14 +++++++-------
     2 files changed, 14 insertions(+), 11 deletions(-)
    
    diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
    index f0457ee9bf2b..3757cd135908 100644
    --- a/CONTRIBUTING.md
    +++ b/CONTRIBUTING.md
    @@ -331,18 +331,21 @@ When releasing a new version of a Biome, follow these steps:
        See our [versioning guide](https://biomejs.dev/internals/versioning/) for more details.
     
     1. [ ] Rename `Unreleased` to ` (iso-date)` in the [changelog](./CHANGELOG.md).
    -   Then update the website using `BIOME_VERSION= cargo codegen-website`.
     
     1. [ ] Update `version` in [Biome's `package.json`](./packages/@biomejs/biome/package.json) if applicable.
     
    -2. [ ] **Update to the same `version` in all crates** if you publish crates. (`Cargo.toml` and `crates/**/Cargo.toml`)
    +1. [ ] **Update to the same `version` in all crates** if you publish crates. (`Cargo.toml` and `crates/**/Cargo.toml`)
     
    -3. [ ] Linter rules have a `version` metadata directly defined in their implementation.
    +1. [ ] Linter rules have a `version` metadata directly defined in their implementation.
        This field is set to `next` for newly created rules.
        This field must be updated to the new version.
        Then execute `just gen-lint`.
     
    -4. [ ] Once the PR is merged, the CI will trigger the `Release: *` workflows. Once these workflows finish compiling the final artefact, **they need to be approved manually**.
    +1. [ ] Update the website with the new version number:
    +   `BIOME_VERSION= cargo codegen-website`.
    +   This will also copy the configuration schema in the right place.
    +
    +1. [ ] Once the PR is merged, the CI will trigger the `Release: *` workflows. Once these workflows finish compiling the final artefact, **they need to be approved manually**.
     
     ## Resources
     
    diff --git a/website/src/pages/schemas/1.6.0/schema.json.js b/website/src/pages/schemas/1.6.0/schema.json.js
    index d6e540728d41..ae64de79fec9 100644
    --- a/website/src/pages/schemas/1.6.0/schema.json.js
    +++ b/website/src/pages/schemas/1.6.0/schema.json.js
    @@ -830,13 +830,6 @@ export function GET() {
     						description: "It enables the recommended rules for this group",
     						type: ["boolean", "null"],
     					},
    -					useAwait: {
    -						description: "Ensure async functions utilize await.",
    -						anyOf: [
    -							{ $ref: "#/definitions/RuleConfiguration" },
    -							{ type: "null" },
    -						],
    -					},
     					useExhaustiveDependencies: {
     						description:
     							"Enforce all dependencies are correctly specified in a React hook.",
    @@ -2749,6 +2742,13 @@ export function GET() {
     						description: "It enables the recommended rules for this group",
     						type: ["boolean", "null"],
     					},
    +					useAwait: {
    +						description: "Ensure async functions utilize await.",
    +						anyOf: [
    +							{ $ref: "#/definitions/RuleConfiguration" },
    +							{ type: "null" },
    +						],
    +					},
     					useDefaultSwitchClauseLast: {
     						description:
     							"Enforce default clauses in switch statements to be last",
    
    From 95f1a821edb849170be049d86e1919f305348ccc Mon Sep 17 00:00:00 2001
    From: Victorien Elvinger 
    Date: Fri, 8 Mar 2024 13:49:51 +0100
    Subject: [PATCH 33/34] chore(blog): add new rules section
    
    ---
     website/src/content/blog/biome-v1-6.mdx | 14 ++++++++++++++
     1 file changed, 14 insertions(+)
    
    diff --git a/website/src/content/blog/biome-v1-6.mdx b/website/src/content/blog/biome-v1-6.mdx
    index 004b5eff5544..f0a44bcfe141 100644
    --- a/website/src/content/blog/biome-v1-6.mdx
    +++ b/website/src/content/blog/biome-v1-6.mdx
    @@ -262,6 +262,20 @@ Additionally, the following rules are now recommended:
     
     - Remove `nursery/useGroupedTypeImport`. The rule [style/useImportType](https://biomejs.dev/linter/rules/use-import-type) covers the behavior of this rule.
     
    +#### New rules
    +
    +New rules are now available:
    +
    +- [nursery/noBarrelFile](https://biomejs.dev/linter/rules/no-barrel-file)
    +- [nursery/noExportsInTest](https://biomejs.dev/linter/rules/no-exports-in-test)
    +- [nursery/noFocusedTests](https://biomejs.dev/linter/rules/no-focused-tests)
    +- [nursery/noNamespaceImport](https://biomejs.dev/linter/rules/no-namespace-import)
    +- [nursery/noSemicolonInJsx](https://biomejs.dev/linter/rules/no-semicolon-in-jsx)
    +- [nursery/noSkippedTests](https://biomejs.dev/linter/rules/no-skipped-tests)
    +- [nursery/noUndeclaredependencies](https://biomejs.dev/linter/rules/no-undeclared-dependencies)
    +- [nursery/useNodeAssertStrict](https://biomejs.dev/linter/rules/use-node-assert-strict)
    +- [nursery/useSortedClasses](https://biomejs.dev/linter/rules/use-sorted-classes)
    +
     ### Miscellaneous
     
     - We drastically reduced the number of protected files, which means you can now format your `package.json`, `tsconfig.json`, etc. with Biome. Lock files are still considered protected.
    
    From 962087a1c9381d27ffc5e70da733bb6c2c445a7e Mon Sep 17 00:00:00 2001
    From: Emanuele Stoppa 
    Date: Fri, 8 Mar 2024 12:53:16 +0000
    Subject: [PATCH 34/34] chore: update number of rules
    
    ---
     packages/@biomejs/biome/README.md  | 2 +-
     website/src/content/docs/index.mdx | 2 +-
     2 files changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/packages/@biomejs/biome/README.md b/packages/@biomejs/biome/README.md
    index 9ece6ac25443..323ff521b996 100644
    --- a/packages/@biomejs/biome/README.md
    +++ b/packages/@biomejs/biome/README.md
    @@ -38,7 +38,7 @@ English | [įŽ€äŊ“中文](https://github.com/biomejs/biome/blob/main/packages/%40
     
     **Biome is a [fast formatter](./benchmark#formatting)** for _JavaScript_, _TypeScript_, _JSX_, and _JSON_ that scores **[97% compatibility with _Prettier_](https://console.algora.io/challenges/prettier)**.
     
    -**Biome is a [performant linter](https://github.com/biomejs/biome/tree/main/benchmark#linting)** for _JavaScript_, _TypeScript_, and _JSX_ that features **[more than 190 rules](https://biomejs.dev/linter/rules/)** from ESLint, typescript-eslint, and [other sources](https://github.com/biomejs/biome/discussions/3).
    +**Biome is a [performant linter](https://github.com/biomejs/biome/tree/main/benchmark#linting)** for _JavaScript_, _TypeScript_, and _JSX_ that features **[more than 200 rules](https://biomejs.dev/linter/rules/)** from ESLint, typescript-eslint, and [other sources](https://github.com/biomejs/biome/discussions/3).
     It **outputs detailed and contextualized diagnostics** that help you to improve your code and become a better programmer!
     
     **Biome** is designed from the start to be used [interactively within an editor](https://biomejs.dev/guides/integrate-in-editor/).
    diff --git a/website/src/content/docs/index.mdx b/website/src/content/docs/index.mdx
    index 6bf485936984..5298c012435b 100644
    --- a/website/src/content/docs/index.mdx
    +++ b/website/src/content/docs/index.mdx
    @@ -101,7 +101,7 @@ import LinterExample from "@/components/linter/example.md";
     

    Fix problems, learn best practice

    - **Biome is a [performant linter](https://github.com/biomejs/biome/tree/main/benchmark#linting)** for _JavaScript_, _TypeScript_, and _JSX_ that features **[more than 190 rules](https://biomejs.dev/linter/rules/)** from ESLint, typescript-eslint, and [other sources](https://github.com/biomejs/biome/discussions/3). + **Biome is a [performant linter](https://github.com/biomejs/biome/tree/main/benchmark#linting)** for _JavaScript_, _TypeScript_, and _JSX_ that features **[more than 200 rules](https://biomejs.dev/linter/rules/)** from ESLint, typescript-eslint, and [other sources](https://github.com/biomejs/biome/discussions/3). **Biome outputs detailed and contextualized diagnostics** that help you to improve your code and become a better programmer!