create-better-fullstack 2.0.2 → 2.0.3

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.
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { g as getDefaultConfig, n as readBtsConfig, r as updateBtsConfig } from "./bts-config-Bg1Qea9Y.mjs";
3
- import { W as renderTitle, c as applyDependencyVersionChannel, t as installDependencies, u as getAddonsToAdd } from "./install-dependencies-D6-GO3BZ.mjs";
3
+ import { W as renderTitle, c as applyDependencyVersionChannel, t as installDependencies, u as getAddonsToAdd } from "./install-dependencies-D0Z1dZEx.mjs";
4
4
  import { a as CLIError, f as isSilent, o as UserCancelledError, p as runWithContextAsync, t as setupAddons } from "./addons-setup-HSghQS7c.mjs";
5
5
  import { intro, log, outro } from "@clack/prompts";
6
6
  import pc from "picocolors";
package/dist/cli.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  //#region src/cli.ts
3
3
  if (process.argv[2] === "mcp" && process.argv.length === 3) import("./mcp-58r70ZcL.mjs").then((m) => m.startMcpServer());
4
- else import("./run-QRBymn-p.mjs").then((m) => m.createBtsCli().run());
4
+ else import("./run-DCxVLUMS.mjs").then((m) => m.createBtsCli().run());
5
5
 
6
6
  //#endregion
7
7
  export { };
package/dist/index.d.mts CHANGED
@@ -22,10 +22,10 @@ declare const router: {
22
22
  create: _orpc_server0.Procedure<_orpc_server0.MergedInitialContext<Record<never, never>, Record<never, never>, Record<never, never>>, Record<never, never>, z.ZodTuple<[z.ZodOptional<z.ZodString>, z.ZodObject<{
23
23
  template: z.ZodOptional<z.ZodEnum<{
24
24
  none: "none";
25
- uniwind: "uniwind";
26
25
  mern: "mern";
27
26
  pern: "pern";
28
27
  t3: "t3";
28
+ uniwind: "uniwind";
29
29
  }>>;
30
30
  yes: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
31
31
  yolo: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
@@ -101,8 +101,8 @@ declare const router: {
101
101
  uppy: "uppy";
102
102
  }>>;
103
103
  effect: z.ZodOptional<z.ZodEnum<{
104
- effect: "effect";
105
104
  none: "none";
105
+ effect: "effect";
106
106
  "effect-full": "effect-full";
107
107
  }>>;
108
108
  stateManagement: z.ZodOptional<z.ZodEnum<{
@@ -252,9 +252,9 @@ declare const router: {
252
252
  }>>;
253
253
  mobileUI: z.ZodOptional<z.ZodEnum<{
254
254
  none: "none";
255
+ uniwind: "uniwind";
255
256
  tamagui: "tamagui";
256
257
  "gluestack-ui": "gluestack-ui";
257
- uniwind: "uniwind";
258
258
  unistyles: "unistyles";
259
259
  }>>;
260
260
  mobileStorage: z.ZodOptional<z.ZodEnum<{
@@ -319,6 +319,7 @@ declare const router: {
319
319
  mcp: "mcp";
320
320
  skills: "skills";
321
321
  turborepo: "turborepo";
322
+ nx: "nx";
322
323
  fumadocs: "fumadocs";
323
324
  ultracite: "ultracite";
324
325
  oxlint: "oxlint";
@@ -336,8 +337,8 @@ declare const router: {
336
337
  "docker-compose": "docker-compose";
337
338
  }>>>;
338
339
  examples: z.ZodOptional<z.ZodArray<z.ZodEnum<{
339
- ai: "ai";
340
340
  none: "none";
341
+ ai: "ai";
341
342
  "chat-sdk": "chat-sdk";
342
343
  "tanstack-showcase": "tanstack-showcase";
343
344
  }>>>;
@@ -393,6 +394,7 @@ declare const router: {
393
394
  "ts-rest": "ts-rest";
394
395
  garph: "garph";
395
396
  "graphql-yoga": "graphql-yoga";
397
+ openapi: "openapi";
396
398
  }>>;
397
399
  cssFramework: z.ZodOptional<z.ZodEnum<{
398
400
  none: "none";
@@ -484,8 +486,8 @@ declare const router: {
484
486
  "geist-mono": "geist-mono";
485
487
  }>>;
486
488
  shadcnRadius: z.ZodOptional<z.ZodEnum<{
487
- default: "default";
488
489
  none: "none";
490
+ default: "default";
489
491
  small: "small";
490
492
  medium: "medium";
491
493
  large: "large";
@@ -513,10 +515,10 @@ declare const router: {
513
515
  vercel: "vercel";
514
516
  }>>;
515
517
  directoryConflict: z.ZodOptional<z.ZodEnum<{
516
- error: "error";
517
518
  merge: "merge";
518
519
  overwrite: "overwrite";
519
520
  increment: "increment";
521
+ error: "error";
520
522
  }>>;
521
523
  renderTitle: z.ZodOptional<z.ZodBoolean>;
522
524
  disableAnalytics: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
@@ -549,12 +551,12 @@ declare const router: {
549
551
  ratatui: "ratatui";
550
552
  }>>;
551
553
  rustLibraries: z.ZodOptional<z.ZodArray<z.ZodEnum<{
552
- config: "config";
553
554
  none: "none";
554
555
  serde: "serde";
555
556
  uuid: "uuid";
556
557
  chrono: "chrono";
557
558
  reqwest: "reqwest";
559
+ config: "config";
558
560
  dashmap: "dashmap";
559
561
  "parking-lot": "parking-lot";
560
562
  secrecy: "secrecy";
@@ -969,8 +971,8 @@ declare const router: {
969
971
  }>>;
970
972
  elixirLibraries: z.ZodOptional<z.ZodArray<z.ZodEnum<{
971
973
  none: "none";
972
- broadway: "broadway";
973
974
  nx: "nx";
975
+ broadway: "broadway";
974
976
  }>>>;
975
977
  aiDocs: z.ZodOptional<z.ZodArray<z.ZodEnum<{
976
978
  none: "none";
@@ -990,7 +992,7 @@ declare const router: {
990
992
  backend: "none" | "hono" | "express" | "fastify" | "elysia" | "fets" | "nestjs" | "adonisjs" | "nitro" | "encore" | "convex" | "self";
991
993
  runtime: "none" | "bun" | "node" | "workers";
992
994
  frontend: ("none" | "tanstack-router" | "react-router" | "react-vite" | "tanstack-start" | "next" | "vinext" | "nuxt" | "native-bare" | "native-uniwind" | "native-unistyles" | "svelte" | "solid" | "solid-start" | "astro" | "qwik" | "angular" | "redwood" | "fresh")[];
993
- addons: ("none" | "pwa" | "tauri" | "starlight" | "biome" | "lefthook" | "husky" | "ruler" | "mcp" | "skills" | "turborepo" | "fumadocs" | "ultracite" | "oxlint" | "opentui" | "wxt" | "msw" | "storybook" | "swr" | "tanstack-query" | "tanstack-table" | "tanstack-virtual" | "tanstack-db" | "tanstack-pacer" | "backend-utils" | "docker-compose")[];
995
+ addons: ("none" | "pwa" | "tauri" | "starlight" | "biome" | "lefthook" | "husky" | "ruler" | "mcp" | "skills" | "turborepo" | "nx" | "fumadocs" | "ultracite" | "oxlint" | "opentui" | "wxt" | "msw" | "storybook" | "swr" | "tanstack-query" | "tanstack-table" | "tanstack-virtual" | "tanstack-db" | "tanstack-pacer" | "backend-utils" | "docker-compose")[];
994
996
  examples: ("ai" | "none" | "chat-sdk" | "tanstack-showcase")[];
995
997
  auth: "none" | "better-auth" | "better-auth-organizations" | "go-better-auth" | "clerk" | "nextauth" | "stack-auth" | "supabase-auth" | "auth0" | "workos" | "kinde";
996
998
  payments: "none" | "polar" | "stripe" | "lemon-squeezy" | "paddle" | "dodo";
@@ -999,7 +1001,7 @@ declare const router: {
999
1001
  versionChannel: "stable" | "latest" | "beta";
1000
1002
  install: boolean;
1001
1003
  dbSetup: "none" | "turso" | "neon" | "prisma-postgres" | "planetscale" | "mongodb-atlas" | "supabase" | "upstash" | "d1" | "docker";
1002
- api: "none" | "trpc" | "orpc" | "ts-rest" | "garph" | "graphql-yoga";
1004
+ api: "none" | "trpc" | "orpc" | "ts-rest" | "garph" | "graphql-yoga" | "openapi";
1003
1005
  webDeploy: "none" | "docker" | "cloudflare" | "fly" | "railway" | "render" | "netlify" | "sst" | "vercel";
1004
1006
  serverDeploy: "none" | "docker" | "cloudflare" | "fly" | "railway" | "render" | "netlify" | "sst" | "vercel";
1005
1007
  ai: "none" | "langgraph" | "google-adk" | "langchain" | "llamaindex" | "vercel-ai" | "mastra" | "voltagent" | "openai-agents" | "modelfusion" | "tanstack-ai" | "ai-cli";
@@ -1037,7 +1039,7 @@ declare const router: {
1037
1039
  rustOrm: "none" | "sea-orm" | "sqlx" | "diesel";
1038
1040
  rustApi: "none" | "tonic" | "async-graphql";
1039
1041
  rustCli: "none" | "clap" | "ratatui";
1040
- rustLibraries: ("none" | "config" | "serde" | "uuid" | "chrono" | "reqwest" | "dashmap" | "parking-lot" | "secrecy" | "tokio-util" | "utoipa" | "validator" | "jsonwebtoken" | "argon2" | "tokio-test" | "mockall" | "proptest" | "insta")[];
1042
+ rustLibraries: ("none" | "serde" | "uuid" | "chrono" | "reqwest" | "config" | "dashmap" | "parking-lot" | "secrecy" | "tokio-util" | "utoipa" | "validator" | "jsonwebtoken" | "argon2" | "tokio-test" | "mockall" | "proptest" | "insta")[];
1041
1043
  rustLogging: "none" | "tracing" | "env-logger";
1042
1044
  rustErrorHandling: "none" | "anyhow-thiserror" | "eyre";
1043
1045
  rustCaching: "none" | "redis" | "moka";
@@ -1106,7 +1108,7 @@ declare const router: {
1106
1108
  elixirTesting: "none" | "ex_unit" | "mox" | "bypass" | "wallaby";
1107
1109
  elixirQuality: "none" | "credo" | "dialyxir" | "sobelow";
1108
1110
  elixirDeploy: "none" | "docker" | "fly" | "gigalixir" | "mix-release";
1109
- elixirLibraries: ("none" | "broadway" | "nx")[];
1111
+ elixirLibraries: ("none" | "nx" | "broadway")[];
1110
1112
  aiDocs: ("none" | "claude-md" | "agents-md" | "cursorrules")[];
1111
1113
  astroIntegration?: "none" | "svelte" | "solid" | "react" | "vue" | undefined;
1112
1114
  shadcnBase?: "radix" | "base" | undefined;
@@ -1150,7 +1152,7 @@ declare const router: {
1150
1152
  backend: "none" | "hono" | "express" | "fastify" | "elysia" | "fets" | "nestjs" | "adonisjs" | "nitro" | "encore" | "convex" | "self";
1151
1153
  runtime: "none" | "bun" | "node" | "workers";
1152
1154
  frontend: ("none" | "tanstack-router" | "react-router" | "react-vite" | "tanstack-start" | "next" | "vinext" | "nuxt" | "native-bare" | "native-uniwind" | "native-unistyles" | "svelte" | "solid" | "solid-start" | "astro" | "qwik" | "angular" | "redwood" | "fresh")[];
1153
- addons: ("none" | "pwa" | "tauri" | "starlight" | "biome" | "lefthook" | "husky" | "ruler" | "mcp" | "skills" | "turborepo" | "fumadocs" | "ultracite" | "oxlint" | "opentui" | "wxt" | "msw" | "storybook" | "swr" | "tanstack-query" | "tanstack-table" | "tanstack-virtual" | "tanstack-db" | "tanstack-pacer" | "backend-utils" | "docker-compose")[];
1155
+ addons: ("none" | "pwa" | "tauri" | "starlight" | "biome" | "lefthook" | "husky" | "ruler" | "mcp" | "skills" | "turborepo" | "nx" | "fumadocs" | "ultracite" | "oxlint" | "opentui" | "wxt" | "msw" | "storybook" | "swr" | "tanstack-query" | "tanstack-table" | "tanstack-virtual" | "tanstack-db" | "tanstack-pacer" | "backend-utils" | "docker-compose")[];
1154
1156
  examples: ("ai" | "none" | "chat-sdk" | "tanstack-showcase")[];
1155
1157
  auth: "none" | "better-auth" | "better-auth-organizations" | "go-better-auth" | "clerk" | "nextauth" | "stack-auth" | "supabase-auth" | "auth0" | "workos" | "kinde";
1156
1158
  payments: "none" | "polar" | "stripe" | "lemon-squeezy" | "paddle" | "dodo";
@@ -1159,7 +1161,7 @@ declare const router: {
1159
1161
  versionChannel: "stable" | "latest" | "beta";
1160
1162
  install: boolean;
1161
1163
  dbSetup: "none" | "turso" | "neon" | "prisma-postgres" | "planetscale" | "mongodb-atlas" | "supabase" | "upstash" | "d1" | "docker";
1162
- api: "none" | "trpc" | "orpc" | "ts-rest" | "garph" | "graphql-yoga";
1164
+ api: "none" | "trpc" | "orpc" | "ts-rest" | "garph" | "graphql-yoga" | "openapi";
1163
1165
  webDeploy: "none" | "docker" | "cloudflare" | "fly" | "railway" | "render" | "netlify" | "sst" | "vercel";
1164
1166
  serverDeploy: "none" | "docker" | "cloudflare" | "fly" | "railway" | "render" | "netlify" | "sst" | "vercel";
1165
1167
  ai: "none" | "langgraph" | "google-adk" | "langchain" | "llamaindex" | "vercel-ai" | "mastra" | "voltagent" | "openai-agents" | "modelfusion" | "tanstack-ai" | "ai-cli";
@@ -1197,7 +1199,7 @@ declare const router: {
1197
1199
  rustOrm: "none" | "sea-orm" | "sqlx" | "diesel";
1198
1200
  rustApi: "none" | "tonic" | "async-graphql";
1199
1201
  rustCli: "none" | "clap" | "ratatui";
1200
- rustLibraries: ("none" | "config" | "serde" | "uuid" | "chrono" | "reqwest" | "dashmap" | "parking-lot" | "secrecy" | "tokio-util" | "utoipa" | "validator" | "jsonwebtoken" | "argon2" | "tokio-test" | "mockall" | "proptest" | "insta")[];
1202
+ rustLibraries: ("none" | "serde" | "uuid" | "chrono" | "reqwest" | "config" | "dashmap" | "parking-lot" | "secrecy" | "tokio-util" | "utoipa" | "validator" | "jsonwebtoken" | "argon2" | "tokio-test" | "mockall" | "proptest" | "insta")[];
1201
1203
  rustLogging: "none" | "tracing" | "env-logger";
1202
1204
  rustErrorHandling: "none" | "anyhow-thiserror" | "eyre";
1203
1205
  rustCaching: "none" | "redis" | "moka";
@@ -1266,7 +1268,7 @@ declare const router: {
1266
1268
  elixirTesting: "none" | "ex_unit" | "mox" | "bypass" | "wallaby";
1267
1269
  elixirQuality: "none" | "credo" | "dialyxir" | "sobelow";
1268
1270
  elixirDeploy: "none" | "docker" | "fly" | "gigalixir" | "mix-release";
1269
- elixirLibraries: ("none" | "broadway" | "nx")[];
1271
+ elixirLibraries: ("none" | "nx" | "broadway")[];
1270
1272
  aiDocs: ("none" | "claude-md" | "agents-md" | "cursorrules")[];
1271
1273
  astroIntegration?: "none" | "svelte" | "solid" | "react" | "vue" | undefined;
1272
1274
  shadcnBase?: "radix" | "base" | undefined;
@@ -1323,7 +1325,7 @@ declare const router: {
1323
1325
  backend: "none" | "hono" | "express" | "fastify" | "elysia" | "fets" | "nestjs" | "adonisjs" | "nitro" | "encore" | "convex" | "self";
1324
1326
  runtime: "none" | "bun" | "node" | "workers";
1325
1327
  frontend: ("none" | "tanstack-router" | "react-router" | "react-vite" | "tanstack-start" | "next" | "vinext" | "nuxt" | "native-bare" | "native-uniwind" | "native-unistyles" | "svelte" | "solid" | "solid-start" | "astro" | "qwik" | "angular" | "redwood" | "fresh")[];
1326
- addons: ("none" | "pwa" | "tauri" | "starlight" | "biome" | "lefthook" | "husky" | "ruler" | "mcp" | "skills" | "turborepo" | "fumadocs" | "ultracite" | "oxlint" | "opentui" | "wxt" | "msw" | "storybook" | "swr" | "tanstack-query" | "tanstack-table" | "tanstack-virtual" | "tanstack-db" | "tanstack-pacer" | "backend-utils" | "docker-compose")[];
1328
+ addons: ("none" | "pwa" | "tauri" | "starlight" | "biome" | "lefthook" | "husky" | "ruler" | "mcp" | "skills" | "turborepo" | "nx" | "fumadocs" | "ultracite" | "oxlint" | "opentui" | "wxt" | "msw" | "storybook" | "swr" | "tanstack-query" | "tanstack-table" | "tanstack-virtual" | "tanstack-db" | "tanstack-pacer" | "backend-utils" | "docker-compose")[];
1327
1329
  examples: ("ai" | "none" | "chat-sdk" | "tanstack-showcase")[];
1328
1330
  auth: "none" | "better-auth" | "better-auth-organizations" | "go-better-auth" | "clerk" | "nextauth" | "stack-auth" | "supabase-auth" | "auth0" | "workos" | "kinde";
1329
1331
  payments: "none" | "polar" | "stripe" | "lemon-squeezy" | "paddle" | "dodo";
@@ -1332,7 +1334,7 @@ declare const router: {
1332
1334
  versionChannel: "stable" | "latest" | "beta";
1333
1335
  install: boolean;
1334
1336
  dbSetup: "none" | "turso" | "neon" | "prisma-postgres" | "planetscale" | "mongodb-atlas" | "supabase" | "upstash" | "d1" | "docker";
1335
- api: "none" | "trpc" | "orpc" | "ts-rest" | "garph" | "graphql-yoga";
1337
+ api: "none" | "trpc" | "orpc" | "ts-rest" | "garph" | "graphql-yoga" | "openapi";
1336
1338
  webDeploy: "none" | "docker" | "cloudflare" | "fly" | "railway" | "render" | "netlify" | "sst" | "vercel";
1337
1339
  serverDeploy: "none" | "docker" | "cloudflare" | "fly" | "railway" | "render" | "netlify" | "sst" | "vercel";
1338
1340
  ai: "none" | "langgraph" | "google-adk" | "langchain" | "llamaindex" | "vercel-ai" | "mastra" | "voltagent" | "openai-agents" | "modelfusion" | "tanstack-ai" | "ai-cli";
@@ -1370,7 +1372,7 @@ declare const router: {
1370
1372
  rustOrm: "none" | "sea-orm" | "sqlx" | "diesel";
1371
1373
  rustApi: "none" | "tonic" | "async-graphql";
1372
1374
  rustCli: "none" | "clap" | "ratatui";
1373
- rustLibraries: ("none" | "config" | "serde" | "uuid" | "chrono" | "reqwest" | "dashmap" | "parking-lot" | "secrecy" | "tokio-util" | "utoipa" | "validator" | "jsonwebtoken" | "argon2" | "tokio-test" | "mockall" | "proptest" | "insta")[];
1375
+ rustLibraries: ("none" | "serde" | "uuid" | "chrono" | "reqwest" | "config" | "dashmap" | "parking-lot" | "secrecy" | "tokio-util" | "utoipa" | "validator" | "jsonwebtoken" | "argon2" | "tokio-test" | "mockall" | "proptest" | "insta")[];
1374
1376
  rustLogging: "none" | "tracing" | "env-logger";
1375
1377
  rustErrorHandling: "none" | "anyhow-thiserror" | "eyre";
1376
1378
  rustCaching: "none" | "redis" | "moka";
@@ -1439,7 +1441,7 @@ declare const router: {
1439
1441
  elixirTesting: "none" | "ex_unit" | "mox" | "bypass" | "wallaby";
1440
1442
  elixirQuality: "none" | "credo" | "dialyxir" | "sobelow";
1441
1443
  elixirDeploy: "none" | "docker" | "fly" | "gigalixir" | "mix-release";
1442
- elixirLibraries: ("none" | "broadway" | "nx")[];
1444
+ elixirLibraries: ("none" | "nx" | "broadway")[];
1443
1445
  aiDocs: ("none" | "claude-md" | "agents-md" | "cursorrules")[];
1444
1446
  astroIntegration?: "none" | "svelte" | "solid" | "react" | "vue" | undefined;
1445
1447
  shadcnBase?: "radix" | "base" | undefined;
@@ -1483,7 +1485,7 @@ declare const router: {
1483
1485
  backend: "none" | "hono" | "express" | "fastify" | "elysia" | "fets" | "nestjs" | "adonisjs" | "nitro" | "encore" | "convex" | "self";
1484
1486
  runtime: "none" | "bun" | "node" | "workers";
1485
1487
  frontend: ("none" | "tanstack-router" | "react-router" | "react-vite" | "tanstack-start" | "next" | "vinext" | "nuxt" | "native-bare" | "native-uniwind" | "native-unistyles" | "svelte" | "solid" | "solid-start" | "astro" | "qwik" | "angular" | "redwood" | "fresh")[];
1486
- addons: ("none" | "pwa" | "tauri" | "starlight" | "biome" | "lefthook" | "husky" | "ruler" | "mcp" | "skills" | "turborepo" | "fumadocs" | "ultracite" | "oxlint" | "opentui" | "wxt" | "msw" | "storybook" | "swr" | "tanstack-query" | "tanstack-table" | "tanstack-virtual" | "tanstack-db" | "tanstack-pacer" | "backend-utils" | "docker-compose")[];
1488
+ addons: ("none" | "pwa" | "tauri" | "starlight" | "biome" | "lefthook" | "husky" | "ruler" | "mcp" | "skills" | "turborepo" | "nx" | "fumadocs" | "ultracite" | "oxlint" | "opentui" | "wxt" | "msw" | "storybook" | "swr" | "tanstack-query" | "tanstack-table" | "tanstack-virtual" | "tanstack-db" | "tanstack-pacer" | "backend-utils" | "docker-compose")[];
1487
1489
  examples: ("ai" | "none" | "chat-sdk" | "tanstack-showcase")[];
1488
1490
  auth: "none" | "better-auth" | "better-auth-organizations" | "go-better-auth" | "clerk" | "nextauth" | "stack-auth" | "supabase-auth" | "auth0" | "workos" | "kinde";
1489
1491
  payments: "none" | "polar" | "stripe" | "lemon-squeezy" | "paddle" | "dodo";
@@ -1492,7 +1494,7 @@ declare const router: {
1492
1494
  versionChannel: "stable" | "latest" | "beta";
1493
1495
  install: boolean;
1494
1496
  dbSetup: "none" | "turso" | "neon" | "prisma-postgres" | "planetscale" | "mongodb-atlas" | "supabase" | "upstash" | "d1" | "docker";
1495
- api: "none" | "trpc" | "orpc" | "ts-rest" | "garph" | "graphql-yoga";
1497
+ api: "none" | "trpc" | "orpc" | "ts-rest" | "garph" | "graphql-yoga" | "openapi";
1496
1498
  webDeploy: "none" | "docker" | "cloudflare" | "fly" | "railway" | "render" | "netlify" | "sst" | "vercel";
1497
1499
  serverDeploy: "none" | "docker" | "cloudflare" | "fly" | "railway" | "render" | "netlify" | "sst" | "vercel";
1498
1500
  ai: "none" | "langgraph" | "google-adk" | "langchain" | "llamaindex" | "vercel-ai" | "mastra" | "voltagent" | "openai-agents" | "modelfusion" | "tanstack-ai" | "ai-cli";
@@ -1530,7 +1532,7 @@ declare const router: {
1530
1532
  rustOrm: "none" | "sea-orm" | "sqlx" | "diesel";
1531
1533
  rustApi: "none" | "tonic" | "async-graphql";
1532
1534
  rustCli: "none" | "clap" | "ratatui";
1533
- rustLibraries: ("none" | "config" | "serde" | "uuid" | "chrono" | "reqwest" | "dashmap" | "parking-lot" | "secrecy" | "tokio-util" | "utoipa" | "validator" | "jsonwebtoken" | "argon2" | "tokio-test" | "mockall" | "proptest" | "insta")[];
1535
+ rustLibraries: ("none" | "serde" | "uuid" | "chrono" | "reqwest" | "config" | "dashmap" | "parking-lot" | "secrecy" | "tokio-util" | "utoipa" | "validator" | "jsonwebtoken" | "argon2" | "tokio-test" | "mockall" | "proptest" | "insta")[];
1534
1536
  rustLogging: "none" | "tracing" | "env-logger";
1535
1537
  rustErrorHandling: "none" | "anyhow-thiserror" | "eyre";
1536
1538
  rustCaching: "none" | "redis" | "moka";
@@ -1599,7 +1601,7 @@ declare const router: {
1599
1601
  elixirTesting: "none" | "ex_unit" | "mox" | "bypass" | "wallaby";
1600
1602
  elixirQuality: "none" | "credo" | "dialyxir" | "sobelow";
1601
1603
  elixirDeploy: "none" | "docker" | "fly" | "gigalixir" | "mix-release";
1602
- elixirLibraries: ("none" | "broadway" | "nx")[];
1604
+ elixirLibraries: ("none" | "nx" | "broadway")[];
1603
1605
  aiDocs: ("none" | "claude-md" | "agents-md" | "cursorrules")[];
1604
1606
  astroIntegration?: "none" | "svelte" | "solid" | "react" | "vue" | undefined;
1605
1607
  shadcnBase?: "radix" | "base" | undefined;
@@ -1661,6 +1663,7 @@ declare const router: {
1661
1663
  mcp: "mcp";
1662
1664
  skills: "skills";
1663
1665
  turborepo: "turborepo";
1666
+ nx: "nx";
1664
1667
  fumadocs: "fumadocs";
1665
1668
  ultracite: "ultracite";
1666
1669
  oxlint: "oxlint";
package/dist/index.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import "./bts-config-Bg1Qea9Y.mjs";
3
- import { a as docs, c as sponsors, i as createBtsCli, n as builder, o as history, r as create, s as router, t as add } from "./run-DQlymC4z.mjs";
4
- import "./install-dependencies-D6-GO3BZ.mjs";
3
+ import { a as docs, c as sponsors, i as createBtsCli, n as builder, o as history, r as create, s as router, t as add } from "./run-BhcXBjxh.mjs";
4
+ import "./install-dependencies-D0Z1dZEx.mjs";
5
5
  import "./addons-setup-HSghQS7c.mjs";
6
6
  import { EMBEDDED_TEMPLATES, TEMPLATE_COUNT, VirtualFileSystem, generateVirtualProject } from "@better-fullstack/template-generator";
7
7
 
@@ -280,6 +280,7 @@ function getCompatibleAddons$1(allAddons, frontend, existingAddons = [], auth, b
280
280
  });
281
281
  }
282
282
  function validateAddonsAgainstFrontends(addons = [], frontends = [], auth, backend, runtime, ecosystem, rustFrontend, javaWebFramework, database) {
283
+ if (addons.includes("nx") && addons.includes("turborepo")) exitWithError("Nx and Turborepo are alternative workspace runners. Choose one addon.");
283
284
  for (const addon of addons) {
284
285
  if (addon === "none") continue;
285
286
  const { isCompatible, reason } = validateAddonCompatibility$1(addon, frontends, auth, backend, runtime, ecosystem, rustFrontend, javaWebFramework, database);
@@ -635,6 +636,10 @@ function getAddonDisplay(addon) {
635
636
  label = "Turborepo";
636
637
  hint = "High-performance build system";
637
638
  break;
639
+ case "nx":
640
+ label = "Nx";
641
+ hint = "Smart monorepo task runner and cache";
642
+ break;
638
643
  case "pwa":
639
644
  label = "PWA";
640
645
  hint = "Make your app installable and work offline";
@@ -743,6 +748,7 @@ function getAddonDisplay(addon) {
743
748
  const ADDON_GROUPS = {
744
749
  Tooling: [
745
750
  "turborepo",
751
+ "nx",
746
752
  "biome",
747
753
  "oxlint",
748
754
  "ultracite",
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { _ as getUserPkgManager, c as getGraphPart, d as hasGraphPart, f as types_exports, g as getDefaultConfig, h as DEFAULT_UI_LIBRARY_BY_FRONTEND, i as writeBtsConfig, l as getGraphSummary, m as DEFAULT_CONFIG, o as getGraphBackendDeployInstructions, p as getLatestCLIVersion, s as getGraphBackendUrl, u as getPrimaryGraphPart } from "./bts-config-Bg1Qea9Y.mjs";
3
- import { A as validateAddonsAgainstFrontends, B as validateWorkersCompatibility, C as isExampleAIAllowed$1, D as requiresChatSdkVercelAI, E as isWebFrontend$1, F as validateServerDeployRequiresBackend, H as incompatibilityError, I as validateUILibraryCSSFrameworkCompatibility, L as validateUILibraryFrontendCompatibility, M as validateExamplesCompatibility, N as validatePaymentsCompatibility, O as splitFrontends$1, P as validateSelfBackendCompatibility, R as validateWebDeployFrontendTemplates, S as hasWebStyling$1, T as isFrontendAllowedWithBackend$1, U as missingRequirementError, V as constraintError, W as renderTitle, _ as isGoBack, a as runMavenTests, b as getCompatibleCSSFrameworks$1, c as applyDependencyVersionChannel, d as isCancel$1, f as navigableConfirm, g as GO_BACK_SYMBOL, h as setIsFirstPrompt, i as runGradleTests, j as validateApiFrontendCompatibility, k as validateAIFrontendCompatibility, l as getAddonsChoice, m as navigableSelect, n as runCargoBuild, o as runMixCompile, p as navigableMultiselect, r as runGoModTidy, s as runUvSync, t as installDependencies, v as allowedApisForFrontends$1, w as isExampleChatSdkAllowed$1, x as getCompatibleUILibraries$1, y as ensureSingleWebAndNative, z as validateWebDeployRequiresWebFrontend } from "./install-dependencies-D6-GO3BZ.mjs";
3
+ import { A as validateAddonsAgainstFrontends, B as validateWorkersCompatibility, C as isExampleAIAllowed$1, D as requiresChatSdkVercelAI, E as isWebFrontend$1, F as validateServerDeployRequiresBackend, H as incompatibilityError, I as validateUILibraryCSSFrameworkCompatibility, L as validateUILibraryFrontendCompatibility, M as validateExamplesCompatibility, N as validatePaymentsCompatibility, O as splitFrontends$1, P as validateSelfBackendCompatibility, R as validateWebDeployFrontendTemplates, S as hasWebStyling$1, T as isFrontendAllowedWithBackend$1, U as missingRequirementError, V as constraintError, W as renderTitle, _ as isGoBack, a as runMavenTests, b as getCompatibleCSSFrameworks$1, c as applyDependencyVersionChannel, d as isCancel$1, f as navigableConfirm, g as GO_BACK_SYMBOL, h as setIsFirstPrompt, i as runGradleTests, j as validateApiFrontendCompatibility, k as validateAIFrontendCompatibility, l as getAddonsChoice, m as navigableSelect, n as runCargoBuild, o as runMixCompile, p as navigableMultiselect, r as runGoModTidy, s as runUvSync, t as installDependencies, v as allowedApisForFrontends$1, w as isExampleChatSdkAllowed$1, x as getCompatibleUILibraries$1, y as ensureSingleWebAndNative, z as validateWebDeployRequiresWebFrontend } from "./install-dependencies-D0Z1dZEx.mjs";
4
4
  import { a as CLIError, c as exitWithError, d as isFirstPrompt, f as isSilent, h as setLastPromptShownUI, i as canPromptInteractively, l as handleError, m as setIsFirstPrompt$1, n as getPackageExecutionArgs, o as UserCancelledError, p as runWithContextAsync, r as addPackageDependency, s as exitCancelled, t as setupAddons, u as didLastPromptShowUI } from "./addons-setup-HSghQS7c.mjs";
5
5
  import { cancel, confirm, intro, isCancel, log, outro, select, spinner, text } from "@clack/prompts";
6
6
  import { createRouterClient, os } from "@orpc/server";
@@ -531,6 +531,11 @@ const API_PROMPT_OPTION_MAP = {
531
531
  label: "GraphQL Yoga",
532
532
  hint: "Batteries-included GraphQL server with Pothos schema builder"
533
533
  },
534
+ openapi: {
535
+ value: "openapi",
536
+ label: "OpenAPI",
537
+ hint: "REST scaffolding with an OpenAPI 3.1 spec and Scalar docs"
538
+ },
534
539
  none: {
535
540
  value: "none",
536
541
  label: "None",
@@ -8439,7 +8444,44 @@ function validateFrontendConstraints(config, providedFlags) {
8439
8444
  validateWebDeployRequiresWebFrontend(config.webDeploy, hasWebFrontendFlag);
8440
8445
  validateWebDeployFrontendTemplates(config.webDeploy, frontend);
8441
8446
  }
8442
- function validateApiConstraints(_config, _options) {}
8447
+ function validateApiConstraints(config, _options) {
8448
+ if (config.api !== "openapi") return;
8449
+ const frontend = config.frontend ?? [];
8450
+ if (frontend.some((item) => [
8451
+ "native-bare",
8452
+ "native-uniwind",
8453
+ "native-unistyles"
8454
+ ].includes(item))) incompatibilityError({
8455
+ message: "OpenAPI is currently available for web frontends, not React Native.",
8456
+ provided: {
8457
+ api: "openapi",
8458
+ frontend
8459
+ },
8460
+ suggestions: [
8461
+ "Use --api trpc",
8462
+ "Use --api orpc",
8463
+ "Use a web frontend"
8464
+ ]
8465
+ });
8466
+ if (!config.backend || ![
8467
+ "hono",
8468
+ "express",
8469
+ "fastify",
8470
+ "elysia"
8471
+ ].includes(config.backend)) incompatibilityError({
8472
+ message: "OpenAPI currently supports Hono, Express, Fastify, and Elysia backends.",
8473
+ provided: {
8474
+ api: "openapi",
8475
+ backend: config.backend ?? "none"
8476
+ },
8477
+ suggestions: [
8478
+ "Use --backend hono",
8479
+ "Use --backend express",
8480
+ "Use --backend fastify",
8481
+ "Use --backend elysia"
8482
+ ]
8483
+ });
8484
+ }
8443
8485
  function validateJavaConstraints(config, providedFlags = /* @__PURE__ */ new Set()) {
8444
8486
  if (config.ecosystem !== "java") return;
8445
8487
  const hasSpringBoot = config.javaWebFramework === "spring-boot";
@@ -11434,7 +11476,7 @@ const router = os.router({
11434
11476
  packageManager: types_exports.PackageManagerSchema.optional().describe("Package manager to use"),
11435
11477
  projectDir: z.string().optional().describe("Project directory (defaults to current)")
11436
11478
  })).handler(async ({ input }) => {
11437
- const { addHandler } = await import("./add-handler-BPAZM8Zo.mjs");
11479
+ const { addHandler } = await import("./add-handler-BQN6pwGJ.mjs");
11438
11480
  await addHandler(input);
11439
11481
  }),
11440
11482
  history: os.meta({ description: "Show history of scaffolded projects with reproducible commands" }).input(z.object({
@@ -11531,7 +11573,7 @@ async function builder() {
11531
11573
  return caller.builder();
11532
11574
  }
11533
11575
  async function add(input) {
11534
- const { addHandler } = await import("./add-handler-BPAZM8Zo.mjs");
11576
+ const { addHandler } = await import("./add-handler-BQN6pwGJ.mjs");
11535
11577
  return addHandler(input, { silent: true });
11536
11578
  }
11537
11579
  async function history(options) {
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import "./bts-config-Bg1Qea9Y.mjs";
3
- import { a as docs, c as sponsors, i as createBtsCli, n as builder, o as history, r as create, s as router, t as add } from "./run-DQlymC4z.mjs";
4
- import "./install-dependencies-D6-GO3BZ.mjs";
3
+ import { a as docs, c as sponsors, i as createBtsCli, n as builder, o as history, r as create, s as router, t as add } from "./run-BhcXBjxh.mjs";
4
+ import "./install-dependencies-D0Z1dZEx.mjs";
5
5
  import "./addons-setup-HSghQS7c.mjs";
6
6
 
7
7
  export { createBtsCli };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-better-fullstack",
3
- "version": "2.0.2",
3
+ "version": "2.0.3",
4
4
  "description": "Scaffold production-ready fullstack apps in seconds. Pick your stack from 425 options — the CLI wires everything together.",
5
5
  "keywords": [
6
6
  "algolia",
@@ -127,11 +127,11 @@
127
127
  "prepublishOnly": "npm run build"
128
128
  },
129
129
  "dependencies": {
130
- "@better-fullstack/template-generator": "^2.0.2",
131
- "@better-fullstack/types": "^2.0.2",
130
+ "@better-fullstack/template-generator": "^2.0.3",
131
+ "@better-fullstack/types": "^2.0.3",
132
132
  "@clack/core": "^0.5.0",
133
133
  "@clack/prompts": "^1.5.1",
134
- "@orpc/server": "^1.14.5",
134
+ "@orpc/server": "^1.14.6",
135
135
  "consola": "^3.4.2",
136
136
  "env-paths": "^4.0.0",
137
137
  "execa": "^9.6.1",
@@ -148,7 +148,7 @@
148
148
  "@types/bun": "^1.3.14",
149
149
  "ts-morph": "^27.0.2",
150
150
  "@types/fs-extra": "^11.0.4",
151
- "@types/node": "^25.9.2",
151
+ "@types/node": "^25.9.3",
152
152
  "publint": "^0.3.21",
153
153
  "tsdown": "^0.18.2",
154
154
  "typescript": "^5.9.3"