{"_id":"@arbor-education/eslint-config","_rev":"4-87a2ad9c1a71204412da5017ddbea547","name":"@arbor-education/eslint-config","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"@arbor-education/eslint-config","version":"0.1.0","license":"MIT","_id":"@arbor-education/eslint-config@0.1.0","maintainers":[{"name":"arbor-admin","email":"server.administrator@arbor-education.com"},{"name":"rick-arbor","email":"rick.bairstow@arbor-education.com"},{"name":"tom-arbor","email":"tom.mussett@arbor-education.com"},{"name":"danielpeplow-arbor","email":"daniel.peplow@arbor-education.com"},{"name":"vijay-arbor","email":"vijay.prahladan@arbor-education.com"},{"name":"austen.constable","email":"austen.constable@arbor-education.com"},{"name":"arboradn","email":"alex.denieffe@arbor-education.com"},{"name":"lloydp","email":"lloyd.passingham@arbor-education.com"},{"name":"ashleyboyd11","email":"ashley.boyd@arbor-education.com"},{"name":"stephenahiggins","email":"stephenahiggins@icloud.com"},{"name":"amee.morris","email":"amee.morris@arbor-education.com"},{"name":"angus.fraser","email":"angus.fraser@arbor-education.com"}],"homepage":"https://github.com/arbor-education/frontend.eslint-config#readme","bugs":{"url":"https://github.com/arbor-education/frontend.eslint-config/issues"},"dist":{"shasum":"5cf95ec72f5530743cd99526b93213aa8340a0a9","tarball":"https://registry.npmjs.org/@arbor-education/eslint-config/-/eslint-config-0.1.0.tgz","fileCount":10,"integrity":"sha512-K/zmY/iaSidOifQVtJdcMH22GgJbxxZEUVANs854vAZdPCALF/Vrw0LgXs/uhMljUvACVEri+WSbCVezZfT+XQ==","signatures":[{"sig":"MEYCIQDkdB932/YVCJS7oHz8HdPYGK9yypV49pBdWDVBzUKnpgIhANDhOuPrOI6OGHso85b3olA3/h91Q6ErD7aJpeIIoAio","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14861},"main":"./index.js","type":"module","engines":{"node":">=20"},"exports":{".":"./index.js","./base":"./configs/base.js","./react":"./configs/react.js","./prettier":"./prettier.js","./react-hooks":"./configs/react-hooks.js","./package.json":"./package.json","./relative-import-extensions":"./configs/relative-import-extensions.js"},"gitHead":"710f0bd1a620dcaeb8804fe29c063f3b97e125e5","scripts":{"test":"node --test"},"_npmUser":{"name":"angus.fraser","email":"angus.fraser@arbor-education.com"},"repository":{"url":"git+ssh://git@github.com/arbor-education/frontend.eslint-config.git","type":"git"},"_npmVersion":"11.6.1","description":"Shared ESLint flat config for Arbor frontend packages (arbor-fe-library, design-system.components).","directories":{},"_nodeVersion":"24.10.0","dependencies":{"prettier":"^3.6.2","@eslint/js":"^9.38.0","typescript-eslint":"^8.46.0","eslint-plugin-react":"^7.37.5","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.4","eslint-plugin-react-hooks":"^7.0.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.38.0","typescript":"^5.9.2"},"peerDependencies":{"eslint":">=9.33.0","typescript":">=5.7.0"},"peerDependenciesMeta":{"typescript":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/eslint-config_0.1.0_1783684012018_0.6069604992621449","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@arbor-education/eslint-config","version":"0.1.1","license":"MIT","_id":"@arbor-education/eslint-config@0.1.1","maintainers":[{"name":"arbor-admin","email":"server.administrator@arbor-education.com"},{"name":"rick-arbor","email":"rick.bairstow@arbor-education.com"},{"name":"tom-arbor","email":"tom.mussett@arbor-education.com"},{"name":"danielpeplow-arbor","email":"daniel.peplow@arbor-education.com"},{"name":"vijay-arbor","email":"vijay.prahladan@arbor-education.com"},{"name":"austen.constable","email":"austen.constable@arbor-education.com"},{"name":"arboradn","email":"alex.denieffe@arbor-education.com"},{"name":"lloydp","email":"lloyd.passingham@arbor-education.com"},{"name":"ashleyboyd11","email":"ashley.boyd@arbor-education.com"},{"name":"stephenahiggins","email":"stephenahiggins@icloud.com"},{"name":"amee.morris","email":"amee.morris@arbor-education.com"},{"name":"angus.fraser","email":"angus.fraser@arbor-education.com"}],"homepage":"https://github.com/arbor-education/frontend.eslint-config#readme","bugs":{"url":"https://github.com/arbor-education/frontend.eslint-config/issues"},"dist":{"shasum":"1d864d4f9354af7290ee410282b8769b76f35c99","tarball":"https://registry.npmjs.org/@arbor-education/eslint-config/-/eslint-config-0.1.1.tgz","fileCount":10,"integrity":"sha512-SEOlW/FDDcvTNpWH5hnA+MrjfVRKBGX0jADr27z744KKpx4I8uVVZrdXiiD8o8jfoLIxAzfiBndzQlJSo7vVLQ==","signatures":[{"sig":"MEUCIHfgnCq9g2AEnnw6E2Ivl8i+VIa1sWj+v39z9pUUq7PYAiEAta5ugH7ObhPSCniEjWHo955wuS1+as9GvTE1J2aKemQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14729},"main":"./index.js","type":"module","engines":{"node":">=20"},"exports":{".":"./index.js","./base":"./configs/base.js","./react":"./configs/react.js","./prettier":"./prettier.js","./react-hooks":"./configs/react-hooks.js","./package.json":"./package.json","./relative-import-extensions":"./configs/relative-import-extensions.js"},"gitHead":"ece6fffec476d7c775fd04239a3713cc17c575c3","scripts":{"test":"node --test"},"_npmUser":{"name":"angus.fraser","email":"angus.fraser@arbor-education.com"},"repository":{"url":"git+ssh://git@github.com/arbor-education/frontend.eslint-config.git","type":"git"},"_npmVersion":"11.6.1","description":"Shared ESLint flat config for Arbor frontend packages (arbor-fe-library, design-system.components).","directories":{},"_nodeVersion":"24.10.0","dependencies":{"prettier":"^3.6.2","@eslint/js":"^9.38.0","typescript-eslint":"^8.46.0","eslint-plugin-react":"^7.37.5","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.4","eslint-plugin-react-hooks":"^7.0.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.38.0","typescript":"^5.9.2"},"peerDependencies":{"eslint":">=9.33.0","typescript":">=5.7.0"},"peerDependenciesMeta":{"typescript":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/eslint-config_0.1.1_1783693844514_0.4571737725018268","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@arbor-education/eslint-config","version":"0.1.2","license":"MIT","_id":"@arbor-education/eslint-config@0.1.2","maintainers":[{"name":"arbor-admin","email":"server.administrator@arbor-education.com"},{"name":"rick-arbor","email":"rick.bairstow@arbor-education.com"},{"name":"tom-arbor","email":"tom.mussett@arbor-education.com"},{"name":"danielpeplow-arbor","email":"daniel.peplow@arbor-education.com"},{"name":"vijay-arbor","email":"vijay.prahladan@arbor-education.com"},{"name":"austen.constable","email":"austen.constable@arbor-education.com"},{"name":"arboradn","email":"alex.denieffe@arbor-education.com"},{"name":"lloydp","email":"lloyd.passingham@arbor-education.com"},{"name":"ashleyboyd11","email":"ashley.boyd@arbor-education.com"},{"name":"stephenahiggins","email":"stephenahiggins@icloud.com"},{"name":"amee.morris","email":"amee.morris@arbor-education.com"},{"name":"angus.fraser","email":"angus.fraser@arbor-education.com"}],"homepage":"https://github.com/arbor-education/frontend.eslint-config#readme","bugs":{"url":"https://github.com/arbor-education/frontend.eslint-config/issues"},"dist":{"shasum":"74132f2bb9b69c4fbf2f3aeec085e028da542993","tarball":"https://registry.npmjs.org/@arbor-education/eslint-config/-/eslint-config-0.1.2.tgz","fileCount":10,"integrity":"sha512-ZEVu9f7rnsMuRTIYQT/tmKyqGulzepGOnGFmrNgDHfIocJ/pS6y2Qm+oi8llNN2fbuChccGMDFUnf0ef9cssWQ==","signatures":[{"sig":"MEQCIBSNMEHGRYtjP2Iz9dc3AVier7J3S1lrqqdm1HjAdeQ3AiA9OETMu27qx+R3w1FNeo4KLKlWrZL98LqdilOurbAxzQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15313},"main":"./index.js","type":"module","engines":{"node":">=20"},"exports":{".":"./index.js","./base":"./configs/base.js","./react":"./configs/react.js","./prettier":"./prettier.js","./react-hooks":"./configs/react-hooks.js","./package.json":"./package.json","./relative-import-extensions":"./configs/relative-import-extensions.js"},"gitHead":"27271b74d4643971fd1fa1e5cf489dff33cece58","scripts":{"test":"node --test"},"_npmUser":{"name":"amee.morris","email":"amee.morris@arbor-education.com"},"repository":{"url":"git+ssh://git@github.com/arbor-education/frontend.eslint-config.git","type":"git"},"_npmVersion":"10.8.2","description":"Shared ESLint flat config for Arbor frontend packages (arbor-fe-library, design-system.components).","directories":{},"_nodeVersion":"20.19.3","dependencies":{"prettier":"^3.6.2","@eslint/js":"^9.38.0","typescript-eslint":"^8.46.0","eslint-plugin-react":"^7.37.5","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.4","eslint-plugin-react-hooks":"^7.0.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.38.0","typescript":"^5.9.2"},"peerDependencies":{"eslint":">=9.33.0","typescript":">=5.7.0"},"peerDependenciesMeta":{"typescript":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/eslint-config_0.1.2_1784037526059_0.8197025953126766","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2026-07-10T11:46:51.901Z","modified":"2026-09-02T08:32:33.812Z","0.1.0":"2026-07-10T11:46:52.181Z","0.1.1":"2026-07-10T14:30:44.667Z","0.1.2":"2026-07-14T13:58:46.214Z"},"bugs":{"url":"https://github.com/arbor-education/frontend.eslint-config/issues"},"license":"MIT","homepage":"https://github.com/arbor-education/frontend.eslint-config#readme","repository":{"url":"git+ssh://git@github.com/arbor-education/frontend.eslint-config.git","type":"git"},"description":"Shared ESLint flat config for Arbor frontend packages (arbor-fe-library, design-system.components).","maintainers":[{"email":"server.administrator@arbor-education.com","name":"arbor-admin"},{"email":"rick.bairstow@arbor-education.com","name":"rick-arbor"},{"email":"tom.mussett@arbor-education.com","name":"tom-arbor"},{"email":"daniel.peplow@arbor-education.com","name":"danielpeplow-arbor"},{"email":"vijay.prahladan@arbor-education.com","name":"vijay-arbor"},{"email":"austen.constable@arbor-education.com","name":"austen.constable"},{"email":"alex.denieffe@arbor-education.com","name":"arboradn"},{"email":"amelia.magee@arbor-education.com","name":"amelia.magee.arbor"},{"email":"lloyd.passingham@arbor-education.com","name":"lloydp"},{"email":"ashley.boyd@arbor-education.com","name":"ashleyboyd11"},{"email":"stephenahiggins@icloud.com","name":"stephenahiggins"},{"email":"amee@live.co.uk","name":"amee.morris"},{"email":"angus.fraser@arbor-education.com","name":"angus.fraser"}],"readme":"# @arbor-education/eslint-config\n\nShared ESLint **flat config** for Arbor frontend packages. One toolchain, one\nformatting standard, across [`arbor-fe-library`][fe] and\n[`design-system.components`][ds].\n\n[fe]: https://github.com/arbor-education/arbor-fe-library\n[ds]: https://github.com/arbor-education/design-system.components\n\n- **ESLint 9 flat config** (ESM). No build step — plain JS with JSDoc types.\n- **Prettier is the formatter.** The shared layer runs Prettier as a lint rule\n  and ships the canonical Prettier options as a single source of truth.\n- Composable exports — spread the whole `recommended` stack, or pick layers.\n\n## Install\n\nRequires Node ≥ 20 and ESLint ≥ 9.33.\n\n```bash\nyarn add --dev @arbor-education/eslint-config eslint\n```\n\nESLint plugins (`typescript-eslint`, `eslint-plugin-react`,\n`eslint-plugin-react-hooks`, `prettier`, …) are bundled as dependencies — you\ndo not install them separately. `eslint` itself is a peer dependency, and\n`typescript` is an optional peer (add it if you lint TypeScript).\n\n## Usage\n\n### ESLint\n\n```ts\n// eslint.config.mts\nimport arbor from '@arbor-education/eslint-config';\nimport {globalIgnores} from 'eslint/config';\n\nexport default [\n    globalIgnores(['dist/**', 'coverage/**']),\n    ...arbor.recommended, // base + react + reactHooks + prettier (prettier last)\n    {\n        // your project-specific overrides go here\n    },\n];\n```\n\nPrefer the individual layers if you need finer control:\n\n```ts\nimport {base, react, reactHooks, prettier} from '@arbor-education/eslint-config';\n\nexport default [\n    ...base,\n    ...react,\n    ...reactHooks,\n    ...prettier, // ALWAYS last — disables conflicting formatting rules\n];\n```\n\n### Prettier\n\nRe-export the shared options so the Prettier CLI and your editor use the same\nsettings ESLint enforces:\n\n```js\n// prettier.config.js\nexport {default} from '@arbor-education/eslint-config/prettier';\n```\n\n## What's in the box\n\n| Export | Subpath | Contents |\n| --- | --- | --- |\n| `base` | `./base` | `@eslint/js` + `typescript-eslint` recommended, Arbor house rules, `.d.ts` and test-file relaxations |\n| `react` | `./react` | `eslint-plugin-react` recommended, tuned for the automatic JSX runtime |\n| `reactHooks` | `./react-hooks` | `eslint-plugin-react-hooks` recommended |\n| `prettier` | — | Prettier-as-a-lint-rule with the shared options baked in (spread last) |\n| `recommended` | — | `base` + `react` + `reactHooks` + `prettier` |\n| `relativeImportExtensionsConfig` | `./relative-import-extensions` | **Opt-in.** Requires file extensions on relative imports (bundler + `verbatimModuleSyntax` repos only) |\n| _(Prettier options)_ | `./prettier` | The Prettier options object for `prettier.config.js` |\n\n### House rules (in `base`)\n\n- `@typescript-eslint/consistent-type-definitions: ['error', 'type']` (off in `.d.ts`)\n- `no-nested-ternary: error`\n- `curly: ['error', 'all']`\n- `no-restricted-imports` — bans deep relative imports (`../../*`); use a path alias\n- `no-restricted-syntax` — `useEffect` must declare a dependency array\n\nTests, stories and mocks (`*.test.*`, `*.spec.*`, `*.stories.tsx`,\n`*.story.tsx`, `test/**`, `**/__mocks__/**`) relax `no-restricted-imports`,\n`no-nested-ternary` and `curly`.\n\n### Formatting standard\n\nPrettier, with these options (from `./prettier`):\n\n```json\n{\n    \"singleQuote\": true,\n    \"semi\": true,\n    \"trailingComma\": \"all\",\n    \"tabWidth\": 4,\n    \"bracketSpacing\": false\n}\n```\n\n## Migrating the consumer repos\n\n### arbor-fe-library\n\nThe base already mirrors most of `client/eslint.config.mts`.\n\n- Replace the `js`/`tseslint`/`react`/`hooks`/`prettier` boilerplate with\n  `...arbor.recommended`.\n- **Keep locally** (project-specific, not shared): the ExtJS/global list\n  (`Ext`, `Mis`, …), the `import` resolver alias map, the `webpack/**` and\n  `**/*.{js,jsx}` overrides, the \"re-enable later\" `warn` block, and `ignores`.\n- Its existing `.prettierrc` matches the shared options — swap it for a\n  `prettier.config.js` that re-exports `./prettier` (or leave `.prettierrc` as\n  the values are identical).\n\n### design-system.components\n\nFormatting moves from `@stylistic` to Prettier.\n\n- Remove `@stylistic/eslint-plugin` and the `stylistic.configs.customize(...)`\n  block; spread `...arbor.recommended` instead.\n- Add a `prettier.config.js` re-exporting `./prettier`, then run\n  `yarn eslint . --fix` (or `yarn prettier --write`) once — expect a large\n  reformat diff (2-space → 4-space, `{ x }` → `{x}`). Land it as its own commit.\n- Keep the local `relative-import-extensions` rule by spreading\n  `@arbor-education/eslint-config/relative-import-extensions`.\n- Keep DS-only rules locally: `@typescript-eslint/no-namespace: off` and the\n  `Components/*`, `Utils/*` alias-aware `no-restricted-imports` message.\n\n## Development\n\n```bash\nyarn install\nyarn test\n```\n","readmeFilename":"README.md"}