From d9af4fb6c4795491b3fcc0400e53407327581347 Mon Sep 17 00:00:00 2001 From: sosukesuzuki Date: Wed, 4 Nov 2020 10:46:24 +0900 Subject: [PATCH 01/17] Generate draft via script --- website/blog/2020-11-04-2.2.0.md | 852 +++++++++++++++++++++++++++++++ 1 file changed, 852 insertions(+) create mode 100644 website/blog/2020-11-04-2.2.0.md diff --git a/website/blog/2020-11-04-2.2.0.md b/website/blog/2020-11-04-2.2.0.md new file mode 100644 index 000000000000..f64e0b3884ab --- /dev/null +++ b/website/blog/2020-11-04-2.2.0.md @@ -0,0 +1,852 @@ +--- +author: "🚧" +authorURL: "https://github.com/🚧" +title: "Prettier 🚧" +--- + +🚧 Write an introduction here. + + + +## Highlights + +### JavaScript + +#### Add `espree` parser ([#9000](https://github.com/prettier/prettier/pull/9000) by [@fisker](https://github.com/fisker)) + +A new value for the `parser` option has been added: [`espree`](https://github.com/eslint/espree) - which is the [`ESLint`](https://github.com/eslint/eslint) default parser. + +Note that `espree` only works for [ECMAScript Finished Proposals](https://github.com/tc39/proposals/blob/master/finished-proposals.md), and is stricter than the `babel` parser. + +### TypeScript + +#### Support TypeScript 4.1 via Babel ([#9473](https://github.com/prettier/prettier/pull/9473) by [@sosukesuzuki](https://github.com/sosukesuzuki)) + +`--parser=babel-ts` is required. + +##### Key Remapping In Mapped Types + +```ts +// Input +type MappedTypeWithNewKeys = { + [K in keyof T as NewKeyType]: T[K] +}; + +// Prettier 2.2 +SyntaxError: Unexpected token, expected "]" (2:17) + 1 | type MappedTypeWithNewKeys = { +> 2 | [K in keyof T as NewKeyType]: T[K] + | ^ + 3 | }; + +// Prettier 2.1 +type MappedTypeWithNewKeys = { + [K in keyof T as NewKeyType]: T[K] +}; +``` + +##### Template Literal Types + +```ts +// Input +type HelloWorld = `Hello, ${keyof World}` + +// Prettier 2.2 +SyntaxError: Unexpected token, expected "}" (1:35) +> 1 | type HelloWorld = `Hello, ${keyof World}` + | ^ + +// Prettier 2.1 +type HelloWorld = `Hello, ${keyof World}`; + +``` + +### API + +#### ESM standalone bundles ([#8983](https://github.com/prettier/prettier/pull/8983) by [@Monchi](https://github.com/Monchi), [@fisker](https://github.com/fisker)) + +Now standalone is also bundled as ESM. It works directly on browser. + +```js +import prettier from "https://unpkg.com/prettier/esm/standalone.mjs"; +import parserGraphql from "https://unpkg.com/prettier/esm/parser-graphql.mjs"; + +prettier.format("query { }", { + parser: "graphql", + plugins: [parserGraphql], +}); +``` + +## Other changes + +### JavaScript + +#### Respect spacing between template values in embedded CSS ([#9078](https://github.com/prettier/prettier/pull/9078) by [@sosukesuzuki](https://github.com/sosukesuzuki)) + + +```js +// Input +const style = css` + width: ${size}${sizeUnit}; +`; + +// Prettier 2.1 +const style = css` + width: ${size} ${sizeUnit}; +`; + +// Prettier 2.2 +const style = css` + width: ${size}${sizeUnit}; +`; + +``` + +#### Fix comments inside template ([#9278](https://github.com/prettier/prettier/pull/9278) by [@fisker](https://github.com/fisker)) + + +```js +// Input +html`${ + foo + /* comment */ +}`; +html` +${ + foo + /* comment */ +} +`; +graphql`${ + foo + /* comment */ +}`; +css`${ + foo + /* comment */ +}`; + +// Prettier 2.1 +html`${foo}`; +/* comment */ +html` + ${foo} + /* comment */ +`; +graphql` + ${foo} + /* comment */ +`; +css` + ${foo} + /* comment */ +`; + + +// Prettier 2.2 +html`${ + foo + /* comment */ +}`; +html` +${ + foo + /* comment */ +} +`; +graphql`${ + foo + /* comment */ +}`; +css`${ + foo + /* comment */ +}`; +``` + +#### Improve formatting for `AssignmentExpression` with `ClassExpression` that has a long super class ([#9341](https://github.com/prettier/prettier/pull/9341) by [@sosukesuzuki](https://github.com/sosukesuzuki)) + +This improves the formatting for [Google Closure Library Namespace](https://developers.google.com/closure/library/docs/introduction#names). + + +```js +// Input +aaaaaaaa.bbbbbbbb.cccccccc.dddddddd.eeeeeeee.ffffffff.gggggggg2 = class extends ( + aaaaaaaa.bbbbbbbb.cccccccc.dddddddd.eeeeeeee.ffffffff.gggggggg1 +) { + method () { + console.log("foo"); + } +}; + +// Prettier 2.1 +aaaaaaaa.bbbbbbbb.cccccccc.dddddddd.eeeeeeee.ffffffff.gggggggg2 = class extends aaaaaaaa + .bbbbbbbb.cccccccc.dddddddd.eeeeeeee.ffffffff.gggggggg1 { + method() { + console.log("foo"); + } +}; + +// Prettier 2.2 +aaaaaaaa.bbbbbbbb.cccccccc.dddddddd.eeeeeeee.ffffffff.gggggggg2 = class extends ( + aaaaaaaa.bbbbbbbb.cccccccc.dddddddd.eeeeeeee.ffffffff.gggggggg1 +) { + method() { + console.log("foo"); + } +}; + +``` + +#### Fix placing leading comments for a body of while statement ([#9345](https://github.com/prettier/prettier/pull/9345) by [@sosukesuzuki](https://github.com/sosukesuzuki)) + + +```js +// Input +while(1) // Comment + foo(); + +// Prettier 2.1 +while ( + 1 // Comment +) + foo(); + +// Prettier 2.2 +while (1) + // Comment + foo(); + +``` + +#### Update to `@babel/parser` 7.12 ([#9408](https://github.com/prettier/prettier/pull/9408), [#9476](https://github.com/prettier/prettier/pull/9476) by [@sosukesuzuki](https://github.com/sosukesuzuki)) + +Updated the JavaScript parser to [`@babel/parser` 7.12](https://babeljs.io/blog/2020/10/15/7.12.0). This fixes several bugs and supports some new syntax. + +##### Support Import Assertions + +[The "module attributes" proposal supported on 2.1](https://prettier.io/blog/2020/08/24/2.1.0.html#support-es-module-attributes-and-json-modules-8436httpsgithubcomprettierprettierpull8436-by-fiskerhttpsgithubcomfisker) has been significantly changed and also renamed to "import assertions". + +```js +import json from "./foo.json" assert { type: "json" }; +``` + +##### Support imports and exports with string names + + + +Due to a [bug in `@babel/parser`](https://github.com/babel/babel/issues/12209), Prettier can only use exports, but that will be fixed. + +```js +let happy = "happy"; +export { happy as "πŸ˜ƒ" }; +``` + +##### Support class static blocks + +```js +class C { + static #x = 42; + static y; + static { + try { + this.y = doSomethingWith(this.#x); + } catch { + this.y = "unknown"; + } + } +} +``` + +#### Keep html and markdown invalid template literals as it is ([#9431](https://github.com/prettier/prettier/pull/9431) by [@fisker](https://github.com/fisker)) + + +```js +// Input +foo = html`
\u{prettier}
`; +foo = html`\u{prettier}${foo}pr\u{0065}ttier`; +foo = markdown`# \u{prettier}\u{0065}`; + +// Prettier 2.1 +foo = html``; +foo = html`null${foo}prettier`; +foo = markdown` +# \u{prettier}\u{0065} +`; + +// Prettier 2.2 +foo = html`
\u{prettier}
`; +foo = html`\u{prettier}${foo}pr\u{0065}ttier`; +foo = markdown`# \u{prettier}\u{0065}`; +``` + +#### Fix `import {a as a}` and `export {a as a}` format ([#9435](https://github.com/prettier/prettier/pull/9435) by [@fisker](https://github.com/fisker)) + + +```js +// Input +import { a as a } from "a"; +export { b as b } from "b"; + +// Prettier 2.1 +import { a } from "a"; +export { b } from "b"; + +// Prettier 2.2 +import { a as a } from "a"; +export { b as b } from "b"; +``` + +### TypeScript + +#### Preserve a last separator for ignored object and interface types ([#9318](https://github.com/prettier/prettier/pull/9318) by [@sosukesuzuki](https://github.com/sosukesuzuki)) + + +```ts +// Input +let x: { + // prettier-ignore + y: z; +}; + +// Prettier 2.1 +let x: { + // prettier-ignore + y: z;; +}; + +// Prettier 2.2 +let x: { + // prettier-ignore + y: z; +}; +``` + +#### Add parens to object value that it's an assignment ([#9484](https://github.com/prettier/prettier/pull/9484) by [@fisker](https://github.com/fisker)) + + +```ts +// Input +foo = { bar: (a = b) }; + +// Prettier 2.2 +foo = { bar: a = b }; + +// Prettier 2.1 +foo = { bar: (a = b) }; +``` + +#### Fix inconsistent type format between `typescript` and `flow` ([#9521](https://github.com/prettier/prettier/pull/9521) by [@fisker](https://github.com/fisker)) + + +```ts +// Input +const name: SomeGeneric< + Pick +> = null; + +// Prettier 2.2 (--parser=typescript) +const name: SomeGeneric> = null; + +// Prettier 2.2 (--parser=flow) +const name: SomeGeneric< + Pick +> = null; + +// Prettier 2.1 (typescript and flow parser) +const name: SomeGeneric< + Pick +> = null; +``` + +### Flow + +#### Switch the `babel` parser to `babel-flow` if the `@flow` pragma is found ([#9071](https://github.com/prettier/prettier/pull/9071) by [@fisker](https://github.com/fisker)) + +In practice, this means that as long as your Flow files have the pragma, it's safe to use the `.js` extension for them. Prettier will correctly parse and print them without any additional configuration. Previously, the pragma was recognized by the parser, but there existed minor correctness issues with the printer. E.g. it's not safe to unquote number keys in Flow. + + +```jsx +// Input (with --parser babel) +// @flow +f({ "2": 2 }) + +// Prettier 2.1 +// @flow +f({ 2: 2 }); + +// Prettier 2.2 +// @flow +f({ "2": 2 }); +``` + +#### Flow Enums with unknown members ([#9432](https://github.com/prettier/prettier/pull/9432) by [@gkz](https://github.com/gkz)) + +Previously, was not supported. Now, the following is formatted: + + +```jsx +// Input +enum E { + A, + B, + ... +} + +// Prettier 2.1: parse error + +// Prettier 2.2 +enum E { + A, + B, + ... +} +``` + +#### Flow `this` annotations ([#9457](https://github.com/prettier/prettier/pull/9457) by [@dsainati1](https://github.com/dsainati1), [#9489](https://github.com/prettier/prettier/pull/9489) by [@fisker](https://github.com/fisker)) + +Add support for `this` parameter annotations in Flow. + + +```jsx +// Input +function f(this: string, a: number) { +} + +type T = (this: boolean, a: number) => boolean; + +// Prettier 2.1 +function f(this: string, a: number) {} + +type T = (a: number) => boolean; + +// Prettier 2.2 +function f(this: string, a: number) { +} + +type T = (this: boolean, a: number) => boolean; +``` + +#### Support `BigIntLiteralTypeAnnotation` and `BigIntTypeAnnotation` ([#9523](https://github.com/prettier/prettier/pull/9523) by [@fisker](https://github.com/fisker)) + +Add support for `BigIntLiteralTypeAnnotation` and `BigIntTypeAnnotation` in Flow. + + +```jsx +// Input +const foo: bigint = 1n; +const bar: baz<1n> = 1n; + +// Prettier 2.1 +Error: unknown type: "BigIntTypeAnnotation" + at ... + +// Prettier 2.2 +const foo: bigint = 1n; +const bar: baz<1n> = 1n; +``` + +#### Treat more types as "simple" type ([#9543](https://github.com/prettier/prettier/pull/9543) by [@fisker](https://github.com/fisker)) + + +```jsx +// Input +const foo1: Fooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo = a +const foo2: Fooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo<"STRING"> = a; +const foo3: Fooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo<0> = a; + +// Prettier 2.2 +const foo1: Fooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo< + symbol +> = a; +const foo2: Fooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo< + "STRING" +> = a; +const foo3: Fooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo< + 0 +> = a; + +// Prettier 2.1 (typescript and flow parser) +const foo1: Fooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo = a +const foo2: Fooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo<"STRING"> = a; +const foo3: Fooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo<0> = a; +``` + +#### Fix missing parentheses around `prettier-ignore`d type assertions ([#9553](https://github.com/prettier/prettier/pull/9553) by [@fisker](https://github.com/fisker)) + + +```jsx +// Input +transform( + // prettier-ignore + (pointTransformer: (Point => Point)) +); + +// Prettier 2.1 +transform( + // prettier-ignore + pointTransformer: (Point => Point) +); + +// Prettier 2.2 +transform( + // prettier-ignore + (pointTransformer: (Point => Point)) +); +``` + +#### Improve comment types detection ([#9563](https://github.com/prettier/prettier/pull/9563) by [@fisker](https://github.com/fisker)) + + +```jsx +// Input +foo/*::*/(baz); +class Foo { + bar( data: Array) {} +} + +// Prettier 2.2 +foo/*:: */(baz); +class Foo { + bar(data: Array/*:: */) {} +} + +// Prettier 2.1 +foo/*:: */(baz); +class Foo { + bar(data: Array) {} +} +``` + +### CSS + +#### Improve custom properties format ([#9209](https://github.com/prettier/prettier/pull/9209) by [@fisker](https://github.com/fisker)) + +Thanks to [`PostCSS 8.0`](https://github.com/postcss/postcss/releases/tag/8.0.0), we can handle these edge cases on custom properties. + + +```css +/* Input */ +:root { + --empty: ; + --JSON: [1, "2", {"three": {"a":1}}, [4]]; + --javascript: function(rule) { console.log(rule) }; +} + +@supports (--element(".minwidth", { "minWidth": 300 })) { + [--self] { + background: greenyellow; + } +} + +/* Prettier 2.1 */ +SyntaxError: (postcss) CssSyntaxError Missed semicolon (3:20) + 1 | :root { + 2 | --empty: ; +> 3 | --JSON: [1, "2", {"three": {"a":1}}, [4]]; + | ^ + 4 | --javascript: function(rule) { console.log(rule) }; + 5 | } + 6 | + +/* Prettier 2.2 */ +:root { + --empty: ; + --JSON: [1, "2", {"three": {"a": 1}}, [4]]; + --javascript: function(rule) {console.log(rule)}; +} + +@supports (--element(".minwidth", {"minWidth": 300})) { + [--self] { + background: greenyellow; + } +} +``` + +### Less + +#### Fix comments in value lists ([#9356](https://github.com/prettier/prettier/pull/9356) by [@thorn0](https://github.com/thorn0)) + + +```less +// Input +@test-space-separated: #aaaaaa // Start with A + #bbbbbb // then some B + #cccccc; // and round it out with C + +// Prettier 2.1 +@test-space-separated: #aaaaaa a // Start with + #bbbbbb b // then some + #cccccc; // and round it out with C + +// Prettier 2.2 +@test-space-separated: #aaaaaa // Start with A + #bbbbbb // then some B + #cccccc; // and round it out with C +``` + +### HTML + +#### Fix crash on reading `Node.sourceSpan` ([#9368](https://github.com/prettier/prettier/pull/9368) by [@fisker](https://github.com/fisker)) + + +```html + +a-b- + + +TypeError: Cannot read property 'line' of undefined + at forceNextEmptyLine ... + + +a-b- +``` + +### Vue + +#### Fix inconsistent `v-for` format ([#9225](https://github.com/prettier/prettier/pull/9225) by [@zweimach](https://github.com/zweimach)) + + +```vue + + + + + + + + +``` + +### Handlebars (alpha) + +#### Fix unstable newlines after `