create-better-fullstack 1.4.7 → 1.4.9

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.
package/dist/cli.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { s as createBtsCli } from "./src-CISBB09-.mjs";
2
+ import { s as createBtsCli } from "./src-DgYCaMzA.mjs";
3
3
 
4
4
  //#region src/cli.ts
5
5
  createBtsCli().run();
package/dist/index.d.mts CHANGED
@@ -214,6 +214,7 @@ declare const router: {
214
214
  none: "none";
215
215
  "tanstack-router": "tanstack-router";
216
216
  "react-router": "react-router";
217
+ "react-vite": "react-vite";
217
218
  "tanstack-start": "tanstack-start";
218
219
  next: "next";
219
220
  nuxt: "nuxt";
@@ -526,7 +527,7 @@ declare const router: {
526
527
  orm: "none" | "drizzle" | "prisma" | "mongoose" | "typeorm" | "kysely" | "mikroorm" | "sequelize";
527
528
  backend: "none" | "hono" | "express" | "fastify" | "elysia" | "fets" | "nestjs" | "adonisjs" | "nitro" | "encore" | "convex" | "self";
528
529
  runtime: "none" | "bun" | "node" | "workers";
529
- frontend: ("none" | "tanstack-router" | "react-router" | "tanstack-start" | "next" | "nuxt" | "native-bare" | "native-uniwind" | "native-unistyles" | "svelte" | "solid" | "solid-start" | "astro" | "qwik" | "angular" | "redwood" | "fresh")[];
530
+ frontend: ("none" | "tanstack-router" | "react-router" | "react-vite" | "tanstack-start" | "next" | "nuxt" | "native-bare" | "native-uniwind" | "native-unistyles" | "svelte" | "solid" | "solid-start" | "astro" | "qwik" | "angular" | "redwood" | "fresh")[];
530
531
  addons: ("none" | "pwa" | "tauri" | "starlight" | "biome" | "lefthook" | "husky" | "ruler" | "mcp" | "skills" | "turborepo" | "fumadocs" | "ultracite" | "oxlint" | "opentui" | "wxt" | "msw" | "storybook")[];
531
532
  examples: ("ai" | "none" | "chat-sdk")[];
532
533
  auth: "none" | "better-auth" | "go-better-auth" | "clerk" | "nextauth" | "stack-auth" | "supabase-auth" | "auth0";
@@ -612,7 +613,7 @@ declare const router: {
612
613
  orm: "none" | "drizzle" | "prisma" | "mongoose" | "typeorm" | "kysely" | "mikroorm" | "sequelize";
613
614
  backend: "none" | "hono" | "express" | "fastify" | "elysia" | "fets" | "nestjs" | "adonisjs" | "nitro" | "encore" | "convex" | "self";
614
615
  runtime: "none" | "bun" | "node" | "workers";
615
- frontend: ("none" | "tanstack-router" | "react-router" | "tanstack-start" | "next" | "nuxt" | "native-bare" | "native-uniwind" | "native-unistyles" | "svelte" | "solid" | "solid-start" | "astro" | "qwik" | "angular" | "redwood" | "fresh")[];
616
+ frontend: ("none" | "tanstack-router" | "react-router" | "react-vite" | "tanstack-start" | "next" | "nuxt" | "native-bare" | "native-uniwind" | "native-unistyles" | "svelte" | "solid" | "solid-start" | "astro" | "qwik" | "angular" | "redwood" | "fresh")[];
616
617
  addons: ("none" | "pwa" | "tauri" | "starlight" | "biome" | "lefthook" | "husky" | "ruler" | "mcp" | "skills" | "turborepo" | "fumadocs" | "ultracite" | "oxlint" | "opentui" | "wxt" | "msw" | "storybook")[];
617
618
  examples: ("ai" | "none" | "chat-sdk")[];
618
619
  auth: "none" | "better-auth" | "go-better-auth" | "clerk" | "nextauth" | "stack-auth" | "supabase-auth" | "auth0";
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env node
2
- import { a as builder, c as createVirtual, d as history, f as router, i as add, l as docs, n as TEMPLATE_COUNT, o as create, p as sponsors, r as VirtualFileSystem, s as createBtsCli, t as EMBEDDED_TEMPLATES, u as generateVirtualProject } from "./src-CISBB09-.mjs";
2
+ import { a as builder, c as createVirtual, d as history, f as router, i as add, l as docs, n as TEMPLATE_COUNT, o as create, p as sponsors, r as VirtualFileSystem, s as createBtsCli, t as EMBEDDED_TEMPLATES, u as generateVirtualProject } from "./src-DgYCaMzA.mjs";
3
3
 
4
4
  export { EMBEDDED_TEMPLATES, TEMPLATE_COUNT, VirtualFileSystem, add, builder, create, createBtsCli, createVirtual, docs, generateVirtualProject, history, router, sponsors };
@@ -122,6 +122,7 @@ const DEFAULT_CONFIG = getDefaultConfig();
122
122
  const DEFAULT_UI_LIBRARY_BY_FRONTEND = {
123
123
  "tanstack-router": "shadcn-ui",
124
124
  "react-router": "shadcn-ui",
125
+ "react-vite": "shadcn-ui",
125
126
  "tanstack-start": "shadcn-ui",
126
127
  next: "shadcn-ui",
127
128
  nuxt: "daisyui",
@@ -739,7 +740,7 @@ function validateApiFrontendCompatibility(api, frontends = [], astroIntegration)
739
740
  suggestions: [
740
741
  "Use --api orpc (works with all frontends)",
741
742
  "Use --api none",
742
- "Choose next, react-router, or tanstack-start"
743
+ "Choose next, react-router, react-vite, or tanstack-start"
743
744
  ]
744
745
  });
745
746
  }
@@ -824,6 +825,7 @@ function validateAddonsAgainstFrontends(addons = [], frontends = [], auth) {
824
825
  }
825
826
  function validatePaymentsCompatibility(payments, auth, _backend, frontends = []) {
826
827
  if (!payments || payments === "none") return;
828
+ if (payments === "dodo" && frontends.includes("react-vite")) exitWithError("Dodo Payments are not yet supported for React + Vite projects.");
827
829
  if (payments === "polar") {
828
830
  if (!auth || auth === "none" || auth !== "better-auth") exitWithError("Polar payments requires Better Auth. Please use '--auth better-auth' or choose a different payments provider.");
829
831
  const { web } = splitFrontends$1(frontends);
@@ -839,10 +841,11 @@ function validateExamplesCompatibility(examples, backend, frontend, runtime, ai)
839
841
  const frontendArr = frontend ?? [];
840
842
  const includesNuxt = frontendArr.includes("nuxt");
841
843
  const includesSvelte = frontendArr.includes("svelte");
842
- if (includesNuxt || includesSvelte) exitWithError("The 'ai' example with Convex backend only supports React-based frontends (Next.js, TanStack Router, TanStack Start, React Router). Svelte and Nuxt are not supported with Convex AI.");
844
+ if (includesNuxt || includesSvelte) exitWithError("The 'ai' example with Convex backend only supports React-based frontends (Next.js, TanStack Router, TanStack Start, React Router, React + Vite). Svelte and Nuxt are not supported with Convex AI.");
843
845
  }
844
846
  if (examplesArr.includes("chat-sdk")) {
845
847
  const frontendArr = frontend ?? [];
848
+ if (frontendArr.includes("react-vite")) exitWithError("The 'chat-sdk' example is not yet supported for React + Vite projects.");
846
849
  if (!isExampleChatSdkAllowed$1(backend, frontendArr, runtime)) {
847
850
  if (backend === "none") exitWithError("The 'chat-sdk' example requires a backend.");
848
851
  if (backend === "convex") exitWithError("The 'chat-sdk' example is not supported with the Convex backend in v1. Use self backend (Next.js, TanStack Start, Nuxt) or Hono with Node runtime.");
@@ -1701,7 +1704,7 @@ function uniqueValues$1(values) {
1701
1704
  return Array.from(new Set(values));
1702
1705
  }
1703
1706
  function hasReactBasedFrontend$1(frontend) {
1704
- return frontend.includes("react-router") || frontend.includes("tanstack-router") || frontend.includes("tanstack-start") || frontend.includes("next");
1707
+ return frontend.includes("react-router") || frontend.includes("react-vite") || frontend.includes("tanstack-router") || frontend.includes("tanstack-start") || frontend.includes("next");
1705
1708
  }
1706
1709
  function hasNativeFrontend$1(frontend) {
1707
1710
  return frontend.includes("native-bare") || frontend.includes("native-uniwind") || frontend.includes("native-unistyles");
@@ -2140,7 +2143,7 @@ const AVAILABLE_AGENTS = [
2140
2143
  }
2141
2144
  ];
2142
2145
  function hasReactBasedFrontend(frontend) {
2143
- return frontend.includes("react-router") || frontend.includes("tanstack-router") || frontend.includes("tanstack-start") || frontend.includes("next");
2146
+ return frontend.includes("react-router") || frontend.includes("react-vite") || frontend.includes("tanstack-router") || frontend.includes("tanstack-start") || frontend.includes("next");
2144
2147
  }
2145
2148
  function hasNativeFrontend(frontend) {
2146
2149
  return frontend.includes("native-bare") || frontend.includes("native-uniwind") || frontend.includes("native-unistyles");
@@ -2360,7 +2363,7 @@ async function setupTauri(config) {
2360
2363
  const hasSvelte = frontend.includes("svelte");
2361
2364
  const hasNext = frontend.includes("next");
2362
2365
  const devUrl = `http://localhost:${getLocalWebDevPort(frontend)}`;
2363
- const frontendDist = hasNuxt ? "../.output/public" : hasSvelte ? "../build" : hasNext ? "../.next" : frontend.includes("react-router") ? "../build/client" : "../dist";
2366
+ const frontendDist = hasNuxt ? "../.output/public" : hasSvelte ? "../build" : hasNext ? "../.next" : frontend.includes("react-router") ? "../build/client" : frontend.includes("react-vite") ? "../dist" : "../dist";
2364
2367
  const tauriArgs = [
2365
2368
  "@tauri-apps/cli@latest",
2366
2369
  "init",
@@ -2491,6 +2494,7 @@ function getFrameworksFromFrontend(frontend) {
2491
2494
  const frameworkMap = {
2492
2495
  "tanstack-router": "react",
2493
2496
  "react-router": "react",
2497
+ "react-vite": "react",
2494
2498
  "tanstack-start": "react",
2495
2499
  next: "next",
2496
2500
  nuxt: "vue",
@@ -2645,7 +2649,7 @@ async function setupWxt(config) {
2645
2649
  //#region src/helpers/addons/addons-setup.ts
2646
2650
  async function setupAddons(config) {
2647
2651
  const { addons, frontend, projectDir } = config;
2648
- const hasReactWebFrontend = frontend.includes("react-router") || frontend.includes("tanstack-router") || frontend.includes("next");
2652
+ const hasReactWebFrontend = frontend.includes("react-router") || frontend.includes("react-vite") || frontend.includes("tanstack-router") || frontend.includes("next");
2649
2653
  const hasNuxtFrontend = frontend.includes("nuxt");
2650
2654
  const hasSvelteFrontend = frontend.includes("svelte");
2651
2655
  const hasSolidFrontend = frontend.includes("solid");
@@ -3022,6 +3026,7 @@ async function getAnimationChoice(animation, frontends) {
3022
3026
  const isReact = web.some((f) => [
3023
3027
  "tanstack-router",
3024
3028
  "react-router",
3029
+ "react-vite",
3025
3030
  "tanstack-start",
3026
3031
  "next",
3027
3032
  "redwood"
@@ -3753,6 +3758,7 @@ async function getFormsChoice(forms, frontends) {
3753
3758
  const isReact = web.some((f) => [
3754
3759
  "tanstack-router",
3755
3760
  "react-router",
3761
+ "react-vite",
3756
3762
  "tanstack-start",
3757
3763
  "next",
3758
3764
  "redwood"
@@ -3841,6 +3847,11 @@ async function getFrontendChoice(frontendOptions, backend, auth) {
3841
3847
  label: "React Router",
3842
3848
  hint: "A user‑obsessed, standards‑focused, multi‑strategy router"
3843
3849
  },
3850
+ {
3851
+ value: "react-vite",
3852
+ label: "React + Vite",
3853
+ hint: "Client-routed React SPA powered by Vite"
3854
+ },
3844
3855
  {
3845
3856
  value: "next",
3846
3857
  label: "Next.js",
@@ -4504,6 +4515,11 @@ async function getPythonAiChoice(pythonAi) {
4504
4515
  const response = await navigableMultiselect({
4505
4516
  message: "Select Python AI/ML frameworks",
4506
4517
  options: [
4518
+ {
4519
+ value: "none",
4520
+ label: "None",
4521
+ hint: "No AI/ML framework"
4522
+ },
4507
4523
  {
4508
4524
  value: "langchain",
4509
4525
  label: "LangChain",
@@ -4539,6 +4555,7 @@ async function getPythonAiChoice(pythonAi) {
4539
4555
  initialValues: []
4540
4556
  });
4541
4557
  if (isCancel$1(response)) return exitCancelled("Operation cancelled");
4558
+ if (response.includes("none")) return [];
4542
4559
  return response;
4543
4560
  }
4544
4561
  async function getPythonTaskQueueChoice(pythonTaskQueue) {
@@ -5248,6 +5265,7 @@ async function getStateManagementChoice(stateManagement, frontends) {
5248
5265
  const isReact = web.some((f) => [
5249
5266
  "tanstack-router",
5250
5267
  "react-router",
5268
+ "react-vite",
5251
5269
  "tanstack-start",
5252
5270
  "next",
5253
5271
  "redwood"
@@ -5481,6 +5499,7 @@ async function getValidationChoice(validation) {
5481
5499
  const WEB_FRAMEWORKS = [
5482
5500
  "tanstack-router",
5483
5501
  "react-router",
5502
+ "react-vite",
5484
5503
  "tanstack-start",
5485
5504
  "next",
5486
5505
  "nuxt",
@@ -5761,7 +5780,7 @@ async function gatherConfig(flags, projectName, projectDir, relativePath) {
5761
5780
  aiDocs: () => getAiDocsChoice(flags.aiDocs),
5762
5781
  git: () => getGitChoice(flags.git),
5763
5782
  packageManager: ({ results }) => {
5764
- if (results.ecosystem === "rust" || results.ecosystem === "python" || results.ecosystem === "go") return Promise.resolve("npm");
5783
+ if (results.ecosystem === "rust" || results.ecosystem === "python" || results.ecosystem === "go") return Promise.resolve(flags.packageManager ?? getUserPkgManager());
5765
5784
  return getPackageManagerChoice(flags.packageManager);
5766
5785
  },
5767
5786
  install: ({ results }) => getinstallChoice(flags.install, results.ecosystem)
@@ -5773,7 +5792,7 @@ async function gatherConfig(flags, projectName, projectDir, relativePath) {
5773
5792
  frontend: result.frontend,
5774
5793
  astroIntegration: result.astroIntegration,
5775
5794
  uiLibrary: result.uiLibrary,
5776
- ...result.shadcnOptions ?? {},
5795
+ ...result.shadcnOptions,
5777
5796
  cssFramework: result.cssFramework,
5778
5797
  backend: result.backend,
5779
5798
  runtime: result.runtime,
@@ -5986,7 +6005,34 @@ function displayConfig(config) {
5986
6005
 
5987
6006
  //#endregion
5988
6007
  //#region src/utils/generate-reproducible-command.ts
5989
- function generateReproducibleCommand(config) {
6008
+ function getBaseCommand(packageManager) {
6009
+ switch (packageManager) {
6010
+ case "bun": return "bun create better-fullstack@latest";
6011
+ case "pnpm": return "pnpm create better-fullstack@latest";
6012
+ case "npm":
6013
+ default: return "npx create-better-fullstack@latest";
6014
+ }
6015
+ }
6016
+ function formatArrayFlag(flag, values) {
6017
+ const normalizedValues = values.filter((value) => value !== "none");
6018
+ if (normalizedValues.length === 0) return `--${flag} none`;
6019
+ return `--${flag} ${normalizedValues.join(" ")}`;
6020
+ }
6021
+ function appendCommonFlags(flags, config) {
6022
+ if (config.aiDocs && config.aiDocs.length > 0) flags.push(formatArrayFlag("ai-docs", config.aiDocs));
6023
+ else flags.push("--ai-docs none");
6024
+ flags.push(config.git ? "--git" : "--no-git");
6025
+ flags.push(`--package-manager ${config.packageManager}`);
6026
+ flags.push(config.install ? "--install" : "--no-install");
6027
+ }
6028
+ function appendSharedNonTypeScriptFlags(flags, config) {
6029
+ flags.push(formatArrayFlag("addons", config.addons));
6030
+ flags.push(formatArrayFlag("examples", config.examples));
6031
+ flags.push(`--db-setup ${config.dbSetup}`);
6032
+ flags.push(`--web-deploy ${config.webDeploy}`);
6033
+ flags.push(`--server-deploy ${config.serverDeploy}`);
6034
+ }
6035
+ function getTypeScriptFlags(config) {
5990
6036
  const flags = [];
5991
6037
  if (config.frontend && config.frontend.length > 0) flags.push(`--frontend ${config.frontend.join(" ")}`);
5992
6038
  else flags.push("--frontend none");
@@ -6032,21 +6078,63 @@ function generateReproducibleCommand(config) {
6032
6078
  flags.push(`--db-setup ${config.dbSetup}`);
6033
6079
  flags.push(`--web-deploy ${config.webDeploy}`);
6034
6080
  flags.push(`--server-deploy ${config.serverDeploy}`);
6035
- if (config.aiDocs && config.aiDocs.length > 0) {
6036
- const validDocs = config.aiDocs.filter((d) => d !== "none");
6037
- if (validDocs.length > 0) flags.push(`--ai-docs ${validDocs.join(" ")}`);
6038
- else flags.push("--ai-docs none");
6039
- } else flags.push("--ai-docs none");
6040
- flags.push(config.git ? "--git" : "--no-git");
6041
- flags.push(`--package-manager ${config.packageManager}`);
6042
- flags.push(config.install ? "--install" : "--no-install");
6043
- let baseCommand = "npx create-better-fullstack@latest";
6044
- const pkgManager = config.packageManager;
6045
- if (pkgManager === "bun") baseCommand = "bun create better-fullstack@latest";
6046
- else if (pkgManager === "pnpm") baseCommand = "pnpm create better-fullstack@latest";
6047
- else if (pkgManager === "npm") baseCommand = "npx create-better-fullstack@latest";
6048
- const projectPathArg = config.relativePath ? ` ${config.relativePath}` : "";
6049
- return `${baseCommand}${projectPathArg} ${flags.join(" ")}`;
6081
+ appendCommonFlags(flags, config);
6082
+ return flags;
6083
+ }
6084
+ function getRustFlags(config) {
6085
+ const flags = ["--ecosystem rust"];
6086
+ flags.push(`--rust-web-framework ${config.rustWebFramework}`);
6087
+ flags.push(`--rust-frontend ${config.rustFrontend}`);
6088
+ flags.push(`--rust-orm ${config.rustOrm}`);
6089
+ flags.push(`--rust-api ${config.rustApi}`);
6090
+ flags.push(`--rust-cli ${config.rustCli}`);
6091
+ flags.push(formatArrayFlag("rust-libraries", config.rustLibraries));
6092
+ appendSharedNonTypeScriptFlags(flags, config);
6093
+ appendCommonFlags(flags, config);
6094
+ return flags;
6095
+ }
6096
+ function getPythonFlags(config) {
6097
+ const flags = ["--ecosystem python"];
6098
+ flags.push(`--python-web-framework ${config.pythonWebFramework}`);
6099
+ flags.push(`--python-orm ${config.pythonOrm}`);
6100
+ flags.push(`--python-validation ${config.pythonValidation}`);
6101
+ flags.push(formatArrayFlag("python-ai", config.pythonAi));
6102
+ flags.push(`--python-task-queue ${config.pythonTaskQueue}`);
6103
+ flags.push(`--python-quality ${config.pythonQuality}`);
6104
+ appendSharedNonTypeScriptFlags(flags, config);
6105
+ appendCommonFlags(flags, config);
6106
+ return flags;
6107
+ }
6108
+ function getGoFlags(config) {
6109
+ const flags = ["--ecosystem go"];
6110
+ flags.push(`--go-web-framework ${config.goWebFramework}`);
6111
+ flags.push(`--go-orm ${config.goOrm}`);
6112
+ flags.push(`--go-api ${config.goApi}`);
6113
+ flags.push(`--go-cli ${config.goCli}`);
6114
+ flags.push(`--go-logging ${config.goLogging}`);
6115
+ flags.push(`--auth ${config.auth}`);
6116
+ appendSharedNonTypeScriptFlags(flags, config);
6117
+ appendCommonFlags(flags, config);
6118
+ return flags;
6119
+ }
6120
+ function generateReproducibleCommand(config) {
6121
+ let flags;
6122
+ switch (config.ecosystem) {
6123
+ case "rust":
6124
+ flags = getRustFlags(config);
6125
+ break;
6126
+ case "python":
6127
+ flags = getPythonFlags(config);
6128
+ break;
6129
+ case "go":
6130
+ flags = getGoFlags(config);
6131
+ break;
6132
+ case "typescript":
6133
+ default:
6134
+ flags = getTypeScriptFlags(config);
6135
+ break;
6136
+ }
6137
+ return `${getBaseCommand(config.packageManager)}${config.relativePath ? ` ${config.relativePath}` : ""} ${flags.join(" ")}`;
6050
6138
  }
6051
6139
 
6052
6140
  //#endregion
@@ -8110,7 +8198,7 @@ async function displayPostInstallInstructions(config) {
8110
8198
  const lefthookInstructions = hasLefthook ? getLefthookInstructions(packageManager) : "";
8111
8199
  const lintingInstructions = hasGitHooksOrLinting ? getLintingInstructions(runCmd) : "";
8112
8200
  const nativeInstructions = (frontend?.includes("native-bare") || frontend?.includes("native-uniwind") || frontend?.includes("native-unistyles")) && backend !== "none" ? getNativeInstructions(isConvex, isBackendSelf, frontend || [], runCmd) : "";
8113
- const pwaInstructions = addons?.includes("pwa") && frontend?.includes("react-router") ? getPwaInstructions() : "";
8201
+ const pwaInstructions = addons?.includes("pwa") && (frontend?.includes("react-router") || frontend?.includes("react-vite")) ? getPwaInstructions() : "";
8114
8202
  const starlightInstructions = addons?.includes("starlight") ? getStarlightInstructions(runCmd) : "";
8115
8203
  const clerkInstructions = config.auth === "clerk" ? getClerkInstructions(config.backend, config.frontend ?? []) : "";
8116
8204
  const polarInstructions = config.payments === "polar" && config.auth === "better-auth" ? getPolarInstructions(backend) : "";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-better-fullstack",
3
- "version": "1.4.7",
3
+ "version": "1.4.9",
4
4
  "description": "A CLI-first toolkit for building Full Stack applications. Skip the configuration. Ship the code.",
5
5
  "keywords": [
6
6
  "better-auth",
@@ -76,8 +76,8 @@
76
76
  "prepublishOnly": "npm run build"
77
77
  },
78
78
  "dependencies": {
79
- "@better-fullstack/template-generator": "^1.4.7",
80
- "@better-fullstack/types": "^1.4.7",
79
+ "@better-fullstack/template-generator": "^1.4.9",
80
+ "@better-fullstack/types": "^1.4.9",
81
81
  "@clack/core": "^0.5.0",
82
82
  "@clack/prompts": "^1.0.0-alpha.8",
83
83
  "@orpc/server": "^1.13.0",