prettier-plugin-tailwindcss icon indicating copy to clipboard operation
prettier-plugin-tailwindcss copied to clipboard

Incompatibility with other Prettier plugins

Open reinink opened this issue 2 years ago β€’ 48 comments

To make this plugin work we had to use private Prettier APIs that can only be used by a single plugin at once. This means this plugin is incompatible with other Prettier plugins that are using the same APIs.

This GitHub issue will serve as a place to keep track of which Prettier plugins are incompatible β€”Β and hopefully we'll eventually find some workarounds, or even a proper long term solution. πŸ‘

Known incompatibilities

  • @trivago/prettier-plugin-sort-imports
  • prettier-plugin-organize-imports
  • prettier-plugin-svelte (see below)
  • prettier-plugin-twig-melody

prettier-plugin-svelte

We've bundled the prettier-plugin-svelte directly into prettier-plugin-tailwindcss, so if you'd like to use this plugin with Svelte, just uninstall prettier-plugin-svelte and everything should work as expected.

Workarounds

While I have not tested it yet, @Mattinton provided one possible workaround in this comment.

reinink avatar Jan 28 '22 18:01 reinink

I originally opened issue #26 about prettier-plugin-organize-imports - in that specific case, I'm able to work around the incompatibility for now by monkey-patching prettier-plugin-tailwindcss so that each overlapping parser uses the preprocess function from prettier-plugin-organize-imports, like so:

// merged-prettier-plugin.js

const tailwind = require('prettier-plugin-tailwindcss')
const organizeImports = require('prettier-plugin-organize-imports')

const combinedFormatter = {
  ...tailwind,
  parsers: {
    ...tailwind.parsers,
    ...Object.keys(organizeImports.parsers).reduce((acc, key) => {
      acc[key] = {
        ...tailwind.parsers[key],
        preprocess(code, options) {
          return organizeImports.parsers[key].preprocess(code, options)
        },
      }
      return acc
    }, {}),
  },
}

module.exports = combinedFormatter
// .prettierrc.js

module.exports = {
  plugins: [require('./merged-prettier-plugin.js')],
  ...
}

This works for now because, from what I can tell, prettier-plugin-tailwindcss doesn't set a preprocessor, and prettier-plugin-organize-imports does all of its work in the preprocessor.

Looking forward to whatever eventual fix removes the need for the patch!

jacobwgillespie avatar Jan 28 '22 22:01 jacobwgillespie

Might be a bit of an edge case. But I am using Laravel and subsequently Blade template files.

So that prettier runs on these files I am using @shufo/prettier-plugin-blade. But as this issue suggests, Tailwind classes are not sorted when run with this plugin.

ianjamieson avatar Feb 09 '22 12:02 ianjamieson

Seems this one might be incompatible as well https://github.com/withastro/prettier-plugin-astro

RobbieTheWagner avatar Feb 17 '22 00:02 RobbieTheWagner

I'm in a vue 3 project where we use pug and the plugin is not really working with my current setup. I'm also using vetur as a vscode extension that is set to format everything with prettier (html, pug, etc).

Something strange is happening because if I add new lines or extra tabs, the formatter will kick in on save and do its job. However it does not format the order of tailwind classes, even in regular html template tags.

The only time I got the tailwind order to work was by doing the npx prettier --write ./some/file.vue. This only worked in a regular html template tag, not pug.

I tried removing the dependency for the prettier pug plugin and testing it out and it still does not order classes. Is it conflicting with something else?

	"dependencies": {
		"core-js": "^3.8.3",
		"ionicons": "^6.0.1",
		"vue": "^3.2.13",
		"vue-i18n": "^9.2.0-beta.30",
		"vue-router": "^4.0.3",
		"vuex": "^4.0.0"
	},
	"devDependencies": {
		"@babel/core": "^7.12.16",
		"@babel/eslint-parser": "^7.12.16",
		"@prettier/plugin-pug": "^1.19.2",
		"@vue/cli-plugin-babel": "~5.0.0-rc.2",
		"@vue/cli-plugin-eslint": "~5.0.0-rc.2",
		"@vue/cli-plugin-router": "~5.0.0-rc.2",
		"@vue/cli-plugin-vuex": "~5.0.0-rc.2",
		"@vue/cli-service": "~5.0.0-rc.2",
		"@vue/eslint-config-airbnb": "^6.0.0",
		"autoprefixer": "^10.4.2",
		"eslint": "^7.32.0",
		"eslint-plugin-import": "^2.25.3",
		"eslint-plugin-vue": "^8.0.3",
		"eslint-plugin-vuejs-accessibility": "^1.1.0",
		"postcss": "^8.4.5",
		"prettier": "^2.5.1",
		"prettier-plugin-tailwindcss": "^0.1.7",
		"pug": "^3.0.2",
		"pug-plain-loader": "^1.1.0",
		"sass": "^1.32.7",
		"sass-loader": "^12.0.0",
		"tailwindcss": "^3.0.18"
	}

sandraroz avatar Feb 17 '22 17:02 sandraroz

@rwwagner90 It's not that this plugin is incompatible with prettier-plugin-astro, but this plugin only works with a few extensions (such as vue, html, etc).

dacodekid avatar Feb 23 '22 00:02 dacodekid

Subscribing to this. Working with Craft CMS, it's disappointing to see this is incompatible with prettier-plugin-twig-melody.

darylknight avatar Feb 24 '22 14:02 darylknight

@rwwagner90 It's not that this plugin is incompatible with prettier-plugin-astro, but this plugin only works with a few extensions (such as vue, html, etc).

Would it be possible to add astro support?

RobbieTheWagner avatar Feb 25 '22 20:02 RobbieTheWagner

plugin not work when i use @apply on .scss file ? :(

doubled3264 avatar Mar 23 '22 04:03 doubled3264

Seem to be having problems when parsing Angular HTML files too

JamesIves avatar Mar 25 '22 14:03 JamesIves

I don't know if it is also related to this, but I can't have prettier-plugin-tailwindcss working alongside @tailwindcss/forms. It says it doesn't find it.

nunocasteleira avatar Apr 19 '22 09:04 nunocasteleira

@nunocasteleira this issue is related to prettier plugins conflicting with each other.

If your system can't find @tailwindcss/forms try reinstalling it with npm install @tailwindcss/forms.

If you continue to have problems open an issue on the forms repo.

joshmedeski avatar Apr 19 '22 14:04 joshmedeski

If your system can't find @tailwindcss/forms try reinstalling it with npm install @tailwindcss/forms.

Yes, but the problem arises when prettier-plugin-tailwindcss is installed. If I uninstall it, I'm able to run prettier (with @tailwind/forms also installed), whereas it fails with prettier plugin tailwindcss added to my package.json.

nunocasteleira avatar Apr 19 '22 15:04 nunocasteleira

@nunocasteleira Can you share your prettier config file with us?

joshmedeski avatar Apr 19 '22 15:04 joshmedeski

Might be a bit of an edge case. But I am using Laravel and subsequently Blade template files.

So that prettier runs on these files I am using @shufo/prettier-plugin-blade. But as this issue suggests, Tailwind classes are not sorted when run with this plugin.

Did you find a way to get this working?

christiaansnoei avatar Apr 20 '22 18:04 christiaansnoei

@joshmedeski I have a very minimal prettierrc, it's a Vue project:

{
  "endOfLine": "lf",
  "singleQuote": true,
  "printWidth": 120
}

nunocasteleira avatar Apr 21 '22 17:04 nunocasteleira

@nunocasteleira I'm stumped. I don't know why @tailwindcss/forms has any relationship with prettier-plugin-tailwindcss.

joshmedeski avatar Apr 21 '22 21:04 joshmedeski

I can share the repo if you want. On 21 Apr 2022, 22:01 +0100, Josh Medeski @.***>, wrote:

@nunocasteleira I'm stumped. I don't know why @tailwindcss/forms has any relationship with prettier-plugin-tailwindcss. β€” Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you were mentioned.Message ID: @.***>

nunocasteleira avatar Apr 21 '22 21:04 nunocasteleira

Also appears to be incompatible with prettier-plugin-jsdoc.

My prettier config:

{
  "$schema": "http://json.schemastore.org/prettierrc",
  "endOfLine": "lf",
  "jsxSingleQuote": true,
  "printWidth": 100,
  "quoteProps": "consistent",
  "singleQuote": true,
  "trailingComma": "none",
  "useTabs": false,

  "overrides": [
    {
      "files": ["**/*.html"],
      "options": {
        "singleQuote": false,
        "tabWidth": 2
      }
    }
  ]
}

scott-lc avatar Apr 25 '22 14:04 scott-lc

what's progress of this issue, i run into this issue, it will break pluginprettier-plugin-organize-imports,

tianyingchun avatar Apr 26 '22 07:04 tianyingchun

No one has taken ownership to fix this issue.

For now, I suggest everyone expect prettier-plugin-tailwindcss can only be used on its own right now, your other prettier plugins aren't compatible.

After reviewing https://github.com/prettier/prettier/issues/10261 it seems like this plugin is highjacking the typescript parser and so any other plugin that also wants to interact with the same parser they are ignored. If someone understands this please feel free to experiment with rewriting this plugin so other plugins continue to work as expected.

joshmedeski avatar Apr 26 '22 16:04 joshmedeski

Both prettier-plugin-style-order and prettier-plugin-css-order do not work with prettier-plugin-tailwindcss.

MusicOnline avatar Apr 26 '22 17:04 MusicOnline

If you want a workaround, you could use the prettier --config flag and have two different configs (using the sharing configurations patter for consistent formatting).

This solution won't work with your IDE on saving, but it could work with a lint-stage solution.

prettier --config ./.prettierrc.tailwind.js --write .
prettier --config ./.prettierrc.other.js --write .

It's not a pretty solution, but I think it's possible for those that strongly want multiple plugin support.

I, personally, have decided to use the tailwind prettier plugin on its own for now to avoid adding this much complexity to my projects.

joshmedeski avatar Apr 26 '22 17:04 joshmedeski

It's not a pretty solution, ...

I see what you did there.

bai avatar Apr 26 '22 17:04 bai

Also appears to be incompatible with https://github.com/prettier/plugin-php

kxpro avatar May 12 '22 04:05 kxpro

how about this issue

tianyingchun avatar May 18 '22 07:05 tianyingchun

If you want a workaround, you could use the prettier --config flag and have two different configs (using the sharing configurations patter for consistent formatting).

This solution won't work with your IDE on saving, but it could work with a lint-stage solution.

prettier --config ./.prettierrc.tailwind.js --write .
prettier --config ./.prettierrc.other.js --write .

It's not a pretty solution, but I think it's possible for those that strongly want multiple plugin support.

I, personally, have decided to use the tailwind prettier plugin on its own for now to avoid adding this much complexity to my projects.

Thanks for the idea, I made a lintstaged script to run eslint (with prettier tailwindcss) + prettier (with prettier sort imports), here is an example

devrsi0n avatar May 20 '22 02:05 devrsi0n

Also incompatible with prettier-plugin-organize-attributes

guilhermetod avatar Jun 08 '22 07:06 guilhermetod

Any workarounds @guilhermetod ?

jlarmstrongiv avatar Jun 08 '22 07:06 jlarmstrongiv

I for one can say that I can install and integrate: @tailwindcss/forms and it has 0 affect on this Prettier plugin.

I don't particular care for the defaults put forth in the forms extension, so I don't usually use it. Just tried it out when I saw these issues.

As to all of the other plugins, I don't personally use all of those, but other ones such as standard prettier, or prettier for Jest I do use and never had any issue.

manavm1990 avatar Jul 07 '22 22:07 manavm1990

@manavm1990 This issue is specifically in regards to those other plugins, not for the standard prettier plugin which this tailwind plugin was built for and can be used in tandem with forms πŸ‘

jcamato avatar Jul 07 '22 22:07 jcamato