Skip to content

joydip007x/Prisma-MultiSchema

Repository files navigation

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