diff --git a/.changeset/witty-games-mix.md b/.changeset/witty-games-mix.md
new file mode 100644
index 000000000..6ceae6852
--- /dev/null
+++ b/.changeset/witty-games-mix.md
@@ -0,0 +1,5 @@
+---
+"eslint-plugin-svelte": minor
+---
+
+feat(no-inspect): add `no-inspect` rule
diff --git a/README.md b/README.md
index 610a270d6..59268a6b9 100644
--- a/README.md
+++ b/README.md
@@ -419,6 +419,7 @@ These rules relate to better ways of doing things to help you avoid problems:
| [svelte/no-ignored-unsubscribe](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-ignored-unsubscribe/) | disallow ignoring the unsubscribe method returned by the `subscribe()` on Svelte stores. | |
| [svelte/no-immutable-reactive-statements](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-immutable-reactive-statements/) | disallow reactive statements that don't reference reactive values. | |
| [svelte/no-inline-styles](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-inline-styles/) | disallow attributes and directives that produce inline styles | |
+| [svelte/no-inspect](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-inspect/) | Warns against the use of `$inspect` directive | |
| [svelte/no-reactive-functions](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-reactive-functions/) | it's not necessary to define functions in reactive statements | :bulb: |
| [svelte/no-reactive-literals](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-reactive-literals/) | don't assign literal values in reactive statements | :bulb: |
| [svelte/no-svelte-internal](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-svelte-internal/) | svelte/internal will be removed in Svelte 6. | |
diff --git a/docs/rules.md b/docs/rules.md
index 7f115da5c..22798e059 100644
--- a/docs/rules.md
+++ b/docs/rules.md
@@ -56,6 +56,7 @@ These rules relate to better ways of doing things to help you avoid problems:
| [svelte/no-ignored-unsubscribe](./rules/no-ignored-unsubscribe.md) | disallow ignoring the unsubscribe method returned by the `subscribe()` on Svelte stores. | |
| [svelte/no-immutable-reactive-statements](./rules/no-immutable-reactive-statements.md) | disallow reactive statements that don't reference reactive values. | |
| [svelte/no-inline-styles](./rules/no-inline-styles.md) | disallow attributes and directives that produce inline styles | |
+| [svelte/no-inspect](./rules/no-inspect.md) | Warns against the use of `$inspect` directive | |
| [svelte/no-reactive-functions](./rules/no-reactive-functions.md) | it's not necessary to define functions in reactive statements | :bulb: |
| [svelte/no-reactive-literals](./rules/no-reactive-literals.md) | don't assign literal values in reactive statements | :bulb: |
| [svelte/no-svelte-internal](./rules/no-svelte-internal.md) | svelte/internal will be removed in Svelte 6. | |
diff --git a/docs/rules/no-inspect.md b/docs/rules/no-inspect.md
new file mode 100644
index 000000000..368926877
--- /dev/null
+++ b/docs/rules/no-inspect.md
@@ -0,0 +1,39 @@
+---
+pageClass: 'rule-details'
+sidebarDepth: 0
+title: 'svelte/no-inspect'
+description: 'Warns against the use of `$inspect` directive'
+---
+
+# svelte/no-inspect
+
+> Warns against the use of `$inspect` directive
+
+- :exclamation: **_This rule has not been released yet._**
+
+## :book: Rule Details
+
+This rule reports usages of `$inspect`.
+
+
+
+
+
+```svelte
+
+```
+
+
+
+## :wrench: Options
+
+Nothing.
+
+## :mag: Implementation
+
+- [Rule source](https://github.com/sveltejs/eslint-plugin-svelte/blob/main/packages/eslint-plugin-svelte/src/rules/no-inspect.ts)
+- [Test source](https://github.com/sveltejs/eslint-plugin-svelte/blob/main/packages/eslint-plugin-svelte/tests/src/rules/no-inspect.ts)
diff --git a/packages/eslint-plugin-svelte/src/rule-types.ts b/packages/eslint-plugin-svelte/src/rule-types.ts
index c6b683f45..84c7b3cb2 100644
--- a/packages/eslint-plugin-svelte/src/rule-types.ts
+++ b/packages/eslint-plugin-svelte/src/rule-types.ts
@@ -164,6 +164,11 @@ export interface RuleOptions {
* @see https://sveltejs.github.io/eslint-plugin-svelte/rules/no-inner-declarations/
*/
'svelte/no-inner-declarations'?: Linter.RuleEntry
+ /**
+ * Warns against the use of `$inspect` directive
+ * @see https://sveltejs.github.io/eslint-plugin-svelte/rules/no-inspect/
+ */
+ 'svelte/no-inspect'?: Linter.RuleEntry<[]>
/**
* disallow use of not function in event handler
* @see https://sveltejs.github.io/eslint-plugin-svelte/rules/no-not-function-handler/
diff --git a/packages/eslint-plugin-svelte/src/rules/no-inspect.ts b/packages/eslint-plugin-svelte/src/rules/no-inspect.ts
new file mode 100644
index 000000000..22e30ce99
--- /dev/null
+++ b/packages/eslint-plugin-svelte/src/rules/no-inspect.ts
@@ -0,0 +1,31 @@
+import type { TSESTree } from '@typescript-eslint/types';
+
+import { createRule } from '../utils';
+
+export default createRule('no-inspect', {
+ meta: {
+ docs: {
+ description: 'Warns against the use of `$inspect` directive',
+ category: 'Best Practices',
+ // TODO: Enable recommended in major version
+ recommended: false,
+ default: 'warn'
+ },
+ schema: [],
+ messages: {
+ unexpected: 'Do not use $inspect directive'
+ },
+ type: 'suggestion'
+ },
+ create(context) {
+ return {
+ Identifier(node: TSESTree.Identifier) {
+ if (node.name !== '$inspect') {
+ return;
+ }
+
+ context.report({ messageId: 'unexpected', node });
+ }
+ };
+ }
+});
diff --git a/packages/eslint-plugin-svelte/src/utils/rules.ts b/packages/eslint-plugin-svelte/src/utils/rules.ts
index af0dd20e6..01f90457c 100644
--- a/packages/eslint-plugin-svelte/src/utils/rules.ts
+++ b/packages/eslint-plugin-svelte/src/utils/rules.ts
@@ -32,6 +32,7 @@ import noIgnoredUnsubscribe from '../rules/no-ignored-unsubscribe';
import noImmutableReactiveStatements from '../rules/no-immutable-reactive-statements';
import noInlineStyles from '../rules/no-inline-styles';
import noInnerDeclarations from '../rules/no-inner-declarations';
+import noInspect from '../rules/no-inspect';
import noNotFunctionHandler from '../rules/no-not-function-handler';
import noObjectInTextMustaches from '../rules/no-object-in-text-mustaches';
import noReactiveFunctions from '../rules/no-reactive-functions';
@@ -97,6 +98,7 @@ export const rules = [
noImmutableReactiveStatements,
noInlineStyles,
noInnerDeclarations,
+ noInspect,
noNotFunctionHandler,
noObjectInTextMustaches,
noReactiveFunctions,
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-inspect/invalid/test01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-inspect/invalid/test01-errors.yaml
new file mode 100644
index 000000000..db86c5f0e
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-inspect/invalid/test01-errors.yaml
@@ -0,0 +1,12 @@
+- message: Do not use $inspect directive
+ line: 2
+ column: 3
+ suggestions: null
+- message: Do not use $inspect directive
+ line: 5
+ column: 13
+ suggestions: null
+- message: Do not use $inspect directive
+ line: 8
+ column: 5
+ suggestions: null
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-inspect/invalid/test01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-inspect/invalid/test01-input.svelte
new file mode 100644
index 000000000..c6a694350
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-inspect/invalid/test01-input.svelte
@@ -0,0 +1,10 @@
+
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-inspect/valid/test01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-inspect/valid/test01-input.svelte
new file mode 100644
index 000000000..d65891beb
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-inspect/valid/test01-input.svelte
@@ -0,0 +1,3 @@
+
diff --git a/packages/eslint-plugin-svelte/tests/src/rules/no-inspect.ts b/packages/eslint-plugin-svelte/tests/src/rules/no-inspect.ts
new file mode 100644
index 000000000..cfaa54919
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/src/rules/no-inspect.ts
@@ -0,0 +1,12 @@
+import { RuleTester } from '../../utils/eslint-compat';
+import rule from '../../../src/rules/no-inspect';
+import { loadTestCases } from '../../utils/utils';
+
+const tester = new RuleTester({
+ languageOptions: {
+ ecmaVersion: 2020,
+ sourceType: 'module'
+ }
+});
+
+tester.run('no-inspect', rule as any, loadTestCases('no-inspect'));