/Prisma-MultiSchema

Organized Multi-Schema support for Prisma

Primary LanguageTypeScriptOtherNOASSERTION

NPM NPM Tests NPM Snyk

Prisma: MultiSchema NPM

Prisma normally limits your schema to one file, but with prisma-multischema, you can write multiple prisma schema files in an organized manner without any restrictions.

For Multiple files inter-relation you can import schemas , to manage the relation.

Built using TypeScript to for ES Module and CommonJS (CJS), to Unify Multiple Structured Schemas of Prisma-ORM

Installation

npm i prisma-multischema
yarn add prisma-multischema

Note Using VS Code ? Install Recommended VsCode Extensions from Dependencies (optional)

π™»πšŽπšŠπšŸπšŽ 𝚊 πš‚πšπšŠπš›β­ πš˜πš— πšπš‘πšŽ πšπšŽπš™πš˜ ,πš’πš 𝚒𝚘𝚞 πšπš˜πšžπš—πš πš’πš πš‘πšŽπš•πš™πšπšžπš•.
πš‚πšžπš™πš™πš˜πš›πšπšœ πšŠπš—πš πšπšŽπšŽπšπš‹πšŠπšŒπš” πš–πšŽπšŠπš—πšœ 𝚊 πš•πš˜πš πšŠπš—πš πšŽπš—πšŒπš˜πšžπš›πšŠπšπšŽπšœ πš–πšŽβ€οΈ.

Buy Me A Coffee

Usage

  • How to Use Tutorial : πŸ“šMediumBlog || ✨YT Link

  • Place all your schemas in ProjectRoot/prisma/subschemas Folder.
    Like this :

    project_root 
        β”œβ”€β”€β”€node_modules
        β”œβ”€β”€β”€prisma 
        β”‚   β”œβ”€β”€β”€subschemas <<<-----Place all your Schemas here
        β”‚   β”‚   β”œβ”€β”€β”€type 
        β”‚   β”‚   β”‚    └───user.types.prisma
        β”‚   β”‚   β”‚    └───bookmark.types.prisma
        β”‚   β”‚   └───user
        β”‚   β”‚   β”‚    └───userData.prisma
        β”‚   β”‚   β”‚    └───validity.prisma
        β”‚   β”‚   β”œβ”€β”€β”€anything-you-want.prisma
        β”‚   β”‚   β”œβ”€β”€β”€base.prisma  
        |   |   └───...  
        β”‚   └───schema.prisma   <-- will be Auto-Generated
        β”œβ”€β”€β”€src
        β”‚   └───...
        β”œβ”€β”€β”€package.json
        β”‚        
        └───.gitignore

    For Clearer View : Image

  • Run in Terminal

    npx prisma-multischema

Project Demonstration

working example is available below -

Example

Let's go with two schemas User and Bookmark on different files ,where the relation is -

  • A User can have many bookmarks
  • Each bookmark has an userId field

base.prisma [ root/prisma/subschemas/base.prisma ]

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "mongodb"
  url      = env("PRISMA_DATABASE_URL")
}

user.prisma [ root/prisma/subschemas/User/user.prisma ]

import { Bookmark } from "..\Bookmark\bookmark"
model User {

    id String @id @default(auto()) @map("_id") @db.ObjectId
    email String @unique

    Bookmark Bookmark[]
}
//MongoDB model IDs in prisma -must have a @map("_id") 
//https://www.prisma.io/docs/concepts/components/prisma-schema

bookmark.prisma [ root/prisma/subschemas/Bookmark/bookmark.prisma ]

import {  User } from "..\User\user"
model Bookmark {

    id String     @id  @db.ObjectId @default(auto()) @map("_id") 
    title String
    
    user  User    @relation(fields: [userId], references: [id])
    userId String @db.ObjectId
}

Generated schema.prisma [root/prisma/schema.prisma]
after Running npx prisma-multischema

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "mongodb" 
  url      = env("PRISMA_DATABASE_URL")
}

model User {
  id       String     @id @default(auto()) @map("_id") @db.ObjectId
  email    String     @unique
  Bookmark Bookmark[]
}

model Bookmark {
  id          String  @id @default(auto()) @map("_id") @db.ObjectId 
  title       String
  user        User    @relation(fields: [userId], references: [id])
  userId      String  @db.ObjectId
}

https://www.prisma.io/docs

Additional

  • prisma schema files starting with header //#exclude will be excluded in final schema

  • Executing npx prisma-multischema will

    • Automatically run : npx prisma generate
      So, You don't need to update @prisma/client manually, each time the schema updates
    • Automatically run : npx prisma format
      because, Everyone likes clean code
  • Add npx prisma-multischema command as a prefix to your start script in package.json.

    {
    "name": "my-app",
    "version": "1.0.0",
    "scripts": {
        "unify": "npx prisma-multischema",
        "start": "npm run unify && node index.js",
        ...
      }
    }


    Now it will run & regenerate Main Schema everytime the project starts.

Dependencies (optional)

To use prisma import feature : (if you are using VS code, its better to use these)

  • Install prisma-import Extension (for VS code)

  • Disable Official prisma Extension (for VS code)

These are Optional Dependencies, If you can maintain multiple *.prisma schemas without TYPO ,you can ignore these.

To-do's

  • Add Support for keeping prisma's in different folder and aggregate them ( like root/src/auth/auth.prisma )

  • Add Command Flags

  • Handle/Remove " Error validating datasource db: " Warning Fixed

Authors - @joydip007x