create-newt-app 0.23.4 → 0.24.0

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 (2) hide show
  1. package/dist/index.js +997 -262
  2. package/package.json +3 -2
package/dist/index.js CHANGED
@@ -7,7 +7,7 @@ import chalk from "chalk";
7
7
  // package.json
8
8
  var package_default = {
9
9
  name: "create-newt-app",
10
- version: "0.23.4",
10
+ version: "0.24.0",
11
11
  license: "MIT",
12
12
  private: false,
13
13
  type: "module",
@@ -21,7 +21,8 @@ var package_default = {
21
21
  build: "tsup",
22
22
  "build:watch": "tsup --watch",
23
23
  dev: "tsup --watch",
24
- test: "vitest run"
24
+ test: "vitest run",
25
+ typecheck: "tsc --noEmit"
25
26
  },
26
27
  dependencies: {
27
28
  "@clack/prompts": "^0.11.0",
@@ -63,8 +64,9 @@ var package_json_default = {
63
64
  "db:generate": "turbo run generate"
64
65
  },
65
66
  "devDependencies": {
66
- "turbo": "^2.8.16",
67
- "typescript": "6.0.2"
67
+ "@types/node": "<%= versions["@types/node"] %>",
68
+ "turbo": "<%= versions.turbo %>",
69
+ "typescript": "<%= versions.typescript %>"
68
70
  },
69
71
  "packageManager": "pnpm@9.0.0",
70
72
  "engines": {
@@ -117,15 +119,6 @@ yarn-error.log*
117
119
  *.pem`
118
120
  };
119
121
 
120
- // src/templates/root/templates/prettierrc.ts
121
- var prettierrc_default = {
122
- filename: ".prettierrc",
123
- template: `{
124
- "singleQuote": true,
125
- "trailingComma": "all"
126
- }`
127
- };
128
-
129
122
  // src/templates/root/templates/dockerignore.ts
130
123
  var dockerignore_default = {
131
124
  filename: ".dockerignore",
@@ -251,7 +244,6 @@ var root = {
251
244
  templates: [
252
245
  package_json_default,
253
246
  gitignore_default,
254
- prettierrc_default,
255
247
  dockerignore_default,
256
248
  npmrc_default,
257
249
  turbo_json_default,
@@ -282,22 +274,22 @@ var package_json_default2 = {
282
274
  "dependencies": {
283
275
  "@<%= projectName %>/auth": "workspace:*",
284
276
  "@<%= projectName %>/ui": "workspace:*",
285
- "@tailwindcss/postcss": "^4.2.1",
286
- "dotenv": "^17.3.1",
287
- "@tanstack/react-form": "^1.28.5",
288
- "@tanstack/react-query": "^5.90.21",
289
- "better-auth": "^1.2.8",
290
- "next": "16.2.10",
291
- "react": "^19.2.4",
292
- "react-dom": "^19.2.4",
293
- "tailwindcss": "^4.2.1"
277
+ "@tailwindcss/postcss": "<%= versions["@tailwindcss/postcss"] %>",
278
+ "dotenv": "<%= versions.dotenv %>",
279
+ "@tanstack/react-form": "<%= versions["@tanstack/react-form"] %>",
280
+ "@tanstack/react-query": "<%= versions["@tanstack/react-query"] %>",
281
+ "better-auth": "<%= versions["better-auth"] %>",
282
+ "next": "<%= versions.next %>",
283
+ "react": "<%= versions.react %>",
284
+ "react-dom": "<%= versions["react-dom"] %>",
285
+ "tailwindcss": "<%= versions.tailwindcss %>"
294
286
  },
295
287
  "devDependencies": {
296
288
  "@<%= projectName %>/typescript-config": "workspace:*",
297
- "@types/node": "^22.15.3",
298
- "@types/react": "19.2.14",
299
- "@types/react-dom": "19.2.3",
300
- "typescript": "6.0.2"
289
+ "@types/node": "<%= versions["@types/node"] %>",
290
+ "@types/react": "<%= versions["@types/react"] %>",
291
+ "@types/react-dom": "<%= versions["@types/react-dom"] %>",
292
+ "typescript": "<%= versions.typescript %>"
301
293
  }
302
294
  }`
303
295
  };
@@ -823,27 +815,27 @@ var package_json_default3 = {
823
815
  "start:prod": "node dist/main"
824
816
  },
825
817
  "dependencies": {
826
- "@nestjs/common": "^11.0.1",
827
- "@nestjs/core": "^11.0.1",
828
- "@nestjs/platform-express": "^11.0.1",
818
+ "@nestjs/common": "<%= versions["@nestjs/common"] %>",
819
+ "@nestjs/core": "<%= versions["@nestjs/core"] %>",
820
+ "@nestjs/platform-express": "<%= versions["@nestjs/platform-express"] %>",
829
821
  "@<%= projectName %>/auth": "workspace:*",
830
822
  "@<%= projectName %>/db": "workspace:*",
831
- "@thallesp/nestjs-better-auth": "^2.5.1",
832
- "dotenv": "^17.3.1",
833
- "reflect-metadata": "^0.2.2",
834
- "rxjs": "^7.8.1"
823
+ "@thallesp/nestjs-better-auth": "<%= versions["@thallesp/nestjs-better-auth"] %>",
824
+ "dotenv": "<%= versions.dotenv %>",
825
+ "reflect-metadata": "<%= versions["reflect-metadata"] %>",
826
+ "rxjs": "<%= versions.rxjs %>"
835
827
  },
836
828
  "devDependencies": {
837
- "@nestjs/cli": "^11.0.0",
838
- "@nestjs/schematics": "^11.0.0",
839
- "@nestjs/testing": "^11.0.1",
840
- "@types/express": "^5.0.0",
841
- "@types/node": "^22.10.7",
842
- "@types/supertest": "^6.0.2",
843
- "supertest": "^7.0.0",
844
- "ts-node": "^10.9.2",
845
- "tsconfig-paths": "^4.2.0",
846
- "typescript": "6.0.2"
829
+ "@nestjs/cli": "<%= versions["@nestjs/cli"] %>",
830
+ "@nestjs/schematics": "<%= versions["@nestjs/schematics"] %>",
831
+ "@nestjs/testing": "<%= versions["@nestjs/testing"] %>",
832
+ "@types/express": "<%= versions["@types/express"] %>",
833
+ "@types/node": "<%= versions["@types/node"] %>",
834
+ "@types/supertest": "<%= versions["@types/supertest"] %>",
835
+ "supertest": "<%= versions.supertest %>",
836
+ "ts-node": "<%= versions["ts-node"] %>",
837
+ "tsconfig-paths": "<%= versions["tsconfig-paths"] %>",
838
+ "typescript": "<%= versions.typescript %>"
847
839
  }
848
840
  }`
849
841
  };
@@ -999,13 +991,13 @@ var package_json_default4 = {
999
991
  },
1000
992
  "dependencies": {
1001
993
  "@<%= projectName %>/db": "workspace:*",
1002
- "auth": "^1.5.5",
1003
- "better-auth": "^1.2.8"
994
+ "auth": "<%= versions.auth %>",
995
+ "better-auth": "<%= versions["better-auth"] %>"
1004
996
  },
1005
997
  "devDependencies": {
1006
998
  "@<%= projectName %>/typescript-config": "workspace:*",
1007
- "dotenv-cli": "^11.0.0",
1008
- "typescript": "6.0.2"
999
+ "dotenv-cli": "<%= versions["dotenv-cli"] %>",
1000
+ "typescript": "<%= versions.typescript %>"
1009
1001
  }
1010
1002
  }`
1011
1003
  };
@@ -1241,15 +1233,15 @@ var package_json_sqlite_default = {
1241
1233
  "make": "tsx scripts/new-migration.ts"
1242
1234
  },
1243
1235
  "dependencies": {
1244
- "better-sqlite3": "^12.11.1",
1245
- "kysely": "^0.28.2"
1236
+ "better-sqlite3": "<%= versions["better-sqlite3"] %>",
1237
+ "kysely": "<%= versions.kysely %>"
1246
1238
  },
1247
1239
  "devDependencies": {
1248
1240
  "@<%= projectName %>/typescript-config": "workspace:*",
1249
- "@types/better-sqlite3": "^7.6.13",
1250
- "dotenv-cli": "^11.0.0",
1251
- "tsx": "^4.19.2",
1252
- "typescript": "6.0.2"
1241
+ "@types/better-sqlite3": "<%= versions["@types/better-sqlite3"] %>",
1242
+ "dotenv-cli": "<%= versions["dotenv-cli"] %>",
1243
+ "tsx": "<%= versions.tsx %>",
1244
+ "typescript": "<%= versions.typescript %>"
1253
1245
  }
1254
1246
  }`
1255
1247
  };
@@ -1269,15 +1261,15 @@ var package_json_postgres_default = {
1269
1261
  "make": "tsx scripts/new-migration.ts"
1270
1262
  },
1271
1263
  "dependencies": {
1272
- "kysely": "^0.28.2",
1273
- "pg": "^8.14.1"
1264
+ "kysely": "<%= versions.kysely %>",
1265
+ "pg": "<%= versions.pg %>"
1274
1266
  },
1275
1267
  "devDependencies": {
1276
1268
  "@<%= projectName %>/typescript-config": "workspace:*",
1277
- "@types/pg": "^8.11.13",
1278
- "dotenv-cli": "^11.0.0",
1279
- "tsx": "^4.19.2",
1280
- "typescript": "6.0.2"
1269
+ "@types/pg": "<%= versions["@types/pg"] %>",
1270
+ "dotenv-cli": "<%= versions["dotenv-cli"] %>",
1271
+ "tsx": "<%= versions.tsx %>",
1272
+ "typescript": "<%= versions.typescript %>"
1281
1273
  }
1282
1274
  }`
1283
1275
  };
@@ -1350,12 +1342,12 @@ var package_json_default5 = {
1350
1342
  },
1351
1343
  "devDependencies": {
1352
1344
  "@<%= projectName %>/typescript-config": "workspace:*",
1353
- "@tailwindcss/postcss": "^4.0.0",
1354
- "tailwindcss": "^4.0.0",
1355
- "@types/node": "^22.15.3",
1356
- "@types/react": "19.2.14",
1357
- "@types/react-dom": "19.2.3",
1358
- "typescript": "6.0.2"
1345
+ "@tailwindcss/postcss": "<%= versions["@tailwindcss/postcss"] %>",
1346
+ "tailwindcss": "<%= versions.tailwindcss %>",
1347
+ "@types/node": "<%= versions["@types/node"] %>",
1348
+ "@types/react": "<%= versions["@types/react"] %>",
1349
+ "@types/react-dom": "<%= versions["@types/react-dom"] %>",
1350
+ "typescript": "<%= versions.typescript %>"
1359
1351
  },
1360
1352
  "peerDependencies": {
1361
1353
  "next": ">=15.0.0",
@@ -1363,8 +1355,8 @@ var package_json_default5 = {
1363
1355
  "react-dom": ">=19.0.0"
1364
1356
  },
1365
1357
  "dependencies": {
1366
- "clsx": "^2.1.1",
1367
- "tailwind-merge": "^3.3.0"
1358
+ "clsx": "<%= versions.clsx %>",
1359
+ "tailwind-merge": "<%= versions["tailwind-merge"] %>"
1368
1360
  }
1369
1361
  }`
1370
1362
  };
@@ -1595,6 +1587,87 @@ var ui = {
1595
1587
  };
1596
1588
  var ui_default = ui;
1597
1589
 
1590
+ // src/templates/versions.ts
1591
+ var versions = {
1592
+ "@base-ui/react": "^1.6.0",
1593
+ "@eslint/eslintrc": "^3.2.0",
1594
+ "@eslint/js": "^9.39.1",
1595
+ "@nestjs/cli": "^11.0.0",
1596
+ "@nestjs/common": "^11.0.1",
1597
+ "@nestjs/core": "^11.0.1",
1598
+ "@nestjs/platform-express": "^11.0.1",
1599
+ "@nestjs/schematics": "^11.0.0",
1600
+ "@nestjs/serve-static": "^5.0.0",
1601
+ "@nestjs/testing": "^11.0.1",
1602
+ "@next/eslint-plugin-next": "^16.2.10",
1603
+ "@shadcn/react": "^0.2.1",
1604
+ "@swc/core": "^1.10.0",
1605
+ "@tailwindcss/postcss": "^4.2.1",
1606
+ "@tanstack/react-form": "^1.28.5",
1607
+ "@tanstack/react-query": "^5.90.21",
1608
+ "@thallesp/nestjs-better-auth": "^2.5.1",
1609
+ "@types/better-sqlite3": "^7.6.13",
1610
+ "@types/express": "^5.0.0",
1611
+ "@types/jest": "^30.0.0",
1612
+ "@types/node": "^22.15.3",
1613
+ "@types/pg": "^8.11.13",
1614
+ "@types/react": "19.2.14",
1615
+ "@types/react-dom": "19.2.3",
1616
+ "@types/supertest": "^6.0.2",
1617
+ "@vitest/coverage-v8": "^3.0.0",
1618
+ "auth": "^1.5.5",
1619
+ "better-auth": "^1.2.8",
1620
+ "better-sqlite3": "^12.11.1",
1621
+ "class-variance-authority": "^0.7.1",
1622
+ "clsx": "^2.1.1",
1623
+ "cmdk": "^1.1.1",
1624
+ "date-fns": "^4.2.1",
1625
+ "dotenv": "^17.3.1",
1626
+ "dotenv-cli": "^11.0.0",
1627
+ "embla-carousel-react": "^8.6.0",
1628
+ "eslint": "^9.39.1",
1629
+ "eslint-config-prettier": "^10.1.1",
1630
+ "eslint-plugin-only-warn": "^1.1.0",
1631
+ "eslint-plugin-react": "^7.37.5",
1632
+ "eslint-plugin-react-hooks": "^5.2.0",
1633
+ "eslint-plugin-turbo": "^2.7.1",
1634
+ "globals": "^16.5.0",
1635
+ "input-otp": "^1.4.2",
1636
+ "jest": "^30.0.0",
1637
+ "kysely": "^0.28.2",
1638
+ "lucide-react": "^1.16.0",
1639
+ "next": "16.2.10",
1640
+ "next-themes": "^0.4.6",
1641
+ "oxfmt": "^0.59.0",
1642
+ "oxlint": "^1.74.0",
1643
+ "pg": "^8.14.1",
1644
+ "prettier": "^3.7.4",
1645
+ "react": "^19.2.4",
1646
+ "react-day-picker": "^10.0.1",
1647
+ "react-dom": "^19.2.4",
1648
+ "react-resizable-panels": "^4.11.1",
1649
+ "recharts": "^3.8.0",
1650
+ "reflect-metadata": "^0.2.2",
1651
+ "rxjs": "^7.8.1",
1652
+ "shadcn": "^4.7.0",
1653
+ "sonner": "^2.0.7",
1654
+ "source-map-support": "^0.5.21",
1655
+ "supertest": "^7.0.0",
1656
+ "tailwind-merge": "^3.6.0",
1657
+ "tailwindcss": "^4.2.1",
1658
+ "ts-jest": "^29.2.5",
1659
+ "ts-loader": "^9.5.2",
1660
+ "ts-node": "^10.9.2",
1661
+ "tsconfig-paths": "^4.2.0",
1662
+ "tsx": "^4.19.4",
1663
+ "turbo": "^2.8.16",
1664
+ "tw-animate-css": "^1.4.0",
1665
+ "typescript": "6.0.2",
1666
+ "typescript-eslint": "^8.50.0",
1667
+ "unplugin-swc": "^1.5.9",
1668
+ "vitest": "^3.0.0"
1669
+ };
1670
+
1598
1671
  // src/templates/shadcn-ui/templates/components-json.ts
1599
1672
  var components_json_default = {
1600
1673
  filename: "packages/ui/components.json",
@@ -1669,22 +1742,23 @@ var package_json_default6 = {
1669
1742
  },
1670
1743
  "scripts": {},
1671
1744
  "dependencies": {
1672
- "@base-ui/react": "^1.6.0",
1673
- "shadcn": "^4.7.0",
1674
- "class-variance-authority": "^0.7.1",
1675
- "clsx": "^2.1.1",
1676
- "cmdk": "^1.1.1",
1677
- "date-fns": "^4.2.1",
1678
- "embla-carousel-react": "^8.6.0",
1679
- "input-otp": "^1.4.2",
1680
- "lucide-react": "^1.16.0",
1681
- "next-themes": "^0.4.6",
1682
- "react-day-picker": "^10.0.1",
1683
- "react-resizable-panels": "^4.11.1",
1684
- "recharts": "^3.8.0",
1685
- "sonner": "^2.0.7",
1686
- "tailwind-merge": "^3.6.0",
1687
- "tw-animate-css": "^1.4.0"
1745
+ "@base-ui/react": "<%= versions["@base-ui/react"] %>",
1746
+ "@shadcn/react": "<%= versions["@shadcn/react"] %>",
1747
+ "shadcn": "<%= versions.shadcn %>",
1748
+ "class-variance-authority": "<%= versions["class-variance-authority"] %>",
1749
+ "clsx": "<%= versions.clsx %>",
1750
+ "cmdk": "<%= versions.cmdk %>",
1751
+ "date-fns": "<%= versions["date-fns"] %>",
1752
+ "embla-carousel-react": "<%= versions["embla-carousel-react"] %>",
1753
+ "input-otp": "<%= versions["input-otp"] %>",
1754
+ "lucide-react": "<%= versions["lucide-react"] %>",
1755
+ "next-themes": "<%= versions["next-themes"] %>",
1756
+ "react-day-picker": "<%= versions["react-day-picker"] %>",
1757
+ "react-resizable-panels": "<%= versions["react-resizable-panels"] %>",
1758
+ "recharts": "<%= versions.recharts %>",
1759
+ "sonner": "<%= versions.sonner %>",
1760
+ "tailwind-merge": "<%= versions["tailwind-merge"] %>",
1761
+ "tw-animate-css": "<%= versions["tw-animate-css"] %>"
1688
1762
  },
1689
1763
  "peerDependencies": {
1690
1764
  "next": ">=15.0.0",
@@ -1693,12 +1767,12 @@ var package_json_default6 = {
1693
1767
  },
1694
1768
  "devDependencies": {
1695
1769
  "@<%= projectName %>/typescript-config": "workspace:*",
1696
- "@tailwindcss/postcss": "^4.0.8",
1697
- "@types/node": "^22.0.0",
1698
- "@types/react": "19.2.14",
1699
- "@types/react-dom": "19.2.3",
1700
- "tailwindcss": "^4.0.8",
1701
- "typescript": "6.0.2"
1770
+ "@tailwindcss/postcss": "<%= versions["@tailwindcss/postcss"] %>",
1771
+ "@types/node": "<%= versions["@types/node"] %>",
1772
+ "@types/react": "<%= versions["@types/react"] %>",
1773
+ "@types/react-dom": "<%= versions["@types/react-dom"] %>",
1774
+ "tailwindcss": "<%= versions.tailwindcss %>",
1775
+ "typescript": "<%= versions.typescript %>"
1702
1776
  }
1703
1777
  }`
1704
1778
  };
@@ -9363,6 +9437,665 @@ export function ModeToggle() {
9363
9437
  `
9364
9438
  };
9365
9439
 
9440
+ // src/templates/shadcn-ui/templates/attachment.ts
9441
+ var attachment_default = {
9442
+ filename: "packages/ui/src/components/attachment.tsx",
9443
+ template: `import * as React from "react"
9444
+ import { mergeProps } from "@base-ui/react/merge-props"
9445
+ import { useRender } from "@base-ui/react/use-render"
9446
+ import { cva, type VariantProps } from "class-variance-authority"
9447
+
9448
+ import { cn } from "@<%= projectName %>/ui/lib/utils"
9449
+ import { Button } from "@<%= projectName %>/ui/components/button"
9450
+
9451
+ const attachmentVariants = cva(
9452
+ "group/attachment relative flex w-fit max-w-full min-w-0 shrink-0 flex-wrap rounded-xl border bg-card text-card-foreground transition-colors focus-within:ring-1 focus-within:ring-ring/50 has-[>a,>button]:hover:bg-muted/50 data-[state=error]:border-destructive/30 data-[state=idle]:border-dashed",
9453
+ {
9454
+ variants: {
9455
+ size: {
9456
+ default:
9457
+ "gap-2 text-sm has-data-[slot=attachment-content]:px-2.5 has-data-[slot=attachment-content]:py-2 has-data-[slot=attachment-media]:p-2",
9458
+ sm: "gap-2.5 text-xs has-data-[slot=attachment-content]:px-2 has-data-[slot=attachment-content]:py-1.5 has-data-[slot=attachment-media]:p-1.5",
9459
+ xs: "gap-1.5 rounded-lg text-xs has-data-[slot=attachment-content]:px-1.5 has-data-[slot=attachment-content]:py-1 has-data-[slot=attachment-media]:p-1",
9460
+ },
9461
+ orientation: {
9462
+ horizontal: "min-w-40 items-center",
9463
+ vertical: "w-24 flex-col has-data-[slot=attachment-content]:w-30",
9464
+ },
9465
+ },
9466
+ }
9467
+ )
9468
+
9469
+ function Attachment({
9470
+ className,
9471
+ state = "done",
9472
+ size = "default",
9473
+ orientation = "horizontal",
9474
+ ...props
9475
+ }: React.ComponentProps<"div"> &
9476
+ VariantProps<typeof attachmentVariants> & {
9477
+ state?: "idle" | "uploading" | "processing" | "error" | "done"
9478
+ }) {
9479
+ return (
9480
+ <div
9481
+ data-slot="attachment"
9482
+ data-state={state}
9483
+ data-size={size}
9484
+ data-orientation={orientation}
9485
+ className={cn(attachmentVariants({ size, orientation }), className)}
9486
+ {...props}
9487
+ />
9488
+ )
9489
+ }
9490
+
9491
+ const attachmentMediaVariants = cva(
9492
+ "relative flex aspect-square w-10 shrink-0 items-center justify-center overflow-hidden rounded-lg bg-muted text-foreground group-data-[orientation=vertical]/attachment:w-full group-data-[size=sm]/attachment:w-8 group-data-[size=xs]/attachment:w-7 group-data-[size=xs]/attachment:rounded-md group-data-[state=error]/attachment:bg-destructive/10 group-data-[state=error]/attachment:text-destructive group-data-[orientation=vertical]/attachment:*:data-[slot=spinner]:size-6! [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 group-data-[orientation=vertical]/attachment:[&_svg:not([class*='size-'])]:size-6 group-data-[size=xs]/attachment:[&_svg:not([class*='size-'])]:size-3.5",
9493
+ {
9494
+ variants: {
9495
+ variant: {
9496
+ icon: "",
9497
+ image:
9498
+ "opacity-60 group-data-[state=done]/attachment:opacity-100 group-data-[state=idle]/attachment:opacity-100 *:[img]:aspect-square *:[img]:w-full *:[img]:object-cover",
9499
+ },
9500
+ },
9501
+ defaultVariants: {
9502
+ variant: "icon",
9503
+ },
9504
+ }
9505
+ )
9506
+
9507
+ function AttachmentMedia({
9508
+ className,
9509
+ variant = "icon",
9510
+ ...props
9511
+ }: React.ComponentProps<"div"> & VariantProps<typeof attachmentMediaVariants>) {
9512
+ return (
9513
+ <div
9514
+ data-slot="attachment-media"
9515
+ data-variant={variant}
9516
+ className={cn(attachmentMediaVariants({ variant }), className)}
9517
+ {...props}
9518
+ />
9519
+ )
9520
+ }
9521
+
9522
+ function AttachmentContent({
9523
+ className,
9524
+ ...props
9525
+ }: React.ComponentProps<"div">) {
9526
+ return (
9527
+ <div
9528
+ data-slot="attachment-content"
9529
+ className={cn(
9530
+ "max-w-full min-w-0 flex-1 leading-tight group-data-[orientation=vertical]/attachment:px-1",
9531
+ className
9532
+ )}
9533
+ {...props}
9534
+ />
9535
+ )
9536
+ }
9537
+
9538
+ function AttachmentTitle({
9539
+ className,
9540
+ ...props
9541
+ }: React.ComponentProps<"span">) {
9542
+ return (
9543
+ <span
9544
+ data-slot="attachment-title"
9545
+ className={cn(
9546
+ "block max-w-full min-w-0 truncate font-medium group-data-[state=processing]/attachment:shimmer group-data-[state=uploading]/attachment:shimmer",
9547
+ className
9548
+ )}
9549
+ {...props}
9550
+ />
9551
+ )
9552
+ }
9553
+
9554
+ function AttachmentDescription({
9555
+ className,
9556
+ ...props
9557
+ }: React.ComponentProps<"span">) {
9558
+ return (
9559
+ <span
9560
+ data-slot="attachment-description"
9561
+ className={cn(
9562
+ "mt-0.5 block min-w-0 truncate text-xs text-muted-foreground group-data-[state=error]/attachment:text-destructive/80",
9563
+ "max-w-full",
9564
+ className
9565
+ )}
9566
+ {...props}
9567
+ />
9568
+ )
9569
+ }
9570
+
9571
+ function AttachmentActions({
9572
+ className,
9573
+ ...props
9574
+ }: React.ComponentProps<"div">) {
9575
+ return (
9576
+ <div
9577
+ data-slot="attachment-actions"
9578
+ className={cn(
9579
+ "relative z-20 flex shrink-0 items-center group-data-[orientation=vertical]/attachment:absolute group-data-[orientation=vertical]/attachment:top-3 group-data-[orientation=vertical]/attachment:right-3 group-data-[orientation=vertical]/attachment:gap-1",
9580
+ className
9581
+ )}
9582
+ {...props}
9583
+ />
9584
+ )
9585
+ }
9586
+
9587
+ function AttachmentAction({
9588
+ className,
9589
+ variant,
9590
+ size = "icon-xs",
9591
+ ...props
9592
+ }: React.ComponentProps<typeof Button>) {
9593
+ return (
9594
+ <Button
9595
+ data-slot="attachment-action"
9596
+ variant={variant ?? "ghost"}
9597
+ size={size}
9598
+ className={cn(className)}
9599
+ {...props}
9600
+ />
9601
+ )
9602
+ }
9603
+
9604
+ function AttachmentTrigger({
9605
+ className,
9606
+ render,
9607
+ type,
9608
+ ...props
9609
+ }: useRender.ComponentProps<"button">) {
9610
+ return useRender({
9611
+ defaultTagName: "button",
9612
+ props: mergeProps<"button">(
9613
+ {
9614
+ type: render ? type : (type ?? "button"),
9615
+ className: cn("absolute inset-0 z-10 outline-none", className),
9616
+ },
9617
+ props
9618
+ ),
9619
+ render,
9620
+ state: {
9621
+ slot: "attachment-trigger",
9622
+ },
9623
+ })
9624
+ }
9625
+
9626
+ function AttachmentGroup({ className, ...props }: React.ComponentProps<"div">) {
9627
+ return (
9628
+ <div
9629
+ data-slot="attachment-group"
9630
+ className={cn(
9631
+ "flex min-w-0 scroll-fade-x snap-x snap-mandatory scroll-px-1 scrollbar-none gap-3 overflow-x-auto overscroll-x-contain py-1 *:data-[slot=attachment]:flex-none *:data-[slot=attachment]:snap-start",
9632
+ className
9633
+ )}
9634
+ {...props}
9635
+ />
9636
+ )
9637
+ }
9638
+
9639
+ export {
9640
+ Attachment,
9641
+ AttachmentGroup,
9642
+ AttachmentMedia,
9643
+ AttachmentContent,
9644
+ AttachmentTitle,
9645
+ AttachmentDescription,
9646
+ AttachmentActions,
9647
+ AttachmentAction,
9648
+ AttachmentTrigger,
9649
+ }
9650
+ `
9651
+ };
9652
+
9653
+ // src/templates/shadcn-ui/templates/bubble.ts
9654
+ var bubble_default = {
9655
+ filename: "packages/ui/src/components/bubble.tsx",
9656
+ template: `import * as React from "react"
9657
+ import { mergeProps } from "@base-ui/react/merge-props"
9658
+ import { useRender } from "@base-ui/react/use-render"
9659
+ import { cva, type VariantProps } from "class-variance-authority"
9660
+
9661
+ import { cn } from "@<%= projectName %>/ui/lib/utils"
9662
+
9663
+ function BubbleGroup({ className, ...props }: React.ComponentProps<"div">) {
9664
+ return (
9665
+ <div
9666
+ data-slot="bubble-group"
9667
+ className={cn("flex min-w-0 flex-col gap-2", className)}
9668
+ {...props}
9669
+ />
9670
+ )
9671
+ }
9672
+
9673
+ const bubbleVariants = cva(
9674
+ "group/bubble relative flex w-fit max-w-[80%] min-w-0 flex-col gap-1 group-data-[align=end]/message:self-end data-[align=end]:self-end data-[variant=ghost]:max-w-full",
9675
+ {
9676
+ variants: {
9677
+ variant: {
9678
+ default:
9679
+ "*:data-[slot=bubble-content]:bg-primary *:data-[slot=bubble-content]:text-primary-foreground [&>[data-slot=bubble-content]:is(button,a):hover]:bg-primary/80",
9680
+ secondary:
9681
+ "*:data-[slot=bubble-content]:bg-secondary *:data-[slot=bubble-content]:text-secondary-foreground [&>[data-slot=bubble-content]:is(button,a):hover]:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)]",
9682
+ muted:
9683
+ "*:data-[slot=bubble-content]:bg-muted [&>[data-slot=bubble-content]:is(button,a):hover]:bg-[color-mix(in_oklch,var(--muted),var(--foreground)_5%)]",
9684
+ tinted:
9685
+ "*:data-[slot=bubble-content]:bg-[oklch(from_var(--primary)_0.93_calc(c*0.4)_h)] *:data-[slot=bubble-content]:text-foreground dark:*:data-[slot=bubble-content]:bg-[oklch(from_var(--primary)_0.3_calc(c*0.4)_h)] [&>[data-slot=bubble-content]:is(button,a):hover]:bg-[oklch(from_var(--primary)_0.88_calc(c*0.5)_h)] dark:[&>[data-slot=bubble-content]:is(button,a):hover]:bg-[oklch(from_var(--primary)_0.35_calc(c*0.5)_h)]",
9686
+ outline:
9687
+ "*:data-[slot=bubble-content]:border-border *:data-[slot=bubble-content]:bg-background [&>[data-slot=bubble-content]:is(button,a):hover]:bg-muted [&>[data-slot=bubble-content]:is(button,a):hover]:text-foreground dark:[&>[data-slot=bubble-content]:is(button,a):hover]:bg-input/30",
9688
+ ghost:
9689
+ "border-none *:data-[slot=bubble-content]:rounded-none *:data-[slot=bubble-content]:bg-transparent *:data-[slot=bubble-content]:p-0 [&>[data-slot=bubble-content]:is(button,a):hover]:bg-muted [&>[data-slot=bubble-content]:is(button,a):hover]:text-foreground dark:[&>[data-slot=bubble-content]:is(button,a):hover]:bg-muted/50",
9690
+ destructive:
9691
+ "*:data-[slot=bubble-content]:bg-destructive/10 *:data-[slot=bubble-content]:text-destructive dark:*:data-[slot=bubble-content]:bg-destructive/20 [&>[data-slot=bubble-content]:is(button,a):hover]:bg-destructive/20 dark:[&>[data-slot=bubble-content]:is(button,a):hover]:bg-destructive/30",
9692
+ },
9693
+ },
9694
+ defaultVariants: {
9695
+ variant: "default",
9696
+ },
9697
+ }
9698
+ )
9699
+
9700
+ function Bubble({
9701
+ variant = "default",
9702
+ align = "start",
9703
+ className,
9704
+ ...props
9705
+ }: React.ComponentProps<"div"> &
9706
+ VariantProps<typeof bubbleVariants> & {
9707
+ align?: "start" | "end"
9708
+ }) {
9709
+ return (
9710
+ <div
9711
+ data-slot="bubble"
9712
+ data-variant={variant}
9713
+ data-align={align}
9714
+ className={cn(bubbleVariants({ variant }), className)}
9715
+ {...props}
9716
+ />
9717
+ )
9718
+ }
9719
+
9720
+ function BubbleContent({
9721
+ className,
9722
+ render,
9723
+ ...props
9724
+ }: useRender.ComponentProps<"div">) {
9725
+ return useRender({
9726
+ defaultTagName: "div",
9727
+ props: mergeProps<"div">(
9728
+ {
9729
+ className: cn(
9730
+ "w-fit max-w-full min-w-0 overflow-hidden rounded-xl border border-transparent px-3 py-2 text-sm leading-relaxed wrap-break-word group-data-[align=end]/bubble:self-end [button]:text-left [button,a]:transition-colors [button,a]:outline-none [button,a]:focus-visible:border-ring [button,a]:focus-visible:ring-3 [button,a]:focus-visible:ring-ring/50",
9731
+ className
9732
+ ),
9733
+ },
9734
+ props
9735
+ ),
9736
+ render,
9737
+ state: {
9738
+ slot: "bubble-content",
9739
+ },
9740
+ })
9741
+ }
9742
+
9743
+ const bubbleReactionsVariants = cva(
9744
+ "absolute z-10 flex w-fit shrink-0 items-center justify-center gap-1 rounded-full bg-muted px-1.5 py-0.5 text-sm ring-3 ring-card has-[button]:p-0",
9745
+ {
9746
+ variants: {
9747
+ side: {
9748
+ top: "top-0 -translate-y-3/4",
9749
+ bottom: "bottom-0 translate-y-3/4",
9750
+ },
9751
+ align: {
9752
+ start: "left-3",
9753
+ end: "right-3",
9754
+ },
9755
+ },
9756
+ defaultVariants: {
9757
+ side: "bottom",
9758
+ align: "end",
9759
+ },
9760
+ }
9761
+ )
9762
+
9763
+ function BubbleReactions({
9764
+ side = "bottom",
9765
+ align = "end",
9766
+ className,
9767
+ ...props
9768
+ }: React.ComponentProps<"div"> & {
9769
+ align?: "start" | "end"
9770
+ side?: "top" | "bottom"
9771
+ }) {
9772
+ return (
9773
+ <div
9774
+ data-slot="bubble-reactions"
9775
+ data-align={align}
9776
+ data-side={side}
9777
+ className={cn(bubbleReactionsVariants({ side, align }), className)}
9778
+ {...props}
9779
+ />
9780
+ )
9781
+ }
9782
+
9783
+ export { BubbleGroup, Bubble, BubbleContent, BubbleReactions }
9784
+ `
9785
+ };
9786
+
9787
+ // src/templates/shadcn-ui/templates/marker.ts
9788
+ var marker_default = {
9789
+ filename: "packages/ui/src/components/marker.tsx",
9790
+ template: `import * as React from "react"
9791
+ import { mergeProps } from "@base-ui/react/merge-props"
9792
+ import { useRender } from "@base-ui/react/use-render"
9793
+ import { cva, type VariantProps } from "class-variance-authority"
9794
+
9795
+ import { cn } from "@<%= projectName %>/ui/lib/utils"
9796
+
9797
+ const markerVariants = cva(
9798
+ "group/marker relative flex min-h-4 w-full items-center gap-2 text-left text-sm text-muted-foreground [&_svg:not([class*='size-'])]:size-4 [a]:underline [a]:underline-offset-3 [a]:hover:text-foreground",
9799
+ {
9800
+ variants: {
9801
+ variant: {
9802
+ default: "",
9803
+ separator:
9804
+ "before:mr-1 before:h-px before:min-w-0 before:flex-1 before:bg-border after:ml-1 after:h-px after:min-w-0 after:flex-1 after:bg-border",
9805
+ border: "border-b border-border pb-2",
9806
+ },
9807
+ },
9808
+ }
9809
+ )
9810
+
9811
+ function Marker({
9812
+ className,
9813
+ variant = "default",
9814
+ render,
9815
+ ...props
9816
+ }: useRender.ComponentProps<"div"> & VariantProps<typeof markerVariants>) {
9817
+ return useRender({
9818
+ defaultTagName: "div",
9819
+ props: mergeProps<"div">(
9820
+ {
9821
+ className: cn(markerVariants({ variant, className })),
9822
+ },
9823
+ props
9824
+ ),
9825
+ render,
9826
+ state: {
9827
+ slot: "marker",
9828
+ variant,
9829
+ },
9830
+ })
9831
+ }
9832
+
9833
+ function MarkerIcon({ className, ...props }: React.ComponentProps<"span">) {
9834
+ return (
9835
+ <span
9836
+ data-slot="marker-icon"
9837
+ aria-hidden="true"
9838
+ className={cn(
9839
+ "size-4 shrink-0 [&_svg:not([class*='size-'])]:size-4",
9840
+ className
9841
+ )}
9842
+ {...props}
9843
+ />
9844
+ )
9845
+ }
9846
+
9847
+ function MarkerContent({ className, ...props }: React.ComponentProps<"span">) {
9848
+ return (
9849
+ <span
9850
+ data-slot="marker-content"
9851
+ className={cn(
9852
+ "min-w-0 wrap-break-word group-data-[variant=separator]/marker:flex-none group-data-[variant=separator]/marker:text-center *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground",
9853
+ className
9854
+ )}
9855
+ {...props}
9856
+ />
9857
+ )
9858
+ }
9859
+
9860
+ export { Marker, MarkerIcon, MarkerContent, markerVariants }
9861
+ `
9862
+ };
9863
+
9864
+ // src/templates/shadcn-ui/templates/message.ts
9865
+ var message_default = {
9866
+ filename: "packages/ui/src/components/message.tsx",
9867
+ template: `import * as React from "react"
9868
+
9869
+ import { cn } from "@<%= projectName %>/ui/lib/utils"
9870
+
9871
+ function MessageGroup({ className, ...props }: React.ComponentProps<"div">) {
9872
+ return (
9873
+ <div
9874
+ data-slot="message-group"
9875
+ className={cn("flex min-w-0 flex-col gap-2", className)}
9876
+ {...props}
9877
+ />
9878
+ )
9879
+ }
9880
+
9881
+ function Message({
9882
+ className,
9883
+ align = "start",
9884
+ ...props
9885
+ }: React.ComponentProps<"div"> & { align?: "start" | "end" }) {
9886
+ return (
9887
+ <div
9888
+ data-slot="message"
9889
+ data-align={align}
9890
+ className={cn(
9891
+ "group/message relative flex w-full min-w-0 gap-2 text-sm data-[align=end]:flex-row-reverse",
9892
+ className
9893
+ )}
9894
+ {...props}
9895
+ />
9896
+ )
9897
+ }
9898
+
9899
+ function MessageAvatar({ className, ...props }: React.ComponentProps<"div">) {
9900
+ return (
9901
+ <div
9902
+ data-slot="message-avatar"
9903
+ className={cn(
9904
+ "flex w-fit min-w-8 shrink-0 items-center justify-center self-end overflow-hidden rounded-full bg-muted group-has-data-[slot=message-footer]/message:-translate-y-8",
9905
+ className
9906
+ )}
9907
+ {...props}
9908
+ />
9909
+ )
9910
+ }
9911
+
9912
+ function MessageContent({ className, ...props }: React.ComponentProps<"div">) {
9913
+ return (
9914
+ <div
9915
+ data-slot="message-content"
9916
+ className={cn(
9917
+ "flex w-full min-w-0 flex-col gap-2.5 wrap-break-word group-data-[align=end]/message:*:data-slot:self-end",
9918
+ className
9919
+ )}
9920
+ {...props}
9921
+ />
9922
+ )
9923
+ }
9924
+
9925
+ function MessageHeader({ className, ...props }: React.ComponentProps<"div">) {
9926
+ return (
9927
+ <div
9928
+ data-slot="message-header"
9929
+ className={cn(
9930
+ "flex max-w-full min-w-0 items-center px-3 text-xs font-medium text-muted-foreground group-has-data-[variant=ghost]/message:px-0",
9931
+ className
9932
+ )}
9933
+ {...props}
9934
+ />
9935
+ )
9936
+ }
9937
+
9938
+ function MessageFooter({ className, ...props }: React.ComponentProps<"div">) {
9939
+ return (
9940
+ <div
9941
+ data-slot="message-footer"
9942
+ className={cn(
9943
+ "flex max-w-full min-w-0 items-center px-3 text-xs font-medium text-muted-foreground group-has-data-[variant=ghost]/message:px-0 group-data-[align=end]/message:justify-end",
9944
+ className
9945
+ )}
9946
+ {...props}
9947
+ />
9948
+ )
9949
+ }
9950
+
9951
+ export {
9952
+ MessageGroup,
9953
+ Message,
9954
+ MessageAvatar,
9955
+ MessageContent,
9956
+ MessageFooter,
9957
+ MessageHeader,
9958
+ }
9959
+ `
9960
+ };
9961
+
9962
+ // src/templates/shadcn-ui/templates/message-scroller.ts
9963
+ var message_scroller_default = {
9964
+ filename: "packages/ui/src/components/message-scroller.tsx",
9965
+ template: `"use client"
9966
+
9967
+ import * as React from "react"
9968
+ import {
9969
+ MessageScroller as MessageScrollerPrimitive,
9970
+ useMessageScroller,
9971
+ useMessageScrollerScrollable,
9972
+ useMessageScrollerVisibility,
9973
+ } from "@shadcn/react/message-scroller"
9974
+
9975
+ import { cn } from "@<%= projectName %>/ui/lib/utils"
9976
+ import { Button } from "@<%= projectName %>/ui/components/button"
9977
+ import { ArrowDownIcon } from "lucide-react"
9978
+
9979
+ function MessageScrollerProvider(
9980
+ props: React.ComponentProps<typeof MessageScrollerPrimitive.Provider>
9981
+ ) {
9982
+ return <MessageScrollerPrimitive.Provider {...props} />
9983
+ }
9984
+
9985
+ function MessageScroller({
9986
+ className,
9987
+ ...props
9988
+ }: React.ComponentProps<typeof MessageScrollerPrimitive.Root>) {
9989
+ return (
9990
+ <MessageScrollerPrimitive.Root
9991
+ data-slot="message-scroller"
9992
+ className={cn(
9993
+ "group/message-scroller relative flex size-full min-h-0 flex-col overflow-hidden",
9994
+ className
9995
+ )}
9996
+ {...props}
9997
+ />
9998
+ )
9999
+ }
10000
+
10001
+ function MessageScrollerViewport({
10002
+ className,
10003
+ ...props
10004
+ }: React.ComponentProps<typeof MessageScrollerPrimitive.Viewport>) {
10005
+ return (
10006
+ <MessageScrollerPrimitive.Viewport
10007
+ data-slot="message-scroller-viewport"
10008
+ className={cn(
10009
+ "size-full min-h-0 min-w-0 scroll-fade-b scrollbar-thin scrollbar-gutter-stable overflow-y-auto overscroll-contain contain-content data-autoscrolling:scrollbar-thumb-transparent data-autoscrolling:scrollbar-track-transparent",
10010
+ className
10011
+ )}
10012
+ {...props}
10013
+ />
10014
+ )
10015
+ }
10016
+
10017
+ function MessageScrollerContent({
10018
+ className,
10019
+ ...props
10020
+ }: React.ComponentProps<typeof MessageScrollerPrimitive.Content>) {
10021
+ return (
10022
+ <MessageScrollerPrimitive.Content
10023
+ data-slot="message-scroller-content"
10024
+ className={cn("flex h-max min-h-full flex-col gap-6", className)}
10025
+ {...props}
10026
+ />
10027
+ )
10028
+ }
10029
+
10030
+ function MessageScrollerItem({
10031
+ className,
10032
+ scrollAnchor = false,
10033
+ ...props
10034
+ }: React.ComponentProps<typeof MessageScrollerPrimitive.Item>) {
10035
+ return (
10036
+ <MessageScrollerPrimitive.Item
10037
+ data-slot="message-scroller-item"
10038
+ scrollAnchor={scrollAnchor}
10039
+ className={cn(
10040
+ "min-w-0 shrink-0 [contain-intrinsic-size:auto_10rem] [content-visibility:auto]",
10041
+ className
10042
+ )}
10043
+ {...props}
10044
+ />
10045
+ )
10046
+ }
10047
+
10048
+ function MessageScrollerButton({
10049
+ direction = "end",
10050
+ className,
10051
+ children,
10052
+ render,
10053
+ variant = "secondary",
10054
+ size = "icon-sm",
10055
+ ...props
10056
+ }: React.ComponentProps<typeof MessageScrollerPrimitive.Button> &
10057
+ Pick<React.ComponentProps<typeof Button>, "variant" | "size">) {
10058
+ return (
10059
+ <MessageScrollerPrimitive.Button
10060
+ data-slot="message-scroller-button"
10061
+ data-direction={direction}
10062
+ data-variant={variant}
10063
+ data-size={size}
10064
+ direction={direction}
10065
+ className={cn(
10066
+ "absolute inset-s-1/2 -translate-x-1/2 border-border bg-background text-foreground transition-[translate,scale,opacity] duration-200 hover:bg-muted hover:text-foreground data-[active=false]:pointer-events-none data-[active=false]:scale-95 data-[active=false]:opacity-0 data-[active=false]:duration-400 data-[active=false]:ease-[cubic-bezier(0.7,0,0.84,0)] data-[active=true]:translate-y-0 data-[active=true]:scale-100 data-[active=true]:opacity-100 data-[active=true]:ease-[cubic-bezier(0.23,1,0.32,1)] data-[direction=end]:bottom-4 data-[direction=end]:data-[active=false]:translate-y-full data-[direction=start]:top-4 data-[direction=start]:data-[active=false]:-translate-y-full rtl:translate-x-1/2 data-[direction=start]:[&_svg]:rotate-180",
10067
+ className
10068
+ )}
10069
+ render={render ?? <Button variant={variant} size={size} />}
10070
+ {...props}
10071
+ >
10072
+ {children ?? (
10073
+ <>
10074
+ <ArrowDownIcon
10075
+ />
10076
+ <span className="sr-only">
10077
+ {direction === "end" ? "Scroll to end" : "Scroll to start"}
10078
+ </span>
10079
+ </>
10080
+ )}
10081
+ </MessageScrollerPrimitive.Button>
10082
+ )
10083
+ }
10084
+
10085
+ export {
10086
+ MessageScrollerProvider,
10087
+ MessageScroller,
10088
+ MessageScrollerViewport,
10089
+ MessageScrollerContent,
10090
+ MessageScrollerItem,
10091
+ MessageScrollerButton,
10092
+ useMessageScroller,
10093
+ useMessageScrollerScrollable,
10094
+ useMessageScrollerVisibility,
10095
+ }
10096
+ `
10097
+ };
10098
+
9366
10099
  // src/templates/shadcn-ui/index.ts
9367
10100
  var shadcnUi = {
9368
10101
  templates: [
@@ -9434,12 +10167,17 @@ var shadcnUi = {
9434
10167
  toggle_default,
9435
10168
  tooltip_default,
9436
10169
  mode_toggle_default,
10170
+ attachment_default,
10171
+ bubble_default,
10172
+ marker_default,
10173
+ message_default,
10174
+ message_scroller_default,
9437
10175
  components_json_default,
9438
10176
  web_components_json_default
9439
10177
  ],
9440
10178
  packages: [
9441
- { package: "next-themes", module: "apps/web", version: "^0.4.6" },
9442
- { package: "sonner", module: "apps/web", version: "^2.0.7" }
10179
+ { package: "next-themes", module: "apps/web", version: versions["next-themes"] },
10180
+ { package: "sonner", module: "apps/web", version: versions.sonner }
9443
10181
  ]
9444
10182
  };
9445
10183
  var shadcn_ui_default = shadcnUi;
@@ -9458,17 +10196,17 @@ var package_json_default7 = {
9458
10196
  "./react-internal": "./react-internal.js"
9459
10197
  },
9460
10198
  "devDependencies": {
9461
- "@eslint/js": "^9.39.1",
9462
- "@next/eslint-plugin-next": "^16.2.10",
9463
- "eslint": "^9.39.1",
9464
- "eslint-config-prettier": "^10.1.1",
9465
- "eslint-plugin-only-warn": "^1.1.0",
9466
- "eslint-plugin-react": "^7.37.5",
9467
- "eslint-plugin-react-hooks": "^5.2.0",
9468
- "eslint-plugin-turbo": "^2.7.1",
9469
- "globals": "^16.5.0",
9470
- "typescript": "^5.9.2",
9471
- "typescript-eslint": "^8.50.0"
10199
+ "@eslint/js": "<%= versions["@eslint/js"] %>",
10200
+ "@next/eslint-plugin-next": "<%= versions["@next/eslint-plugin-next"] %>",
10201
+ "eslint": "<%= versions.eslint %>",
10202
+ "eslint-config-prettier": "<%= versions["eslint-config-prettier"] %>",
10203
+ "eslint-plugin-only-warn": "<%= versions["eslint-plugin-only-warn"] %>",
10204
+ "eslint-plugin-react": "<%= versions["eslint-plugin-react"] %>",
10205
+ "eslint-plugin-react-hooks": "<%= versions["eslint-plugin-react-hooks"] %>",
10206
+ "eslint-plugin-turbo": "<%= versions["eslint-plugin-turbo"] %>",
10207
+ "globals": "<%= versions.globals %>",
10208
+ "typescript": "<%= versions.typescript %>",
10209
+ "typescript-eslint": "<%= versions["typescript-eslint"] %>"
9472
10210
  }
9473
10211
  }`
9474
10212
  };
@@ -9674,25 +10412,34 @@ var eslint_config_default3 = {
9674
10412
  export default config;`
9675
10413
  };
9676
10414
 
10415
+ // src/templates/root/templates/prettierrc.ts
10416
+ var prettierrc_default = {
10417
+ filename: ".prettierrc",
10418
+ template: `{
10419
+ "singleQuote": true,
10420
+ "trailingComma": "all"
10421
+ }`
10422
+ };
10423
+
9677
10424
  // src/templates/eslint-config/index.ts
9678
10425
  var web2 = "apps/web";
9679
10426
  var api2 = "apps/api";
9680
10427
  var ui2 = "packages/ui";
9681
10428
  var root2 = "";
9682
10429
  var eslintConfig = {
9683
- templates: [package_json_default7, base_default, next_default, react_internal_default, eslint_config_default, eslint_config_default2, eslint_config_default3],
10430
+ templates: [package_json_default7, base_default, next_default, react_internal_default, eslint_config_default, eslint_config_default2, eslint_config_default3, prettierrc_default],
9684
10431
  packages: [
9685
- { package: "eslint", module: web2, version: "^9.39.1", dev: true },
10432
+ { package: "eslint", module: web2, version: versions.eslint, dev: true },
9686
10433
  { package: "@<%= projectName %>/eslint-config", module: web2, version: "workspace:*", dev: true },
9687
- { package: "@eslint/eslintrc", module: api2, version: "^3.2.0", dev: true },
9688
- { package: "@eslint/js", module: api2, version: "^9.18.0", dev: true },
9689
- { package: "eslint", module: api2, version: "^9.18.0", dev: true },
9690
- { package: "eslint-config-prettier", module: api2, version: "^10.0.1", dev: true },
9691
- { package: "globals", module: api2, version: "^16.0.0", dev: true },
9692
- { package: "typescript-eslint", module: api2, version: "^8.20.0", dev: true },
9693
- { package: "eslint", module: ui2, version: "^9.39.1", dev: true },
10434
+ { package: "@eslint/eslintrc", module: api2, version: versions["@eslint/eslintrc"], dev: true },
10435
+ { package: "@eslint/js", module: api2, version: versions["@eslint/js"], dev: true },
10436
+ { package: "eslint", module: api2, version: versions.eslint, dev: true },
10437
+ { package: "eslint-config-prettier", module: api2, version: versions["eslint-config-prettier"], dev: true },
10438
+ { package: "globals", module: api2, version: versions.globals, dev: true },
10439
+ { package: "typescript-eslint", module: api2, version: versions["typescript-eslint"], dev: true },
10440
+ { package: "eslint", module: ui2, version: versions.eslint, dev: true },
9694
10441
  { package: "@<%= projectName %>/eslint-config", module: ui2, version: "workspace:*", dev: true },
9695
- { package: "prettier", module: root2, version: "^3.7.4", dev: true }
10442
+ { package: "prettier", module: root2, version: versions.prettier, dev: true }
9696
10443
  ],
9697
10444
  scripts: [
9698
10445
  { module: web2, name: "lint", script: "eslint --fix && next typegen && tsc --noEmit" },
@@ -9735,10 +10482,10 @@ var root3 = "";
9735
10482
  var oxc = {
9736
10483
  templates: [oxlintrc_default, oxfmtrc_default],
9737
10484
  packages: [
9738
- { package: "oxlint", module: web3, version: "^1.74.0", dev: true },
9739
- { package: "oxlint", module: api3, version: "^1.74.0", dev: true },
9740
- { package: "oxlint", module: ui3, version: "^1.74.0", dev: true },
9741
- { package: "oxfmt", module: root3, version: "^0.59.0", dev: true }
10485
+ { package: "oxlint", module: web3, version: versions.oxlint, dev: true },
10486
+ { package: "oxlint", module: api3, version: versions.oxlint, dev: true },
10487
+ { package: "oxlint", module: ui3, version: versions.oxlint, dev: true },
10488
+ { package: "oxfmt", module: root3, version: versions.oxfmt, dev: true }
9742
10489
  ],
9743
10490
  scripts: [
9744
10491
  { module: web3, name: "lint", script: "oxlint --fix && next typegen && tsc --noEmit" },
@@ -9911,11 +10658,11 @@ module.exports = {
9911
10658
  var testingJest = {
9912
10659
  templates: [jest_config_default, jest_e2e_config_default, e2e_spec_default, nestjs_better_auth_mock_default],
9913
10660
  packages: [
9914
- { package: "jest", module: "apps/api", version: "^30.0.0", dev: true },
9915
- { package: "ts-jest", module: "apps/api", version: "^29.2.5", dev: true },
9916
- { package: "@types/jest", module: "apps/api", version: "^30.0.0", dev: true },
9917
- { package: "ts-loader", module: "apps/api", version: "^9.5.2", dev: true },
9918
- { package: "source-map-support", module: "apps/api", version: "^0.5.21", dev: true }
10661
+ { package: "jest", module: "apps/api", version: versions.jest, dev: true },
10662
+ { package: "ts-jest", module: "apps/api", version: versions["ts-jest"], dev: true },
10663
+ { package: "@types/jest", module: "apps/api", version: versions["@types/jest"], dev: true },
10664
+ { package: "ts-loader", module: "apps/api", version: versions["ts-loader"], dev: true },
10665
+ { package: "source-map-support", module: "apps/api", version: versions["source-map-support"], dev: true }
9919
10666
  ],
9920
10667
  scripts: [
9921
10668
  { module: "apps/api", name: "test", script: "jest" },
@@ -9997,10 +10744,10 @@ describe('AppController (e2e)', () => {
9997
10744
  var testingVitest = {
9998
10745
  templates: [vitest_config_default, vitest_config_e2e_default, e2e_spec_default2],
9999
10746
  packages: [
10000
- { package: "vitest", module: "apps/api", version: "^3.0.0", dev: true },
10001
- { package: "@vitest/coverage-v8", module: "apps/api", version: "^3.0.0", dev: true },
10002
- { package: "unplugin-swc", module: "apps/api", version: "^1.5.9", dev: true },
10003
- { package: "@swc/core", module: "apps/api", version: "^1.10.0", dev: true }
10747
+ { package: "vitest", module: "apps/api", version: versions.vitest, dev: true },
10748
+ { package: "@vitest/coverage-v8", module: "apps/api", version: versions["@vitest/coverage-v8"], dev: true },
10749
+ { package: "unplugin-swc", module: "apps/api", version: versions["unplugin-swc"], dev: true },
10750
+ { package: "@swc/core", module: "apps/api", version: versions["@swc/core"], dev: true }
10004
10751
  ],
10005
10752
  scripts: [
10006
10753
  { module: "apps/api", name: "test", script: "vitest run" },
@@ -10212,27 +10959,27 @@ var api_package_json_default = {
10212
10959
  "start:prod": "node dist/main"
10213
10960
  },
10214
10961
  "dependencies": {
10215
- "@nestjs/common": "^11.0.1",
10216
- "@nestjs/core": "^11.0.1",
10217
- "@nestjs/platform-express": "^11.0.1",
10962
+ "@nestjs/common": "<%= versions["@nestjs/common"] %>",
10963
+ "@nestjs/core": "<%= versions["@nestjs/core"] %>",
10964
+ "@nestjs/platform-express": "<%= versions["@nestjs/platform-express"] %>",
10218
10965
  "@<%= projectName %>/auth": "workspace:*",
10219
10966
  "@<%= projectName %>/db": "workspace:*",
10220
- "@thallesp/nestjs-better-auth": "^2.5.1",
10221
- "dotenv": "^17.3.1",
10222
- "reflect-metadata": "^0.2.2",
10223
- "rxjs": "^7.8.1"
10967
+ "@thallesp/nestjs-better-auth": "<%= versions["@thallesp/nestjs-better-auth"] %>",
10968
+ "dotenv": "<%= versions.dotenv %>",
10969
+ "reflect-metadata": "<%= versions["reflect-metadata"] %>",
10970
+ "rxjs": "<%= versions.rxjs %>"
10224
10971
  },
10225
10972
  "devDependencies": {
10226
- "@nestjs/cli": "^11.0.0",
10227
- "@nestjs/schematics": "^11.0.0",
10228
- "@nestjs/testing": "^11.0.1",
10229
- "@types/express": "^5.0.0",
10230
- "@types/node": "^22.10.7",
10231
- "@types/supertest": "^6.0.2",
10232
- "supertest": "^7.0.0",
10233
- "ts-node": "^10.9.2",
10234
- "tsconfig-paths": "^4.2.0",
10235
- "typescript": "6.0.2"
10973
+ "@nestjs/cli": "<%= versions["@nestjs/cli"] %>",
10974
+ "@nestjs/schematics": "<%= versions["@nestjs/schematics"] %>",
10975
+ "@nestjs/testing": "<%= versions["@nestjs/testing"] %>",
10976
+ "@types/express": "<%= versions["@types/express"] %>",
10977
+ "@types/node": "<%= versions["@types/node"] %>",
10978
+ "@types/supertest": "<%= versions["@types/supertest"] %>",
10979
+ "supertest": "<%= versions.supertest %>",
10980
+ "ts-node": "<%= versions["ts-node"] %>",
10981
+ "tsconfig-paths": "<%= versions["tsconfig-paths"] %>",
10982
+ "typescript": "<%= versions.typescript %>"
10236
10983
  }
10237
10984
  }`
10238
10985
  };
@@ -10311,25 +11058,25 @@ var web_package_json_default = {
10311
11058
  "@<%= projectName %>/api": "workspace:*",
10312
11059
  "@<%= projectName %>/auth": "workspace:*",
10313
11060
  "@<%= projectName %>/ui": "workspace:*",
10314
- "@nestjs/core": "^11.0.1",
10315
- "@tailwindcss/postcss": "^4.2.1",
10316
- "dotenv": "^17.3.1",
10317
- "@tanstack/react-form": "^1.28.5",
10318
- "@tanstack/react-query": "^5.90.21",
10319
- "better-auth": "^1.2.8",
10320
- "next": "16.2.10",
10321
- "react": "^19.2.4",
10322
- "react-dom": "^19.2.4",
10323
- "reflect-metadata": "^0.2.2",
10324
- "tailwindcss": "^4.2.1"
11061
+ "@nestjs/core": "<%= versions["@nestjs/core"] %>",
11062
+ "@tailwindcss/postcss": "<%= versions["@tailwindcss/postcss"] %>",
11063
+ "dotenv": "<%= versions.dotenv %>",
11064
+ "@tanstack/react-form": "<%= versions["@tanstack/react-form"] %>",
11065
+ "@tanstack/react-query": "<%= versions["@tanstack/react-query"] %>",
11066
+ "better-auth": "<%= versions["better-auth"] %>",
11067
+ "next": "<%= versions.next %>",
11068
+ "react": "<%= versions.react %>",
11069
+ "react-dom": "<%= versions["react-dom"] %>",
11070
+ "reflect-metadata": "<%= versions["reflect-metadata"] %>",
11071
+ "tailwindcss": "<%= versions.tailwindcss %>"
10325
11072
  },
10326
11073
  "devDependencies": {
10327
11074
  "@<%= projectName %>/typescript-config": "workspace:*",
10328
- "@types/node": "^22.15.3",
10329
- "@types/react": "19.2.14",
10330
- "@types/react-dom": "19.2.3",
10331
- "tsx": "^4.19.4",
10332
- "typescript": "6.0.2"
11075
+ "@types/node": "<%= versions["@types/node"] %>",
11076
+ "@types/react": "<%= versions["@types/react"] %>",
11077
+ "@types/react-dom": "<%= versions["@types/react-dom"] %>",
11078
+ "tsx": "<%= versions.tsx %>",
11079
+ "typescript": "<%= versions.typescript %>"
10333
11080
  }
10334
11081
  }`
10335
11082
  };
@@ -10472,28 +11219,28 @@ var api_package_json_default2 = {
10472
11219
  "start:prod": "node dist/main"
10473
11220
  },
10474
11221
  "dependencies": {
10475
- "@nestjs/common": "^11.0.1",
10476
- "@nestjs/core": "^11.0.1",
10477
- "@nestjs/platform-express": "^11.0.1",
10478
- "@nestjs/serve-static": "^5.0.0",
11222
+ "@nestjs/common": "<%= versions["@nestjs/common"] %>",
11223
+ "@nestjs/core": "<%= versions["@nestjs/core"] %>",
11224
+ "@nestjs/platform-express": "<%= versions["@nestjs/platform-express"] %>",
11225
+ "@nestjs/serve-static": "<%= versions["@nestjs/serve-static"] %>",
10479
11226
  "@<%= projectName %>/auth": "workspace:*",
10480
11227
  "@<%= projectName %>/db": "workspace:*",
10481
- "@thallesp/nestjs-better-auth": "^2.5.1",
10482
- "dotenv": "^17.3.1",
10483
- "reflect-metadata": "^0.2.2",
10484
- "rxjs": "^7.8.1"
11228
+ "@thallesp/nestjs-better-auth": "<%= versions["@thallesp/nestjs-better-auth"] %>",
11229
+ "dotenv": "<%= versions.dotenv %>",
11230
+ "reflect-metadata": "<%= versions["reflect-metadata"] %>",
11231
+ "rxjs": "<%= versions.rxjs %>"
10485
11232
  },
10486
11233
  "devDependencies": {
10487
- "@nestjs/cli": "^11.0.0",
10488
- "@nestjs/schematics": "^11.0.0",
10489
- "@nestjs/testing": "^11.0.1",
10490
- "@types/express": "^5.0.0",
10491
- "@types/node": "^22.10.7",
10492
- "@types/supertest": "^6.0.2",
10493
- "supertest": "^7.0.0",
10494
- "ts-node": "^10.9.2",
10495
- "tsconfig-paths": "^4.2.0",
10496
- "typescript": "6.0.2"
11234
+ "@nestjs/cli": "<%= versions["@nestjs/cli"] %>",
11235
+ "@nestjs/schematics": "<%= versions["@nestjs/schematics"] %>",
11236
+ "@nestjs/testing": "<%= versions["@nestjs/testing"] %>",
11237
+ "@types/express": "<%= versions["@types/express"] %>",
11238
+ "@types/node": "<%= versions["@types/node"] %>",
11239
+ "@types/supertest": "<%= versions["@types/supertest"] %>",
11240
+ "supertest": "<%= versions.supertest %>",
11241
+ "ts-node": "<%= versions["ts-node"] %>",
11242
+ "tsconfig-paths": "<%= versions["tsconfig-paths"] %>",
11243
+ "typescript": "<%= versions.typescript %>"
10497
11244
  }
10498
11245
  }`
10499
11246
  };
@@ -10555,23 +11302,23 @@ var api_package_json_default3 = {
10555
11302
  "build": "nest build"
10556
11303
  },
10557
11304
  "dependencies": {
10558
- "@nestjs/common": "^11.0.1",
10559
- "@nestjs/core": "^11.0.1",
11305
+ "@nestjs/common": "<%= versions["@nestjs/common"] %>",
11306
+ "@nestjs/core": "<%= versions["@nestjs/core"] %>",
10560
11307
  "@<%= projectName %>/auth": "workspace:*",
10561
11308
  "@<%= projectName %>/db": "workspace:*",
10562
- "@thallesp/nestjs-better-auth": "^2.5.1",
10563
- "dotenv": "^17.3.1",
10564
- "reflect-metadata": "^0.2.2",
10565
- "rxjs": "^7.8.1"
11309
+ "@thallesp/nestjs-better-auth": "<%= versions["@thallesp/nestjs-better-auth"] %>",
11310
+ "dotenv": "<%= versions.dotenv %>",
11311
+ "reflect-metadata": "<%= versions["reflect-metadata"] %>",
11312
+ "rxjs": "<%= versions.rxjs %>"
10566
11313
  },
10567
11314
  "devDependencies": {
10568
- "@nestjs/cli": "^11.0.0",
10569
- "@nestjs/schematics": "^11.0.0",
10570
- "@nestjs/testing": "^11.0.1",
10571
- "@types/node": "^22.10.7",
10572
- "ts-node": "^10.9.2",
10573
- "tsconfig-paths": "^4.2.0",
10574
- "typescript": "6.0.2"
11315
+ "@nestjs/cli": "<%= versions["@nestjs/cli"] %>",
11316
+ "@nestjs/schematics": "<%= versions["@nestjs/schematics"] %>",
11317
+ "@nestjs/testing": "<%= versions["@nestjs/testing"] %>",
11318
+ "@types/node": "<%= versions["@types/node"] %>",
11319
+ "ts-node": "<%= versions["ts-node"] %>",
11320
+ "tsconfig-paths": "<%= versions["tsconfig-paths"] %>",
11321
+ "typescript": "<%= versions.typescript %>"
10575
11322
  }
10576
11323
  }`
10577
11324
  };
@@ -10660,25 +11407,25 @@ var web_package_json_default2 = {
10660
11407
  "@<%= projectName %>/auth": "workspace:*",
10661
11408
  "@<%= projectName %>/db": "workspace:*",
10662
11409
  "@<%= projectName %>/ui": "workspace:*",
10663
- "@nestjs/common": "^11.0.1",
10664
- "@nestjs/core": "^11.0.1",
10665
- "reflect-metadata": "^0.2.2",
10666
- "@tailwindcss/postcss": "^4.2.1",
10667
- "dotenv": "^17.3.1",
10668
- "@tanstack/react-form": "^1.28.5",
10669
- "@tanstack/react-query": "^5.90.21",
10670
- "better-auth": "^1.2.8",
10671
- "next": "16.2.10",
10672
- "react": "^19.2.4",
10673
- "react-dom": "^19.2.4",
10674
- "tailwindcss": "^4.2.1"
11410
+ "@nestjs/common": "<%= versions["@nestjs/common"] %>",
11411
+ "@nestjs/core": "<%= versions["@nestjs/core"] %>",
11412
+ "reflect-metadata": "<%= versions["reflect-metadata"] %>",
11413
+ "@tailwindcss/postcss": "<%= versions["@tailwindcss/postcss"] %>",
11414
+ "dotenv": "<%= versions.dotenv %>",
11415
+ "@tanstack/react-form": "<%= versions["@tanstack/react-form"] %>",
11416
+ "@tanstack/react-query": "<%= versions["@tanstack/react-query"] %>",
11417
+ "better-auth": "<%= versions["better-auth"] %>",
11418
+ "next": "<%= versions.next %>",
11419
+ "react": "<%= versions.react %>",
11420
+ "react-dom": "<%= versions["react-dom"] %>",
11421
+ "tailwindcss": "<%= versions.tailwindcss %>"
10675
11422
  },
10676
11423
  "devDependencies": {
10677
11424
  "@<%= projectName %>/typescript-config": "workspace:*",
10678
- "@types/node": "^22.15.3",
10679
- "@types/react": "19.2.14",
10680
- "@types/react-dom": "19.2.3",
10681
- "typescript": "6.0.2"
11425
+ "@types/node": "<%= versions["@types/node"] %>",
11426
+ "@types/react": "<%= versions["@types/react"] %>",
11427
+ "@types/react-dom": "<%= versions["@types/react-dom"] %>",
11428
+ "typescript": "<%= versions.typescript %>"
10682
11429
  }
10683
11430
  }`
10684
11431
  };
@@ -11900,32 +12647,37 @@ var staticDirPath = fileURLToPath(staticDir);
11900
12647
  function getStaticFilePath(name) {
11901
12648
  return fileURLToPath(new URL(`./static/${name}`, import.meta.url));
11902
12649
  }
11903
- var templates = {
11904
- root: root_default,
11905
- web: web_default,
11906
- api: api_default,
11907
- auth: auth_default,
11908
- dbSqlite,
11909
- dbPostgres,
11910
- ui: ui_default,
11911
- shadcnUi: shadcn_ui_default,
11912
- eslintConfig: eslint_config_default4,
11913
- oxc: oxc_default,
11914
- typescriptConfig: typescript_config_default,
11915
- testingJest: testing_jest_default,
11916
- testingVitest: testing_vitest_default,
11917
- deploymentStandalone: deployment_standalone_default,
11918
- deploymentCustomServer: single_process_custom_server_default,
11919
- deploymentSpa: single_process_static_export_default,
11920
- nestDiOnly: nest_di_only_default,
11921
- deploymentStandaloneDi: deployment_standalone_di_default,
11922
- apiControllers: api_controllers_default,
11923
- todoExampleApi,
11924
- todoExampleControllers,
11925
- todoExampleDi,
11926
- todoExampleWeb,
11927
- todoExampleShadcn
11928
- };
12650
+ function selectModules(selection) {
12651
+ const { deployment, nestDiOnly: nestDiOnly2, todoExample, shadcn, database, linter, testing } = selection;
12652
+ const deploymentModule = deployment === "standalone" ? deployment_standalone_default : deployment === "custom-server" ? single_process_custom_server_default : deployment === "spa" ? single_process_static_export_default : null;
12653
+ const webModule = deployment === "spa" ? {
12654
+ ...web_default,
12655
+ templates: web_default.templates.filter(
12656
+ (t) => t.filename !== "apps/web/app/api/auth/[...all]/route.ts"
12657
+ )
12658
+ } : web_default;
12659
+ return [
12660
+ root_default,
12661
+ webModule,
12662
+ api_default,
12663
+ database === "postgres" ? dbPostgres : dbSqlite,
12664
+ auth_default,
12665
+ shadcn ? shadcn_ui_default : ui_default,
12666
+ linter === "oxc" ? oxc_default : eslint_config_default4,
12667
+ typescript_config_default,
12668
+ testing === "vitest" ? testing_vitest_default : testing_jest_default,
12669
+ ...deploymentModule ? [deploymentModule] : [],
12670
+ ...nestDiOnly2 ? [nest_di_only_default] : [api_controllers_default],
12671
+ // nest-di-only overwrites the standalone next.config.js and leaves the
12672
+ // Dockerfile pointing at an api entrypoint DI-only never emits
12673
+ ...nestDiOnly2 && deployment === "standalone" ? [deployment_standalone_di_default] : [],
12674
+ ...todoExample ? [
12675
+ todoExampleApi,
12676
+ ...nestDiOnly2 ? [todoExampleDi] : [todoExampleControllers],
12677
+ shadcn ? todoExampleShadcn : todoExampleWeb
12678
+ ] : []
12679
+ ];
12680
+ }
11929
12681
 
11930
12682
  // src/tasks.ts
11931
12683
  import { randomBytes } from "crypto";
@@ -12108,7 +12860,8 @@ async function scaffold(modules, options) {
12108
12860
  testing: options.testing,
12109
12861
  database: options.database,
12110
12862
  deployment: options.deployment,
12111
- authSecret: randomBytes(32).toString("base64url")
12863
+ authSecret: randomBytes(32).toString("base64url"),
12864
+ versions
12112
12865
  };
12113
12866
  await renderTemplatesToDisk(modules, options.name, templateData, options.selection);
12114
12867
  const packages = modules.map((mod) => mod.packages).filter((ele) => ele !== void 0).flat();
@@ -12238,34 +12991,16 @@ async function doInit(options) {
12238
12991
  if (!deploymentCombo.valid) {
12239
12992
  throw new Error(deploymentCombo.error);
12240
12993
  }
12241
- const deploymentModule = deployment === "standalone" ? templates.deploymentStandalone : deployment === "custom-server" ? templates.deploymentCustomServer : deployment === "spa" ? templates.deploymentSpa : null;
12242
- const webModule = deployment === "spa" ? {
12243
- ...templates.web,
12244
- templates: templates.web.templates.filter(
12245
- (t) => t.filename !== "apps/web/app/api/auth/[...all]/route.ts"
12246
- )
12247
- } : templates.web;
12248
- const allModules = [
12249
- templates.root,
12250
- webModule,
12251
- templates.api,
12252
- database === "postgres" ? templates.dbPostgres : templates.dbSqlite,
12253
- templates.auth,
12254
- useShadcn ? templates.shadcnUi : templates.ui,
12255
- linter === "oxc" ? templates.oxc : templates.eslintConfig,
12256
- templates.typescriptConfig,
12257
- testing === "vitest" ? templates.testingVitest : templates.testingJest,
12258
- ...deploymentModule ? [deploymentModule] : [],
12259
- ...nestDiOnly2 ? [templates.nestDiOnly] : [templates.apiControllers],
12260
- // nest-di-only overwrites the standalone next.config.js and leaves the
12261
- // Dockerfile pointing at an api entrypoint DI-only never emits
12262
- ...nestDiOnly2 && deployment === "standalone" ? [templates.deploymentStandaloneDi] : [],
12263
- ...todoExample ? [
12264
- templates.todoExampleApi,
12265
- ...nestDiOnly2 ? [templates.todoExampleDi] : [templates.todoExampleControllers],
12266
- useShadcn ? templates.todoExampleShadcn : templates.todoExampleWeb
12267
- ] : []
12268
- ];
12994
+ const selection = {
12995
+ deployment,
12996
+ nestDiOnly: nestDiOnly2,
12997
+ todoExample,
12998
+ shadcn: useShadcn,
12999
+ database,
13000
+ linter,
13001
+ testing
13002
+ };
13003
+ const allModules = selectModules(selection);
12269
13004
  const name = group2.name ?? options.name ?? "";
12270
13005
  const taskBuilder = new TaskBuilder();
12271
13006
  taskBuilder.add({
@@ -12276,7 +13011,7 @@ async function doInit(options) {
12276
13011
  testing,
12277
13012
  database,
12278
13013
  deployment,
12279
- selection: { deployment, nestDiOnly: nestDiOnly2, todoExample, shadcn: useShadcn, database }
13014
+ selection
12280
13015
  });
12281
13016
  return "Scaffolded.";
12282
13017
  }