π These are my settings for TypeScript / ESLint / Prettier in a project, also support mono / esm π¦
These are the ESLint and Prettier settings for a Next.js project β‘οΈ
- Lints JavaScript / TypeScript based on the latest standards
- Multiple configs
react
hooks
next
.. - Shared
tsconfig.json
- Fixes issues and formatting errors with Prettier
- Check for accessibility rules on JSX elements.
-
If you don't already have a
package.json
file, create one withnpm init
. -
Then we need to install the config:
npm i -D @hyperse/eslint-config-hyperse
- Create a
eslint.config.js
file in the root of your project's directory (it should live where package.json does). Youreslint.config.js
file should look like this: - if you are using
commonjs
, just changeeslint.config.js
toeslint.config.mjs
- Extends your config with the minimal base of
@hyperse
config :
import { base, defineConfig } from '@hyperse/eslint-config-hyperse';
export default defineConfig([
// ...typescript
...base,
{
rules: {
'@typescript-eslint/no-explicit-any': 'off',
},
},
]);
you can write you tsconfig.json
via extends @hyperse/eslint-config-hyperse/tsconfig.base.json
{
"$schema": "https://json.schemastore.org/tsconfig",
"extends": "@hyperse/eslint-config-hyperse/tsconfig.base.json",
"compilerOptions": {
"baseUrl": "./",
"rootDir": ".",
"outDir": "dist",
"types": ["vitest/globals"],
"paths": {}
},
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"]
}
write you tsconfig.build.json
as below
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "./dist",
"rootDir": "./src",
"baseUrl": "./",
"incremental": false,
"paths": {}
},
"exclude": ["**/*.stories.tsx", "**/*.stories.mdx", ".storybook/**", "dist"]
}
You can add two scripts to your package.json to lint and/or fix your code:
{
"scripts": {
"lint": "tsc --noEmit && eslint .",
"lint:fix": "npm run lint -- --fix"
}
}
{
"scripts": {
"lint": "eslint .",
"lint:fix": "npm run lint -- --fix"
}
}
You can also add additional rules for Next.js
import { defineConfig, nextjs } from '@hyperse/eslint-config-hyperse';
export default defineConfig([
// ...typescript
...nextjs,
{
rules: {
'@typescript-eslint/no-explicit-any': 'off',
},
},
]);
You can also add additional rules for only React.js ecosystem (without Next.js).
import { defineConfig, reactjs } from '@hyperse/eslint-config-hyperse';
export default defineConfig([
// ...typescript
...reactjs,
{
rules: {
'@typescript-eslint/no-explicit-any': 'off',
},
},
]);
You can also add additional rules for SonarJS.
import { defineConfig, sonarjs } from '@hyperse/eslint-config-hyperse';
export default defineConfig([
// ...typescript
...sonarjs,
{
rules: {
'sonarjs/fixme-tag': 'warn',
'sonarjs/todo-tag': 'warn',
},
},
]);
Once you have done. You probably want your editor to lint and fix for you.
- Install the ESLint package
- Now we need to setup some VS Code settings. Create a
.vscode
folder at your root project, and create asettings.json
file in this folder. Then, add this little config:
{
"editor.formatOnSave": true,
"editor.defaultFormatter": "dbaeumer.vscode-eslint",
"editor.codeActionsOnSave": {
"source.fixAll": "explicit",
"source.organizeImports": "never"
},
"[jsonc]": {
"editor.formatOnSave": false
},
"[json]": {
"editor.formatOnSave": false
},
"eslint.workingDirectories": [
"./apps/docs",
"./apps/web",
"./packages/core",
"./packages/utils"
],
"files.associations": {
"*.css": "tailwindcss"
},
"editor.quickSuggestions": {
"strings": "on"
},
"tailwindCSS.classFunctions": ["tw", "clsx", "twMerge", "extendVariants"],
"tailwindCSS.classAttributes": ["className", "classNames"],
"tailwindCSS.experimental.configFile": {
"apps/web/src/app/globals.css": "apps/web/src/**",
"apps/docs/src/app/globals.css": "apps/docs/src/**"
}
}
we need to disable vscode editor language formatter for json, jsonc
{
"[jsonc]": {
"editor.formatOnSave": false
},
"[json]": {
"editor.formatOnSave": false
}
}
- Isolated Modules - isolatedModules (default:
true
) - Verbatim Module Syntax - verbatimModuleSyntax (default:
true
)
- If you want to customize the prettier config, you may need to configure as below
/**
* prettier.config.mjs
* @see https://prettier.io/docs/configuration
* @type {import("prettier").Config}
*/
const config = {
....
};
export default config;
- The default options has high priority as below
{
// use single quotes instead of double quotes
"singleQuote": true,
// add semicolons at the end of statements
"semi": true,
// add trailing commas where valid in ES5 (objects, arrays, etc.)
"trailingComma": "es5",
// maintain the line endings of the file
"endOfLine": "auto"
}
- If you want to extends
tailwindcss
rules, recommended configurations as below
/**
* prettier.config.mjs
* @see https://prettier.io/docs/configuration
* @type {import("prettier").Config}
*/
const config = {
/**
* Path to the CSS stylesheet used by Tailwind CSS (v4+)
*/
tailwindStylesheet: './src/app/globals.css',
/**
* List of custom function and tag names that contain classes.
*/
tailwindFunctions: ['tw', 'clsx', 'twMerge', 'extendVariants'],
/**
* List of custom attributes that contain classes.
*/
tailwindAttributes: ['className', 'classNames'],
};
export default config;
Sorting classes in function calls support
tailwindFunctions: ['tw', 'clsx','twMerge'],