create-better-fullstack 1.4.8 → 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-Cu97R-IA.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-Cu97R-IA.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",
@@ -5254,6 +5265,7 @@ async function getStateManagementChoice(stateManagement, frontends) {
5254
5265
  const isReact = web.some((f) => [
5255
5266
  "tanstack-router",
5256
5267
  "react-router",
5268
+ "react-vite",
5257
5269
  "tanstack-start",
5258
5270
  "next",
5259
5271
  "redwood"
@@ -5487,6 +5499,7 @@ async function getValidationChoice(validation) {
5487
5499
  const WEB_FRAMEWORKS = [
5488
5500
  "tanstack-router",
5489
5501
  "react-router",
5502
+ "react-vite",
5490
5503
  "tanstack-start",
5491
5504
  "next",
5492
5505
  "nuxt",
@@ -5767,7 +5780,7 @@ async function gatherConfig(flags, projectName, projectDir, relativePath) {
5767
5780
  aiDocs: () => getAiDocsChoice(flags.aiDocs),
5768
5781
  git: () => getGitChoice(flags.git),
5769
5782
  packageManager: ({ results }) => {
5770
- 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());
5771
5784
  return getPackageManagerChoice(flags.packageManager);
5772
5785
  },
5773
5786
  install: ({ results }) => getinstallChoice(flags.install, results.ecosystem)
@@ -5779,7 +5792,7 @@ async function gatherConfig(flags, projectName, projectDir, relativePath) {
5779
5792
  frontend: result.frontend,
5780
5793
  astroIntegration: result.astroIntegration,
5781
5794
  uiLibrary: result.uiLibrary,
5782
- ...result.shadcnOptions ?? {},
5795
+ ...result.shadcnOptions,
5783
5796
  cssFramework: result.cssFramework,
5784
5797
  backend: result.backend,
5785
5798
  runtime: result.runtime,
@@ -5992,7 +6005,34 @@ function displayConfig(config) {
5992
6005
 
5993
6006
  //#endregion
5994
6007
  //#region src/utils/generate-reproducible-command.ts
5995
- 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) {
5996
6036
  const flags = [];
5997
6037
  if (config.frontend && config.frontend.length > 0) flags.push(`--frontend ${config.frontend.join(" ")}`);
5998
6038
  else flags.push("--frontend none");
@@ -6038,21 +6078,63 @@ function generateReproducibleCommand(config) {
6038
6078
  flags.push(`--db-setup ${config.dbSetup}`);
6039
6079
  flags.push(`--web-deploy ${config.webDeploy}`);
6040
6080
  flags.push(`--server-deploy ${config.serverDeploy}`);
6041
- if (config.aiDocs && config.aiDocs.length > 0) {
6042
- const validDocs = config.aiDocs.filter((d) => d !== "none");
6043
- if (validDocs.length > 0) flags.push(`--ai-docs ${validDocs.join(" ")}`);
6044
- else flags.push("--ai-docs none");
6045
- } else flags.push("--ai-docs none");
6046
- flags.push(config.git ? "--git" : "--no-git");
6047
- flags.push(`--package-manager ${config.packageManager}`);
6048
- flags.push(config.install ? "--install" : "--no-install");
6049
- let baseCommand = "npx create-better-fullstack@latest";
6050
- const pkgManager = config.packageManager;
6051
- if (pkgManager === "bun") baseCommand = "bun create better-fullstack@latest";
6052
- else if (pkgManager === "pnpm") baseCommand = "pnpm create better-fullstack@latest";
6053
- else if (pkgManager === "npm") baseCommand = "npx create-better-fullstack@latest";
6054
- const projectPathArg = config.relativePath ? ` ${config.relativePath}` : "";
6055
- 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(" ")}`;
6056
6138
  }
6057
6139
 
6058
6140
  //#endregion
@@ -8116,7 +8198,7 @@ async function displayPostInstallInstructions(config) {
8116
8198
  const lefthookInstructions = hasLefthook ? getLefthookInstructions(packageManager) : "";
8117
8199
  const lintingInstructions = hasGitHooksOrLinting ? getLintingInstructions(runCmd) : "";
8118
8200
  const nativeInstructions = (frontend?.includes("native-bare") || frontend?.includes("native-uniwind") || frontend?.includes("native-unistyles")) && backend !== "none" ? getNativeInstructions(isConvex, isBackendSelf, frontend || [], runCmd) : "";
8119
- 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() : "";
8120
8202
  const starlightInstructions = addons?.includes("starlight") ? getStarlightInstructions(runCmd) : "";
8121
8203
  const clerkInstructions = config.auth === "clerk" ? getClerkInstructions(config.backend, config.frontend ?? []) : "";
8122
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.8",
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.8",
80
- "@better-fullstack/types": "^1.4.8",
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",