eslint-config-prettier icon indicating copy to clipboard operation
eslint-config-prettier copied to clipboard

Eslint 9.0 released and the flat configuration format

Open davidwessman opened this issue 1 year ago • 5 comments

Hello 🙂

Now eslint 9.0 is released ( https://eslint.org/blog/2024/04/eslint-v9.0.0-released/) Would be great to add an example in the README of using this plugin with the flat config - I have not been able to figure it out yet.

Would be grateful if anyone found a working configuration 🙂

davidwessman avatar Apr 08 '24 06:04 davidwessman

Seconded. Now using the flat config and can't work out how to add this module.

m-shum avatar Apr 10 '24 23:04 m-shum

I think the two upstream dependencies have been updated long ago, maybe the maintainers are waiting for @vue/eslint-config-typescript to be updated along with them The related flat configurations can be found at https://github.com/prettier/eslint-config-prettier#installation and https://github.com/prettier/eslint-plugin-prettier#configuration-new-eslintconfigjs

lvzhenbo avatar Apr 14 '24 17:04 lvzhenbo

eslint.config.js for Vue 3.x project is much more complicated, you need to install devDependencies with package manager you like first:

pnpm add -D @eslint/eslintrc @eslint/js @vue/eslint-config-prettier @vue/eslint-config-typescript eslint eslint-plugin-oxlint eslint-plugin-vue globals
import { FlatCompat } from '@eslint/eslintrc'
import ESLint from '@eslint/js'
import Oxlint from 'eslint-plugin-oxlint'
import Vue from 'eslint-plugin-vue'
import globals from 'globals'
import { dirname } from 'node:path'
import { fileURLToPath } from 'node:url'

const __filename = fileURLToPath(import.meta.url)
const __dirname = dirname(__filename)
const compat = new FlatCompat({ baseDirectory: __dirname })

export default [
  {
    // config with just ignores is the replacement for `.eslintignore`
    ignores: ['{dist,public}/**/*'],
  },
  ESLint.configs.recommended,
  ...Vue.configs['flat/recommended'],
  // uncomment next line for TypeScript project
  // ...compat.extends('@vue/eslint-config-typescript/recommended'),
  Oxlint.configs['flat/recommended'],
  ...compat.extends('@vue/eslint-config-prettier/skip-formatting'),
  {
    files: ['**/*.{js,mjs,cjs,jsx,vue}'], // append `ts,mts,cts,tsx` for TypeScript project
    linterOptions: {
      reportUnusedDisableDirectives: true,
    },
    languageOptions: {
      globals: {
        ...globals.node,
        ...globals.browser,
        ...globals.es2021,
      },
    },
    plugins: {},
    rules: {},
  },
]

eslint.config.js for vanilla TypeScript project:

pnpm add -D @eslint/js eslint eslint-config-prettier eslint-plugin-oxlint globals typescript-eslint
import ESLint from '@eslint/js'
import ESLintConfigPrettier from 'eslint-config-prettier'
import Oxlint from 'eslint-plugin-oxlint'
import globals from 'globals'
import TSESLint from 'typescript-eslint'

export default TSESLint.config(
  {
    // config with just ignores is the replacement for `.eslintignore`
    ignores: ['{dist,public}/**/*'],
  },
  ESLint.configs.recommended,
  ...TSESLint.configs.recommended,
  Oxlint.configs['flat/recommended'],
  ESLintConfigPrettier,
  {
    files: ['**/*.{js,mjs,cjs,jsx,ts,mts,cts,tsx}'],
    linterOptions: {
      reportUnusedDisableDirectives: true,
    },
    languageOptions: {
      globals: {
        ...globals.node,
        ...globals.browser,
        ...globals.es2021,
      },
    },
    plugins: {},
    rules: {},
  },
)

bamf2077 avatar Apr 16 '24 03:04 bamf2077

Any progress yet?

ehehaye avatar Jun 24 '24 08:06 ehehaye

Ours looks like this now:

const FlatCompat = require("@eslint/eslintrc").FlatCompat;
const globals = require("globals");
const js = require("@eslint/js");
const pluginVue = require("eslint-plugin-vue");
const ts = require("typescript-eslint");
const eslintConfigPrettier = require("eslint-config-prettier");
const parser = require("vue-eslint-parser");
const ext = require("eslint-plugin-ext");

const compat = new FlatCompat({ baseDirectory: __dirname });

module.exports = [
  js.configs.recommended,
  ...pluginVue.configs["flat/recommended"],
  ...ts.configs.recommended,
  eslintConfigPrettier,
  ...compat.extends("@vue/eslint-config-prettier/skip-formatting"),

  {
    ignores: [
      "**/javascript/src/vendor/*",
      "**/javascript/src/config.js",
      "**/eslint.config.js",
    ],
  },

  {
    plugins: {
      ext: ext,
    },

    files: ["app/javascript/src/**/*.js", "app/javascript/src/**/*.vue"],

    languageOptions: {
      globals: {
        ...globals.browser,
        ...globals.node,
        ...globals.amd,
        ...globals.jquery,

        Vue: "readonly",
        axios: "readonly",
        _: "readonly",
      },

      // ecmaVersion: 2020,
      sourceType: "module",
      parser: parser,
    },

    rules: {
      "vue/no-unused-vars": "error",
      "vue/padding-line-between-tags": "warn",
      "no-console": process.env.NODE_ENV === "production" ? "warn" : "off",
      "no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off",

      "ext/lines-between-object-properties": [
        "error",
        "always",
        { exceptBetweenSingleLines: true },
      ],
    },

    settings: {
      "import/resolver": {
        alias: {
          map: [["@", "./app/javascript/src"]],
        },
      },
    },
  },
];

davidwessman avatar Jun 24 '24 08:06 davidwessman