diff --git a/changelog_unreleased/typescript/12508.md b/changelog_unreleased/typescript/12508.md new file mode 100644 index 000000000000..2113a7caa58a --- /dev/null +++ b/changelog_unreleased/typescript/12508.md @@ -0,0 +1,37 @@ +#### Fix non-idempotent formatting of function calls with complex type arguments (#12508 by @sosukesuzuki) + + +```tsx +// Input +const foo = + doSomething<{ foo1: "foo1", foo2: "foo2", foo3: "foo3", foo4: "foo4", foo5: "foo5" }>(); + +// Prettier stable (first) +const foo = + doSomething<{ + foo1: "foo1"; + foo2: "foo2"; + foo3: "foo3"; + foo4: "foo4"; + foo5: "foo5"; + }>(); + +// Prettier stable (second) +const foo = doSomething<{ + foo1: "foo1"; + foo2: "foo2"; + foo3: "foo3"; + foo4: "foo4"; + foo5: "foo5"; +}>(); + +// Prettier main +const foo = doSomething<{ + foo1: "foo1"; + foo2: "foo2"; + foo3: "foo3"; + foo4: "foo4"; + foo5: "foo5"; +}>(); + +``` diff --git a/src/language-js/print/assignment.js b/src/language-js/print/assignment.js index 972c2f58a2b7..5415b56af2aa 100644 --- a/src/language-js/print/assignment.js +++ b/src/language-js/print/assignment.js @@ -441,7 +441,9 @@ function isCallExpressionWithComplexTypeArguments(node, print) { firstArg.type === "TSUnionType" || firstArg.type === "UnionTypeAnnotation" || firstArg.type === "TSIntersectionType" || - firstArg.type === "IntersectionTypeAnnotation" + firstArg.type === "IntersectionTypeAnnotation" || + firstArg.type === "TSTypeLiteral" || + firstArg.type === "ObjectTypeAnnotation" ) { return true; } diff --git a/tests/format/flow/assignments/__snapshots__/jsfmt.spec.js.snap b/tests/format/flow/assignments/__snapshots__/jsfmt.spec.js.snap index d34376ab4ce1..39d340a96511 100644 --- a/tests/format/flow/assignments/__snapshots__/jsfmt.spec.js.snap +++ b/tests/format/flow/assignments/__snapshots__/jsfmt.spec.js.snap @@ -110,3 +110,52 @@ const map: Map> = new Map(); ================================================================================ `; + +exports[`issue-12413.js format 1`] = ` +====================================options===================================== +parsers: ["babel-flow", "flow"] +printWidth: 80 + | printWidth +=====================================input====================================== +let emit = + defineEmits<{ (event: "ready", canvas: HTMLCanvasElement): void; (event:"resize",canvas:HTMLCanvasElement):void; }>(); + +let abc = + func<{a:2,b:3,d:78,e:9,f:8,g:7,h:6,i:5,j:4,k:3,l:2,m:1,n:0,o:9,p:8,q:7,r:6,s:5,t:4,u:3,v:2,w:1,x:0,y:9,z:8}>(); + +=====================================output===================================== +let emit = defineEmits<{ + (event: "ready", canvas: HTMLCanvasElement): void, + (event: "resize", canvas: HTMLCanvasElement): void, +}>(); + +let abc = func<{ + a: 2, + b: 3, + d: 78, + e: 9, + f: 8, + g: 7, + h: 6, + i: 5, + j: 4, + k: 3, + l: 2, + m: 1, + n: 0, + o: 9, + p: 8, + q: 7, + r: 6, + s: 5, + t: 4, + u: 3, + v: 2, + w: 1, + x: 0, + y: 9, + z: 8, +}>(); + +================================================================================ +`; diff --git a/tests/format/flow/assignments/issue-12413.js b/tests/format/flow/assignments/issue-12413.js new file mode 100644 index 000000000000..9161eb5f648a --- /dev/null +++ b/tests/format/flow/assignments/issue-12413.js @@ -0,0 +1,5 @@ +let emit = + defineEmits<{ (event: "ready", canvas: HTMLCanvasElement): void; (event:"resize",canvas:HTMLCanvasElement):void; }>(); + +let abc = + func<{a:2,b:3,d:78,e:9,f:8,g:7,h:6,i:5,j:4,k:3,l:2,m:1,n:0,o:9,p:8,q:7,r:6,s:5,t:4,u:3,v:2,w:1,x:0,y:9,z:8}>(); diff --git a/tests/format/typescript/assignment/__snapshots__/jsfmt.spec.js.snap b/tests/format/typescript/assignment/__snapshots__/jsfmt.spec.js.snap index b2c3575e6232..be749c189365 100644 --- a/tests/format/typescript/assignment/__snapshots__/jsfmt.spec.js.snap +++ b/tests/format/typescript/assignment/__snapshots__/jsfmt.spec.js.snap @@ -443,6 +443,55 @@ const map: Map> = new Map(); ================================================================================ `; +exports[`issue-12413.ts format 1`] = ` +====================================options===================================== +parsers: ["typescript"] +printWidth: 80 + | printWidth +=====================================input====================================== +let emit = + defineEmits<{ (event: "ready", canvas: HTMLCanvasElement): void; (event:"resize",canvas:HTMLCanvasElement):void; }>(); + +let abc = + func<{a:2,b:3,d:78,e:9,f:8,g:7,h:6,i:5,j:4,k:3,l:2,m:1,n:0,o:9,p:8,q:7,r:6,s:5,t:4,u:3,v:2,w:1,x:0,y:9,z:8}>(); + +=====================================output===================================== +let emit = defineEmits<{ + (event: "ready", canvas: HTMLCanvasElement): void; + (event: "resize", canvas: HTMLCanvasElement): void; +}>(); + +let abc = func<{ + a: 2; + b: 3; + d: 78; + e: 9; + f: 8; + g: 7; + h: 6; + i: 5; + j: 4; + k: 3; + l: 2; + m: 1; + n: 0; + o: 9; + p: 8; + q: 7; + r: 6; + s: 5; + t: 4; + u: 3; + v: 2; + w: 1; + x: 0; + y: 9; + z: 8; +}>(); + +================================================================================ +`; + exports[`lone-arg.ts format 1`] = ` ====================================options===================================== parsers: ["typescript"] diff --git a/tests/format/typescript/assignment/issue-12413.ts b/tests/format/typescript/assignment/issue-12413.ts new file mode 100644 index 000000000000..9161eb5f648a --- /dev/null +++ b/tests/format/typescript/assignment/issue-12413.ts @@ -0,0 +1,5 @@ +let emit = + defineEmits<{ (event: "ready", canvas: HTMLCanvasElement): void; (event:"resize",canvas:HTMLCanvasElement):void; }>(); + +let abc = + func<{a:2,b:3,d:78,e:9,f:8,g:7,h:6,i:5,j:4,k:3,l:2,m:1,n:0,o:9,p:8,q:7,r:6,s:5,t:4,u:3,v:2,w:1,x:0,y:9,z:8}>();