From 0de49d4e4558d730ed177b4cbea0d6fbe8338b72 Mon Sep 17 00:00:00 2001 From: Aman Varshney Date: Sat, 19 Apr 2025 17:30:59 +0530 Subject: [PATCH] Squash merge beta into main --- .changeset/dirty-seas-train.md | 5 + .changeset/polite-mirrors-love.md | 5 + .changeset/pre.json | 9 ++ .github/workflows/publish.yaml | 17 +++- apps/cli/CHANGELOG.md | 12 +++ apps/cli/package.json | 2 +- apps/cli/src/helpers/addons-setup.ts | 2 +- apps/cli/src/helpers/api-setup.ts | 3 +- apps/cli/src/helpers/auth-setup.ts | 1 - .../src/helpers/backend-framework-setup.ts | 14 ++- apps/cli/src/helpers/db-setup.ts | 9 +- apps/cli/src/helpers/examples-setup.ts | 18 +--- apps/cli/src/helpers/post-installation.ts | 11 +-- apps/cli/src/helpers/project-config.ts | 1 - apps/cli/src/helpers/runtime-setup.ts | 2 +- apps/cli/src/helpers/template-manager.ts | 97 ++++++++----------- apps/cli/src/prompts/addons.ts | 6 +- apps/cli/src/prompts/api.ts | 5 - apps/cli/src/prompts/auth.ts | 3 +- apps/cli/src/prompts/database.ts | 2 +- apps/cli/src/prompts/examples.ts | 1 + apps/cli/src/types.ts | 2 +- apps/cli/src/utils/template-processor.ts | 3 +- .../server-base/src/routers/index.ts.hbs | 3 +- apps/cli/templates/frontend/native/app.json | 1 + apps/web/src/lib/constant.ts | 7 -- bun.lock | 2 +- 27 files changed, 113 insertions(+), 130 deletions(-) create mode 100644 .changeset/dirty-seas-train.md create mode 100644 .changeset/polite-mirrors-love.md create mode 100644 .changeset/pre.json diff --git a/.changeset/dirty-seas-train.md b/.changeset/dirty-seas-train.md new file mode 100644 index 0000000..29fb35c --- /dev/null +++ b/.changeset/dirty-seas-train.md @@ -0,0 +1,5 @@ +--- +"create-better-t-stack": patch +--- + +remove none option in api diff --git a/.changeset/polite-mirrors-love.md b/.changeset/polite-mirrors-love.md new file mode 100644 index 0000000..51391af --- /dev/null +++ b/.changeset/polite-mirrors-love.md @@ -0,0 +1,5 @@ +--- +"create-better-t-stack": patch +--- + +Only add tRPC server adapters when API is tRPC diff --git a/.changeset/pre.json b/.changeset/pre.json new file mode 100644 index 0000000..0707725 --- /dev/null +++ b/.changeset/pre.json @@ -0,0 +1,9 @@ +{ + "mode": "exit", + "tag": "beta", + "initialVersions": { + "create-better-t-stack": "2.0.5", + "web": "0.0.0" + }, + "changesets": ["dirty-seas-train", "polite-mirrors-love"] +} diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 50d50c9..70335d2 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -4,6 +4,7 @@ on: push: branches: - main + - beta paths: - 'apps/cli/**' - '.changeset/**' @@ -16,12 +17,20 @@ jobs: publish: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: oven-sh/setup-bun@v2 + - name: Checkout Code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Bun + uses: oven-sh/setup-bun@v2 with: bun-version: latest - - run: bun install --frozen-lockfile - - name: Create Release Pull Request + + - name: Install Dependencies + run: bun install --frozen-lockfile + + - name: Create Release Pull Request or Publish id: changesets uses: changesets/action@v1 with: diff --git a/apps/cli/CHANGELOG.md b/apps/cli/CHANGELOG.md index 1dad9d1..f5d804b 100644 --- a/apps/cli/CHANGELOG.md +++ b/apps/cli/CHANGELOG.md @@ -1,5 +1,17 @@ # create-better-t-stack +## 2.0.6-beta.1 + +### Patch Changes + +- 9d9bd1d: remove none option in api + +## 2.0.6-beta.0 + +### Patch Changes + +- 0a4813b: Only add tRPC server adapters when API is tRPC + ## 2.0.5 ### Patch Changes diff --git a/apps/cli/package.json b/apps/cli/package.json index 8afc2d9..d0915b2 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -1,6 +1,6 @@ { "name": "create-better-t-stack", - "version": "2.0.5", + "version": "2.0.6-beta.1", "description": "A modern CLI tool for scaffolding end-to-end type-safe TypeScript projects with best practices and customizable configurations", "type": "module", "license": "MIT", diff --git a/apps/cli/src/helpers/addons-setup.ts b/apps/cli/src/helpers/addons-setup.ts index 6578283..9b299d4 100644 --- a/apps/cli/src/helpers/addons-setup.ts +++ b/apps/cli/src/helpers/addons-setup.ts @@ -8,7 +8,7 @@ import { setupTauri } from "./tauri-setup"; import type { ProjectConfig } from "../types"; export async function setupAddons(config: ProjectConfig) { - const { projectName, addons, packageManager, frontend } = config; + const { projectName, addons, frontend } = config; const projectDir = path.resolve(process.cwd(), projectName); const hasWebFrontend = frontend.includes("react-router") || frontend.includes("tanstack-router"); diff --git a/apps/cli/src/helpers/api-setup.ts b/apps/cli/src/helpers/api-setup.ts index 216f323..debbeda 100644 --- a/apps/cli/src/helpers/api-setup.ts +++ b/apps/cli/src/helpers/api-setup.ts @@ -1,9 +1,8 @@ import * as path from "node:path"; -import type { ProjectApi, ProjectConfig } from "../types"; +import type { ProjectConfig } from "../types"; import { addPackageDependency } from "../utils/add-package-deps"; export async function setupApi(config: ProjectConfig): Promise { - if (config.api === "none") return; const { api, projectName } = config; const projectDir = path.resolve(process.cwd(), projectName); const webDir = path.join(projectDir, "apps/web"); diff --git a/apps/cli/src/helpers/auth-setup.ts b/apps/cli/src/helpers/auth-setup.ts index d9d6555..a68383a 100644 --- a/apps/cli/src/helpers/auth-setup.ts +++ b/apps/cli/src/helpers/auth-setup.ts @@ -1,7 +1,6 @@ import path from "node:path"; import consola from "consola"; import pc from "picocolors"; -import type { ProjectFrontend } from "../types"; import { addPackageDependency } from "../utils/add-package-deps"; export function generateAuthSecret(length = 32): string { diff --git a/apps/cli/src/helpers/backend-framework-setup.ts b/apps/cli/src/helpers/backend-framework-setup.ts index 4463ea1..fa03806 100644 --- a/apps/cli/src/helpers/backend-framework-setup.ts +++ b/apps/cli/src/helpers/backend-framework-setup.ts @@ -1,6 +1,5 @@ import path from "node:path"; import type { AvailableDependencies } from "../constants"; -import type { ProjectBackend, ProjectRuntime } from "../types"; import { addPackageDependency } from "../utils/add-package-deps"; import type { ProjectConfig } from "../types"; @@ -8,7 +7,7 @@ import type { ProjectConfig } from "../types"; export async function setupBackendDependencies( config: ProjectConfig, ): Promise { - const { projectName, backend, runtime } = config; + const { projectName, backend, runtime, api } = config; const projectDir = path.resolve(process.cwd(), projectName); const framework = backend; const serverDir = path.join(projectDir, "apps/server"); @@ -17,15 +16,20 @@ export async function setupBackendDependencies( const devDependencies: AvailableDependencies[] = []; if (framework === "hono") { - dependencies.push("hono", "@hono/trpc-server"); + dependencies.push("hono"); + if (api === "trpc") { + dependencies.push("@hono/trpc-server"); + } if (runtime === "node") { dependencies.push("@hono/node-server"); devDependencies.push("tsx", "@types/node"); } } else if (framework === "elysia") { - dependencies.push("elysia", "@elysiajs/cors", "@elysiajs/trpc"); - + dependencies.push("elysia", "@elysiajs/cors"); + if (api === "trpc") { + dependencies.push("@elysiajs/trpc"); + } if (runtime === "node") { dependencies.push("@elysiajs/node"); devDependencies.push("tsx", "@types/node"); diff --git a/apps/cli/src/helpers/db-setup.ts b/apps/cli/src/helpers/db-setup.ts index 57572ee..3301dc8 100644 --- a/apps/cli/src/helpers/db-setup.ts +++ b/apps/cli/src/helpers/db-setup.ts @@ -1,13 +1,8 @@ import path from "node:path"; -import { log, spinner } from "@clack/prompts"; +import { spinner } from "@clack/prompts"; import consola from "consola"; import fs from "fs-extra"; import pc from "picocolors"; -import type { - ProjectDatabase, - ProjectOrm, - ProjectPackageManager, -} from "../types"; import { addPackageDependency } from "../utils/add-package-deps"; import { setupMongoDBAtlas } from "./mongodb-atlas-setup"; import { setupPrismaPostgres } from "./prisma-postgres-setup"; @@ -18,7 +13,7 @@ import { setupNeonPostgres } from "./neon-setup"; import type { ProjectConfig } from "../types"; export async function setupDatabase(config: ProjectConfig): Promise { - const { projectName, database, orm, packageManager, dbSetup } = config; + const { projectName, database, orm, dbSetup } = config; const projectDir = path.resolve(process.cwd(), projectName); const s = spinner(); const serverDir = path.join(projectDir, "apps/server"); diff --git a/apps/cli/src/helpers/examples-setup.ts b/apps/cli/src/helpers/examples-setup.ts index 5ec8269..ef0182d 100644 --- a/apps/cli/src/helpers/examples-setup.ts +++ b/apps/cli/src/helpers/examples-setup.ts @@ -1,23 +1,9 @@ import path from "node:path"; -import fs from "fs-extra"; -import { PKG_ROOT } from "../constants"; -import type { - ProjectBackend, - ProjectConfig, - ProjectFrontend, - ProjectOrm, -} from "../types"; +import type { ProjectConfig } from "../types"; import { addPackageDependency } from "../utils/add-package-deps"; export async function setupExamples(config: ProjectConfig): Promise { - const { - projectName, - examples, - orm, - auth, - backend, - frontend = ["tanstack-router"], - } = config; + const { projectName, examples } = config; const projectDir = path.resolve(process.cwd(), projectName); if (examples.includes("ai")) { diff --git a/apps/cli/src/helpers/post-installation.ts b/apps/cli/src/helpers/post-installation.ts index 87ea11a..de71dd0 100644 --- a/apps/cli/src/helpers/post-installation.ts +++ b/apps/cli/src/helpers/post-installation.ts @@ -1,14 +1,6 @@ import { consola } from "consola"; import pc from "picocolors"; -import type { - ProjectAddons, - ProjectDBSetup, - ProjectDatabase, - ProjectFrontend, - ProjectOrm, - ProjectPackageManager, - ProjectRuntime, -} from "../types"; +import type { ProjectDatabase, ProjectOrm, ProjectRuntime } from "../types"; import { getPackageExecutionCommand } from "../utils/get-package-execution-command"; import type { ProjectConfig } from "../types"; @@ -25,7 +17,6 @@ export function displayPostInstallInstructions( addons, runtime, frontend, - dbSetup, } = config; const runCmd = packageManager === "npm" ? "npm run" : packageManager; const cdCmd = `cd ${projectName}`; diff --git a/apps/cli/src/helpers/project-config.ts b/apps/cli/src/helpers/project-config.ts index 1762938..6e38841 100644 --- a/apps/cli/src/helpers/project-config.ts +++ b/apps/cli/src/helpers/project-config.ts @@ -22,7 +22,6 @@ async function updateRootPackageJson( const packageJson = await fs.readJson(rootPackageJsonPath); packageJson.name = options.projectName; - // Define script sets const turboScripts = { dev: "turbo dev", build: "turbo build", diff --git a/apps/cli/src/helpers/runtime-setup.ts b/apps/cli/src/helpers/runtime-setup.ts index 771015e..9af3cd7 100644 --- a/apps/cli/src/helpers/runtime-setup.ts +++ b/apps/cli/src/helpers/runtime-setup.ts @@ -1,6 +1,6 @@ import path from "node:path"; import fs from "fs-extra"; -import type { ProjectBackend, ProjectConfig, ProjectRuntime } from "../types"; +import type { ProjectBackend, ProjectConfig } from "../types"; import { addPackageDependency } from "../utils/add-package-deps"; export async function setupRuntime(config: ProjectConfig): Promise { diff --git a/apps/cli/src/helpers/template-manager.ts b/apps/cli/src/helpers/template-manager.ts index a31942f..c51f9e9 100644 --- a/apps/cli/src/helpers/template-manager.ts +++ b/apps/cli/src/helpers/template-manager.ts @@ -89,29 +89,22 @@ export async function setupFrontendTemplates( } } - if (context.api !== "none") { - const webFramework = webFrontends[0]; + const webFramework = webFrontends[0]; - const apiWebBaseDir = path.join( - PKG_ROOT, - `templates/api/${context.api}/web/base`, - ); - if (await fs.pathExists(apiWebBaseDir)) { - await processAndCopyFiles("**/*", apiWebBaseDir, webAppDir, context); - } + const apiWebBaseDir = path.join( + PKG_ROOT, + `templates/api/${context.api}/web/base`, + ); + if (await fs.pathExists(apiWebBaseDir)) { + await processAndCopyFiles("**/*", apiWebBaseDir, webAppDir, context); + } - const apiWebFrameworkDir = path.join( - PKG_ROOT, - `templates/api/${context.api}/web/${webFramework}`, - ); - if (await fs.pathExists(apiWebFrameworkDir)) { - await processAndCopyFiles( - "**/*", - apiWebFrameworkDir, - webAppDir, - context, - ); - } + const apiWebFrameworkDir = path.join( + PKG_ROOT, + `templates/api/${context.api}/web/${webFramework}`, + ); + if (await fs.pathExists(apiWebFrameworkDir)) { + await processAndCopyFiles("**/*", apiWebFrameworkDir, webAppDir, context); } } @@ -124,21 +117,14 @@ export async function setupFrontendTemplates( await processAndCopyFiles("**/*", nativeBaseDir, nativeAppDir, context); } - if (context.api !== "none") { - const apiNativeSrcDir = path.join( - PKG_ROOT, - `templates/api/${context.api}/native`, - ); + const apiNativeSrcDir = path.join( + PKG_ROOT, + `templates/api/${context.api}/native`, + ); - if (await fs.pathExists(apiNativeSrcDir)) { - await processAndCopyFiles( - "**/*", - apiNativeSrcDir, - nativeAppDir, - context, - ); - } else { - } + if (await fs.pathExists(apiNativeSrcDir)) { + await processAndCopyFiles("**/*", apiNativeSrcDir, nativeAppDir, context); + } else { } } } @@ -175,32 +161,25 @@ export async function setupBackendFramework( ); } - if (context.api !== "none") { - const apiServerBaseDir = path.join( - PKG_ROOT, - `templates/api/${context.api}/server/base`, - ); - if (await fs.pathExists(apiServerBaseDir)) { - await processAndCopyFiles( - "**/*", - apiServerBaseDir, - serverAppDir, - context, - ); - } + const apiServerBaseDir = path.join( + PKG_ROOT, + `templates/api/${context.api}/server/base`, + ); + if (await fs.pathExists(apiServerBaseDir)) { + await processAndCopyFiles("**/*", apiServerBaseDir, serverAppDir, context); + } - const apiServerFrameworkDir = path.join( - PKG_ROOT, - `templates/api/${context.api}/server/${context.backend}`, + const apiServerFrameworkDir = path.join( + PKG_ROOT, + `templates/api/${context.api}/server/${context.backend}`, + ); + if (await fs.pathExists(apiServerFrameworkDir)) { + await processAndCopyFiles( + "**/*", + apiServerFrameworkDir, + serverAppDir, + context, ); - if (await fs.pathExists(apiServerFrameworkDir)) { - await processAndCopyFiles( - "**/*", - apiServerFrameworkDir, - serverAppDir, - context, - ); - } } } diff --git a/apps/cli/src/prompts/addons.ts b/apps/cli/src/prompts/addons.ts index e85a22c..fdc972e 100644 --- a/apps/cli/src/prompts/addons.ts +++ b/apps/cli/src/prompts/addons.ts @@ -4,10 +4,10 @@ import { DEFAULT_CONFIG } from "../constants"; import type { ProjectAddons, ProjectFrontend } from "../types"; export async function getAddonsChoice( - Addons?: ProjectAddons[], + addons?: ProjectAddons[], frontends?: ProjectFrontend[], ): Promise { - if (Addons !== undefined) return Addons; + if (addons !== undefined) return addons; const hasCompatibleWebFrontend = frontends?.includes("react-router") || @@ -50,7 +50,7 @@ export async function getAddonsChoice( ]; const options = hasCompatibleWebFrontend - ? [...webAddonOptions, ...addonOptions] + ? [...addonOptions, ...webAddonOptions] : addonOptions; const initialValues = DEFAULT_CONFIG.addons.filter( diff --git a/apps/cli/src/prompts/api.ts b/apps/cli/src/prompts/api.ts index ab1eef9..8be2c98 100644 --- a/apps/cli/src/prompts/api.ts +++ b/apps/cli/src/prompts/api.ts @@ -22,11 +22,6 @@ 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 integration (skip API setup)", - }, ]; if (includesNative) { diff --git a/apps/cli/src/prompts/auth.ts b/apps/cli/src/prompts/auth.ts index d7ccf82..68ff755 100644 --- a/apps/cli/src/prompts/auth.ts +++ b/apps/cli/src/prompts/auth.ts @@ -1,7 +1,6 @@ -import { cancel, confirm, isCancel, log } from "@clack/prompts"; +import { cancel, confirm, isCancel } from "@clack/prompts"; import pc from "picocolors"; import { DEFAULT_CONFIG } from "../constants"; -import type { ProjectFrontend } from "../types"; export async function getAuthChoice( auth: boolean | undefined, diff --git a/apps/cli/src/prompts/database.ts b/apps/cli/src/prompts/database.ts index 31c220d..1a126e9 100644 --- a/apps/cli/src/prompts/database.ts +++ b/apps/cli/src/prompts/database.ts @@ -19,7 +19,7 @@ export async function getDatabaseChoice( { value: "sqlite", label: "SQLite", - hint: "lightweight, server-less, embedded relational database management system", + hint: "lightweight, server-less, embedded relational database", }, { value: "postgres", diff --git a/apps/cli/src/prompts/examples.ts b/apps/cli/src/prompts/examples.ts index 555ce42..ea250ed 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, diff --git a/apps/cli/src/types.ts b/apps/cli/src/types.ts index 06d5214..71fbea2 100644 --- a/apps/cli/src/types.ts +++ b/apps/cli/src/types.ts @@ -30,7 +30,7 @@ export type ProjectDBSetup = | "mongodb-atlas" | "neon" | "none"; -export type ProjectApi = "trpc" | "orpc" | "none"; +export type ProjectApi = "trpc" | "orpc"; export interface ProjectConfig { projectName: string; diff --git a/apps/cli/src/utils/template-processor.ts b/apps/cli/src/utils/template-processor.ts index 560e124..aaf7009 100644 --- a/apps/cli/src/utils/template-processor.ts +++ b/apps/cli/src/utils/template-processor.ts @@ -1,4 +1,5 @@ import path from "node:path"; +import consola from "consola"; import fs from "fs-extra"; import handlebars from "handlebars"; import type { ProjectConfig } from "../types"; @@ -22,7 +23,7 @@ export async function processTemplate( await fs.ensureDir(path.dirname(destPath)); await fs.writeFile(destPath, processedContent); } catch (error) { - console.error(`Error processing template ${srcPath}:`, error); + consola.error(`Error processing template ${srcPath}:`, error); throw new Error(`Failed to process template ${srcPath}`); } } diff --git a/apps/cli/templates/backend/server-base/src/routers/index.ts.hbs b/apps/cli/templates/backend/server-base/src/routers/index.ts.hbs index 7a6cf55..0acef3e 100644 --- a/apps/cli/templates/backend/server-base/src/routers/index.ts.hbs +++ b/apps/cli/templates/backend/server-base/src/routers/index.ts.hbs @@ -20,6 +20,7 @@ export const appRouter = { todo: todoRouter, {{/if}} }; +export type AppRouter = typeof appRouter; {{/if}} {{#if (eq api "trpc")}} @@ -47,5 +48,5 @@ export const appRouter = router({ todo: todoRouter, {{/if}} }); -{{/if}} export type AppRouter = typeof appRouter; +{{/if}} diff --git a/apps/cli/templates/frontend/native/app.json b/apps/cli/templates/frontend/native/app.json index ecb7165..1ea6c32 100644 --- a/apps/cli/templates/frontend/native/app.json +++ b/apps/cli/templates/frontend/native/app.json @@ -17,6 +17,7 @@ "typedRoutes": true, "tsconfigPaths": true }, + "newArchEnabled": true, "orientation": "portrait", "icon": "./assets/icon.png", "userInterfaceStyle": "light", diff --git a/apps/web/src/lib/constant.ts b/apps/web/src/lib/constant.ts index a2604bd..ef03ee9 100644 --- a/apps/web/src/lib/constant.ts +++ b/apps/web/src/lib/constant.ts @@ -15,13 +15,6 @@ export const TECH_OPTIONS = { icon: "🧩", color: "from-indigo-400 to-indigo-600", }, - { - id: "none", - name: "No API", - description: "Skip API layer integration", - icon: "🚫", - color: "from-gray-400 to-gray-600", - }, ], frontend: [ { diff --git a/bun.lock b/bun.lock index 51767c0..ae33360 100644 --- a/bun.lock +++ b/bun.lock @@ -14,7 +14,7 @@ }, "apps/cli": { "name": "create-better-t-stack", - "version": "2.0.1", + "version": "2.0.6-beta.0", "bin": { "create-better-t-stack": "dist/index.js", },