# @cratis/eslint-plugin-arc

ESLint rules for projects that consume Cratis Arc. Compose these on top of the Cratis
base config, [`@cratis/eslint-config`](https://www.npmjs.com/package/@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

```sh
yarn add -D @cratis/eslint-plugin-arc @cratis/eslint-config eslint
```

## Use

```js
// 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

```js
'@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.
