create-better-fullstack 1.5.1 → 1.5.3

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.
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ import "./bts-config-BYD8mHt-.mjs";
3
+ import { i as setupLefthook, n as setupBiome, r as setupHusky, t as setupAddons } from "./addons-setup-Bll5VFJd.mjs";
4
+
5
+ export { setupAddons };
@@ -0,0 +1,311 @@
1
+ #!/usr/bin/env node
2
+ import fs from "fs-extra";
3
+ import path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { dependencyVersionMap } from "@better-fullstack/template-generator";
6
+ import * as JSONC from "jsonc-parser";
7
+
8
+ //#region src/utils/get-package-manager.ts
9
+ const getUserPkgManager = () => {
10
+ const userAgent = process.env.npm_config_user_agent;
11
+ if (userAgent?.startsWith("pnpm")) return "pnpm";
12
+ if (userAgent?.startsWith("bun")) return "bun";
13
+ return "npm";
14
+ };
15
+
16
+ //#endregion
17
+ //#region src/constants.ts
18
+ const __filename = fileURLToPath(import.meta.url);
19
+ const distPath = path.dirname(__filename);
20
+ const PKG_ROOT = path.join(distPath, "../");
21
+ const DEFAULT_CONFIG_BASE = {
22
+ projectName: "my-app",
23
+ relativePath: "my-app",
24
+ ecosystem: "typescript",
25
+ frontend: ["tanstack-router"],
26
+ database: "sqlite",
27
+ orm: "drizzle",
28
+ auth: "better-auth",
29
+ payments: "none",
30
+ email: "none",
31
+ fileUpload: "none",
32
+ effect: "none",
33
+ stateManagement: "none",
34
+ validation: "zod",
35
+ forms: "react-hook-form",
36
+ testing: "vitest",
37
+ ai: "none",
38
+ realtime: "none",
39
+ jobQueue: "none",
40
+ caching: "none",
41
+ search: "none",
42
+ fileStorage: "none",
43
+ animation: "none",
44
+ logging: "none",
45
+ observability: "none",
46
+ featureFlags: "none",
47
+ analytics: "none",
48
+ cms: "none",
49
+ addons: ["turborepo"],
50
+ examples: [],
51
+ git: true,
52
+ install: true,
53
+ versionChannel: "stable",
54
+ dbSetup: "none",
55
+ backend: "hono",
56
+ runtime: "bun",
57
+ api: "trpc",
58
+ webDeploy: "none",
59
+ serverDeploy: "none",
60
+ cssFramework: "tailwind",
61
+ uiLibrary: "shadcn-ui",
62
+ shadcnBase: "radix",
63
+ shadcnStyle: "nova",
64
+ shadcnIconLibrary: "lucide",
65
+ shadcnColorTheme: "neutral",
66
+ shadcnBaseColor: "neutral",
67
+ shadcnFont: "inter",
68
+ shadcnRadius: "default",
69
+ rustWebFramework: "none",
70
+ rustFrontend: "none",
71
+ rustOrm: "none",
72
+ rustApi: "none",
73
+ rustCli: "none",
74
+ rustLibraries: [],
75
+ rustLogging: "tracing",
76
+ pythonWebFramework: "fastapi",
77
+ pythonOrm: "sqlalchemy",
78
+ pythonValidation: "pydantic",
79
+ pythonAi: [],
80
+ pythonTaskQueue: "none",
81
+ pythonQuality: "ruff",
82
+ goWebFramework: "gin",
83
+ goOrm: "gorm",
84
+ goApi: "none",
85
+ goCli: "none",
86
+ goLogging: "zap",
87
+ aiDocs: ["claude-md"]
88
+ };
89
+ function getDefaultConfig() {
90
+ return {
91
+ ...DEFAULT_CONFIG_BASE,
92
+ projectDir: path.resolve(process.cwd(), DEFAULT_CONFIG_BASE.projectName),
93
+ packageManager: getUserPkgManager(),
94
+ frontend: [...DEFAULT_CONFIG_BASE.frontend],
95
+ addons: [...DEFAULT_CONFIG_BASE.addons],
96
+ examples: [...DEFAULT_CONFIG_BASE.examples],
97
+ rustLibraries: [...DEFAULT_CONFIG_BASE.rustLibraries],
98
+ pythonAi: [...DEFAULT_CONFIG_BASE.pythonAi],
99
+ aiDocs: [...DEFAULT_CONFIG_BASE.aiDocs]
100
+ };
101
+ }
102
+ const DEFAULT_CONFIG = getDefaultConfig();
103
+ /**
104
+ * Default UI library for each frontend framework
105
+ * Falls back based on what's compatible
106
+ */
107
+ const DEFAULT_UI_LIBRARY_BY_FRONTEND = {
108
+ "tanstack-router": "shadcn-ui",
109
+ "react-router": "shadcn-ui",
110
+ "react-vite": "shadcn-ui",
111
+ "tanstack-start": "shadcn-ui",
112
+ next: "shadcn-ui",
113
+ nuxt: "daisyui",
114
+ svelte: "daisyui",
115
+ solid: "daisyui",
116
+ "solid-start": "daisyui",
117
+ astro: "daisyui",
118
+ qwik: "daisyui",
119
+ angular: "daisyui",
120
+ redwood: "daisyui",
121
+ fresh: "daisyui",
122
+ "native-bare": "none",
123
+ "native-uniwind": "none",
124
+ "native-unistyles": "none",
125
+ none: "none"
126
+ };
127
+
128
+ //#endregion
129
+ //#region src/utils/get-latest-cli-version.ts
130
+ const getLatestCLIVersion = () => {
131
+ const packageJsonPath = path.join(PKG_ROOT, "package.json");
132
+ return fs.readJSONSync(packageJsonPath).version ?? "1.0.0";
133
+ };
134
+
135
+ //#endregion
136
+ //#region src/utils/bts-config.ts
137
+ const BTS_CONFIG_FILE = "bts.jsonc";
138
+ async function writeBtsConfig(projectConfig) {
139
+ const btsConfig = {
140
+ version: getLatestCLIVersion(),
141
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
142
+ ecosystem: projectConfig.ecosystem,
143
+ database: projectConfig.database,
144
+ orm: projectConfig.orm,
145
+ backend: projectConfig.backend,
146
+ runtime: projectConfig.runtime,
147
+ frontend: projectConfig.frontend,
148
+ addons: projectConfig.addons,
149
+ examples: projectConfig.examples,
150
+ auth: projectConfig.auth,
151
+ payments: projectConfig.payments,
152
+ email: projectConfig.email,
153
+ fileUpload: projectConfig.fileUpload,
154
+ effect: projectConfig.effect,
155
+ ai: projectConfig.ai,
156
+ stateManagement: projectConfig.stateManagement,
157
+ validation: projectConfig.validation,
158
+ forms: projectConfig.forms,
159
+ testing: projectConfig.testing,
160
+ packageManager: projectConfig.packageManager,
161
+ versionChannel: projectConfig.versionChannel,
162
+ dbSetup: projectConfig.dbSetup,
163
+ api: projectConfig.api,
164
+ webDeploy: projectConfig.webDeploy,
165
+ serverDeploy: projectConfig.serverDeploy,
166
+ cssFramework: projectConfig.cssFramework,
167
+ uiLibrary: projectConfig.uiLibrary,
168
+ realtime: projectConfig.realtime,
169
+ jobQueue: projectConfig.jobQueue,
170
+ animation: projectConfig.animation,
171
+ logging: projectConfig.logging,
172
+ observability: projectConfig.observability,
173
+ featureFlags: projectConfig.featureFlags,
174
+ analytics: projectConfig.analytics,
175
+ cms: projectConfig.cms,
176
+ caching: projectConfig.caching,
177
+ search: projectConfig.search,
178
+ fileStorage: projectConfig.fileStorage,
179
+ rustWebFramework: projectConfig.rustWebFramework,
180
+ rustFrontend: projectConfig.rustFrontend,
181
+ rustOrm: projectConfig.rustOrm,
182
+ rustApi: projectConfig.rustApi,
183
+ rustCli: projectConfig.rustCli,
184
+ rustLibraries: projectConfig.rustLibraries,
185
+ rustLogging: projectConfig.rustLogging,
186
+ pythonWebFramework: projectConfig.pythonWebFramework,
187
+ pythonOrm: projectConfig.pythonOrm,
188
+ pythonValidation: projectConfig.pythonValidation,
189
+ pythonAi: projectConfig.pythonAi,
190
+ pythonTaskQueue: projectConfig.pythonTaskQueue,
191
+ pythonQuality: projectConfig.pythonQuality,
192
+ goWebFramework: projectConfig.goWebFramework,
193
+ goOrm: projectConfig.goOrm,
194
+ goApi: projectConfig.goApi,
195
+ goCli: projectConfig.goCli,
196
+ goLogging: projectConfig.goLogging,
197
+ aiDocs: projectConfig.aiDocs
198
+ };
199
+ const baseContent = {
200
+ $schema: "https://better-fullstack-web.vercel.app/schema.json",
201
+ version: btsConfig.version,
202
+ createdAt: btsConfig.createdAt,
203
+ ecosystem: btsConfig.ecosystem,
204
+ database: btsConfig.database,
205
+ orm: btsConfig.orm,
206
+ backend: btsConfig.backend,
207
+ runtime: btsConfig.runtime,
208
+ frontend: btsConfig.frontend,
209
+ addons: btsConfig.addons,
210
+ examples: btsConfig.examples,
211
+ auth: btsConfig.auth,
212
+ payments: btsConfig.payments,
213
+ email: btsConfig.email,
214
+ fileUpload: btsConfig.fileUpload,
215
+ effect: btsConfig.effect,
216
+ ai: btsConfig.ai,
217
+ stateManagement: btsConfig.stateManagement,
218
+ validation: btsConfig.validation,
219
+ forms: btsConfig.forms,
220
+ testing: btsConfig.testing,
221
+ packageManager: btsConfig.packageManager,
222
+ versionChannel: btsConfig.versionChannel,
223
+ dbSetup: btsConfig.dbSetup,
224
+ api: btsConfig.api,
225
+ webDeploy: btsConfig.webDeploy,
226
+ serverDeploy: btsConfig.serverDeploy,
227
+ cssFramework: btsConfig.cssFramework,
228
+ uiLibrary: btsConfig.uiLibrary,
229
+ realtime: btsConfig.realtime,
230
+ jobQueue: btsConfig.jobQueue,
231
+ animation: btsConfig.animation,
232
+ logging: btsConfig.logging,
233
+ observability: btsConfig.observability,
234
+ featureFlags: btsConfig.featureFlags,
235
+ analytics: btsConfig.analytics,
236
+ cms: btsConfig.cms,
237
+ caching: btsConfig.caching,
238
+ search: btsConfig.search,
239
+ fileStorage: btsConfig.fileStorage,
240
+ rustWebFramework: btsConfig.rustWebFramework,
241
+ rustFrontend: btsConfig.rustFrontend,
242
+ rustOrm: btsConfig.rustOrm,
243
+ rustApi: btsConfig.rustApi,
244
+ rustCli: btsConfig.rustCli,
245
+ rustLibraries: btsConfig.rustLibraries,
246
+ rustLogging: btsConfig.rustLogging,
247
+ pythonWebFramework: btsConfig.pythonWebFramework,
248
+ pythonOrm: btsConfig.pythonOrm,
249
+ pythonValidation: btsConfig.pythonValidation,
250
+ pythonAi: btsConfig.pythonAi,
251
+ pythonTaskQueue: btsConfig.pythonTaskQueue,
252
+ pythonQuality: btsConfig.pythonQuality,
253
+ goWebFramework: btsConfig.goWebFramework,
254
+ goOrm: btsConfig.goOrm,
255
+ goApi: btsConfig.goApi,
256
+ goCli: btsConfig.goCli,
257
+ goLogging: btsConfig.goLogging,
258
+ aiDocs: btsConfig.aiDocs
259
+ };
260
+ let configContent = JSON.stringify(baseContent);
261
+ const formatResult = JSONC.format(configContent, void 0, {
262
+ tabSize: 2,
263
+ insertSpaces: true,
264
+ eol: "\n"
265
+ });
266
+ configContent = JSONC.applyEdits(configContent, formatResult);
267
+ const finalContent = `// Better Fullstack configuration file
268
+ // safe to delete
269
+
270
+ ${configContent}`;
271
+ const configPath = path.join(projectConfig.projectDir, BTS_CONFIG_FILE);
272
+ await fs.writeFile(configPath, finalContent, "utf-8");
273
+ }
274
+ async function readBtsConfig(projectDir) {
275
+ try {
276
+ const configPath = path.join(projectDir, BTS_CONFIG_FILE);
277
+ if (!await fs.pathExists(configPath)) return null;
278
+ const configContent = await fs.readFile(configPath, "utf-8");
279
+ const errors = [];
280
+ const config = JSONC.parse(configContent, errors, {
281
+ allowTrailingComma: true,
282
+ disallowComments: false
283
+ });
284
+ if (errors.length > 0) {
285
+ console.warn("Warning: Found errors parsing bts.jsonc:", errors);
286
+ return null;
287
+ }
288
+ return config;
289
+ } catch {
290
+ return null;
291
+ }
292
+ }
293
+ async function updateBtsConfig(projectDir, updates) {
294
+ try {
295
+ const configPath = path.join(projectDir, BTS_CONFIG_FILE);
296
+ if (!await fs.pathExists(configPath)) return;
297
+ let modifiedContent = await fs.readFile(configPath, "utf-8");
298
+ for (const [key, value] of Object.entries(updates)) {
299
+ const editResult = JSONC.modify(modifiedContent, [key], value, { formattingOptions: {
300
+ tabSize: 2,
301
+ insertSpaces: true,
302
+ eol: "\n"
303
+ } });
304
+ modifiedContent = JSONC.applyEdits(modifiedContent, editResult);
305
+ }
306
+ await fs.writeFile(configPath, modifiedContent, "utf-8");
307
+ } catch {}
308
+ }
309
+
310
+ //#endregion
311
+ export { DEFAULT_CONFIG as a, getDefaultConfig as c, getLatestCLIVersion as i, getUserPkgManager as l, updateBtsConfig as n, DEFAULT_UI_LIBRARY_BY_FRONTEND as o, writeBtsConfig as r, dependencyVersionMap as s, readBtsConfig as t };
package/dist/cli.mjs CHANGED
@@ -1,8 +1,7 @@
1
1
  #!/usr/bin/env node
2
- import { s as createBtsCli } from "./src-hfdQPH0o.mjs";
3
-
4
2
  //#region src/cli.ts
5
- createBtsCli().run();
3
+ if (process.argv[2] === "mcp" && process.argv.length === 3) import("./mcp-CRjipp-w.mjs").then((m) => m.startMcpServer());
4
+ else import("./index.mjs").then((m) => m.createBtsCli().run());
6
5
 
7
6
  //#endregion
8
7
  export { };
package/dist/index.d.mts CHANGED
@@ -14,6 +14,7 @@ interface AddResult {
14
14
  addedAddons: types_d_exports.Addons[];
15
15
  projectDir: string;
16
16
  error?: string;
17
+ setupWarnings?: string[];
17
18
  }
18
19
  //#endregion
19
20
  //#region src/index.d.ts
@@ -29,6 +30,7 @@ declare const router: {
29
30
  yes: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
30
31
  yolo: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
31
32
  verbose: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
33
+ dryRun: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
32
34
  ecosystem: z.ZodOptional<z.ZodEnum<{
33
35
  typescript: "typescript";
34
36
  rust: "rust";
@@ -206,6 +208,8 @@ declare const router: {
206
208
  none: "none";
207
209
  meilisearch: "meilisearch";
208
210
  typesense: "typesense";
211
+ elasticsearch: "elasticsearch";
212
+ algolia: "algolia";
209
213
  }>>;
210
214
  fileStorage: z.ZodOptional<z.ZodEnum<{
211
215
  none: "none";
@@ -470,10 +474,16 @@ declare const router: {
470
474
  "tokio-test": "tokio-test";
471
475
  mockall: "mockall";
472
476
  }>>>;
477
+ rustLogging: z.ZodOptional<z.ZodEnum<{
478
+ none: "none";
479
+ tracing: "tracing";
480
+ "env-logger": "env-logger";
481
+ }>>;
473
482
  pythonWebFramework: z.ZodOptional<z.ZodEnum<{
474
483
  none: "none";
475
484
  fastapi: "fastapi";
476
485
  django: "django";
486
+ flask: "flask";
477
487
  }>>;
478
488
  pythonOrm: z.ZodOptional<z.ZodEnum<{
479
489
  none: "none";
@@ -505,6 +515,7 @@ declare const router: {
505
515
  none: "none";
506
516
  gin: "gin";
507
517
  echo: "echo";
518
+ fiber: "fiber";
508
519
  }>>;
509
520
  goOrm: z.ZodOptional<z.ZodEnum<{
510
521
  none: "none";
@@ -573,7 +584,90 @@ declare const router: {
573
584
  analytics: "none" | "plausible" | "umami";
574
585
  cms: "none" | "payload" | "sanity" | "strapi" | "tinacms";
575
586
  caching: "none" | "upstash-redis";
576
- search: "none" | "meilisearch" | "typesense";
587
+ search: "none" | "meilisearch" | "typesense" | "elasticsearch" | "algolia";
588
+ fileStorage: "none" | "s3" | "r2";
589
+ rustWebFramework: "none" | "axum" | "actix-web";
590
+ rustFrontend: "none" | "leptos" | "dioxus";
591
+ rustOrm: "none" | "sea-orm" | "sqlx";
592
+ rustApi: "none" | "tonic" | "async-graphql";
593
+ rustCli: "none" | "clap" | "ratatui";
594
+ rustLibraries: ("none" | "serde" | "validator" | "jsonwebtoken" | "argon2" | "tokio-test" | "mockall")[];
595
+ rustLogging: "none" | "tracing" | "env-logger";
596
+ pythonWebFramework: "none" | "fastapi" | "django" | "flask";
597
+ pythonOrm: "none" | "sqlalchemy" | "sqlmodel";
598
+ pythonValidation: "none" | "pydantic";
599
+ pythonAi: ("none" | "langgraph" | "langchain" | "llamaindex" | "openai-sdk" | "anthropic-sdk" | "crewai")[];
600
+ pythonTaskQueue: "none" | "celery";
601
+ pythonQuality: "none" | "ruff";
602
+ goWebFramework: "none" | "gin" | "echo" | "fiber";
603
+ goOrm: "none" | "gorm" | "sqlc";
604
+ goApi: "none" | "grpc-go";
605
+ goCli: "none" | "cobra" | "bubbletea";
606
+ goLogging: "none" | "zap";
607
+ aiDocs: ("none" | "claude-md" | "agents-md" | "cursorrules")[];
608
+ astroIntegration?: "none" | "svelte" | "solid" | "react" | "vue" | undefined;
609
+ shadcnBase?: "radix" | "base" | undefined;
610
+ shadcnStyle?: "vega" | "nova" | "maia" | "lyra" | "mira" | undefined;
611
+ shadcnIconLibrary?: "lucide" | "tabler" | "hugeicons" | "phosphor" | "remixicon" | undefined;
612
+ shadcnColorTheme?: "neutral" | "stone" | "zinc" | "gray" | "amber" | "blue" | "cyan" | "emerald" | "fuchsia" | "green" | "indigo" | "lime" | "orange" | "pink" | "purple" | "red" | "rose" | "sky" | "teal" | "violet" | "yellow" | undefined;
613
+ shadcnBaseColor?: "neutral" | "stone" | "zinc" | "gray" | undefined;
614
+ shadcnFont?: "inter" | "geist" | "noto-sans" | "nunito-sans" | "figtree" | "roboto" | "raleway" | "dm-sans" | "public-sans" | "outfit" | "jetbrains-mono" | "geist-mono" | undefined;
615
+ shadcnRadius?: "default" | "none" | "small" | "medium" | "large" | undefined;
616
+ };
617
+ reproducibleCommand: string;
618
+ timeScaffolded: string;
619
+ elapsedTimeMs: number;
620
+ projectDirectory: string;
621
+ relativePath: string;
622
+ dryRun: boolean;
623
+ fileCount: number;
624
+ directoryCount: number;
625
+ files: string[];
626
+ error?: undefined;
627
+ } | {
628
+ success: boolean;
629
+ projectConfig: {
630
+ projectName: string;
631
+ projectDir: string;
632
+ relativePath: string;
633
+ ecosystem: "typescript" | "rust" | "python" | "go";
634
+ database: "none" | "sqlite" | "postgres" | "mysql" | "mongodb" | "edgedb" | "redis";
635
+ orm: "none" | "drizzle" | "prisma" | "mongoose" | "typeorm" | "kysely" | "mikroorm" | "sequelize";
636
+ backend: "none" | "hono" | "express" | "fastify" | "elysia" | "fets" | "nestjs" | "adonisjs" | "nitro" | "encore" | "convex" | "self";
637
+ runtime: "none" | "bun" | "node" | "workers";
638
+ 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")[];
639
+ 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")[];
640
+ examples: ("ai" | "none" | "chat-sdk" | "tanstack-showcase")[];
641
+ auth: "none" | "better-auth" | "go-better-auth" | "clerk" | "nextauth" | "stack-auth" | "supabase-auth" | "auth0";
642
+ payments: "none" | "polar" | "stripe" | "lemon-squeezy" | "paddle" | "dodo";
643
+ git: boolean;
644
+ packageManager: "bun" | "npm" | "pnpm" | "yarn";
645
+ versionChannel: "stable" | "latest" | "beta";
646
+ install: boolean;
647
+ dbSetup: "none" | "turso" | "neon" | "prisma-postgres" | "planetscale" | "mongodb-atlas" | "supabase" | "upstash" | "d1" | "docker";
648
+ api: "none" | "trpc" | "orpc" | "ts-rest" | "garph";
649
+ webDeploy: "none" | "docker" | "cloudflare" | "fly" | "railway" | "sst";
650
+ serverDeploy: "none" | "docker" | "cloudflare" | "fly" | "railway" | "sst";
651
+ ai: "none" | "langgraph" | "langchain" | "llamaindex" | "vercel-ai" | "mastra" | "voltagent" | "openai-agents" | "google-adk" | "modelfusion" | "tanstack-ai";
652
+ effect: "effect" | "none" | "effect-full";
653
+ stateManagement: "none" | "zustand" | "jotai" | "nanostores" | "redux-toolkit" | "mobx" | "xstate" | "valtio" | "tanstack-store" | "legend-state";
654
+ forms: "none" | "tanstack-form" | "react-hook-form" | "formik" | "final-form" | "conform" | "modular-forms";
655
+ testing: "none" | "vitest" | "playwright" | "vitest-playwright" | "jest" | "cypress";
656
+ email: "none" | "react-email" | "resend" | "nodemailer" | "postmark" | "sendgrid" | "aws-ses" | "mailgun" | "plunk";
657
+ cssFramework: "none" | "tailwind" | "scss" | "less" | "postcss-only";
658
+ uiLibrary: "none" | "shadcn-ui" | "daisyui" | "radix-ui" | "headless-ui" | "park-ui" | "chakra-ui" | "nextui" | "mantine" | "base-ui" | "ark-ui" | "react-aria";
659
+ validation: "none" | "zod" | "valibot" | "arktype" | "typebox" | "typia" | "runtypes" | "effect-schema";
660
+ realtime: "none" | "socket-io" | "partykit" | "ably" | "pusher" | "liveblocks" | "yjs";
661
+ jobQueue: "none" | "bullmq" | "trigger-dev" | "inngest" | "temporal";
662
+ animation: "none" | "framer-motion" | "gsap" | "react-spring" | "auto-animate" | "lottie";
663
+ fileUpload: "none" | "uploadthing" | "filepond" | "uppy";
664
+ logging: "none" | "pino" | "winston";
665
+ observability: "none" | "opentelemetry" | "sentry" | "grafana";
666
+ featureFlags: "none" | "growthbook" | "posthog";
667
+ analytics: "none" | "plausible" | "umami";
668
+ cms: "none" | "payload" | "sanity" | "strapi" | "tinacms";
669
+ caching: "none" | "upstash-redis";
670
+ search: "none" | "meilisearch" | "typesense" | "elasticsearch" | "algolia";
577
671
  fileStorage: "none" | "s3" | "r2";
578
672
  rustWebFramework: "none" | "axum" | "actix-web";
579
673
  rustFrontend: "none" | "leptos" | "dioxus";
@@ -581,13 +675,14 @@ declare const router: {
581
675
  rustApi: "none" | "tonic" | "async-graphql";
582
676
  rustCli: "none" | "clap" | "ratatui";
583
677
  rustLibraries: ("none" | "serde" | "validator" | "jsonwebtoken" | "argon2" | "tokio-test" | "mockall")[];
584
- pythonWebFramework: "none" | "fastapi" | "django";
678
+ rustLogging: "none" | "tracing" | "env-logger";
679
+ pythonWebFramework: "none" | "fastapi" | "django" | "flask";
585
680
  pythonOrm: "none" | "sqlalchemy" | "sqlmodel";
586
681
  pythonValidation: "none" | "pydantic";
587
682
  pythonAi: ("none" | "langgraph" | "langchain" | "llamaindex" | "openai-sdk" | "anthropic-sdk" | "crewai")[];
588
683
  pythonTaskQueue: "none" | "celery";
589
684
  pythonQuality: "none" | "ruff";
590
- goWebFramework: "none" | "gin" | "echo";
685
+ goWebFramework: "none" | "gin" | "echo" | "fiber";
591
686
  goOrm: "none" | "gorm" | "sqlc";
592
687
  goApi: "none" | "grpc-go";
593
688
  goCli: "none" | "cobra" | "bubbletea";
@@ -607,6 +702,10 @@ declare const router: {
607
702
  elapsedTimeMs: number;
608
703
  projectDirectory: string;
609
704
  relativePath: string;
705
+ dryRun?: undefined;
706
+ fileCount?: undefined;
707
+ directoryCount?: undefined;
708
+ files?: undefined;
610
709
  error?: undefined;
611
710
  } | {
612
711
  success: boolean;
@@ -617,6 +716,10 @@ declare const router: {
617
716
  elapsedTimeMs: number;
618
717
  projectDirectory: string;
619
718
  relativePath: string;
719
+ dryRun?: undefined;
720
+ fileCount?: undefined;
721
+ directoryCount?: undefined;
722
+ files?: undefined;
620
723
  } | undefined, {
621
724
  success: boolean;
622
725
  projectConfig: {
@@ -660,7 +763,90 @@ declare const router: {
660
763
  analytics: "none" | "plausible" | "umami";
661
764
  cms: "none" | "payload" | "sanity" | "strapi" | "tinacms";
662
765
  caching: "none" | "upstash-redis";
663
- search: "none" | "meilisearch" | "typesense";
766
+ search: "none" | "meilisearch" | "typesense" | "elasticsearch" | "algolia";
767
+ fileStorage: "none" | "s3" | "r2";
768
+ rustWebFramework: "none" | "axum" | "actix-web";
769
+ rustFrontend: "none" | "leptos" | "dioxus";
770
+ rustOrm: "none" | "sea-orm" | "sqlx";
771
+ rustApi: "none" | "tonic" | "async-graphql";
772
+ rustCli: "none" | "clap" | "ratatui";
773
+ rustLibraries: ("none" | "serde" | "validator" | "jsonwebtoken" | "argon2" | "tokio-test" | "mockall")[];
774
+ rustLogging: "none" | "tracing" | "env-logger";
775
+ pythonWebFramework: "none" | "fastapi" | "django" | "flask";
776
+ pythonOrm: "none" | "sqlalchemy" | "sqlmodel";
777
+ pythonValidation: "none" | "pydantic";
778
+ pythonAi: ("none" | "langgraph" | "langchain" | "llamaindex" | "openai-sdk" | "anthropic-sdk" | "crewai")[];
779
+ pythonTaskQueue: "none" | "celery";
780
+ pythonQuality: "none" | "ruff";
781
+ goWebFramework: "none" | "gin" | "echo" | "fiber";
782
+ goOrm: "none" | "gorm" | "sqlc";
783
+ goApi: "none" | "grpc-go";
784
+ goCli: "none" | "cobra" | "bubbletea";
785
+ goLogging: "none" | "zap";
786
+ aiDocs: ("none" | "claude-md" | "agents-md" | "cursorrules")[];
787
+ astroIntegration?: "none" | "svelte" | "solid" | "react" | "vue" | undefined;
788
+ shadcnBase?: "radix" | "base" | undefined;
789
+ shadcnStyle?: "vega" | "nova" | "maia" | "lyra" | "mira" | undefined;
790
+ shadcnIconLibrary?: "lucide" | "tabler" | "hugeicons" | "phosphor" | "remixicon" | undefined;
791
+ shadcnColorTheme?: "neutral" | "stone" | "zinc" | "gray" | "amber" | "blue" | "cyan" | "emerald" | "fuchsia" | "green" | "indigo" | "lime" | "orange" | "pink" | "purple" | "red" | "rose" | "sky" | "teal" | "violet" | "yellow" | undefined;
792
+ shadcnBaseColor?: "neutral" | "stone" | "zinc" | "gray" | undefined;
793
+ shadcnFont?: "inter" | "geist" | "noto-sans" | "nunito-sans" | "figtree" | "roboto" | "raleway" | "dm-sans" | "public-sans" | "outfit" | "jetbrains-mono" | "geist-mono" | undefined;
794
+ shadcnRadius?: "default" | "none" | "small" | "medium" | "large" | undefined;
795
+ };
796
+ reproducibleCommand: string;
797
+ timeScaffolded: string;
798
+ elapsedTimeMs: number;
799
+ projectDirectory: string;
800
+ relativePath: string;
801
+ dryRun: boolean;
802
+ fileCount: number;
803
+ directoryCount: number;
804
+ files: string[];
805
+ error?: undefined;
806
+ } | {
807
+ success: boolean;
808
+ projectConfig: {
809
+ projectName: string;
810
+ projectDir: string;
811
+ relativePath: string;
812
+ ecosystem: "typescript" | "rust" | "python" | "go";
813
+ database: "none" | "sqlite" | "postgres" | "mysql" | "mongodb" | "edgedb" | "redis";
814
+ orm: "none" | "drizzle" | "prisma" | "mongoose" | "typeorm" | "kysely" | "mikroorm" | "sequelize";
815
+ backend: "none" | "hono" | "express" | "fastify" | "elysia" | "fets" | "nestjs" | "adonisjs" | "nitro" | "encore" | "convex" | "self";
816
+ runtime: "none" | "bun" | "node" | "workers";
817
+ 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")[];
818
+ 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")[];
819
+ examples: ("ai" | "none" | "chat-sdk" | "tanstack-showcase")[];
820
+ auth: "none" | "better-auth" | "go-better-auth" | "clerk" | "nextauth" | "stack-auth" | "supabase-auth" | "auth0";
821
+ payments: "none" | "polar" | "stripe" | "lemon-squeezy" | "paddle" | "dodo";
822
+ git: boolean;
823
+ packageManager: "bun" | "npm" | "pnpm" | "yarn";
824
+ versionChannel: "stable" | "latest" | "beta";
825
+ install: boolean;
826
+ dbSetup: "none" | "turso" | "neon" | "prisma-postgres" | "planetscale" | "mongodb-atlas" | "supabase" | "upstash" | "d1" | "docker";
827
+ api: "none" | "trpc" | "orpc" | "ts-rest" | "garph";
828
+ webDeploy: "none" | "docker" | "cloudflare" | "fly" | "railway" | "sst";
829
+ serverDeploy: "none" | "docker" | "cloudflare" | "fly" | "railway" | "sst";
830
+ ai: "none" | "langgraph" | "langchain" | "llamaindex" | "vercel-ai" | "mastra" | "voltagent" | "openai-agents" | "google-adk" | "modelfusion" | "tanstack-ai";
831
+ effect: "effect" | "none" | "effect-full";
832
+ stateManagement: "none" | "zustand" | "jotai" | "nanostores" | "redux-toolkit" | "mobx" | "xstate" | "valtio" | "tanstack-store" | "legend-state";
833
+ forms: "none" | "tanstack-form" | "react-hook-form" | "formik" | "final-form" | "conform" | "modular-forms";
834
+ testing: "none" | "vitest" | "playwright" | "vitest-playwright" | "jest" | "cypress";
835
+ email: "none" | "react-email" | "resend" | "nodemailer" | "postmark" | "sendgrid" | "aws-ses" | "mailgun" | "plunk";
836
+ cssFramework: "none" | "tailwind" | "scss" | "less" | "postcss-only";
837
+ uiLibrary: "none" | "shadcn-ui" | "daisyui" | "radix-ui" | "headless-ui" | "park-ui" | "chakra-ui" | "nextui" | "mantine" | "base-ui" | "ark-ui" | "react-aria";
838
+ validation: "none" | "zod" | "valibot" | "arktype" | "typebox" | "typia" | "runtypes" | "effect-schema";
839
+ realtime: "none" | "socket-io" | "partykit" | "ably" | "pusher" | "liveblocks" | "yjs";
840
+ jobQueue: "none" | "bullmq" | "trigger-dev" | "inngest" | "temporal";
841
+ animation: "none" | "framer-motion" | "gsap" | "react-spring" | "auto-animate" | "lottie";
842
+ fileUpload: "none" | "uploadthing" | "filepond" | "uppy";
843
+ logging: "none" | "pino" | "winston";
844
+ observability: "none" | "opentelemetry" | "sentry" | "grafana";
845
+ featureFlags: "none" | "growthbook" | "posthog";
846
+ analytics: "none" | "plausible" | "umami";
847
+ cms: "none" | "payload" | "sanity" | "strapi" | "tinacms";
848
+ caching: "none" | "upstash-redis";
849
+ search: "none" | "meilisearch" | "typesense" | "elasticsearch" | "algolia";
664
850
  fileStorage: "none" | "s3" | "r2";
665
851
  rustWebFramework: "none" | "axum" | "actix-web";
666
852
  rustFrontend: "none" | "leptos" | "dioxus";
@@ -668,13 +854,14 @@ declare const router: {
668
854
  rustApi: "none" | "tonic" | "async-graphql";
669
855
  rustCli: "none" | "clap" | "ratatui";
670
856
  rustLibraries: ("none" | "serde" | "validator" | "jsonwebtoken" | "argon2" | "tokio-test" | "mockall")[];
671
- pythonWebFramework: "none" | "fastapi" | "django";
857
+ rustLogging: "none" | "tracing" | "env-logger";
858
+ pythonWebFramework: "none" | "fastapi" | "django" | "flask";
672
859
  pythonOrm: "none" | "sqlalchemy" | "sqlmodel";
673
860
  pythonValidation: "none" | "pydantic";
674
861
  pythonAi: ("none" | "langgraph" | "langchain" | "llamaindex" | "openai-sdk" | "anthropic-sdk" | "crewai")[];
675
862
  pythonTaskQueue: "none" | "celery";
676
863
  pythonQuality: "none" | "ruff";
677
- goWebFramework: "none" | "gin" | "echo";
864
+ goWebFramework: "none" | "gin" | "echo" | "fiber";
678
865
  goOrm: "none" | "gorm" | "sqlc";
679
866
  goApi: "none" | "grpc-go";
680
867
  goCli: "none" | "cobra" | "bubbletea";
@@ -694,6 +881,10 @@ declare const router: {
694
881
  elapsedTimeMs: number;
695
882
  projectDirectory: string;
696
883
  relativePath: string;
884
+ dryRun?: undefined;
885
+ fileCount?: undefined;
886
+ directoryCount?: undefined;
887
+ files?: undefined;
697
888
  error?: undefined;
698
889
  } | {
699
890
  success: boolean;
@@ -704,6 +895,10 @@ declare const router: {
704
895
  elapsedTimeMs: number;
705
896
  projectDirectory: string;
706
897
  relativePath: string;
898
+ dryRun?: undefined;
899
+ fileCount?: undefined;
900
+ directoryCount?: undefined;
901
+ files?: undefined;
707
902
  } | undefined>, _orpc_server0.MergedErrorMap<Record<never, never>, Record<never, never>>, Record<never, never>>;
708
903
  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>>;
709
904
  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>>;
@@ -771,6 +966,7 @@ declare const router: {
771
966
  ecosystem: z.ZodOptional<z.ZodString>;
772
967
  "list-ecosystems": z.ZodDefault<z.ZodBoolean>;
773
968
  }, z.core.$strip>, _orpc_server0.Schema<void, void>, _orpc_server0.MergedErrorMap<Record<never, never>, Record<never, never>>, Record<never, never>>;
969
+ mcp: _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>>;
774
970
  };
775
971
  declare function createBtsCli(): trpc_cli0.TrpcCli;
776
972
  /**
@@ -873,10 +1069,11 @@ type RustApi = import__better_fullstack_types.RustApi;
873
1069
  type RustCli = import__better_fullstack_types.RustCli;
874
1070
  type RustFrontend = import__better_fullstack_types.RustFrontend;
875
1071
  type RustLibraries = import__better_fullstack_types.RustLibraries;
1072
+ type RustLogging = import__better_fullstack_types.RustLogging;
876
1073
  type RustOrm = import__better_fullstack_types.RustOrm;
877
1074
  type RustWebFramework = import__better_fullstack_types.RustWebFramework;
878
1075
  type ServerDeploy = import__better_fullstack_types.ServerDeploy;
879
1076
  type Template = import__better_fullstack_types.Template;
880
1077
  type UILibrary = import__better_fullstack_types.UILibrary;
881
1078
  type WebDeploy = import__better_fullstack_types.WebDeploy;
882
- export { type API, type AddInput, type AddResult, type Addons, type AiDocs, type Analytics, type Animation, type Auth, type Backend, type BetterTStackConfig, type CMS, type CSSFramework, type Caching, type CreateInput, type Database, type DatabaseSetup, type DirectoryConflict, EMBEDDED_TEMPLATES, type Ecosystem, type Effect, type Examples, type Frontend, type GeneratorOptions, type GeneratorResult, type GoApi, type GoCli, type GoLogging, type GoOrm, type GoWebFramework, type InitResult, type Logging, type ORM, type PackageManager, type Payments, type PythonAi, type PythonOrm, type PythonQuality, type PythonTaskQueue, type PythonValidation, type PythonWebFramework, type Realtime, type Runtime, type RustApi, type RustCli, type RustFrontend, type RustLibraries, type RustOrm, type RustWebFramework, type ServerDeploy, TEMPLATE_COUNT, type Template, type UILibrary, type VirtualDirectory, type VirtualFile, VirtualFileSystem, type VirtualFileTree, type VirtualNode, type WebDeploy, add, builder, create, createBtsCli, createVirtual, docs, generateVirtualProject, history, router, sponsors };
1079
+ export { type API, type AddInput, type AddResult, type Addons, type AiDocs, type Analytics, type Animation, type Auth, type Backend, type BetterTStackConfig, type CMS, type CSSFramework, type Caching, type CreateInput, type Database, type DatabaseSetup, type DirectoryConflict, EMBEDDED_TEMPLATES, type Ecosystem, type Effect, type Examples, type Frontend, type GeneratorOptions, type GeneratorResult, type GoApi, type GoCli, type GoLogging, type GoOrm, type GoWebFramework, type InitResult, type Logging, type ORM, type PackageManager, type Payments, type PythonAi, type PythonOrm, type PythonQuality, type PythonTaskQueue, type PythonValidation, type PythonWebFramework, type Realtime, type Runtime, type RustApi, type RustCli, type RustFrontend, type RustLibraries, type RustLogging, type RustOrm, type RustWebFramework, type ServerDeploy, TEMPLATE_COUNT, type Template, type UILibrary, type VirtualDirectory, type VirtualFile, VirtualFileSystem, type VirtualFileTree, type VirtualNode, type WebDeploy, add, builder, create, createBtsCli, createVirtual, docs, generateVirtualProject, history, router, sponsors };