diff --git a/changelog_unreleased/flow/16268.md b/changelog_unreleased/flow/16268.md new file mode 100644 index 000000000..1f6270c09 --- /dev/null +++ b/changelog_unreleased/flow/16268.md @@ -0,0 +1,21 @@ +#### Support big int Flow Enums (#16268 by @gkz) + +Adds support for big int [Flow Enums](https://flow.org/en/docs/enums/). + + +```jsx +// Input +enum E { + A = 0n, + B = 1n, +} + +// Prettier stable +// error + +// Prettier main +enum E { + A = 0n, + B = 1n, +} +``` diff --git a/package.json b/package.json index 704ad9b27..deee7c39a 100644 --- a/package.json +++ b/package.json @@ -60,11 +60,11 @@ "fast-json-stable-stringify": "2.1.0", "file-entry-cache": "7.0.2", "find-cache-dir": "5.0.0", - "flow-parser": "0.233.0", + "flow-parser": "0.235.1", "get-east-asian-width": "1.2.0", "get-stdin": "9.0.0", "graphql": "16.8.1", - "hermes-parser": "0.20.1", + "hermes-parser": "0.21.0", "html-element-attributes": "3.4.0", "html-tag-names": "2.1.0", "html-ua-styles": "0.0.6", diff --git a/src/language-js/print/enum.js b/src/language-js/print/enum.js index 0390528c0..9e1f6d380 100644 --- a/src/language-js/print/enum.js +++ b/src/language-js/print/enum.js @@ -8,6 +8,7 @@ function printEnumMembers(path, print, options) { /* - `EnumBooleanMember`(flow) - `EnumNumberMember`(flow) +- `EnumBigIntMember`(flow) - `EnumStringMember`(flow) - `EnumDefaultedMember`(flow) - `TSEnumMember`(TypeScript) @@ -43,6 +44,7 @@ function printEnumMember(path, print) { /* - `EnumBooleanBody`(flow) - `EnumNumberBody`(flow) +- `EnumBigIntBody`(flow) - `EnumStringBody`(flow) - `EnumSymbolBody`(flow) */ @@ -58,6 +60,9 @@ function printEnumBody(path, print, options) { case "EnumNumberBody": type = "number"; break; + case "EnumBigIntBody": + type = "bigint"; + break; case "EnumStringBody": type = "string"; break; diff --git a/src/language-js/print/flow.js b/src/language-js/print/flow.js index 043569138..4565c5261 100644 --- a/src/language-js/print/flow.js +++ b/src/language-js/print/flow.js @@ -163,12 +163,14 @@ function printFlow(path, options, print) { case "EnumBooleanBody": case "EnumNumberBody": + case "EnumBigIntBody": case "EnumStringBody": case "EnumSymbolBody": return printEnumBody(path, print, options); case "EnumBooleanMember": case "EnumNumberMember": + case "EnumBigIntMember": case "EnumStringMember": case "EnumDefaultedMember": return printEnumMember(path, print); diff --git a/src/language-js/print/object.js b/src/language-js/print/object.js index 83f6e532e..0121440c9 100644 --- a/src/language-js/print/object.js +++ b/src/language-js/print/object.js @@ -35,6 +35,7 @@ function printObject(path, options, print) { node.type === "TSEnumDeclaration" || node.type === "EnumBooleanBody" || node.type === "EnumNumberBody" || + node.type === "EnumBigIntBody" || node.type === "EnumStringBody" || node.type === "EnumSymbolBody"; const fields = [ diff --git a/tests/format/flow/enums/__snapshots__/format.test.js.snap b/tests/format/flow/enums/__snapshots__/format.test.js.snap index 4acf0eb8d..aacb702ab 100644 --- a/tests/format/flow/enums/__snapshots__/format.test.js.snap +++ b/tests/format/flow/enums/__snapshots__/format.test.js.snap @@ -1,5 +1,79 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`enum-bigint-explicit.js - {"trailingComma":"all"} [babel-flow] format 1`] = ` +"Enum \`E\` has type \`bigint\`, so the initializer of \`A\` needs to be a bigint literal. (4:7) + 2 | + 3 | enum E of bigint { +> 4 | A = 0n, + | ^ + 5 | B = 1n, + 6 | } + 7 | +Cause: Enum \`E\` has type \`bigint\`, so the initializer of \`A\` needs to be a bigint literal. (4:6)" +`; + +exports[`enum-bigint-explicit.js - {"trailingComma":"all"} format 1`] = ` +====================================options===================================== +parsers: ["flow"] +printWidth: 80 +trailingComma: "all" + | printWidth +=====================================input====================================== +// @flow + +enum E of bigint { + A = 0n, + B = 1n, +} + +=====================================output===================================== +// @flow + +enum E of bigint { + A = 0n, + B = 1n, +} + +================================================================================ +`; + +exports[`enum-bigint-implicit.js - {"trailingComma":"all"} [babel-flow] format 1`] = ` +"The enum member initializer for \`A\` needs to be a literal (either a boolean, number, or string) in enum \`E\`. (4:7) + 2 | + 3 | enum E { +> 4 | A = 0n, + | ^ + 5 | B = 1n, + 6 | } + 7 | +Cause: The enum member initializer for \`A\` needs to be a literal (either a boolean, number, or string) in enum \`E\`. (4:6)" +`; + +exports[`enum-bigint-implicit.js - {"trailingComma":"all"} format 1`] = ` +====================================options===================================== +parsers: ["flow"] +printWidth: 80 +trailingComma: "all" + | printWidth +=====================================input====================================== +// @flow + +enum E { + A = 0n, + B = 1n, +} + +=====================================output===================================== +// @flow + +enum E { + A = 0n, + B = 1n, +} + +================================================================================ +`; + exports[`enum-boolean-explicit.js - {"trailingComma":"all"} format 1`] = ` ====================================options===================================== parsers: ["flow"] diff --git a/tests/format/flow/enums/enum-bigint-explicit.js b/tests/format/flow/enums/enum-bigint-explicit.js new file mode 100644 index 000000000..ee04cc411 --- /dev/null +++ b/tests/format/flow/enums/enum-bigint-explicit.js @@ -0,0 +1,6 @@ +// @flow + +enum E of bigint { + A = 0n, + B = 1n, +} diff --git a/tests/format/flow/enums/enum-bigint-implicit.js b/tests/format/flow/enums/enum-bigint-implicit.js new file mode 100644 index 000000000..00e0df6c2 --- /dev/null +++ b/tests/format/flow/enums/enum-bigint-implicit.js @@ -0,0 +1,6 @@ +// @flow + +enum E { + A = 0n, + B = 1n, +} diff --git a/tests/format/flow/enums/format.test.js b/tests/format/flow/enums/format.test.js index c4968a3fd..021a1b322 100644 --- a/tests/format/flow/enums/format.test.js +++ b/tests/format/flow/enums/format.test.js @@ -1 +1,6 @@ -runFormatTest(import.meta, ["flow"], { trailingComma: "all" }); +runFormatTest(import.meta, ["flow"], { + trailingComma: "all", + errors: { + "babel-flow": ["enum-bigint-explicit.js", "enum-bigint-implicit.js"], + }, +}); diff --git a/tests/unit/__snapshots__/visitor-keys.js.snap b/tests/unit/__snapshots__/visitor-keys.js.snap index 12eda1c5f..5727c1a17 100644 --- a/tests/unit/__snapshots__/visitor-keys.js.snap +++ b/tests/unit/__snapshots__/visitor-keys.js.snap @@ -267,6 +267,13 @@ exports[`visitor keys estree 1`] = ` ], "EmptyStatement": [], "EmptyTypeAnnotation": [], + "EnumBigIntBody": [ + "members", + ], + "EnumBigIntMember": [ + "id", + "init", + ], "EnumBooleanBody": [ "members", ], diff --git a/yarn.lock b/yarn.lock index f0d2fd862..81d19914d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4430,10 +4430,10 @@ __metadata: languageName: node linkType: hard -"flow-parser@npm:0.233.0": - version: 0.233.0 - resolution: "flow-parser@npm:0.233.0" - checksum: 10/a0c4b33f07da28fc5c41ae9b5ad014b298744001c66cb7042a6caa3aacaf50b1bd765a6446c05b396987fc9f2144f8e4490fae12f596d9f61ea0731aa7985f0c +"flow-parser@npm:0.235.1": + version: 0.235.1 + resolution: "flow-parser@npm:0.235.1" + checksum: 10/2c158e940deb2f3312dc91fe0890118295c6dc4823930cf18039bc6facd434504008a7b914a5a5be2f4d30274e0b31f8621d05417e5e4579e4df1f3fdd7cc949 languageName: node linkType: hard @@ -4818,19 +4818,19 @@ __metadata: languageName: node linkType: hard -"hermes-estree@npm:0.20.1": - version: 0.20.1 - resolution: "hermes-estree@npm:0.20.1" - checksum: 10/b98fc2943bd9fdd904c094e995f79cb7d5958393e221006af81d88f3aed52ddbf15138a6606766d5e6be7ba166576be65f577d0c72ae5eb0f3f56d4720b32baa +"hermes-estree@npm:0.21.0": + version: 0.21.0 + resolution: "hermes-estree@npm:0.21.0" + checksum: 10/2c978c9ed33555a7a70655f03b7cba3d2e477d8b64a97e00ffab86a076080d554ef5abba037d39e9d5604849cb3b6f13bd0242a6e75fd3cfe051cac180fa92fb languageName: node linkType: hard -"hermes-parser@npm:0.20.1": - version: 0.20.1 - resolution: "hermes-parser@npm:0.20.1" +"hermes-parser@npm:0.21.0": + version: 0.21.0 + resolution: "hermes-parser@npm:0.21.0" dependencies: - hermes-estree: "npm:0.20.1" - checksum: 10/b1ae9e9f6b49234fcf2bd45eafde140a3c727b8bcb845ab398016a538f040d326291d1f8b75fd91793b8817f2c600a890e251984d55bdedea74a5143d29f0c81 + hermes-estree: "npm:0.21.0" + checksum: 10/326054b7c8bbbb265df5ded508043f14cfa7cff405dd4ca0fc3564424c30248bc361a8e638b159c4e77821f1ba468e8fa34e197a34579bca86ef8cc7db85bb8e languageName: node linkType: hard @@ -7454,11 +7454,11 @@ __metadata: fast-json-stable-stringify: "npm:2.1.0" file-entry-cache: "npm:7.0.2" find-cache-dir: "npm:5.0.0" - flow-parser: "npm:0.233.0" + flow-parser: "npm:0.235.1" get-east-asian-width: "npm:1.2.0" get-stdin: "npm:9.0.0" graphql: "npm:16.8.1" - hermes-parser: "npm:0.20.1" + hermes-parser: "npm:0.21.0" html-element-attributes: "npm:3.4.0" html-tag-names: "npm:2.1.0" html-ua-styles: "npm:0.0.6"