create-better-fullstack 1.4.13 → 1.4.14

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-Cmf5RSiE.mjs";
2
+ import { s as createBtsCli } from "./src-DkmebgOw.mjs";
3
3
 
4
4
  //#region src/cli.ts
5
5
  createBtsCli().run();
package/dist/index.d.mts CHANGED
@@ -267,6 +267,7 @@ declare const router: {
267
267
  none: "none";
268
268
  ai: "ai";
269
269
  "chat-sdk": "chat-sdk";
270
+ "tanstack-showcase": "tanstack-showcase";
270
271
  }>>>;
271
272
  git: z.ZodOptional<z.ZodBoolean>;
272
273
  packageManager: z.ZodOptional<z.ZodEnum<{
@@ -536,7 +537,7 @@ declare const router: {
536
537
  runtime: "none" | "bun" | "node" | "workers";
537
538
  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")[];
538
539
  addons: ("none" | "pwa" | "tauri" | "starlight" | "biome" | "lefthook" | "husky" | "ruler" | "mcp" | "skills" | "turborepo" | "fumadocs" | "ultracite" | "oxlint" | "opentui" | "wxt" | "msw" | "storybook" | "tanstack-query" | "tanstack-table" | "tanstack-virtual" | "tanstack-db" | "tanstack-pacer")[];
539
- examples: ("ai" | "none" | "chat-sdk")[];
540
+ examples: ("ai" | "none" | "chat-sdk" | "tanstack-showcase")[];
540
541
  auth: "none" | "better-auth" | "go-better-auth" | "clerk" | "nextauth" | "stack-auth" | "supabase-auth" | "auth0";
541
542
  payments: "none" | "polar" | "stripe" | "lemon-squeezy" | "paddle" | "dodo";
542
543
  git: boolean;
@@ -622,7 +623,7 @@ declare const router: {
622
623
  runtime: "none" | "bun" | "node" | "workers";
623
624
  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")[];
624
625
  addons: ("none" | "pwa" | "tauri" | "starlight" | "biome" | "lefthook" | "husky" | "ruler" | "mcp" | "skills" | "turborepo" | "fumadocs" | "ultracite" | "oxlint" | "opentui" | "wxt" | "msw" | "storybook" | "tanstack-query" | "tanstack-table" | "tanstack-virtual" | "tanstack-db" | "tanstack-pacer")[];
625
- examples: ("ai" | "none" | "chat-sdk")[];
626
+ examples: ("ai" | "none" | "chat-sdk" | "tanstack-showcase")[];
626
627
  auth: "none" | "better-auth" | "go-better-auth" | "clerk" | "nextauth" | "stack-auth" | "supabase-auth" | "auth0";
627
628
  payments: "none" | "polar" | "stripe" | "lemon-squeezy" | "paddle" | "dodo";
628
629
  git: boolean;
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-Cmf5RSiE.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-DkmebgOw.mjs";
3
3
 
4
4
  export { EMBEDDED_TEMPLATES, TEMPLATE_COUNT, VirtualFileSystem, add, builder, create, createBtsCli, createVirtual, docs, generateVirtualProject, history, router, sponsors };
@@ -835,6 +835,10 @@ function validatePaymentsCompatibility(payments, auth, _backend, frontends = [])
835
835
  function validateExamplesCompatibility(examples, backend, frontend, runtime, ai) {
836
836
  const examplesArr = examples ?? [];
837
837
  if (examplesArr.length === 0 || examplesArr.includes("none")) return;
838
+ if (examplesArr.includes("tanstack-showcase")) {
839
+ const showcaseFrontends = ["tanstack-router", "tanstack-start"];
840
+ if (!(frontend ?? []).some((f) => showcaseFrontends.includes(f))) exitWithError("The 'tanstack-showcase' example requires TanStack Router or TanStack Start frontend.");
841
+ }
838
842
  if (examplesArr.includes("ai") && (frontend ?? []).includes("solid")) exitWithError("The 'ai' example is not compatible with the Solid frontend.");
839
843
  if (examplesArr.includes("ai") && (frontend ?? []).includes("solid-start")) exitWithError("The 'ai' example is not compatible with the SolidStart frontend.");
840
844
  if (examplesArr.includes("ai") && backend === "convex") {
@@ -857,6 +861,24 @@ function validateExamplesCompatibility(examples, backend, frontend, runtime, ai)
857
861
  }
858
862
  }
859
863
  /**
864
+ * Validates that TanStack AI is only used with compatible frontends (React or Solid).
865
+ * Server-side @tanstack/ai core works anywhere, but client adapters only exist for React and Solid.
866
+ */
867
+ function validateAIFrontendCompatibility(ai, frontends = []) {
868
+ if (!ai || ai !== "tanstack-ai") return;
869
+ const compatibleFrontends = [
870
+ "tanstack-router",
871
+ "react-router",
872
+ "react-vite",
873
+ "tanstack-start",
874
+ "next",
875
+ "redwood",
876
+ "solid",
877
+ "solid-start"
878
+ ];
879
+ if (!frontends.some((f) => compatibleFrontends.includes(f))) exitWithError("TanStack AI requires React or Solid frontend (no Vue/Svelte/Angular adapter yet). Please use a React-based frontend (Next.js, TanStack Router, React Router, etc.) or Solid.");
880
+ }
881
+ /**
860
882
  * Validates that a UI library is compatible with the selected frontend(s)
861
883
  */
862
884
  function validateUILibraryFrontendCompatibility(uiLibrary, frontends = [], astroIntegration) {
@@ -6922,6 +6944,7 @@ function validateFullConfig(config, providedFlags, options) {
6922
6944
  }
6923
6945
  validateExamplesCompatibility(config.examples ?? [], config.backend, config.frontend ?? [], config.runtime, config.ai);
6924
6946
  validatePaymentsCompatibility(config.payments, config.auth, config.backend, config.frontend ?? []);
6947
+ validateAIFrontendCompatibility(config.ai, config.frontend ?? []);
6925
6948
  validateUILibraryFrontendCompatibility(config.uiLibrary, config.frontend ?? [], config.astroIntegration);
6926
6949
  validateUILibraryCSSFrameworkCompatibility(config.uiLibrary, config.cssFramework);
6927
6950
  validateShadcnConstraints(config, providedFlags);
@@ -6936,12 +6959,13 @@ function validateConfigForProgrammaticUse(config) {
6936
6959
  validatePaymentsCompatibility(config.payments, config.auth, config.backend, config.frontend);
6937
6960
  if (config.addons && config.addons.length > 0) validateAddonsAgainstFrontends(config.addons, config.frontend, config.auth);
6938
6961
  validateExamplesCompatibility(config.examples ?? [], config.backend, config.frontend ?? [], config.runtime, config.ai);
6962
+ validateAIFrontendCompatibility(config.ai, config.frontend ?? []);
6939
6963
  validateUILibraryFrontendCompatibility(config.uiLibrary, config.frontend ?? [], config.astroIntegration);
6940
6964
  validateUILibraryCSSFrameworkCompatibility(config.uiLibrary, config.cssFramework);
6941
6965
  validatePeerDependencies(config);
6942
6966
  } catch (error) {
6943
6967
  if (error instanceof Error) throw error;
6944
- throw new Error(String(error));
6968
+ throw new Error(String(error), { cause: error });
6945
6969
  }
6946
6970
  }
6947
6971
 
@@ -7070,7 +7094,7 @@ async function addEnvVariablesToFile(envPath, variables) {
7070
7094
  if (variable.condition === false || !variable.key) continue;
7071
7095
  keysToAdd.set(variable.key, variable.value);
7072
7096
  }
7073
- let foundKeys = /* @__PURE__ */ new Set();
7097
+ const foundKeys = /* @__PURE__ */ new Set();
7074
7098
  for (const line of existingLines) {
7075
7099
  const trimmedLine = line.trim();
7076
7100
  let lineProcessed = false;
@@ -7808,7 +7832,7 @@ async function installTursoCLI(isMac) {
7808
7832
  if (error instanceof Error && error.message.includes("User force closed")) {
7809
7833
  s.stop("Turso CLI installation cancelled");
7810
7834
  log.warn(pc.yellow("Turso CLI installation cancelled by user"));
7811
- throw new Error("Installation cancelled");
7835
+ throw new Error("Installation cancelled", { cause: error });
7812
7836
  }
7813
7837
  s.stop(pc.red("Failed to install Turso CLI"));
7814
7838
  }
@@ -7866,7 +7890,7 @@ async function createTursoDatabase(dbName, groupName) {
7866
7890
  s.stop(`Turso database "${dbName}" created`);
7867
7891
  } catch (error) {
7868
7892
  s.stop(pc.red(`Failed to create database "${dbName}"`));
7869
- if (error instanceof Error && error.message.includes("already exists")) throw new Error("DATABASE_EXISTS");
7893
+ if (error instanceof Error && error.message.includes("already exists")) throw new Error("DATABASE_EXISTS", { cause: error });
7870
7894
  }
7871
7895
  s.start("Retrieving database connection details...");
7872
7896
  try {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-better-fullstack",
3
- "version": "1.4.13",
3
+ "version": "1.4.14",
4
4
  "description": "Scaffold production-ready fullstack apps in seconds. Pick your stack from 270+ options — the CLI wires everything together.",
5
5
  "keywords": [
6
6
  "better-auth",
@@ -83,8 +83,8 @@
83
83
  "prepublishOnly": "npm run build"
84
84
  },
85
85
  "dependencies": {
86
- "@better-fullstack/template-generator": "^1.4.13",
87
- "@better-fullstack/types": "^1.4.13",
86
+ "@better-fullstack/template-generator": "^1.4.14",
87
+ "@better-fullstack/types": "^1.4.14",
88
88
  "@clack/core": "^0.5.0",
89
89
  "@clack/prompts": "^1.0.0-alpha.8",
90
90
  "@orpc/server": "^1.13.0",