prettier / eslint-plugin-prettier

ESLint plugin for Prettier formatting
https://npm.im/eslint-plugin-prettier
MIT License
3.33k stars 182 forks source link

[feat] fallback `ignorePath` to `.eslintignore` if `.prettierignore` not found #630

Open JounQin opened 10 months ago

JounQin commented 10 months ago

What version of eslint are you using?

8.56.0

What version of prettier are you using?

3.1.1

What version of eslint-plugin-prettier are you using?

5.1.2

Please paste any applicable config files that you're using (e.g. .prettierrc or .eslintrc files)

.prettierrc

What source code are you linting?

N/A

What did you expect to happen?

When .prettierignore not found, .eslintignore should be used as ignorePath

What actually happened?

When .prettierignore not found, .gitignore will be used as ignorePath by prettier itself

BPScott commented 10 months ago

I'm strongly opposed to adding new features that allow users to do customizations that diverge from the standard "configure prettier using the .prettierrc / .prettierignore file" behaviour. I would strongly advise against implementing this.

The aim is that you should get identical output if you format a file through prettier's CLI or through eslint with eslint-plugin-prettier. Adding options or additional behaviour to eslint-plugin-prettier is a vector for allowing divergences to happen, which moves us away from that goal, and increases our support burden as there is potential for suprising behaviour that is not what eslint or prettier themselves do.

This proposal introduces plugin-specific behaviour and the critical tenant of "eslint CLI and prettier CLI must produce the same output" breaks.


In cases where a .eslintignore file is present then for files mentioned in that file the prettier/prettier rule (any any other rule) will never be invoked in the first place. If a file is mentioned in the eslintignore then the code that runs prettier would never be invoked in the first place. Can you give an example of when setting this would have an effect?

JounQin commented 10 months ago

@BPScott prettier will respect .gitignore + .prettierignore by default at the same time on prettier v3.

Tip! Prettier will follow rules specified in .gitignore if it exists in the same directory from which it is run. You can also base your .prettierignore on .eslintignore (if you have one).

See also: https://prettier.io/docs/en/install and

https://github.com/prettier/prettier/blob/f3fff2ef13d11b7952feef4e7180e658fd4809a0/src/cli/cli-options.evaluate.js#L199C27-L199C36

https://github.com/prettier/prettier/blob/f3fff2ef13d11b7952feef4e7180e658fd4809a0/src/index.d.ts#L781

If a file is mentioned in the eslintignore then the code that runs prettier would never be invoked in the first place. Can you give an example of when setting this would have an effect?

That's a good point. ESLint runs different from prettier itself on virtual files.

For instance, I have a plugin extracting JavaScript codes from .txt files, prettier does not support .txt files natively, so it would be passed as .txt/0_xxx.js to prettier.format, and mostly there will be no *.txt/*.js in .prettierignore, but there could be *.txt/*.js in .eslintignore.

So my proposed change would be changing the following

https://github.com/prettier/eslint-plugin-prettier/blob/f9857187b4d43d2f0d20104a8c94eb4abbd44725/worker.js#L50

- ignorePath: '.prettierignore',
+ ignorePath: ['.gitignore', '.prettierignore', '.eslintignore'],
JounQin commented 9 months ago

Friendly ping @BPScott