create-better-t-stack
Version:
A modern CLI tool for scaffolding end-to-end type-safe TypeScript projects with best practices and customizable configurations
351 lines (350 loc) • 13.1 kB
text/typescript
import * as _orpc_server0 from "@orpc/server";
import * as trpc_cli0 from "trpc-cli";
import z from "zod";
import { API, AddInput, Addons, Backend, BetterTStackConfig, CreateInput, Database, DatabaseSetup, DirectoryConflict, Examples, Frontend, InitResult, ORM, PackageManager, ProjectConfig, Runtime, ServerDeploy, Template, WebDeploy } from "@better-t-stack/types";
//#region src/index.d.ts
declare const router: {
init: _orpc_server0.Procedure<_orpc_server0.MergedInitialContext<Record<never, never>, Record<never, never>, Record<never, never>>, Record<never, never>, z.ZodTuple<[z.ZodOptional<z.ZodString>, z.ZodObject<{
template: z.ZodOptional<z.ZodEnum<{
none: "none";
mern: "mern";
pern: "pern";
t3: "t3";
uniwind: "uniwind";
}>>;
yes: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
yolo: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
verbose: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
database: z.ZodOptional<z.ZodEnum<{
none: "none";
sqlite: "sqlite";
postgres: "postgres";
mysql: "mysql";
mongodb: "mongodb";
}>>;
orm: z.ZodOptional<z.ZodEnum<{
none: "none";
drizzle: "drizzle";
prisma: "prisma";
mongoose: "mongoose";
}>>;
auth: z.ZodOptional<z.ZodEnum<{
none: "none";
"better-auth": "better-auth";
clerk: "clerk";
}>>;
payments: z.ZodOptional<z.ZodEnum<{
none: "none";
polar: "polar";
}>>;
frontend: z.ZodOptional<z.ZodArray<z.ZodEnum<{
none: "none";
"tanstack-router": "tanstack-router";
"react-router": "react-router";
"tanstack-start": "tanstack-start";
next: "next";
nuxt: "nuxt";
"native-bare": "native-bare";
"native-uniwind": "native-uniwind";
"native-unistyles": "native-unistyles";
svelte: "svelte";
solid: "solid";
}>>>;
addons: z.ZodOptional<z.ZodArray<z.ZodEnum<{
none: "none";
pwa: "pwa";
tauri: "tauri";
starlight: "starlight";
biome: "biome";
husky: "husky";
ruler: "ruler";
turborepo: "turborepo";
fumadocs: "fumadocs";
ultracite: "ultracite";
oxlint: "oxlint";
opentui: "opentui";
wxt: "wxt";
}>>>;
examples: z.ZodOptional<z.ZodArray<z.ZodEnum<{
none: "none";
todo: "todo";
ai: "ai";
}>>>;
git: z.ZodOptional<z.ZodBoolean>;
packageManager: z.ZodOptional<z.ZodEnum<{
bun: "bun";
npm: "npm";
pnpm: "pnpm";
}>>;
install: z.ZodOptional<z.ZodBoolean>;
dbSetup: z.ZodOptional<z.ZodEnum<{
none: "none";
turso: "turso";
neon: "neon";
"prisma-postgres": "prisma-postgres";
planetscale: "planetscale";
"mongodb-atlas": "mongodb-atlas";
supabase: "supabase";
d1: "d1";
docker: "docker";
}>>;
backend: z.ZodOptional<z.ZodEnum<{
none: "none";
hono: "hono";
express: "express";
fastify: "fastify";
elysia: "elysia";
convex: "convex";
self: "self";
}>>;
runtime: z.ZodOptional<z.ZodEnum<{
none: "none";
bun: "bun";
node: "node";
workers: "workers";
}>>;
api: z.ZodOptional<z.ZodEnum<{
none: "none";
trpc: "trpc";
orpc: "orpc";
}>>;
webDeploy: z.ZodOptional<z.ZodEnum<{
none: "none";
alchemy: "alchemy";
}>>;
serverDeploy: z.ZodOptional<z.ZodEnum<{
none: "none";
alchemy: "alchemy";
}>>;
directoryConflict: z.ZodOptional<z.ZodEnum<{
merge: "merge";
overwrite: "overwrite";
increment: "increment";
error: "error";
}>>;
renderTitle: z.ZodOptional<z.ZodBoolean>;
disableAnalytics: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
manualDb: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
}, z.core.$strip>], null>, _orpc_server0.Schema<{
success: boolean;
projectConfig: {
projectName: string;
projectDir: string;
relativePath: string;
database: "none";
orm: "none";
backend: "none";
runtime: "none";
frontend: never[];
addons: never[];
examples: never[];
auth: "none";
payments: "none";
git: false;
packageManager: "npm";
install: false;
dbSetup: "none";
api: "none";
webDeploy: "none";
serverDeploy: "none";
};
reproducibleCommand: string;
timeScaffolded: string;
elapsedTimeMs: number;
projectDirectory: string;
relativePath: string;
error: string;
} | {
success: boolean;
projectConfig: {
projectName: string;
projectDir: string;
relativePath: string;
database: "none" | "sqlite" | "postgres" | "mysql" | "mongodb";
orm: "none" | "drizzle" | "prisma" | "mongoose";
backend: "none" | "hono" | "express" | "fastify" | "elysia" | "convex" | "self";
runtime: "none" | "bun" | "node" | "workers";
frontend: ("none" | "tanstack-router" | "react-router" | "tanstack-start" | "next" | "nuxt" | "native-bare" | "native-uniwind" | "native-unistyles" | "svelte" | "solid")[];
addons: ("none" | "pwa" | "tauri" | "starlight" | "biome" | "husky" | "ruler" | "turborepo" | "fumadocs" | "ultracite" | "oxlint" | "opentui" | "wxt")[];
examples: ("none" | "todo" | "ai")[];
auth: "none" | "better-auth" | "clerk";
payments: "none" | "polar";
git: boolean;
packageManager: "bun" | "npm" | "pnpm";
install: boolean;
dbSetup: "none" | "turso" | "neon" | "prisma-postgres" | "planetscale" | "mongodb-atlas" | "supabase" | "d1" | "docker";
api: "none" | "trpc" | "orpc";
webDeploy: "none" | "alchemy";
serverDeploy: "none" | "alchemy";
};
reproducibleCommand: string;
timeScaffolded: string;
elapsedTimeMs: number;
projectDirectory: string;
relativePath: string;
error?: undefined;
} | undefined, {
success: boolean;
projectConfig: {
projectName: string;
projectDir: string;
relativePath: string;
database: "none";
orm: "none";
backend: "none";
runtime: "none";
frontend: never[];
addons: never[];
examples: never[];
auth: "none";
payments: "none";
git: false;
packageManager: "npm";
install: false;
dbSetup: "none";
api: "none";
webDeploy: "none";
serverDeploy: "none";
};
reproducibleCommand: string;
timeScaffolded: string;
elapsedTimeMs: number;
projectDirectory: string;
relativePath: string;
error: string;
} | {
success: boolean;
projectConfig: {
projectName: string;
projectDir: string;
relativePath: string;
database: "none" | "sqlite" | "postgres" | "mysql" | "mongodb";
orm: "none" | "drizzle" | "prisma" | "mongoose";
backend: "none" | "hono" | "express" | "fastify" | "elysia" | "convex" | "self";
runtime: "none" | "bun" | "node" | "workers";
frontend: ("none" | "tanstack-router" | "react-router" | "tanstack-start" | "next" | "nuxt" | "native-bare" | "native-uniwind" | "native-unistyles" | "svelte" | "solid")[];
addons: ("none" | "pwa" | "tauri" | "starlight" | "biome" | "husky" | "ruler" | "turborepo" | "fumadocs" | "ultracite" | "oxlint" | "opentui" | "wxt")[];
examples: ("none" | "todo" | "ai")[];
auth: "none" | "better-auth" | "clerk";
payments: "none" | "polar";
git: boolean;
packageManager: "bun" | "npm" | "pnpm";
install: boolean;
dbSetup: "none" | "turso" | "neon" | "prisma-postgres" | "planetscale" | "mongodb-atlas" | "supabase" | "d1" | "docker";
api: "none" | "trpc" | "orpc";
webDeploy: "none" | "alchemy";
serverDeploy: "none" | "alchemy";
};
reproducibleCommand: string;
timeScaffolded: string;
elapsedTimeMs: number;
projectDirectory: string;
relativePath: string;
error?: undefined;
} | undefined>, _orpc_server0.MergedErrorMap<Record<never, never>, Record<never, never>>, Record<never, never>>;
add: _orpc_server0.Procedure<_orpc_server0.MergedInitialContext<Record<never, never>, Record<never, never>, Record<never, never>>, Record<never, never>, z.ZodTuple<[z.ZodObject<{
addons: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodEnum<{
none: "none";
pwa: "pwa";
tauri: "tauri";
starlight: "starlight";
biome: "biome";
husky: "husky";
ruler: "ruler";
turborepo: "turborepo";
fumadocs: "fumadocs";
ultracite: "ultracite";
oxlint: "oxlint";
opentui: "opentui";
wxt: "wxt";
}>>>>;
webDeploy: z.ZodOptional<z.ZodEnum<{
none: "none";
alchemy: "alchemy";
}>>;
serverDeploy: z.ZodOptional<z.ZodEnum<{
none: "none";
alchemy: "alchemy";
}>>;
projectDir: z.ZodOptional<z.ZodString>;
install: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
packageManager: z.ZodOptional<z.ZodEnum<{
bun: "bun";
npm: "npm";
pnpm: "pnpm";
}>>;
}, z.core.$strip>], null>, _orpc_server0.Schema<void, void>, _orpc_server0.MergedErrorMap<Record<never, never>, Record<never, never>>, Record<never, never>>;
sponsors: _orpc_server0.Procedure<_orpc_server0.MergedInitialContext<Record<never, never>, Record<never, never>, Record<never, never>>, Record<never, never>, _orpc_server0.Schema<unknown, unknown>, _orpc_server0.Schema<void, void>, _orpc_server0.MergedErrorMap<Record<never, never>, Record<never, never>>, Record<never, never>>;
docs: _orpc_server0.Procedure<_orpc_server0.MergedInitialContext<Record<never, never>, Record<never, never>, Record<never, never>>, Record<never, never>, _orpc_server0.Schema<unknown, unknown>, _orpc_server0.Schema<void, void>, _orpc_server0.MergedErrorMap<Record<never, never>, Record<never, never>>, Record<never, never>>;
builder: _orpc_server0.Procedure<_orpc_server0.MergedInitialContext<Record<never, never>, Record<never, never>, Record<never, never>>, Record<never, never>, _orpc_server0.Schema<unknown, unknown>, _orpc_server0.Schema<void, void>, _orpc_server0.MergedErrorMap<Record<never, never>, Record<never, never>>, Record<never, never>>;
};
declare function createBtsCli(): trpc_cli0.TrpcCli;
/**
* Initialize a new Better-T-Stack project
*
* @example CLI usage:
* ```bash
* npx create-better-t-stack my-app --yes
* ```
*
* @example Programmatic usage (always returns structured data):
* ```typescript
* import { init } from "create-better-t-stack";
*
* const result = await init("my-app", {
* yes: true,
* frontend: ["tanstack-router"],
* backend: "hono",
* database: "sqlite",
* orm: "drizzle",
* auth: "better-auth",
* addons: ["biome", "turborepo"],
* packageManager: "bun",
* install: false,
* directoryConflict: "increment", // auto-handle conflicts
* disableAnalytics: true, // disable analytics
* });
*
* if (result.success) {
* console.log(`Project created at: ${result.projectDirectory}`);
* console.log(`Reproducible command: ${result.reproducibleCommand}`);
* console.log(`Time taken: ${result.elapsedTimeMs}ms`);
* }
* ```
*/
declare function init(projectName?: string, options?: CreateInput): Promise<{
success: boolean;
projectConfig: {
projectName: string;
projectDir: string;
relativePath: string;
database: "none" | "sqlite" | "postgres" | "mysql" | "mongodb";
orm: "none" | "drizzle" | "prisma" | "mongoose";
backend: "none" | "hono" | "express" | "fastify" | "elysia" | "convex" | "self";
runtime: "none" | "bun" | "node" | "workers";
frontend: ("none" | "tanstack-router" | "react-router" | "tanstack-start" | "next" | "nuxt" | "native-bare" | "native-uniwind" | "native-unistyles" | "svelte" | "solid")[];
addons: ("none" | "pwa" | "tauri" | "starlight" | "biome" | "husky" | "ruler" | "turborepo" | "fumadocs" | "ultracite" | "oxlint" | "opentui" | "wxt")[];
examples: ("none" | "todo" | "ai")[];
auth: "none" | "better-auth" | "clerk";
payments: "none" | "polar";
git: boolean;
packageManager: "bun" | "npm" | "pnpm";
install: boolean;
dbSetup: "none" | "turso" | "neon" | "prisma-postgres" | "planetscale" | "mongodb-atlas" | "supabase" | "d1" | "docker";
api: "none" | "trpc" | "orpc";
webDeploy: "none" | "alchemy";
serverDeploy: "none" | "alchemy";
};
reproducibleCommand: string;
timeScaffolded: string;
elapsedTimeMs: number;
projectDirectory: string;
relativePath: string;
error?: string | undefined;
}>;
declare function sponsors(): Promise<void>;
declare function docs(): Promise<void>;
declare function builder(): Promise<void>;
//#endregion
export { type API, type AddInput, type Addons, type Backend, type BetterTStackConfig, type CreateInput, type Database, type DatabaseSetup, type DirectoryConflict, type Examples, type Frontend, type InitResult, type ORM, type PackageManager, type ProjectConfig, type Runtime, type ServerDeploy, type Template, type WebDeploy, builder, createBtsCli, docs, init, router, sponsors };