Skip to content

Commit 5f7957a

Browse files
authored
feat(shadcn): add new registry:file type (#6377)
* feat(shadcn): add new registry:file type * chore: add changeset * fix: file target
1 parent f07c7ad commit 5f7957a

6 files changed

Lines changed: 63 additions & 13 deletions

File tree

.changeset/swift-eyes-dress.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"shadcn": minor
3+
---
4+
5+
new registry:file type

apps/www/lib/registry.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ function getFileTarget(file: z.infer<typeof registryItemFileSchema>) {
157157
}
158158
}
159159

160-
return target
160+
return target ?? ""
161161
}
162162

163163
async function createTempSourceFile(filename: string) {

apps/www/public/registry.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414
"registry:ui",
1515
"registry:hook",
1616
"registry:theme",
17-
"registry:page"
17+
"registry:page",
18+
"registry:file"
1819
]
1920
},
2021
"description": {

apps/www/public/schema/registry-item.json

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414
"registry:ui",
1515
"registry:hook",
1616
"registry:theme",
17-
"registry:page"
17+
"registry:page",
18+
"registry:file"
1819
]
1920
},
2021
"description": {
@@ -64,14 +65,27 @@
6465
"registry:ui",
6566
"registry:hook",
6667
"registry:theme",
67-
"registry:page"
68+
"registry:page",
69+
"registry:file"
6870
]
6971
},
7072
"target": {
7173
"type": "string"
7274
}
7375
},
74-
"required": ["path", "type"]
76+
"if": {
77+
"properties": {
78+
"type": {
79+
"enum": ["registry:file", "registry:page"]
80+
}
81+
}
82+
},
83+
"then": {
84+
"required": ["path", "type", "target"]
85+
},
86+
"else": {
87+
"required": ["path", "type"]
88+
}
7589
}
7690
},
7791
"tailwind": {

packages/shadcn/src/registry/schema.ts

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,31 @@ export const registryItemTypeSchema = z.enum([
99
"registry:component",
1010
"registry:ui",
1111
"registry:hook",
12-
"registry:theme",
1312
"registry:page",
13+
"registry:file",
1414

1515
// Internal use only
16+
"registry:theme",
1617
"registry:example",
1718
"registry:style",
1819
"registry:internal",
1920
])
2021

21-
export const registryItemFileSchema = z.object({
22-
path: z.string(),
23-
content: z.string().optional(),
24-
type: registryItemTypeSchema,
25-
target: z.string().optional(),
26-
})
22+
export const registryItemFileSchema = z.discriminatedUnion("type", [
23+
// Target is required for registry:file and registry:page
24+
z.object({
25+
path: z.string(),
26+
content: z.string().optional(),
27+
type: z.enum(["registry:file", "registry:page"]),
28+
target: z.string(),
29+
}),
30+
z.object({
31+
path: z.string(),
32+
content: z.string().optional(),
33+
type: registryItemTypeSchema.exclude(["registry:file", "registry:page"]),
34+
target: z.string().optional(),
35+
}),
36+
])
2737

2838
export const registryItemTailwindSchema = z.object({
2939
config: z

packages/shadcn/test/utils/updaters/update-files.test.ts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ describe("resolveFilePath", () => {
7979
description: "should NOT use src directory for root files",
8080
file: {
8181
path: "hello-world/.env",
82-
type: "registry:lib",
82+
type: "registry:file",
8383
target: "~/.env",
8484
},
8585
resolvedPath: "/foo/bar/.env",
@@ -347,6 +347,26 @@ describe("resolveFilePath", () => {
347347
).toBe("/foo/bar/src/hooks/use-foo.ts")
348348
})
349349

350+
test("should resolve registry:file file types", () => {
351+
expect(
352+
resolveFilePath(
353+
{
354+
path: "hello-world/.env",
355+
type: "registry:file",
356+
target: "~/baz/.env",
357+
},
358+
{
359+
resolvedPaths: {
360+
cwd: "/foo/bar",
361+
},
362+
},
363+
{
364+
isSrcDir: false,
365+
}
366+
)
367+
).toBe("/foo/bar/baz/.env")
368+
})
369+
350370
test("should resolve nested files", () => {
351371
expect(
352372
resolveFilePath(

0 commit comments

Comments
 (0)