https://github.com/cauen/prisma-generator-postgres-realtime
A prisma generator that turns your Postgres Database into a realtime Database and make it easy to subscribe to changes from Prisma Client type-safe api
https://github.com/cauen/prisma-generator-postgres-realtime
codegen database db extension generator postgres prisma realtime subscription typescript
Last synced: about 1 year ago
JSON representation
A prisma generator that turns your Postgres Database into a realtime Database and make it easy to subscribe to changes from Prisma Client type-safe api
- Host: GitHub
- URL: https://github.com/cauen/prisma-generator-postgres-realtime
- Owner: Cauen
- Created: 2024-11-14T18:15:44.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2024-11-16T18:28:15.000Z (over 1 year ago)
- Last Synced: 2025-04-10T16:16:54.268Z (about 1 year ago)
- Topics: codegen, database, db, extension, generator, postgres, prisma, realtime, subscription, typescript
- Language: TypeScript
- Homepage: https://npmjs.com/prisma-generator-postgres-realtime
- Size: 136 KB
- Stars: 11
- Watchers: 1
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- Changelog: changelog.md
- Contributing: CONTRIBUTING.md
Awesome Lists containing this project
README
# Prisma Generator Postgres Realtime
A prisma generator that turns your Postgres Database into a realtime Database and make it easy to subscribe to changes from Prisma Client type-safe Api
## How it works?
1. On `prisma generate` it will generate the `prismaExtension.ts` and `prismaRealtimeStatus.json` (to store what migrations have been generated and avoid regenerating them) file and the needed `migrations` to make your database send realtime events
2. Run `prisma migrate dev` to apply all generated migrations
3. Use the generated extension in prisma client to enable a new client/models method called `$subscribe` and start watching to realtime events sent
OBS:
- (Optional) Use the `generatorConfigPath` generator option to customize some options for your project (like excluding models, ...)
### Set up
#### Install generator
`npm install --save-dev prisma-generator-postgres-realtime` (or yarn | pnpm version)
#### Install node-postgres peer dependancy
`npm install pg`
#### Add the generator to your `schema.prisma`
```prisma
// schema.prisma
generator client {
provider = "prisma-client-js"
}
// new generator here ⬇️
generator realtime {
provider = "prisma-generator-postgres-realtime"
generatorConfigPath = "../src/realtime/configs.js" // (optional)
}
/// This is an user
model User {
id String @id
}
```
### Usage
1. Run `prisma generate` to generate the `prismaExtension.ts` file and migrations
2. Run `prisma migrate dev` to apply all generated migrations
3. Import the extension to your prisma client
```ts
/* src/db.ts */
import { PrismaClient } from "@prisma/client";
// Import auto generated extension
import { prismaRealtimeExtension } from './realtime/prismaExtension';
const prisma = new PrismaClient().$extends(PrismaExtension);
// global subscription
prisma.$subscribe(({ dbUser, model, newRow, oldRow, operation, tableName, tableSchema, timestamp }) => {
console.log(`${operation} in ${model} at ${timestamp}`)
})
// typesafe model subscription
prisma.user.$subscribe(({ dbUser, model, newRow, oldRow, operation, tableName, tableSchema, timestamp }) => {
console.log(`${operation} in ${model} at ${timestamp}`)
}, {
// (optional) Enable logs for connection, by defaults only shows errors
logLevel: "all",
// (optional) Custom postgres connection string, by default it uses the one from `process.env.DATABASE_URL`
connectionString: "postgres://postgres:postgres@localhost:5432/postgres"
})
```
### Configuration file (optional)
Create a configuration file (optional) and reference it in your `schema.prisma` generator config called `generatorConfigPath`
This configuration file enables some options like customize generated code, file paths, Prisma importer for some projects like Monorepos and disabling realtime for some specific models
```ts
// ./src/realtime/configs.js
// /** @type {import('prisma-generator-postgres-realtime').Config} */
/** @type {import('../../../../src').Config} */
module.exports = {
migrations: {
// Option to disable the generation of migrations
disabled: false,
// Directory to generate the custom migrations from project root
outputDirPath: "./prisma/migrations",
// Path to generate the status file to from project root
outputStatusFilePath: "./src/realtime/prismaRealtimeStatus.json",
// A function to replace generated source
replacer: (str) => str
// Included models in migrations
excludeModels: [],
// Excluded models in migrations (Ignored if includeModels is set)
includeModels: [],
},
extension: {
// Option to disable the generation of crud
disabled: false,
// Path to generate the inputs file to from project root
outputFilePath: "./src/realtime/prismaExtension.ts",
// The code to import the prisma client (Util for some projects like Monorepos)
prismaClientImporter: `import { Prisma } from "@prisma/client";`,
// A function to replace generated source
replacer: (str) => str,
},
global: {
// Function to run before generate
beforeGenerate: (dmmf) => {},
// Function to run after generate
afterGenerate: (dmmf) => {},
// A function to replace generated source
replacer: (str) => str,
// The name of the postgres trigger
triggerName: "prisma_postgres_realtime_trigger",
},
};
```
### Examples
Check for the [example](/examples/simple) for a running sample
### Disclaimer
#### Prisma Views
Currently, prisma does not enable us distinguish between models and views [(issue)](https://github.com/prisma/prisma/issues/17754). So if you are working with views you can disable generation of views from "options.migrations.excludeModels" or by simply deleting this part of code from the migration