bunkit-cli 0.2.0 → 0.3.0

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.
Files changed (3) hide show
  1. package/README.md +233 -0
  2. package/dist/index.js +47 -19
  3. package/package.json +30 -2
package/README.md ADDED
@@ -0,0 +1,233 @@
1
+ # bunkit-cli
2
+
3
+ <div align="center">
4
+
5
+ ```
6
+ ╔══════════════════════════════════════════════════╗
7
+ ║ ║
8
+ ║ ┏┓ ┳ ┳┏┓┓┏o╋ ║
9
+ ║ ┣┫ ┃ ┃┃┃┣┫┃ ┃ Modern. Fast. Opinionated. ║
10
+ ║ ┗┛•┗━┛┛┗┛┗┻ ┻ ║
11
+ ║ ║
12
+ ║ Bake production-ready apps in seconds ║
13
+ ║ ║
14
+ ╚══════════════════════════════════════════════════╝
15
+ ```
16
+
17
+ [![npm version](https://img.shields.io/npm/v/bunkit-cli.svg)](https://www.npmjs.com/package/bunkit-cli)
18
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
19
+ [![Bun](https://img.shields.io/badge/Bun-1.3+-black)](https://bun.sh)
20
+
21
+ **Beautiful CLI for creating production-ready Bun projects**
22
+
23
+ [Features](#features) • [Installation](#installation) • [Commands](#commands) • [Examples](#examples) • [Repository](https://github.com/Arakiss/bunkit)
24
+
25
+ </div>
26
+
27
+ ---
28
+
29
+ ## Features
30
+
31
+ - **Lightning Fast** - Powered by Bun runtime for instant scaffolding
32
+ - **Interactive CLI** - Beautiful prompts powered by @clack/prompts (same as Astro)
33
+ - **Multiple Presets** - Choose from minimal, web, api, or full-stack templates
34
+ - **Modular Features** - Add auth, database, payments, and more on demand
35
+ - **Modern Stack** - Next.js 16, React 19, Hono, Drizzle ORM, TypeScript 5
36
+ - **Monorepo Ready** - Bun workspaces with dependency catalogs
37
+ - **Zero Config** - Smart defaults, fully customizable
38
+
39
+ ## Installation
40
+
41
+ ### Global Installation (Recommended)
42
+
43
+ ```bash
44
+ bun install -g bunkit-cli
45
+ ```
46
+
47
+ ### Or use with bunx (No installation)
48
+
49
+ ```bash
50
+ bunx bunkit-cli@latest init
51
+ ```
52
+
53
+ ## Commands
54
+
55
+ ### `bunkit init`
56
+
57
+ Create a new project interactively with beautiful prompts.
58
+
59
+ ```bash
60
+ bunkit init
61
+ ```
62
+
63
+ You'll be guided through:
64
+ - Project name selection
65
+ - Preset choice (minimal, web, api, full)
66
+ - Feature selection (auth, database, payments, etc.)
67
+ - Package manager preference
68
+ - Git initialization
69
+
70
+ ### `bunkit create`
71
+
72
+ Quickly create a project without prompts.
73
+
74
+ ```bash
75
+ bunkit create <preset> <name> [options]
76
+
77
+ # Options:
78
+ --no-git Skip git initialization
79
+ --no-install Skip dependency installation
80
+ ```
81
+
82
+ **Available Presets:**
83
+
84
+ - `minimal` - Bare Bun project with TypeScript
85
+ - `web` - Next.js 16 + React 19 frontend
86
+ - `api` - Hono backend with TypeScript
87
+ - `full` - Full-stack monorepo (web + api + shared packages)
88
+
89
+ ### `bunkit add`
90
+
91
+ Add features to an existing project.
92
+
93
+ ```bash
94
+ bunkit add <feature> [options]
95
+
96
+ # Options:
97
+ --provider <provider> Specify provider (e.g., supabase, stripe)
98
+ ```
99
+
100
+ **Available Features:**
101
+
102
+ - `auth` - Authentication (Supabase Auth, NextAuth, etc.)
103
+ - `database` - Database with Drizzle ORM (PostgreSQL, MySQL, SQLite)
104
+ - `ui` - UI components with shadcn/ui + Tailwind CSS 4
105
+ - `payments` - Payment integration (Stripe, Paddle)
106
+ - `email` - Email service (Resend, Nodemailer)
107
+ - `storage` - File storage (Supabase Storage, S3)
108
+
109
+ ## Examples
110
+
111
+ ### Create a Full-Stack Project
112
+
113
+ ```bash
114
+ bunkit create full my-saas-app
115
+ cd my-saas-app
116
+ bun install
117
+ bun dev
118
+ ```
119
+
120
+ ### Create Next.js Frontend Only
121
+
122
+ ```bash
123
+ bunkit create web my-landing-page
124
+ cd my-landing-page
125
+ bun dev
126
+ ```
127
+
128
+ ### Create Hono API Only
129
+
130
+ ```bash
131
+ bunkit create api my-backend
132
+ cd my-backend
133
+ bun --hot src/index.ts
134
+ ```
135
+
136
+ ### Add Authentication to Existing Project
137
+
138
+ ```bash
139
+ cd my-project
140
+ bunkit add auth --provider supabase
141
+ ```
142
+
143
+ ### Add UI Components
144
+
145
+ ```bash
146
+ bunkit add ui
147
+ # Installs shadcn/ui with Tailwind CSS 4 and iconoir-react icons
148
+ ```
149
+
150
+ ## What You Get
151
+
152
+ ### Full-Stack Monorepo Structure
153
+
154
+ ```
155
+ my-app/
156
+ ├── apps/
157
+ │ ├── web/ # Next.js 16 customer-facing app
158
+ │ ├── platform/ # Next.js 16 dashboard/admin
159
+ │ └── api/ # Hono backend with Bun.serve
160
+ ├── packages/
161
+ │ ├── ui/ # Shared UI components (shadcn/ui)
162
+ │ ├── db/ # Database schema (Drizzle ORM)
163
+ │ ├── utils/ # Shared utilities
164
+ │ └── types/ # Shared TypeScript types
165
+ ├── package.json # Root with dependency catalogs
166
+ ├── bunfig.toml # Bun configuration
167
+ └── biome.json # Code quality (linting + formatting)
168
+ ```
169
+
170
+ ### Tech Stack
171
+
172
+ - **Runtime:** Bun 1.3+ (fast, native TypeScript)
173
+ - **Monorepo:** Bun workspaces with dependency catalogs
174
+ - **Frontend:** Next.js 16 + React 19 (Server Components)
175
+ - **Backend:** Hono (ultra-fast web framework)
176
+ - **Database:** Drizzle ORM with native Bun drivers
177
+ - **Language:** TypeScript 5 (strict mode)
178
+ - **Styling:** Tailwind CSS 4 (CSS-first configuration)
179
+ - **UI Components:** shadcn/ui with iconoir-react icons
180
+ - **Code Quality:** Biome (NO ESLint, NO Prettier)
181
+
182
+ ## Why bunkit?
183
+
184
+ ### For Indie Hackers
185
+
186
+ Ship your MVP in hours, not weeks. bunkit handles all the boring setup so you can focus on building your product.
187
+
188
+ ### For Teams
189
+
190
+ Production-ready architecture from day one. Monorepo structure scales from prototype to enterprise.
191
+
192
+ ### For Developers
193
+
194
+ Modern stack with zero legacy baggage. Bun runtime means fast installs, fast tests, fast everything.
195
+
196
+ ## Requirements
197
+
198
+ - **Bun 1.3+** - [Install Bun](https://bun.sh)
199
+ - **Node.js 20.9+** (required for Next.js 16) - [Download](https://nodejs.org/)
200
+ - **Git** - For version control
201
+
202
+ ## Philosophy
203
+
204
+ - **Quality First** - Enterprise-grade code from day one
205
+ - **Type Safety** - Strict TypeScript everywhere
206
+ - **Performance** - Native Bun APIs, minimal dependencies
207
+ - **Developer Experience** - Fast iteration with HMR
208
+ - **Modern Stack** - Latest stable versions only
209
+
210
+ ## Community & Support
211
+
212
+ - **GitHub Repository:** [Arakiss/bunkit](https://github.com/Arakiss/bunkit)
213
+ - **Issues:** [Report bugs or request features](https://github.com/Arakiss/bunkit/issues)
214
+ - **License:** MIT
215
+
216
+ ## Credits
217
+
218
+ Built with love for the indie hacker community.
219
+
220
+ Made possible by:
221
+ - [Bun](https://bun.sh) - Incredibly fast JavaScript runtime
222
+ - [@clack/prompts](https://github.com/natemoo-re/clack) - Beautiful CLI prompts
223
+ - [Next.js](https://nextjs.org) - React framework
224
+ - [Hono](https://hono.dev) - Ultra-fast web framework
225
+ - [Drizzle ORM](https://orm.drizzle.team) - TypeScript ORM
226
+
227
+ ---
228
+
229
+ <div align="center">
230
+
231
+ **Don't Panic - your app is being baked** 🍞
232
+
233
+ </div>
package/dist/index.js CHANGED
@@ -11467,19 +11467,38 @@ var import_picocolors6 = __toESM(require_picocolors(), 1);
11467
11467
 
11468
11468
  // ../core/src/banner.ts
11469
11469
  var import_picocolors3 = __toESM(require_picocolors(), 1);
11470
- var banner = `
11471
- ${import_picocolors3.default.yellow(" ____ __ _ __ \uD83C\uDF5E")}
11472
- ${import_picocolors3.default.yellow(" / __ )__ ______ / /__(_) /_")}
11473
- ${import_picocolors3.default.yellow(" / __ / / / / __ \\/ //_/ / __/")}
11474
- ${import_picocolors3.default.yellow(" / /_/ / /_/ / / / / ,< / / /_")}
11475
- ${import_picocolors3.default.yellow("/_____/\\__,_/_/ /_/_/|_/_/\\__/")}
11476
-
11477
- ${import_picocolors3.default.dim("\u2501".repeat(40))}
11478
- ${import_picocolors3.default.cyan(" Bake production-ready apps in seconds")}
11479
- ${import_picocolors3.default.dim("\u2501".repeat(40))}
11470
+ var quotes = [
11471
+ "Don't Panic - your app is being baked",
11472
+ "From scratch to production in seconds",
11473
+ "Freshly baked, ready to serve",
11474
+ "The best code is the code you don't write",
11475
+ "Keep calm and bake on",
11476
+ "Made with \u2665 for indie hackers",
11477
+ "Ship fast, iterate faster",
11478
+ "Less boilerplate, more building",
11479
+ "Your next big idea starts here",
11480
+ "Baking dreams into reality"
11481
+ ];
11482
+ var getRandomQuote = () => {
11483
+ return quotes[Math.floor(Math.random() * quotes.length)];
11484
+ };
11485
+ var createBanner = (version = "0.3.0") => {
11486
+ const quote = getRandomQuote();
11487
+ return `
11488
+ ${import_picocolors3.default.dim("\u2554" + "\u2550".repeat(50) + "\u2557")}
11489
+ ${import_picocolors3.default.dim("\u2551")} ${import_picocolors3.default.dim("\u2551")}
11490
+ ${import_picocolors3.default.dim("\u2551")} ${import_picocolors3.default.yellow("\u250F\u2513 \u2533 \u2533\u250F\u2513\u2513\u250Fo\u254B")} ${import_picocolors3.default.dim("\u2551")}
11491
+ ${import_picocolors3.default.dim("\u2551")} ${import_picocolors3.default.yellow("\u2523\u252B \u2503 \u2503\u2503\u2503\u2523\u252B\u2503 \u2503")} ${import_picocolors3.default.dim("Modern. Fast. Opinionated.")} ${import_picocolors3.default.dim("\u2551")}
11492
+ ${import_picocolors3.default.dim("\u2551")} ${import_picocolors3.default.yellow("\u2517\u251B\u2022\u2517\u2501\u251B\u251B\u2517\u251B\u2517\u253B \u253B")} ${import_picocolors3.default.dim("\u2551")}
11493
+ ${import_picocolors3.default.dim("\u2551")} ${import_picocolors3.default.dim("\u2551")}
11494
+ ${import_picocolors3.default.dim("\u2551")} ${import_picocolors3.default.cyan(quote.padEnd(46))} ${import_picocolors3.default.dim("\u2551")}
11495
+ ${import_picocolors3.default.dim("\u2551")} ${import_picocolors3.default.dim("\u2551")}
11496
+ ${import_picocolors3.default.dim("\u2551")} ${import_picocolors3.default.dim(`v${version}`)}${" ".repeat(43 - version.length)}\uD83C\uDF5E ${import_picocolors3.default.dim("\u2551")}
11497
+ ${import_picocolors3.default.dim("\u255A" + "\u2550".repeat(50) + "\u255D")}
11480
11498
  `;
11481
- var showBanner = () => {
11482
- console.log(banner);
11499
+ };
11500
+ var showBanner = (version) => {
11501
+ console.log(createBanner(version));
11483
11502
  };
11484
11503
  // ../core/src/fs.ts
11485
11504
  var import_fs_extra = __toESM(require_lib(), 1);
@@ -22664,12 +22683,19 @@ export default function RootLayout({
22664
22683
  Welcome to ${context.projectName} \uD83C\uDF5E
22665
22684
  </h1>
22666
22685
  <p className="text-gray-600">
22667
- Built with Next.js 15, React 19, and bunkit
22686
+ Built with Next.js 16, React 19, and bunkit
22668
22687
  </p>
22669
22688
  </div>
22670
22689
  </main>
22671
22690
  )
22672
22691
  }
22692
+
22693
+ // Next.js 16 Note:
22694
+ // When you add dynamic routes with params, make your component async and await params:
22695
+ // export default async function Page({ params }: { params: Promise<{ slug: string }> }) {
22696
+ // const { slug } = await params;
22697
+ // return <div>{slug}</div>;
22698
+ // }
22673
22699
  `;
22674
22700
  await writeFile(join(projectPath, "src/app/page.tsx"), pageContent);
22675
22701
  const globalsCssContent = `@import "tailwindcss";
@@ -23021,7 +23047,7 @@ async function initCommand() {
23021
23047
  {
23022
23048
  value: "web",
23023
23049
  label: "\uD83C\uDF10 Web",
23024
- hint: "Next.js 15 + React 19"
23050
+ hint: "Next.js 16 + React 19"
23025
23051
  },
23026
23052
  {
23027
23053
  value: "api",
@@ -23156,10 +23182,12 @@ async function addCommand(feature, options) {
23156
23182
  }
23157
23183
 
23158
23184
  // src/index.ts
23185
+ var packageJson = await Bun.file(new URL("../package.json", import.meta.url)).json();
23186
+ var VERSION = packageJson.version;
23159
23187
  var program2 = new Command;
23160
- program2.name("bunkit").description("Bake production-ready apps in seconds").version("0.1.0-alpha.1");
23188
+ program2.name("bunkit").description("Bake production-ready apps in seconds").version(VERSION);
23161
23189
  program2.command("init").description("Create a new project interactively").action(async () => {
23162
- showBanner();
23190
+ showBanner(VERSION);
23163
23191
  try {
23164
23192
  await initCommand();
23165
23193
  Se(import_picocolors6.default.green("\u2728 Done! Your project is ready to bake! \uD83C\uDF5E"));
@@ -23170,7 +23198,7 @@ program2.command("init").description("Create a new project interactively").actio
23170
23198
  }
23171
23199
  });
23172
23200
  program2.command("create").argument("<preset>", "Preset type (minimal, web, api, full)").argument("<name>", "Project name").option("--no-git", "Skip git initialization").option("--no-install", "Skip dependency installation").description("Create a new project quickly").action(async (preset, name, options) => {
23173
- showBanner();
23201
+ showBanner(VERSION);
23174
23202
  try {
23175
23203
  await createCommand2(preset, name, options);
23176
23204
  Se(import_picocolors6.default.green("\u2728 Done! Your project is ready to bake! \uD83C\uDF5E"));
@@ -23181,7 +23209,7 @@ program2.command("create").argument("<preset>", "Preset type (minimal, web, api,
23181
23209
  }
23182
23210
  });
23183
23211
  program2.command("add").argument("<feature>", "Feature to add (auth, database, ui, payments, email, storage)").option("--provider <provider>", "Provider to use").description("Add a feature to existing project").action(async (feature, options) => {
23184
- showBanner();
23212
+ showBanner(VERSION);
23185
23213
  try {
23186
23214
  await addCommand(feature, options);
23187
23215
  Se(import_picocolors6.default.green("\u2728 Feature added successfully! \uD83C\uDF5E"));
@@ -23192,6 +23220,6 @@ program2.command("add").argument("<feature>", "Feature to add (auth, database, u
23192
23220
  }
23193
23221
  });
23194
23222
  if (process.argv.length === 2 || process.argv.length === 3 && (process.argv[2] === "--help" || process.argv[2] === "-h")) {
23195
- showBanner();
23223
+ showBanner(VERSION);
23196
23224
  }
23197
23225
  program2.parse();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bunkit-cli",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Beautiful CLI for creating production-ready Bun projects",
5
5
  "type": "module",
6
6
  "bin": {
@@ -46,16 +46,44 @@
46
46
  "keywords": [
47
47
  "cli",
48
48
  "bun",
49
+ "bunkit",
49
50
  "scaffold",
51
+ "scaffolding",
50
52
  "generator",
51
53
  "template",
52
54
  "starter",
53
55
  "boilerplate",
54
56
  "monorepo",
55
57
  "nextjs",
58
+ "next.js",
59
+ "react",
60
+ "react-19",
56
61
  "hono",
62
+ "typescript",
57
63
  "supabase",
58
- "drizzle"
64
+ "drizzle",
65
+ "drizzle-orm",
66
+ "tailwind",
67
+ "tailwindcss",
68
+ "shadcn",
69
+ "shadcn-ui",
70
+ "fullstack",
71
+ "full-stack",
72
+ "saas",
73
+ "saas-boilerplate",
74
+ "indie-hacker",
75
+ "rapid-development",
76
+ "project-generator",
77
+ "web-framework",
78
+ "backend",
79
+ "frontend",
80
+ "api",
81
+ "rest-api",
82
+ "typescript-template",
83
+ "bun-template",
84
+ "nextjs-template",
85
+ "production-ready",
86
+ "enterprise"
59
87
  ],
60
88
  "author": "Arakiss",
61
89
  "license": "MIT",