kitcn
Version:
kitcn - React Query integration and CLI tools for Convex
115 lines (90 loc) • 2.87 kB
Markdown
## 8.B TanStack Start
CLI-first flow: scaffold the app, run `kitcn add auth --yes`, then treat the
files below as the generated reference output. They are not a separate manual
install path.
After changing plugins or auth fields in `<functionsDir>/auth.ts`, refresh
auth-owned schema blocks with `bunx kitcn add auth --schema --yes`. Keep
`bunx kitcn dev` running as the local Convex + codegen loop.
### 8.B.1 Auth client + auth server helpers
**Create:** `src/lib/convex/auth-client.ts`
```ts
import { createAuthClient } from "better-auth/react";
import { convexClient } from "kitcn/auth/client";
import { createAuthMutations } from "kitcn/react";
export const authClient = createAuthClient({
baseURL:
typeof window === "undefined"
? (import.meta.env.VITE_SITE_URL as string | undefined)
: window.location.origin,
plugins: [convexClient()],
});
export const {
useSignInMutationOptions,
useSignOutMutationOptions,
useSignUpMutationOptions,
} = createAuthMutations(authClient);
```
**Create:** `src/lib/convex/auth-server.ts`
```ts
import { convexBetterAuthReactStart } from "kitcn/auth/start";
export const {
handler,
getToken,
fetchAuthQuery,
fetchAuthMutation,
fetchAuthAction,
} = convexBetterAuthReactStart({
convexUrl: import.meta.env.VITE_CONVEX_URL!,
convexSiteUrl: import.meta.env.VITE_CONVEX_SITE_URL!,
});
```
### 8.B.2 Auth API endpoint
**Create:** `src/routes/api/auth/$.ts`
```ts
import { createFileRoute } from "@tanstack/react-router";
import { handler } from "@/lib/convex/auth-server";
export const Route = createFileRoute("/api/auth/$" as never)({
server: {
handlers: {
GET: ({ request }) => handler(request),
POST: ({ request }) => handler(request),
},
},
});
```
### 8.B.3 Caller/context and providers
**Create:** `src/lib/convex/server.ts`
```ts
import { api } from "@convex/api";
import { getRequestHeaders } from "@tanstack/react-start/server";
import { createCallerFactory } from "kitcn/server";
import { getToken } from "@/lib/convex/auth-server";
const { createContext, createCaller } = createCallerFactory({
api,
convexSiteUrl: import.meta.env.VITE_CONVEX_SITE_URL!,
auth: {
getToken: async () => {
return {
token: await getToken(),
};
},
},
});
type ServerCaller = ReturnType<typeof createCaller>;
async function makeContext() {
const headers = await getRequestHeaders();
return createContext({ headers });
}
function createServerCaller(): ServerCaller {
return createCaller(async () => {
return await makeContext();
});
}
export function runServerCall<T>(fn: (caller: ServerCaller) => Promise<T> | T) {
const caller = createServerCaller();
return fn(caller);
}
```
Use the docs pattern from `tanstack-start.mdx` for:
- `src/routes/__root.tsx` shell/provider wiring
- `src/lib/convex/convex-provider.tsx`