Skip to content

Commit 1990100

Browse files
Merge pull request #728 from studiometa/feat/eslint-plugin-new-rules
[Feature] ESLint plugin new rules
2 parents 8ea8f3f + f53d185 commit 1990100

23 files changed

Lines changed: 1053 additions & 31 deletions

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file. The format
44

55
## [Unreleased]
66

7+
### Added
8+
9+
- **ESLint Plugin:** add 6 new rules for emits, components and options ([#728](https://github.com/studiometa/js-toolkit/pull/728), [4a7d657f](https://github.com/studiometa/js-toolkit/commit/4a7d657f))
10+
711
## [v3.6.0-beta.1](https://github.com/studiometa/js-toolkit/compare/3.5.0..3.6.0-beta.0) (2026-05-07)
812

913
### Added

packages/docs/guide/going-further/linting.md

Lines changed: 175 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,28 @@ Add the plugin to your `.oxlintrc.json`:
2727
"js-toolkit/require-config-name-pascal-case": "error",
2828
"js-toolkit/refs-camel-case": "error",
2929
"js-toolkit/refs-plural-multiple": "error",
30+
"js-toolkit/refs-no-bracket-access": "error",
31+
"js-toolkit/require-refs-declared-in-config": "error",
3032
"js-toolkit/options-camel-case": "error",
33+
"js-toolkit/require-options-declared-in-config": "error",
3134
"js-toolkit/async-lifecycle-methods": "error",
3235
"js-toolkit/on-handler-naming": "error",
3336
"js-toolkit/on-global-handler-prefix": "warn",
34-
"js-toolkit/no-deprecated-properties": "error",
37+
"js-toolkit/emits-kebab-case": "error",
38+
"js-toolkit/emits-multi-word": "error",
39+
"js-toolkit/require-emit-declared-in-config": "error",
40+
"js-toolkit/components-pascal-case": "error",
41+
"js-toolkit/require-children-declared-in-config": "error",
42+
"js-toolkit/no-deprecated-properties": "warn",
3543
"js-toolkit/no-dispatch-event": "warn",
3644
"js-toolkit/no-shadow-dom": "error",
3745
"js-toolkit/no-create-app": "warn",
38-
"js-toolkit/no-event-listener-methods": "error"
46+
"js-toolkit/no-event-listener-methods": "error",
47+
"js-toolkit/no-deep-utils-import": "error",
48+
"js-toolkit/no-redundant-with-mount-when-in-view": "warn",
49+
"js-toolkit/no-manual-intersection-observer": "warn",
50+
"js-toolkit/no-manual-mutation-observer": "warn",
51+
"js-toolkit/prefer-ref-over-query-selector": "warn"
3952
}
4053
}
4154
```
@@ -72,33 +85,172 @@ export default [
7285

7386
### Class structure
7487

75-
| Rule | Description | Fixable |
76-
| ----------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------ | ------- |
77-
| <span class="text-nowrap">`js-toolkit/require-config`</span> | Requires a `static config` property with a `name` on every class extending `Base`. ||
78-
| <span class="text-nowrap">`js-toolkit/require-config-name-pascal-case`</span> | Requires `config.name` to be PascalCase. | 🔧 |
79-
| <span class="text-nowrap">`js-toolkit/refs-camel-case`</span> | Requires ref names in `config.refs` to be camelCase. Supports the `[]` multiple-ref suffix. | 🔧 |
80-
| <span class="text-nowrap">`js-toolkit/refs-plural-multiple`</span> | Requires refs using the `[]` multiple-ref suffix to be pluralized (e.g. `links[]` not `link[]`). ||
81-
| <span class="text-nowrap">`js-toolkit/options-camel-case`</span> | Requires option keys in `config.options` to be camelCase. | 🔧 |
88+
#### `js-toolkit/require-config`
89+
90+
**Recommended:** error
91+
92+
Requires a `static config` property with a `name` on every class extending `Base`.
93+
94+
#### `js-toolkit/require-config-name-pascal-case`
95+
96+
**Recommended:** error &nbsp;·&nbsp; **Fixable** 🔧
97+
98+
Requires `config.name` to be PascalCase.
99+
100+
### Refs
101+
102+
#### `js-toolkit/refs-camel-case`
103+
104+
**Recommended:** error &nbsp;·&nbsp; **Fixable** 🔧
105+
106+
Requires ref names in `config.refs` to be camelCase. Supports the `[]` multiple-ref suffix.
107+
108+
#### `js-toolkit/refs-plural-multiple`
109+
110+
**Recommended:** error
111+
112+
Requires refs using the `[]` multiple-ref suffix to be pluralized (e.g. `links[]` not `link[]`).
113+
114+
#### `js-toolkit/refs-no-bracket-access`
115+
116+
**Recommended:** error &nbsp;·&nbsp; **Fixable** 🔧
117+
118+
Disallows bracket access with a `[]` suffix on `this.$refs` (e.g. `this.$refs['items[]']`). Rewrites to dot notation camelCase.
119+
120+
#### `js-toolkit/require-refs-declared-in-config`
121+
122+
**Recommended:** error
123+
124+
Requires all `this.$refs.<name>` accesses to be declared in `static config.refs`.
125+
126+
#### `js-toolkit/prefer-ref-over-query-selector`
127+
128+
**Recommended:** warn
129+
130+
Warns when `this.$el.querySelector()` or `this.$el.querySelectorAll()` is used inside a `Base` subclass. Declare a ref in `static config` and use `this.$refs` instead.
131+
132+
### Options
133+
134+
#### `js-toolkit/options-camel-case`
135+
136+
**Recommended:** error &nbsp;·&nbsp; **Fixable** 🔧
137+
138+
Requires option keys in `config.options` to be camelCase.
139+
140+
#### `js-toolkit/require-options-declared-in-config`
141+
142+
**Recommended:** error
143+
144+
Requires all `this.$options.<name>` accesses to be declared in `static config.options`.
145+
146+
### Emits
147+
148+
#### `js-toolkit/emits-kebab-case`
149+
150+
**Recommended:** error &nbsp;·&nbsp; **Fixable** 🔧
151+
152+
Requires emit names in `config.emits` to be kebab-case (e.g. `content-change`).
153+
154+
#### `js-toolkit/emits-multi-word`
155+
156+
**Recommended:** error
157+
158+
Requires emit names in `config.emits` to be multi-word to avoid collisions with native DOM events (e.g. `item-click` not `click`).
159+
160+
#### `js-toolkit/require-emit-declared-in-config`
161+
162+
**Recommended:** error
163+
164+
Requires all `this.$emit('name')` calls to use event names declared in `static config.emits`.
165+
166+
### Components
167+
168+
#### `js-toolkit/components-pascal-case`
169+
170+
**Recommended:** error &nbsp;·&nbsp; **Fixable** 🔧
171+
172+
Requires component keys in `config.components` to be PascalCase.
173+
174+
#### `js-toolkit/require-children-declared-in-config`
175+
176+
**Recommended:** error
177+
178+
Requires all `this.$children.<Name>` accesses to be declared in `static config.components`.
82179

83180
### Lifecycle methods
84181

85-
| Rule | Description | Fixable |
86-
| --------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
87-
| <span class="text-nowrap">`js-toolkit/async-lifecycle-methods`</span> | Requires lifecycle methods (`mounted`, `destroyed`, `updated`, `terminated`, `ticked`, `scrolled`, `resized`, `moved`, `loaded`, `keyed`) to be declared `async`. | 🔧 |
182+
#### `js-toolkit/async-lifecycle-methods`
183+
184+
**Recommended:** error &nbsp;·&nbsp; **Fixable** 🔧
185+
186+
Requires lifecycle methods (`mounted`, `destroyed`, `updated`, `terminated`, `ticked`, `scrolled`, `resized`, `moved`, `loaded`, `keyed`) to be declared `async`.
88187

89188
### Event handlers
90189

91-
| Rule | Description | Fixable |
92-
| ---------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ | ------- |
93-
| <span class="text-nowrap">`js-toolkit/on-handler-naming`</span> | Requires event handler methods to follow the `onXxxYyy` camelCase convention. ||
94-
| <span class="text-nowrap">`js-toolkit/on-global-handler-prefix`</span> | Requires handlers for window-only events (e.g. `resize`) to use the `onWindow` or `onDocument` prefix. ||
190+
#### `js-toolkit/on-handler-naming`
191+
192+
**Recommended:** error
193+
194+
Requires event handler methods to follow the `onXxxYyy` camelCase convention.
195+
196+
#### `js-toolkit/on-global-handler-prefix`
197+
198+
**Recommended:** warn
199+
200+
Requires handlers for window-only events (e.g. `resize`) to use the `onWindow` or `onDocument` prefix.
95201

96202
### Forbidden patterns
97203

98-
| Rule | Description | Fixable |
99-
| ----------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
100-
| <span class="text-nowrap">`js-toolkit/no-deprecated-properties`</span> | Disallows deprecated properties (`$parent`, `$root`, `$children`). Use `$closest()` or `$query()` instead. ||
101-
| <span class="text-nowrap">`js-toolkit/no-dispatch-event`</span> | Disallows `dispatchEvent()` inside `Base` subclasses. Use `this.$emit()` instead. ||
102-
| <span class="text-nowrap">`js-toolkit/no-shadow-dom`</span> | Disallows `attachShadow()` inside `Base` subclasses. The framework uses Light DOM only. ||
103-
| <span class="text-nowrap">`js-toolkit/no-create-app`</span> | Disallows `createApp()` (deprecated). Use `registerComponent()` instead. ||
104-
| <span class="text-nowrap">`js-toolkit/no-event-listener-methods`</span> | Disallows `addEventListener()` and `removeEventListener()` inside `Base` subclasses. Define `on*` methods instead — the framework handles binding and cleanup automatically. ||
204+
#### `js-toolkit/no-deprecated-properties`
205+
206+
**Recommended:** warn
207+
208+
Disallows deprecated properties (`$parent`, `$root`, `$children`). Use `$closest()` or `$query()` instead.
209+
210+
#### `js-toolkit/no-dispatch-event`
211+
212+
**Recommended:** warn
213+
214+
Disallows `dispatchEvent()` inside `Base` subclasses. Use `this.$emit()` instead.
215+
216+
#### `js-toolkit/no-shadow-dom`
217+
218+
**Recommended:** error
219+
220+
Disallows `attachShadow()` inside `Base` subclasses. The framework uses Light DOM only.
221+
222+
#### `js-toolkit/no-create-app`
223+
224+
**Recommended:** warn
225+
226+
Disallows `createApp()` (deprecated). Use `registerComponent()` instead.
227+
228+
#### `js-toolkit/no-event-listener-methods`
229+
230+
**Recommended:** error
231+
232+
Disallows `addEventListener()` and `removeEventListener()` inside `Base` subclasses. Define `on*` methods instead — the framework handles binding and cleanup automatically.
233+
234+
#### `js-toolkit/no-deep-utils-import`
235+
236+
**Recommended:** error &nbsp;·&nbsp; **Fixable** 🔧
237+
238+
Disallows deep imports from `@studiometa/js-toolkit/utils/*`. Use the public entrypoint `@studiometa/js-toolkit/utils` instead.
239+
240+
#### `js-toolkit/no-redundant-with-mount-when-in-view`
241+
242+
**Recommended:** warn
243+
244+
Disallows wrapping `withMountWhenInView` inside `withScrolledInView` — the latter already includes the former internally.
245+
246+
#### `js-toolkit/no-manual-intersection-observer`
247+
248+
**Recommended:** warn
249+
250+
Disallows `new IntersectionObserver()` inside `Base` subclasses. Use `withIntersectionObserver` or `withMountWhenInView` decorators instead.
251+
252+
#### `js-toolkit/no-manual-mutation-observer`
253+
254+
**Recommended:** warn
255+
256+
Disallows `new MutationObserver()` inside `Base` subclasses. Use the `withMutation` decorator instead.

packages/docs/utils/storage/createLocalStorage.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ Create a storage instance backed by `globalThis.localStorage`. The underlying st
55
## Usage
66

77
```js twoslash
8-
// @twoslash-cache: {"v":1,"hash":"088a272689b725269922c7afba5cb8bac42148bc848708f323c0939c2712e2d5","data":"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="}
8+
// @twoslash-cache: {"v":1,"hash":"168444ac507ca8fe05e8951c976264031db52ea65923eec4212be04d143bde92","data":"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="}
99
import { createLocalStorage } from '@studiometa/js-toolkit/utils';
1010

1111
const storage = createLocalStorage({ prefix: 'myapp:' });

0 commit comments

Comments
 (0)