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.
- 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
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.
To import an package (app or library) into another one:
- 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"
}
- Use it in your code like this:
import { MyCommonModule } from '@acme/common';
Note: After cloning, replace all
acme
s with your organization/project name.
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();
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.