Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

v0.1.0 #1

Merged
merged 1 commit into from
Aug 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
node_modules
4 changes: 4 additions & 0 deletions .npmignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
node_modules
eslint.config.mjs
prettier.config.mjs
.prettierignore
2 changes: 2 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
node_modules
pnpm-lock.yaml
58 changes: 56 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,56 @@
# eslint-config
Shared eslint flat config
# `@alexey-koran/eslint-config`

ESLint [shareable config](https://eslint.org/docs/latest/extend/shareable-configs)

### Installation

```bash
pnpm i -D @alexey-koran/eslint-config
```

### Usage example

# Dependencies

> [!NOTE]
>
> For the more details check [dev & prod dependencies in package.json](./package.json#L27)

<details open>

<summary><h3>Dependencies table</h3></summary>

| Package name | Description | Version |
| --------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- |
| | | |
| eslint | configurable JavaScript linter | [v9.9.\*](https://eslint.org/) |
| typescript-eslint | enables ESLint and Prettier to support [TypeScript](https://www.typescriptlang.org/) | [v8.3.\*](https://typescript-eslint.io/) |
| | `Configs` | |
| eslint-config-prettier | turns off all rules that are unnecessary or might conflict with [Prettier](https://github.com/prettier/prettier) | [v9.1.\*](https://github.com/prettier/eslint-config-prettier) |
| | `Plugins` | |
| @eslint/js | ESLint JavaScript plugin Separating out JavaScript-specific functionality from ESLint | [v9.9.\*](https://www.npmjs.com/package/@eslint/js) |
| eslint-plugin-import | intends to support linting of ES2015+ (ES6+) import/export syntax, prevent issues with misspelling of file paths and import names | [v2.29.\*](https://github.com/import-js/eslint-plugin-import) |
| eslint-import-resolver-typescript | adds [TypeScript](https://www.typescriptlang.org/) support to [eslint-plugin-import](https://github.com/import-js/eslint-plugin-import) | [v3.6.\*](https://github.com/import-js/eslint-import-resolver-typescript) |
| eslint-import-resolver-webpack | webpack-literate module resolution plugin for [eslint-plugin-import](https://www.npmjs.com/package/eslint-plugin-import) | [v0.13.\*](https://www.npmjs.com/package/eslint-import-resolver-webpack) |
| eslint-plugin-jsx-a11y | static AST checker for accessibility rules on JSX elements | [v6.9.\*](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y) |
| eslint-plugin-prettier | runs [Prettier](https://github.com/prettier/prettier) as an ESLint rule and reports differences as individual ESLint issues | [v5.2.\*](https://github.com/prettier/eslint-plugin-prettier) |
| eslint-plugin-react | React specific linting rules for ESLint | [v7.35.\*](https://github.com/jsx-eslint/eslint-plugin-react) |
| eslint-plugin-react-hooks | enforces the [Rules of Hooks](https://react.dev/reference/rules/rules-of-hooks) | [v5.1.\*-rc](https://www.npmjs.com/package/eslint-plugin-react-hooks) |
| @stylistic/eslint-plugin-js | JavaScript stylistic rules for ESLint | [v2.7.\*](https://www.npmjs.com/package/@stylistic/eslint-plugin-js) |
| @stylistic/eslint-plugin-jsx | [JSX](https://react.dev/learn/writing-markup-with-jsx) stylistic rules for ESLint | [v2.7.\*](https://www.npmjs.com/package/@stylistic/eslint-plugin-jsx) |
| @stylistic/eslint-plugin-ts | [TypeScript](https://www.typescriptlang.org/) stylistic rules for ESLint | [v2.7.\*](https://www.npmjs.com/package/@stylistic/eslint-plugin-ts) |
| | | |
| | `Other` | |
| globals | global identifiers from different JavaScript environments | [v15.9.\*](https://github.com/sindresorhus/globals) |
| @eslint/compat | ESLint compatibility utilities | [v1.1.\*](https://github.com/eslint/rewrite) |
| | | |

| Package name | Description | Version |
| ----------------------------- | ------------------------------------------------------------------------------------------------------- | --------------------------------------------------------- |
| | | |
| | `For local development` | |
| @eslint/config-inspector | ESLint config inspector | [v0.5.\*](https://github.com/eslint/config-inspector) |
| @alexey-koran/prettier-config | Prettier [sharing configuration](https://prettier.io/docs/en/configuration.html#sharing-configurations) | [v0.1\*](https://npmjs.com/@alexey-koran/prettier-config) |
| | | |

</details>
15 changes: 15 additions & 0 deletions config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { baseConfig } from './configs/base.mjs';
import { javaScriptConfig } from './configs/js.mjs';
import { reactConfig } from './configs/react.mjs';
import { typeScriptConfig } from './configs/ts.mjs';
import { typeScriptBaseConfig } from './configs/tsBase.mjs';
import { typeScriptReactConfig } from './configs/tsx.mjs';

export const shareableConfig = [
baseConfig,
javaScriptConfig,
reactConfig,
typeScriptConfig,
typeScriptBaseConfig,
typeScriptReactConfig,
];
41 changes: 41 additions & 0 deletions configs/base.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import { fixupPluginRules } from '@eslint/compat';
import stylisticJS from '@stylistic/eslint-plugin-js';
import pluginImport from 'eslint-plugin-import';
import pluginImportConfig from 'eslint-plugin-import/config/recommended.js';
import prettierPlugin from 'eslint-plugin-prettier';
import prettierConfig from 'eslint-plugin-prettier/recommended';
import typescriptEslint from 'typescript-eslint';

import { importRules } from '../rules/import.mjs';
import { jsRules } from '../rules/js.mjs';
import { stylisticRules } from '../rules/stylistic.mjs';
import { supportedFileTypes } from '../utils/fileTypes.mjs';

export const baseConfig = {
files: [supportedFileTypes.all],
languageOptions: {
parser: typescriptEslint.parser,
parserOptions: {
jsxPragma: null, // @typescript/eslint-parser
},
},
linterOptions: {
noInlineConfig: true,
reportUnusedDisableDirectives: 'error',
},
plugins: {
// TODO: Remove after eslint-plugin-import update
// fixupPluginRules wraps each rule in the given plugin using fixupRule()
// and returns a new object that represents the plugin with the fixed-up rules
import: fixupPluginRules(pluginImport),
prettier: prettierPlugin,
'@stylistic/js': stylisticJS,
},
rules: {
...prettierConfig.rules,
...pluginImportConfig.rules,
...jsRules,
...importRules,
...stylisticRules.js,
},
};
10 changes: 10 additions & 0 deletions configs/js.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import eslint from '@eslint/js';

import { supportedFileTypes } from '../utils/fileTypes.mjs';

export const javaScriptConfig = {
files: [supportedFileTypes.js],
rules: {
...eslint.configs.recommended.rules,
},
};
47 changes: 47 additions & 0 deletions configs/react.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import reactPlugin from 'eslint-plugin-react';
import reactHooks from 'eslint-plugin-react-hooks';

import stylisticJSX from '@stylistic/eslint-plugin-jsx';
import reactAccessibility from 'eslint-plugin-jsx-a11y';
import globals from 'globals';
import typescriptEslint from 'typescript-eslint';

import { reactRules } from '../rules/react.mjs';
import { stylisticRules } from '../rules/stylistic.mjs';
import { supportedFileTypes } from '../utils/fileTypes.mjs';

export const reactConfig = {
files: [supportedFileTypes.jsx, supportedFileTypes.tsx],
settings: {
react: {
version: 'detect',
},
},
languageOptions: {
globals: {
...globals.browser,
...globals.node,
...globals.es2021,
JSX: 'readonly',
},
parserOptions: {
ecmaFeatures: {
jsx: true, // eslint-plugin-react
},
},
},
plugins: {
'@typescript-eslint': typescriptEslint.plugin,
'jsx-a11y': reactAccessibility,
react: reactPlugin,
'react-hooks': reactHooks,
'@stylistic/jsx': stylisticJSX,
},
rules: {
...reactAccessibility.configs.recommended.rules,
...reactPlugin.configs.flat.recommended.rules,
...reactHooks.configs.recommended.rules,
...reactRules,
...stylisticRules.react,
},
};
29 changes: 29 additions & 0 deletions configs/ts.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import stylisticTS from '@stylistic/eslint-plugin-ts';
import typescriptEslint from 'typescript-eslint';

import { stylisticRules } from '../rules/stylistic.mjs';
import { tsRules } from '../rules/ts.mjs';
import { supportedFileTypes } from '../utils/fileTypes.mjs';

export const typeScriptConfig = {
files: [supportedFileTypes.ts, supportedFileTypes.tsx],
settings: {
'import/ignore': 'node_modules', // Temporary fix https://github.com/typescript-eslint/typescript-eslint/issues/9450
},
languageOptions: {
parser: typescriptEslint.parser,
parserOptions: {
jsxPragma: null, // @typescript/eslint-parser
},
},
plugins: {
'@typescript-eslint': typescriptEslint.plugin,
'@stylistic/ts': stylisticTS,
},
rules: {
...typescriptEslint.configs['strictTypeChecked'].rules,
...typescriptEslint.configs['stylisticTypeChecked'].rules,
...tsRules,
...stylisticRules.ts,
},
};
14 changes: 14 additions & 0 deletions configs/tsBase.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import typescriptEslint from 'typescript-eslint';

import { getTsNamingConventionRule } from '../rules/ts.mjs';
import { supportedFileTypes } from '../utils/fileTypes.mjs';

export const typeScriptBaseConfig = {
files: [supportedFileTypes.ts],
plugins: {
'@typescript-eslint': typescriptEslint.plugin,
},
rules: {
...getTsNamingConventionRule(),
},
};
14 changes: 14 additions & 0 deletions configs/tsx.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import typescriptEslint from 'typescript-eslint';

import { getTsNamingConventionRule } from '../rules/ts.mjs';
import { supportedFileTypes } from '../utils/fileTypes.mjs';

export const typeScriptReactConfig = {
files: [supportedFileTypes.tsx],
plugins: {
'@typescript-eslint': typescriptEslint.plugin,
},
rules: {
...getTsNamingConventionRule({ isTsx: true }),
},
};
33 changes: 33 additions & 0 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import { shareableConfig } from './config.mjs';
import { supportedExtensions } from './utils/extensions.mjs';
import { supportedFileTypes } from './utils/fileTypes.mjs';

const config = [
...shareableConfig,
{
files: [supportedFileTypes.js],
settings: {
'import/ignore': 'node_modules', // Temporary fix https://github.com/typescript-eslint/typescript-eslint/issues/9450
'import/extensions': supportedExtensions.js,
'import/parsers': {
'@typescript-eslint/parser': [...supportedExtensions.ts, ...supportedExtensions.tsx],
},
'import/resolver': {
typescript: {
alwaysTryTypes: true,
},
node: {
paths: ['src'],
extensions: supportedExtensions.js,
},
},
},
},
{
// The new config system no longer supports .eslintignore files
// https://eslint.org/blog/2022/10/eslint-v8.25.0-released/#highlights
ignores: ['build'],
},
];

export default config;
11 changes: 11 additions & 0 deletions index.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
export { shareableConfig } from './config.mjs';

export { baseConfig } from './configs/base.mjs';
export { javaScriptConfig } from './configs/js.mjs';
export { typeScriptConfig } from './configs/ts.mjs';
export { typeScriptBaseConfig } from './configs/tsBase.mjs';
export { typeScriptReactConfig } from './configs/tsx.mjs';

export { reactConfig } from './configs/react.mjs';
export { supportedExtensions } from './utils/extensions.mjs';
export { supportedFileTypes } from './utils/fileTypes.mjs';
49 changes: 49 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
{
"name": "@alexey-koran/eslint-config",
"version": "0.1.0",
"description": "Shared eslint flat config",
"main": "index.mjs",
"type": "module",
"author": "Alexey-Koran <[email protected]>",
"license": "MIT",
"scripts": {
"lint": "eslint **/*.{js,cjs,mjs,jsx,cjsx,mjsx,ts,cts,mts,tsx,ctsx,mtsx}",
"lint:fix": "eslint **/*.{js,cjs,mjs,jsx,cjsx,mjsx,ts,cts,mts,tsx,ctsx,mtsx} --fix",
"prettier": "prettier --check \"**/*.{js,cjs,mjs,jsx,cjsx,mjsx,ts,cts,mts,tsx,ctsx,mtsx}\"",
"prettier:fix": "prettier --write \"**/*.{js,cjs,mjs,jsx,cjsx,mjsx,ts,cts,mts,tsx,ctsx,mtsx}\"",
"test:eslint-config": "eslint-config-inspector"
},
"repository": {
"type": "git",
"url": "git+https://github.com/alexey-koran/eslint-config.git"
},
"keywords": [
"Eslint flat config"
],
"bugs": {
"url": "https://github.com/alexey-koran/eslint-config/issues"
},
"homepage": "https://github.com/alexey-koran/eslint-config#readme",
"dependencies": {
"@eslint/compat": "^1.1.1",
"@eslint/js": "^9.9.1",
"@stylistic/eslint-plugin-js": "^2.7.1",
"@stylistic/eslint-plugin-jsx": "^2.7.1",
"@stylistic/eslint-plugin-ts": "^2.7.1",
"eslint": "^9.9.1",
"eslint-config-prettier": "^9.1.0",
"eslint-import-resolver-typescript": "^3.6.3",
"eslint-plugin-import": "^2.29.1",
"eslint-plugin-jsx-a11y": "^6.9.0",
"eslint-plugin-prettier": "^5.2.1",
"eslint-plugin-react": "^7.35.0",
"eslint-plugin-react-hooks": "5.1.0-rc-a19a8ab4-20240829",
"globals": "^15.9.0",
"typescript-eslint": "^8.3.0"
},
"devDependencies": {
"@alexey-koran/prettier-config": "^0.1.1",
"@eslint/config-inspector": "^0.5.4",
"prettier": "^3.3.3"
}
}
Loading