diff --git a/.changeset/busy-foxes-love.md b/.changeset/busy-foxes-love.md new file mode 100644 index 0000000..d27e5dc --- /dev/null +++ b/.changeset/busy-foxes-love.md @@ -0,0 +1,5 @@ +--- +"create-better-t-stack": patch +--- + +simplify auth setup diff --git a/apps/cli/src/helpers/auth-setup.ts b/apps/cli/src/helpers/auth-setup.ts index 0b8bce6..313d383 100644 --- a/apps/cli/src/helpers/auth-setup.ts +++ b/apps/cli/src/helpers/auth-setup.ts @@ -5,7 +5,7 @@ import pc from "picocolors"; import { PKG_ROOT } from "../constants"; import type { ProjectConfig } from "../types"; -export async function configureAuth( +export async function setupAuth( projectDir: string, enableAuth: boolean, hasDatabase: boolean, @@ -16,177 +16,98 @@ export async function configureAuth( try { if (!enableAuth) { - await fs.remove(path.join(clientDir, "src/components/sign-up-form.tsx")); - await fs.remove(path.join(clientDir, "src/components/sign-in-form.tsx")); - await fs.remove(path.join(clientDir, "src/components/auth-forms.tsx")); - await fs.remove(path.join(clientDir, "src/components/user-menu.tsx")); - await fs.remove(path.join(clientDir, "src/lib/auth-client.ts")); + return; + } - const indexRoutePath = path.join(clientDir, "src/routes/index.tsx"); - const indexRouteContent = await fs.readFile(indexRoutePath, "utf8"); - const updatedIndexRouteContent = indexRouteContent - .replace(/import AuthForms from "@\/components\/auth-forms";\n/, "") - .replace(//, ""); - await fs.writeFile(indexRoutePath, updatedIndexRouteContent, "utf8"); - - await fs.remove(path.join(serverDir, "src/lib/auth.ts")); - - const indexFilePath = path.join(serverDir, "src/index.ts"); - const indexContent = await fs.readFile(indexFilePath, "utf8"); - const updatedIndexContent = indexContent - .replace(/import { auth } from "\.\/lib\/auth";\n/, "") - .replace( - /app\.on\(\["POST", "GET"\], "\/api\/auth\/\*\*", \(c\) => auth\.handler\(c\.req\.raw\)\);\n\n/, - "", - ); - await fs.writeFile(indexFilePath, updatedIndexContent, "utf8"); - - const contextFilePath = path.join(serverDir, "src/lib/context.ts"); - const contextContent = await fs.readFile(contextFilePath, "utf8"); - const updatedContextContent = contextContent - .replace(/import { auth } from "\.\/auth";\n/, "") - .replace( - /const session = await auth\.api\.getSession\({\n\s+headers: hono\.req\.raw\.headers,\n\s+}\);/, - "const session = null;", - ); - await fs.writeFile(contextFilePath, updatedContextContent, "utf8"); - } else if (!hasDatabase) { + if (!hasDatabase) { log.warn( pc.yellow( "Authentication enabled but no database selected. Auth will not function properly.", ), ); - } else { - const envPath = path.join(serverDir, ".env"); - const templateEnvPath = path.join( - PKG_ROOT, - getOrmTemplatePath( - options.orm, - options.database, - "packages/server/_env", - ), - ); + return; + } - if (!(await fs.pathExists(envPath))) { - if (await fs.pathExists(templateEnvPath)) { - await fs.copy(templateEnvPath, envPath); - } else { - const defaultEnv = `BETTER_AUTH_SECRET=${generateAuthSecret()} + const envPath = path.join(serverDir, ".env"); + const templateEnvPath = path.join( + PKG_ROOT, + getOrmTemplatePath(options.orm, options.database, "packages/server/_env"), + ); + + if (!(await fs.pathExists(envPath))) { + if (await fs.pathExists(templateEnvPath)) { + await fs.copy(templateEnvPath, envPath); + } else { + const defaultEnv = `BETTER_AUTH_SECRET=${generateAuthSecret()} BETTER_AUTH_URL=http://localhost:3000 CORS_ORIGIN=http://localhost:3001 ${options.database === "sqlite" ? "TURSO_CONNECTION_URL=http://127.0.0.1:8080" : ""} ${options.orm === "prisma" ? 'DATABASE_URL="file:./dev.db"' : ""} `; - await fs.writeFile(envPath, defaultEnv); - } - } else { - let envContent = await fs.readFile(envPath, "utf8"); + await fs.writeFile(envPath, defaultEnv); + } + } else { + let envContent = await fs.readFile(envPath, "utf8"); - if (!envContent.includes("BETTER_AUTH_SECRET")) { - envContent += `\nBETTER_AUTH_SECRET=${generateAuthSecret()}`; - } - - if (!envContent.includes("BETTER_AUTH_URL")) { - envContent += "\nBETTER_AUTH_URL=http://localhost:3000"; - } - - if (!envContent.includes("CORS_ORIGIN")) { - envContent += "\nCORS_ORIGIN=http://localhost:3001"; - } - - if ( - options.database === "sqlite" && - !envContent.includes("TURSO_CONNECTION_URL") - ) { - envContent += "\nTURSO_CONNECTION_URL=http://127.0.0.1:8080"; - } - - if (options.orm === "prisma" && !envContent.includes("DATABASE_URL")) { - envContent += '\nDATABASE_URL="file:./dev.db"'; - } - - await fs.writeFile(envPath, envContent); + if (!envContent.includes("BETTER_AUTH_SECRET")) { + envContent += `\nBETTER_AUTH_SECRET=${generateAuthSecret()}`; } - const clientEnvPath = path.join(clientDir, ".env"); - if (!(await fs.pathExists(clientEnvPath))) { - const clientEnvContent = "VITE_SERVER_URL=http://localhost:3000\n"; - await fs.writeFile(clientEnvPath, clientEnvContent); + if (!envContent.includes("BETTER_AUTH_URL")) { + envContent += "\nBETTER_AUTH_URL=http://localhost:3000"; } - if (options.orm === "prisma") { - const prismaAuthPath = path.join(serverDir, "src/lib/auth.ts"); - const defaultPrismaAuthPath = path.join( - PKG_ROOT, - getOrmTemplatePath( - options.orm, - options.database, - "packages/server/src/lib/auth.ts", - ), - ); + if (!envContent.includes("CORS_ORIGIN")) { + envContent += "\nCORS_ORIGIN=http://localhost:3001"; + } - if ( - (await fs.pathExists(defaultPrismaAuthPath)) && - !(await fs.pathExists(prismaAuthPath)) - ) { - await fs.ensureDir(path.dirname(prismaAuthPath)); - await fs.copy(defaultPrismaAuthPath, prismaAuthPath); - } + if ( + options.database === "sqlite" && + !envContent.includes("TURSO_CONNECTION_URL") + ) { + envContent += "\nTURSO_CONNECTION_URL=http://127.0.0.1:8080"; + } - let authContent = await fs.readFile(prismaAuthPath, "utf8"); - if (!authContent.includes("trustedOrigins")) { - authContent = authContent.replace( - "export const auth = betterAuth({", - "export const auth = betterAuth({\n trustedOrigins: [process.env.CORS_ORIGIN!],", - ); - await fs.writeFile(prismaAuthPath, authContent); - } + if (options.orm === "prisma" && !envContent.includes("DATABASE_URL")) { + envContent += '\nDATABASE_URL="file:./dev.db"'; + } - const packageJsonPath = path.join(projectDir, "package.json"); - if (await fs.pathExists(packageJsonPath)) { - const packageJson = await fs.readJson(packageJsonPath); + await fs.writeFile(envPath, envContent); + } - packageJson.scripts["prisma:generate"] = - "cd packages/server && npx prisma generate"; - packageJson.scripts["prisma:push"] = - "cd packages/server && npx prisma db push"; - packageJson.scripts["prisma:studio"] = - "cd packages/server && npx prisma studio"; - packageJson.scripts["db:setup"] = - "npm run auth:generate && npm run prisma:generate && npm run prisma:push"; + const clientEnvPath = path.join(clientDir, ".env"); + if (!(await fs.pathExists(clientEnvPath))) { + const clientEnvContent = "VITE_SERVER_URL=http://localhost:3000\n"; + await fs.writeFile(clientEnvPath, clientEnvContent); + } - await fs.writeJson(packageJsonPath, packageJson, { spaces: 2 }); - } - } else if (options.orm === "drizzle") { - const drizzleAuthPath = path.join(serverDir, "src/lib/auth.ts"); - const defaultDrizzleAuthPath = path.join( - PKG_ROOT, - getOrmTemplatePath( - options.orm, - options.database, - "packages/server/src/lib/auth.ts", - ), - ); + if (options.orm === "prisma") { + const packageJsonPath = path.join(projectDir, "package.json"); + if (await fs.pathExists(packageJsonPath)) { + const packageJson = await fs.readJson(packageJsonPath); - if ( - (await fs.pathExists(defaultDrizzleAuthPath)) && - !(await fs.pathExists(drizzleAuthPath)) - ) { - await fs.ensureDir(path.dirname(drizzleAuthPath)); - await fs.copy(defaultDrizzleAuthPath, drizzleAuthPath); - } + packageJson.scripts["prisma:generate"] = + "cd packages/server && npx prisma generate"; + packageJson.scripts["prisma:push"] = + "cd packages/server && npx prisma db push"; + packageJson.scripts["prisma:studio"] = + "cd packages/server && npx prisma studio"; + packageJson.scripts["db:setup"] = + "npm run auth:generate && npm run prisma:generate && npm run prisma:push"; - const packageJsonPath = path.join(projectDir, "package.json"); - if (await fs.pathExists(packageJsonPath)) { - const packageJson = await fs.readJson(packageJsonPath); + await fs.writeJson(packageJsonPath, packageJson, { spaces: 2 }); + } + } else if (options.orm === "drizzle") { + const packageJsonPath = path.join(projectDir, "package.json"); + if (await fs.pathExists(packageJsonPath)) { + const packageJson = await fs.readJson(packageJsonPath); - packageJson.scripts["db:push"] = - "cd packages/server && npx @better-auth/cli migrate"; - packageJson.scripts["db:setup"] = - "npm run auth:generate && npm run db:push"; + packageJson.scripts["db:push"] = + "cd packages/server && npx @better-auth/cli migrate"; + packageJson.scripts["db:setup"] = + "npm run auth:generate && npm run db:push"; - await fs.writeJson(packageJsonPath, packageJson, { spaces: 2 }); - } + await fs.writeJson(packageJsonPath, packageJson, { spaces: 2 }); } } } catch (error) { diff --git a/apps/cli/src/helpers/create-project.ts b/apps/cli/src/helpers/create-project.ts index 70c7294..7a15cb7 100644 --- a/apps/cli/src/helpers/create-project.ts +++ b/apps/cli/src/helpers/create-project.ts @@ -6,7 +6,7 @@ import pc from "picocolors"; import { PKG_ROOT } from "../constants"; import type { ProjectConfig } from "../types"; import { setupAddons } from "./addons-setup"; -import { configureAuth } from "./auth-setup"; +import { setupAuth } from "./auth-setup"; import { createReadme } from "./create-readme"; import { setupDatabase } from "./db-setup"; import { displayPostInstallInstructions } from "./post-installation"; @@ -24,6 +24,13 @@ export async function createProject(options: ProjectConfig): Promise { } await fs.copy(templateDir, projectDir); + if (options.auth) { + const authTemplateDir = path.join(PKG_ROOT, "template/with-auth"); + if (await fs.pathExists(authTemplateDir)) { + await fs.copy(authTemplateDir, projectDir, { overwrite: true }); + } + } + if (options.orm !== "none" && options.database !== "none") { const ormTemplateDir = path.join( PKG_ROOT, @@ -40,6 +47,10 @@ export async function createProject(options: ProjectConfig): Promise { path.join(projectDir, "packages/server/_env"), path.join(projectDir, "packages/server/.env"), ], + [ + path.join(projectDir, "packages/client/_env"), + path.join(projectDir, "packages/client/.env"), + ], ]; for (const [source, target] of envFiles) { @@ -58,7 +69,8 @@ export async function createProject(options: ProjectConfig): Promise { options.orm, options.turso ?? options.database === "sqlite", ); - await configureAuth( + + await setupAuth( projectDir, options.auth, options.database !== "none", diff --git a/apps/cli/template/base/packages/client/src/components/header.tsx b/apps/cli/template/base/packages/client/src/components/header.tsx index daa8fab..f370e69 100644 --- a/apps/cli/template/base/packages/client/src/components/header.tsx +++ b/apps/cli/template/base/packages/client/src/components/header.tsx @@ -1,6 +1,5 @@ import { Link } from "@tanstack/react-router"; import { ModeToggle } from "./mode-toggle"; -import UserMenu from "./user-menu"; export default function Header() { return ( @@ -16,27 +15,9 @@ export default function Header() { > Home - - Dashboard - - - About -
-

diff --git a/apps/cli/template/base/packages/client/src/routes/about.tsx b/apps/cli/template/base/packages/client/src/routes/about.tsx deleted file mode 100644 index 494ba18..0000000 --- a/apps/cli/template/base/packages/client/src/routes/about.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { createFileRoute } from "@tanstack/react-router"; - -export const Route = createFileRoute("/about")({ - component: AboutComponent, -}); - -function AboutComponent() { - return ( -
-

About

-
- ); -} diff --git a/apps/cli/template/base/packages/client/src/routes/index.tsx b/apps/cli/template/base/packages/client/src/routes/index.tsx index 3f656e4..5a6c792 100644 --- a/apps/cli/template/base/packages/client/src/routes/index.tsx +++ b/apps/cli/template/base/packages/client/src/routes/index.tsx @@ -1,4 +1,3 @@ -import AuthForms from "@/components/auth-forms"; import { trpc } from "@/utils/trpc"; import { createFileRoute, Link } from "@tanstack/react-router"; @@ -13,7 +12,6 @@ function HomeComponent() {

Welcome Home!

Go to Dashboard

healthCheck: {healthCheck.data}

- ); } diff --git a/apps/cli/template/base/packages/server/src/index.ts b/apps/cli/template/base/packages/server/src/index.ts index c0715ae..9ea53d1 100644 --- a/apps/cli/template/base/packages/server/src/index.ts +++ b/apps/cli/template/base/packages/server/src/index.ts @@ -4,7 +4,6 @@ import "dotenv/config"; import { Hono } from "hono"; import { cors } from "hono/cors"; import { logger } from "hono/logger"; -import { auth } from "./lib/auth"; import { createContext } from "./lib/context"; import { appRouter } from "./routers/index"; @@ -17,13 +16,9 @@ app.use( cors({ origin: process.env.CORS_ORIGIN!, allowMethods: ["GET", "POST", "OPTIONS"], - allowHeaders: ["Content-Type", "Authorization"], - credentials: true, }), ); -app.on(["POST", "GET"], "/api/auth/**", (c) => auth.handler(c.req.raw)); - app.use( "/trpc/*", trpcServer({ diff --git a/apps/cli/template/base/packages/server/src/lib/context.ts b/apps/cli/template/base/packages/server/src/lib/context.ts index c6eb0d8..3cad65f 100644 --- a/apps/cli/template/base/packages/server/src/lib/context.ts +++ b/apps/cli/template/base/packages/server/src/lib/context.ts @@ -1,17 +1,12 @@ import type { Context as HonoContext } from "hono"; -import { auth } from "./auth"; export type CreateContextOptions = { hono: HonoContext; }; export async function createContext({ hono }: CreateContextOptions) { - const session = await auth.api.getSession({ - headers: hono.req.raw.headers, - }); - return { - session, + session: null, }; } diff --git a/apps/cli/template/base/packages/server/src/lib/trpc.ts b/apps/cli/template/base/packages/server/src/lib/trpc.ts index 3affce2..44277fa 100644 --- a/apps/cli/template/base/packages/server/src/lib/trpc.ts +++ b/apps/cli/template/base/packages/server/src/lib/trpc.ts @@ -6,19 +6,3 @@ export const t = initTRPC.context().create(); export const router = t.router; export const publicProcedure = t.procedure; - -export const protectedProcedure = t.procedure.use(({ ctx, next }) => { - if (!ctx.session) { - throw new TRPCError({ - code: "UNAUTHORIZED", - message: "Authentication required", - cause: "No session", - }); - } - return next({ - ctx: { - ...ctx, - session: ctx.session, - }, - }); -}); diff --git a/apps/cli/template/base/packages/server/src/routers/index.ts b/apps/cli/template/base/packages/server/src/routers/index.ts index 5129087..b62cd06 100644 --- a/apps/cli/template/base/packages/server/src/routers/index.ts +++ b/apps/cli/template/base/packages/server/src/routers/index.ts @@ -1,15 +1,9 @@ -import { router, publicProcedure, protectedProcedure } from "../lib/trpc"; +import { router, publicProcedure } from "../lib/trpc"; export const appRouter = router({ healthCheck: publicProcedure.query(() => { return "OK"; }), - privateData: protectedProcedure.query(({ ctx }) => { - return { - message: "This is private", - user: ctx.session.user, - }; - }), }); export type AppRouter = typeof appRouter; diff --git a/apps/cli/template/base/packages/client/_env b/apps/cli/template/with-auth/packages/client/_env similarity index 100% rename from apps/cli/template/base/packages/client/_env rename to apps/cli/template/with-auth/packages/client/_env diff --git a/apps/cli/template/base/packages/client/src/components/auth-forms.tsx b/apps/cli/template/with-auth/packages/client/src/components/auth-forms.tsx similarity index 100% rename from apps/cli/template/base/packages/client/src/components/auth-forms.tsx rename to apps/cli/template/with-auth/packages/client/src/components/auth-forms.tsx diff --git a/apps/cli/template/with-auth/packages/client/src/components/header.tsx b/apps/cli/template/with-auth/packages/client/src/components/header.tsx new file mode 100644 index 0000000..184a111 --- /dev/null +++ b/apps/cli/template/with-auth/packages/client/src/components/header.tsx @@ -0,0 +1,37 @@ +import { Link } from "@tanstack/react-router"; +import { ModeToggle } from "./mode-toggle"; +import UserMenu from "./user-menu"; + +export default function Header() { + return ( +
+
+
+ + Home + + + Dashboard + +
+
+ + +
+
+
+
+ ); +} diff --git a/apps/cli/template/base/packages/client/src/components/sign-in-form.tsx b/apps/cli/template/with-auth/packages/client/src/components/sign-in-form.tsx similarity index 100% rename from apps/cli/template/base/packages/client/src/components/sign-in-form.tsx rename to apps/cli/template/with-auth/packages/client/src/components/sign-in-form.tsx diff --git a/apps/cli/template/base/packages/client/src/components/sign-up-form.tsx b/apps/cli/template/with-auth/packages/client/src/components/sign-up-form.tsx similarity index 100% rename from apps/cli/template/base/packages/client/src/components/sign-up-form.tsx rename to apps/cli/template/with-auth/packages/client/src/components/sign-up-form.tsx diff --git a/apps/cli/template/base/packages/client/src/components/user-menu.tsx b/apps/cli/template/with-auth/packages/client/src/components/user-menu.tsx similarity index 100% rename from apps/cli/template/base/packages/client/src/components/user-menu.tsx rename to apps/cli/template/with-auth/packages/client/src/components/user-menu.tsx diff --git a/apps/cli/template/base/packages/client/src/lib/auth-client.ts b/apps/cli/template/with-auth/packages/client/src/lib/auth-client.ts similarity index 100% rename from apps/cli/template/base/packages/client/src/lib/auth-client.ts rename to apps/cli/template/with-auth/packages/client/src/lib/auth-client.ts diff --git a/apps/cli/template/base/packages/client/src/routes/dashboard.tsx b/apps/cli/template/with-auth/packages/client/src/routes/dashboard.tsx similarity index 100% rename from apps/cli/template/base/packages/client/src/routes/dashboard.tsx rename to apps/cli/template/with-auth/packages/client/src/routes/dashboard.tsx diff --git a/apps/cli/template/with-auth/packages/client/src/routes/index.tsx b/apps/cli/template/with-auth/packages/client/src/routes/index.tsx new file mode 100644 index 0000000..3f656e4 --- /dev/null +++ b/apps/cli/template/with-auth/packages/client/src/routes/index.tsx @@ -0,0 +1,19 @@ +import AuthForms from "@/components/auth-forms"; +import { trpc } from "@/utils/trpc"; +import { createFileRoute, Link } from "@tanstack/react-router"; + +export const Route = createFileRoute("/")({ + component: HomeComponent, +}); + +function HomeComponent() { + const healthCheck = trpc.healthCheck.useQuery(); + return ( +
+

Welcome Home!

+ Go to Dashboard +

healthCheck: {healthCheck.data}

+ +
+ ); +} diff --git a/apps/cli/template/with-auth/packages/server/src/index.ts b/apps/cli/template/with-auth/packages/server/src/index.ts new file mode 100644 index 0000000..c0715ae --- /dev/null +++ b/apps/cli/template/with-auth/packages/server/src/index.ts @@ -0,0 +1,47 @@ +import { serve } from "@hono/node-server"; +import { trpcServer } from "@hono/trpc-server"; +import "dotenv/config"; +import { Hono } from "hono"; +import { cors } from "hono/cors"; +import { logger } from "hono/logger"; +import { auth } from "./lib/auth"; +import { createContext } from "./lib/context"; +import { appRouter } from "./routers/index"; + +const app = new Hono(); + +app.use(logger()); + +app.use( + "/*", + cors({ + origin: process.env.CORS_ORIGIN!, + allowMethods: ["GET", "POST", "OPTIONS"], + allowHeaders: ["Content-Type", "Authorization"], + credentials: true, + }), +); + +app.on(["POST", "GET"], "/api/auth/**", (c) => auth.handler(c.req.raw)); + +app.use( + "/trpc/*", + trpcServer({ + router: appRouter, + createContext: (_opts, hono) => { + return createContext({ hono }); + }, + }), +); + +app.get("/healthCheck", (c) => { + return c.text("OK"); +}); + +const port = 3000; +console.log(`Server is running on http://localhost:${port}`); + +serve({ + fetch: app.fetch, + port, +}); diff --git a/apps/cli/template/with-auth/packages/server/src/lib/trpc.ts b/apps/cli/template/with-auth/packages/server/src/lib/trpc.ts new file mode 100644 index 0000000..3affce2 --- /dev/null +++ b/apps/cli/template/with-auth/packages/server/src/lib/trpc.ts @@ -0,0 +1,24 @@ +import { initTRPC, TRPCError } from "@trpc/server"; +import type { Context } from "./context"; + +export const t = initTRPC.context().create(); + +export const router = t.router; + +export const publicProcedure = t.procedure; + +export const protectedProcedure = t.procedure.use(({ ctx, next }) => { + if (!ctx.session) { + throw new TRPCError({ + code: "UNAUTHORIZED", + message: "Authentication required", + cause: "No session", + }); + } + return next({ + ctx: { + ...ctx, + session: ctx.session, + }, + }); +}); diff --git a/apps/cli/template/with-auth/packages/server/src/routers/index.ts b/apps/cli/template/with-auth/packages/server/src/routers/index.ts new file mode 100644 index 0000000..c811510 --- /dev/null +++ b/apps/cli/template/with-auth/packages/server/src/routers/index.ts @@ -0,0 +1,16 @@ + +import { router, publicProcedure, protectedProcedure } from "../lib/trpc"; + +export const appRouter = router({ + healthCheck: publicProcedure.query(() => { + return "OK"; + }), + privateData: protectedProcedure.query(({ ctx }) => { + return { + message: "This is private", + user: ctx.session.user, + }; + }), +}); + +export type AppRouter = typeof appRouter; diff --git a/apps/cli/template/with-drizzle-postgres/packages/server/src/lib/context.ts b/apps/cli/template/with-drizzle-postgres/packages/server/src/lib/context.ts new file mode 100644 index 0000000..c6eb0d8 --- /dev/null +++ b/apps/cli/template/with-drizzle-postgres/packages/server/src/lib/context.ts @@ -0,0 +1,18 @@ +import type { Context as HonoContext } from "hono"; +import { auth } from "./auth"; + +export type CreateContextOptions = { + hono: HonoContext; +}; + +export async function createContext({ hono }: CreateContextOptions) { + const session = await auth.api.getSession({ + headers: hono.req.raw.headers, + }); + + return { + session, + }; +} + +export type Context = Awaited>; diff --git a/apps/cli/template/with-drizzle-sqlite/packages/server/src/lib/context.ts b/apps/cli/template/with-drizzle-sqlite/packages/server/src/lib/context.ts new file mode 100644 index 0000000..c6eb0d8 --- /dev/null +++ b/apps/cli/template/with-drizzle-sqlite/packages/server/src/lib/context.ts @@ -0,0 +1,18 @@ +import type { Context as HonoContext } from "hono"; +import { auth } from "./auth"; + +export type CreateContextOptions = { + hono: HonoContext; +}; + +export async function createContext({ hono }: CreateContextOptions) { + const session = await auth.api.getSession({ + headers: hono.req.raw.headers, + }); + + return { + session, + }; +} + +export type Context = Awaited>; diff --git a/apps/cli/template/with-prisma-postgres/packages/server/src/lib/context.ts b/apps/cli/template/with-prisma-postgres/packages/server/src/lib/context.ts new file mode 100644 index 0000000..c6eb0d8 --- /dev/null +++ b/apps/cli/template/with-prisma-postgres/packages/server/src/lib/context.ts @@ -0,0 +1,18 @@ +import type { Context as HonoContext } from "hono"; +import { auth } from "./auth"; + +export type CreateContextOptions = { + hono: HonoContext; +}; + +export async function createContext({ hono }: CreateContextOptions) { + const session = await auth.api.getSession({ + headers: hono.req.raw.headers, + }); + + return { + session, + }; +} + +export type Context = Awaited>; diff --git a/apps/cli/template/with-prisma-sqlite/packages/server/src/lib/context.ts b/apps/cli/template/with-prisma-sqlite/packages/server/src/lib/context.ts new file mode 100644 index 0000000..c6eb0d8 --- /dev/null +++ b/apps/cli/template/with-prisma-sqlite/packages/server/src/lib/context.ts @@ -0,0 +1,18 @@ +import type { Context as HonoContext } from "hono"; +import { auth } from "./auth"; + +export type CreateContextOptions = { + hono: HonoContext; +}; + +export async function createContext({ hono }: CreateContextOptions) { + const session = await auth.api.getSession({ + headers: hono.req.raw.headers, + }); + + return { + session, + }; +} + +export type Context = Awaited>;