Skip to content
This repository was archived by the owner on Sep 18, 2024. It is now read-only.

Commit 394fce4

Browse files
committed
feat: add createConfig utility function
1 parent 2e893a1 commit 394fce4

File tree

7 files changed

+140
-39
lines changed

7 files changed

+140
-39
lines changed

.github/workflows/release.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ jobs:
1717
- uses: actions/checkout@v3
1818
with:
1919
fetch-depth: 0
20-
ref: main
20+
ref: feat/create-config
2121

2222
- uses: pnpm/action-setup@v2.2.4
2323
with:

README.md

Lines changed: 41 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -106,24 +106,48 @@ Ce repo contient le paquet npm correspondant à la configuration ESLint de l'[ag
106106

107107
## Configuration
108108

109-
```js
110-
// .eslintrc.js ou équivalent
111-
112-
require('@rushstack/eslint-patch/modern-module-resolution')
113-
114-
/* eslint-env node */
115-
module.exports = {
116-
root: true,
117-
extends: [
118-
'eslint:recommended',
119-
// Gère l'ordre de tous les plugins installés
120-
'alsacreations'
121-
],
122-
parserOptions: {
123-
ecmaVersion: 'latest'
124-
}
109+
```js
110+
// .eslintrc.js ou équivalent
111+
112+
require('@rushstack/eslint-patch/modern-module-resolution')
113+
114+
/* eslint-env node */
115+
module.exports = {
116+
root: true,
117+
extends: [
118+
'eslint:recommended',
119+
// Gère l'ordre de tous les plugins installés
120+
'alsacreations'
121+
],
122+
parserOptions: {
123+
ecmaVersion: 'latest'
125124
}
126-
```
125+
}
126+
```
127+
128+
## Configuration avancée
129+
130+
```js
131+
// .eslintrc.js ou équivalent
132+
133+
require('@rushstack/eslint-patch/modern-module-resolution')
134+
const createConfig = require('eslint-config-alsacreations/createConfig')
135+
136+
/* eslint-env node */
137+
module.exports = {
138+
root: true,
139+
extends: [
140+
'eslint:recommended',
141+
createConfig({
142+
// Il est possible de spécifier les presets à ignorer
143+
ignore: ['vue', 'nuxt']
144+
})
145+
],
146+
parserOptions: {
147+
ecmaVersion: 'latest'
148+
}
149+
}
150+
```
127151

128152
## Développement
129153

package.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313
".": {
1414
"require": "./dist/index.js",
1515
"types": "./dist/index.d.ts"
16+
},
17+
"./createConfig": {
18+
"require": "./dist/createConfig.js",
19+
"types": "./dist/createConfig.d.ts"
1620
}
1721
},
1822
"scripts": {
@@ -46,4 +50,4 @@
4650
"eslint-define-config": "^1.12.0",
4751
"local-pkg": "^0.4.2"
4852
}
49-
}
53+
}

src/createConfig.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
import { createConfig } from "./plugin"
2+
export = createConfig

src/index.ts

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,21 @@
1-
import { defineConfig } from 'eslint-define-config'
2-
import { TS, Nuxt, Vue, Prettier } from './utils'
3-
import { removeUnusedItems } from './utils'
1+
import { defineConfig as defineEslintConfig } from 'eslint-define-config'
2+
import { createConfig } from './plugin'
43

5-
export = defineConfig({
6-
extends: removeUnusedItems([
7-
'./javascript',
8-
Nuxt ? './nuxt' : '',
9-
Vue && !Nuxt ?'./vue' : '',
10-
TS ? './typescript' : '',
11-
12-
// Devrait toujours être dernier
13-
Prettier ? './prettier' : ''
14-
])
4+
/**
5+
* Config par défaut qui sera utilisée si eslint est configuré
6+
* de cette façon.
7+
*
8+
* @example
9+
* ```
10+
* {
11+
* extends: [
12+
* 'alsacreations'
13+
* ]
14+
* }
15+
* ```
16+
*/
17+
export = defineEslintConfig({
18+
extends: [
19+
createConfig()
20+
]
1521
})

src/plugin.ts

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { defineConfig as defineEslintConfig } from 'eslint-define-config'
2+
import { TS, Nuxt, Vue, Prettier, initUtils, removeUnusedItems } from './utils'
3+
import { writeFileSync } from 'fs'
4+
import { resolve } from 'path'
5+
6+
export type PluginOptions = {
7+
ignore?: (
8+
| 'vue'
9+
| 'nuxt'
10+
| 'typescript'
11+
| 'prettier'
12+
)[]
13+
}
14+
15+
/**
16+
* Création d'un fichier .json qui correspond à la config souhaitée.
17+
* Permet dans des cas particuliers de paramétrer les presets que l'on souhaite.
18+
*
19+
* @param options
20+
* @returns Le chemin vers le fichier .json qui pourra être passé à eslint dans la clé `extends`
21+
*/
22+
export function createConfig(options?: PluginOptions) {
23+
const {
24+
ignore = []
25+
} = options ?? {}
26+
27+
initUtils(ignore)
28+
29+
const config = defineEslintConfig({
30+
extends: removeUnusedItems([
31+
'./javascript',
32+
Nuxt ? './nuxt' : '',
33+
Vue && !Nuxt ?'./vue' : '',
34+
TS ? './typescript' : '',
35+
36+
// Devrait toujours être dernier
37+
Prettier ? './prettier' : ''
38+
])
39+
})
40+
41+
const configPath = resolve(__dirname, 'config.json')
42+
43+
writeFileSync(
44+
configPath,
45+
JSON.stringify(config)
46+
)
47+
48+
return configPath
49+
}

src/utils.ts

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { isPackageExists as packageExists, PackageInfo } from 'local-pkg'
22
import { readFileSync } from 'node:fs'
33
import { resolve } from 'node:path'
4+
import { PluginOptions } from './plugin'
45

56
/**
67
* Permet de savoir si un certain package est listé
@@ -29,10 +30,25 @@ export function removeUnusedItems (items: string[]) {
2930
return items.filter((item) => item !== '')
3031
}
3132

32-
export const TS = packageExists('typescript')
33-
export const Nuxt = packageExists('nuxt')
34-
export const Vue = packageExists('vue')
35-
export const Prettier = packageExists('prettier') && isPackageListed('prettier')
36-
export const EslintPluginPrettier = packageExists('eslint-plugin-prettier')
37-
export const VueEslintTypescript = packageExists('@vue/eslint-config-typescript')
38-
export const VueEslintPrettier = packageExists('@vue/eslint-config-prettier')
33+
export let TS = false
34+
export let Nuxt = false
35+
export let Vue = false
36+
export let Prettier = false
37+
export let EslintPluginPrettier = packageExists('eslint-plugin-prettier')
38+
export let VueEslintTypescript = packageExists('@vue/eslint-config-typescript')
39+
export let VueEslintPrettier = packageExists('@vue/eslint-config-prettier')
40+
41+
/**
42+
* Instancie les utilités définissant les paquets installés
43+
* @param ignored Liste de paquets ignorés
44+
*/
45+
export function initUtils(ignored: Required<PluginOptions>['ignore']) {
46+
const isIgnored = (pkg: typeof ignored[number]) => (
47+
!!ignored.find(p => p === pkg)
48+
)
49+
50+
TS = packageExists('typescript') && !isIgnored('typescript')
51+
Nuxt = packageExists('nuxt') && !isIgnored('nuxt') && !isIgnored('vue')
52+
Vue = packageExists('vue') && !isIgnored('vue')
53+
Prettier = packageExists('prettier') && isPackageListed('prettier') && !isIgnored('prettier')
54+
}

0 commit comments

Comments
 (0)