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 +1 -1
- package/dist/index.d.mts +6 -4
- package/dist/index.mjs +1 -1
- package/dist/{src-Cmf5RSiE.mjs → src-D-YGZXlq.mjs} +33 -4
- package/package.json +10 -10
package/dist/cli.mjs
CHANGED
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-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
87
|
-
"@better-fullstack/types": "^1.4.
|
|
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.
|
|
90
|
-
"@orpc/server": "^1.13.
|
|
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.
|
|
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.
|
|
104
|
+
"zod": "^4.3.6"
|
|
105
105
|
},
|
|
106
106
|
"devDependencies": {
|
|
107
|
-
"@types/bun": "^1.3.
|
|
107
|
+
"@types/bun": "^1.3.10",
|
|
108
108
|
"@types/fs-extra": "^11.0.4",
|
|
109
|
-
"@types/node": "^25.0
|
|
110
|
-
"publint": "^0.3.
|
|
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
|
}
|