UNPKG

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
#!/usr/bin/env node 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 };