Skip to content

Support Prettier v3#901

Merged
JounQin merged 3 commits intoprettier:masterfrom
timdp:prettier-3
Oct 14, 2023
Merged

Support Prettier v3#901
JounQin merged 3 commits intoprettier:masterfrom
timdp:prettier-3

Conversation

@timdp
Copy link
Copy Markdown
Contributor

@timdp timdp commented Jul 7, 2023

Prettier v3.0.0 was released this week. I tried to run prettier-eslint against it, and ran into:

TypeError: Expected `input` to be a `string`, got `object`
    at module.exports (node_modules/@prettier/eslint/node_modules/indent-string/index.js:11:9)
    at prettify (node_modules/@prettier/eslint/dist/index.js:133:37)
    at format (node_modules/@prettier/eslint/dist/index.js:113:20)
    at async node_modules/prettier-eslint-cli/dist/format-files.js:255:26

The indentation happens merely in a logging statement, but commenting it out just propagates the unexpected input to another function. The underlying issue is that prettier.format(), called from prettify(), is now async. Hence, the mysterious object is actually a Promise.

As a quick fix for that particular API change, it's sufficient to treat prettify as async and add an await. It's also called in two other places, but those are a return from an async function, so adding an await would be redundant. (I personally prefer to do it for clarity, but the linter rules won't let me.)

This is only a fix for this particular incompatibility. It does not:

  • upgrade prettier to v3.0.0: I tried, but then, the tests crash;
  • take into account other API changes: no idea if there are any.

However, it makes formatting work in my projects, and it's backwards compatible with v2, because you can safely await a string. Hence, it should at least be a step in the right direction.

(Incidentally, only calling indentString if the logger is actually enabled would probably provide a nice performance boost.)

@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented Jul 7, 2023

🦋 Changeset detected

Latest commit: 6780f52

The changes in this PR will be included in the next version bump.

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@Kreeg
Copy link
Copy Markdown

Kreeg commented Jul 20, 2023

When this will be merged?

@timdp
Copy link
Copy Markdown
Contributor Author

timdp commented Jul 25, 2023

For those wanting to experiment with this, I've published:

  • @timdp/prettier-eslint-cli@7.1.1-alpha.1
  • @timdp/prettier-eslint@^15.0.2-alpha.1

I was able to use the former as a drop-in replacement for the real prettier-eslint-cli while depending on prettier@3.0.0, but YMMV.

@JounQin
Copy link
Copy Markdown
Member

JounQin commented Jul 25, 2023

upgrade prettier to v3.0.0: I tried, but then, the tests crash;

It seems this PR can not be merged as-is?

@timdp
Copy link
Copy Markdown
Contributor Author

timdp commented Jul 25, 2023

It seems this PR can not be merged as-is?

In the original PR, the logger was crashing. I didn't notice because I'd commented it out locally. I added an extra await and force-pushed 718e5f0. That one works for me; it's also the version I published under my npm scope.

@JounQin
Copy link
Copy Markdown
Member

JounQin commented Jul 25, 2023

@timdp

"prettier": "^2.5.1",

But the prettier version in package.json does not change at all?

@timdp
Copy link
Copy Markdown
Contributor Author

timdp commented Jul 25, 2023

But the prettier version in package.json does not change at all?

My project depends on prettier@3.0.0 directly, and this package contains complex logic that makes it prefer that over its own version.

As I mentioned in the issue description, upgrading the dependency makes the tests crash for an unknown reason:

node:internal/process/promises:289
            triggerUncaughtException(err, true /* fromPromise */);
            ^

TypeError: A dynamic import callback was not specified.
    at new NodeError (node:internal/errors:405:5)
    at importModuleDynamicallyCallback (node:internal/modules/esm/utils:91:9)
    at Object.<anonymous> (/Users/timdp/Code/prettier-eslint/node_modules/prettier/index.cjs:600:23)
    at Runtime._execModule (/Users/timdp/Code/prettier-eslint/node_modules/jest-runtime/build/index.js:1205:24)
    at Runtime._loadModule (/Users/timdp/Code/prettier-eslint/node_modules/jest-runtime/build/index.js:805:12)
    at Runtime.requireModule (/Users/timdp/Code/prettier-eslint/node_modules/jest-runtime/build/index.js:662:10)
    at Runtime.requireActual (/Users/timdp/Code/prettier-eslint/node_modules/jest-runtime/build/index.js:683:17)
    at Object.<anonymous> (/Users/timdp/Code/prettier-eslint/src/__mocks__/prettier.js:1:23)
    at Runtime._execModule (/Users/timdp/Code/prettier-eslint/node_modules/jest-runtime/build/index.js:1205:24)
    at Runtime._loadModule (/Users/timdp/Code/prettier-eslint/node_modules/jest-runtime/build/index.js:805:12) {
  code: 'ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING'
}

Node.js v20.5.0

Jest gives me nightmares but I can do some more digging if the error doesn't ring a bell.

seanCodes added a commit to seanCodes/prettier-eslint that referenced this pull request Aug 4, 2023
This fixes the testing issues for the PR to the upstream repo: prettier#901
@seanCodes
Copy link
Copy Markdown
Contributor

@timdp @JounQin I've submitted a PR to Tim’s prettier-3 branch (timdp#1) that fixes the tests and includes the prettier 3 bump. Once it’s merged this PR should be good to go.

On a side note, it might be good to make prettier a peer dependency rather than a direct dependency. The prettier-eslint code actually supports prettier 2 and 3, so it could be nice for consumers to have the option to choose.

@seanCodes
Copy link
Copy Markdown
Contributor

seanCodes commented Aug 14, 2023

@JounQin This change should now be ready for review 🙂

@mbergkvist
Copy link
Copy Markdown

Any ideas when this will merged and released?

@seanCodes
Copy link
Copy Markdown
Contributor

@JounQin @danielwerg Bumping this. This issue makes the eslint-prettier plugin for VSCode useless with Prettier v3, so it's impacting productivity quite a bit. Is anything else blocking release?

@mrmarbury
Copy link
Copy Markdown

Please merge this

@monarchwadia
Copy link
Copy Markdown

monarchwadia commented Oct 5, 2023

Just wanted to ask... When will this be merged?
Thank you for the great work you're doing for the community.

@JounQin JounQin merged commit 65c8b57 into prettier:master Oct 14, 2023
@JounQin
Copy link
Copy Markdown
Member

JounQin commented Oct 14, 2023

Sorry for the delay, v16 has just been released! Before prettier-eslint-cli upgrade, you can install prettier-eslint@v16 manually with prettier-eslint-cli together, because prettier-eslint is an optional peer dependency for prettier-eslint-cli.

@JounQin
Copy link
Copy Markdown
Member

JounQin commented Oct 14, 2023

prettier-eslint-cli@8.0.0 has just been released!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants