{{#if (or (eq runtime "bun") (eq runtime "node"))}} import "dotenv/config"; {{/if}} {{#if (eq runtime "workers")}} import { env } from "cloudflare:workers"; {{/if}} {{#if (eq api "orpc")}} import { OpenAPIHandler } from "@orpc/openapi/fetch"; import { OpenAPIReferencePlugin } from "@orpc/openapi/plugins"; import { ZodToJsonSchemaConverter } from "@orpc/zod/zod4"; import { RPCHandler } from "@orpc/server/fetch"; import { onError } from "@orpc/server"; import { createContext } from "./lib/context"; import { appRouter } from "./routers/index"; {{/if}} {{#if (eq api "trpc")}} import { trpcServer } from "@hono/trpc-server"; import { createContext } from "./lib/context"; import { appRouter } from "./routers/index"; {{/if}} {{#if (eq auth "better-auth")}} import { auth } from "./lib/auth"; {{/if}} import { Hono } from "hono"; import { cors } from "hono/cors"; import { logger } from "hono/logger"; {{#if (and (includes examples "ai") (or (eq runtime "bun") (eq runtime "node")))}} import { streamText, convertToModelMessages } from "ai"; import { google } from "@ai-sdk/google"; {{/if}} {{#if (and (includes examples "ai") (eq runtime "workers"))}} import { streamText, convertToModelMessages } from "ai"; import { createGoogleGenerativeAI } from "@ai-sdk/google"; {{/if}} const app = new Hono(); app.use(logger()); app.use( "/*", cors({ {{#if (or (eq runtime "bun") (eq runtime "node"))}} origin: process.env.CORS_ORIGIN || "", {{/if}} {{#if (eq runtime "workers")}} origin: env.CORS_ORIGIN || "", {{/if}} allowMethods: ["GET", "POST", "OPTIONS"], {{#if (eq auth "better-auth")}} allowHeaders: ["Content-Type", "Authorization"], credentials: true, {{/if}} }) ); {{#if (eq auth "better-auth")}} app.on(["POST", "GET"], "/api/auth/**", (c) => auth.handler(c.req.raw)); {{/if}} {{#if (eq api "orpc")}} export const apiHandler = new OpenAPIHandler(appRouter, { plugins: [ new OpenAPIReferencePlugin({ schemaConverters: [new ZodToJsonSchemaConverter()], }), ], interceptors: [ onError((error) => { console.error(error); }), ], }); export const rpcHandler = new RPCHandler(appRouter, { interceptors: [ onError((error) => { console.error(error); }), ], }); app.use("/*", async (c, next) => { const context = await createContext({ context: c }); const rpcResult = await rpcHandler.handle(c.req.raw, { prefix: "/rpc", context: context, }); if (rpcResult.matched) { return c.newResponse(rpcResult.response.body, rpcResult.response); } const apiResult = await apiHandler.handle(c.req.raw, { prefix: "/api", context: context, }); if (apiResult.matched) { return c.newResponse(apiResult.response.body, apiResult.response); } await next(); }); {{/if}} {{#if (eq api "trpc")}} app.use( "/trpc/*", trpcServer({ router: appRouter, createContext: (_opts, context) => { return createContext({ context }); }, }) ); {{/if}} {{#if (and (includes examples "ai") (or (eq runtime "bun") (eq runtime "node")))}} app.post("/ai", async (c) => { const body = await c.req.json(); const uiMessages = body.messages || []; const result = streamText({ model: google("gemini-1.5-flash"), messages: convertToModelMessages(uiMessages), }); return result.toUIMessageStreamResponse(); }); {{/if}} {{#if (and (includes examples "ai") (eq runtime "workers"))}} app.post("/ai", async (c) => { const body = await c.req.json(); const uiMessages = body.messages || []; const google = createGoogleGenerativeAI({ apiKey: env.GOOGLE_GENERATIVE_AI_API_KEY, }); const result = streamText({ model: google("gemini-1.5-flash"), messages: convertToModelMessages(uiMessages), }); return result.toUIMessageStreamResponse(); }); {{/if}} app.get("/", (c) => { return c.text("OK"); }); {{#if (eq runtime "node")}} import { serve } from "@hono/node-server"; serve( { fetch: app.fetch, port: 3000, }, (info) => { console.log(`Server is running on http://localhost:${info.port}`); } ); {{else}} {{#if (eq runtime "bun")}} export default app; {{/if}} {{#if (eq runtime "workers")}} export default app; {{/if}} {{/if}}