{
  "name": "hono-monorepo",
  "description": "Hono API + React frontend in pnpm monorepo with Drizzle",
  "files": {
    "package.json": "{\"name\":\"my-monorepo\",\"private\":true}",
    "pnpm-workspace.yaml": "packages:\n  - 'apps/*'\n  - 'packages/*'",
    "apps/api/package.json": "{\"name\":\"@mono/api\",\"dependencies\":{\"hono\":\"4.0.0\",\"drizzle-orm\":\"0.30.0\",\"pg\":\"8.11.0\",\"zod\":\"3.22.0\"},\"devDependencies\":{\"typescript\":\"5.3.0\"}}",
    "apps/api/.env.example": "DATABASE_URL=postgres://localhost:5432/mono\nJWT_SECRET=secret\nPORT=4000",
    "apps/api/src/index.ts": "import { Hono } from 'hono';\nimport { cors } from 'hono/cors';\nimport { logger } from 'hono/logger';\nimport { authRoutes } from './routes/auth';\nimport { userRoutes } from './routes/users';\nimport { projectRoutes } from './routes/projects';\n\nconst app = new Hono();\n\napp.use('*', cors());\napp.use('*', logger());\n\napp.get('/health', (c) => c.json({ ok: true }));\n\napp.route('/api/auth', authRoutes);\napp.route('/api/users', userRoutes);\napp.route('/api/projects', projectRoutes);\n\nexport default app;",
    "apps/api/src/routes/auth.ts": "import { Hono } from 'hono';\nimport { zValidator } from '@hono/zod-validator';\nimport { z } from 'zod';\n\nexport const authRoutes = new Hono();\n\nconst loginSchema = z.object({ email: z.string().email(), password: z.string() });\n\nauthRoutes.post('/login', zValidator('json', loginSchema), async (c) => {\n  const { email, password } = c.req.valid('json');\n  return c.json({ token: 'jwt-token' });\n});\n\nauthRoutes.post('/register', async (c) => {\n  const body = await c.req.json();\n  return c.json({ user: body }, 201);\n});\n\nauthRoutes.post('/refresh', async (c) => {\n  return c.json({ token: 'new-token' });\n});",
    "apps/api/src/routes/users.ts": "import { Hono } from 'hono';\nimport { db } from '../db';\nimport { users } from '../db/schema';\nimport { eq } from 'drizzle-orm';\n\nexport const userRoutes = new Hono();\n\nuserRoutes.get('/', async (c) => {\n  const all = await db.select().from(users);\n  return c.json(all);\n});\n\nuserRoutes.get('/:id', async (c) => {\n  const id = parseInt(c.req.param('id'));\n  const user = await db.select().from(users).where(eq(users.id, id));\n  return c.json(user[0]);\n});\n\nuserRoutes.put('/:id', async (c) => {\n  const id = parseInt(c.req.param('id'));\n  const body = await c.req.json();\n  const updated = await db.update(users).set(body).where(eq(users.id, id)).returning();\n  return c.json(updated[0]);\n});\n\nuserRoutes.delete('/:id', async (c) => {\n  const id = parseInt(c.req.param('id'));\n  await db.delete(users).where(eq(users.id, id));\n  return c.json({ deleted: true });\n});",
    "apps/api/src/routes/projects.ts": "import { Hono } from 'hono';\nimport { db } from '../db';\nimport { projects } from '../db/schema';\nimport { eq } from 'drizzle-orm';\n\nexport const projectRoutes = new Hono();\n\nprojectRoutes.get('/', async (c) => {\n  const all = await db.select().from(projects);\n  return c.json(all);\n});\n\nprojectRoutes.get('/:id', async (c) => {\n  const id = parseInt(c.req.param('id'));\n  const project = await db.select().from(projects).where(eq(projects.id, id));\n  return c.json(project[0]);\n});\n\nprojectRoutes.post('/', async (c) => {\n  const body = await c.req.json();\n  const created = await db.insert(projects).values(body).returning();\n  return c.json(created[0], 201);\n});",
    "apps/api/src/db/index.ts": "import { drizzle } from 'drizzle-orm/node-postgres';\nimport { Pool } from 'pg';\n\nconst pool = new Pool({ connectionString: process.env.DATABASE_URL });\nexport const db = drizzle(pool);",
    "apps/api/src/db/schema.ts": "import { pgTable, serial, text, timestamp, integer, boolean } from 'drizzle-orm/pg-core';\nimport { relations } from 'drizzle-orm';\n\nexport const users = pgTable('users', {\n  id: serial('id').primaryKey(),\n  email: text('email').notNull().unique(),\n  name: text('name'),\n  role: text('role').default('user'),\n  createdAt: timestamp('created_at').defaultNow()\n});\n\nexport const projects = pgTable('projects', {\n  id: serial('id').primaryKey(),\n  name: text('name').notNull(),\n  description: text('description'),\n  ownerId: integer('owner_id').notNull().references(() => users.id),\n  isPublic: boolean('is_public').default(true),\n  createdAt: timestamp('created_at').defaultNow()\n});\n\nexport const usersRelations = relations(users, ({ many }) => ({\n  projects: many(projects)\n}));\n\nexport const projectsRelations = relations(projects, ({ one }) => ({\n  owner: one(users, { fields: [projects.ownerId], references: [users.id] })\n}));",
    "apps/api/src/middleware/auth.ts": "import { Context, Next } from 'hono';\n\nexport async function authMiddleware(c: Context, next: Next) {\n  const token = c.req.header('Authorization');\n  if (!token) return c.json({ error: 'Unauthorized' }, 401);\n  await next();\n}",
    "apps/web/package.json": "{\"name\":\"@mono/web\",\"dependencies\":{\"react\":\"18.0.0\",\"react-dom\":\"18.0.0\"},\"devDependencies\":{\"typescript\":\"5.3.0\",\"vite\":\"5.0.0\"}}",
    "apps/web/src/components/ProjectCard.tsx": "import React from 'react';\n\ninterface ProjectCardProps {\n  name: string;\n  description: string;\n  isPublic: boolean;\n}\n\nexport function ProjectCard({ name, description, isPublic }: ProjectCardProps) {\n  return <div><h3>{name}</h3><p>{description}</p>{isPublic && <span>Public</span>}</div>;\n}",
    "apps/web/src/components/UserAvatar.tsx": "'use client';\nimport React from 'react';\n\ninterface UserAvatarProps {\n  name: string;\n  size?: number;\n}\n\nexport function UserAvatar({ name, size = 40 }: UserAvatarProps) {\n  return <div style={{ width: size, height: size }}>{name[0]}</div>;\n}"
  }
}
