diff --git a/README.md b/README.md index 7ee80a80f..bf673ded8 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ npx create-better-t-stack@latest - Databases: SQLite, PostgreSQL, MySQL, MongoDB (or none) - ORMs: Drizzle, Prisma, Mongoose (or none) - Auth: Better Auth or Clerk (optional) -- Addons: Turborepo, Nx, PWA, Tauri, Electrobun, Biome, Lefthook, Husky, Starlight, Fumadocs, Ultracite, Oxlint, MCP, OpenTUI, WXT, Skills +- Addons: Turborepo, Nx, PWA, Tauri, Electrobun, Biome, Lefthook, Husky, Starlight, Fumadocs, Ultracite, Oxc, MCP, OpenTUI, WXT, Skills - Examples: Todo, AI - DB Setup: Turso, Neon, Supabase, Prisma PostgreSQL, MongoDB Atlas, Cloudflare D1, Docker - Web Deploy: Cloudflare Workers diff --git a/apps/cli/README.md b/apps/cli/README.md index f1d880ee8..8c5af97ea 100644 --- a/apps/cli/README.md +++ b/apps/cli/README.md @@ -41,7 +41,7 @@ Follow the prompts to configure your project or use the `--yes` flag for default | **Database Setup** | • Turso (SQLite)
• Cloudflare D1 (SQLite)
• Neon (PostgreSQL)
• Supabase (PostgreSQL)
• Prisma Postgres
• MongoDB Atlas
• None (manual setup) | | **Authentication** | • Better Auth
• Clerk | | **Styling** | Tailwind CSS with a shared shadcn/ui package for React web apps | -| **Addons** | • PWA support
• Tauri (desktop applications)
• Electrobun (lightweight desktop shell)
• Starlight and Fumadocs (documentation sites)
• Biome, Oxlint, Ultracite (linting and formatting)
• Lefthook, Husky (Git hooks)
• MCP, Skills (agent tooling)
• OpenTUI, WXT (platform extensions)
• Turborepo or Nx (monorepo orchestration) | +| **Addons** | • PWA support
• Tauri (desktop applications)
• Electrobun (lightweight desktop shell)
• Starlight and Fumadocs (documentation sites)
• Biome, Oxc, Ultracite (linting and formatting)
• Lefthook, Husky (Git hooks)
• MCP, Skills (agent tooling)
• OpenTUI, WXT (platform extensions)
• Turborepo or Nx (monorepo orchestration) | | **Examples** | • Todo app
• AI Chat interface (using Vercel AI SDK) | | **Developer Experience** | • Automatic Git initialization
• Package manager choice (npm, pnpm, bun)
• Automatic dependency installation | @@ -60,7 +60,7 @@ Options: --auth Authentication (better-auth, clerk, none) --payments Payments provider (polar, none) --frontend Frontend types (tanstack-router, react-router, tanstack-start, next, nuxt, svelte, solid, astro, native-bare, native-uniwind, native-unistyles, none) - --addons Additional addons (pwa, tauri, electrobun, starlight, biome, lefthook, husky, mcp, turborepo, nx, fumadocs, ultracite, oxlint, opentui, wxt, skills, none) + --addons Additional addons (pwa, tauri, electrobun, starlight, biome, lefthook, husky, mcp, turborepo, nx, fumadocs, ultracite, oxc, opentui, wxt, skills, none) --examples Examples to include (todo, ai, none) --git Initialize git repository --no-git Skip git initialization diff --git a/apps/cli/src/constants.ts b/apps/cli/src/constants.ts index 98885d86c..92b1ccf88 100644 --- a/apps/cli/src/constants.ts +++ b/apps/cli/src/constants.ts @@ -62,7 +62,7 @@ export const ADDON_COMPATIBILITY = { starlight: [], ultracite: [], mcp: [], - oxlint: [], + oxc: [], fumadocs: [], opentui: [], wxt: [], diff --git a/apps/cli/src/helpers/addons/addons-setup.ts b/apps/cli/src/helpers/addons/addons-setup.ts index 58398a991..f261a49fd 100644 --- a/apps/cli/src/helpers/addons/addons-setup.ts +++ b/apps/cli/src/helpers/addons/addons-setup.ts @@ -10,7 +10,7 @@ import { AddonSetupError, UserCancelledError } from "../../utils/errors"; import { cliConsola } from "../../utils/terminal-output"; import { setupFumadocs } from "./fumadocs-setup"; import { setupMcp } from "./mcp-setup"; -import { setupOxlint } from "./oxlint-setup"; +import { setupOxc } from "./oxc-setup"; import { setupSkills } from "./skills-setup"; import { setupStarlight } from "./starlight-setup"; import { setupTauri } from "./tauri-setup"; @@ -63,7 +63,7 @@ export async function setupAddons(config: ProjectConfig) { const hasBiome = addons.includes("biome"); const hasHusky = addons.includes("husky"); const hasLefthook = addons.includes("lefthook"); - const hasOxlint = addons.includes("oxlint"); + const hasOxc = addons.includes("oxc"); if (hasUltracite) { const gitHooks: string[] = []; @@ -75,14 +75,14 @@ export async function setupAddons(config: ProjectConfig) { await runAddonStep("biome", () => setupBiome(projectDir)); } - if (hasOxlint) { - await runSetup(() => setupOxlint(projectDir, config.packageManager)); + if (hasOxc) { + await runSetup(() => setupOxc(projectDir, config.packageManager)); } if (hasHusky || hasLefthook) { - let linter: "biome" | "oxlint" | undefined; - if (hasOxlint) { - linter = "oxlint"; + let linter: "biome" | "oxc" | undefined; + if (hasOxc) { + linter = "oxc"; } else if (hasBiome) { linter = "biome"; } @@ -139,7 +139,7 @@ export async function setupBiome(projectDir: string) { } } -export async function setupHusky(projectDir: string, linter?: "biome" | "oxlint") { +export async function setupHusky(projectDir: string, linter?: "biome" | "oxc") { await addPackageDependency({ devDependencies: ["husky", "lint-staged"], projectDir, @@ -154,7 +154,7 @@ export async function setupHusky(projectDir: string, linter?: "biome" | "oxlint" prepare: "husky", }; - if (linter === "oxlint") { + if (linter === "oxc") { packageJson["lint-staged"] = { "*": ["oxlint", "oxfmt --write"], }; diff --git a/apps/cli/src/helpers/addons/oxlint-setup.ts b/apps/cli/src/helpers/addons/oxc-setup.ts similarity index 83% rename from apps/cli/src/helpers/addons/oxlint-setup.ts rename to apps/cli/src/helpers/addons/oxc-setup.ts index f636e7015..1c0327ebb 100644 --- a/apps/cli/src/helpers/addons/oxlint-setup.ts +++ b/apps/cli/src/helpers/addons/oxc-setup.ts @@ -11,7 +11,7 @@ import { shouldSkipExternalCommands } from "../../utils/external-commands"; import { getPackageExecutionArgs } from "../../utils/package-runner"; import { createSpinner } from "../../utils/terminal-output"; -export async function setupOxlint( +export async function setupOxc( projectDir: string, packageManager: PackageManager, ): Promise> { @@ -41,7 +41,7 @@ export async function setupOxlint( const s = createSpinner(); try { - s.start("Initializing oxlint and oxfmt..."); + s.start("Initializing oxc..."); const oxlintArgs = getPackageExecutionArgs(packageManager, "oxlint@latest --init"); await $({ cwd: projectDir, env: { CI: "true" } })`${oxlintArgs}`; @@ -49,16 +49,16 @@ export async function setupOxlint( const oxfmtArgs = getPackageExecutionArgs(packageManager, "oxfmt@latest --init"); await $({ cwd: projectDir, env: { CI: "true" } })`${oxfmtArgs}`; - s.stop("oxlint and oxfmt initialized successfully!"); + s.stop("oxc initialized successfully!"); } catch (error) { - s.stop("Failed to initialize oxlint and oxfmt"); + s.stop("Failed to initialize oxc"); throw error; } }, catch: (error) => new AddonSetupError({ - addon: "oxlint", - message: `Failed to set up oxlint: ${error instanceof Error ? error.message : String(error)}`, + addon: "oxc", + message: `Failed to set up oxc: ${error instanceof Error ? error.message : String(error)}`, cause: error, }), }); diff --git a/apps/cli/src/helpers/addons/ultracite-setup.ts b/apps/cli/src/helpers/addons/ultracite-setup.ts index ccfc29550..c155f94e9 100644 --- a/apps/cli/src/helpers/addons/ultracite-setup.ts +++ b/apps/cli/src/helpers/addons/ultracite-setup.ts @@ -10,7 +10,7 @@ import { shouldSkipExternalCommands } from "../../utils/external-commands"; import { getPackageRunnerPrefix } from "../../utils/package-runner"; import { cliLog, createSpinner } from "../../utils/terminal-output"; -type UltraciteLinter = "biome" | "eslint" | "oxlint"; +type UltraciteLinter = "biome" | "eslint" | "oxc"; type UltraciteEditor = | "vscode" @@ -65,7 +65,7 @@ type UltraciteInitArgsInput = { const LINTERS = { biome: { label: "Biome", hint: "Fast formatter and linter" }, eslint: { label: "ESLint", hint: "Traditional JavaScript linter" }, - oxlint: { label: "Oxlint", hint: "Oxidation compiler linter" }, + oxc: { label: "Oxc", hint: "Oxidation compiler linter" }, } as const; const EDITORS = { diff --git a/apps/cli/src/helpers/core/post-installation.ts b/apps/cli/src/helpers/core/post-installation.ts index da32793d4..4ccc63f13 100644 --- a/apps/cli/src/helpers/core/post-installation.ts +++ b/apps/cli/src/helpers/core/post-installation.ts @@ -70,7 +70,7 @@ export async function displayPostInstallInstructions( addons?.includes("husky") || addons?.includes("biome") || addons?.includes("lefthook") || - addons?.includes("oxlint"); + addons?.includes("oxc"); const databaseInstructions = !isConvex && database !== "none" diff --git a/apps/cli/src/prompts/addons.ts b/apps/cli/src/prompts/addons.ts index c860d5f34..56b71097b 100644 --- a/apps/cli/src/prompts/addons.ts +++ b/apps/cli/src/prompts/addons.ts @@ -39,8 +39,8 @@ function getAddonDisplay(addon: Addons): { label: string; hint: string } { label = "Biome"; hint = "Format, lint, and more"; break; - case "oxlint": - label = "Oxlint"; + case "oxc": + label = "Oxc"; hint = "Oxlint + Oxfmt (linting & formatting)"; break; case "ultracite": @@ -89,7 +89,7 @@ function getAddonDisplay(addon: Addons): { label: string; hint: string } { const ADDON_GROUPS = { "Monorepo & Tasks": ["turborepo", "nx"], - "Code Quality": ["biome", "oxlint", "ultracite", "husky", "lefthook"], + "Code Quality": ["biome", "oxc", "ultracite", "husky", "lefthook"], Documentation: ["starlight", "fumadocs"], "Platform Extensions": ["pwa", "tauri", "electrobun", "opentui", "wxt"], "AI & Agent Tools": ["skills", "mcp"], diff --git a/apps/cli/test/addons.test.ts b/apps/cli/test/addons.test.ts index 0396fe852..d2d1a1d4e 100644 --- a/apps/cli/test/addons.test.ts +++ b/apps/cli/test/addons.test.ts @@ -399,7 +399,7 @@ describe("Addon Configurations", () => { "husky", "turborepo", "nx", - "oxlint", + "oxc", // Note: starlight, ultracite, fumadocs are prompt-controlled only ]; diff --git a/apps/cli/test/external-commands.test.ts b/apps/cli/test/external-commands.test.ts index 28bf7fd1b..71fa78ce2 100644 --- a/apps/cli/test/external-commands.test.ts +++ b/apps/cli/test/external-commands.test.ts @@ -2,7 +2,7 @@ import { describe, expect, it } from "bun:test"; import { mkdir, writeFile } from "node:fs/promises"; import { join } from "node:path"; -import { setupOxlint } from "../src/helpers/addons/oxlint-setup"; +import { setupOxc } from "../src/helpers/addons/oxc-setup"; import { installDependencies } from "../src/helpers/core/install-dependencies"; import { getPackageExecutionArgs } from "../src/utils/package-runner"; import { SMOKE_DIR } from "./setup"; @@ -34,8 +34,8 @@ describe("External Command Guards", () => { expect(result.isOk()).toBe(true); }); - it("should update package.json without running oxlint init in test mode", async () => { - const projectDir = join(SMOKE_DIR, "oxlint-skip"); + it("should update package.json without running oxc init in test mode", async () => { + const projectDir = join(SMOKE_DIR, "oxc-skip"); await mkdir(projectDir, { recursive: true }); const pkgJsonPath = join(projectDir, "package.json"); @@ -43,7 +43,7 @@ describe("External Command Guards", () => { pkgJsonPath, JSON.stringify( { - name: "oxlint-skip", + name: "oxc-skip", version: "0.0.0", scripts: {}, devDependencies: {}, @@ -53,7 +53,7 @@ describe("External Command Guards", () => { ), ); - const result = await setupOxlint(projectDir, "bun"); + const result = await setupOxc(projectDir, "bun"); expect(result.isOk()).toBe(true); const updated = await Bun.file(pkgJsonPath).json(); diff --git a/apps/cli/test/integration.test.ts b/apps/cli/test/integration.test.ts index 7aef9c421..9a50e8217 100644 --- a/apps/cli/test/integration.test.ts +++ b/apps/cli/test/integration.test.ts @@ -78,7 +78,7 @@ describe("Integration Tests - Real World Scenarios", () => { auth: "better-auth", api: "orpc", frontend: ["svelte"], - addons: ["turborepo", "oxlint"], + addons: ["turborepo", "oxc"], examples: ["todo"], // Todo works with Svelte dbSetup: "none", webDeploy: "none", diff --git a/apps/cli/test/silent-create-output.test.ts b/apps/cli/test/silent-create-output.test.ts index 81560eb2e..a42b03570 100644 --- a/apps/cli/test/silent-create-output.test.ts +++ b/apps/cli/test/silent-create-output.test.ts @@ -49,8 +49,8 @@ async function runSilentCreate(testCase: SilentCreateCase) { describe("silent create output", () => { const cases: SilentCreateCase[] = [ { - name: "stays quiet for oxlint addon setup", - projectName: "silent-addon-oxlint", + name: "stays quiet for oxc addon setup", + projectName: "silent-addon-oxc", options: { frontend: ["next"], backend: "hono", @@ -60,7 +60,7 @@ describe("silent create output", () => { api: "none", auth: "none", payments: "none", - addons: ["nx", "oxlint"], + addons: ["nx", "oxc"], examples: [], git: true, packageManager: "pnpm", diff --git a/apps/web/content/docs/cli/options.mdx b/apps/web/content/docs/cli/options.mdx index d845d1a3e..6c0f27458 100644 --- a/apps/web/content/docs/cli/options.mdx +++ b/apps/web/content/docs/cli/options.mdx @@ -313,7 +313,7 @@ Additional features to include: - `turborepo`: Turborepo monorepo setup - `nx`: Nx monorepo setup - `ultracite`: Ultracite configuration -- `oxlint`: Oxlint + Oxfmt (linting & formatting) +- `oxc`: Oxlint + Oxfmt (linting & formatting) - `mcp`: Install MCP servers, including Better T Stack itself, with add-mcp - `opentui`: OpenTUI components - `wxt`: WXT browser extension framework diff --git a/apps/web/content/docs/index.mdx b/apps/web/content/docs/index.mdx index efba4f57f..41314a646 100644 --- a/apps/web/content/docs/index.mdx +++ b/apps/web/content/docs/index.mdx @@ -95,7 +95,7 @@ See the full list in the [CLI Reference](/docs/cli). Key flags: - `--api`: trpc, orpc, none - `--auth`: better-auth, clerk, none - `--payments`: polar, none -- `--addons`: turborepo, nx, pwa, tauri, electrobun, biome, lefthook, husky, starlight, fumadocs, ultracite, oxlint, mcp, opentui, wxt, skills, none +- `--addons`: turborepo, nx, pwa, tauri, electrobun, biome, lefthook, husky, starlight, fumadocs, ultracite, oxc, mcp, opentui, wxt, skills, none - `--examples`: todo, ai, none ## Next Steps diff --git a/apps/web/content/docs/project-structure.mdx b/apps/web/content/docs/project-structure.mdx index 07bdaf057..3817149c2 100644 --- a/apps/web/content/docs/project-structure.mdx +++ b/apps/web/content/docs/project-structure.mdx @@ -436,7 +436,7 @@ Electrobun adds an `apps/desktop` workspace with its own `package.json`, `electr "backend": "", "runtime": "", "frontend": [""] , - "addons": [""] , + "addons": [""] , "examples": [""] , "auth": <"better-auth"|"clerk"|"none">, "packageManager": "", diff --git a/apps/web/src/lib/constant.ts b/apps/web/src/lib/constant.ts index d969a3702..4beb7a02f 100644 --- a/apps/web/src/lib/constant.ts +++ b/apps/web/src/lib/constant.ts @@ -555,8 +555,8 @@ export const TECH_OPTIONS: Record< default: false, }, { - id: "oxlint", - name: "Oxlint", + id: "oxc", + name: "Oxc", description: "Oxlint + Oxfmt (linting & formatting)", icon: `${ICON_BASE_URL}/oxc.svg`, color: "from-orange-500 to-orange-700", diff --git a/apps/web/src/lib/stack-utils.ts b/apps/web/src/lib/stack-utils.ts index d05ea8284..5770ed1f3 100644 --- a/apps/web/src/lib/stack-utils.ts +++ b/apps/web/src/lib/stack-utils.ts @@ -156,7 +156,7 @@ export function generateStackCommand(stack: StackState) { "nx", "ultracite", "fumadocs", - "oxlint", + "oxc", "opentui", "wxt", "skills", diff --git a/packages/template-generator/src/processors/readme-generator.ts b/packages/template-generator/src/processors/readme-generator.ts index 9da316e76..db437b87c 100644 --- a/packages/template-generator/src/processors/readme-generator.ts +++ b/packages/template-generator/src/processors/readme-generator.ts @@ -546,7 +546,7 @@ function generateFeaturesList( tauri: "- **Tauri** - Build native desktop applications", electrobun: "- **Electrobun** - Lightweight desktop shell for web frontends", biome: "- **Biome** - Linting and formatting", - oxlint: "- **Oxlint** - Oxlint + Oxfmt (linting & formatting)", + oxc: "- **Oxc** - Oxlint + Oxfmt (linting & formatting)", husky: "- **Husky** - Git hooks for code quality", starlight: "- **Starlight** - Documentation site with Astro", turborepo: "- **Turborepo** - Optimized monorepo build system", @@ -686,7 +686,7 @@ function generateScriptsList( scripts += `\n- \`${packageManagerRunCmd} check\`: Run Biome formatting and linting`; } - if (addons.includes("oxlint")) { + if (addons.includes("oxc")) { scripts += `\n- \`${packageManagerRunCmd} check\`: Run Oxlint and Oxfmt`; } @@ -769,7 +769,7 @@ function generateGitHooksSection( addons: ProjectConfig["addons"], ): string { const hasHusky = addons.includes("husky"); - const hasLinting = addons.includes("biome") || addons.includes("oxlint"); + const hasLinting = addons.includes("biome") || addons.includes("oxc"); if (!hasHusky && !hasLinting) { return ""; diff --git a/packages/template-generator/src/templates.generated.ts b/packages/template-generator/src/templates.generated.ts index 9f6bc7170..b6ff846ae 100644 --- a/packages/template-generator/src/templates.generated.ts +++ b/packages/template-generator/src/templates.generated.ts @@ -221,7 +221,7 @@ pre-commit: glob: "*.{js,ts,cjs,mjs,d.cts,d.mts,jsx,tsx,json,jsonc}" run: {{packageManager}} biome check --write --no-errors-on-unmatched --files-ignore-unknown=true {staged_files} stage_fixed: true -{{else if (includes addons "oxlint")}} +{{else if (includes addons "oxc")}} - name: oxlint run: {{packageManager}} oxlint --fix {staged_files} stage_fixed: true diff --git a/packages/template-generator/templates/addons/lefthook/lefthook.yml.hbs b/packages/template-generator/templates/addons/lefthook/lefthook.yml.hbs index 26b6bb22d..3b1c46dfd 100644 --- a/packages/template-generator/templates/addons/lefthook/lefthook.yml.hbs +++ b/packages/template-generator/templates/addons/lefthook/lefthook.yml.hbs @@ -9,7 +9,7 @@ pre-commit: glob: "*.{js,ts,cjs,mjs,d.cts,d.mts,jsx,tsx,json,jsonc}" run: {{packageManager}} biome check --write --no-errors-on-unmatched --files-ignore-unknown=true {staged_files} stage_fixed: true -{{else if (includes addons "oxlint")}} +{{else if (includes addons "oxc")}} - name: oxlint run: {{packageManager}} oxlint --fix {staged_files} stage_fixed: true diff --git a/packages/types/src/schemas.ts b/packages/types/src/schemas.ts index 558abcbb2..322d99245 100644 --- a/packages/types/src/schemas.ts +++ b/packages/types/src/schemas.ts @@ -45,7 +45,7 @@ export const AddonsSchema = z "nx", "fumadocs", "ultracite", - "oxlint", + "oxc", "opentui", "wxt", "skills", @@ -224,7 +224,7 @@ export const SkillSelectionSchema = z.strictObject({ }); export const UltraciteLinterSchema = z - .enum(["biome", "eslint", "oxlint"]) + .enum(["biome", "eslint", "oxc"]) .describe("Ultracite linter"); export const UltraciteEditorSchema = z