diff --git a/.changeset/young-sheep-yawn.md b/.changeset/young-sheep-yawn.md new file mode 100644 index 0000000..106c5fc --- /dev/null +++ b/.changeset/young-sheep-yawn.md @@ -0,0 +1,5 @@ +--- +"create-better-t-stack": patch +--- + +dont allow examples when api is none diff --git a/apps/cli/src/index.ts b/apps/cli/src/index.ts index 7d684be..562af77 100644 --- a/apps/cli/src/index.ts +++ b/apps/cli/src/index.ts @@ -399,12 +399,11 @@ function processAndValidateFlags( config.api = options.api as ProjectApi; if (options.api === "none") { if ( - options.backend && - options.backend !== "convex" && - options.backend !== "none" + options.examples && + !(options.examples.length === 1 && options.examples[0] === "none") ) { consola.fatal( - `'--api none' is only supported with '--backend convex' or '--backend none'. Please choose a different API setting or use '--backend convex' or '--backend none'.`, + "Cannot use '--examples' when '--api' is set to 'none'. Please remove the --examples flag or choose an API type.", ); process.exit(1); } @@ -421,12 +420,6 @@ function processAndValidateFlags( config.backend !== "convex" && config.backend !== "none" ) { - if (providedFlags.has("api") && options.api === "none") { - consola.fatal( - `'--api none' is only supported with '--backend convex' or '--backend none'. Please choose 'trpc', 'orpc', or remove the --api flag.`, - ); - process.exit(1); - } if (providedFlags.has("runtime") && options.runtime === "none") { consola.fatal( `'--runtime none' is only supported with '--backend convex' or '--backend none'. Please choose 'bun', 'node', or remove the --runtime flag.`, @@ -782,26 +775,13 @@ function processAndValidateFlags( consola.fatal( `tRPC API is not supported with '${ includesNuxt ? "nuxt" : includesSvelte ? "svelte" : "solid" - }' frontend. Please use --api orpc or remove '${ + }' frontend. Please use --api orpc or --api none or remove '${ includesNuxt ? "nuxt" : includesSvelte ? "svelte" : "solid" }' from --frontend.`, ); process.exit(1); } - if ( - (includesNuxt || includesSvelte || includesSolid) && - effectiveApi !== "orpc" && - (!options.api || (options.yes && options.api === "trpc")) - ) { - if (config.api !== "none") { - config.api = "orpc"; - log.info( - `Due to frontend selection, API has been set to 'orpc'. tRPC is not compatible with Nuxt, Svelte, or Solid Framework`, - ); - } - } - if (config.addons && config.addons.length > 0) { const webSpecificAddons = ["pwa", "tauri"]; const hasWebSpecificAddons = config.addons.some((addon) => diff --git a/apps/cli/src/prompts/api.ts b/apps/cli/src/prompts/api.ts index b1d9961..dd8277c 100644 --- a/apps/cli/src/prompts/api.ts +++ b/apps/cli/src/prompts/api.ts @@ -1,6 +1,5 @@ import { cancel, isCancel, select } from "@clack/prompts"; import pc from "picocolors"; -import { DEFAULT_CONFIG } from "../constants"; import type { ProjectApi, ProjectBackend, ProjectFrontend } from "../types"; export async function getApiChoice( @@ -29,6 +28,11 @@ export async function getApiChoice( label: "oRPC", hint: "End-to-end type-safe APIs that adhere to OpenAPI standards", }, + { + value: "none" as const, + label: "None", + hint: "No API layer (e.g. for full-stack frameworks like Next.js with Route Handlers)", + }, ]; if (includesNuxt || includesSvelte || includesSolid) { @@ -36,20 +40,22 @@ export async function getApiChoice( { value: "orpc" as const, label: "oRPC", - hint: `End-to-end type-safe APIs (Required for ${ + hint: `End-to-end type-safe APIs (Recommended for ${ includesNuxt ? "Nuxt" : includesSvelte ? "Svelte" : "Solid" } frontend)`, }, + { + value: "none" as const, + label: "None", + hint: "No API layer", + }, ]; } const apiType = await select({ message: "Select API type", options: apiOptions, - initialValue: - includesNuxt || includesSvelte || includesSolid - ? "orpc" - : DEFAULT_CONFIG.api, + initialValue: apiOptions[0].value, }); if (isCancel(apiType)) { @@ -57,9 +63,5 @@ export async function getApiChoice( process.exit(0); } - if ((includesNuxt || includesSvelte || includesSolid) && apiType !== "orpc") { - return "orpc"; - } - return apiType; } diff --git a/apps/cli/src/prompts/config-prompts.ts b/apps/cli/src/prompts/config-prompts.ts index c89a1dc..f58832e 100644 --- a/apps/cli/src/prompts/config-prompts.ts +++ b/apps/cli/src/prompts/config-prompts.ts @@ -77,6 +77,7 @@ export async function gatherConfig( results.database, results.frontend, results.backend, + results.api, ), dbSetup: ({ results }) => getDBSetupChoice( diff --git a/apps/cli/src/prompts/examples.ts b/apps/cli/src/prompts/examples.ts index ec555b1..01e6374 100644 --- a/apps/cli/src/prompts/examples.ts +++ b/apps/cli/src/prompts/examples.ts @@ -2,6 +2,7 @@ import { cancel, isCancel, multiselect } from "@clack/prompts"; import pc from "picocolors"; import { DEFAULT_CONFIG } from "../constants"; import type { + ProjectApi, ProjectBackend, ProjectDatabase, ProjectExamples, @@ -13,7 +14,11 @@ export async function getExamplesChoice( database?: ProjectDatabase, frontends?: ProjectFrontend[], backend?: ProjectBackend, + api?: ProjectApi, ): Promise { + if (api === "none") { + return []; + } if (examples !== undefined) return examples; if (backend === "convex") { diff --git a/apps/cli/templates/backend/server/hono/src/index.ts.hbs b/apps/cli/templates/backend/server/hono/src/index.ts.hbs index 8834b8d..1385500 100644 --- a/apps/cli/templates/backend/server/hono/src/index.ts.hbs +++ b/apps/cli/templates/backend/server/hono/src/index.ts.hbs @@ -3,12 +3,14 @@ import "dotenv/config"; import { RPCHandler } from "@orpc/server/fetch"; import { createContext } from "./lib/context"; import { appRouter } from "./routers/index"; -{{#if auth}} -import { auth } from "./lib/auth"; -{{/if}} {{/if}} {{#if (eq api "trpc")}} import { trpcServer } from "@hono/trpc-server"; +import { createContext } from "./lib/context"; +import { appRouter } from "./routers/index"; +{{/if}} +{{#if auth}} +import { auth } from "./lib/auth"; {{/if}} import { Hono } from "hono"; import { cors } from "hono/cors"; @@ -18,13 +20,6 @@ import { streamText } from "ai"; import { google } from "@ai-sdk/google"; import { stream } from "hono/streaming"; {{/if}} -{{#if (eq api "trpc")}} -import { createContext } from "./lib/context"; -import { appRouter } from "./routers/index"; -{{#if auth}} -import { auth } from "./lib/auth"; -{{/if}} -{{/if}} const app = new Hono(); diff --git a/apps/cli/templates/backend/server/server-base/src/routers/index.ts.hbs b/apps/cli/templates/backend/server/server-base/src/routers/index.ts.hbs index 0acef3e..1a75081 100644 --- a/apps/cli/templates/backend/server/server-base/src/routers/index.ts.hbs +++ b/apps/cli/templates/backend/server/server-base/src/routers/index.ts.hbs @@ -21,9 +21,7 @@ export const appRouter = { {{/if}} }; export type AppRouter = typeof appRouter; -{{/if}} - -{{#if (eq api "trpc")}} +{{else if (eq api "trpc")}} import { {{#if auth}}protectedProcedure, {{/if}}publicProcedure, router, @@ -49,4 +47,7 @@ export const appRouter = router({ {{/if}} }); export type AppRouter = typeof appRouter; +{{else}} +export const appRouter = {}; +export type AppRouter = typeof appRouter; {{/if}} diff --git a/apps/cli/templates/frontend/nuxt/app/pages/index.vue.hbs b/apps/cli/templates/frontend/nuxt/app/pages/index.vue.hbs index 6440660..8149f31 100644 --- a/apps/cli/templates/frontend/nuxt/app/pages/index.vue.hbs +++ b/apps/cli/templates/frontend/nuxt/app/pages/index.vue.hbs @@ -27,7 +27,7 @@ const healthCheck = useQuery($orpc.healthCheck.queryOptions())