Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion generator-prisma-client/basic-typedsql/prisma.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,6 @@ export default defineConfig({
seed: 'tsx ./prisma/seed.ts',
},
datasource: {
url: "file:./dev.db",
url: "file:./prisma/dev.db",
},
})
4 changes: 3 additions & 1 deletion generator-prisma-client/basic-typedsql/prisma/seed.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@ enum EventType {
CheckedOut = 'CheckedOut',
}

const adapter = new PrismaBetterSqlite3({ url: 'file:./prisma/dev.db' })
const adapter = new PrismaBetterSqlite3({
url: process.env.DATABASE_URL || 'file:./prisma/dev.db',
})
const prisma = new PrismaClient({ adapter })

async function main() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ To successfully run the project, you will need a **Prisma Postgres** connection
generator edge {
provider = "prisma-client"
output = "../lib/generated/prisma-edge"
runtime = "vercel"
runtime = "vercel-edge"
}
```

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ generator client {
generator edge {
provider = "prisma-client"
output = "../lib/generated/prisma-edge"
runtime = "vercel"
runtime = "vercel-edge"
}

datasource db {
Expand Down
90 changes: 43 additions & 47 deletions orm/graphql/lib/pothos-prisma-types.ts
Original file line number Diff line number Diff line change
@@ -1,50 +1,46 @@
/* eslint-disable */
import type { Prisma, User, Post } from '../prisma/generated/client'
import type { PothosPrismaDatamodel } from '@pothos/plugin-prisma'
import type { Prisma, User, Post } from "../prisma/generated/client/client.js";
import type { PothosPrismaDatamodel } from "@pothos/plugin-prisma";
export default interface PrismaTypes {
User: {
Name: 'User'
Shape: User
Include: Prisma.UserInclude
Select: Prisma.UserSelect
OrderBy: Prisma.UserOrderByWithRelationInput
WhereUnique: Prisma.UserWhereUniqueInput
Where: Prisma.UserWhereInput
Create: {}
Update: {}
RelationName: 'posts'
ListRelations: 'posts'
Relations: {
posts: {
Shape: Post[]
Name: 'Post'
Nullable: false
}
}
}
Post: {
Name: 'Post'
Shape: Post
Include: Prisma.PostInclude
Select: Prisma.PostSelect
OrderBy: Prisma.PostOrderByWithRelationInput
WhereUnique: Prisma.PostWhereUniqueInput
Where: Prisma.PostWhereInput
Create: {}
Update: {}
RelationName: 'author'
ListRelations: never
Relations: {
author: {
Shape: User | null
Name: 'User'
Nullable: true
}
}
}
}
export function getDatamodel(): PothosPrismaDatamodel {
return JSON.parse(
'{"datamodel":{"models":{"User":{"fields":[{"type":"Int","kind":"scalar","name":"id","isRequired":true,"isList":false,"hasDefaultValue":true,"isUnique":false,"isId":true,"isUpdatedAt":false},{"type":"String","kind":"scalar","name":"email","isRequired":true,"isList":false,"hasDefaultValue":false,"isUnique":true,"isId":false,"isUpdatedAt":false},{"type":"String","kind":"scalar","name":"name","isRequired":false,"isList":false,"hasDefaultValue":false,"isUnique":false,"isId":false,"isUpdatedAt":false},{"type":"Post","kind":"object","name":"posts","isRequired":true,"isList":true,"hasDefaultValue":false,"isUnique":false,"isId":false,"relationName":"PostToUser","relationFromFields":[],"isUpdatedAt":false}],"primaryKey":null,"uniqueIndexes":[]},"Post":{"fields":[{"type":"Int","kind":"scalar","name":"id","isRequired":true,"isList":false,"hasDefaultValue":true,"isUnique":false,"isId":true,"isUpdatedAt":false},{"type":"DateTime","kind":"scalar","name":"createdAt","isRequired":true,"isList":false,"hasDefaultValue":true,"isUnique":false,"isId":false,"isUpdatedAt":false},{"type":"DateTime","kind":"scalar","name":"updatedAt","isRequired":true,"isList":false,"hasDefaultValue":false,"isUnique":false,"isId":false,"isUpdatedAt":true},{"type":"String","kind":"scalar","name":"title","isRequired":true,"isList":false,"hasDefaultValue":false,"isUnique":false,"isId":false,"isUpdatedAt":false},{"type":"String","kind":"scalar","name":"content","isRequired":false,"isList":false,"hasDefaultValue":false,"isUnique":false,"isId":false,"isUpdatedAt":false},{"type":"Boolean","kind":"scalar","name":"published","isRequired":true,"isList":false,"hasDefaultValue":true,"isUnique":false,"isId":false,"isUpdatedAt":false},{"type":"Int","kind":"scalar","name":"viewCount","isRequired":true,"isList":false,"hasDefaultValue":true,"isUnique":false,"isId":false,"isUpdatedAt":false},{"type":"User","kind":"object","name":"author","isRequired":false,"isList":false,"hasDefaultValue":false,"isUnique":false,"isId":false,"relationName":"PostToUser","relationFromFields":["authorId"],"isUpdatedAt":false},{"type":"Int","kind":"scalar","name":"authorId","isRequired":false,"isList":false,"hasDefaultValue":false,"isUnique":false,"isId":false,"isUpdatedAt":false}],"primaryKey":null,"uniqueIndexes":[]}}}}',
)
User: {
Name: "User";
Shape: User;
Include: Prisma.UserInclude;
Select: Prisma.UserSelect;
OrderBy: Prisma.UserOrderByWithRelationInput;
WhereUnique: Prisma.UserWhereUniqueInput;
Where: Prisma.UserWhereInput;
Create: {};
Update: {};
RelationName: "posts";
ListRelations: "posts";
Relations: {
posts: {
Shape: Post[];
Name: "Post";
Nullable: false;
};
};
};
Post: {
Name: "Post";
Shape: Post;
Include: Prisma.PostInclude;
Select: Prisma.PostSelect;
OrderBy: Prisma.PostOrderByWithRelationInput;
WhereUnique: Prisma.PostWhereUniqueInput;
Where: Prisma.PostWhereInput;
Create: {};
Update: {};
RelationName: "author";
ListRelations: never;
Relations: {
author: {
Shape: User | null;
Name: "User";
Nullable: true;
};
};
};
}
export function getDatamodel(): PothosPrismaDatamodel { return JSON.parse("{\"datamodel\":{\"models\":{\"User\":{\"fields\":[{\"type\":\"Int\",\"kind\":\"scalar\",\"name\":\"id\",\"isRequired\":true,\"isList\":false,\"hasDefaultValue\":true,\"isUnique\":false,\"isId\":true,\"isUpdatedAt\":false},{\"type\":\"String\",\"kind\":\"scalar\",\"name\":\"email\",\"isRequired\":true,\"isList\":false,\"hasDefaultValue\":false,\"isUnique\":true,\"isId\":false,\"isUpdatedAt\":false},{\"type\":\"String\",\"kind\":\"scalar\",\"name\":\"name\",\"isRequired\":false,\"isList\":false,\"hasDefaultValue\":false,\"isUnique\":false,\"isId\":false,\"isUpdatedAt\":false},{\"type\":\"Post\",\"kind\":\"object\",\"name\":\"posts\",\"isRequired\":true,\"isList\":true,\"hasDefaultValue\":false,\"isUnique\":false,\"isId\":false,\"relationName\":\"PostToUser\",\"relationFromFields\":[],\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueIndexes\":[]},\"Post\":{\"fields\":[{\"type\":\"Int\",\"kind\":\"scalar\",\"name\":\"id\",\"isRequired\":true,\"isList\":false,\"hasDefaultValue\":true,\"isUnique\":false,\"isId\":true,\"isUpdatedAt\":false},{\"type\":\"DateTime\",\"kind\":\"scalar\",\"name\":\"createdAt\",\"isRequired\":true,\"isList\":false,\"hasDefaultValue\":true,\"isUnique\":false,\"isId\":false,\"isUpdatedAt\":false},{\"type\":\"DateTime\",\"kind\":\"scalar\",\"name\":\"updatedAt\",\"isRequired\":true,\"isList\":false,\"hasDefaultValue\":false,\"isUnique\":false,\"isId\":false,\"isUpdatedAt\":true},{\"type\":\"String\",\"kind\":\"scalar\",\"name\":\"title\",\"isRequired\":true,\"isList\":false,\"hasDefaultValue\":false,\"isUnique\":false,\"isId\":false,\"isUpdatedAt\":false},{\"type\":\"String\",\"kind\":\"scalar\",\"name\":\"content\",\"isRequired\":false,\"isList\":false,\"hasDefaultValue\":false,\"isUnique\":false,\"isId\":false,\"isUpdatedAt\":false},{\"type\":\"Boolean\",\"kind\":\"scalar\",\"name\":\"published\",\"isRequired\":true,\"isList\":false,\"hasDefaultValue\":true,\"isUnique\":false,\"isId\":false,\"isUpdatedAt\":false},{\"type\":\"Int\",\"kind\":\"scalar\",\"name\":\"viewCount\",\"isRequired\":true,\"isList\":false,\"hasDefaultValue\":true,\"isUnique\":false,\"isId\":false,\"isUpdatedAt\":false},{\"type\":\"User\",\"kind\":\"object\",\"name\":\"author\",\"isRequired\":false,\"isList\":false,\"hasDefaultValue\":false,\"isUnique\":false,\"isId\":false,\"relationName\":\"PostToUser\",\"relationFromFields\":[\"authorId\"],\"isUpdatedAt\":false},{\"type\":\"Int\",\"kind\":\"scalar\",\"name\":\"authorId\",\"isRequired\":false,\"isList\":false,\"hasDefaultValue\":false,\"isUnique\":false,\"isId\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueIndexes\":[]}}}}"); }
6 changes: 3 additions & 3 deletions orm/solid-start/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
"start": "vinxi start"
},
"dependencies": {
"@prisma/client": "^7.0.0",
"@prisma/adapter-pg": "^7.0.0",
"@prisma/client": "7.3.0",
"@prisma/adapter-pg": "7.3.0",
Comment thread
AmanVarshney01 marked this conversation as resolved.
"@solidjs/start": "1.1.7",
"solid-js": "1.9.10",
"vinxi": "0.5.8",
Expand All @@ -21,7 +21,7 @@
"@tailwindcss/postcss": "4.1.13",
"dotenv": "^17.2.1",
"postcss": "8.5.6",
"prisma": "7.0.0",
"prisma": "7.3.0",
"tailwindcss": "4.1.11",
"tsx": "4.20.6",
"@types/pg": "^8.15.6"
Expand Down
11 changes: 10 additions & 1 deletion tests/databases.test.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,24 @@
import { testExample } from './fixtures.js'
import { testExample, testSqliteExample } from './fixtures.js'
import { describe, test } from 'vitest'

describe.concurrent('Database Examples', () => {
// PostgreSQL examples
testExample('databases/prisma-postgres')
testSqliteExample('databases/turso')
Comment thread
AmanVarshney01 marked this conversation as resolved.

// Skipped examples
describe('databases/postgresql-supabase', () => {
test.skip('requires Supabase setup', () => {})
})

describe('databases/cockroachdb', () => {
test.skip('requires CockroachDB setup', () => {})
})

describe('databases/mongodb', () => {
test.skip('requires MongoDB setup', () => {})
})

describe('databases/sql-server', () => {
test.skip('requires SQL Server setup', () => {})
})
Expand Down
35 changes: 35 additions & 0 deletions tests/deployment-platforms.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import { describe, test } from 'vitest'

describe.concurrent('Deployment Platform Examples', () => {
describe('deployment-platforms/aws-lambda', () => {
test.skip('requires AWS Lambda setup', () => {})
})

describe('deployment-platforms/azure-functions', () => {
test.skip('requires Azure Functions + SQL Server setup', () => {})
})

describe('deployment-platforms/edge', () => {
test.skip('requires edge runtime setup (Cloudflare/D1)', () => {})
})

describe('deployment-platforms/google-cloud-functions', () => {
test.skip('requires Google Cloud Functions setup', () => {})
})

describe('deployment-platforms/heroku', () => {
test.skip('requires Heroku setup', () => {})
})

describe('deployment-platforms/railway', () => {
test.skip('requires Railway setup', () => {})
})

describe('deployment-platforms/render', () => {
test.skip('requires Render setup', () => {})
})

describe('deployment-platforms/vercel', () => {
test.skip('requires Vercel setup', () => {})
})
})
30 changes: 20 additions & 10 deletions tests/fixtures.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,11 @@ export function testExample(examplePath: string, options?: TestExampleOptions) {
test('prisma setup', async () => {
server = await startPrismaDevServer({ databaseIdleTimeoutMillis: 300000 })
const url = server.database.connectionString
const databaseUrl = url.startsWith('postgres://')
? url.replace('postgres://', 'postgresql://')
: url
const cwd = path.join(process.cwd(), examplePath)
const env = { ...process.env, DATABASE_URL: url }
const env = { ...process.env, DATABASE_URL: databaseUrl, DIRECT_URL: databaseUrl }

console.log(`\n[${examplePath}] Installing dependencies...`)
await execa('npm', ['install'], { cwd, env, stdio: 'inherit' })
Expand Down Expand Up @@ -56,32 +59,39 @@ export function testExample(examplePath: string, options?: TestExampleOptions) {
}

// For SQLite examples that don't need @prisma/dev server
export function testSqliteExample(examplePath: string, options?: { generateSql?: boolean }) {
export function testSqliteExample(
examplePath: string,
options?: { generateSql?: boolean; env?: NodeJS.ProcessEnv }
) {
describe(examplePath, () => {
test('prisma setup', async () => {
const cwd = path.join(process.cwd(), examplePath)
const env = { ...process.env, ...options?.env }

// Remove existing SQLite database to ensure clean state
const dbPath = path.join(cwd, 'dev.db')
if (fs.existsSync(dbPath)) {
fs.unlinkSync(dbPath)
// Remove existing SQLite databases to ensure clean state
const dbPaths = [path.join(cwd, 'dev.db'), path.join(cwd, 'prisma', 'dev.db')]
for (const dbPath of dbPaths) {
if (fs.existsSync(dbPath)) {
fs.unlinkSync(dbPath)
}
}

console.log(`\n[${examplePath}] Installing dependencies...`)
await execa('npm', ['install'], { cwd, stdio: 'inherit' })
await execa('npm', ['install'], { cwd, env, stdio: 'inherit' })

console.log(`\n[${examplePath}] Running prisma generate...`)
await execa('npx', ['prisma', 'generate'], { cwd, stdio: 'inherit' })
await execa('npx', ['prisma', 'generate'], { cwd, env, stdio: 'inherit' })

console.log(`\n[${examplePath}] Running prisma db push...`)
await execa('npx', ['prisma', 'db', 'push', '--accept-data-loss'], {
cwd,
env,
stdio: 'inherit',
})

if (options?.generateSql) {
console.log(`\n[${examplePath}] Running prisma generate --sql...`)
await execa('npx', ['prisma', 'generate', '--sql'], { cwd, stdio: 'inherit' })
await execa('npx', ['prisma', 'generate', '--sql'], { cwd, env, stdio: 'inherit' })
}

// Check for seed in prisma.config.ts (Prisma v7+)
Expand All @@ -90,7 +100,7 @@ export function testSqliteExample(examplePath: string, options?: { generateSql?:
const content = fs.readFileSync(configPath, 'utf-8')
if (content.includes('seed:')) {
console.log(`\n[${examplePath}] Running prisma db seed...`)
await execa('npx', ['prisma', 'db', 'seed'], { cwd, stdio: 'inherit' })
await execa('npx', ['prisma', 'db', 'seed'], { cwd, env, stdio: 'inherit' })
}
}

Expand Down
39 changes: 39 additions & 0 deletions tests/generator-prisma-client.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import { describe, test } from 'vitest'
import { testExample, testSqliteExample } from './fixtures.js'

describe.concurrent('Generator Prisma Client Examples', () => {
testExample('generator-prisma-client/esbuild-cjs')
testExample('generator-prisma-client/nextjs-starter-turbopack')
testExample('generator-prisma-client/nextjs-starter-webpack')
testExample('generator-prisma-client/nextjs-starter-webpack-with-middleware')
testExample('generator-prisma-client/nuxt3-starter-nodejs')
testExample('generator-prisma-client/nuxt4-starter-nodejs')
testExample('generator-prisma-client/react-router-starter-nodejs')

testSqliteExample('generator-prisma-client/basic-typedsql', { generateSql: true })
testSqliteExample('generator-prisma-client/vitest-esm-nodejs')

describe('generator-prisma-client/aws-lambda-sst-esbuild', () => {
test.skip('requires SST/AWS runtime setup', () => {})
})

describe('generator-prisma-client/bun', () => {
test.skip('requires Bun runtime', () => {})
})

describe('generator-prisma-client/deno-deploy', () => {
test.skip('requires Deno runtime', () => {})
})

describe('generator-prisma-client/react-router-starter-cloudflare-workerd', () => {
test.skip('requires Cloudflare workerd runtime', () => {})
})

describe('generator-prisma-client/nextjs-starter-webpack-monorepo', () => {
test.skip('requires pnpm workspace/monorepo tooling', () => {})
})

describe('generator-prisma-client/nextjs-starter-webpack-turborepo', () => {
test.skip('requires pnpm/turborepo tooling', () => {})
})
})
16 changes: 16 additions & 0 deletions tests/orm.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,22 @@ describe.concurrent('ORM Examples', () => {
test.skip('npm install has peer dependency conflicts', () => {})
})

describe('orm/elysia', () => {
test.skip('requires Bun runtime', () => {})
})

describe('orm/grpc', () => {
test.skip('grpc dependencies have issues', () => {})
})

describe('orm/graphql-typegraphql', () => {
test.skip('README-only example (no runnable project)', () => {})
})

describe('orm/graphql-typegraphql-crud', () => {
test.skip('README-only example (no runnable project)', () => {})
})

describe('orm/hapi-graphql', () => {
test.skip('prisma generate fails', () => {})
})
Expand All @@ -62,4 +74,8 @@ describe.concurrent('ORM Examples', () => {
describe('orm/postgis-express', () => {
test.skip('requires PostGIS extension', () => {})
})

describe('orm/remix', () => {
test.skip('README-only example (no runnable project)', () => {})
})
})