@beignet/cli 0.0.3 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/CHANGELOG.md +219 -0
  2. package/README.md +379 -61
  3. package/dist/ansi.d.ts +10 -0
  4. package/dist/ansi.d.ts.map +1 -0
  5. package/dist/ansi.js +20 -0
  6. package/dist/ansi.js.map +1 -0
  7. package/dist/choices.d.ts +49 -0
  8. package/dist/choices.d.ts.map +1 -0
  9. package/dist/choices.js +53 -0
  10. package/dist/choices.js.map +1 -0
  11. package/dist/completion.d.ts +47 -0
  12. package/dist/completion.d.ts.map +1 -0
  13. package/dist/completion.js +123 -0
  14. package/dist/completion.js.map +1 -0
  15. package/dist/config.d.ts +8 -0
  16. package/dist/config.d.ts.map +1 -1
  17. package/dist/config.js +8 -0
  18. package/dist/config.js.map +1 -1
  19. package/dist/create-prompts.d.ts +41 -0
  20. package/dist/create-prompts.d.ts.map +1 -0
  21. package/dist/create-prompts.js +78 -0
  22. package/dist/create-prompts.js.map +1 -0
  23. package/dist/create.d.ts +10 -5
  24. package/dist/create.d.ts.map +1 -1
  25. package/dist/create.js +28 -47
  26. package/dist/create.js.map +1 -1
  27. package/dist/db.d.ts +1 -0
  28. package/dist/db.d.ts.map +1 -1
  29. package/dist/db.js +37 -2
  30. package/dist/db.js.map +1 -1
  31. package/dist/github-annotations.d.ts +18 -0
  32. package/dist/github-annotations.d.ts.map +1 -0
  33. package/dist/github-annotations.js +22 -0
  34. package/dist/github-annotations.js.map +1 -0
  35. package/dist/index.d.ts +1 -9
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +665 -603
  38. package/dist/index.js.map +1 -1
  39. package/dist/inspect.d.ts +21 -2
  40. package/dist/inspect.d.ts.map +1 -1
  41. package/dist/inspect.js +1938 -131
  42. package/dist/inspect.js.map +1 -1
  43. package/dist/lib.d.ts +20 -0
  44. package/dist/lib.d.ts.map +1 -0
  45. package/dist/lib.js +17 -0
  46. package/dist/lib.js.map +1 -0
  47. package/dist/lint.d.ts +10 -1
  48. package/dist/lint.d.ts.map +1 -1
  49. package/dist/lint.js +340 -33
  50. package/dist/lint.js.map +1 -1
  51. package/dist/make.d.ts +20 -3
  52. package/dist/make.d.ts.map +1 -1
  53. package/dist/make.js +1896 -382
  54. package/dist/make.js.map +1 -1
  55. package/dist/outbox.d.ts +24 -0
  56. package/dist/outbox.d.ts.map +1 -0
  57. package/dist/outbox.js +138 -0
  58. package/dist/outbox.js.map +1 -0
  59. package/dist/schedule.d.ts +36 -0
  60. package/dist/schedule.d.ts.map +1 -0
  61. package/dist/schedule.js +155 -0
  62. package/dist/schedule.js.map +1 -0
  63. package/dist/task.d.ts +26 -0
  64. package/dist/task.d.ts.map +1 -0
  65. package/dist/task.js +106 -0
  66. package/dist/task.js.map +1 -0
  67. package/dist/templates/base.d.ts +13 -0
  68. package/dist/templates/base.d.ts.map +1 -0
  69. package/dist/templates/base.js +300 -0
  70. package/dist/templates/base.js.map +1 -0
  71. package/dist/templates/db.d.ts +14 -0
  72. package/dist/templates/db.d.ts.map +1 -0
  73. package/dist/templates/db.js +962 -0
  74. package/dist/templates/db.js.map +1 -0
  75. package/dist/templates/index.d.ts +14 -0
  76. package/dist/templates/index.d.ts.map +1 -0
  77. package/dist/templates/index.js +123 -0
  78. package/dist/templates/index.js.map +1 -0
  79. package/dist/templates/server.d.ts +26 -0
  80. package/dist/templates/server.d.ts.map +1 -0
  81. package/dist/templates/server.js +520 -0
  82. package/dist/templates/server.js.map +1 -0
  83. package/dist/templates/shadcn.d.ts +5 -0
  84. package/dist/templates/shadcn.d.ts.map +1 -0
  85. package/dist/templates/shadcn.js +555 -0
  86. package/dist/templates/shadcn.js.map +1 -0
  87. package/dist/templates/shared.d.ts +49 -0
  88. package/dist/templates/shared.d.ts.map +1 -0
  89. package/dist/templates/shared.js +57 -0
  90. package/dist/templates/shared.js.map +1 -0
  91. package/dist/templates/shell.d.ts +5 -0
  92. package/dist/templates/shell.d.ts.map +1 -0
  93. package/dist/templates/shell.js +1190 -0
  94. package/dist/templates/shell.js.map +1 -0
  95. package/dist/templates/todos.d.ts +17 -0
  96. package/dist/templates/todos.d.ts.map +1 -0
  97. package/dist/templates/todos.js +607 -0
  98. package/dist/templates/todos.js.map +1 -0
  99. package/dist/version.d.ts +8 -0
  100. package/dist/version.d.ts.map +1 -0
  101. package/dist/version.js +18 -0
  102. package/dist/version.js.map +1 -0
  103. package/package.json +9 -8
  104. package/src/ansi.ts +30 -0
  105. package/src/choices.ts +83 -0
  106. package/src/completion.ts +169 -0
  107. package/src/config.ts +16 -0
  108. package/src/create-prompts.ts +114 -0
  109. package/src/create.ts +40 -64
  110. package/src/db.ts +60 -4
  111. package/src/github-annotations.ts +37 -0
  112. package/src/index.ts +1075 -817
  113. package/src/inspect.ts +2859 -115
  114. package/src/lib.ts +45 -0
  115. package/src/lint.ts +493 -39
  116. package/src/make.ts +2389 -406
  117. package/src/outbox.ts +249 -0
  118. package/src/schedule.ts +272 -0
  119. package/src/task.ts +169 -0
  120. package/src/templates/base.ts +377 -0
  121. package/src/templates/db.ts +963 -0
  122. package/src/templates/index.ts +148 -0
  123. package/src/templates/server.ts +528 -0
  124. package/src/templates/shadcn.ts +570 -0
  125. package/src/templates/shared.ts +90 -0
  126. package/src/templates/shell.ts +1219 -0
  127. package/src/templates/todos.ts +607 -0
  128. package/src/version.ts +20 -0
  129. package/dist/create-bin.d.ts +0 -3
  130. package/dist/create-bin.d.ts.map +0 -1
  131. package/dist/create-bin.js +0 -9
  132. package/dist/create-bin.js.map +0 -1
  133. package/dist/templates.d.ts +0 -55
  134. package/dist/templates.d.ts.map +0 -1
  135. package/dist/templates.js +0 -3520
  136. package/dist/templates.js.map +0 -1
  137. package/src/create-bin.ts +0 -11
  138. package/src/templates.ts +0 -3774
@@ -0,0 +1,555 @@
1
+ /**
2
+ * shadcn UI stack for generated apps: Tailwind v4 wiring, the radix-nova
3
+ * design tokens, the `cn` helper, and the ui primitives the starter shell
4
+ * uses.
5
+ *
6
+ * The config, tokens, and most primitives are vendored byte-identically from
7
+ * `apps/example-twitter-clone` (shadcn style "radix-nova"), which is the
8
+ * repo's source of truth for this stack. `checkbox` and `label` are ported
9
+ * from the radix-nova registry following the same conventions.
10
+ */
11
+ const postcssConfig = `const config = {
12
+ plugins: {
13
+ "@tailwindcss/postcss": {},
14
+ },
15
+ };
16
+
17
+ export default config;
18
+ `;
19
+ const componentsJson = `{
20
+ "$schema": "https://ui.shadcn.com/schema.json",
21
+ "style": "radix-nova",
22
+ "rsc": true,
23
+ "tsx": true,
24
+ "tailwind": {
25
+ "config": "",
26
+ "css": "app/globals.css",
27
+ "baseColor": "neutral",
28
+ "cssVariables": true,
29
+ "prefix": ""
30
+ },
31
+ "iconLibrary": "lucide",
32
+ "rtl": false,
33
+ "aliases": {
34
+ "components": "@/components",
35
+ "utils": "@/lib/utils",
36
+ "ui": "@/components/ui",
37
+ "lib": "@/lib",
38
+ "hooks": "@/hooks"
39
+ },
40
+ "menuColor": "default",
41
+ "menuAccent": "subtle",
42
+ "registries": {}
43
+ }
44
+ `;
45
+ const libUtils = `import { type ClassValue, clsx } from "clsx";
46
+ import { twMerge } from "tailwind-merge";
47
+
48
+ export function cn(...inputs: ClassValue[]) {
49
+ return twMerge(clsx(inputs));
50
+ }
51
+ `;
52
+ const appGlobalsCss = `@import "tailwindcss";
53
+ @import "tw-animate-css";
54
+ @import "shadcn/tailwind.css";
55
+
56
+ @custom-variant dark (&:is(.dark *));
57
+
58
+ :root {
59
+ --background: oklch(1 0 0);
60
+ --foreground: oklch(0.145 0 0);
61
+ --card: oklch(1 0 0);
62
+ --card-foreground: oklch(0.145 0 0);
63
+ --popover: oklch(1 0 0);
64
+ --popover-foreground: oklch(0.145 0 0);
65
+ --primary: oklch(0.145 0 0);
66
+ --primary-foreground: oklch(1 0 0);
67
+ --secondary: oklch(0.967 0.001 286.375);
68
+ --secondary-foreground: oklch(0.21 0.006 285.885);
69
+ --muted: oklch(0.97 0 0);
70
+ --muted-foreground: oklch(0.556 0 0);
71
+ --accent: oklch(0.97 0 0);
72
+ --accent-foreground: oklch(0.205 0 0);
73
+ --destructive: oklch(0.577 0.245 27.325);
74
+ --border: oklch(0.922 0 0);
75
+ --input: oklch(0.922 0 0);
76
+ --ring: oklch(0.708 0 0);
77
+ --chart-1: oklch(0.87 0 0);
78
+ --chart-2: oklch(0.556 0 0);
79
+ --chart-3: oklch(0.439 0 0);
80
+ --chart-4: oklch(0.371 0 0);
81
+ --chart-5: oklch(0.269 0 0);
82
+ --radius: 0.625rem;
83
+ --sidebar: oklch(0.985 0 0);
84
+ --sidebar-foreground: oklch(0.145 0 0);
85
+ --sidebar-primary: oklch(0.145 0 0);
86
+ --sidebar-primary-foreground: oklch(1 0 0);
87
+ --sidebar-accent: oklch(0.97 0 0);
88
+ --sidebar-accent-foreground: oklch(0.205 0 0);
89
+ --sidebar-border: oklch(0.922 0 0);
90
+ --sidebar-ring: oklch(0.708 0 0);
91
+ }
92
+
93
+ @theme inline {
94
+ --font-heading: var(--font-sans);
95
+ --font-sans: var(--font-sans);
96
+ --color-sidebar-ring: var(--sidebar-ring);
97
+ --color-sidebar-border: var(--sidebar-border);
98
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
99
+ --color-sidebar-accent: var(--sidebar-accent);
100
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
101
+ --color-sidebar-primary: var(--sidebar-primary);
102
+ --color-sidebar-foreground: var(--sidebar-foreground);
103
+ --color-sidebar: var(--sidebar);
104
+ --color-chart-5: var(--chart-5);
105
+ --color-chart-4: var(--chart-4);
106
+ --color-chart-3: var(--chart-3);
107
+ --color-chart-2: var(--chart-2);
108
+ --color-chart-1: var(--chart-1);
109
+ --color-ring: var(--ring);
110
+ --color-input: var(--input);
111
+ --color-border: var(--border);
112
+ --color-destructive: var(--destructive);
113
+ --color-accent-foreground: var(--accent-foreground);
114
+ --color-accent: var(--accent);
115
+ --color-muted-foreground: var(--muted-foreground);
116
+ --color-muted: var(--muted);
117
+ --color-secondary-foreground: var(--secondary-foreground);
118
+ --color-secondary: var(--secondary);
119
+ --color-primary-foreground: var(--primary-foreground);
120
+ --color-primary: var(--primary);
121
+ --color-popover-foreground: var(--popover-foreground);
122
+ --color-popover: var(--popover);
123
+ --color-card-foreground: var(--card-foreground);
124
+ --color-card: var(--card);
125
+ --color-foreground: var(--foreground);
126
+ --color-background: var(--background);
127
+ --radius-sm: calc(var(--radius) * 0.6);
128
+ --radius-md: calc(var(--radius) * 0.8);
129
+ --radius-lg: var(--radius);
130
+ --radius-xl: calc(var(--radius) * 1.4);
131
+ --radius-2xl: calc(var(--radius) * 1.8);
132
+ --radius-3xl: calc(var(--radius) * 2.2);
133
+ --radius-4xl: calc(var(--radius) * 2.6);
134
+ }
135
+
136
+ .dark {
137
+ --background: oklch(0.145 0 0);
138
+ --foreground: oklch(0.985 0 0);
139
+ --card: oklch(0.205 0 0);
140
+ --card-foreground: oklch(0.985 0 0);
141
+ --popover: oklch(0.205 0 0);
142
+ --popover-foreground: oklch(0.985 0 0);
143
+ --primary: oklch(0.985 0 0);
144
+ --primary-foreground: oklch(0.145 0 0);
145
+ --secondary: oklch(0.274 0.006 286.033);
146
+ --secondary-foreground: oklch(0.985 0 0);
147
+ --muted: oklch(0.269 0 0);
148
+ --muted-foreground: oklch(0.708 0 0);
149
+ --accent: oklch(0.269 0 0);
150
+ --accent-foreground: oklch(0.985 0 0);
151
+ --destructive: oklch(0.704 0.191 22.216);
152
+ --border: oklch(1 0 0 / 10%);
153
+ --input: oklch(1 0 0 / 15%);
154
+ --ring: oklch(0.556 0 0);
155
+ --chart-1: oklch(0.87 0 0);
156
+ --chart-2: oklch(0.556 0 0);
157
+ --chart-3: oklch(0.439 0 0);
158
+ --chart-4: oklch(0.371 0 0);
159
+ --chart-5: oklch(0.269 0 0);
160
+ --sidebar: oklch(0.205 0 0);
161
+ --sidebar-foreground: oklch(0.985 0 0);
162
+ --sidebar-primary: oklch(0.985 0 0);
163
+ --sidebar-primary-foreground: oklch(0.145 0 0);
164
+ --sidebar-accent: oklch(0.269 0 0);
165
+ --sidebar-accent-foreground: oklch(0.985 0 0);
166
+ --sidebar-border: oklch(1 0 0 / 10%);
167
+ --sidebar-ring: oklch(0.556 0 0);
168
+ }
169
+
170
+ @layer base {
171
+ * {
172
+ @apply border-border outline-ring/50;
173
+ }
174
+ body {
175
+ @apply bg-background text-foreground;
176
+ }
177
+ html {
178
+ @apply font-sans;
179
+ }
180
+ }
181
+ `;
182
+ const uiButton = `import { cva, type VariantProps } from "class-variance-authority";
183
+ import { Slot } from "radix-ui";
184
+ import type * as React from "react";
185
+
186
+ import { cn } from "@/lib/utils";
187
+
188
+ const buttonVariants = cva(
189
+ "group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
190
+ {
191
+ variants: {
192
+ variant: {
193
+ default: "bg-primary text-primary-foreground [a]:hover:bg-primary/80",
194
+ outline:
195
+ "border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",
196
+ secondary:
197
+ "bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",
198
+ ghost:
199
+ "hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",
200
+ destructive:
201
+ "bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",
202
+ link: "text-primary underline-offset-4 hover:underline",
203
+ },
204
+ size: {
205
+ default:
206
+ "h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
207
+ xs: "h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",
208
+ sm: "h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",
209
+ lg: "h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
210
+ icon: "size-8",
211
+ "icon-xs":
212
+ "size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3",
213
+ "icon-sm":
214
+ "size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg",
215
+ "icon-lg": "size-9",
216
+ },
217
+ },
218
+ defaultVariants: {
219
+ variant: "default",
220
+ size: "default",
221
+ },
222
+ },
223
+ );
224
+
225
+ function Button({
226
+ className,
227
+ variant = "default",
228
+ size = "default",
229
+ asChild = false,
230
+ ...props
231
+ }: React.ComponentProps<"button"> &
232
+ VariantProps<typeof buttonVariants> & {
233
+ asChild?: boolean;
234
+ }) {
235
+ const Comp = asChild ? Slot.Root : "button";
236
+
237
+ return (
238
+ <Comp
239
+ data-slot="button"
240
+ data-variant={variant}
241
+ data-size={size}
242
+ className={cn(buttonVariants({ variant, size, className }))}
243
+ {...props}
244
+ />
245
+ );
246
+ }
247
+
248
+ export { Button, buttonVariants };
249
+ `;
250
+ const uiCard = `import type * as React from "react";
251
+
252
+ import { cn } from "@/lib/utils";
253
+
254
+ function Card({
255
+ className,
256
+ size = "default",
257
+ ...props
258
+ }: React.ComponentProps<"div"> & { size?: "default" | "sm" }) {
259
+ return (
260
+ <div
261
+ data-slot="card"
262
+ data-size={size}
263
+ className={cn(
264
+ "group/card flex flex-col gap-4 overflow-hidden rounded-xl bg-card py-4 text-sm text-card-foreground ring-1 ring-foreground/10 has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:gap-3 data-[size=sm]:py-3 data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl",
265
+ className,
266
+ )}
267
+ {...props}
268
+ />
269
+ );
270
+ }
271
+
272
+ function CardHeader({ className, ...props }: React.ComponentProps<"div">) {
273
+ return (
274
+ <div
275
+ data-slot="card-header"
276
+ className={cn(
277
+ "group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-t-xl px-4 group-data-[size=sm]/card:px-3 has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-4 group-data-[size=sm]/card:[.border-b]:pb-3",
278
+ className,
279
+ )}
280
+ {...props}
281
+ />
282
+ );
283
+ }
284
+
285
+ function CardTitle({ className, ...props }: React.ComponentProps<"div">) {
286
+ return (
287
+ <div
288
+ data-slot="card-title"
289
+ className={cn(
290
+ "font-heading text-base leading-snug font-medium group-data-[size=sm]/card:text-sm",
291
+ className,
292
+ )}
293
+ {...props}
294
+ />
295
+ );
296
+ }
297
+
298
+ function CardDescription({ className, ...props }: React.ComponentProps<"div">) {
299
+ return (
300
+ <div
301
+ data-slot="card-description"
302
+ className={cn("text-sm text-muted-foreground", className)}
303
+ {...props}
304
+ />
305
+ );
306
+ }
307
+
308
+ function CardAction({ className, ...props }: React.ComponentProps<"div">) {
309
+ return (
310
+ <div
311
+ data-slot="card-action"
312
+ className={cn(
313
+ "col-start-2 row-span-2 row-start-1 self-start justify-self-end",
314
+ className,
315
+ )}
316
+ {...props}
317
+ />
318
+ );
319
+ }
320
+
321
+ function CardContent({ className, ...props }: React.ComponentProps<"div">) {
322
+ return (
323
+ <div
324
+ data-slot="card-content"
325
+ className={cn("px-4 group-data-[size=sm]/card:px-3", className)}
326
+ {...props}
327
+ />
328
+ );
329
+ }
330
+
331
+ function CardFooter({ className, ...props }: React.ComponentProps<"div">) {
332
+ return (
333
+ <div
334
+ data-slot="card-footer"
335
+ className={cn(
336
+ "flex items-center rounded-b-xl border-t bg-muted/50 p-4 group-data-[size=sm]/card:p-3",
337
+ className,
338
+ )}
339
+ {...props}
340
+ />
341
+ );
342
+ }
343
+
344
+ export {
345
+ Card,
346
+ CardAction,
347
+ CardContent,
348
+ CardDescription,
349
+ CardFooter,
350
+ CardHeader,
351
+ CardTitle,
352
+ };
353
+ `;
354
+ const uiCheckbox = `"use client";
355
+
356
+ import { CheckIcon } from "lucide-react";
357
+ import { Checkbox as CheckboxPrimitive } from "radix-ui";
358
+ import type * as React from "react";
359
+
360
+ import { cn } from "@/lib/utils";
361
+
362
+ function Checkbox({
363
+ className,
364
+ ...props
365
+ }: React.ComponentProps<typeof CheckboxPrimitive.Root>) {
366
+ return (
367
+ <CheckboxPrimitive.Root
368
+ data-slot="checkbox"
369
+ className={cn(
370
+ "peer relative flex size-4 shrink-0 items-center justify-center rounded-[4px] border border-input transition-colors outline-none group-has-disabled/field:opacity-50 after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 aria-invalid:aria-checked:border-primary dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:border-primary data-checked:bg-primary data-checked:text-primary-foreground dark:data-checked:bg-primary",
371
+ className,
372
+ )}
373
+ {...props}
374
+ >
375
+ <CheckboxPrimitive.Indicator
376
+ data-slot="checkbox-indicator"
377
+ className="grid place-content-center text-current transition-none [&>svg]:size-3.5"
378
+ >
379
+ <CheckIcon />
380
+ </CheckboxPrimitive.Indicator>
381
+ </CheckboxPrimitive.Root>
382
+ );
383
+ }
384
+
385
+ export { Checkbox };
386
+ `;
387
+ const uiDropdownMenu = `"use client";
388
+
389
+ import { DropdownMenu as DropdownMenuPrimitive } from "radix-ui";
390
+ import type * as React from "react";
391
+ import { cn } from "@/lib/utils";
392
+
393
+ function DropdownMenu({
394
+ ...props
395
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {
396
+ return <DropdownMenuPrimitive.Root data-slot="dropdown-menu" {...props} />;
397
+ }
398
+
399
+ function DropdownMenuTrigger({
400
+ ...props
401
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {
402
+ return (
403
+ <DropdownMenuPrimitive.Trigger
404
+ data-slot="dropdown-menu-trigger"
405
+ {...props}
406
+ />
407
+ );
408
+ }
409
+
410
+ function DropdownMenuContent({
411
+ className,
412
+ sideOffset = 6,
413
+ ...props
414
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {
415
+ return (
416
+ <DropdownMenuPrimitive.Portal>
417
+ <DropdownMenuPrimitive.Content
418
+ data-slot="dropdown-menu-content"
419
+ sideOffset={sideOffset}
420
+ className={cn(
421
+ "z-50 min-w-40 rounded-xl border border-border bg-popover p-1 text-popover-foreground text-sm shadow-lg outline-none data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95",
422
+ className,
423
+ )}
424
+ {...props}
425
+ />
426
+ </DropdownMenuPrimitive.Portal>
427
+ );
428
+ }
429
+
430
+ function DropdownMenuItem({
431
+ className,
432
+ ...props
433
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Item>) {
434
+ return (
435
+ <DropdownMenuPrimitive.Item
436
+ data-slot="dropdown-menu-item"
437
+ className={cn(
438
+ "relative flex cursor-default select-none items-center gap-2 rounded-lg px-2 py-2 outline-none focus:bg-muted disabled:pointer-events-none disabled:opacity-50",
439
+ className,
440
+ )}
441
+ {...props}
442
+ />
443
+ );
444
+ }
445
+
446
+ export {
447
+ DropdownMenu,
448
+ DropdownMenuContent,
449
+ DropdownMenuItem,
450
+ DropdownMenuTrigger,
451
+ };
452
+ `;
453
+ const uiInput = `import type * as React from "react";
454
+
455
+ import { cn } from "@/lib/utils";
456
+
457
+ function Input({ className, type, ...props }: React.ComponentProps<"input">) {
458
+ return (
459
+ <input
460
+ type={type}
461
+ data-slot="input"
462
+ className={cn(
463
+ "h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",
464
+ className,
465
+ )}
466
+ {...props}
467
+ />
468
+ );
469
+ }
470
+
471
+ export { Input };
472
+ `;
473
+ const uiLabel = `"use client";
474
+
475
+ import { Label as LabelPrimitive } from "radix-ui";
476
+ import type * as React from "react";
477
+
478
+ import { cn } from "@/lib/utils";
479
+
480
+ function Label({
481
+ className,
482
+ ...props
483
+ }: React.ComponentProps<typeof LabelPrimitive.Root>) {
484
+ return (
485
+ <LabelPrimitive.Root
486
+ data-slot="label"
487
+ className={cn(
488
+ "flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",
489
+ className,
490
+ )}
491
+ {...props}
492
+ />
493
+ );
494
+ }
495
+
496
+ export { Label };
497
+ `;
498
+ const uiSeparator = `"use client";
499
+
500
+ import { Separator as SeparatorPrimitive } from "radix-ui";
501
+ import type * as React from "react";
502
+
503
+ import { cn } from "@/lib/utils";
504
+
505
+ function Separator({
506
+ className,
507
+ orientation = "horizontal",
508
+ decorative = true,
509
+ ...props
510
+ }: React.ComponentProps<typeof SeparatorPrimitive.Root>) {
511
+ return (
512
+ <SeparatorPrimitive.Root
513
+ data-slot="separator"
514
+ decorative={decorative}
515
+ orientation={orientation}
516
+ className={cn(
517
+ "shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch",
518
+ className,
519
+ )}
520
+ {...props}
521
+ />
522
+ );
523
+ }
524
+
525
+ export { Separator };
526
+ `;
527
+ export function shadcnTemplateFiles() {
528
+ return [
529
+ { path: "postcss.config.mjs", content: postcssConfig },
530
+ { path: "components.json", content: componentsJson },
531
+ { path: "lib/utils.ts", content: libUtils },
532
+ { path: "app/globals.css", content: appGlobalsCss },
533
+ { path: "components/ui/button.tsx", content: uiButton },
534
+ { path: "components/ui/card.tsx", content: uiCard },
535
+ { path: "components/ui/checkbox.tsx", content: uiCheckbox },
536
+ { path: "components/ui/dropdown-menu.tsx", content: uiDropdownMenu },
537
+ { path: "components/ui/input.tsx", content: uiInput },
538
+ { path: "components/ui/label.tsx", content: uiLabel },
539
+ { path: "components/ui/separator.tsx", content: uiSeparator },
540
+ ];
541
+ }
542
+ export const shadcnDependencies = {
543
+ "class-variance-authority": "^0.7.1",
544
+ clsx: "^2.1.1",
545
+ "lucide-react": "^1.16.0",
546
+ "radix-ui": "^1.4.3",
547
+ shadcn: "^4.7.0",
548
+ "tailwind-merge": "^3.6.0",
549
+ "tw-animate-css": "^1.4.0",
550
+ };
551
+ export const shadcnDevDependencies = {
552
+ "@tailwindcss/postcss": "^4.3.0",
553
+ tailwindcss: "^4.3.0",
554
+ };
555
+ //# sourceMappingURL=shadcn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shadcn.js","sourceRoot":"","sources":["../../src/templates/shadcn.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AAEH,MAAM,aAAa,GAAG;;;;;;;CAOrB,CAAC;AAEF,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;CAyBtB,CAAC;AAEF,MAAM,QAAQ,GAAG;;;;;;CAMhB,CAAC;AAEF,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiIrB,CAAC;AAEF,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmEhB,CAAC;AAEF,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuGd,CAAC;AAEF,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgClB,CAAC;AAEF,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiEtB,CAAC;AAEF,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;CAmBf,CAAC;AAEF,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;CAwBf,CAAC;AAEF,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BnB,CAAC;AAEF,MAAM,UAAU,mBAAmB;IACjC,OAAO;QACL,EAAE,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,aAAa,EAAE;QACtD,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,cAAc,EAAE;QACpD,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,QAAQ,EAAE;QAC3C,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,aAAa,EAAE;QACnD,EAAE,IAAI,EAAE,0BAA0B,EAAE,OAAO,EAAE,QAAQ,EAAE;QACvD,EAAE,IAAI,EAAE,wBAAwB,EAAE,OAAO,EAAE,MAAM,EAAE;QACnD,EAAE,IAAI,EAAE,4BAA4B,EAAE,OAAO,EAAE,UAAU,EAAE;QAC3D,EAAE,IAAI,EAAE,iCAAiC,EAAE,OAAO,EAAE,cAAc,EAAE;QACpE,EAAE,IAAI,EAAE,yBAAyB,EAAE,OAAO,EAAE,OAAO,EAAE;QACrD,EAAE,IAAI,EAAE,yBAAyB,EAAE,OAAO,EAAE,OAAO,EAAE;QACrD,EAAE,IAAI,EAAE,6BAA6B,EAAE,OAAO,EAAE,WAAW,EAAE;KAC9D,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAA2B;IACxD,0BAA0B,EAAE,QAAQ;IACpC,IAAI,EAAE,QAAQ;IACd,cAAc,EAAE,SAAS;IACzB,UAAU,EAAE,QAAQ;IACpB,MAAM,EAAE,QAAQ;IAChB,gBAAgB,EAAE,QAAQ;IAC1B,gBAAgB,EAAE,QAAQ;CAC3B,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAA2B;IAC3D,sBAAsB,EAAE,QAAQ;IAChC,WAAW,EAAE,QAAQ;CACtB,CAAC"}
@@ -0,0 +1,49 @@
1
+ import type { IntegrationName, PackageManager } from "../choices.js";
2
+ /**
3
+ * One generated file emitted by the template generator.
4
+ */
5
+ export type TemplateFile = {
6
+ path: string;
7
+ content: string;
8
+ };
9
+ /**
10
+ * Inputs used to render app template files.
11
+ */
12
+ export type TemplateContext = {
13
+ name: string;
14
+ packageManager: PackageManager;
15
+ beignetVersion: string;
16
+ /**
17
+ * When true, scaffold an API-only app without the UI shell.
18
+ */
19
+ api: boolean;
20
+ integrations: IntegrationName[];
21
+ };
22
+ export declare const externalVersions: {
23
+ next: string;
24
+ react: string;
25
+ reactDom: string;
26
+ typescript: string;
27
+ typesBun: string;
28
+ typesNode: string;
29
+ typesReact: string;
30
+ typesReactDom: string;
31
+ zod: string;
32
+ tanstackReactQuery: string;
33
+ hookformResolvers: string;
34
+ reactHookForm: string;
35
+ betterAuth: string;
36
+ drizzleKit: string;
37
+ drizzleOrm: string;
38
+ inngest: string;
39
+ libsqlClient: string;
40
+ pino: string;
41
+ resend: string;
42
+ upstashRateLimit: string;
43
+ upstashRedis: string;
44
+ };
45
+ export declare function packageRunner(ctx: TemplateContext): string;
46
+ export declare const integrationDeps: Record<IntegrationName, Record<string, string>>;
47
+ export declare function hasIntegration(ctx: TemplateContext, integration: IntegrationName): boolean;
48
+ export declare function json(value: unknown): string;
49
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/templates/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAErE;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,cAAc,CAAC;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB;;OAEG;IACH,GAAG,EAAE,OAAO,CAAC;IACb,YAAY,EAAE,eAAe,EAAE,CAAC;CACjC,CAAC;AAEF,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;CAsB5B,CAAC;AAEF,wBAAgB,aAAa,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAW1D;AAED,eAAO,MAAM,eAAe,EAAE,MAAM,CAClC,eAAe,EACf,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAevB,CAAC;AAEF,wBAAgB,cAAc,CAC5B,GAAG,EAAE,eAAe,EACpB,WAAW,EAAE,eAAe,GAC3B,OAAO,CAET;AAED,wBAAgB,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAE3C"}
@@ -0,0 +1,57 @@
1
+ export const externalVersions = {
2
+ next: "^16.2.4",
3
+ react: "^19.2.5",
4
+ reactDom: "^19.2.5",
5
+ typescript: "^5.3.0",
6
+ typesBun: "^1.3.13",
7
+ typesNode: "^20.10.0",
8
+ typesReact: "^19.0.0",
9
+ typesReactDom: "^19.0.0",
10
+ zod: "^4.0.0",
11
+ tanstackReactQuery: "^5.100.7",
12
+ hookformResolvers: "^5.0.0",
13
+ reactHookForm: "^7.74.0",
14
+ betterAuth: "1.6.11",
15
+ drizzleKit: "^0.31.10",
16
+ drizzleOrm: "^0.45.2",
17
+ inngest: "^3.0.0",
18
+ libsqlClient: "^0.14.0",
19
+ pino: "^9.7.0",
20
+ resend: "^4.0.1",
21
+ upstashRateLimit: "^2.0.0",
22
+ upstashRedis: "^1.0.0",
23
+ };
24
+ export function packageRunner(ctx) {
25
+ switch (ctx.packageManager) {
26
+ case "npm":
27
+ return "npm run beignet --";
28
+ case "pnpm":
29
+ return "pnpm beignet";
30
+ case "yarn":
31
+ return "yarn beignet";
32
+ default:
33
+ return "bun beignet";
34
+ }
35
+ }
36
+ export const integrationDeps = {
37
+ inngest: {
38
+ "@beignet/provider-inngest": "",
39
+ inngest: externalVersions.inngest,
40
+ },
41
+ resend: {
42
+ "@beignet/provider-mail-resend": "",
43
+ resend: externalVersions.resend,
44
+ },
45
+ "upstash-rate-limit": {
46
+ "@beignet/provider-rate-limit-upstash": "",
47
+ "@upstash/ratelimit": externalVersions.upstashRateLimit,
48
+ "@upstash/redis": externalVersions.upstashRedis,
49
+ },
50
+ };
51
+ export function hasIntegration(ctx, integration) {
52
+ return ctx.integrations.includes(integration);
53
+ }
54
+ export function json(value) {
55
+ return `${JSON.stringify(value, null, "\t")}\n`;
56
+ }
57
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/templates/shared.ts"],"names":[],"mappings":"AAwBA,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,SAAS;IAChB,QAAQ,EAAE,SAAS;IACnB,UAAU,EAAE,QAAQ;IACpB,QAAQ,EAAE,SAAS;IACnB,SAAS,EAAE,UAAU;IACrB,UAAU,EAAE,SAAS;IACrB,aAAa,EAAE,SAAS;IACxB,GAAG,EAAE,QAAQ;IACb,kBAAkB,EAAE,UAAU;IAC9B,iBAAiB,EAAE,QAAQ;IAC3B,aAAa,EAAE,SAAS;IACxB,UAAU,EAAE,QAAQ;IACpB,UAAU,EAAE,UAAU;IACtB,UAAU,EAAE,SAAS;IACrB,OAAO,EAAE,QAAQ;IACjB,YAAY,EAAE,SAAS;IACvB,IAAI,EAAE,QAAQ;IACd,MAAM,EAAE,QAAQ;IAChB,gBAAgB,EAAE,QAAQ;IAC1B,YAAY,EAAE,QAAQ;CACvB,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,GAAoB;IAChD,QAAQ,GAAG,CAAC,cAAc,EAAE,CAAC;QAC3B,KAAK,KAAK;YACR,OAAO,oBAAoB,CAAC;QAC9B,KAAK,MAAM;YACT,OAAO,cAAc,CAAC;QACxB,KAAK,MAAM;YACT,OAAO,cAAc,CAAC;QACxB;YACE,OAAO,aAAa,CAAC;IACzB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAGxB;IACF,OAAO,EAAE;QACP,2BAA2B,EAAE,EAAE;QAC/B,OAAO,EAAE,gBAAgB,CAAC,OAAO;KAClC;IACD,MAAM,EAAE;QACN,+BAA+B,EAAE,EAAE;QACnC,MAAM,EAAE,gBAAgB,CAAC,MAAM;KAChC;IACD,oBAAoB,EAAE;QACpB,sCAAsC,EAAE,EAAE;QAC1C,oBAAoB,EAAE,gBAAgB,CAAC,gBAAgB;QACvD,gBAAgB,EAAE,gBAAgB,CAAC,YAAY;KAChD;CACF,CAAC;AAEF,MAAM,UAAU,cAAc,CAC5B,GAAoB,EACpB,WAA4B;IAE5B,OAAO,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,KAAc;IACjC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC;AAClD,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { type TemplateContext, type TemplateFile } from "./shared.js";
2
+ export declare function shellTemplateFiles(ctx: TemplateContext): TemplateFile[];
3
+ export declare const shellDependencies: Record<string, string>;
4
+ export declare const shellDevDependencies: Record<string, string>;
5
+ //# sourceMappingURL=shell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/templates/shell.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,YAAY,EAClB,MAAM,aAAa,CAAC;AAipCrB,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,eAAe,GAAG,YAAY,EAAE,CAqCvE;AAED,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAIpD,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,CAAC"}