pnpm-monorepo-example
pnpm-monorepo-example copied to clipboard
Opinionated Node.js monorepo example with pnpm, turborepo, and jest
pnpm-monorepo-example
Practical example of a
TypeScriptmonorepo withpnpm,turborepo, andjest.
What's Included
pnpmworkspace, whose configuration is stored inpnpm-workspace.yaml. Two example packages are included,common-utilsandexample, with the latter importingcommon-utilsas a dependency. All local packages are decorated with a@jkomyno/*scope (you may want to substitute these instances in thenameentries of anypackage.jsonwith yours or your company's name).turborepo, whose configuration is stored inturbo.json- an example
Dockerfilethat can be built and used as a base image for your Node.js Docker containers. - the
jesttest engine, whose configuration is stored in thepackages/jestfolder. - opinionated
prettierandeslintsetups.
Available Scripts
pnpm install: install the dependencies needed for each package.pnpm build: transpile the local TypeScript packages to JavaScript.pnpm eslint-check: check that the code follows theeslintguidelines.pnpm prettier-check: check that the code follows theprettierguidelines.pnpm prettier-write: override the code to follow theprettierguidelines.pnpm test:unit: run unit tests.pnpm test:integration: run integration tests.
Test Structure
We follow an opinionated convention for storing an running tests.
All tests should be written in the __tests__ directory of a local package.
Moreover, unit tests should be placed in the __tests__/unit folder; similarly, integration tests should be placed in the __tests__/integration folder.
This allows for easily running groups of tests (for instance, you might want to run unit tests locally, while deferring integration tests - that will probably need access to external services like Docker containers - to the CI only).
In each local package's package.json file, make sure to replace the JEST_LIB_UNDER_TEST environment variable declaration with the local package name, for each test* command in the scripts section.
FAQ
- How do I add a new package to the local workspace?
- Create a new folder
$packageNameinpackages/. Initialize it with atsconfig.jsonfile (which will reference thetsconfig.base.node.jsonfile at the root level) and apackage.jsonfile similarly to how it's done in thecommon-utilspackage.
- How do I add a new depedency that should be available to each package in the local workspace?
pnpm add -w $dependencyName
👤 Author
Hi, I'm Alberto Schiabel, you can follow me on:
🦄 Show your support
Give a ⭐️ if this project helped or inspired you!
📝 License
Built with ❤️ by Alberto Schiabel.
This project is MIT licensed.