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

Commit

Permalink
feat: add createConfig utility function
Browse files Browse the repository at this point in the history
  • Loading branch information
nicolassutter committed Feb 8, 2023
1 parent 2e893a1 commit 394fce4
Show file tree
Hide file tree
Showing 7 changed files with 140 additions and 39 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ jobs:
- uses: actions/checkout@v3
with:
fetch-depth: 0
ref: main
ref: feat/create-config

- uses: pnpm/action-setup@v2.2.4
with:
Expand Down
58 changes: 41 additions & 17 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -106,24 +106,48 @@ Ce repo contient le paquet npm correspondant à la configuration ESLint de l'[ag

## Configuration

```js
// .eslintrc.js ou équivalent

require('@rushstack/eslint-patch/modern-module-resolution')

/* eslint-env node */
module.exports = {
root: true,
extends: [
'eslint:recommended',
// Gère l'ordre de tous les plugins installés
'alsacreations'
],
parserOptions: {
ecmaVersion: 'latest'
}
```js
// .eslintrc.js ou équivalent

require('@rushstack/eslint-patch/modern-module-resolution')

/* eslint-env node */
module.exports = {
root: true,
extends: [
'eslint:recommended',
// Gère l'ordre de tous les plugins installés
'alsacreations'
],
parserOptions: {
ecmaVersion: 'latest'
}
```
}
```

## Configuration avancée

```js
// .eslintrc.js ou équivalent

require('@rushstack/eslint-patch/modern-module-resolution')
const createConfig = require('eslint-config-alsacreations/createConfig')

/* eslint-env node */
module.exports = {
root: true,
extends: [
'eslint:recommended',
createConfig({
// Il est possible de spécifier les presets à ignorer
ignore: ['vue', 'nuxt']
})
],
parserOptions: {
ecmaVersion: 'latest'
}
}
```

## Développement

Expand Down
6 changes: 5 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@
".": {
"require": "./dist/index.js",
"types": "./dist/index.d.ts"
},
"./createConfig": {
"require": "./dist/createConfig.js",
"types": "./dist/createConfig.d.ts"
}
},
"scripts": {
Expand Down Expand Up @@ -46,4 +50,4 @@
"eslint-define-config": "^1.12.0",
"local-pkg": "^0.4.2"
}
}
}
2 changes: 2 additions & 0 deletions src/createConfig.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
import { createConfig } from "./plugin"
export = createConfig
32 changes: 19 additions & 13 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,21 @@
import { defineConfig } from 'eslint-define-config'
import { TS, Nuxt, Vue, Prettier } from './utils'
import { removeUnusedItems } from './utils'
import { defineConfig as defineEslintConfig } from 'eslint-define-config'
import { createConfig } from './plugin'

export = defineConfig({
extends: removeUnusedItems([
'./javascript',
Nuxt ? './nuxt' : '',
Vue && !Nuxt ?'./vue' : '',
TS ? './typescript' : '',

// Devrait toujours être dernier
Prettier ? './prettier' : ''
])
/**
* Config par défaut qui sera utilisée si eslint est configuré
* de cette façon.
*
* @example
* ```
* {
* extends: [
* 'alsacreations'
* ]
* }
* ```
*/
export = defineEslintConfig({
extends: [
createConfig()
]
})
49 changes: 49 additions & 0 deletions src/plugin.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import { defineConfig as defineEslintConfig } from 'eslint-define-config'
import { TS, Nuxt, Vue, Prettier, initUtils, removeUnusedItems } from './utils'
import { writeFileSync } from 'fs'
import { resolve } from 'path'

export type PluginOptions = {
ignore?: (
| 'vue'
| 'nuxt'
| 'typescript'
| 'prettier'
)[]
}

/**
* Création d'un fichier .json qui correspond à la config souhaitée.
* Permet dans des cas particuliers de paramétrer les presets que l'on souhaite.
*
* @param options
* @returns Le chemin vers le fichier .json qui pourra être passé à eslint dans la clé `extends`
*/
export function createConfig(options?: PluginOptions) {
const {
ignore = []
} = options ?? {}

initUtils(ignore)

const config = defineEslintConfig({
extends: removeUnusedItems([
'./javascript',
Nuxt ? './nuxt' : '',
Vue && !Nuxt ?'./vue' : '',
TS ? './typescript' : '',

// Devrait toujours être dernier
Prettier ? './prettier' : ''
])
})

const configPath = resolve(__dirname, 'config.json')

writeFileSync(
configPath,
JSON.stringify(config)
)

return configPath
}
30 changes: 23 additions & 7 deletions src/utils.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { isPackageExists as packageExists, PackageInfo } from 'local-pkg'
import { readFileSync } from 'node:fs'
import { resolve } from 'node:path'
import { PluginOptions } from './plugin'

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

export const TS = packageExists('typescript')
export const Nuxt = packageExists('nuxt')
export const Vue = packageExists('vue')
export const Prettier = packageExists('prettier') && isPackageListed('prettier')
export const EslintPluginPrettier = packageExists('eslint-plugin-prettier')
export const VueEslintTypescript = packageExists('@vue/eslint-config-typescript')
export const VueEslintPrettier = packageExists('@vue/eslint-config-prettier')
export let TS = false
export let Nuxt = false
export let Vue = false
export let Prettier = false
export let EslintPluginPrettier = packageExists('eslint-plugin-prettier')
export let VueEslintTypescript = packageExists('@vue/eslint-config-typescript')
export let VueEslintPrettier = packageExists('@vue/eslint-config-prettier')

/**
* Instancie les utilités définissant les paquets installés
* @param ignored Liste de paquets ignorés
*/
export function initUtils(ignored: Required<PluginOptions>['ignore']) {
const isIgnored = (pkg: typeof ignored[number]) => (
!!ignored.find(p => p === pkg)
)

TS = packageExists('typescript') && !isIgnored('typescript')
Nuxt = packageExists('nuxt') && !isIgnored('nuxt') && !isIgnored('vue')
Vue = packageExists('vue') && !isIgnored('vue')
Prettier = packageExists('prettier') && isPackageListed('prettier') && !isIgnored('prettier')
}

0 comments on commit 394fce4

Please sign in to comment.