create-better-fullstack 1.4.11 → 1.4.13
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/README.md +25 -61
- package/dist/cli.mjs +1 -1
- package/dist/index.d.mts +19 -6
- package/dist/index.mjs +1 -1
- package/dist/{src-DgYCaMzA.mjs → src-Cmf5RSiE.mjs} +66 -7
- package/package.json +13 -6
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# Better Fullstack
|
|
1
|
+
# Better Fullstack
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Scaffold production-ready fullstack apps in seconds. Pick your stack from 270+ options — the CLI wires everything together.
|
|
4
4
|
|
|
5
5
|
## Quick Start
|
|
6
6
|
|
|
@@ -13,75 +13,39 @@ pnpm create better-fullstack@latest
|
|
|
13
13
|
|
|
14
14
|
# Using npm
|
|
15
15
|
npx create-better-fullstack@latest
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## Usage
|
|
19
|
-
|
|
20
|
-
```bash
|
|
21
|
-
Usage: create-better-fullstack [project-directory] [options]
|
|
22
16
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
-y, --yes Use default configuration
|
|
26
|
-
--yolo Random configuration (experimental)
|
|
27
|
-
--database <type> Database type (none, sqlite, postgres, mysql, mongodb)
|
|
28
|
-
--orm <type> ORM type (drizzle, prisma, mongoose, typeorm, kysely, mikroorm, sequelize, none)
|
|
29
|
-
--auth <type> Authentication (better-auth, go-better-auth, clerk, nextauth, stack-auth, supabase-auth, auth0, none)
|
|
30
|
-
--payments <type> Payments (polar, stripe, lemon-squeezy, paddle, dodo, none)
|
|
31
|
-
--frontend <types...> Frontend types
|
|
32
|
-
--backend <framework> Backend framework
|
|
33
|
-
--runtime <runtime> Runtime (bun, node, workers, none)
|
|
34
|
-
--api <type> API type (trpc, orpc, ts-rest, garph, none)
|
|
35
|
-
--addons <types...> Additional addons
|
|
36
|
-
--examples <types...> Examples to include (ai, none)
|
|
37
|
-
--git / --no-git Initialize git repository
|
|
38
|
-
--package-manager <pm> Package manager (npm, pnpm, bun)
|
|
39
|
-
--install / --no-install Install dependencies
|
|
40
|
-
--db-setup <setup> Database setup
|
|
41
|
-
-h, --help Display help
|
|
17
|
+
# Using yarn
|
|
18
|
+
yarn create better-fullstack@latest
|
|
42
19
|
```
|
|
43
20
|
|
|
44
|
-
##
|
|
21
|
+
## Web Builder
|
|
45
22
|
|
|
46
|
-
|
|
47
|
-
# Default configuration
|
|
48
|
-
npx create-better-fullstack --yes
|
|
23
|
+
Configure your stack visually — pick every option from a UI, preview your choices, and get a ready-to-run command.
|
|
49
24
|
|
|
50
|
-
|
|
51
|
-
npx create-better-fullstack --database postgres --orm drizzle --auth better-auth --addons pwa biome
|
|
25
|
+
**[Open the App Builder →](https://better-fullstack.dev/new)**
|
|
52
26
|
|
|
53
|
-
|
|
54
|
-
npx create-better-fullstack --backend elysia --runtime node
|
|
27
|
+
## Features
|
|
55
28
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
29
|
+
- **270+ options** — frontend, backend, database, auth, payments, AI, DevOps, and more
|
|
30
|
+
- **4 ecosystems** — TypeScript, Rust, Python, Go
|
|
31
|
+
- **Visual builder** — configure your stack in the browser
|
|
32
|
+
- **Wired for you** — every picked integration is preconfigured and working out of the box
|
|
59
33
|
|
|
60
|
-
##
|
|
34
|
+
## CLI Flags
|
|
61
35
|
|
|
62
36
|
```bash
|
|
63
|
-
#
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
#
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
#
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
# Clear saved history
|
|
73
|
-
npx create-better-fullstack history --clear
|
|
37
|
+
--yes # Accept all defaults
|
|
38
|
+
--yolo # Scaffold a random stack — good for exploring
|
|
39
|
+
--template <name> # Use a preset (t3, mern, pern, uniwind)
|
|
40
|
+
--ecosystem <lang> # Start in rust, python, or go mode
|
|
41
|
+
--no-git # Skip git initialization
|
|
42
|
+
--no-install # Skip dependency installation
|
|
43
|
+
--package-manager # Package manager (bun, pnpm, npm, yarn)
|
|
44
|
+
--verbose # Show detailed output
|
|
74
45
|
```
|
|
75
46
|
|
|
76
|
-
##
|
|
47
|
+
## Links
|
|
77
48
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
│ ├── web/ # Frontend application
|
|
82
|
-
│ ├── server/ # Backend API
|
|
83
|
-
│ ├── native/ # (optional) Mobile application
|
|
84
|
-
│ └── docs/ # (optional) Documentation site
|
|
85
|
-
├── packages/ # Shared packages
|
|
86
|
-
└── README.md
|
|
87
|
-
```
|
|
49
|
+
- [Website](https://better-fullstack.dev)
|
|
50
|
+
- [GitHub](https://github.com/Marve10s/Better-Fullstack)
|
|
51
|
+
- [npm](https://www.npmjs.com/package/create-better-fullstack)
|
package/dist/cli.mjs
CHANGED
package/dist/index.d.mts
CHANGED
|
@@ -144,6 +144,7 @@ declare const router: {
|
|
|
144
144
|
modelfusion: "modelfusion";
|
|
145
145
|
langchain: "langchain";
|
|
146
146
|
llamaindex: "llamaindex";
|
|
147
|
+
"tanstack-ai": "tanstack-ai";
|
|
147
148
|
}>>;
|
|
148
149
|
realtime: z.ZodOptional<z.ZodEnum<{
|
|
149
150
|
none: "none";
|
|
@@ -256,6 +257,11 @@ declare const router: {
|
|
|
256
257
|
wxt: "wxt";
|
|
257
258
|
msw: "msw";
|
|
258
259
|
storybook: "storybook";
|
|
260
|
+
"tanstack-query": "tanstack-query";
|
|
261
|
+
"tanstack-table": "tanstack-table";
|
|
262
|
+
"tanstack-virtual": "tanstack-virtual";
|
|
263
|
+
"tanstack-db": "tanstack-db";
|
|
264
|
+
"tanstack-pacer": "tanstack-pacer";
|
|
259
265
|
}>>>;
|
|
260
266
|
examples: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
261
267
|
none: "none";
|
|
@@ -267,6 +273,7 @@ declare const router: {
|
|
|
267
273
|
bun: "bun";
|
|
268
274
|
npm: "npm";
|
|
269
275
|
pnpm: "pnpm";
|
|
276
|
+
yarn: "yarn";
|
|
270
277
|
}>>;
|
|
271
278
|
install: z.ZodOptional<z.ZodBoolean>;
|
|
272
279
|
dbSetup: z.ZodOptional<z.ZodEnum<{
|
|
@@ -528,18 +535,18 @@ declare const router: {
|
|
|
528
535
|
backend: "none" | "hono" | "express" | "fastify" | "elysia" | "fets" | "nestjs" | "adonisjs" | "nitro" | "encore" | "convex" | "self";
|
|
529
536
|
runtime: "none" | "bun" | "node" | "workers";
|
|
530
537
|
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")[];
|
|
531
|
-
addons: ("none" | "pwa" | "tauri" | "starlight" | "biome" | "lefthook" | "husky" | "ruler" | "mcp" | "skills" | "turborepo" | "fumadocs" | "ultracite" | "oxlint" | "opentui" | "wxt" | "msw" | "storybook")[];
|
|
538
|
+
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")[];
|
|
532
539
|
examples: ("ai" | "none" | "chat-sdk")[];
|
|
533
540
|
auth: "none" | "better-auth" | "go-better-auth" | "clerk" | "nextauth" | "stack-auth" | "supabase-auth" | "auth0";
|
|
534
541
|
payments: "none" | "polar" | "stripe" | "lemon-squeezy" | "paddle" | "dodo";
|
|
535
542
|
git: boolean;
|
|
536
|
-
packageManager: "bun" | "npm" | "pnpm";
|
|
543
|
+
packageManager: "bun" | "npm" | "pnpm" | "yarn";
|
|
537
544
|
install: boolean;
|
|
538
545
|
dbSetup: "none" | "turso" | "neon" | "prisma-postgres" | "planetscale" | "mongodb-atlas" | "supabase" | "upstash" | "d1" | "docker";
|
|
539
546
|
api: "none" | "trpc" | "orpc" | "ts-rest" | "garph";
|
|
540
547
|
webDeploy: "none" | "docker" | "cloudflare" | "fly" | "railway" | "sst";
|
|
541
548
|
serverDeploy: "none" | "docker" | "cloudflare" | "fly" | "railway" | "sst";
|
|
542
|
-
ai: "none" | "langgraph" | "langchain" | "llamaindex" | "vercel-ai" | "mastra" | "voltagent" | "openai-agents" | "google-adk" | "modelfusion";
|
|
549
|
+
ai: "none" | "langgraph" | "langchain" | "llamaindex" | "vercel-ai" | "mastra" | "voltagent" | "openai-agents" | "google-adk" | "modelfusion" | "tanstack-ai";
|
|
543
550
|
effect: "effect" | "none" | "effect-full";
|
|
544
551
|
stateManagement: "none" | "zustand" | "jotai" | "nanostores" | "redux-toolkit" | "mobx" | "xstate" | "valtio" | "tanstack-store" | "legend-state";
|
|
545
552
|
forms: "none" | "tanstack-form" | "react-hook-form" | "formik" | "final-form" | "conform" | "modular-forms";
|
|
@@ -614,18 +621,18 @@ declare const router: {
|
|
|
614
621
|
backend: "none" | "hono" | "express" | "fastify" | "elysia" | "fets" | "nestjs" | "adonisjs" | "nitro" | "encore" | "convex" | "self";
|
|
615
622
|
runtime: "none" | "bun" | "node" | "workers";
|
|
616
623
|
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")[];
|
|
617
|
-
addons: ("none" | "pwa" | "tauri" | "starlight" | "biome" | "lefthook" | "husky" | "ruler" | "mcp" | "skills" | "turborepo" | "fumadocs" | "ultracite" | "oxlint" | "opentui" | "wxt" | "msw" | "storybook")[];
|
|
624
|
+
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")[];
|
|
618
625
|
examples: ("ai" | "none" | "chat-sdk")[];
|
|
619
626
|
auth: "none" | "better-auth" | "go-better-auth" | "clerk" | "nextauth" | "stack-auth" | "supabase-auth" | "auth0";
|
|
620
627
|
payments: "none" | "polar" | "stripe" | "lemon-squeezy" | "paddle" | "dodo";
|
|
621
628
|
git: boolean;
|
|
622
|
-
packageManager: "bun" | "npm" | "pnpm";
|
|
629
|
+
packageManager: "bun" | "npm" | "pnpm" | "yarn";
|
|
623
630
|
install: boolean;
|
|
624
631
|
dbSetup: "none" | "turso" | "neon" | "prisma-postgres" | "planetscale" | "mongodb-atlas" | "supabase" | "upstash" | "d1" | "docker";
|
|
625
632
|
api: "none" | "trpc" | "orpc" | "ts-rest" | "garph";
|
|
626
633
|
webDeploy: "none" | "docker" | "cloudflare" | "fly" | "railway" | "sst";
|
|
627
634
|
serverDeploy: "none" | "docker" | "cloudflare" | "fly" | "railway" | "sst";
|
|
628
|
-
ai: "none" | "langgraph" | "langchain" | "llamaindex" | "vercel-ai" | "mastra" | "voltagent" | "openai-agents" | "google-adk" | "modelfusion";
|
|
635
|
+
ai: "none" | "langgraph" | "langchain" | "llamaindex" | "vercel-ai" | "mastra" | "voltagent" | "openai-agents" | "google-adk" | "modelfusion" | "tanstack-ai";
|
|
629
636
|
effect: "effect" | "none" | "effect-full";
|
|
630
637
|
stateManagement: "none" | "zustand" | "jotai" | "nanostores" | "redux-toolkit" | "mobx" | "xstate" | "valtio" | "tanstack-store" | "legend-state";
|
|
631
638
|
forms: "none" | "tanstack-form" | "react-hook-form" | "formik" | "final-form" | "conform" | "modular-forms";
|
|
@@ -712,6 +719,11 @@ declare const router: {
|
|
|
712
719
|
wxt: "wxt";
|
|
713
720
|
msw: "msw";
|
|
714
721
|
storybook: "storybook";
|
|
722
|
+
"tanstack-query": "tanstack-query";
|
|
723
|
+
"tanstack-table": "tanstack-table";
|
|
724
|
+
"tanstack-virtual": "tanstack-virtual";
|
|
725
|
+
"tanstack-db": "tanstack-db";
|
|
726
|
+
"tanstack-pacer": "tanstack-pacer";
|
|
715
727
|
}>>>;
|
|
716
728
|
webDeploy: z.ZodOptional<z.ZodEnum<{
|
|
717
729
|
none: "none";
|
|
@@ -734,6 +746,7 @@ declare const router: {
|
|
|
734
746
|
bun: "bun";
|
|
735
747
|
npm: "npm";
|
|
736
748
|
pnpm: "pnpm";
|
|
749
|
+
yarn: "yarn";
|
|
737
750
|
}>>;
|
|
738
751
|
projectDir: z.ZodOptional<z.ZodString>;
|
|
739
752
|
}, z.core.$strip>, _orpc_server0.Schema<void, void>, _orpc_server0.MergedErrorMap<Record<never, never>, Record<never, never>>, Record<never, never>>;
|
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-Cmf5RSiE.mjs";
|
|
3
3
|
|
|
4
4
|
export { EMBEDDED_TEMPLATES, TEMPLATE_COUNT, VirtualFileSystem, add, builder, create, createBtsCli, createVirtual, docs, generateVirtualProject, history, router, sponsors };
|
|
@@ -1214,6 +1214,34 @@ function getAddonDisplay(addon) {
|
|
|
1214
1214
|
label = "WXT";
|
|
1215
1215
|
hint = "Build browser extensions";
|
|
1216
1216
|
break;
|
|
1217
|
+
case "msw":
|
|
1218
|
+
label = "MSW";
|
|
1219
|
+
hint = "Mock Service Worker for API mocking";
|
|
1220
|
+
break;
|
|
1221
|
+
case "storybook":
|
|
1222
|
+
label = "Storybook";
|
|
1223
|
+
hint = "Component development and testing workshop";
|
|
1224
|
+
break;
|
|
1225
|
+
case "tanstack-query":
|
|
1226
|
+
label = "TanStack Query";
|
|
1227
|
+
hint = "Powerful async state management & data fetching";
|
|
1228
|
+
break;
|
|
1229
|
+
case "tanstack-table":
|
|
1230
|
+
label = "TanStack Table";
|
|
1231
|
+
hint = "Headless table with sorting, filtering & pagination";
|
|
1232
|
+
break;
|
|
1233
|
+
case "tanstack-virtual":
|
|
1234
|
+
label = "TanStack Virtual";
|
|
1235
|
+
hint = "Virtualize large lists & grids for 60fps performance";
|
|
1236
|
+
break;
|
|
1237
|
+
case "tanstack-db":
|
|
1238
|
+
label = "TanStack DB";
|
|
1239
|
+
hint = "Reactive client-first data store with sync backends (Beta)";
|
|
1240
|
+
break;
|
|
1241
|
+
case "tanstack-pacer":
|
|
1242
|
+
label = "TanStack Pacer";
|
|
1243
|
+
hint = "Debounce, throttle, rate-limit & queue utilities (Beta)";
|
|
1244
|
+
break;
|
|
1217
1245
|
default:
|
|
1218
1246
|
label = addon;
|
|
1219
1247
|
hint = `Add ${addon}`;
|
|
@@ -1238,9 +1266,18 @@ const ADDON_GROUPS = {
|
|
|
1238
1266
|
"tauri",
|
|
1239
1267
|
"opentui",
|
|
1240
1268
|
"wxt",
|
|
1241
|
-
"ruler"
|
|
1269
|
+
"ruler",
|
|
1270
|
+
"msw",
|
|
1271
|
+
"storybook"
|
|
1242
1272
|
],
|
|
1243
|
-
"AI Agents": ["mcp", "skills"]
|
|
1273
|
+
"AI Agents": ["mcp", "skills"],
|
|
1274
|
+
TanStack: [
|
|
1275
|
+
"tanstack-query",
|
|
1276
|
+
"tanstack-table",
|
|
1277
|
+
"tanstack-virtual",
|
|
1278
|
+
"tanstack-db",
|
|
1279
|
+
"tanstack-pacer"
|
|
1280
|
+
]
|
|
1244
1281
|
};
|
|
1245
1282
|
async function getAddonsChoice(addons, frontends, auth) {
|
|
1246
1283
|
if (addons !== void 0) return addons;
|
|
@@ -1249,7 +1286,8 @@ async function getAddonsChoice(addons, frontends, auth) {
|
|
|
1249
1286
|
Tooling: [],
|
|
1250
1287
|
Documentation: [],
|
|
1251
1288
|
Extensions: [],
|
|
1252
|
-
"AI Agents": []
|
|
1289
|
+
"AI Agents": [],
|
|
1290
|
+
TanStack: []
|
|
1253
1291
|
};
|
|
1254
1292
|
const frontendsArray = frontends || [];
|
|
1255
1293
|
for (const addon of allAddons) {
|
|
@@ -1265,6 +1303,7 @@ async function getAddonsChoice(addons, frontends, auth) {
|
|
|
1265
1303
|
else if (ADDON_GROUPS.Documentation.includes(addon)) groupedOptions.Documentation.push(option);
|
|
1266
1304
|
else if (ADDON_GROUPS.Extensions.includes(addon)) groupedOptions.Extensions.push(option);
|
|
1267
1305
|
else if (ADDON_GROUPS["AI Agents"].includes(addon)) groupedOptions["AI Agents"].push(option);
|
|
1306
|
+
else if (ADDON_GROUPS.TanStack.includes(addon)) groupedOptions.TanStack.push(option);
|
|
1268
1307
|
}
|
|
1269
1308
|
Object.keys(groupedOptions).forEach((group$1) => {
|
|
1270
1309
|
if (groupedOptions[group$1].length === 0) delete groupedOptions[group$1];
|
|
@@ -1289,7 +1328,8 @@ async function getAddonsToAdd(frontend, existingAddons = [], auth) {
|
|
|
1289
1328
|
Tooling: [],
|
|
1290
1329
|
Documentation: [],
|
|
1291
1330
|
Extensions: [],
|
|
1292
|
-
"AI Agents": []
|
|
1331
|
+
"AI Agents": [],
|
|
1332
|
+
TanStack: []
|
|
1293
1333
|
};
|
|
1294
1334
|
const frontendArray = frontend || [];
|
|
1295
1335
|
const compatibleAddons = getCompatibleAddons$1(types_exports.AddonsSchema.options.filter((addon) => addon !== "none"), frontendArray, existingAddons, auth);
|
|
@@ -1304,6 +1344,7 @@ async function getAddonsToAdd(frontend, existingAddons = [], auth) {
|
|
|
1304
1344
|
else if (ADDON_GROUPS.Documentation.includes(addon)) groupedOptions.Documentation.push(option);
|
|
1305
1345
|
else if (ADDON_GROUPS.Extensions.includes(addon)) groupedOptions.Extensions.push(option);
|
|
1306
1346
|
else if (ADDON_GROUPS["AI Agents"].includes(addon)) groupedOptions["AI Agents"].push(option);
|
|
1347
|
+
else if (ADDON_GROUPS.TanStack.includes(addon)) groupedOptions.TanStack.push(option);
|
|
1307
1348
|
}
|
|
1308
1349
|
Object.keys(groupedOptions).forEach((group$1) => {
|
|
1309
1350
|
if (groupedOptions[group$1].length === 0) delete groupedOptions[group$1];
|
|
@@ -1532,6 +1573,7 @@ function getPackageExecutionCommand(packageManager, commandWithArgs) {
|
|
|
1532
1573
|
switch (packageManager) {
|
|
1533
1574
|
case "pnpm": return `pnpm dlx ${commandWithArgs}`;
|
|
1534
1575
|
case "bun": return `bunx ${commandWithArgs}`;
|
|
1576
|
+
case "yarn": return `yarn dlx ${commandWithArgs}`;
|
|
1535
1577
|
default: return `npx ${commandWithArgs}`;
|
|
1536
1578
|
}
|
|
1537
1579
|
}
|
|
@@ -1552,6 +1594,11 @@ function getPackageExecutionArgs(packageManager, commandWithArgs) {
|
|
|
1552
1594
|
...args
|
|
1553
1595
|
];
|
|
1554
1596
|
case "bun": return ["bunx", ...args];
|
|
1597
|
+
case "yarn": return [
|
|
1598
|
+
"yarn",
|
|
1599
|
+
"dlx",
|
|
1600
|
+
...args
|
|
1601
|
+
];
|
|
1555
1602
|
default: return ["npx", ...args];
|
|
1556
1603
|
}
|
|
1557
1604
|
}
|
|
@@ -1571,6 +1618,7 @@ function getPackageRunnerPrefix(packageManager) {
|
|
|
1571
1618
|
switch (packageManager) {
|
|
1572
1619
|
case "pnpm": return ["pnpm", "dlx"];
|
|
1573
1620
|
case "bun": return ["bunx"];
|
|
1621
|
+
case "yarn": return ["yarn", "dlx"];
|
|
1574
1622
|
default: return ["npx"];
|
|
1575
1623
|
}
|
|
1576
1624
|
}
|
|
@@ -2969,6 +3017,11 @@ async function getAIChoice(ai) {
|
|
|
2969
3017
|
label: "LlamaIndex",
|
|
2970
3018
|
hint: "Data framework for LLM applications"
|
|
2971
3019
|
},
|
|
3020
|
+
{
|
|
3021
|
+
value: "tanstack-ai",
|
|
3022
|
+
label: "TanStack AI",
|
|
3023
|
+
hint: "Unified LLM interface for AI-powered apps (Alpha)"
|
|
3024
|
+
},
|
|
2972
3025
|
{
|
|
2973
3026
|
value: "none",
|
|
2974
3027
|
label: "None",
|
|
@@ -4388,6 +4441,11 @@ async function getPackageManagerChoice(packageManager) {
|
|
|
4388
4441
|
value: "bun",
|
|
4389
4442
|
label: "bun",
|
|
4390
4443
|
hint: "All-in-one JavaScript runtime & toolkit"
|
|
4444
|
+
},
|
|
4445
|
+
{
|
|
4446
|
+
value: "yarn",
|
|
4447
|
+
label: "yarn",
|
|
4448
|
+
hint: "Yarn Berry (v4) with PnP or node_modules"
|
|
4391
4449
|
}
|
|
4392
4450
|
],
|
|
4393
4451
|
initialValue: getUserPkgManager()
|
|
@@ -6009,6 +6067,7 @@ function getBaseCommand(packageManager) {
|
|
|
6009
6067
|
switch (packageManager) {
|
|
6010
6068
|
case "bun": return "bun create better-fullstack@latest";
|
|
6011
6069
|
case "pnpm": return "pnpm create better-fullstack@latest";
|
|
6070
|
+
case "yarn": return "yarn create better-fullstack@latest";
|
|
6012
6071
|
case "npm":
|
|
6013
6072
|
default: return "npx create-better-fullstack@latest";
|
|
6014
6073
|
}
|
|
@@ -8187,7 +8246,7 @@ async function displayPostInstallInstructions(config) {
|
|
|
8187
8246
|
}
|
|
8188
8247
|
const isConvex = backend === "convex";
|
|
8189
8248
|
const isBackendSelf = backend === "self";
|
|
8190
|
-
const runCmd = packageManager === "npm" ? "npm run" : packageManager === "pnpm" ? "pnpm run" : "bun run";
|
|
8249
|
+
const runCmd = packageManager === "npm" ? "npm run" : packageManager === "pnpm" ? "pnpm run" : packageManager === "yarn" ? "yarn" : "bun run";
|
|
8191
8250
|
const cdCmd = `cd ${relativePath}`;
|
|
8192
8251
|
const hasHusky = addons?.includes("husky");
|
|
8193
8252
|
const hasLefthook = addons?.includes("lefthook");
|
|
@@ -8275,7 +8334,7 @@ function getLintingInstructions(runCmd) {
|
|
|
8275
8334
|
return `${pc.bold("Linting and formatting:")}\n${pc.cyan("•")} Format and lint fix: ${`${runCmd} check`}\n`;
|
|
8276
8335
|
}
|
|
8277
8336
|
function getLefthookInstructions(packageManager) {
|
|
8278
|
-
const cmd = packageManager === "npm" ? "npx" : packageManager;
|
|
8337
|
+
const cmd = packageManager === "npm" ? "npx" : packageManager === "yarn" ? "yarn dlx" : packageManager;
|
|
8279
8338
|
return `${pc.bold("Git hooks with Lefthook:")}\n${pc.cyan("•")} Install hooks: ${cmd} lefthook install\n`;
|
|
8280
8339
|
}
|
|
8281
8340
|
async function getDatabaseInstructions(database, orm, runCmd, _runtime, dbSetup, serverDeploy, _backend) {
|
|
@@ -8340,7 +8399,7 @@ function getClerkInstructions(backend, frontend) {
|
|
|
8340
8399
|
return "";
|
|
8341
8400
|
}
|
|
8342
8401
|
function getBetterAuthConvexInstructions(hasWeb, webPort, packageManager) {
|
|
8343
|
-
const cmd = packageManager === "npm" ? "npx" : packageManager;
|
|
8402
|
+
const cmd = packageManager === "npm" ? "npx" : packageManager === "yarn" ? "yarn dlx" : packageManager;
|
|
8344
8403
|
return `${pc.bold("Better Auth + Convex Setup:")}\n${pc.cyan("•")} Set environment variables from ${pc.white("packages/backend")}:\n${pc.white(" cd packages/backend")}\n${pc.white(` ${cmd} convex env set BETTER_AUTH_SECRET=$(openssl rand -base64 32)`)}\n` + (hasWeb ? `${pc.white(` ${cmd} convex env set SITE_URL http://localhost:${webPort}`)}\n` : "");
|
|
8345
8404
|
}
|
|
8346
8405
|
function getPolarInstructions(backend) {
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-better-fullstack",
|
|
3
|
-
"version": "1.4.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.4.13",
|
|
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",
|
|
7
7
|
"better-fullstack",
|
|
@@ -12,23 +12,30 @@
|
|
|
12
12
|
"elysia",
|
|
13
13
|
"expo",
|
|
14
14
|
"fullstack",
|
|
15
|
+
"go",
|
|
16
|
+
"golang",
|
|
15
17
|
"hono",
|
|
16
18
|
"monorepo",
|
|
17
19
|
"prisma",
|
|
18
20
|
"pwa",
|
|
21
|
+
"python",
|
|
19
22
|
"react",
|
|
20
23
|
"react-native",
|
|
24
|
+
"rust",
|
|
25
|
+
"scaffolding",
|
|
21
26
|
"shadcn",
|
|
22
27
|
"starter",
|
|
23
28
|
"tailwind",
|
|
24
29
|
"tanstack",
|
|
25
30
|
"tauri",
|
|
31
|
+
"template",
|
|
26
32
|
"trpc",
|
|
27
33
|
"turborepo",
|
|
28
34
|
"type-safety",
|
|
29
|
-
"typescript"
|
|
35
|
+
"typescript",
|
|
36
|
+
"yarn"
|
|
30
37
|
],
|
|
31
|
-
"homepage": "https://better-fullstack
|
|
38
|
+
"homepage": "https://better-fullstack.dev/",
|
|
32
39
|
"license": "MIT",
|
|
33
40
|
"author": "Marve10s",
|
|
34
41
|
"repository": {
|
|
@@ -76,8 +83,8 @@
|
|
|
76
83
|
"prepublishOnly": "npm run build"
|
|
77
84
|
},
|
|
78
85
|
"dependencies": {
|
|
79
|
-
"@better-fullstack/template-generator": "^1.4.
|
|
80
|
-
"@better-fullstack/types": "^1.4.
|
|
86
|
+
"@better-fullstack/template-generator": "^1.4.13",
|
|
87
|
+
"@better-fullstack/types": "^1.4.13",
|
|
81
88
|
"@clack/core": "^0.5.0",
|
|
82
89
|
"@clack/prompts": "^1.0.0-alpha.8",
|
|
83
90
|
"@orpc/server": "^1.13.0",
|