Skip to content

jkomyno/pnpm-monorepo-example

Repository files navigation

pnpm-monorepo-example

Github Actions

Practical example of a TypeScript monorepo with pnpm, turborepo, and jest.


What's Included

  • pnpm workspace, whose configuration is stored in pnpm-workspace.yaml. Two example packages are included, common-utils and example, with the latter importing common-utils as a dependency. All local packages are decorated with a @jkomyno/* scope (you may want to substitute these instances in the name entries of any package.json with yours or your company's name).
  • turborepo, whose configuration is stored in turbo.json
  • an example Dockerfile that can be built and used as a base image for your Node.js Docker containers.
  • the jest test engine, whose configuration is stored in the packages/jest folder.
  • opinionated prettier and eslint setups.

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 the eslint guidelines.
  • pnpm prettier-check: check that the code follows the prettier guidelines.
  • pnpm prettier-write: override the code to follow the prettier guidelines.
  • 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

  1. How do I add a new package to the local workspace?
  • Create a new folder $packageName in packages/. Initialize it with a tsconfig.json file (which will reference the tsconfig.base.node.json file at the root level) and a package.json file similarly to how it's done in the common-utils package.
  1. 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.

About

Opinionated Node.js monorepo example with pnpm, turborepo, and jest

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published