create-better-fullstack 1.0.0-canary.c9b74dcc → 1.0.5
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 +27 -66
- package/dist/cli.mjs +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +1 -1
- package/dist/{src-CwAb8MVO.mjs → src-B1JV3DqF.mjs} +21 -21
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -1,110 +1,71 @@
|
|
|
1
1
|
# Better Fullstack CLI
|
|
2
2
|
|
|
3
|
-
A
|
|
3
|
+
A CLI-first toolkit for building Full Stack applications. Skip the configuration. Ship the code.
|
|
4
4
|
|
|
5
5
|
## Quick Start
|
|
6
6
|
|
|
7
|
-
Run without installing globally:
|
|
8
|
-
|
|
9
7
|
```bash
|
|
10
8
|
# Using bun (recommended)
|
|
11
|
-
bun create better-
|
|
9
|
+
bun create better-fullstack@latest
|
|
12
10
|
|
|
13
11
|
# Using pnpm
|
|
14
|
-
pnpm create better-
|
|
12
|
+
pnpm create better-fullstack@latest
|
|
15
13
|
|
|
16
14
|
# Using npm
|
|
17
|
-
npx create-better-
|
|
15
|
+
npx create-better-fullstack@latest
|
|
18
16
|
```
|
|
19
17
|
|
|
20
|
-
Follow the prompts to configure your project or use the `--yes` flag for defaults.
|
|
21
|
-
|
|
22
|
-
## Features
|
|
23
|
-
|
|
24
|
-
| Category | Options |
|
|
25
|
-
| ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
26
|
-
| **TypeScript** | End-to-end type safety across all parts of your application |
|
|
27
|
-
| **Frontend** | • React with TanStack Router<br>• React with React Router<br>• React with TanStack Start (SSR)<br>• Next.js<br>• SvelteKit<br>• Nuxt (Vue)<br>• SolidJS<br>• React Native with NativeWind (via Expo)<br>• React Native with Unistyles (via Expo)<br>• None |
|
|
28
|
-
| **Backend** | • Hono<br>• Express<br>• Elysia<br>• Next.js API routes<br>• Convex<br>• Fastify<br>• None |
|
|
29
|
-
| **API Layer** | • tRPC (type-safe APIs)<br>• oRPC (OpenAPI-compatible type-safe APIs)<br>• None |
|
|
30
|
-
| **Runtime** | • Bun<br>• Node.js<br>• Cloudflare Workers<br>• None |
|
|
31
|
-
| **Database** | • SQLite<br>• PostgreSQL<br>• MySQL<br>• MongoDB<br>• None |
|
|
32
|
-
| **ORM** | • Drizzle (TypeScript-first)<br>• Prisma (feature-rich)<br>• Mongoose (for MongoDB)<br>• None |
|
|
33
|
-
| **Database Setup** | • Turso (SQLite)<br>• Cloudflare D1 (SQLite)<br>• Neon (PostgreSQL)<br>• Supabase (PostgreSQL)<br>• Prisma Postgres<br>• MongoDB Atlas<br>• None (manual setup) |
|
|
34
|
-
| **Authentication** | Better-Auth (email/password, with more options coming soon) |
|
|
35
|
-
| **Styling** | Tailwind CSS with shadcn/ui components |
|
|
36
|
-
| **Addons** | • PWA support<br>• Tauri (desktop applications)<br>• Starlight (documentation site)<br>• Biome (linting and formatting)<br>• Lefthook, Husky (Git hooks)<br>• Turborepo (optimized builds) |
|
|
37
|
-
| **Examples** | • Todo app<br>• AI Chat interface (using Vercel AI SDK) |
|
|
38
|
-
| **Developer Experience** | • Automatic Git initialization<br>• Package manager choice (npm, pnpm, bun)<br>• Automatic dependency installation |
|
|
39
|
-
|
|
40
18
|
## Usage
|
|
41
19
|
|
|
42
20
|
```bash
|
|
43
|
-
Usage: create-better-
|
|
21
|
+
Usage: create-better-fullstack [project-directory] [options]
|
|
44
22
|
|
|
45
23
|
Options:
|
|
46
24
|
-V, --version Output the version number
|
|
47
25
|
-y, --yes Use default configuration
|
|
26
|
+
--yolo Random configuration (experimental)
|
|
48
27
|
--database <type> Database type (none, sqlite, postgres, mysql, mongodb)
|
|
49
|
-
--orm <type> ORM type (
|
|
50
|
-
--auth
|
|
51
|
-
--
|
|
52
|
-
--frontend <types...> Frontend types
|
|
53
|
-
--
|
|
28
|
+
--orm <type> ORM type (drizzle, prisma, mongoose, typeorm, kysely, mikroorm, sequelize, none)
|
|
29
|
+
--auth <type> Authentication (better-auth, clerk, nextauth, 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
|
|
54
36
|
--examples <types...> Examples to include (todo, ai, none)
|
|
55
|
-
--git
|
|
56
|
-
--no-git Skip git initialization
|
|
37
|
+
--git / --no-git Initialize git repository
|
|
57
38
|
--package-manager <pm> Package manager (npm, pnpm, bun)
|
|
58
|
-
--install
|
|
59
|
-
--
|
|
60
|
-
--db-setup <setup> Database setup (turso, d1, neon, supabase, prisma-postgres, mongodb-atlas, docker, none)
|
|
61
|
-
--web-deploy <setup> Web deployment (workers, alchemy, none)
|
|
62
|
-
--server-deploy <setup> Server deployment (workers, alchemy, none)
|
|
63
|
-
--backend <framework> Backend framework (hono, express, elysia, next, convex, fastify, none)
|
|
64
|
-
--runtime <runtime> Runtime (bun, node, workers, none)
|
|
65
|
-
--api <type> API type (trpc, orpc, none)
|
|
39
|
+
--install / --no-install Install dependencies
|
|
40
|
+
--db-setup <setup> Database setup
|
|
66
41
|
-h, --help Display help
|
|
67
42
|
```
|
|
68
43
|
|
|
69
44
|
## Examples
|
|
70
45
|
|
|
71
|
-
Create a project with default configuration:
|
|
72
|
-
|
|
73
|
-
```bash
|
|
74
|
-
npx create-better-t-stack --yes
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
Create a project with specific options:
|
|
78
|
-
|
|
79
46
|
```bash
|
|
80
|
-
|
|
81
|
-
|
|
47
|
+
# Default configuration
|
|
48
|
+
npx create-better-fullstack --yes
|
|
82
49
|
|
|
83
|
-
|
|
50
|
+
# With specific options
|
|
51
|
+
npx create-better-fullstack --database postgres --orm drizzle --auth better-auth --addons pwa biome
|
|
84
52
|
|
|
85
|
-
|
|
86
|
-
npx create-better-
|
|
87
|
-
```
|
|
53
|
+
# Elysia backend with Node.js
|
|
54
|
+
npx create-better-fullstack --backend elysia --runtime node
|
|
88
55
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
```bash
|
|
92
|
-
npx create-better-t-stack --frontend tanstack-router native-bare
|
|
56
|
+
# Multiple frontends (web + native)
|
|
57
|
+
npx create-better-fullstack --frontend tanstack-router native-bare
|
|
93
58
|
```
|
|
94
59
|
|
|
95
60
|
## Project Structure
|
|
96
61
|
|
|
97
|
-
The created project follows a clean monorepo structure:
|
|
98
|
-
|
|
99
62
|
```
|
|
100
|
-
my-
|
|
63
|
+
my-app/
|
|
101
64
|
├── apps/
|
|
102
65
|
│ ├── web/ # Frontend application
|
|
103
66
|
│ ├── server/ # Backend API
|
|
104
67
|
│ ├── native/ # (optional) Mobile application
|
|
105
68
|
│ └── docs/ # (optional) Documentation site
|
|
106
69
|
├── packages/ # Shared packages
|
|
107
|
-
└── README.md
|
|
70
|
+
└── README.md
|
|
108
71
|
```
|
|
109
|
-
|
|
110
|
-
After project creation, you'll receive detailed instructions for next steps and additional setup requirements.
|
package/dist/cli.mjs
CHANGED
package/dist/index.d.mts
CHANGED
|
@@ -458,7 +458,7 @@ declare function createBtsCli(): trpc_cli0.TrpcCli;
|
|
|
458
458
|
*
|
|
459
459
|
* @example
|
|
460
460
|
* ```typescript
|
|
461
|
-
* import { create } from "create-better-
|
|
461
|
+
* import { create } from "create-better-fullstack";
|
|
462
462
|
*
|
|
463
463
|
* const result = await create("my-app", {
|
|
464
464
|
* frontend: ["tanstack-router"],
|
|
@@ -484,7 +484,7 @@ declare function builder(): Promise<void>;
|
|
|
484
484
|
*
|
|
485
485
|
* @example
|
|
486
486
|
* ```typescript
|
|
487
|
-
* import { createVirtual, EMBEDDED_TEMPLATES } from "create-better-
|
|
487
|
+
* import { createVirtual, EMBEDDED_TEMPLATES } from "create-better-fullstack";
|
|
488
488
|
*
|
|
489
489
|
* const result = await createVirtual({
|
|
490
490
|
* frontend: ["tanstack-router"],
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { a as create, c as docs, d as sponsors, i as builder, l as generateVirtualProject, n as TEMPLATE_COUNT, o as createBtsCli, r as VirtualFileSystem, s as createVirtual, t as EMBEDDED_TEMPLATES, u as router } from "./src-
|
|
2
|
+
import { a as create, c as docs, d as sponsors, i as builder, l as generateVirtualProject, n as TEMPLATE_COUNT, o as createBtsCli, r as VirtualFileSystem, s as createVirtual, t as EMBEDDED_TEMPLATES, u as router } from "./src-B1JV3DqF.mjs";
|
|
3
3
|
|
|
4
4
|
export { EMBEDDED_TEMPLATES, TEMPLATE_COUNT, VirtualFileSystem, builder, create, createBtsCli, createVirtual, docs, generateVirtualProject, router, sponsors };
|
|
@@ -2099,7 +2099,7 @@ const getLatestCLIVersion = () => {
|
|
|
2099
2099
|
*/
|
|
2100
2100
|
function isTelemetryEnabled() {
|
|
2101
2101
|
const BTS_TELEMETRY_DISABLED = process.env.BTS_TELEMETRY_DISABLED;
|
|
2102
|
-
const BTS_TELEMETRY = "
|
|
2102
|
+
const BTS_TELEMETRY = "1";
|
|
2103
2103
|
if (BTS_TELEMETRY_DISABLED !== void 0) return BTS_TELEMETRY_DISABLED !== "1";
|
|
2104
2104
|
if (BTS_TELEMETRY !== void 0) return BTS_TELEMETRY === "1";
|
|
2105
2105
|
return true;
|
|
@@ -2193,11 +2193,11 @@ function generateReproducibleCommand(config) {
|
|
|
2193
2193
|
flags.push(config.git ? "--git" : "--no-git");
|
|
2194
2194
|
flags.push(`--package-manager ${config.packageManager}`);
|
|
2195
2195
|
flags.push(config.install ? "--install" : "--no-install");
|
|
2196
|
-
let baseCommand = "npx create-better-
|
|
2196
|
+
let baseCommand = "npx create-better-fullstack@latest";
|
|
2197
2197
|
const pkgManager = config.packageManager;
|
|
2198
|
-
if (pkgManager === "bun") baseCommand = "bun create better-
|
|
2199
|
-
else if (pkgManager === "pnpm") baseCommand = "pnpm create better-
|
|
2200
|
-
else if (pkgManager === "npm") baseCommand = "npx create-better-
|
|
2198
|
+
if (pkgManager === "bun") baseCommand = "bun create better-fullstack@latest";
|
|
2199
|
+
else if (pkgManager === "pnpm") baseCommand = "pnpm create better-fullstack@latest";
|
|
2200
|
+
else if (pkgManager === "npm") baseCommand = "npx create-better-fullstack@latest";
|
|
2201
2201
|
const projectPathArg = config.relativePath ? ` ${config.relativePath}` : "";
|
|
2202
2202
|
return `${baseCommand}${projectPathArg} ${flags.join(" ")}`;
|
|
2203
2203
|
}
|
|
@@ -2295,12 +2295,12 @@ const TITLE_TEXT = `
|
|
|
2295
2295
|
██████╔╝███████╗ ██║ ██║ ███████╗██║ ██║
|
|
2296
2296
|
╚═════╝ ╚══════╝ ╚═╝ ╚═╝ ╚══════╝╚═╝ ╚═╝
|
|
2297
2297
|
|
|
2298
|
-
|
|
2299
|
-
|
|
2300
|
-
|
|
2301
|
-
|
|
2302
|
-
|
|
2303
|
-
|
|
2298
|
+
███████╗██╗ ██╗██╗ ██╗ ███████╗████████╗ █████╗ ██████╗██╗ ██╗
|
|
2299
|
+
██╔════╝██║ ██║██║ ██║ ██╔════╝╚══██╔══╝██╔══██╗██╔════╝██║ ██╔╝
|
|
2300
|
+
█████╗ ██║ ██║██║ ██║ ███████╗ ██║ ███████║██║ █████╔╝
|
|
2301
|
+
██╔══╝ ██║ ██║██║ ██║ ╚════██║ ██║ ██╔══██║██║ ██╔═██╗
|
|
2302
|
+
██║ ╚██████╔╝███████╗███████╗███████║ ██║ ██║ ██║╚██████╗██║ ██╗
|
|
2303
|
+
╚═╝ ╚═════╝ ╚══════╝╚══════╝╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝
|
|
2304
2304
|
`;
|
|
2305
2305
|
const catppuccinTheme = {
|
|
2306
2306
|
pink: "#F5C2E7",
|
|
@@ -2468,9 +2468,9 @@ function validateDatabaseOrmAuth(cfg, flags) {
|
|
|
2468
2468
|
const has = (k) => flags ? flags.has(k) : true;
|
|
2469
2469
|
if (has("orm") && has("database") && orm === "mongoose" && db !== "mongodb") exitWithError("Mongoose ORM requires MongoDB database. Please use '--database mongodb' or choose a different ORM.");
|
|
2470
2470
|
if (has("orm") && has("database") && orm === "drizzle" && db === "mongodb") exitWithError("Drizzle ORM does not support MongoDB. Please use '--orm mongoose' or '--orm prisma' or choose a different database.");
|
|
2471
|
-
if (has("orm") && has("database") && orm === "typeorm" && db === "mongodb") exitWithError("TypeORM does not support MongoDB in Better
|
|
2471
|
+
if (has("orm") && has("database") && orm === "typeorm" && db === "mongodb") exitWithError("TypeORM does not support MongoDB in Better Fullstack. Please use '--orm mongoose' or '--orm prisma' or choose a different database.");
|
|
2472
2472
|
if (has("orm") && has("database") && orm === "kysely" && db === "mongodb") exitWithError("Kysely does not support MongoDB. Please use '--orm mongoose' or '--orm prisma' or choose a different database.");
|
|
2473
|
-
if (has("orm") && has("database") && orm === "mikroorm" && db === "mongodb") exitWithError("MikroORM does not support MongoDB in Better
|
|
2473
|
+
if (has("orm") && has("database") && orm === "mikroorm" && db === "mongodb") exitWithError("MikroORM does not support MongoDB in Better Fullstack. Please use '--orm mongoose' or '--orm prisma' or choose a different database.");
|
|
2474
2474
|
if (has("orm") && has("database") && orm === "sequelize" && db === "mongodb") exitWithError("Sequelize does not support MongoDB. Please use '--orm mongoose' or '--orm prisma' or choose a different database.");
|
|
2475
2475
|
if (has("database") && has("orm") && db === "mongodb" && orm && orm !== "mongoose" && orm !== "prisma" && orm !== "none") exitWithError("MongoDB database requires Mongoose or Prisma ORM. Please use '--orm mongoose' or '--orm prisma' or choose a different database.");
|
|
2476
2476
|
if (has("database") && has("orm") && db && db !== "none" && orm === "none") exitWithError("Database selection requires an ORM. Please choose '--orm drizzle', '--orm prisma', '--orm typeorm', '--orm kysely', '--orm mikroorm', '--orm sequelize', or '--orm mongoose'.");
|
|
@@ -2781,7 +2781,7 @@ async function writeBtsConfig(projectConfig) {
|
|
|
2781
2781
|
rustLibraries: projectConfig.rustLibraries
|
|
2782
2782
|
};
|
|
2783
2783
|
const baseContent = {
|
|
2784
|
-
$schema: "https://
|
|
2784
|
+
$schema: "https://better-fullstack-web.vercel.app/schema.json",
|
|
2785
2785
|
version: btsConfig.version,
|
|
2786
2786
|
createdAt: btsConfig.createdAt,
|
|
2787
2787
|
ecosystem: btsConfig.ecosystem,
|
|
@@ -2828,7 +2828,7 @@ async function writeBtsConfig(projectConfig) {
|
|
|
2828
2828
|
eol: "\n"
|
|
2829
2829
|
});
|
|
2830
2830
|
configContent = JSONC.applyEdits(configContent, formatResult);
|
|
2831
|
-
const finalContent = `// Better
|
|
2831
|
+
const finalContent = `// Better Fullstack configuration file
|
|
2832
2832
|
// safe to delete
|
|
2833
2833
|
|
|
2834
2834
|
${configContent}`;
|
|
@@ -5079,7 +5079,7 @@ async function openUrl(url) {
|
|
|
5079
5079
|
|
|
5080
5080
|
//#endregion
|
|
5081
5081
|
//#region src/utils/sponsors.ts
|
|
5082
|
-
const SPONSORS_JSON_URL = "https://
|
|
5082
|
+
const SPONSORS_JSON_URL = "https://better-fullstack-web.vercel.app/sponsors.json";
|
|
5083
5083
|
async function fetchSponsors(url = SPONSORS_JSON_URL) {
|
|
5084
5084
|
const s = spinner();
|
|
5085
5085
|
s.start("Fetching sponsors…");
|
|
@@ -5190,7 +5190,7 @@ const router = os.router({
|
|
|
5190
5190
|
}
|
|
5191
5191
|
}),
|
|
5192
5192
|
docs: os.meta({ description: "Open Better Fullstack documentation" }).handler(async () => {
|
|
5193
|
-
const DOCS_URL = "https://better-
|
|
5193
|
+
const DOCS_URL = "https://better-fullstack-web.vercel.app/docs";
|
|
5194
5194
|
try {
|
|
5195
5195
|
await openUrl(DOCS_URL);
|
|
5196
5196
|
log.success(pc.blue("Opened docs in your default browser."));
|
|
@@ -5199,7 +5199,7 @@ const router = os.router({
|
|
|
5199
5199
|
}
|
|
5200
5200
|
}),
|
|
5201
5201
|
builder: os.meta({ description: "Open the web-based stack builder" }).handler(async () => {
|
|
5202
|
-
const BUILDER_URL = "https://better-
|
|
5202
|
+
const BUILDER_URL = "https://better-fullstack-web.vercel.app/new";
|
|
5203
5203
|
try {
|
|
5204
5204
|
await openUrl(BUILDER_URL);
|
|
5205
5205
|
log.success(pc.blue("Opened builder in your default browser."));
|
|
@@ -5212,7 +5212,7 @@ const caller = createRouterClient(router, { context: {} });
|
|
|
5212
5212
|
function createBtsCli() {
|
|
5213
5213
|
return createCli({
|
|
5214
5214
|
router,
|
|
5215
|
-
name: "create-better-
|
|
5215
|
+
name: "create-better-fullstack",
|
|
5216
5216
|
version: getLatestCLIVersion()
|
|
5217
5217
|
});
|
|
5218
5218
|
}
|
|
@@ -5222,7 +5222,7 @@ function createBtsCli() {
|
|
|
5222
5222
|
*
|
|
5223
5223
|
* @example
|
|
5224
5224
|
* ```typescript
|
|
5225
|
-
* import { create } from "create-better-
|
|
5225
|
+
* import { create } from "create-better-fullstack";
|
|
5226
5226
|
*
|
|
5227
5227
|
* const result = await create("my-app", {
|
|
5228
5228
|
* frontend: ["tanstack-router"],
|
|
@@ -5277,7 +5277,7 @@ async function builder() {
|
|
|
5277
5277
|
*
|
|
5278
5278
|
* @example
|
|
5279
5279
|
* ```typescript
|
|
5280
|
-
* import { createVirtual, EMBEDDED_TEMPLATES } from "create-better-
|
|
5280
|
+
* import { createVirtual, EMBEDDED_TEMPLATES } from "create-better-fullstack";
|
|
5281
5281
|
*
|
|
5282
5282
|
* const result = await createVirtual({
|
|
5283
5283
|
* frontend: ["tanstack-router"],
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-better-fullstack",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "A
|
|
3
|
+
"version": "1.0.5",
|
|
4
|
+
"description": "A CLI-first toolkit for building Full Stack applications. Skip the configuration. Ship the code.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"better-auth",
|
|
7
7
|
"better-fullstack",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"type-safety",
|
|
29
29
|
"typescript"
|
|
30
30
|
],
|
|
31
|
-
"homepage": "https://
|
|
31
|
+
"homepage": "https://better-fullstack-web.vercel.app/",
|
|
32
32
|
"license": "MIT",
|
|
33
33
|
"author": "Marve10s",
|
|
34
34
|
"repository": {
|
|
@@ -72,8 +72,8 @@
|
|
|
72
72
|
"prepublishOnly": "npm run build"
|
|
73
73
|
},
|
|
74
74
|
"dependencies": {
|
|
75
|
-
"@better-fullstack/template-generator": "1.0.
|
|
76
|
-
"@better-fullstack/types": "1.0.
|
|
75
|
+
"@better-fullstack/template-generator": "^1.0.5",
|
|
76
|
+
"@better-fullstack/types": "^1.0.5",
|
|
77
77
|
"@clack/core": "^0.5.0",
|
|
78
78
|
"@clack/prompts": "^1.0.0-alpha.8",
|
|
79
79
|
"@orpc/server": "^1.13.0",
|