60 lines
2.8 KiB
JavaScript
60 lines
2.8 KiB
JavaScript
// Per-package ESLint config for the Preact widget apps under `apps/`.
|
|
//
|
|
// `root: true` stops ESLint from walking up to the host's
|
|
// `cinny/.eslintrc.cjs`, which extends airbnb + the React plugin. Those
|
|
// rule sets are tuned for the React host and flag legitimate Preact /
|
|
// small-widget patterns as errors (`class=` attributes, arrow-fn
|
|
// components, inline icon sub-components, for-of loops, etc.). Keeping
|
|
// the hierarchy open would force every widget file to fight host style
|
|
// for no real win.
|
|
//
|
|
// Widgets keep a minimal but real lint pass via the rule sets below:
|
|
//
|
|
// * `eslint:recommended` — catches genuine bugs (no-undef, no-dupe-*,
|
|
// no-redeclare, no-unused-vars, …) without enforcing style.
|
|
// * `@typescript-eslint/recommended` — TS-aware variants of the above
|
|
// plus type-level checks the recommended set ships.
|
|
//
|
|
// We deliberately DON'T extend `plugin:react/recommended` —
|
|
// `react/react-in-jsx-scope` and `react/no-unknown-property` both flag
|
|
// Preact-correct code as errors, and disabling them one by one creates
|
|
// a long suppression list. Widget JSX is type-checked by each app's
|
|
// `tsc --noEmit` (run by `vite build`), which is the better signal for
|
|
// JSX correctness anyway.
|
|
module.exports = {
|
|
root: true,
|
|
// `node` covers `module.exports` in this very file (CommonJS config);
|
|
// `browser` is the runtime widget code itself sees.
|
|
env: { browser: true, es2021: true, node: true },
|
|
extends: [
|
|
'eslint:recommended',
|
|
'plugin:@typescript-eslint/recommended',
|
|
// preact/hooks has the same dep-array semantics as react/hooks, and
|
|
// the widget code already carries `// eslint-disable-next-line
|
|
// react-hooks/exhaustive-deps` directives at the relevant sites;
|
|
// loading the plugin (a) keeps those directives meaningful (without
|
|
// it ESLint errors on the «unknown rule» referenced by the comment)
|
|
// and (b) catches the real exhaustive-deps mistakes in widget hooks
|
|
// for free.
|
|
'plugin:react-hooks/recommended',
|
|
],
|
|
parser: '@typescript-eslint/parser',
|
|
parserOptions: {
|
|
ecmaVersion: 'latest',
|
|
sourceType: 'module',
|
|
ecmaFeatures: { jsx: true },
|
|
},
|
|
plugins: ['@typescript-eslint', 'react-hooks'],
|
|
rules: {
|
|
// Underscore-prefixed args are intentionally unused (Preact event
|
|
// handlers receive args the body doesn't need); match the host's
|
|
// convention so lint reads consistently across both trees.
|
|
'@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }],
|
|
// Widget bridge-protocol regexes occasionally escape `-` inside
|
|
// character classes for visual clarity (e.g. `[0-9\-]`). The escape
|
|
// is harmless and pre-existing across all three widgets — keeping
|
|
// the rule on would force a churn-y diff in code that's been stable
|
|
// since the v0.7.6 bridge dialect work.
|
|
'no-useless-escape': 'off',
|
|
},
|
|
};
|