Skip to content
This repository has been archived by the owner on Apr 17, 2024. It is now read-only.

🐈 NestJS + Prisma + Yarn Workspaces (Monorepo) full-stack project template

Notifications You must be signed in to change notification settings

alitnk/nestjs-prisma-monorepo

Repository files navigation

Nest Prisma Monorepo

This template is what I came up with after I learned about monorepos and played with them for a while, hope you find it helpful! I recommend you use one of the alternatives.

About

  • Nest.js + JWT + GraphQL (code-first) + REST + Swagger*
  • Prisma + utilities
  • Front-end app **
  • Full Typescript support
  • Common package
  • Core package + NestJS utilites
  • ESLint Ready (yarn lint)
  • Prettier Ready
  • CI for GitHub Actions
  • Yarn (berry) version 3.1.0 (PnP disabled since it's not supported by NestJs and Prisma yet)

*The api app is a clone of this other awesome template

** The front-end app is just a static HTML file, since people might use different frameworks with NestJS, so feel free to add a NextJS / NuxtJS / Angular / Svelte / etc. as your front-end

Structure

This template follows Nest.js's convention of monorepo, so there are Apps and then there are Libraries.

πŸ“¦ nest-prisma-monorepo
 ┣ πŸ“‚ apps
 ┃ ┣ πŸ“‚ api
 ┃ ┣ πŸ“‚ web
 ┃ β”— πŸ“‚ etc.
 ┣ πŸ“‚ libs
 ┃ ┣ πŸ“‚ common 
 ┃ ┣ πŸ“‚ core 
 ┃ ┣ πŸ“‚ prisma
 ┃ β”— πŸ“‚ etc.
 ┣ πŸ“œ.eslintrc.js
 ┣ πŸ“œ.prettierrc
 ┣ πŸ“œ.yarnrc.yml
  • core and common are imported from your back-end apps.
  • prisma is used by your back-end apps that need database.
  • common is shared between all of your apps.

How to import from other apps/libraries

To import an package (app or library) into another one:

  1. Add the package as a dependency like so:
{
  "dependencies": {
    "@acme/common": "workspace:*"
  }
}

Note that the @acme/common name, comes from libs/common/package.json's name key:

{
  "name": "@acme/common"
}
  1. Use it in your code like this:
import { MyCommonModule } from '@acme/common';

Note: After cloning, replace all acmes with your organization/project name.

Note about Prisma

Instead of importing your Prisma modules from @prisma/client, now you import them from @acme/prisma.

This way you can defined your schema in a "library" and then import the prisma client in different apps, accessing the same database.

For instance:

import { PrismaClient } from '@acme/prisma';

const prisma = new PrismaClient();

Note about .env files

After you clone the template, you gotta create two environment files, one in apps/api and one in lib/prisma. You could just copy .env.example and rename it to .env and fill it with your own values.

Alternatives