diff --git a/changelog_unreleased/typescript/17650.md b/changelog_unreleased/typescript/17650.md new file mode 100644 index 000000000..2896ecabd --- /dev/null +++ b/changelog_unreleased/typescript/17650.md @@ -0,0 +1,15 @@ +#### Allow const without initializer (#17650 by @fisker) + + +```jsx +// Input +export const version: string; + +// Prettier stable (--parser=babel-ts) +SyntaxError: Unexpected token (1:21) +> 1 | export const version: string; + | ^ + +// Prettier main +export const version: string; +``` diff --git a/src/language-js/parse/babel.js b/src/language-js/parse/babel.js index fa6d993e5..aa51860d1 100644 --- a/src/language-js/parse/babel.js +++ b/src/language-js/parse/babel.js @@ -217,6 +217,16 @@ const allowedReasonCodes = new Set([ ``` */ "ImportAttributesUseAssert", + + /* + Allow const without initializer in `.d.ts` files + https://github.com/prettier/prettier/issues/17649 + + ``` + export const version: string; + ``` + */ + "DeclarationMissingInitializer", ]); const babelParserOptionsCombinations = [appendPlugins(["jsx"])]; diff --git a/tests/format/misc/errors/js/variable-declarator/__snapshots__/format.test.js.snap b/tests/format/misc/errors/js/variable-declarator/__snapshots__/format.test.js.snap index 37ddf0057..0ca39c408 100644 --- a/tests/format/misc/errors/js/variable-declarator/__snapshots__/format.test.js.snap +++ b/tests/format/misc/errors/js/variable-declarator/__snapshots__/format.test.js.snap @@ -1,4 +1,4 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing exports[`invalid-const.js [acorn] format 1`] = ` "Unexpected token (1:10) @@ -8,14 +8,6 @@ exports[`invalid-const.js [acorn] format 1`] = ` Cause: Unexpected token (1:9)" `; -exports[`invalid-const.js [babel] format 1`] = ` -"Missing initializer in const declaration. (1:10) -> 1 | const foo; - | ^ - 2 | -Cause: Missing initializer in const declaration. (1:9)" -`; - exports[`invalid-const.js [espree] format 1`] = ` "Unexpected token ; (1:10) > 1 | const foo; diff --git a/tests/format/misc/errors/js/variable-declarator/format.test.js b/tests/format/misc/errors/js/variable-declarator/format.test.js index 2ca3ea963..49cefd5cd 100644 --- a/tests/format/misc/errors/js/variable-declarator/format.test.js +++ b/tests/format/misc/errors/js/variable-declarator/format.test.js @@ -1 +1 @@ -runFormatTest(import.meta, ["babel", "acorn", "espree", "meriyah"]); +runFormatTest(import.meta, ["acorn", "espree", "meriyah"]); diff --git a/tests/format/misc/errors/typescript/modifiers/__snapshots__/format.test.js.snap b/tests/format/misc/errors/typescript/modifiers/__snapshots__/format.test.js.snap index c0cec6283..a0b03a9b1 100644 --- a/tests/format/misc/errors/typescript/modifiers/__snapshots__/format.test.js.snap +++ b/tests/format/misc/errors/typescript/modifiers/__snapshots__/format.test.js.snap @@ -1,4 +1,4 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing exports[`snippet: #0 [babel-ts] format 1`] = ` "'abstract' modifier cannot appear on a type member. (2:3) @@ -1069,10 +1069,10 @@ Cause: 'async' modifier cannot be used here." `; exports[`snippet: #60 [babel-ts] format 1`] = ` -"Missing initializer in const declaration. (1:16) +"Missing semicolon. (1:16) > 1 | const interface Foo {} | ^ -Cause: Missing initializer in const declaration. (1:15)" +Cause: Missing semicolon. (1:15)" `; exports[`snippet: #60 [typescript] format 1`] = ` @@ -1533,10 +1533,10 @@ Cause: 'async' modifier cannot be used here." `; exports[`snippet: #92 [babel-ts] format 1`] = ` -"Missing initializer in const declaration. (1:13) +"Missing semicolon. (1:13) > 1 | const module Foo {} | ^ -Cause: Missing initializer in const declaration. (1:12)" +Cause: Missing semicolon. (1:12)" `; exports[`snippet: #92 [typescript] format 1`] = ` @@ -1547,10 +1547,10 @@ Cause: ',' expected." `; exports[`snippet: #93 [babel-ts] format 1`] = ` -"Missing initializer in const declaration. (1:16) +"Missing semicolon. (1:16) > 1 | const namespace Foo {} | ^ -Cause: Missing initializer in const declaration. (1:15)" +Cause: Missing semicolon. (1:15)" `; exports[`snippet: #93 [typescript] format 1`] = ` diff --git a/tests/format/typescript/d-ts-files/__snapshots__/format.test.js.snap b/tests/format/typescript/d-ts-files/__snapshots__/format.test.js.snap new file mode 100644 index 000000000..5f9767219 --- /dev/null +++ b/tests/format/typescript/d-ts-files/__snapshots__/format.test.js.snap @@ -0,0 +1,49 @@ +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing + +exports[`const-without-initializer.d.ts [oxc-ts] format 1`] = ` +"Missing initializer in const declaration (1:17) +> 1 | export const version: string; + | ^^^^^^^^^^^^^^^ + 2 |" +`; + +exports[`const-without-initializer.d.ts format 1`] = ` +====================================options===================================== +parsers: ["typescript"] +printWidth: 80 + | printWidth +=====================================input====================================== +export const version: string; + +=====================================output===================================== +export const version: string; + +================================================================================ +`; + +exports[`const-without-initializer-in-namespace.d.ts [oxc-ts] format 1`] = ` +"Missing initializer in const declaration (2:12) + 1 | export namespace builders { +> 2 | const breakParent: string; + | ^^^^^^^^^^^^^^^^^^^ + 3 | } + 4 |" +`; + +exports[`const-without-initializer-in-namespace.d.ts format 1`] = ` +====================================options===================================== +parsers: ["typescript"] +printWidth: 80 + | printWidth +=====================================input====================================== +export namespace builders { + const breakParent: string; +} + +=====================================output===================================== +export namespace builders { + const breakParent: string; +} + +================================================================================ +`; diff --git a/tests/format/typescript/d-ts-files/const-without-initializer-in-namespace.d.ts b/tests/format/typescript/d-ts-files/const-without-initializer-in-namespace.d.ts new file mode 100644 index 000000000..6a3a1f34a --- /dev/null +++ b/tests/format/typescript/d-ts-files/const-without-initializer-in-namespace.d.ts @@ -0,0 +1,3 @@ +export namespace builders { + const breakParent: string; +} diff --git a/tests/format/typescript/d-ts-files/const-without-initializer.d.ts b/tests/format/typescript/d-ts-files/const-without-initializer.d.ts new file mode 100644 index 000000000..56ebe816e --- /dev/null +++ b/tests/format/typescript/d-ts-files/const-without-initializer.d.ts @@ -0,0 +1 @@ +export const version: string; diff --git a/tests/format/typescript/d-ts-files/format.test.js b/tests/format/typescript/d-ts-files/format.test.js new file mode 100644 index 000000000..23c95ac1d --- /dev/null +++ b/tests/format/typescript/d-ts-files/format.test.js @@ -0,0 +1,8 @@ +runFormatTest(import.meta, ["typescript"], { + errors: { + "oxc-ts": [ + "const-without-initializer.d.ts", + "const-without-initializer-in-namespace.d.ts", + ], + }, +});