#### Support Angular inline styles as single template literal ([#15968](https://github.com/prettier/prettier/pull/15968) by [@sosukesuzuki](https://github.com/sosukesuzuki))
[Angular v17](https://blog.angular.io/introducing-angular-v17-4d7033312e4b) supports single string inline styles.
<!-- prettier-ignore -->
```ts
// Input
@Component({
template:`<div>...</div>`,
styles:`h1 { color: blue; }`,
})
exportclassAppComponent{}
// Prettier 3.2.4
@Component({
template:`<div>...</div>`,
styles:`h1 { color: blue; }`,
})
exportclassAppComponent{}
// Prettier 3.2.5
@Component({
template:`<div>...</div>`,
styles:`
h1 {
color: blue;
}
`,
})
exportclassAppComponent{}
```
#### Unexpected embedded formatting for Angular template ([#15969](https://github.com/prettier/prettier/pull/15969) by [@JounQin](https://github.com/JounQin))
Computed template should not be considered as Angular component template
<!-- prettier-ignore -->
```ts
// Input
consttemplate="foobar";
@Component({
[template]:`<h1>{{ hello }}</h1>`,
})
exportclassAppComponent{}
// Prettier 3.2.4
consttemplate="foobar";
@Component({
[template]:`<h1>{{ hello }}</h1>`,
})
exportclassAppComponent{}
// Prettier 3.2.5
consttemplate="foobar";
@Component({
[template]:`<h1>{{ hello }}</h1>`,
})
exportclassAppComponent{}
```
#### Use `"json"` parser for `tsconfig.json` by default ([#16012](https://github.com/prettier/prettier/pull/16012) by [@sosukesuzuki](https://github.com/sosukesuzuki))
In [v3.2.0](https://prettier.io/blog/2024/01/12/3.2.0#new-jsonc-parser-added-15831httpsgithubcomprettierprettierpull15831-by-fiskerhttpsgithubcomfisker), we introduced `"jsonc"` parser which adds trialing comma **by default**.
When adding a new parser we also define how it will be used based on the [`linguist-languages`](https://www.npmjs.com/package/linguist-languages) data.
`tsconfig.json` is a special file used by [TypeScript](https://www.typescriptlang.org/docs/handbook/tsconfig-json.html#using-tsconfigjson-or-jsconfigjson), it uses `.json` file extension, but it actually uses the [JSON with Comments](https://code.visualstudio.com/docs/languages/json#_json-with-comments) syntax. However, we found that there are many third-party tools not recognize it correctly because of the confusing `.json` file extension.
We decide to treat it as a JSON file for now to avoid the extra configuration step.
To keep using the `"jsonc"` parser for your `tsconfig.json` files, add the following to your `.pretterrc` file
#### Fix crash when parsing template literal CSS in a JSX style tag using a spread attribute ([#15896](https://github.com/prettier/prettier/pull/15896) by [@eelco](https://github.com/eelco))
For example this code would crash before:
<!-- prettier-ignore -->
```jsx
<style{...spread}>{`.{}`}</style>
```
#### Fix formatting error on optional call expression and member chain ([#15920](https://github.com/prettier/prettier/pull/15920) by [@sosukesuzuki](https://github.com/sosukesuzuki))
#### Fix formatting error on member chain ([#15915](https://github.com/prettier/prettier/pull/15915) by [@sosukesuzuki](https://github.com/sosukesuzuki))
#### Fix config file search ([#15363](https://github.com/prettier/prettier/pull/15363) by [@fisker](https://github.com/fisker))
Previously, we start search for config files from the filePath as a directory, if it happened to be a directory and contains config file, it will be used by mistake.
#### Skip explicitly passed symbolic links with `--no-error-on-unmatched-pattern` ([#15533](https://github.com/prettier/prettier/pull/15533) by [@sanmai-NL](https://github.com/sanmai-NL))
Since Prettier v3, we stopped following symbolic links, however in some use cases, the symbolic link patterns can't be filtered out, and there is no way to prevent Prettier from throwing errors.
In Prettier 3.1.1, you can use `--no-error-on-unmatched-pattern` to simply skip symbolic links.
#### Consistently use tabs in ternaries when `useTabs` is `true` ([#15662](https://github.com/prettier/prettier/pull/15662) by [@auvred](https://github.com/auvred))
<!-- prettier-ignore -->
```jsx
// Input
aaaaaaaaaaaaaaa
?bbbbbbbbbbbbbbbbbb
:ccccccccccccccc
?ddddddddddddddd
:eeeeeeeeeeeeeee
?fffffffffffffff
:gggggggggggggggg;
// Prettier 3.1.0
aaaaaaaaaaaaaaa
?bbbbbbbbbbbbbbbbbb
:ccccccccccccccc
?ddddddddddddddd
:eeeeeeeeeeeeeee
?fffffffffffffff
:gggggggggggggggg;
// Prettier 3.1.1
aaaaaaaaaaaaaaa
?bbbbbbbbbbbbbbbbbb
:ccccccccccccccc
?ddddddddddddddd
:eeeeeeeeeeeeeee
?fffffffffffffff
:gggggggggggggggg;
```
#### Improve config file search ([#15663](https://github.com/prettier/prettier/pull/15663) by [@fisker](https://github.com/fisker))
The Prettier config file search performance has been improved by more effective cache strategy.
#### Fix unstable and ugly formatting for comments in destructuring patterns ([#15708](https://github.com/prettier/prettier/pull/15708) by [@sosukesuzuki](https://github.com/sosukesuzuki))
<!-- prettier-ignore -->
```tsx
// Input
const{
foo,
// bar
// baz
}:Foo=expr;
// Prettier 3.1.0
const{
foo1,
}// bar
// baz
:Foo=expr;
// Prettier 3.1.0 second output
const{
foo1,// bar
}// baz
:Foo=expr;
// Prettier 3.1.1
const{
foo1,
// bar
// baz
}:Foo=expr;
```
#### Support "Import Attributes" ([#15718](https://github.com/prettier/prettier/pull/15718) by [@fisker](https://github.com/fisker))
[TypeScript 5.3](https://devblogs.microsoft.com/typescript/announcing-typescript-5-3/#import-attributes) supports the latest updates to the [import attributes](https://github.com/tc39/proposal-import-attributes) proposal.
#### Fix false claim in docs that cursorOffset is incompatible with rangeStart/rangeEnd ([#15750](https://github.com/prettier/prettier/pull/15750) by [@ExplodingCabbage](https://github.com/ExplodingCabbage))
The cursorOffset option has in fact been compatible with rangeStart/rangeEnd for over 5 years, thanks to work by @ds300. However, Prettier's documentation (including the CLI `--help` text) continued to claim otherwise, falsely. The documentation is now fixed.
#### Keep curly braces and `from` keyword in empty `import` statements ([#15756](https://github.com/prettier/prettier/pull/15756) by [@fisker](https://github.com/fisker))
<!-- prettier-ignore -->
```js
// Input
import{}from'foo';
import{/* comment */}from'bar';
// Prettier 3.1.0
import{}from"foo";
import/* comment */"bar";
// Prettier 3.1.1
import{}from"foo";
import{}from/* comment */"bar";
```
#### Keep empty import attributes and assertions ([#15757](https://github.com/prettier/prettier/pull/15757) by [@fisker](https://github.com/fisker))
#### Add `preferUnplugged: true` to `package.json` ([#15169](https://github.com/prettier/prettier/pull/15169) by [@fisker](https://github.com/fisker) and [@so1ve](https://github.com/so1ve))
Prettier v3 uses dynamic imports, user [will need to unplug Prettier](https://github.com/yarnpkg/berry/pull/5411#issuecomment-1523502224) when Yarn's PnP mode is enabled, add [`preferUnplugged: true`](https://yarnpkg.com/configuration/manifest#preferUnplugged) to `package.json`, so Yarn will install Prettier as unplug by default.
#### Support shared config that forbids `require()` ([#15233](https://github.com/prettier/prettier/pull/15233) by [@fisker](https://github.com/fisker))
If an external shared config package is used, and the package `exports` don't have `require` or `default` export.
In Prettier 3.0.2 Prettier fails when attempt to `require()` the package, and throws an error.
```text
Error [ERR_PACKAGE_PATH_NOT_EXPORTED]: No "exports" main defined in <packageName>/package.json
```
#### Allow argument of `require()` to break ([#15256](https://github.com/prettier/prettier/pull/15256) by [@fisker](https://github.com/fisker))
<!-- prettier-ignore -->
```jsx
// Input
constplugin=require(
global.STANDALONE
?path.join(__dirname,"../standalone.js")
:path.join(__dirname,"..")
);
// Prettier 3.0.2
constplugin=require(global.STANDALONE
?path.join(__dirname,"../standalone.js")
:path.join(__dirname,".."));
// Prettier 3.0.3
constplugin=require(
global.STANDALONE
?path.join(__dirname,"../standalone.js")
:path.join(__dirname,"..")
);
```
#### Do not print trailing commas in arrow function type parameter lists in `ts` code blocks ([#15286](https://github.com/prettier/prettier/pull/15286) by [@sosukesuzuki](https://github.com/sosukesuzuki))
<!-- prettier-ignore -->
````md
<!-- Input -->
```ts
const foo = <T>() => {}
```
<!-- Prettier 3.0.2 -->
```ts
const foo = <T,>() => {}
```
<!-- Prettier 3.0.3 -->
```ts
const foo = <T>() => {}
```
````
#### Support TypeScript 5.2 `using` / `await using` declaration ([#15321](https://github.com/prettier/prettier/pull/15321) by [@sosukesuzuki](https://github.com/sosukesuzuki))
Support for the upcoming Explicit Resource Management feature in ECMAScript. [`using` / `await using` declaration](https://devblogs.microsoft.com/typescript/announcing-typescript-5-2/#using-declarations-and-explicit-resource-management)
#### Break after `=` of assignment if RHS is poorly breakable AwaitExpression or YieldExpression ([#15204](https://github.com/prettier/prettier/pull/15204) by [@seiyab](https://github.com/seiyab))
#### Do not add trailing comma for grouped scss comments ([#15217](https://github.com/prettier/prettier/pull/15217) by [@auvred](https://github.com/auvred))
<!-- prettier-ignore -->
```scss
/* Input */
$foo: (
'property': (),
// comment 1
// comment 2
)
/* Prettier 3.0.1 */
$foo: (
"property": (),
// comment 1
// comment 2,
);
/* Prettier 3.0.2 */
$foo: (
"property": (),
// comment 1
// comment 2
);
```
#### Print `declare` and `export` keywords for nested namespace ([#15249](https://github.com/prettier/prettier/pull/15249) by [@sosukesuzuki](https://github.com/sosukesuzuki))
#### Fix cursor positioning for a special case ([#14812](https://github.com/prettier/prettier/pull/14812) by [@fisker](https://github.com/fisker))
<!-- prettier-ignore -->
```js
// <|> is the cursor position
/* Input */
// All messages are represented in JSON.
// So, the prettier.py controls a subprocess which spawns "node {this_file}".
import {<|> } from "fs"
/* Prettier 3.0.0 */
// All messages are represented in JSON.
// So, the prettier.py <|>controls a subprocess which spawns "node {this_file}".
import {} from "fs"
/* Prettier 3.0.1 */
// All messages are represented in JSON.
// So, the prettier.py controls a subprocess which spawns "node {this_file}".
import {<|>} from "fs"
```
#### Fix plugins/estree.d.ts to make it a module ([#15018](https://github.com/prettier/prettier/pull/15018) by [@kingyue737](https://github.com/kingyue737))
Add `export {}` in `plugins/estree.d.ts` to fix the "File is not a module" error
#### Add parenthesis around leading multiline comment in return statement ([#15037](https://github.com/prettier/prettier/pull/15037) by [@auvred](https://github.com/auvred))
<script setup lang="ts" generic="T extends Type1 & Type2 & (Type3 | Type4), U extends string | number | boolean"></script>
<!-- Prettier 3.0.0 -->
<script
setup
lang="ts"
generic="T extends Type1 & Type2 & (Type3 | Type4), U extends string | number | boolean"
></script>
<!-- Prettier 3.0.1 -->
<script
setup
lang="ts"
generic="
T extends Type1 & Type2 & (Type3 | Type4),
U extends string | number | boolean
"
></script>
```
#### Fix comments print in `IfStatement` ([#15076](https://github.com/prettier/prettier/pull/15076) by [@fisker](https://github.com/fisker))
<!-- prettier-ignore -->
```js
function a(b) {
if (b) return 1; // comment
else return 2;
}
/* Prettier 3.0.0 */
Error: Comment "comment" was not printed. Please report this error!
/* Prettier 3.0.1 */
function a(b) {
if (b) return 1; // comment
else return 2;
}
```
#### Add missing type definition for `printer.preprocess` ([#15123](https://github.com/prettier/prettier/pull/15123) by [@so1ve](https://github.com/so1ve))
```diff
export interface Printer<T = any> {
// ...
+ preprocess?:
+ | ((ast: T, options: ParserOptions<T>) => T | Promise<T>)
+ | undefined;
}
```
#### Add missing `getVisitorKeys` method type definition for `Printer` ([#15125](https://github.com/prettier/prettier/pull/15125) by [@auvred](https://github.com/auvred))
```tsx
const printer: Printer = {
print: () => [],
getVisitorKeys(node, nonTraversableKeys) {
return ["body"];
},
};
```
#### Add typing to support `readonly` array properties of AST Node ([#15127](https://github.com/prettier/prettier/pull/15127) by [@auvred](https://github.com/auvred))
<!-- prettier-ignore -->
```tsx
// Input
interface TestNode {
readonlyArray: readonly string[];
}
declare const path: AstPath<TestNode>;
path.map(() => "", "readonlyArray");
// Prettier 3.0.0
interface TestNode {
readonlyArray: readonly string[];
}
declare const path: AstPath<TestNode>;
path.map(() => "", "readonlyArray");
// ^ Argument of type '"readonlyArray"' is not assignable to parameter of type '"regularArray"'. ts(2345)
// Prettier 3.0.1
interface TestNode {
readonlyArray: readonly string[];
}
declare const path: AstPath<TestNode>;
path.map(() => "", "readonlyArray");
```
#### Add space before unary minus followed by a function call ([#15129](https://github.com/prettier/prettier/pull/15129) by [@pamelalozano](https://github.com/pamelalozano))
#### Allow multiple decorators on same getter/setter ([#14584](https://github.com/prettier/prettier/pull/14584) by [@fisker](https://github.com/fisker))
<!-- prettier-ignore -->
```ts
// Input
class A {
@decorator()
get foo () {}
@decorator()
set foo (value) {}
}
// Prettier 2.8.6
SyntaxError: Decorators cannot be applied to multiple get/set accessors of the same name. (5:3)
#### Allow decorators on private members and class expressions ([#14548](https://github.com/prettier/prettier/pull/14548) by [@fisker](https://github.com/fisker))
#### Support TypeScript 5.0 ([#14391](https://github.com/prettier/prettier/pull/14391) by [@fisker](https://github.com/fisker), [#13819](https://github.com/prettier/prettier/pull/13819) by [@fisker](https://github.com/fisker), [@sosukesuzuki](https://github.com/sosukesuzuki))
TypeScript 5.0 introduces two new syntactic features:
- `const` modifiers for type parameters
- `export type *` declarations
#### Add missing parentheses for decorator ([#14393](https://github.com/prettier/prettier/pull/14393) by [@fisker](https://github.com/fisker))
<!-- prettier-ignore -->
```jsx
// Input
class Person {
@(myDecoratorArray[0])
greet() {}
}
// Prettier 2.8.4
class Person {
@myDecoratorArray[0]
greet() {}
}
// Prettier 2.8.5
class Person {
@(myDecoratorArray[0])
greet() {}
}
```
#### Add parentheses for `TypeofTypeAnnotation` to improve readability ([#14458](https://github.com/prettier/prettier/pull/14458) by [@fisker](https://github.com/fisker))
<!-- prettier-ignore -->
```tsx
// Input
type A = (typeof node.children)[];
// Prettier 2.8.4
type A = typeof node.children[];
// Prettier 2.8.5
type A = (typeof node.children)[];
```
#### Support `max_line_length=off` when parsing `.editorconfig` ([#14516](https://github.com/prettier/prettier/pull/14516) by [@josephfrazier](https://github.com/josephfrazier))
If an .editorconfig file is in your project and it sets `max_line_length=off` for the file you're formatting,
it will be interpreted as a `printWidth` of `Infinity` rather than being ignored
(which previously resulted in the default `printWidth` of 80 being applied, if not overridden by Prettier-specific configuration).
<!-- prettier-ignore -->
```html
<!-- Input -->
<div className='HelloWorld' title={`You are visitor number ${ num }`} onMouseOver={onMouseOver}/>
<!-- Prettier 2.8.4 -->
<div
className="HelloWorld"
title={`You are visitor number ${num}`}
onMouseOver={onMouseOver}
/>;
<!-- Prettier 2.8.5 -->
<div className="HelloWorld" title={`You are visitor number ${num}`} onMouseOver={onMouseOver} />;
#### Fix leading comments in mapped types with `readonly` ([#13427](https://github.com/prettier/prettier/pull/13427) by [@thorn0](https://github.com/thorn0), [@sosukesuzuki](https://github.com/sosukesuzuki))
<!-- prettier-ignore -->
```tsx
// Input
type Type = {
// comment
readonly [key in Foo];
};
// Prettier 2.8.3
type Type = {
readonly // comment
[key in Foo];
};
// Prettier 2.8.4
type Type = {
// comment
readonly [key in Foo];
};
```
#### Group params in opening block statements ([#14067](https://github.com/prettier/prettier/pull/14067) by [@jamescdavis](https://github.com/jamescdavis))
This is a follow-up to #13930 to establish wrapping consistency between opening block statements and else blocks by
grouping params in opening blocks. This causes params to break to a new line together and not be split across lines
unless the length of params exceeds the print width. This also updates the else block wrapping to behave exactly the
#### Ignore files in `.sl/` ([#14206](https://github.com/prettier/prettier/pull/14206) by [@bolinfest](https://github.com/bolinfest))
In [Sapling SCM](https://sapling-scm.com/), `.sl/` is the folder where it stores its state, analogous to `.git/` in Git. It should be ignored in Prettier like the other SCM folders.
#### Recognize `@satisfies` in Closure-style type casts ([#14262](https://github.com/prettier/prettier/pull/14262) by [@fisker](https://github.com/fisker))
<!-- prettier-ignore -->
```jsx
// Input
const a = /** @satisfies {Record<string, string>} */ ({hello: 1337});
const b = /** @type {Record<string, string>} */ ({hello: 1337});
const a = /** @satisfies {Record<string, string>} */ ({hello: 1337});
const b = /** @type {Record<string, string>} */ ({hello: 1337});
```
#### Fix parens in inferred function return types with `extends` ([#14279](https://github.com/prettier/prettier/pull/14279) by [@fisker](https://github.com/fisker))
<!-- prettier-ignore -->
```ts
// Input
type Foo<T> = T extends ((a) => a is infer R extends string) ? R : never;
// Prettier 2.8.3 (First format)
type Foo<T> = T extends (a) => a is infer R extends string ? R : never;
// Prettier 2.8.3 (Second format)
SyntaxError: '?' expected.
// Prettier 2.8.4
type Foo<T> = T extends ((a) => a is infer R extends string) ? R : never;
#### Don't lowercase link references ([#13155](https://github.com/prettier/prettier/pull/13155) by [@DerekNonGeneric](https://github.com/DerekNonGeneric) & [@fisker](https://github.com/fisker))
<!-- prettier-ignore -->
```markdown
<!-- Input -->
We now don't strictly follow the release notes format suggested by [Keep a Changelog].
[Keep a Changelog]: https://example.com/
<!-- Prettier 2.8.1 -->
We now don't strictly follow the release notes format suggested by [Keep a Changelog].
[keep a changelog]: https://example.com/
<!--
^^^^^^^^^^^^^^^^^^ lowercased
-->
<!-- Prettier 2.8.2 -->
<Same as input>
```
#### Preserve self-closing tags ([#13691](https://github.com/prettier/prettier/pull/13691) by [@dcyriller](https://github.com/dcyriller))
<!-- prettier-ignore -->
```hbs
{{! Input }}
<div />
<div></div>
<custom-component />
<custom-component></custom-component>
<i />
<i></i>
<Component />
<Component></Component>
{{! Prettier 2.8.1 }}
<div></div>
<div></div>
<custom-component></custom-component>
<custom-component></custom-component>
<i></i>
<i></i>
<Component />
<Component />
{{! Prettier 2.8.2 }}
<div />
<div></div>
<custom-component />
<custom-component></custom-component>
<i />
<i></i>
<Component />
<Component />
```
#### Allow custom "else if"-like blocks with block params ([#13930](https://github.com/prettier/prettier/pull/13930) by [@jamescdavis](https://github.com/jamescdavis))
#13507 added support for custom block keywords used with `else`, but failed to allow block params. This updates printer-glimmer to allow block params with custom "else if"-like blocks.
#### Preserve empty lines between nested SCSS maps ([#13931](https://github.com/prettier/prettier/pull/13931) by [@jneander](https://github.com/jneander))
<!-- prettier-ignore -->
```scss
/* Input */
$map: (
'one': (
'key': 'value',
),
'two': (
'key': 'value',
),
)
/* Prettier 2.8.1 */
$map: (
'one': (
'key': 'value',
),
'two': (
'key': 'value',
),
)
/* Prettier 2.8.2 */
$map: (
'one': (
'key': 'value',
),
'two': (
'key': 'value',
),
)
```
#### Fix missing parentheses when an expression statement starts with `let[` ([#14000](https://github.com/prettier/prettier/pull/14000), [#14044](https://github.com/prettier/prettier/pull/14044) by [@fisker](https://github.com/fisker), [@thorn0](https://github.com/thorn0))
<!-- prettier-ignore -->
```jsx
// Input
(let[0]=2);
// Prettier 2.8.1
let[0]=2;
// Prettier 2.8.1 (second format)
SyntaxError:Unexpectedtoken(1:5)
>1|let[0]=2;
|^
2|
// Prettier 2.8.2
(let)[0]=2;
```
#### Fix semicolon duplicated at the end of LESS file ([#14007](https://github.com/prettier/prettier/pull/14007) by [@mvorisek](https://github.com/mvorisek))
<!-- prettier-ignore -->
```less
// Input
@variable: {
field: something;
};
// Prettier 2.8.1
@variable: {
field: something;
}; ;
// Prettier 2.8.2
@variable: {
field: something;
};
```
#### Fix no space after unary minus when followed by opening parenthesis in LESS ([#14008](https://github.com/prettier/prettier/pull/14008) by [@mvorisek](https://github.com/mvorisek))
<!-- prettier-ignore -->
```less
// Input
.unary_minus_single {
margin: -(@a);
}
.unary_minus_multi {
margin: 0 -(@a);
}
.binary_minus {
margin: 0 - (@a);
}
// Prettier 2.8.1
.unary_minus_single {
margin: - (@a);
}
.unary_minus_multi {
margin: 0 - (@a);
}
.binary_minus {
margin: 0 - (@a);
}
// Prettier 2.8.2
.unary_minus_single {
margin: -(@a);
}
.unary_minus_multi {
margin: 0 -(@a);
}
.binary_minus {
margin: 0 - (@a);
}
```
#### Do not change case of property name if inside a variable declaration in LESS ([#14034](https://github.com/prettier/prettier/pull/14034) by [@mvorisek](https://github.com/mvorisek))
<!-- prettier-ignore -->
```less
// Input
@var: {
preserveCase: 0;
};
// Prettier 2.8.1
@var: {
preservecase: 0;
};
// Prettier 2.8.2
@var: {
preserveCase: 0;
};
```
#### Fix formatting for auto-accessors with comments ([#14038](https://github.com/prettier/prettier/pull/14038) by [@fisker](https://github.com/fisker))
<!-- prettier-ignore -->
```jsx
// Input
classA{
@dec()
// comment
accessorb;
}
// Prettier 2.8.1
classA{
@dec()
accessor// comment
b;
}
// Prettier 2.8.1 (second format)
classA{
@dec()
accessor;// comment
b;
}
// Prettier 2.8.2
classA{
@dec()
// comment
accessorb;
}
```
#### Add parentheses for TSTypeQuery to improve readability ([#14042](https://github.com/prettier/prettier/pull/14042) by [@onishi-kohei](https://github.com/onishi-kohei))
<!-- prettier-ignore -->
```tsx
// Input
aas(typeofnode.children)[number]
aas(typeofnode.children)[]
aas((typeofnode.children)[number])[]
// Prettier 2.8.1
aastypeofnode.children[number];
aastypeofnode.children[];
aastypeofnode.children[number][];
// Prettier 2.8.2
aas(typeofnode.children)[number];
aas(typeofnode.children)[];
aas(typeofnode.children)[number][];
```
#### Fix displacing of comments in default switch case ([#14047](https://github.com/prettier/prettier/pull/14047) by [@thorn0](https://github.com/thorn0))
It was a regression in Prettier 2.6.0.
<!-- prettier-ignore -->
```jsx
// Input
switch(state){
default:
result=state;// no change
break;
}
// Prettier 2.8.1
switch(state){
default:// no change
result=state;
break;
}
// Prettier 2.8.2
switch(state){
default:
result=state;// no change
break;
}
```
#### Support type annotations on auto accessors via `babel-ts` ([#14049](https://github.com/prettier/prettier/pull/14049) by [@sosukesuzuki](https://github.com/sosukesuzuki))
[The bug that `@babel/parser` cannot parse auto accessors with type annotations](https://github.com/babel/babel/issues/15205) has been fixed. So we now support it via `babel-ts` parser.
<!-- prettier-ignore -->
```tsx
classFoo{
accessorprop: number;
}
```
#### Fix formatting of empty type parameters ([#14073](https://github.com/prettier/prettier/pull/14073) by [@fisker](https://github.com/fisker))
#### Add parentheses to head of `ExpressionStatement` instead of the whole statement ([#14077](https://github.com/prettier/prettier/pull/14077) by [@fisker](https://github.com/fisker))
#### Quote numeric keys for json-stringify parser ([#14083](https://github.com/prettier/prettier/pull/14083) by [@fisker](https://github.com/fisker))
<!-- prettier-ignore -->
```jsx
// Input
{0:'value'}
// Prettier 2.8.1
{
0:"value"
}
// Prettier 2.8.2
{
"0":"value"
}
```
#### Fix removing commas from function arguments in maps ([#14089](https://github.com/prettier/prettier/pull/14089) by [@sosukesuzuki](https://github.com/sosukesuzuki))
<!-- prettier-ignore -->
```scss
/* Input */
$foo:map-fn(
(
"#{prop}":inner-fn($first,$second),
)
);
/* Prettier 2.8.1 */
$foo:map-fn(("#{prop}":inner-fn($first$second)));
/* Prettier 2.8.2 */
$foo:map-fn(
(
"#{prop}":inner-fn($first,$second),
)
);
```
#### Do not insert space in LESS property access ([#14103](https://github.com/prettier/prettier/pull/14103) by [@fisker](https://github.com/fisker))
#### Fix SCSS map in arguments ([#9184](https://github.com/prettier/prettier/pull/9184) by [@agamkrbit](https://github.com/agamkrbit))
<!-- prettier-ignore -->
```scss
// Input
$display-breakpoints:map-deep-merge(
(
"print-only":"only print",
"screen-only":"only screen",
"xs-only":"only screen and (max-width: #{map-get($grid-breakpoints,"sm")-1})",
),
$display-breakpoints
);
// Prettier 2.8.0
$display-breakpoints:map-deep-merge(
(
"print-only":"only print",
"screen-only":"only screen",
"xs-only":"only screen and (max-width: #{map-get($grid-breakpoints," sm
")-1})",
),
$display-breakpoints
);
// Prettier 2.8.1
$display-breakpoints:map-deep-merge(
(
"print-only":"only print",
"screen-only":"only screen",
"xs-only":"only screen and (max-width: #{map-get($grid-breakpoints,"sm")-1})",
),
$display-breakpoints
);
```
#### Support auto accessors syntax ([#13919](https://github.com/prettier/prettier/pull/13919) by [@sosukesuzuki](https://github.com/sosukesuzuki))
Support for [Auto Accessors Syntax](https://devblogs.microsoft.com/typescript/announcing-typescript-4-9/#auto-accessors-in-classes) landed in TypeScript 4.9.
#### Fix LESS/SCSS format error ([#12536](https://github.com/prettier/prettier/pull/12536) by [@fisker](https://github.com/fisker))
<!-- prettier-ignore -->
```less
// Input
.background-gradient(@cut) {
background: linear-gradient(
to right,
@white 0%,
@white (@cut - 0.01%),
@portal-background @cut,
@portal-background 100%
);
}
// Prettier 2.6.1
TypeError: Cannot read properties of undefined (reading 'endOffset')
// Prettier 2.6.2
.background-gradient(@cut) {
background: linear-gradient(
to right,
@white 0%,
@white (@cut - 0.01%),
@portal-background @cut,
@portal-background 100%
);
}
```
#### Update `meriyah` to fix several bugs ([#12567](https://github.com/prettier/prettier/pull/12567) by [@fisker](https://github.com/fisker), fixes in [`meriyah`](https://github.com/meriyah/meriyah/) by [@3cp](https://github.com/3cp))
#### Make artifact friendly for webpack ([#12485](https://github.com/prettier/prettier/pull/12485), [#12511](https://github.com/prettier/prettier/pull/12511) by [@fisker](https://github.com/fisker))
Fixes two problems when bundling our UMD files with webpack:
- A error ``"`....__exportStar` is not a function"`` throws when running the bundles.
- Some files cause warning about `"Critical dependency: the request of a dependency is an expression"`.
#### Fix non-idempotent formatting of function calls with complex type arguments ([#12508](https://github.com/prettier/prettier/pull/12508) by [@sosukesuzuki](https://github.com/sosukesuzuki))
#### Improve formatting for empty tuple types ([#11884](https://github.com/prettier/prettier/pull/11884) by [@sosukesuzuki](https://github.com/sosukesuzuki))
#### Fix compatibility with Jest inline snapshot test ([#11892](https://github.com/prettier/prettier/pull/11892) by [@fisker](https://github.com/fisker))
A internal change in Prettier@v2.5.0 accidentally breaks the Jest inline snapshot test.
#### Support Glimmer's named blocks ([#11899](https://github.com/prettier/prettier/pull/11899) by [@duailibe](https://github.com/duailibe))
Prettier already supported this feature, but it converted empty named blocks to self-closing, which is not supported by the Glimmer compiler.
See: [Glimmer's named blocks](https://emberjs.github.io/rfcs/0460-yieldable-named-blocks.html).
#### Fix wildcard syntax in `@forward` ([#11482](https://github.com/prettier/prettier/pull/11482)) ([#11487](https://github.com/prettier/prettier/pull/11487) by [@niksy](https://github.com/niksy))
<!-- prettier-ignore -->
```scss
// Input
@forward"library"asbtn-*;
// Prettier 2.4.0
@forward"library"asbtn-*;
// Prettier 2.4.1
@forward"library"asbtn-*;
```
#### Add new CLI option `debug-print-ast` ([#11514](https://github.com/prettier/prettier/pull/11514) by [@sosukesuzuki](https://github.com/sosukesuzuki))
#### Fix failure on dir with trailing slash ([#11000](https://github.com/prettier/prettier/pull/11000) by [@fisker](https://github.com/fisker))
<!-- prettier-ignore -->
```console
$ ls
1.js 1.unknown
# Prettier 2.3.1
$ prettier . -l
1.js
$ prettier ./ -l
[error] No supported files were found in the directory: "./".
# Prettier 2.3.2
$ prettier ./ -l
1.js
```
#### Fix handling of parenthesis with Flow's {Optional}IndexedAccess ([#11051](https://github.com/prettier/prettier/pull/11051) by [@gkz](https://github.com/gkz))
Add parens when required.
<!-- prettier-ignore -->
```jsx
// Input
typeA=(T&S)['bar'];
typeB=(T|S)['bar'];
typeC=(?T)['bar'];
typeD=(typeofx)['bar'];
typeE=(string=>void)['bar'];
// Prettier 2.3.1
typeA=T&S["bar"];
typeB=T|S["bar"];
typeC=?T["bar"];
typeD=typeofx["bar"];
typeE=(string)=>void["bar"];
// Prettier 2.3.2
typeA=(T&S)["bar"];
typeB=(T|S)["bar"];
typeC=(?T)["bar"];
typeD=(typeofx)["bar"];
typeE=((string)=>void)["bar"];
```
#### Print override modifiers for parameter property ([#11074](https://github.com/prettier/prettier/pull/11074) by [@sosukesuzuki](https://github.com/sosukesuzuki))
##### [`override` modifiers in class elements](https://devblogs.microsoft.com/typescript/announcing-typescript-4-3/#override)
```ts
classFooextends{
overridemethod() {}
}
```
##### [static index signatures (`[key: KeyType]: ValueType`) in classes](https://devblogs.microsoft.com/typescript/announcing-typescript-4-3/#static-index-signatures)
```ts
classFoo{
static[key: string]:Bar;
}
```
##### [`get` / `set` in type declarations](https://devblogs.microsoft.com/typescript/announcing-typescript-4-3/#separate-write-types)
#### Preserve attributes order for element node ([#10958](https://github.com/prettier/prettier/pull/10958) by [@dcyriller](https://github.comdcyriller))
#### Track cursor position properly when it’s at the end of the range to format ([#10938](https://github.com/prettier/prettier/pull/10938) by [@j-f1](https://github.com/j-f1))
#### Break the LHS of type alias that has complex type parameters ([#10901](https://github.com/prettier/prettier/pull/10901) by [@sosukesuzuki](https://github.com/sosukesuzuki))
#### Break the LHS of assignments that has complex type parameters ([#10916](https://github.com/prettier/prettier/pull/10916) by [@sosukesuzuki](https://github.com/sosukesuzuki))
#### Avoid breaking call expressions after assignments with complex type arguments ([#10949](https://github.com/prettier/prettier/pull/10949) by [@sosukesuzuki](https://github.com/sosukesuzuki))
#### Fix formatting for AssignmentExpression with ClassExpression ([#9741](https://github.com/prettier/prettier/pull/9741) by [@sosukesuzuki](https://github.com/sosukesuzuki))
#### Fix formatting for directives in fields ([#9116](https://github.com/prettier/prettier/pull/9116) by [@sosukesuzuki](https://github.com/sosukesuzuki))
#### Fix line breaks for CSS in JS ([#9136](https://github.com/prettier/prettier/pull/9136) by [@sosukesuzuki](https://github.com/sosukesuzuki))
<!-- prettier-ignore -->
```js
// Input
styled.div`
// prettier-ignore
@media (aaaaaaaaaaaaa) {
z-index: ${(props)=>(props.isComplete?'1':'0')};
}
`;
styled.div`
${props=>getSize(props.$size.xs)}
${props=>getSize(props.$size.sm,'sm')}
${props=>getSize(props.$size.md,'md')}
`;
// Prettier stable
styled.div`
// prettier-ignore
@media (aaaaaaaaaaaaa) {
z-index: ${(props)=>
props.isComplete?"1":"0"};
}
`;
styled.div`
${(props)=>getSize(props.$size.xs)}
${(props)=>getSize(props.$size.sm,"sm")}
${(props)=>
getSize(props.$size.md,"md")}
`;
// Prettier master
styled.div`
// prettier-ignore
@media (aaaaaaaaaaaaa) {
z-index: ${(props)=>(props.isComplete?"1":"0")};
}
`;
styled.div`
${(props)=>getSize(props.$size.xs)}
${(props)=>getSize(props.$size.sm,"sm")}
${(props)=>getSize(props.$size.md,"md")}
`;
```
#### Fix comment printing in mapping and sequence ([#9143](https://github.com/prettier/prettier/pull/9143), [#9169](https://github.com/prettier/prettier/pull/9169) by [@sosukesuzuki](https://github.com/sosukesuzuki), [@fisker](https://github.com/fisker), fix in `yaml-unist-parser` by [@ikatyang](https://github.com/ikatyang))
#### Fix format on `style[lang="sass"]` ([#9051](https://github.com/prettier/prettier/pull/9051) by [@fisker](https://github.com/fisker))
<!-- prettier-ignore -->
```jsx
<!--Input-->
<stylelang="sass">
.hero
@includebackground-centered
</style>
<!--Prettierstable-->
<stylelang="sass">
.hero@includebackground-centered;
</style>
<!--Prettiermaster-->
<stylelang="sass">
.hero
@includebackground-centered
</style>
```
#### Fix self-closing blocks and blocks with `src` attribute format ([#9052](https://github.com/prettier/prettier/pull/9052), [#9055](https://github.com/prettier/prettier/pull/9055) by [@fisker](https://github.com/fisker))
.some-class .some-other-class .some-very-loooooooooooooong-class all
);
}
// Prettier 2.0.4 (Second format)
.class {
&: extend(
.some-class .some-other-class .some-very-loooooooooooooong-class all
);
}
// Prettier 2.0.5
.class {
&:extend(
.some-class .some-other-class .some-very-loooooooooooooong-class all
);
}
```
#### Editor integration: Use [`resolve`](https://www.npmjs.com/package/resolve) if builtin `require.resolve` is overridden ([#8072](https://github.com/prettier/prettier/pull/8072) by [@fisker](https://github.com/fisker))
This fixes issues that the users of Atom and WebStorm faced with 2.0.4.
Prettier now switches to using the `resolve` module for resolving configuration files and plugins if it detects that `require.resolve` isn't Node's builtin function (doesn't support the second argument), which happens in environments like editor extensions. To force the fallback, set the `PRETTIER_FALLBACK_RESOLVE` environment variable to `true`.
#### Revert [#7869](https://github.com/prettier/prettier/pull/7869), "[TypeScript] format TSAsExpression with same logic as BinaryExpression" ([#7958](https://github.com/prettier/prettier/pull/7958))
#### Fix `prettier-ignore` inside JSX ([#7877](https://github.com/prettier/prettier/pull/7877) by [@fisker](https://github.com/fisker))
<!-- prettier-ignore -->
```jsx
// Input
<div>
{
/* prettier-ignore */
x?<Y/>:<Z/>
}
</div>;
// Prettier 2.0.2 (first output)
<div>
{/* prettier-ignore */
x?<Y/>:<Z/>}
</div>;
// Prettier 2.0.2 (second output)
<div>{/* prettier-ignore */x?<Y/>:<Z/>}</div>;
// Prettier 2.0.3
<div>
{
/* prettier-ignore */
x?<Y/>:<Z/>
}
</div>;
```
#### Fix regressions in styled-components template literals ([#7883](https://github.com/prettier/prettier/pull/7883) by [@thorn0](https://github.com/thorn0))
<!-- prettier-ignore -->
```js
// Input
constIcon=styled.div`
background: var(--${background});
${Link}:not(:first-child) {
fill: rebeccapurple;
}
`;
// Prettier 2.0.2
constIcon=styled.div`
background: var(-- ${background});
${Link}:not (:first-child) {
fill: rebeccapurple;
}
`;
// Prettier 2.0.3
constIcon=styled.div`
background: var(--${background});
${Link}:not(:first-child) {
fill: rebeccapurple;
}
`;
```
#### Fix: line endings were not always converted properly in multiline strings and comments ([#7891](https://github.com/prettier/prettier/pull/7891) by [@sidharthv96](https://github.com/sidharthv96))
#### Print dangling comments for inexact object type ([#7892](https://github.com/prettier/prettier/pull/7892) by [@sosukesuzuki](https://github.com/sosukesuzuki))
#### Do not add comma for explicit inexact object with indexer property or no properties ([#7923](https://github.com/prettier/prettier/pull/7923) by [@DmitryGonchar](https://github.com/DmitryGonchar))
<!-- prettier-ignore -->
```jsx
// Input
typeT={
[string]:number,
...,
}
typeT={
// comment
...,
}
// Prettier 2.0.2
typeT={
[string]:number,
...,
}
typeT={
// comment
...,
}
// Prettier 2.0.3
typeT={
[string]:number,
...
}
typeT={
// comment
...
}
```
### HTML
#### Fix printing of ignored empty inline elements ([#7867](https://github.com/prettier/prettier/pull/7867) by [@fisker](https://github.com/fisker))
<!-- prettier-ignore -->
```html
<!-- Input-->
<!--prettier-ignore--><span></span>
<!--prettier-ignore--><span>_</span>
<!-- Prettier 2.0.2 (first output) -->
<!--prettier-ignore--><span
></span>
<!--prettier-ignore--><span>_</span>
<!-- Prettier 2.0.2 (second output) -->
<!--prettier-ignore--><span
></span>
<!--prettier-ignore--><span>_</span>
<!-- Prettier 2.0.3 -->
<!--prettier-ignore--><span></span>
<!--prettier-ignore--><span>_</span>
```
#### Format `script` and `style` inside tags with a colon in the name ([#7916](https://github.com/prettier/prettier/pull/7916) by [@fisker](https://github.com/fisker))
<!-- prettier-ignore -->
```html
<!-- Input -->
<with:colon>
<script>functionfoo(){return1}</script>
<style>a{color:#f00}</style>
</with:colon>
<!-- Prettier 2.0.2 -->
<with:colon>
<script>
functionfoo(){return1}
</script>
<style>
a{color:#f00}
</style>
</with:colon>
<!-- Prettier 2.0.3 -->
<with:colon>
<script>
functionfoo(){
return1;
}
</script>
<style>
a{
color:#f00;
}
</style>
</with:colon>
```
### Other changes
- Workaround for `require.resolve` in prettier-vscode ([#7951](https://github.com/prettier/prettier/pull/7951) by [@thorn0](https://github.com/thorn0))
- Fix unstable Angular expression binding ([#7924](https://github.com/prettier/prettier/pull/7924) by [@fisker](https://github.com/fisker))
- Update `isSCSS` regex ([#7922](https://github.com/prettier/prettier/pull/7922) by [@fisker](https://github.com/fisker))
- Fix formatting of empty files ([#7921](https://github.com/prettier/prettier/pull/7921) by [@fisker](https://github.com/fisker))
#### JavaScript: Fix formatting of pseudo-elements and pseudo-classes in styled-components template literals ([#7842](https://github.com/prettier/prettier/pull/7842) by [@thorn0](https://github.com/thorn0))
<!-- prettier-ignore -->
```jsx
// Input
constFoo=styled.div`
${media.smallDown}::before {}
`;
// Prettier 2.0.0
constFoo=styled.div`
${media.smallDown}: : before{
}
`;
// Prettier 2.0.2
constFoo=styled.div`
${media.smallDown}::before {
}
`;
```
#### TypeScript: Avoid trailing commas on index signatures with only one parameter ([#7836](https://github.com/prettier/prettier/pull/7836) by [@bakkot](https://github.com/bakkot))
TypeScript index signatures technically allow multiple parameters and trailing commas, but it's an error to have multiple parameters there, and Babel's TypeScript parser does not accept them. So Prettier now avoids putting a trailing comma there when you have only one parameter.
#### Revert "markdown: fix redundant leading spaces in markdown list" ([#7847](https://github.com/prettier/prettier/pull/7847))
See [#7846](https://github.com/prettier/prettier/issues/7846)
### Other changes
#### TypeScript: Fix `prettier-ignore` in union types ([#7798](https://github.com/prettier/prettier/pull/7798) by [@thorn0](https://github.com/thorn0))
#### API: Fix build script to not corrupt `import-fresh` module ([#7820](https://github.com/prettier/prettier/pull/7820) by [@thorn0](https://github.com/thorn0))
#### Fix formatting of union type as arrow function return type ([#6896](https://github.com/prettier/prettier/pull/6896) by [@thorn0](https://github.com/thorn0))
- TypeScript: Add trailing comma in tsx, only for arrow function ([#6190] by [@sosukesuzuki])
Prettier inserts a trailing comma to single type parameter for arrow functions in tsx, since v 1.18. But, this feature inserts a trailing comma to type parameter for besides arrow functions too (e.g, function , interface). This change fix it.
- Config: Match dotfiles in config overrides ([#6194] by [@duailibe])
When using [`overrides`](https://prettier.io/docs/en/configuration.html#configuration-overrides) in the config file, Prettier was not matching dotfiles (files that start with `.`). This was fixed in 1.18.1
- API: Fix `prettier.getSupportInfo()` reporting babel parser for older versions of Prettier. ([#5826] by [@azz])
In version `1.16.0` of Prettier, the `babylon` parser was renamed to `babel`. Unfortunately this lead to a minor breaking change: `prettier.getSupportInfo('1.15.0')` would report that it supported `babel`, not `babylon`, which breaks text-editor integrations. This has now been fixed.
- JavaScript: support `htm` ([#5565](https://github.com/prettier/prettier/pull/5565))
- JavaScript: support logical assignment operator ([#5489](https://github.com/prettier/prettier/pull/5489))
- JavaScript: do not add quotes for interpolation-only attributes in `html` templates ([#5544](https://github.com/prettier/prettier/pull/5544))
- JavaScript: add missing parenthesis for binary in optional member ([#5543](https://github.com/prettier/prettier/pull/5543))
- JavaScript: fix a parser regression ([#5530](https://github.com/prettier/prettier/pull/5530))
- JavaScript: improve union types with leading comments ([#5575](https://github.com/prettier/prettier/pull/5575))
- TypeScript: support BigInt ([#5546](https://github.com/prettier/prettier/pull/5546), [#5577](https://github.com/prettier/prettier/pull/5577))
- TypeScript: inline method decorators should stay inlined ([#5444](https://github.com/prettier/prettier/pull/5444))
- TypeScript: do not change `module` into `namespace` and break/hug their body correctly ([#5551](https://github.com/prettier/prettier/pull/5551))
- TypeScript: do not add invalid semicolon for construct in interface with `// prettier-ignore` ([#5469](https://github.com/prettier/prettier/pull/5469))
- HTML: do not touch comments ([#5525](https://github.com/prettier/prettier/pull/5525))
- HTML: support IE conditional start/end comment ([#5470](https://github.com/prettier/prettier/pull/5470))
- HTML: do not add extra indentation for js template in `<script>` ([#5527](https://github.com/prettier/prettier/pull/5527))
- HTML: leading spaces for the first interpolation in `<textarea>` are sensitive ([#5468](https://github.com/prettier/prettier/pull/5468))
- HTML: preserve content for element in `<pre>` correctly ([#5473](https://github.com/prettier/prettier/pull/5473))
- HTML: correct column for error code frame ([#5553](https://github.com/prettier/prettier/pull/5553))
- Angular: support interpolation in attributes ([#5573](https://github.com/prettier/prettier/pull/5573))
- Angular: do not print colon for `then` and `else` in `*ngIf` ([#5542](https://github.com/prettier/prettier/pull/5542))
- Angular/Vue: do not normalize tag/attribute names ([#5526](https://github.com/prettier/prettier/pull/5526), [#5549](https://github.com/prettier/prettier/pull/5549))
- Vue: remove unnecessary semicolon and preserve necessary semicolon for single expression in event bindings ([#5519](https://github.com/prettier/prettier/pull/5519))
- Vue: group `slot-scope` correctly ([#5563](https://github.com/prettier/prettier/pull/5563))
- Markdown: do not trim content in inline-math ([#5485](https://github.com/prettier/prettier/pull/5485))
- Markdown: add more category to CJK regex ([#5480](https://github.com/prettier/prettier/pull/5480))
- SCSS: update parser for performance improvements ([#5481](https://github.com/prettier/prettier/pull/5481))
- YAML: preserve the first document head end marker `---` ([#5502](https://github.com/prettier/prettier/pull/5502))
- API: resolve `ignored` field correctly in `.getFileInfo()` with absolute filePath ([#5570](https://github.com/prettier/prettier/pull/5570))
- API/CLI: fix a bug that caches for `.js` config files did not respect `.clearConfigCache()` ([#5558](https://github.com/prettier/prettier/pull/5558))
- API/CLI: ignore `unset` in `.editorconfig` ([#5550](https://github.com/prettier/prettier/pull/5550))
- CLI: report status code `0` for `--list-different` + `--write` ([#5512](https://github.com/prettier/prettier/pull/5512))
- Standalone: fix a regression for browser compatibility ([#5560](https://github.com/prettier/prettier/pull/5560))
- Fix a regression when printing `hasOwnProperty` and other functions in `Object`'s prototype ([#4603](https://github.com/prettier/prettier/pull/4603))