Generate Zero schemas from Prisma schemas.
npm install prisma-zero
# or
bun add prisma-zero
# or
yarn add prisma-zero
# or
pnpm add prisma-zeroAdd a new generator to your prisma.schema:
generator zero {
provider = "prisma-zero"
}Add the schema generation script to your package.json:
{
"scripts": {
"generate": "prisma generate",
"postinstall": "npm generate"
}
}Please reference the Zero docs for how to use your new Zero schema: https://zero.rocicorp.dev/docs/reading-data.
Since Zero doesn't natively support Postgres arrays, this generator automatically maps array fields to JSON storage while preserving TypeScript type safety:
model User {
id String @id @default(cuid())
email String @unique
tags String[] // Maps to json<string[]>()
scores Int[] // Maps to json<number[]>()
categories Category[] // Maps to json<Category[]>() for enum arrays
}
enum Category {
TECH
BUSINESS
LIFESTYLE
}The generated Zero schema will include:
export const userTable = table('User')
.columns({
id: string(),
email: string(),
tags: json<string[]>(),
scores: json<number[]>(),
categories: json<Category[]>(),
})
.primaryKey('id');- Scalar arrays:
String[],Int[],Float[],Boolean[],DateTime[],BigInt[],Decimal[] - Enum arrays:
MyEnum[] - Optional arrays:
String[]?→json<string[]>().optional()
If you want to customize the behavior of the generator you can use the following options:
generator zero {
// Specify output dir
output = "generated/zero"
// When true, the output will be formatted using prettier
prettier = true
// When true, the generator will remap table names to camel case using Zero's `.from()` method.
// You can read more about it here https://zero.rocicorp.dev/docs/zero-schema#name-mapping
camelCase = true
// Optional list of Prisma Model names you want to exclude from the generated schema
// This does *not* change tables that replicate to zero-cache - only the types on the client
excludeTables = ["Posts", "Comments", ...]
}Thank you to @elledienne who built @passionfroot/prisma-generator-zero, which this is heavily based on.