bknd is dead long live userbase
Run Tests / test (pull_request) Successful in 4m57s

This commit is contained in:
2026-09-27 19:34:06 +05:30
parent 05e0086fcd
commit 0bfcb5ad71
529 changed files with 2385 additions and 2924 deletions
+5 -5
View File
@@ -1,6 +1,6 @@
# bknd + Tanstack Start Example
# userbase + Tanstack Start Example
This is a minimal example to shows how to integrate bknd with Tanstack Start.
This is a minimal example to shows how to integrate userbase with Tanstack Start.
## Setup
@@ -11,8 +11,8 @@ bun run dev
## How it works
1. **`bknd.config.ts`** - bknd configuration with database connection, schema, and seed data
2. **`src/routes/api.$.ts`** - Handles `/api/*` requests for bknd
1. **`userbase.config.ts`** - userbase configuration with database connection, schema, and seed data
2. **`src/routes/api.$.ts`** - Handles `/api/*` requests for userbase
3. **`src/routes/index.tsx`** - Using `getApp()` to fetch data in loader
3. **`src/routes/ssr.tsx`** - Server Side example with `getApp()` to fetch data on server
@@ -24,5 +24,5 @@ bun run dev
## Test Credentials
- Email: `test@bknd.io`
- Email: `test@userbase.io`
- Password: `12345678`
+6 -6
View File
@@ -1,6 +1,6 @@
import { em, entity, text, boolean } from "bknd";
import { registerLocalMediaAdapter } from "bknd/adapter/node";
import { TanstackStartConfig } from "bknd/adapter/tanstack-start";
import { em, entity, text, boolean } from "userbase";
import { registerLocalMediaAdapter } from "userbase/adapter/node";
import { TanstackStartConfig } from "userbase/adapter/tanstack-start";
const local = registerLocalMediaAdapter();
@@ -13,7 +13,7 @@ const schema = em({
// register your schema to get automatic type completion
type Database = (typeof schema)["DB"];
declare module "bknd" {
declare module "userbase" {
interface DB extends Database {}
}
@@ -26,13 +26,13 @@ export default {
seed: async (ctx) => {
// create some entries
await ctx.em.mutator("todos").insertMany([
{ title: "Learn bknd", done: true },
{ title: "Learn userbase", done: true },
{ title: "Build something cool", done: false },
]);
// and create a user
await ctx.app.module.auth.createUser({
email: "test@bknd.io",
email: "test@userbase.io",
password: "12345678",
});
},
+2 -2
View File
@@ -1,5 +1,5 @@
{
"name": "my-bknd-app",
"name": "my-userbase-app",
"private": true,
"type": "module",
"scripts": {
@@ -16,7 +16,7 @@
"@tanstack/react-router-ssr-query": "^1.131.7",
"@tanstack/react-start": "^1.132.0",
"@tanstack/router-plugin": "^1.132.0",
"bknd": "file:../../app",
"userbase": "file:../../app",
"lucide-react": "^0.561.0",
"nitro": "^3.0.1-alpha.2",
"react": "^19.2.0",
+3 -2
View File
@@ -1,5 +1,6 @@
import config from "../bknd.config";
import { getApp } from "bknd/adapter/tanstack-start";
import config from "../userbase.config";
import { getApp } from "userbase/adapter/tanstack-start";
export async function getApi({
headers,
@@ -34,7 +34,7 @@ export function Footer() {
</Link>
<Link
className="flex items-center gap-2 hover:underline hover:underline-offset-4"
to={"https://bknd.io" as string}
to={"https://userbase.io" as string}
target="_blank"
rel="noopener noreferrer"
>
@@ -45,7 +45,7 @@ export function Footer() {
width={16}
height={16}
/>
Go to bknd.io →
Go to userbase.io →
</Link>
</footer>
);
@@ -1,7 +1,7 @@
import { HeadContent, Scripts, createRootRoute } from "@tanstack/react-router";
import { TanStackRouterDevtoolsPanel } from "@tanstack/react-router-devtools";
import { TanStackDevtools } from "@tanstack/react-devtools";
import { ClientProvider } from "bknd/client";
import { ClientProvider } from "userbase/client";
import appCss from "../styles.css?url";
@@ -16,7 +16,7 @@ export const Route = createRootRoute({
content: "width=device-width, initial-scale=1",
},
{
title: "TanStack 🤝 Bknd.io",
title: "TanStack 🤝 Userbase.io",
},
],
links: [
@@ -1,7 +1,7 @@
import { createFileRoute } from "@tanstack/react-router";
import { useAuth } from "bknd/client";
import "bknd/dist/styles.css";
import { Admin } from "bknd/ui";
import { useAuth } from "userbase/client";
import "userbase/dist/styles.css";
import { Admin } from "userbase/ui";
export const Route = createFileRoute("/admin/$")({
ssr: false, // "data-only" works too
+2 -2
View File
@@ -1,6 +1,6 @@
import { createFileRoute } from "@tanstack/react-router";
import config from "../../bknd.config";
import { serve } from "bknd/adapter/tanstack-start";
import config from "../../userbase.config";
import { serve } from "userbase/adapter/tanstack-start";
const handler = serve(config);
+3 -3
View File
@@ -2,7 +2,7 @@ import {
createFileRoute,
useRouter,
} from "@tanstack/react-router";
import { getApi } from "@/bknd";
import { getApi } from "@/userbase";
import { createServerFn, useServerFn } from "@tanstack/react-start";
import { Footer } from "@/components/Footer";
import { List } from "@/components/List";
@@ -83,8 +83,8 @@ function App() {
<div className="ml-3.5 mr-2 font-mono opacity-70">&amp;</div>
<img
className="dark:invert"
src="/bknd.svg"
alt="bknd logo"
src="/userbase.svg"
alt="userbase logo"
width={183}
height={59}
/>
+9 -9
View File
@@ -1,4 +1,4 @@
import { getApi } from "@/bknd";
import { getApi } from "@/userbase";
import { createServerFn } from "@tanstack/react-start";
import { Link } from "@tanstack/react-router";
import { createFileRoute } from "@tanstack/react-router";
@@ -43,8 +43,8 @@ function RouteComponent() {
<div className="ml-3.5 mr-2 font-mono opacity-70">&amp;</div>
<img
className="dark:invert"
src="/bknd.svg"
alt="bknd logo"
src="/userbase.svg"
alt="userbase logo"
width={183}
height={59}
/>
@@ -77,7 +77,7 @@ function RouteComponent() {
<p className="text-xs opacity-50">
Sign in with:{" "}
<b>
<code>test@bknd.io</code>
<code>test@userbase.io</code>
</b>{" "}
/{" "}
<b>
@@ -98,22 +98,22 @@ function Buttons() {
<div className="flex gap-4 items-center flex-col sm:flex-row">
<a
className="rounded-full border border-solid border-transparent transition-colors flex items-center justify-center bg-foreground gap-2 text-white hover:bg-[#383838] dark:hover:bg-[#ccc] text-sm sm:text-base h-10 sm:h-12 px-4 sm:px-5"
href="https://bknd.io/"
href="https://userbase.io/"
target="_blank"
rel="noopener noreferrer"
>
<img
className="grayscale"
src="/bknd.ico"
alt="bknd logomark"
src="/userbase.ico"
alt="userbase logomark"
width={20}
height={20}
/>
Go To Bknd.io
Go To Userbase.io
</a>
<a
className="rounded-full border border-solid border-black/[.08] dark:border-white/[.145] transition-colors flex items-center justify-center hover:bg-[#f2f2f2] dark:hover:bg-[#1a1a1a] hover:border-transparent text-sm sm:text-base h-10 sm:h-12 px-4 sm:px-5 sm:min-w-44"
href="https://docs.bknd.io/integration/tanstack-start"
href="https://docs.userbase.io/integration/tanstack-start"
target="_blank"
rel="noopener noreferrer"
>