@buildinams/lint
Version:
BiA's base lint config(s).
146 lines (108 loc) • 4.51 kB
Markdown
# lint
[![NPM version][npm-image]][npm-url]
[![Actions Status][ci-image]][ci-url]
[![PR Welcome][npm-downloads-image]][npm-downloads-url]
BiA's base lint config(s).
## Requirements
- **Node** >=20.19.0 | **ESLint** >=9.0.0
- **TypeScript** >=5.1.0, **React** >=17.0.0, **Prettier** >=3.0.0, **Stylelint** >=16.0.0 — as needed
Uses ESLint [flat config](https://eslint.org/docs/latest/use/configure/configuration-files). Legacy `.eslintrc.*` is not supported.
## Installation
```bash
npm i -D @buildinams/lint eslint prettier stylelint
```
Drop `prettier` and/or `stylelint` if you don't need them.
## ESLint
| Config | Export path |
|---|---|
| JavaScript | `@buildinams/lint/eslint/javascript` |
| TypeScript | `@buildinams/lint/eslint/typescript` |
| React | `@buildinams/lint/eslint/react` |
| React + TypeScript | `@buildinams/lint/eslint/react-typescript` |
| Next.js | `@buildinams/lint/eslint/next` |
| Next.js + TypeScript | `@buildinams/lint/eslint/next-typescript` |
```js
// eslint.config.mjs
import config from "@buildinams/lint/eslint/next-typescript";
import { globalIgnores } from "eslint/config";
export default [
...config,
globalIgnores([".next/**", "out/**", "build/**"]),
];
```
<details>
<summary>CJS</summary>
```js
// eslint.config.js
module.exports = [...require("@buildinams/lint/eslint/next-typescript")];
```
</details>
### Bundled plugins
unused-imports, simple-import-sort, [import-x](https://github.com/un-ts/eslint-plugin-import-x), [prettier](https://www.npmjs.com/package/eslint-plugin-prettier) (formatting errors as lint errors), react + react-hooks + jsx-a11y (React/Next), [@next/eslint-plugin-next](https://www.npmjs.com/package/@next/eslint-plugin-next) (Next), [typescript-eslint](https://typescript-eslint.io/) (TS).
### Custom rules
- **Import order**: externals → absolute (`_`, `~` prefixed) → relative
- **`type` over `interface`** via `consistent-type-definitions`
- **No enums** — use `as const` instead (only non-auto-fixable rule)
- **No `console.log`** — `warn` and `error` allowed
- **React version** defaults to `19`. Override for older versions:
```js
// eslint.config.mjs
export default [
...config,
{ settings: { react: { version: "18" } } },
];
```
## Prettier
```js
// .prettierrc.mjs
export { default } from "@buildinams/lint/prettier";
```
Trailing commas `"all"` | Tabs | Double quotes
Formatting errors also surface as ESLint errors via `eslint-plugin-prettier`.
## Stylelint
```json
// .stylelintrc.json
{
"extends": "@buildinams/lint/stylelint"
}
```
Extends: [standard-scss](https://www.npmjs.com/package/stylelint-config-standard-scss), [css-modules](https://www.npmjs.com/package/stylelint-config-css-modules), [recess-order](https://www.npmjs.com/package/stylelint-config-recess-order), [stylelint-prettier](https://www.npmjs.com/package/stylelint-prettier). Enables `scss/selector-no-redundant-nesting-selector`.
<details>
<summary>Custom SCSS functions</summary>
```json
{
"extends": "@buildinams/lint/stylelint",
"rules": {
"scss/function-no-unknown": [true, { "ignoreFunctions": ["px-to-rem"] }]
}
}
```
</details>
## VSCode
Extensions: [vscode-eslint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint), [prettier-vscode](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode), [vscode-stylelint](https://marketplace.visualstudio.com/items?itemName=stylelint.vscode-stylelint)
```json
// .vscode/settings.json
{
"editor.formatOnSave": false,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit",
"source.fixAll.stylelint": "explicit"
},
"scss.validate": false,
"stylelint.validate": ["scss"]
}
```
## Migrating from v0.4.x
1. Update to ESLint 9+ and Node 20+
2. Delete `.eslintrc.*`
3. Create `eslint.config.mjs` (see above)
Pin `@buildinams/lint@0.4.x` if staying on ESLint 8.
## Contributing
Found an issue? Want a new feature? [Get involved](https://github.com/buildinamsterdam/lint/blob/main/CONTRIBUTING.md).
[npm-image]: https://img.shields.io/npm/v/@buildinams/lint.svg?style=flat-square&logo=react
[npm-url]: https://npmjs.org/package/@buildinams/lint
[ci-image]: https://github.com/buildinamsterdam/lint/actions/workflows/lint.yml/badge.svg
[ci-url]: https://github.com/buildinamsterdam/lint/actions
[npm-downloads-image]: https://img.shields.io/npm/dm/@buildinams/lint.svg
[npm-downloads-url]: https://npmcharts.com/compare/@buildinams/lint?minimal=true