This commit is contained in:
@@ -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`
|
||||
|
||||
@@ -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",
|
||||
});
|
||||
},
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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">&</div>
|
||||
<img
|
||||
className="dark:invert"
|
||||
src="/bknd.svg"
|
||||
alt="bknd logo"
|
||||
src="/userbase.svg"
|
||||
alt="userbase logo"
|
||||
width={183}
|
||||
height={59}
|
||||
/>
|
||||
|
||||
@@ -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">&</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"
|
||||
>
|
||||
|
||||
Reference in New Issue
Block a user