// Generated by scripts/generate-manifest.mjs. Do not edit by hand. import type { AddOnCompiled } from '../../../../../types.js' type TemplateRecord = Record type TemplateAddOn = TemplateRecord & { integrations?: Array routes?: Array } type TemplateRenderContext = { [key: string]: any packageManager: any projectName: any typescript: any tailwind: any blank: any js: any jsx: any fileRouter: any codeRouter: any routerOnly: any includeExamples: any addOnEnabled: Record addOnOption: Record addOns: Array integrations: Array routes: Array getPackageManagerAddScript: (...args: Array) => string getPackageManagerRunScript: (...args: Array) => string getPackageManagerExecuteScript: (...args: Array) => string relativePath: (...args: Array) => string integrationImportContent: (...args: Array) => string integrationImportCode: (...args: Array) => string | undefined renderTemplate: (content: string) => string ignoreFile: () => never } type TemplateRenderer = (context: TemplateRenderContext) => string | undefined function __escapeXML(value: unknown) { if (value === undefined || value === null) { return '' } return String(value).replace(/[&<>'"]/g, (character) => { switch (character) { case '&': return '&' case '<': return '<' case '>': return '>' case '"': return '"' case "'": return ''' default: return character } }) } export function getManifestTemplateKey(template: string) { let hash = 0x811c9dc5 for (let i = 0; i < template.length; i++) { hash ^= template.charCodeAt(i) hash = Math.imul(hash, 0x01000193) >>> 0 } return `${hash.toString(16).padStart(8, '0')}:${template.length}` } function __render_028b78da_276(context: TemplateRenderContext) { const { packageManager, projectName, typescript, tailwind, blank, js, jsx, fileRouter, codeRouter, routerOnly, includeExamples, addOnEnabled, addOnOption, addOns, integrations, routes, getPackageManagerAddScript, getPackageManagerRunScript, getPackageManagerExecuteScript, relativePath, integrationImportContent, integrationImportCode, renderTemplate, ignoreFile, } = context let __output = '' const __append = (value: unknown) => { if (value !== undefined && value !== null) { __output += String(value) } } __append("import { defineConfig, env } from 'prisma/config'\n\nexport default defineConfig({\n schema: './prisma/schema.prisma',\n migrations: {\n path: './prisma/migrations',\n seed: 'tsx prisma/seed.ts',\n },\n datasource: {\n url: env('DATABASE_URL'),\n },\n});\n ") return __output } function __render_10add8c3_974(context: TemplateRenderContext) { const { packageManager, projectName, typescript, tailwind, blank, js, jsx, fileRouter, codeRouter, routerOnly, includeExamples, addOnEnabled, addOnOption, addOns, integrations, routes, getPackageManagerAddScript, getPackageManagerRunScript, getPackageManagerExecuteScript, relativePath, integrationImportContent, integrationImportCode, renderTemplate, ignoreFile, } = context let __output = '' const __append = (value: unknown) => { if (value !== undefined && value !== null) { __output += String(value) } } __append("import { PrismaClient } from './generated/prisma/client.js'\n") if (addOnOption.prisma.database !== 'sqlite') { __append("\nimport { getDatabaseUrl } from './database-url.js'\n") } __append("\n\n") if (addOnOption.prisma.database === 'postgres') { __append("\nimport { PrismaPg } from '@prisma/adapter-pg';\n\nconst adapter = new PrismaPg({\n connectionString: getDatabaseUrl(),\n});") } __append("\n\n") if (addOnOption.prisma.database === 'mysql') { __append("\nimport { PrismaMariaDb } from '@prisma/adapter-mariadb';\nconst adapter = new PrismaMariaDb(getDatabaseUrl());") } __append("\n\n") if (addOnOption.prisma.database === 'sqlite') { __append("\nimport { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3';\nconst adapter = new PrismaBetterSqlite3({\n url: process.env.DATABASE_URL || 'file:./dev.db'\n});") } __append("\n\ndeclare global {\n var __prisma: PrismaClient | undefined\n}\n\nexport const prisma = globalThis.__prisma || new PrismaClient({ adapter })\n\nif (process.env.NODE_ENV !== 'production') {\n globalThis.__prisma = prisma\n}\n") return __output } function __render_1c7fb2fe_1145(context: TemplateRenderContext) { const { packageManager, projectName, typescript, tailwind, blank, js, jsx, fileRouter, codeRouter, routerOnly, includeExamples, addOnEnabled, addOnOption, addOns, integrations, routes, getPackageManagerAddScript, getPackageManagerRunScript, getPackageManagerExecuteScript, relativePath, integrationImportContent, integrationImportCode, renderTemplate, ignoreFile, } = context let __output = '' const __append = (value: unknown) => { if (value !== undefined && value !== null) { __output += String(value) } } __append("{\n \"dependencies\": {\n \"prisma\": \"^7.4.2\",\n \"@prisma/client\": \"^7.4.2\"") if (addOnOption.prisma.database === 'postgres') { __append(",\n \"@prisma/adapter-pg\": \"^7.4.2\"") } if (addOnOption.prisma.database === 'mysql') { __append(",\n \"@prisma/adapter-mariadb\": \"^7.4.2\"") } if (addOnOption.prisma.database === 'sqlite') { __append(",\n \"@prisma/adapter-better-sqlite3\": \"^7.4.2\"") } __append("\n },\n \"devDependencies\": {\n \"dotenv-cli\": \"^11.0.0\",\n \"tsx\": \"^4.21.0\"\n },\n \"scripts\": {") if (addOnOption.prisma.database === 'postgres') { __append("\n \"post-cta-init\": \"") __append(getPackageManagerExecuteScript('create-db@latest', ['--user-agent', 'tanstack/tsrouter'])) __append("\",") } __append("\n \"db:generate\": \"dotenv -e .env.local -- prisma generate\",\n \"db:push\": \"dotenv -e .env.local -- prisma db push\",\n \"db:migrate\": \"dotenv -e .env.local -- prisma migrate dev\",\n \"db:studio\": \"dotenv -e .env.local -- prisma studio\",\n \"db:seed\": \"dotenv -e .env.local -- prisma db seed\"\n },\n \"pnpm\": {\n \"onlyBuiltDependencies\": [\n \"@prisma/engines\",\n \"prisma\"") if (addOnOption.prisma.database === 'sqlite') { __append(",\n \"better-sqlite3\"") } __append("\n ]\n }\n}\n") return __output } function __render_3bba1d86_4124(context: TemplateRenderContext) { const { packageManager, projectName, typescript, tailwind, blank, js, jsx, fileRouter, codeRouter, routerOnly, includeExamples, addOnEnabled, addOnOption, addOns, integrations, routes, getPackageManagerAddScript, getPackageManagerRunScript, getPackageManagerExecuteScript, relativePath, integrationImportContent, integrationImportCode, renderTemplate, ignoreFile, } = context let __output = '' const __append = (value: unknown) => { if (value !== undefined && value !== null) { __output += String(value) } } __append("import { createFileRoute, useRouter } from '@tanstack/react-router'\nimport { createServerFn } from '@tanstack/react-start'\nimport { prisma } from '#/db'\n\nconst getTodos = createServerFn({\n method: 'GET',\n}).handler(async () => {\n return await prisma.todo.findMany({\n orderBy: { createdAt: 'desc' },\n })\n})\n\nconst createTodo = createServerFn({\n method: 'POST',\n})\n .validator((data: { title: string }) => data)\n .handler(async ({ data }) => {\n return await prisma.todo.create({\n data,\n })\n })\n\nexport const Route = createFileRoute('/demo/prisma')({\n component: DemoPrisma,\n loader: async () => await getTodos(),\n})\n\nfunction DemoPrisma() {\n const router = useRouter()\n const todos = Route.useLoaderData()\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n const form = e.currentTarget\n const title = new FormData(form).get('title')\n\n if (typeof title !== 'string' || !title) return\n\n try {\n await createTodo({ data: { title } })\n router.invalidate()\n form.reset()\n } catch (error) {\n console.error('Failed to create todo:', error)\n }\n }\n\n return (\n
\n
\n
\n \n \"Prisma\n \n
\n

Database

\n

Prisma Demo

\n
\n
\n\n

Todos

\n\n
    \n {todos.map((todo) => (\n \n
    \n {todo.title}\n #{todo.id}\n
    \n \n ))}\n {todos.length === 0 && (\n
  • \n No todos yet. Create one below!\n
  • \n )}\n
\n\n
\n \n \n Add Todo\n \n \n\n
\n

\n Powered by Prisma ORM\n

\n

\n Next-generation ORM for Node.js & TypeScript with ") __append(__escapeXML(addOnOption.prisma.database === 'postgres' ? 'PostgreSQL' : addOnOption.prisma.database === 'mysql' ? 'MySQL' : 'SQLite')) __append("\n

\n
\n

Setup Instructions:

\n
    \n
  1. \n Configure your{' '}\n DATABASE_URL{' '}\n in .env.local\n
  2. \n
  3. \n Run:{' '}\n \n ") __append(getPackageManagerRunScript('db:generate')) __append("\n \n
  4. \n
  5. \n Run:{' '}\n \n ") __append(getPackageManagerRunScript('db:push')) __append("\n \n
  6. \n
  7. \n Optional:{' '}\n \n ") __append(getPackageManagerRunScript('db:studio')) __append("\n \n
  8. \n
\n
\n
\n
\n
\n )\n}\n") return __output } function __render_7599e122_260(context: TemplateRenderContext) { const { packageManager, projectName, typescript, tailwind, blank, js, jsx, fileRouter, codeRouter, routerOnly, includeExamples, addOnEnabled, addOnOption, addOns, integrations, routes, getPackageManagerAddScript, getPackageManagerRunScript, getPackageManagerExecuteScript, relativePath, integrationImportContent, integrationImportCode, renderTemplate, ignoreFile, } = context let __output = '' const __append = (value: unknown) => { if (value !== undefined && value !== null) { __output += String(value) } } if (addOnOption.prisma.database === 'sqlite') { ignoreFile(); return; } __append("export function getDatabaseUrl() {\n const databaseUrl = process.env.DATABASE_URL\n\n if (!databaseUrl) {\n throw new Error('DATABASE_URL is required')\n }\n\n return databaseUrl\n}\n") return __output } function __render_900686bd_340(context: TemplateRenderContext) { const { packageManager, projectName, typescript, tailwind, blank, js, jsx, fileRouter, codeRouter, routerOnly, includeExamples, addOnEnabled, addOnOption, addOns, integrations, routes, getPackageManagerAddScript, getPackageManagerRunScript, getPackageManagerExecuteScript, relativePath, integrationImportContent, integrationImportCode, renderTemplate, ignoreFile, } = context let __output = '' const __append = (value: unknown) => { if (value !== undefined && value !== null) { __output += String(value) } } __append("generator client {\n provider = \"prisma-client\"\n output = \"../src/generated/prisma\"\n}\n\ndatasource db {\n provider = \"") __append(__escapeXML(addOnOption.prisma.database === "postgres" ? "postgresql" : addOnOption.prisma.database)) __append("\"\n}\n\nmodel Todo {\n id Int @id @default(autoincrement())\n title String\n createdAt DateTime @default(now())\n}") return __output } function __render_af6293e3_1343(context: TemplateRenderContext) { const { packageManager, projectName, typescript, tailwind, blank, js, jsx, fileRouter, codeRouter, routerOnly, includeExamples, addOnEnabled, addOnOption, addOns, integrations, routes, getPackageManagerAddScript, getPackageManagerRunScript, getPackageManagerExecuteScript, relativePath, integrationImportContent, integrationImportCode, renderTemplate, ignoreFile, } = context let __output = '' const __append = (value: unknown) => { if (value !== undefined && value !== null) { __output += String(value) } } __append("import { PrismaClient } from \"../src/generated/prisma/client.js\";\n") if (addOnOption.prisma.database !== 'sqlite') { __append("\nimport { getDatabaseUrl } from '../src/database-url.js'\n") } __append("\n\n") if (addOnOption.prisma.database === 'postgres') { __append("\nimport { PrismaPg } from '@prisma/adapter-pg';\n\nconst adapter = new PrismaPg({\n connectionString: getDatabaseUrl(),\n});") } __append("\n\n") if (addOnOption.prisma.database === 'mysql') { __append("\nimport { PrismaMariaDb } from '@prisma/adapter-mariadb';\nconst adapter = new PrismaMariaDb(getDatabaseUrl());") } __append("\n\n") if (addOnOption.prisma.database === 'sqlite') { __append("\nimport { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3';\nconst adapter = new PrismaBetterSqlite3({\n url: process.env.DATABASE_URL || 'file:./dev.db'\n});") } __append("\n\nconst prisma = new PrismaClient({adapter})\n\nasync function main() {\n console.log('🌱 Seeding database...')\n\n // Clear existing todos\n await prisma.todo.deleteMany()\n\n // Create example todos\n const todos = await prisma.todo.createMany({\n data: [\n { title: 'Buy groceries' },\n { title: 'Read a book' },\n { title: 'Workout' },\n ],\n })\n\n console.log(`✅ Created ${todos.count} todos`)\n}\n\nmain()\n .catch((e) => {\n console.error('❌ Error seeding database:', e)\n process.exit(1)\n })\n .finally(async () => {\n await prisma.$disconnect()\n })\n") return __output } function __render_b5df988d_418(context: TemplateRenderContext) { const { packageManager, projectName, typescript, tailwind, blank, js, jsx, fileRouter, codeRouter, routerOnly, includeExamples, addOnEnabled, addOnOption, addOns, integrations, routes, getPackageManagerAddScript, getPackageManagerRunScript, getPackageManagerExecuteScript, relativePath, integrationImportContent, integrationImportCode, renderTemplate, ignoreFile, } = context let __output = '' const __append = (value: unknown) => { if (value !== undefined && value !== null) { __output += String(value) } } if (addOnOption.prisma.database === 'postgres') { __append("\n# Database URL for PostgreSQL\nDATABASE_URL=\"postgresql://username:password@localhost:5432/mydb\"") } else if (addOnOption.prisma.database === 'mysql') { __append("\n# Database URL for MySQL\nDATABASE_URL=\"mysql://username:password@localhost:3306/mydb\"") } else if (addOnOption.prisma.database === 'sqlite') { __append("\n# Database URL for SQLite\nDATABASE_URL=\"file:./dev.db\"") } return __output } const templateRenderers: Record = { "028b78da:276": __render_028b78da_276, "10add8c3:974": __render_10add8c3_974, "1c7fb2fe:1145": __render_1c7fb2fe_1145, "3bba1d86:4124": __render_3bba1d86_4124, "7599e122:260": __render_7599e122_260, "900686bd:340": __render_900686bd_340, "af6293e3:1343": __render_af6293e3_1343, "b5df988d:418": __render_b5df988d_418, } export function hasManifestTemplate(template: string) { return getManifestTemplateKey(template) in templateRenderers } export function renderManifestTemplate( template: string, context: TemplateRenderContext, ) { const key = getManifestTemplateKey(template) const renderer = templateRenderers[key] if (!renderer) { throw new Error(`Template ${key} was not precompiled into the manifest`) } return renderer(context) ?? '' } export const addOn = { "name": "Prisma", "description": "Type-safe database client with schema migrations (Postgres, MySQL, SQLite, MongoDB).", "phase": "add-on", "type": "add-on", "category": "orm", "exclusive": [ "orm" ], "color": "#2D3748", "priority": 120, "partner": { "id": "prisma", "tier": "bronze" }, "link": "https://www.prisma.io/", "modes": [ "file-router" ], "postInitSpecialSteps": [ "post-init-script" ], "options": { "database": { "type": "select", "label": "Database Provider", "description": "Choose your database provider", "default": "postgres", "options": [ { "value": "postgres", "label": "Prisma PostgreSQL" }, { "value": "sqlite", "label": "SQLite" }, { "value": "mysql", "label": "MySQL" } ] } }, "routes": [ { "icon": "Database", "url": "/demo/prisma", "name": "Prisma", "path": "src/routes/demo/prisma.tsx", "jsName": "DemoPrisma" } ], "id": "prisma", "version": "0.0.0", "packageAdditions": {}, "packageTemplate": "{\n \"dependencies\": {\n \"prisma\": \"^7.4.2\",\n \"@prisma/client\": \"^7.4.2\"<% if (addOnOption.prisma.database === 'postgres') { %>,\n \"@prisma/adapter-pg\": \"^7.4.2\"<% } %><% if (addOnOption.prisma.database === 'mysql') { %>,\n \"@prisma/adapter-mariadb\": \"^7.4.2\"<% } %><% if (addOnOption.prisma.database === 'sqlite') { %>,\n \"@prisma/adapter-better-sqlite3\": \"^7.4.2\"<% } %>\n },\n \"devDependencies\": {\n \"dotenv-cli\": \"^11.0.0\",\n \"tsx\": \"^4.21.0\"\n },\n \"scripts\": {<% if (addOnOption.prisma.database === 'postgres') { %>\n \"post-cta-init\": \"<%- getPackageManagerExecuteScript('create-db@latest', ['--user-agent', 'tanstack/tsrouter']) %>\",<% } %>\n \"db:generate\": \"dotenv -e .env.local -- prisma generate\",\n \"db:push\": \"dotenv -e .env.local -- prisma db push\",\n \"db:migrate\": \"dotenv -e .env.local -- prisma migrate dev\",\n \"db:studio\": \"dotenv -e .env.local -- prisma studio\",\n \"db:seed\": \"dotenv -e .env.local -- prisma db seed\"\n },\n \"pnpm\": {\n \"onlyBuiltDependencies\": [\n \"@prisma/engines\",\n \"prisma\"<% if (addOnOption.prisma.database === 'sqlite') { %>,\n \"better-sqlite3\"<% } %>\n ]\n }\n}\n", "readmeIsEjs": false, "files": { "_dot_env.local.append.ejs": "<% if (addOnOption.prisma.database === 'postgres') { %>\n# Database URL for PostgreSQL\nDATABASE_URL=\"postgresql://username:password@localhost:5432/mydb\"<% } else if (addOnOption.prisma.database === 'mysql') { %>\n# Database URL for MySQL\nDATABASE_URL=\"mysql://username:password@localhost:3306/mydb\"<% } else if (addOnOption.prisma.database === 'sqlite') { %>\n# Database URL for SQLite\nDATABASE_URL=\"file:./dev.db\"<% } %>", "prisma/schema.prisma.ejs": "generator client {\n provider = \"prisma-client\"\n output = \"../src/generated/prisma\"\n}\n\ndatasource db {\n provider = \"<%= addOnOption.prisma.database === \"postgres\" ? \"postgresql\" : addOnOption.prisma.database %>\"\n}\n\nmodel Todo {\n id Int @id @default(autoincrement())\n title String\n createdAt DateTime @default(now())\n}", "prisma/seed.ts.ejs": "import { PrismaClient } from \"../src/generated/prisma/client.js\";\n<% if (addOnOption.prisma.database !== 'sqlite') { %>\nimport { getDatabaseUrl } from '../src/database-url.js'\n<% } %>\n\n<% if (addOnOption.prisma.database === 'postgres') { %>\nimport { PrismaPg } from '@prisma/adapter-pg';\n\nconst adapter = new PrismaPg({\n connectionString: getDatabaseUrl(),\n});<% } %>\n\n<% if (addOnOption.prisma.database === 'mysql') { %>\nimport { PrismaMariaDb } from '@prisma/adapter-mariadb';\nconst adapter = new PrismaMariaDb(getDatabaseUrl());<% } %>\n\n<% if (addOnOption.prisma.database === 'sqlite') { %>\nimport { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3';\nconst adapter = new PrismaBetterSqlite3({\n url: process.env.DATABASE_URL || 'file:./dev.db'\n});<% } %>\n\nconst prisma = new PrismaClient({adapter})\n\nasync function main() {\n console.log('🌱 Seeding database...')\n\n // Clear existing todos\n await prisma.todo.deleteMany()\n\n // Create example todos\n const todos = await prisma.todo.createMany({\n data: [\n { title: 'Buy groceries' },\n { title: 'Read a book' },\n { title: 'Workout' },\n ],\n })\n\n console.log(`✅ Created ${todos.count} todos`)\n}\n\nmain()\n .catch((e) => {\n console.error('❌ Error seeding database:', e)\n process.exit(1)\n })\n .finally(async () => {\n await prisma.$disconnect()\n })\n", "prisma.config.ts.ejs": "import { defineConfig, env } from 'prisma/config'\n\nexport default defineConfig({\n schema: './prisma/schema.prisma',\n migrations: {\n path: './prisma/migrations',\n seed: 'tsx prisma/seed.ts',\n },\n datasource: {\n url: env('DATABASE_URL'),\n },\n});\n ", "public/prisma.svg": "base64::PHN2ZyB2aWV3Qm94PSIwIDAgMjU2IDMxMCIgd2lkdGg9IjI1NiIgaGVpZ2h0PSIzMTAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0yNTQuMzEzIDIzNS41MTlMMTQ4IDkuNzQ5QTE3LjA2MyAxNy4wNjMgMCAwMDEzMy40NzMuMDM3YTE2Ljg3IDE2Ljg3IDAgMDAtMTUuNTMzIDguMDUyTDIuNjMzIDE5NC44NDhhMTcuNDY1IDE3LjQ2NSAwIDAwLjE5MyAxOC43NDdMNTkuMiAzMDAuODk2YTE4LjEzIDE4LjEzIDAgMDAyMC4zNjMgNy40ODlsMTYzLjU5OS00OC4zOTJhMTcuOTI5IDE3LjkyOSAwIDAwMTEuMjYtOS43MjIgMTcuNTQyIDE3LjU0MiAwIDAwLS4xMDEtMTQuNzZsLS4wMDguMDA4em0tMjMuODAyIDkuNjgzbC0xMzguODIzIDQxLjA1Yy00LjIzNSAxLjI2LTguMy0yLjQxMS03LjQxOS02LjY4NWw0OS41OTgtMjM3LjQ4NGMuOTI3LTQuNDQzIDcuMDYzLTUuMTQ3IDkuMDAzLTEuMDM1bDkxLjgxNCAxOTQuOTczYTYuNjMgNi42MyAwIDAxLTQuMTggOS4xOGguMDA3eiIvPjwvc3ZnPg==", "src/database-url.ts.ejs": "<% if (addOnOption.prisma.database === 'sqlite') { ignoreFile(); return; } -%>\nexport function getDatabaseUrl() {\n const databaseUrl = process.env.DATABASE_URL\n\n if (!databaseUrl) {\n throw new Error('DATABASE_URL is required')\n }\n\n return databaseUrl\n}\n", "src/db.ts.ejs": "import { PrismaClient } from './generated/prisma/client.js'\n<% if (addOnOption.prisma.database !== 'sqlite') { %>\nimport { getDatabaseUrl } from './database-url.js'\n<% } %>\n\n<% if (addOnOption.prisma.database === 'postgres') { %>\nimport { PrismaPg } from '@prisma/adapter-pg';\n\nconst adapter = new PrismaPg({\n connectionString: getDatabaseUrl(),\n});<% } %>\n\n<% if (addOnOption.prisma.database === 'mysql') { %>\nimport { PrismaMariaDb } from '@prisma/adapter-mariadb';\nconst adapter = new PrismaMariaDb(getDatabaseUrl());<% } %>\n\n<% if (addOnOption.prisma.database === 'sqlite') { %>\nimport { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3';\nconst adapter = new PrismaBetterSqlite3({\n url: process.env.DATABASE_URL || 'file:./dev.db'\n});<% } %>\n\ndeclare global {\n var __prisma: PrismaClient | undefined\n}\n\nexport const prisma = globalThis.__prisma || new PrismaClient({ adapter })\n\nif (process.env.NODE_ENV !== 'production') {\n globalThis.__prisma = prisma\n}\n", "src/routes/demo/prisma.tsx.ejs": "import { createFileRoute, useRouter } from '@tanstack/react-router'\nimport { createServerFn } from '@tanstack/react-start'\nimport { prisma } from '#/db'\n\nconst getTodos = createServerFn({\n method: 'GET',\n}).handler(async () => {\n return await prisma.todo.findMany({\n orderBy: { createdAt: 'desc' },\n })\n})\n\nconst createTodo = createServerFn({\n method: 'POST',\n})\n .validator((data: { title: string }) => data)\n .handler(async ({ data }) => {\n return await prisma.todo.create({\n data,\n })\n })\n\nexport const Route = createFileRoute('/demo/prisma')({\n component: DemoPrisma,\n loader: async () => await getTodos(),\n})\n\nfunction DemoPrisma() {\n const router = useRouter()\n const todos = Route.useLoaderData()\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n const form = e.currentTarget\n const title = new FormData(form).get('title')\n\n if (typeof title !== 'string' || !title) return\n\n try {\n await createTodo({ data: { title } })\n router.invalidate()\n form.reset()\n } catch (error) {\n console.error('Failed to create todo:', error)\n }\n }\n\n return (\n
\n
\n
\n \n \"Prisma\n \n
\n

Database

\n

Prisma Demo

\n
\n
\n\n

Todos

\n\n
    \n {todos.map((todo) => (\n \n
    \n {todo.title}\n #{todo.id}\n
    \n \n ))}\n {todos.length === 0 && (\n
  • \n No todos yet. Create one below!\n
  • \n )}\n
\n\n
\n \n \n Add Todo\n \n \n\n
\n

\n Powered by Prisma ORM\n

\n

\n Next-generation ORM for Node.js & TypeScript with <%= addOnOption.prisma.database === 'postgres' ? 'PostgreSQL' : addOnOption.prisma.database === 'mysql' ? 'MySQL' : 'SQLite' %>\n

\n
\n

Setup Instructions:

\n
    \n
  1. \n Configure your{' '}\n DATABASE_URL{' '}\n in .env.local\n
  2. \n
  3. \n Run:{' '}\n \n <%- getPackageManagerRunScript('db:generate') %>\n \n
  4. \n
  5. \n Run:{' '}\n \n <%- getPackageManagerRunScript('db:push') %>\n \n
  6. \n
  7. \n Optional:{' '}\n \n <%- getPackageManagerRunScript('db:studio') %>\n \n
  8. \n
\n
\n
\n
\n
\n )\n}\n" }, "deletedFiles": [], "smallLogo": "" } satisfies AddOnCompiled