TSESLint v8, ESLint v9(flat config)에서 Prettier plugin 설정하는 방법

TSESLint v8, ESLint v9(flat config)에서 Prettier plugin 설정하는 방법

Tags
ESLint
Published
December 29, 2024
Author
Seongbin Kim
 
TSESLint, ESLint의 flat config에서 prettier/prettier rule로 Prettier를 설정하는 방법을 설명합니다 🙂
  • 요약: legacy에서 “extends” 필드로 사용했던 config들을, extends 필드 대신 flat config의 가변 인자로 넘겨주면 됩니다.
 

1. 정상 동작하는 설정 방법

import js from "@eslint/js"; import eslintPluginPrettierRecommended from "eslint-plugin-prettier/recommended"; import tseslint from "typescript-eslint"; export default tseslint.config( js.configs.recommended, ...tseslint.configs.recommended, eslintPluginPrettierRecommended, { files: ["**/*.{ts,tsx}"], ignores: ["dist"], languageOptions: { ecmaVersion: 2020, globals: globals.browser, }, plugins: {}, rules: {}, }, );
 

2. 비정상 동작 혹은 동작하지 않는 설정 방법

 

2-1. 시도 1: Prettier rule 활성화되지 않음

import eslintPluginPrettierRecommended from "eslint-plugin-prettier/recommended"; export default tseslint.config( js.configs.recommended, ...tseslint.configs.recommended, { plugins: { prettier: eslintPluginPrettierRecommended, }, }, );
 

2-2. 시도 2: ESLint plugin 오류 발생

  • “prettier/prettier” 규칙을 추가해서 강제 활성화
    • 원래 plugin이 제대로 등록됐다면 기본 적용되어야 합니다.
import eslintPluginPrettierRecommended from "eslint-plugin-prettier/recommended"; export default tseslint.config( js.configs.recommended, ...tseslint.configs.recommended, { plugins: { prettier: eslintPluginPrettierRecommended, }, rules: { 'prettier/prettier': 'error', }, }, );
  • 오류 발생
TypeError: Key "rules": Key "prettier/prettier": Could not find "prettier" in plugin "prettier".
 

2-3. 시도 3: import 구문에서 recommended 제외

  • import 대상을 “eslint-plugin-prettier/recommended” 대신 “eslint-plugin-prettier”로 변경
import eslintPluginPrettier from "eslint-plugin-prettier"; export default tseslint.config( js.configs.recommended, ...tseslint.configs.recommended, { plugins: { prettier: eslintPluginPrettier, }, rules: { 'prettier/prettier': 'error', }, }, );
  • 문제점: 'prettier/prettier': 'error' 규칙 제거 시 prettier 실행이 되지 않습니다.
    • 즉, recommended 설정이 적용되지 않고 있습니다.
      • 즉, eslint-config-prettier도 적용되지 않고 있다는 말입니다.
 

2-5. 시도 4: flat config에 eslintPluginPrettierRecommended 사용

  • (정상 동작 Case와 동일 내용)
 

2-6. 시도 5: eslintPluginPrettier.configs.recommended 사용

  • 별도의 근거 없이 시도해봤는데 잘 되지는 않았습니다..!
import eslintPluginPrettier from "eslint-plugin-prettier"; export default tseslint.config( js.configs.recommended, ...tseslint.configs.recommended, eslintPluginPrettier.configs.recommended, { /* ... */ }, );
  • 오류 발생
ConfigError: Config (unnamed): Unexpected key "0" found.
 

3. 설명

 

3-1. prettier plugin은 원래부터 plugin이 아닌, config로 설정했습니다.

// legacy config extends: [ 'eslint:recommended', 'plugin:@typescript-eslint/recommended', 'plugin:react-hooks/recommended', 'plugin:storybook/recommended', 'plugin:prettier/recommended', ],
  • extends 필드는 config 파일을 입력으로 받습니다.
  • 정확하게는 직접 require하기 때문에 config 파일 자체가 아닌 그 경로를 입력 받습니다.
  • legacy config에서도 prettier 설정은 config로 했음을 알 수 있습니다.
  • 즉 원래부터 “plugin:prettier/recommended”는 plugin이 아니라, config 였습니다.
    • The extends property value is either:
      • a string that specifies a configuration (either a path to a config file, the name of a shareable config, eslint:recommended, or eslint:all)
      • an array of strings where each additional configuration extends the preceding configurations
 

3-2. eslintPluginPrettierRecommended는 plugin이 아니라, plugin 패키지에 포함된 config입니다.

  • “eslint-plugin-prettier/recommended”는 plugin이 아니라, plugin 패키지에 포함된 config입니다.
  • config이기 때문에 flat config 상에서는 plugin으로 인식할 수 없습니다.
recommended.js
prettier
  • plugin 구성은 config 객체와 다른 형상이기 때문에, plugin으로 그대로 등록하면 정상 동작하지 않는 게 정상입니다. (flat config 이전에도 동일)
eslint-plugin-prettier.js
prettier
 

3-3. eslint-config-prettier는 config에 없어도 됩니다.

eslint-plugin-prettier
prettierUpdated Dec 25, 2024
  • eslint-plugin-prettier가 실행되면 알아서 활용합니다.
Enable the eslint-config-prettier config which will turn off ESLint rules that conflict with Prettier.
const eslintPluginPrettierRecommended = require('eslint-plugin-prettier/recommended'); module.exports = [ eslintPluginPrettierRecommended, ];
This will:
  • Enable the prettier/prettier rule.
  • Disable the arrow-body-style and prefer-arrow-callback rules which are problematic with this plugin - see the below for why.
  • Enable the eslint-config-prettier config which will turn off ESLint rules that conflict with Prettier.
 

3-4. flat config에서 extends 필드는 사용하지 않습니다.

  • extends 필드 활용은 레거시 config 설정 방법입니다.
  • flat config에서는 각 config를 배열 혹은 가변 인자로 1차원으로 늘여뜨려 전달합니다.
    • // ESLint export default [ someConfig, eslintConfigPrettier, ]; // TypeScript-ESLint export default tseslint.config( js.configs.recommended, ...tseslint.configs.recommended, eslintPluginPrettierRecommended, { // extends: 필드 사용 X. ConfigError // extends 대신 가변 인자 활용(flat config) files: ["**/*.{ts,tsx}"], ignores: ["dist"], languageOptions: {}, plugins: {}, rules: {}, }, );