From 9ad1c3d93e120628eca0297e8ad1918321c816fc Mon Sep 17 00:00:00 2001 From: Henry Dineen Date: Tue, 10 Dec 2024 10:17:04 -0500 Subject: [PATCH] fix(replaceType): handle array syntax --- transforms/__tests__/deprecated-react-child.js | 16 ++++++++++++++++ transforms/utils/replaceType.js | 12 ++++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/transforms/__tests__/deprecated-react-child.js b/transforms/__tests__/deprecated-react-child.js index 355e59a7..a8dd8447 100644 --- a/transforms/__tests__/deprecated-react-child.js +++ b/transforms/__tests__/deprecated-react-child.js @@ -121,3 +121,19 @@ test("as type parameter", () => { createAction()" `); }); + +test("array syntax", () => { + expect( + applyTransform(` + import { ReactChild } from 'react'; + interface Props { + children?: ReactChild[]; + } + `), + ).toMatchInlineSnapshot(` + "import { ReactElement } from 'react'; + interface Props { + children?: (ReactElement | number | string)[]; + }" + `); +}); diff --git a/transforms/utils/replaceType.js b/transforms/utils/replaceType.js index 712bcf50..f06e8994 100644 --- a/transforms/utils/replaceType.js +++ b/transforms/utils/replaceType.js @@ -113,8 +113,16 @@ function replaceReactType( }, ); for (const typeReferences of sourceIdentifierTypeReferences) { - const changedIdentifiers = typeReferences.replaceWith((path) => { - return buildTargetTypeReference(path.value); + const changedIdentifiers = typeReferences.forEach((path) => { + const targetNode = buildTargetTypeReference(path.value); + if ( + targetNode.type === "TSUnionType" && + path.parentPath.value.type === "TSArrayType" + ) { + path.replace(j.tsParenthesizedType(targetNode)); + } else { + path.replace(targetNode); + } }); if (changedIdentifiers.length > 0) { hasChanges = true;