create-better-fullstack 1.4.13 → 1.4.15

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-D-YGZXlq.mjs";
3
3
 
4
4
  //#region src/cli.ts
5
5
  createBtsCli().run();
package/dist/index.d.mts CHANGED
@@ -196,6 +196,7 @@ declare const router: {
196
196
  payload: "payload";
197
197
  sanity: "sanity";
198
198
  strapi: "strapi";
199
+ tinacms: "tinacms";
199
200
  }>>;
200
201
  caching: z.ZodOptional<z.ZodEnum<{
201
202
  none: "none";
@@ -267,6 +268,7 @@ declare const router: {
267
268
  none: "none";
268
269
  ai: "ai";
269
270
  "chat-sdk": "chat-sdk";
271
+ "tanstack-showcase": "tanstack-showcase";
270
272
  }>>>;
271
273
  git: z.ZodOptional<z.ZodBoolean>;
272
274
  packageManager: z.ZodOptional<z.ZodEnum<{
@@ -536,7 +538,7 @@ declare const router: {
536
538
  runtime: "none" | "bun" | "node" | "workers";
537
539
  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
540
  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")[];
541
+ examples: ("ai" | "none" | "chat-sdk" | "tanstack-showcase")[];
540
542
  auth: "none" | "better-auth" | "go-better-auth" | "clerk" | "nextauth" | "stack-auth" | "supabase-auth" | "auth0";
541
543
  payments: "none" | "polar" | "stripe" | "lemon-squeezy" | "paddle" | "dodo";
542
544
  git: boolean;
@@ -563,7 +565,7 @@ declare const router: {
563
565
  observability: "none" | "opentelemetry" | "sentry" | "grafana";
564
566
  featureFlags: "none" | "growthbook" | "posthog";
565
567
  analytics: "none" | "plausible" | "umami";
566
- cms: "none" | "payload" | "sanity" | "strapi";
568
+ cms: "none" | "payload" | "sanity" | "strapi" | "tinacms";
567
569
  caching: "none" | "upstash-redis";
568
570
  search: "none" | "meilisearch" | "typesense";
569
571
  fileStorage: "none" | "s3" | "r2";
@@ -622,7 +624,7 @@ declare const router: {
622
624
  runtime: "none" | "bun" | "node" | "workers";
623
625
  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
626
  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")[];
627
+ examples: ("ai" | "none" | "chat-sdk" | "tanstack-showcase")[];
626
628
  auth: "none" | "better-auth" | "go-better-auth" | "clerk" | "nextauth" | "stack-auth" | "supabase-auth" | "auth0";
627
629
  payments: "none" | "polar" | "stripe" | "lemon-squeezy" | "paddle" | "dodo";
628
630
  git: boolean;
@@ -649,7 +651,7 @@ declare const router: {
649
651
  observability: "none" | "opentelemetry" | "sentry" | "grafana";
650
652
  featureFlags: "none" | "growthbook" | "posthog";
651
653
  analytics: "none" | "plausible" | "umami";
652
- cms: "none" | "payload" | "sanity" | "strapi";
654
+ cms: "none" | "payload" | "sanity" | "strapi" | "tinacms";
653
655
  caching: "none" | "upstash-redis";
654
656
  search: "none" | "meilisearch" | "typesense";
655
657
  fileStorage: "none" | "s3" | "r2";
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-D-YGZXlq.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) {
@@ -3363,6 +3385,11 @@ async function getCMSChoice(cms, backend) {
3363
3385
  label: "Strapi",
3364
3386
  hint: "Open-source headless CMS with admin panel"
3365
3387
  },
3388
+ {
3389
+ value: "tinacms",
3390
+ label: "TinaCMS",
3391
+ hint: "Git-backed headless CMS with visual editing"
3392
+ },
3366
3393
  {
3367
3394
  value: "none",
3368
3395
  label: "None",
@@ -6922,6 +6949,7 @@ function validateFullConfig(config, providedFlags, options) {
6922
6949
  }
6923
6950
  validateExamplesCompatibility(config.examples ?? [], config.backend, config.frontend ?? [], config.runtime, config.ai);
6924
6951
  validatePaymentsCompatibility(config.payments, config.auth, config.backend, config.frontend ?? []);
6952
+ validateAIFrontendCompatibility(config.ai, config.frontend ?? []);
6925
6953
  validateUILibraryFrontendCompatibility(config.uiLibrary, config.frontend ?? [], config.astroIntegration);
6926
6954
  validateUILibraryCSSFrameworkCompatibility(config.uiLibrary, config.cssFramework);
6927
6955
  validateShadcnConstraints(config, providedFlags);
@@ -6936,12 +6964,13 @@ function validateConfigForProgrammaticUse(config) {
6936
6964
  validatePaymentsCompatibility(config.payments, config.auth, config.backend, config.frontend);
6937
6965
  if (config.addons && config.addons.length > 0) validateAddonsAgainstFrontends(config.addons, config.frontend, config.auth);
6938
6966
  validateExamplesCompatibility(config.examples ?? [], config.backend, config.frontend ?? [], config.runtime, config.ai);
6967
+ validateAIFrontendCompatibility(config.ai, config.frontend ?? []);
6939
6968
  validateUILibraryFrontendCompatibility(config.uiLibrary, config.frontend ?? [], config.astroIntegration);
6940
6969
  validateUILibraryCSSFrameworkCompatibility(config.uiLibrary, config.cssFramework);
6941
6970
  validatePeerDependencies(config);
6942
6971
  } catch (error) {
6943
6972
  if (error instanceof Error) throw error;
6944
- throw new Error(String(error));
6973
+ throw new Error(String(error), { cause: error });
6945
6974
  }
6946
6975
  }
6947
6976
 
@@ -7070,7 +7099,7 @@ async function addEnvVariablesToFile(envPath, variables) {
7070
7099
  if (variable.condition === false || !variable.key) continue;
7071
7100
  keysToAdd.set(variable.key, variable.value);
7072
7101
  }
7073
- let foundKeys = /* @__PURE__ */ new Set();
7102
+ const foundKeys = /* @__PURE__ */ new Set();
7074
7103
  for (const line of existingLines) {
7075
7104
  const trimmedLine = line.trim();
7076
7105
  let lineProcessed = false;
@@ -7808,7 +7837,7 @@ async function installTursoCLI(isMac) {
7808
7837
  if (error instanceof Error && error.message.includes("User force closed")) {
7809
7838
  s.stop("Turso CLI installation cancelled");
7810
7839
  log.warn(pc.yellow("Turso CLI installation cancelled by user"));
7811
- throw new Error("Installation cancelled");
7840
+ throw new Error("Installation cancelled", { cause: error });
7812
7841
  }
7813
7842
  s.stop(pc.red("Failed to install Turso CLI"));
7814
7843
  }
@@ -7866,7 +7895,7 @@ async function createTursoDatabase(dbName, groupName) {
7866
7895
  s.stop(`Turso database "${dbName}" created`);
7867
7896
  } catch (error) {
7868
7897
  s.stop(pc.red(`Failed to create database "${dbName}"`));
7869
- if (error instanceof Error && error.message.includes("already exists")) throw new Error("DATABASE_EXISTS");
7898
+ if (error instanceof Error && error.message.includes("already exists")) throw new Error("DATABASE_EXISTS", { cause: error });
7870
7899
  }
7871
7900
  s.start("Retrieving database connection details...");
7872
7901
  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.15",
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,15 +83,15 @@
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.15",
87
+ "@better-fullstack/types": "^1.4.15",
88
88
  "@clack/core": "^0.5.0",
89
- "@clack/prompts": "^1.0.0-alpha.8",
90
- "@orpc/server": "^1.13.0",
89
+ "@clack/prompts": "^1.1.0",
90
+ "@orpc/server": "^1.13.7",
91
91
  "consola": "^3.4.2",
92
92
  "env-paths": "^4.0.0",
93
93
  "execa": "^9.6.1",
94
- "fs-extra": "^11.3.3",
94
+ "fs-extra": "^11.3.4",
95
95
  "gradient-string": "^3.0.0",
96
96
  "handlebars": "^4.7.8",
97
97
  "jsonc-parser": "^3.3.1",
@@ -101,13 +101,13 @@
101
101
  "trpc-cli": "^0.12.1",
102
102
  "ts-morph": "^27.0.2",
103
103
  "yaml": "^2.8.2",
104
- "zod": "^4.2.1"
104
+ "zod": "^4.3.6"
105
105
  },
106
106
  "devDependencies": {
107
- "@types/bun": "^1.3.5",
107
+ "@types/bun": "^1.3.10",
108
108
  "@types/fs-extra": "^11.0.4",
109
- "@types/node": "^25.0.3",
110
- "publint": "^0.3.16",
109
+ "@types/node": "^25.5.0",
110
+ "publint": "^0.3.18",
111
111
  "tsdown": "^0.18.2",
112
112
  "typescript": "^5.9.3"
113
113
  }