create-better-fullstack 2.1.0 → 2.1.2

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.
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
- import { a as updateBtsConfig, r as readBtsConfig, u as getDefaultConfig } from "./bts-config-InNcw1aJ.mjs";
2
+ import { c as isSilent, g as updateBtsConfig, l as runWithContextAsync, m as readBtsConfig, n as UserCancelledError, t as CLIError, x as getDefaultConfig } from "./errors-D9yiiGVq.mjs";
3
3
  import { t as renderTitle } from "./render-title-zvyKC1ej.mjs";
4
- import { c as isSilent, l as runWithContextAsync, n as UserCancelledError, t as CLIError } from "./errors-ns_o2OKg.mjs";
5
- import { t as setupAddons } from "./addons-setup-uSvqHagW.mjs";
6
- import { c as applyDependencyVersionChannel, t as installDependencies, u as getAddonsToAdd } from "./install-dependencies-CDjTNvIV.mjs";
4
+ import { t as setupAddons } from "./addons-setup-C_xrNtkL.mjs";
5
+ import "./compatibility-rules-D7zYNVjC.mjs";
6
+ import { c as applyDependencyVersionChannel, t as installDependencies, u as getAddonsToAdd } from "./install-dependencies-DDGF-zDG.mjs";
7
7
  import { intro, log, outro } from "@clack/prompts";
8
8
  import pc from "picocolors";
9
9
  import fs from "fs-extra";
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ import "./errors-D9yiiGVq.mjs";
3
+ import { t as setupAddons } from "./addons-setup-C_xrNtkL.mjs";
4
+
5
+ export { setupAddons };
@@ -1,6 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { r as readBtsConfig } from "./bts-config-InNcw1aJ.mjs";
3
- import { c as isSilent, r as exitCancelled } from "./errors-ns_o2OKg.mjs";
2
+ import { c as isSilent, m as readBtsConfig, r as exitCancelled } from "./errors-D9yiiGVq.mjs";
4
3
  import { autocompleteMultiselect, group, isCancel, log, multiselect, select, spinner } from "@clack/prompts";
5
4
  import pc from "picocolors";
6
5
  import fs from "fs-extra";
package/dist/cli.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  //#region src/cli.ts
3
- if (process.argv[2] === "mcp" && process.argv.length === 3) import("./mcp-BaLHDRdC.mjs").then((m) => m.startMcpServer());
4
- else import("./run-DYWSKowD.mjs").then((m) => m.createBtsCli().run());
3
+ if (process.argv[2] === "mcp" && process.argv.length === 3) import("./mcp-BXLhb7wW.mjs").then((m) => m.startMcpServer());
4
+ else import("./run-BmRKR2wG.mjs").then((m) => m.createBtsCli().run());
5
5
 
6
6
  //#endregion
7
7
  export { };
@@ -0,0 +1,372 @@
1
+ #!/usr/bin/env node
2
+ import { c as isSilent, i as exitWithError, t as CLIError } from "./errors-D9yiiGVq.mjs";
3
+ import pc from "picocolors";
4
+ import { allowedApisForFrontends, getAIFrontendCompatibilityIssue, getApiFrontendCompatibilityIssue, getCompatibleAddons, getCompatibleCSSFrameworks, getCompatibleUILibraries, getUnsupportedWebDeployFrontend, hasDockerComposeCompatibleFrontend, hasWebStyling, isBackendUtilsCompatibleBackend, isExampleAIAllowed, isExampleChatSdkAllowed, isFrontendAllowedWithBackend, isWebFrontend, requiresChatSdkVercelAIForSelection, splitFrontends, validateAddonCompatibility } from "@better-fullstack/types";
5
+ import consola from "consola";
6
+
7
+ //#region src/utils/error-formatter.ts
8
+ function getCategoryTitle(category) {
9
+ return {
10
+ incompatibility: "Incompatible Options",
11
+ "invalid-selection": "Invalid Selection",
12
+ "missing-requirement": "Missing Requirement",
13
+ constraint: "Constraint Violation"
14
+ }[category];
15
+ }
16
+ function displayStructuredError(error) {
17
+ if (isSilent()) throw new CLIError(error.message);
18
+ const lines = [];
19
+ lines.push(pc.bold(pc.red(getCategoryTitle(error.category))));
20
+ lines.push("");
21
+ lines.push(error.message);
22
+ if (error.provided && Object.keys(error.provided).length > 0) {
23
+ lines.push("");
24
+ lines.push(pc.dim("You provided:"));
25
+ for (const [key, value] of Object.entries(error.provided)) {
26
+ const displayValue = Array.isArray(value) ? value.join(", ") : value;
27
+ lines.push(` ${pc.cyan("--" + key)} ${displayValue}`);
28
+ }
29
+ }
30
+ if (error.suggestions.length > 0) {
31
+ lines.push("");
32
+ lines.push(pc.dim("Suggestions:"));
33
+ for (const suggestion of error.suggestions) lines.push(` ${pc.green("•")} ${suggestion}`);
34
+ }
35
+ consola.box({
36
+ title: pc.red("Error"),
37
+ message: lines.join("\n"),
38
+ style: { borderColor: "red" }
39
+ });
40
+ process.exit(1);
41
+ }
42
+ function incompatibilityError(opts) {
43
+ return displayStructuredError({
44
+ category: "incompatibility",
45
+ ...opts
46
+ });
47
+ }
48
+ function invalidSelectionError(opts) {
49
+ return displayStructuredError({
50
+ category: "invalid-selection",
51
+ ...opts
52
+ });
53
+ }
54
+ function missingRequirementError(opts) {
55
+ return displayStructuredError({
56
+ category: "missing-requirement",
57
+ ...opts
58
+ });
59
+ }
60
+ function constraintError(opts) {
61
+ return displayStructuredError({
62
+ category: "constraint",
63
+ ...opts
64
+ });
65
+ }
66
+
67
+ //#endregion
68
+ //#region src/utils/compatibility-rules.ts
69
+ function isWebFrontend$1(value) {
70
+ return isWebFrontend(value);
71
+ }
72
+ function splitFrontends$1(values = []) {
73
+ return splitFrontends(values);
74
+ }
75
+ function ensureSingleWebAndNative(frontends) {
76
+ const { web, native } = splitFrontends$1(frontends);
77
+ if (web.length > 1) invalidSelectionError({
78
+ message: "Only one web framework can be selected per project.",
79
+ provided: { frontend: web },
80
+ suggestions: ["Keep one web framework and remove the others", "Use separate projects for multiple web frameworks"]
81
+ });
82
+ if (native.length > 1) invalidSelectionError({
83
+ message: "Only one native framework can be selected per project.",
84
+ provided: { frontend: native },
85
+ suggestions: ["Keep one native framework and remove the others", "Choose: native-bare, native-uniwind, or native-unistyles"]
86
+ });
87
+ }
88
+ const FULLSTACK_FRONTENDS = [
89
+ "next",
90
+ "vinext",
91
+ "tanstack-start",
92
+ "astro",
93
+ "nuxt",
94
+ "svelte",
95
+ "solid-start"
96
+ ];
97
+ function validateSelfBackendCompatibility(providedFlags, options, config) {
98
+ const backend = config.backend || options.backend;
99
+ const frontends = config.frontend || options.frontend || [];
100
+ if (backend === "self") {
101
+ const { web, native } = splitFrontends$1(frontends);
102
+ if (!(web.length === 1 && FULLSTACK_FRONTENDS.includes(web[0]))) exitWithError("Backend 'self' (fullstack) only supports Next.js, Vinext, TanStack Start, Astro, Nuxt, SvelteKit, or SolidStart frontends. Please use --frontend next, --frontend vinext, --frontend tanstack-start, --frontend astro, --frontend nuxt, --frontend svelte, or --frontend solid-start.");
103
+ if (native.length > 1) exitWithError("Cannot select multiple native frameworks. Choose only one of: native-bare, native-uniwind, native-unistyles");
104
+ }
105
+ const hasFullstackFrontend = frontends.some((f) => FULLSTACK_FRONTENDS.includes(f));
106
+ if (providedFlags.has("backend") && !hasFullstackFrontend && backend === "self") exitWithError("Backend 'self' (fullstack) only supports Next.js, Vinext, TanStack Start, Astro, Nuxt, SvelteKit, or SolidStart frontends. Please use --frontend next, --frontend vinext, --frontend tanstack-start, --frontend astro, --frontend nuxt, --frontend svelte, --frontend solid-start, or choose a different backend.");
107
+ }
108
+ const WORKERS_COMPATIBLE_BACKENDS = [
109
+ "hono",
110
+ "nitro",
111
+ "fets"
112
+ ];
113
+ function validateWorkersCompatibility(providedFlags, options, config) {
114
+ if (providedFlags.has("runtime") && options.runtime === "workers" && config.backend && !WORKERS_COMPATIBLE_BACKENDS.includes(config.backend)) incompatibilityError({
115
+ message: "In Better-Fullstack, Cloudflare Workers runtime is currently supported only with compatible backends (Hono, Nitro, or Fets).",
116
+ provided: {
117
+ runtime: "workers",
118
+ backend: config.backend
119
+ },
120
+ suggestions: [
121
+ "Use --backend hono",
122
+ "Use --backend nitro",
123
+ "Use --backend fets",
124
+ "Choose a different runtime (node, bun)"
125
+ ]
126
+ });
127
+ if (providedFlags.has("backend") && config.backend && !WORKERS_COMPATIBLE_BACKENDS.includes(config.backend) && config.runtime === "workers") incompatibilityError({
128
+ message: `In Better-Fullstack, backend '${config.backend}' is currently not available with Cloudflare Workers runtime.`,
129
+ provided: {
130
+ backend: config.backend,
131
+ runtime: "workers"
132
+ },
133
+ suggestions: ["Use --backend hono, --backend nitro, or --backend fets", "Choose a different runtime (node, bun)"]
134
+ });
135
+ if (providedFlags.has("runtime") && options.runtime === "workers" && config.database === "mongodb") incompatibilityError({
136
+ message: "In Better-Fullstack, Cloudflare Workers runtime is currently not available with MongoDB.",
137
+ provided: {
138
+ runtime: "workers",
139
+ database: "mongodb"
140
+ },
141
+ suggestions: ["Use a different database (postgres, sqlite, mysql)", "Choose a different runtime (node, bun)"]
142
+ });
143
+ if (providedFlags.has("runtime") && options.runtime === "workers" && config.dbSetup === "docker") incompatibilityError({
144
+ message: "In Better-Fullstack, Cloudflare Workers runtime is currently not available with Docker database setup.",
145
+ provided: {
146
+ runtime: "workers",
147
+ "db-setup": "docker"
148
+ },
149
+ suggestions: ["Use --db-setup d1 for SQLite", "Choose a different runtime (node, bun)"]
150
+ });
151
+ if (providedFlags.has("database") && config.database === "mongodb" && config.runtime === "workers") incompatibilityError({
152
+ message: "In Better-Fullstack, MongoDB is currently not available with Cloudflare Workers runtime.",
153
+ provided: {
154
+ database: "mongodb",
155
+ runtime: "workers"
156
+ },
157
+ suggestions: ["Use a different database (postgres, sqlite, mysql)", "Choose a different runtime (node, bun)"]
158
+ });
159
+ }
160
+ function validateApiFrontendCompatibility(api, frontends = [], astroIntegration) {
161
+ const issue = getApiFrontendCompatibilityIssue(api, frontends, astroIntegration);
162
+ if (!issue) return;
163
+ incompatibilityError({
164
+ message: issue.message,
165
+ provided: issue.provided ?? {},
166
+ suggestions: issue.suggestions ?? []
167
+ });
168
+ }
169
+ function isFrontendAllowedWithBackend$1(frontend, backend, auth) {
170
+ return isFrontendAllowedWithBackend(frontend, backend, auth);
171
+ }
172
+ function allowedApisForFrontends$1(frontends = [], astroIntegration) {
173
+ return allowedApisForFrontends(frontends, astroIntegration);
174
+ }
175
+ function isExampleAIAllowed$1(backend, frontends = []) {
176
+ return isExampleAIAllowed(backend, frontends);
177
+ }
178
+ function isExampleChatSdkAllowed$1(backend, frontends = [], runtime) {
179
+ return isExampleChatSdkAllowed(backend, frontends, runtime);
180
+ }
181
+ function requiresChatSdkVercelAI(backend, frontends = [], runtime) {
182
+ return requiresChatSdkVercelAIForSelection(backend, frontends, runtime);
183
+ }
184
+ function validateWebDeployRequiresWebFrontend(webDeploy, hasWebFrontendFlag) {
185
+ if (webDeploy && webDeploy !== "none" && !hasWebFrontendFlag) exitWithError("'--web-deploy' requires a web frontend. Please select a web frontend or set '--web-deploy none'.");
186
+ }
187
+ function validateWebDeployFrontendTemplates(webDeploy, frontends = []) {
188
+ const blocked = getUnsupportedWebDeployFrontend(webDeploy, frontends);
189
+ if (blocked) exitWithError(`${webDeploy === "render" ? "Render" : "Netlify"} deployment is not yet wired up for the '${blocked}' frontend. Choose a different web deploy target or frontend.`);
190
+ }
191
+ function validateServerDeployRequiresBackend(serverDeploy, backend, hasGraphBackend = false) {
192
+ if (serverDeploy && serverDeploy !== "none" && !hasGraphBackend && (!backend || backend === "none")) exitWithError("'--server-deploy' requires a backend. Please select a backend or set '--server-deploy none'.");
193
+ }
194
+ function validateAddonCompatibility$1(addon, frontend, _auth, backend, runtime, ecosystem, rustFrontend, javaWebFramework, database) {
195
+ const baseCompatibility = validateAddonCompatibility(addon, frontend, _auth);
196
+ if (!baseCompatibility.isCompatible) return baseCompatibility;
197
+ if (addon === "backend-utils") {
198
+ if (ecosystem !== void 0 && ecosystem !== "typescript") return {
199
+ isCompatible: false,
200
+ reason: "Backend Utils requires a TypeScript server stack"
201
+ };
202
+ if (backend !== void 0 && !isBackendUtilsCompatibleBackend(backend)) return {
203
+ isCompatible: false,
204
+ reason: "Backend Utils requires a Hono, Express, Fastify, Elysia, feTS, or NestJS backend"
205
+ };
206
+ }
207
+ if (addon === "docker-compose" || addon === "devcontainer") {
208
+ const label = addon === "devcontainer" ? "DevContainer" : "docker-compose";
209
+ const title = addon === "devcontainer" ? "DevContainer" : "Docker Compose";
210
+ if (backend === "convex") return {
211
+ isCompatible: false,
212
+ reason: `${label} is not compatible with Convex backend (managed service)`
213
+ };
214
+ if (runtime === "workers") return {
215
+ isCompatible: false,
216
+ reason: `${label} is not compatible with Cloudflare Workers runtime`
217
+ };
218
+ if (ecosystem !== void 0 && ![
219
+ "typescript",
220
+ "python",
221
+ "go",
222
+ "rust",
223
+ "java"
224
+ ].includes(ecosystem)) return {
225
+ isCompatible: false,
226
+ reason: `${title} currently supports TypeScript, Python, Go, Rust, or Java projects`
227
+ };
228
+ if (ecosystem === "typescript" && !hasDockerComposeCompatibleFrontend(frontend)) return {
229
+ isCompatible: false,
230
+ reason: `${title} currently supports Next.js, Vinext, TanStack Router, React Router, React Vite, Solid, or Astro`
231
+ };
232
+ if (ecosystem === "typescript" && backend === "self" && !frontend.includes("next") && !frontend.includes("vinext")) return {
233
+ isCompatible: false,
234
+ reason: `${title} self-backend support currently requires Next.js or Vinext`
235
+ };
236
+ if (ecosystem === "rust" && rustFrontend && rustFrontend !== "none") return {
237
+ isCompatible: false,
238
+ reason: `${title} for Rust currently supports server-only projects`
239
+ };
240
+ if (ecosystem === "java" && javaWebFramework && javaWebFramework !== "spring-boot") return {
241
+ isCompatible: false,
242
+ reason: `${title} for Java currently requires Spring Boot`
243
+ };
244
+ if (ecosystem === "python" && database && database !== "none" && database !== "sqlite" && database !== "postgres") return {
245
+ isCompatible: false,
246
+ reason: `${title} for Python ORM projects currently supports SQLite defaults or Postgres`
247
+ };
248
+ }
249
+ return { isCompatible: true };
250
+ }
251
+ function getCompatibleAddons$1(allAddons, frontend, existingAddons = [], auth, backend, runtime) {
252
+ return getCompatibleAddons(allAddons, frontend, existingAddons, auth).filter((addon) => {
253
+ const { isCompatible } = validateAddonCompatibility$1(addon, frontend, auth, backend, runtime);
254
+ return isCompatible;
255
+ });
256
+ }
257
+ function validateAddonsAgainstFrontends(addons = [], frontends = [], auth, backend, runtime, ecosystem, rustFrontend, javaWebFramework, database) {
258
+ if (addons.includes("nx") && addons.includes("turborepo")) exitWithError("Nx and Turborepo are alternative workspace runners. Choose one addon.");
259
+ for (const addon of addons) {
260
+ if (addon === "none") continue;
261
+ const { isCompatible, reason } = validateAddonCompatibility$1(addon, frontends, auth, backend, runtime, ecosystem, rustFrontend, javaWebFramework, database);
262
+ if (!isCompatible) exitWithError(`Incompatible addon/frontend combination: ${reason}`);
263
+ }
264
+ }
265
+ function validatePaymentsCompatibility(payments, auth, _backend, frontends = []) {
266
+ if (!payments || payments === "none") return;
267
+ if (payments === "dodo" && frontends.includes("react-vite")) exitWithError("Dodo Payments are not yet supported for React + Vite projects.");
268
+ if (payments === "polar") {
269
+ if (!auth || auth === "none" || auth !== "better-auth" && auth !== "better-auth-organizations") exitWithError("Polar payments requires Better Auth. Please use '--auth better-auth' or choose a different payments provider.");
270
+ const { web } = splitFrontends$1(frontends);
271
+ if (web.length === 0 && frontends.length > 0) exitWithError("Polar payments requires a web frontend or no frontend. Please select a web frontend or choose a different payments provider.");
272
+ }
273
+ }
274
+ function validateExamplesCompatibility(examples, backend, frontend, runtime, ai) {
275
+ const examplesArr = examples ?? [];
276
+ if (examplesArr.length === 0 || examplesArr.includes("none")) return;
277
+ if (examplesArr.includes("tanstack-showcase")) {
278
+ const showcaseFrontends = ["tanstack-router", "tanstack-start"];
279
+ if (!(frontend ?? []).some((f) => showcaseFrontends.includes(f))) exitWithError("The 'tanstack-showcase' example requires TanStack Router or TanStack Start frontend.");
280
+ }
281
+ if (examplesArr.includes("ai") && (frontend ?? []).includes("solid")) exitWithError("The 'ai' example is not compatible with the Solid frontend.");
282
+ if (examplesArr.includes("ai") && (frontend ?? []).includes("solid-start")) exitWithError("The 'ai' example is not compatible with the SolidStart frontend.");
283
+ if (examplesArr.includes("ai") && backend === "convex") {
284
+ const frontendArr = frontend ?? [];
285
+ const includesNuxt = frontendArr.includes("nuxt");
286
+ const includesSvelte = frontendArr.includes("svelte");
287
+ if (includesNuxt || includesSvelte) exitWithError("The 'ai' example with Convex backend only supports React-based frontends (Next.js, TanStack Router, TanStack Start, React Router, React + Vite). Svelte and Nuxt are not supported with Convex AI.");
288
+ }
289
+ if (examplesArr.includes("chat-sdk")) {
290
+ const frontendArr = frontend ?? [];
291
+ if (frontendArr.includes("react-vite")) exitWithError("The 'chat-sdk' example is not yet supported for React + Vite projects.");
292
+ if (!isExampleChatSdkAllowed$1(backend, frontendArr, runtime)) {
293
+ if (backend === "none") exitWithError("The 'chat-sdk' example requires a backend.");
294
+ if (backend === "convex") exitWithError("The 'chat-sdk' example is not supported with the Convex backend in v1. Use self backend (Next.js, TanStack Start, Nuxt) or Hono with Node runtime.");
295
+ if (backend === "self") exitWithError("The 'chat-sdk' example with self backend only supports Next.js, TanStack Start, or Nuxt frontends in v1.");
296
+ if (backend === "hono" && runtime !== "node") exitWithError("The 'chat-sdk' example with Hono requires '--runtime node' in v1 (Bun/Workers not supported yet).");
297
+ exitWithError("The 'chat-sdk' example is only supported with self backend (Next.js, TanStack Start, Nuxt) or Hono with Node runtime in v1.");
298
+ }
299
+ if (requiresChatSdkVercelAI(backend, frontendArr, runtime) && ai && ai !== "vercel-ai") exitWithError("The 'chat-sdk' example requires '--ai vercel-ai' for the selected stack in v1 (Nuxt Discord and Hono GitHub profiles).");
300
+ }
301
+ }
302
+ /**
303
+ * Validates that TanStack AI is only used with compatible frontends (React or Solid).
304
+ * Server-side @tanstack/ai core works anywhere, but client adapters only exist for React and Solid.
305
+ */
306
+ function validateAIFrontendCompatibility(ai, frontends = []) {
307
+ const issue = getAIFrontendCompatibilityIssue(ai, frontends);
308
+ if (!issue) return;
309
+ exitWithError(issue.message);
310
+ }
311
+ /**
312
+ * Validates that a UI library is compatible with the selected frontend(s)
313
+ */
314
+ function validateUILibraryFrontendCompatibility(uiLibrary, frontends = [], astroIntegration) {
315
+ if (!uiLibrary || uiLibrary === "none") return;
316
+ const { web } = splitFrontends$1(frontends);
317
+ if (web.length === 0) return;
318
+ const compatible = getCompatibleUILibraries(frontends, astroIntegration);
319
+ if (!compatible.includes(uiLibrary)) {
320
+ const isAstroNonReact = web.includes("astro") && astroIntegration !== "react";
321
+ const supportsAstroReact = getCompatibleUILibraries(["astro"], "react").includes(uiLibrary);
322
+ if (isAstroNonReact && supportsAstroReact) {
323
+ incompatibilityError({
324
+ message: `UI library '${uiLibrary}' requires React.`,
325
+ provided: {
326
+ "ui-library": uiLibrary,
327
+ "astro-integration": astroIntegration || "none"
328
+ },
329
+ suggestions: ["Use --astro-integration react", "Choose a different UI library (daisyui, ark-ui)"]
330
+ });
331
+ return;
332
+ }
333
+ incompatibilityError({
334
+ message: `UI library '${uiLibrary}' is not compatible with the selected frontend.`,
335
+ provided: {
336
+ "ui-library": uiLibrary,
337
+ frontend: frontends
338
+ },
339
+ suggestions: [`Supported choices for this stack: ${compatible.join(", ")}`, "Choose a different UI library"]
340
+ });
341
+ }
342
+ }
343
+ /**
344
+ * Validates that a UI library is compatible with the selected CSS framework
345
+ */
346
+ function validateUILibraryCSSFrameworkCompatibility(uiLibrary, cssFramework) {
347
+ if (!uiLibrary || uiLibrary === "none") return;
348
+ if (!cssFramework) return;
349
+ const supported = getCompatibleCSSFrameworks(uiLibrary);
350
+ if (!supported.includes(cssFramework)) exitWithError(`UI library '${uiLibrary}' is not compatible with '${cssFramework}' CSS framework. Supported CSS frameworks: ${supported.join(", ")}`);
351
+ }
352
+ /**
353
+ * Gets list of UI libraries compatible with the selected frontend(s)
354
+ */
355
+ function getCompatibleUILibraries$1(frontends = [], astroIntegration) {
356
+ return getCompatibleUILibraries(frontends, astroIntegration);
357
+ }
358
+ /**
359
+ * Gets list of CSS frameworks compatible with the selected UI library
360
+ */
361
+ function getCompatibleCSSFrameworks$1(uiLibrary) {
362
+ return getCompatibleCSSFrameworks(uiLibrary);
363
+ }
364
+ /**
365
+ * Checks if a frontend has web styling (excludes native-only frontends)
366
+ */
367
+ function hasWebStyling$1(frontends = []) {
368
+ return hasWebStyling(frontends);
369
+ }
370
+
371
+ //#endregion
372
+ export { validateWebDeployFrontendTemplates as C, incompatibilityError as D, constraintError as E, missingRequirementError as O, validateUILibraryFrontendCompatibility as S, validateWorkersCompatibility as T, validateExamplesCompatibility as _, getCompatibleUILibraries$1 as a, validateServerDeployRequiresBackend as b, isExampleChatSdkAllowed$1 as c, requiresChatSdkVercelAI as d, splitFrontends$1 as f, validateApiFrontendCompatibility as g, validateAddonsAgainstFrontends as h, getCompatibleCSSFrameworks$1 as i, isFrontendAllowedWithBackend$1 as l, validateAddonCompatibility$1 as m, ensureSingleWebAndNative as n, hasWebStyling$1 as o, validateAIFrontendCompatibility as p, getCompatibleAddons$1 as r, isExampleAIAllowed$1 as s, allowedApisForFrontends$1 as t, isWebFrontend$1 as u, validatePaymentsCompatibility as v, validateWebDeployRequiresWebFrontend as w, validateUILibraryCSSFrameworkCompatibility as x, validateSelfBackendCompatibility as y };