Skip to content

Commit edf99d3

Browse files
mikededoota-meshi
andauthored
feat(no-inspect): add no-inspect rule (#868)
Add rule that warns if `$inspect` is used. Closes #812 --------- Co-authored-by: Yosuke Ota <otameshiyo23@gmail.com>
1 parent d1ca102 commit edf99d3

File tree

11 files changed

+121
-0
lines changed

11 files changed

+121
-0
lines changed

.changeset/witty-games-mix.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"eslint-plugin-svelte": minor
3+
---
4+
5+
feat(no-inspect): add `no-inspect` rule

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,7 @@ These rules relate to better ways of doing things to help you avoid problems:
419419
| [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. | |
420420
| [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. | |
421421
| [svelte/no-inline-styles](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-inline-styles/) | disallow attributes and directives that produce inline styles | |
422+
| [svelte/no-inspect](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-inspect/) | Warns against the use of `$inspect` directive | |
422423
| [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: |
423424
| [svelte/no-reactive-literals](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-reactive-literals/) | don't assign literal values in reactive statements | :bulb: |
424425
| [svelte/no-svelte-internal](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-svelte-internal/) | svelte/internal will be removed in Svelte 6. | |

docs/rules.md

+1
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ These rules relate to better ways of doing things to help you avoid problems:
5656
| [svelte/no-ignored-unsubscribe](./rules/no-ignored-unsubscribe.md) | disallow ignoring the unsubscribe method returned by the `subscribe()` on Svelte stores. | |
5757
| [svelte/no-immutable-reactive-statements](./rules/no-immutable-reactive-statements.md) | disallow reactive statements that don't reference reactive values. | |
5858
| [svelte/no-inline-styles](./rules/no-inline-styles.md) | disallow attributes and directives that produce inline styles | |
59+
| [svelte/no-inspect](./rules/no-inspect.md) | Warns against the use of `$inspect` directive | |
5960
| [svelte/no-reactive-functions](./rules/no-reactive-functions.md) | it's not necessary to define functions in reactive statements | :bulb: |
6061
| [svelte/no-reactive-literals](./rules/no-reactive-literals.md) | don't assign literal values in reactive statements | :bulb: |
6162
| [svelte/no-svelte-internal](./rules/no-svelte-internal.md) | svelte/internal will be removed in Svelte 6. | |

docs/rules/no-inspect.md

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
---
2+
pageClass: 'rule-details'
3+
sidebarDepth: 0
4+
title: 'svelte/no-inspect'
5+
description: 'Warns against the use of `$inspect` directive'
6+
---
7+
8+
# svelte/no-inspect
9+
10+
> Warns against the use of `$inspect` directive
11+
12+
- :exclamation: <badge text="This rule has not been released yet." vertical="middle" type="error"> **_This rule has not been released yet._** </badge>
13+
14+
## :book: Rule Details
15+
16+
This rule reports usages of `$inspect`.
17+
18+
<ESLintCodeBlock>
19+
20+
<!--eslint-skip-->
21+
22+
```svelte
23+
<script>
24+
/* eslint svelte/no-inspect: "error" */
25+
// ✗ BAD
26+
$inspect(1);
27+
</script>
28+
```
29+
30+
</ESLintCodeBlock>
31+
32+
## :wrench: Options
33+
34+
Nothing.
35+
36+
## :mag: Implementation
37+
38+
- [Rule source](https://github.com/sveltejs/eslint-plugin-svelte/blob/main/packages/eslint-plugin-svelte/src/rules/no-inspect.ts)
39+
- [Test source](https://github.com/sveltejs/eslint-plugin-svelte/blob/main/packages/eslint-plugin-svelte/tests/src/rules/no-inspect.ts)

packages/eslint-plugin-svelte/src/rule-types.ts

+5
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,11 @@ export interface RuleOptions {
164164
* @see https://sveltejs.github.io/eslint-plugin-svelte/rules/no-inner-declarations/
165165
*/
166166
'svelte/no-inner-declarations'?: Linter.RuleEntry<SvelteNoInnerDeclarations>
167+
/**
168+
* Warns against the use of `$inspect` directive
169+
* @see https://sveltejs.github.io/eslint-plugin-svelte/rules/no-inspect/
170+
*/
171+
'svelte/no-inspect'?: Linter.RuleEntry<[]>
167172
/**
168173
* disallow use of not function in event handler
169174
* @see https://sveltejs.github.io/eslint-plugin-svelte/rules/no-not-function-handler/
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import type { TSESTree } from '@typescript-eslint/types';
2+
3+
import { createRule } from '../utils';
4+
5+
export default createRule('no-inspect', {
6+
meta: {
7+
docs: {
8+
description: 'Warns against the use of `$inspect` directive',
9+
category: 'Best Practices',
10+
// TODO: Enable recommended in major version
11+
recommended: false,
12+
default: 'warn'
13+
},
14+
schema: [],
15+
messages: {
16+
unexpected: 'Do not use $inspect directive'
17+
},
18+
type: 'suggestion'
19+
},
20+
create(context) {
21+
return {
22+
Identifier(node: TSESTree.Identifier) {
23+
if (node.name !== '$inspect') {
24+
return;
25+
}
26+
27+
context.report({ messageId: 'unexpected', node });
28+
}
29+
};
30+
}
31+
});

packages/eslint-plugin-svelte/src/utils/rules.ts

+2
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import noIgnoredUnsubscribe from '../rules/no-ignored-unsubscribe';
3232
import noImmutableReactiveStatements from '../rules/no-immutable-reactive-statements';
3333
import noInlineStyles from '../rules/no-inline-styles';
3434
import noInnerDeclarations from '../rules/no-inner-declarations';
35+
import noInspect from '../rules/no-inspect';
3536
import noNotFunctionHandler from '../rules/no-not-function-handler';
3637
import noObjectInTextMustaches from '../rules/no-object-in-text-mustaches';
3738
import noReactiveFunctions from '../rules/no-reactive-functions';
@@ -97,6 +98,7 @@ export const rules = [
9798
noImmutableReactiveStatements,
9899
noInlineStyles,
99100
noInnerDeclarations,
101+
noInspect,
100102
noNotFunctionHandler,
101103
noObjectInTextMustaches,
102104
noReactiveFunctions,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
- message: Do not use $inspect directive
2+
line: 2
3+
column: 3
4+
suggestions: null
5+
- message: Do not use $inspect directive
6+
line: 5
7+
column: 13
8+
suggestions: null
9+
- message: Do not use $inspect directive
10+
line: 8
11+
column: 5
12+
suggestions: null
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<script>
2+
$inspect(1);
3+
$state(0);
4+
5+
const a = $inspect(1);
6+
7+
const _ = () => {
8+
$inspect(1);
9+
}
10+
</script>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<script>
2+
const _ = $state(1);
3+
</script>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { RuleTester } from '../../utils/eslint-compat';
2+
import rule from '../../../src/rules/no-inspect';
3+
import { loadTestCases } from '../../utils/utils';
4+
5+
const tester = new RuleTester({
6+
languageOptions: {
7+
ecmaVersion: 2020,
8+
sourceType: 'module'
9+
}
10+
});
11+
12+
tester.run('no-inspect', rule as any, loadTestCases('no-inspect'));

0 commit comments

Comments
 (0)