Fix utils import transform when workspace alias does not start with @ (#7557)

* Fix nested src folder for utils import

* remove .only

* Update packages/shadcn/src/utils/transformers/transform-import.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* check for empty utils

* chore: changeset

---------

Co-authored-by: shadcn <m@shadcn.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
Tommy D. Rossi
2025-10-31 09:07:02 +01:00
committed by GitHub
parent befa56b5be
commit ad6a3c6367
4 changed files with 50 additions and 7 deletions

View File

@@ -0,0 +1,5 @@
---
"shadcn": patch
---
Fix utils import transform when workspace alias does not start with @

View File

@@ -7,8 +7,12 @@ export const transformImport: Transformer = async ({
config,
isRemote,
}) => {
const workspaceAlias = config.aliases?.utils?.split("/")[0]?.slice(1)
const utilsImport = `@${workspaceAlias}/lib/utils`
const utilsAlias = config.aliases?.utils
const workspaceAlias =
typeof utilsAlias === "string" && utilsAlias.includes("/")
? utilsAlias.split("/")[0]
: "@"
const utilsImport = `${workspaceAlias}/lib/utils`
if (![".tsx", ".ts", ".jsx", ".js"].includes(sourceFile.getExtension())) {
return sourceFile
@@ -31,7 +35,9 @@ export const transformImport: Transformer = async ({
?.getNamedImports()
.some((namedImport) => namedImport.getName() === "cn")
if (!isCnImport) continue
if (!isCnImport || !config.aliases.utils) {
continue
}
specifier.setLiteralValue(
utilsImport === updated

View File

@@ -70,7 +70,7 @@ import { Foo } from "bar"
import { Label} from "ui/label"
import { Box } from "~/src/components/box"
import { cn, foo, bar } from "~/lib/utils"
import { cn, foo, bar } from "~/lib"
import { bar } from "~/lib/utils/bar"
"
`;
@@ -82,7 +82,7 @@ import { Foo } from "bar"
import { Label} from "ui/label"
import { Box } from "~/src/components/box"
import { cn } from "~/lib/utils"
import { cn } from "~/src/utils"
import { bar } from "~/lib/utils/bar"
"
`;
@@ -94,7 +94,7 @@ import { Foo } from "bar"
import { Label} from "ui/label"
import { Box } from "~/src/components/box"
import { cn } from "~/lib/utils"
import { cn } from "~/src/utils"
import { bar } from "~/lib/utils/bar"
"
`;
@@ -106,7 +106,7 @@ import { Foo } from "bar"
import { Label} from "ui/label"
import { Box } from "~/src/components/box"
import { cn } from "~/lib/utils"
import { cn } from "~/src/utils"
import { bar } from "~/lib/utils/bar"
"
`;

View File

@@ -2,6 +2,38 @@ import { expect, test } from "vitest"
import { transform } from "../../src/utils/transformers"
test('transform nested workspace folder for utils, website/src/utils', async () => {
expect(
await transform({
filename: "test.ts",
raw: `import { Button } from "website/src/components/ui/button"
import { Box } from "website/src/components/box"
import { cn } from "website/src/utils"
`,
config: {
tsx: true,
tailwind: {
baseColor: "neutral",
cssVariables: true,
},
aliases: {
components: "website/src/components",
lib: "website/src/lib",
utils: "website/src/utils",
},
},
})
).toMatchInlineSnapshot(`
"import { Button } from "website/src/components/ui/button"
import { Box } from "website/src/components/box"
import { cn } from "website/src/utils"
"
`)
})
test("transform import", async () => {
expect(
await transform({