{
  "name": "nextjs-drizzle-app",
  "description": "Next.js App Router with Drizzle ORM and React components",
  "files": {
    "package.json": "{\"name\":\"my-app\",\"dependencies\":{\"next\":\"14.0.0\",\"react\":\"18.0.0\",\"drizzle-orm\":\"0.30.0\",\"pg\":\"8.11.0\",\"zod\":\"3.22.0\"},\"devDependencies\":{\"typescript\":\"5.3.0\",\"@types/node\":\"20.0.0\"}}",
    "tsconfig.json": "{\"compilerOptions\":{\"target\":\"es2017\",\"module\":\"esnext\",\"jsx\":\"react-jsx\"}}",
    ".env.example": "DATABASE_URL=postgres://localhost:5432/mydb\nNEXTAUTH_SECRET=\nNEXT_PUBLIC_API_URL=http://localhost:3000",
    "drizzle.config.ts": "import { defineConfig } from 'drizzle-kit';\nexport default defineConfig({ schema: './src/db/schema.ts', driver: 'pg' });",
    "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  createdAt: timestamp('created_at').defaultNow()\n});\n\nexport const posts = pgTable('posts', {\n  id: serial('id').primaryKey(),\n  title: text('title').notNull(),\n  content: text('content'),\n  published: boolean('published').default(false),\n  authorId: integer('author_id').notNull().references(() => users.id),\n  createdAt: timestamp('created_at').defaultNow()\n});\n\nexport const comments = pgTable('comments', {\n  id: serial('id').primaryKey(),\n  body: text('body').notNull(),\n  postId: integer('post_id').notNull().references(() => posts.id),\n  authorId: integer('author_id').notNull().references(() => users.id),\n  createdAt: timestamp('created_at').defaultNow()\n});\n\nexport const usersRelations = relations(users, ({ many }) => ({\n  posts: many(posts),\n  comments: many(comments)\n}));\n\nexport const postsRelations = relations(posts, ({ one, many }) => ({\n  author: one(users, { fields: [posts.authorId], references: [users.id] }),\n  comments: many(comments)\n}));",
    "src/app/api/users/route.ts": "import { NextResponse } from 'next/server';\nimport { db } from '@/db';\nimport { users } from '@/db/schema';\n\nexport async function GET() {\n  const all = await db.select().from(users);\n  return NextResponse.json(all);\n}\n\nexport async function POST(req: Request) {\n  const body = await req.json();\n  const user = await db.insert(users).values(body).returning();\n  return NextResponse.json(user, { status: 201 });\n}",
    "src/app/api/users/[id]/route.ts": "import { NextResponse } from 'next/server';\nimport { db } from '@/db';\nimport { users } from '@/db/schema';\nimport { eq } from 'drizzle-orm';\n\nexport async function GET(req: Request, { params }: { params: { id: string } }) {\n  const user = await db.select().from(users).where(eq(users.id, parseInt(params.id)));\n  return NextResponse.json(user[0]);\n}\n\nexport async function PUT(req: Request, { params }: { params: { id: string } }) {\n  const body = await req.json();\n  const updated = await db.update(users).set(body).where(eq(users.id, parseInt(params.id))).returning();\n  return NextResponse.json(updated[0]);\n}\n\nexport async function DELETE(req: Request, { params }: { params: { id: string } }) {\n  await db.delete(users).where(eq(users.id, parseInt(params.id)));\n  return NextResponse.json({ deleted: true });\n}",
    "src/app/api/posts/route.ts": "import { NextResponse } from 'next/server';\nimport { db } from '@/db';\nimport { posts } from '@/db/schema';\n\nexport async function GET() {\n  const all = await db.select().from(posts);\n  return NextResponse.json(all);\n}\n\nexport async function POST(req: Request) {\n  const body = await req.json();\n  const post = await db.insert(posts).values(body).returning();\n  return NextResponse.json(post, { status: 201 });\n}",
    "src/app/api/posts/[id]/comments/route.ts": "import { NextResponse } from 'next/server';\nimport { db } from '@/db';\nimport { comments } from '@/db/schema';\nimport { eq } from 'drizzle-orm';\n\nexport async function GET(req: Request, { params }: { params: { id: string } }) {\n  const all = await db.select().from(comments).where(eq(comments.postId, parseInt(params.id)));\n  return NextResponse.json(all);\n}\n\nexport async function POST(req: Request, { params }: { params: { id: string } }) {\n  const body = await req.json();\n  const comment = await db.insert(comments).values({ ...body, postId: parseInt(params.id) }).returning();\n  return NextResponse.json(comment, { status: 201 });\n}",
    "src/components/UserCard.tsx": "'use client';\nimport React from 'react';\n\ninterface UserCardProps {\n  name: string;\n  email: string;\n  avatar?: string;\n}\n\nexport function UserCard({ name, email, avatar }: UserCardProps) {\n  return <div className=\"card\"><h3>{name}</h3><p>{email}</p></div>;\n}",
    "src/components/PostList.tsx": "import React from 'react';\n\ninterface PostListProps {\n  posts: Array<{ id: number; title: string; published: boolean }>;\n  onSelect: (id: number) => void;\n}\n\nexport function PostList({ posts, onSelect }: PostListProps) {\n  return <ul>{posts.map(p => <li key={p.id} onClick={() => onSelect(p.id)}>{p.title}</li>)}</ul>;\n}",
    "src/components/CommentForm.tsx": "'use client';\nimport React, { useState } from 'react';\n\ninterface CommentFormProps {\n  postId: number;\n  onSubmit: (body: string) => void;\n}\n\nexport function CommentForm({ postId, onSubmit }: CommentFormProps) {\n  const [body, setBody] = useState('');\n  return <form onSubmit={() => onSubmit(body)}><textarea value={body} onChange={e => setBody(e.target.value)} /><button type=\"submit\">Submit</button></form>;\n}",
    "src/middleware.ts": "import { NextResponse } from 'next/server';\nimport type { NextRequest } from 'next/server';\n\nexport function middleware(request: NextRequest) {\n  const token = request.headers.get('authorization');\n  if (!token && request.nextUrl.pathname.startsWith('/api')) {\n    return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });\n  }\n  return NextResponse.next();\n}\n\nexport const config = { matcher: '/api/:path*' };",
    "src/lib/auth.ts": "export function verifyToken(token: string): boolean {\n  return token.startsWith('Bearer ');\n}\n\nexport function createToken(userId: number): string {\n  return `Bearer ${userId}-${Date.now()}`;\n}",
    "src/lib/validate.ts": "import { z } from 'zod';\n\nexport const createUserSchema = z.object({\n  email: z.string().email(),\n  name: z.string().min(1)\n});\n\nexport const createPostSchema = z.object({\n  title: z.string().min(1),\n  content: z.string().optional(),\n  published: z.boolean().optional()\n});"
  }
}
