Skip to content

Linting

The @studiometa/eslint-plugin-js-toolkit package provides an Oxlint/ESLint plugin that enforces best practices when writing components with this framework.

Installation

bash
npm install --save-dev @studiometa/eslint-plugin-js-toolkit

Configuration

Oxlint

Add the plugin to your .oxlintrc.json:

json
{
  "jsPlugins": [{ "name": "js-toolkit", "specifier": "@studiometa/eslint-plugin-js-toolkit" }],
  "rules": {
    "js-toolkit/require-config": "error",
    "js-toolkit/require-config-name-pascal-case": "error",
    "js-toolkit/refs-camel-case": "error",
    "js-toolkit/refs-plural-multiple": "error",
    "js-toolkit/options-camel-case": "error",
    "js-toolkit/async-lifecycle-methods": "error",
    "js-toolkit/on-handler-naming": "error",
    "js-toolkit/on-global-handler-prefix": "warn",
    "js-toolkit/no-deprecated-properties": "error",
    "js-toolkit/no-dispatch-event": "warn",
    "js-toolkit/no-shadow-dom": "error",
    "js-toolkit/no-create-app": "warn",
    "js-toolkit/no-event-listener-methods": "error"
  }
}

ESLint

Add the recommended config to your eslint.config.js (ESLint v9 flat config):

js
import jsToolkit from '@studiometa/eslint-plugin-js-toolkit';

export default [
  jsToolkit.configs.recommended,
  // ...your other config
];

To customise individual rule severities, add an override entry after the recommended config:

js
import jsToolkit from '@studiometa/eslint-plugin-js-toolkit';

export default [
  jsToolkit.configs.recommended,
  {
    rules: {
      'js-toolkit/no-create-app': 'error',
    },
  },
];

Rules

Class structure

RuleDescriptionFixable
js-toolkit/require-configRequires a static config property with a name on every class extending Base.
js-toolkit/require-config-name-pascal-caseRequires config.name to be PascalCase.🔧
js-toolkit/refs-camel-caseRequires ref names in config.refs to be camelCase. Supports the [] multiple-ref suffix.🔧
js-toolkit/refs-plural-multipleRequires refs using the [] multiple-ref suffix to be pluralized (e.g. links[] not link[]).
js-toolkit/options-camel-caseRequires option keys in config.options to be camelCase.🔧

Lifecycle methods

RuleDescriptionFixable
js-toolkit/async-lifecycle-methodsRequires lifecycle methods (mounted, destroyed, updated, terminated, ticked, scrolled, resized, moved, loaded, keyed) to be declared async.🔧

Event handlers

RuleDescriptionFixable
js-toolkit/on-handler-namingRequires event handler methods to follow the onXxxYyy camelCase convention.
js-toolkit/on-global-handler-prefixRequires handlers for window-only events (e.g. resize) to use the onWindow or onDocument prefix.

Forbidden patterns

RuleDescriptionFixable
js-toolkit/no-deprecated-propertiesDisallows deprecated properties ($parent, $root, $children). Use $closest() or $query() instead.
js-toolkit/no-dispatch-eventDisallows dispatchEvent() inside Base subclasses. Use this.$emit() instead.
js-toolkit/no-shadow-domDisallows attachShadow() inside Base subclasses. The framework uses Light DOM only.
js-toolkit/no-create-appDisallows createApp() (deprecated). Use registerComponent() instead.
js-toolkit/no-event-listener-methodsDisallows addEventListener() and removeEventListener() inside Base subclasses. Define on* methods instead — the framework handles binding and cleanup automatically.

MIT Licensed