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