Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support Prettier v3 #901

Merged
merged 3 commits into from Oct 14, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/nine-apricots-cough.md
@@ -0,0 +1,5 @@
---
"prettier-eslint": major
---

feat! add support for prettier v3
3 changes: 3 additions & 0 deletions .eslintrc.js
@@ -1,5 +1,8 @@
const config = {
extends: ['kentcdodds', 'kentcdodds/jest'],
parserOptions: {
ecmaVersion: 2021,
},
rules: {
'valid-jsdoc': 'off',
'max-len': 'off',
Expand Down
10 changes: 7 additions & 3 deletions package-scripts.js
Expand Up @@ -18,9 +18,13 @@ module.exports = {
},
},
test: {
default: crossEnv('NODE_ENV=test jest --coverage'),
update: crossEnv('NODE_ENV=test jest --coverage --updateSnapshot'),
watch: crossEnv('NODE_ENV=test jest --watch'),
// Note: The `--experimental-vm-modules` flag is required for Jest to work
// with ESM. ESM support is needed due to prettier v3’s use of a dynamic
// `import()` in its `.cjs` file. The flag can be removed when node
// supports modules in the VM API or the import is removed from prettier.
default: crossEnv('NODE_ENV=test NODE_OPTIONS=--experimental-vm-modules jest --coverage'),
update: crossEnv('NODE_ENV=test NODE_OPTIONS=--experimental-vm-modules jest --coverage --updateSnapshot'),
watch: crossEnv('NODE_ENV=test NODE_OPTIONS=--experimental-vm-modules jest --watch'),
openCoverage: 'open coverage/lcov-report/index.html',
},
build: {
Expand Down
18 changes: 9 additions & 9 deletions package.json
Expand Up @@ -29,28 +29,28 @@
"indent-string": "^4.0.0",
"lodash.merge": "^4.6.0",
"loglevel-colored-level-prefix": "^1.0.0",
"prettier": "^2.5.1",
"prettier": "^3.0.1",
"pretty-format": "^23.0.1",
"require-relative": "^0.8.7",
"typescript": "^4.5.4",
"vue-eslint-parser": "^9.1.0"
},
"devDependencies": {
"@babel/cli": "^7.4.4",
"@babel/core": "^7.4.5",
"@babel/preset-env": "^7.4.5",
"@babel/cli": "^7.22.9",
"@babel/core": "^7.22.9",
"@babel/preset-env": "^7.22.9",
"acorn": "^6.1.1",
"ajv": "^6.12.2",
"all-contributors-cli": "^6.7.0",
"babel-jest": "^25.0.0",
"babel-jest": "^29.6.2",
"chalk": "^2.1.0",
"eslint-config-kentcdodds": "^20.0.1",
"eslint-config-kentcdodds": "^20.5.0",
"husky": "^8.0.1",
"jest": "^25.0.0",
"jest-cli": "^25.0.0",
"jest": "^29.6.2",
"jest-cli": "^29.6.2",
"nps": "^5.7.1",
"nps-utils": "^1.3.0",
"prettier-eslint-cli": "^7.0.0",
"prettier-eslint-cli": "^7.1.0",
"rimraf": "^2.5.4",
"semantic-release": "^15.13.16",
"strip-indent": "^3.0.0"
Expand Down
21 changes: 10 additions & 11 deletions src/index.js
Expand Up @@ -19,14 +19,14 @@ module.exports = format;
/**
* Formats the text with prettier and then eslint based on the given options
* @param {String} options.filePath - the path of the file being formatted
* can be used in leu of `eslintConfig` (eslint will be used to find the
* can be used in lieu of `eslintConfig` (eslint will be used to find the
* relevant config for the file). Will also be used to load the `text` if
* `text` is not provided.
* @param {String} options.text - the text (JavaScript code) to format
* @param {String} options.eslintPath - the path to the eslint module to use.
* Will default to require.resolve('eslint')
* @param {String} options.prettierPath - the path to the prettier module.
* Will default to require.resovlve('prettier')
* Will default to require.resolve('prettier')
* @param {Object} options.eslintConfig - the config to use for formatting
* with ESLint.
* @param {Object} options.prettierOptions - the options to pass for
Expand Down Expand Up @@ -62,7 +62,9 @@ async function format(options) {

const prettierOptions = merge(
{},
filePath && { filepath: filePath },
// Let prettier infer the parser using the filepath, if present. Otherwise
// assume the file is JS and default to the babel parser.
filePath ? { filepath: filePath } : { parser: 'babel' },
getPrettierConfig(filePath, prettierPath),
options.prettierOptions
);
Expand Down Expand Up @@ -111,14 +113,11 @@ async function format(options) {
}

if (['.ts', '.tsx'].includes(fileExtension)) {
formattingOptions.eslint.parser =
formattingOptions.eslint.parser ||
require.resolve('@typescript-eslint/parser');
formattingOptions.eslint.parser ||= require.resolve('@typescript-eslint/parser');
}

if (['.vue'].includes(fileExtension)) {
formattingOptions.eslint.parser =
formattingOptions.eslint.parser || require.resolve('vue-eslint-parser');
formattingOptions.eslint.parser ||= require.resolve('vue-eslint-parser');
}

const eslintFix = await createEslintFix(formattingOptions.eslint, eslintPath);
Expand All @@ -127,11 +126,11 @@ async function format(options) {
const eslintFixed = await eslintFix(text, filePath);
return prettify(eslintFixed);
}
return eslintFix(prettify(text), filePath);
return eslintFix(await prettify(text), filePath);
}

function createPrettify(formatOptions, prettierPath) {
return function prettify(text) {
return async function prettify(text) {
logger.debug('calling prettier on text');
logger.trace(
stripIndent`
Expand All @@ -143,7 +142,7 @@ function createPrettify(formatOptions, prettierPath) {
const prettier = requireModule(prettierPath, 'prettier');
try {
logger.trace('calling prettier.format with the text and prettierOptions');
const output = prettier.format(text, formatOptions);
const output = await prettier.format(text, formatOptions);
logger.trace('prettier: output === input', output === text);
logger.trace(
stripIndent`
Expand Down