@cratis/eslint-plugin-arc
ESLint rules for projects that consume Cratis Arc. Compose these on top of the Cratis
base config, @cratis/eslint-config.
| Rule / processor | What it does |
|---|---|
skip-generated-proxies (processor) | Skips Arc-generated proxy files wholesale. They carry a // @generated by Cratis header (and a **DO NOT EDIT** banner), cannot be edited, and are regenerated by the build — so any finding on them is un-actionable. Keyed on the header because proxies sit intermixed with hand-written .ts. |
no-hooks-in-view-model | Disallows React hook calls inside MVVM view models (classes named *ViewModel). A view model must be a plain, React-free class; inject Cratis abstractions instead of calling hooks. |
no-direct-mobx-react-import | Disallows direct imports from mobx-react or mobx-react-lite. The MobX binding is an internal detail of @cratis/arc.react.mvvm, which re-exports observer (the sanctioned leaf observer boundary) — import it from there so the binding can evolve without breaking consumers. |
Install
yarn add -D @cratis/eslint-plugin-arc @cratis/eslint-config eslint
Use
// eslint.config.mjs
import cratis from '@cratis/eslint-config';
import arc from '@cratis/eslint-plugin-arc';
export default [
...cratis.configs.consumer,
...arc.configs.recommended,
// …your project rules
];
no-hooks-in-view-model options
'@cratis/arc/no-hooks-in-view-model': ['error', {
classSuffix: 'ViewModel', // class-name suffix that marks a view model
hookPattern: '^use[A-Z]', // bare-identifier calls treated as hooks
additionalHooks: ['injectQuery'], // extra call names to forbid
}]
Only bare-identifier calls (useState(...)) are flagged — member calls like
this.useDefaults() are not, so view-model methods that merely start with use are safe.