Composite Builds

Composite Builds

Updated: January 17, 2021
TypeScript Programming Monorepo

TypeScript has a way of describing a build process as multiple subpieces of a project. This saves from having to build every piece, and instead build independent parts and stitch them together as needed.

In a monorepo environment, multiple packages will have multiple builds and, possibly, refer to those builds amongst each other.

The root tsconfig.json file can be used, but a problem of independent sources of truth arises. For instance, one project may have a different level of type strictness, or use a different version of Node. Rather than forcing every package to abide by a given rule, it is advantageous to have thin configurations for independent packages, but have them all rely on the more general rules in the root-level tsconfig.json file.

The key to having multiple TS configs coexisting together is in a given package’s tsconfig file, under the compilerOptions"composite": true. This tells the compiler that this is one piece of a larger project.

Building a composite set of packages like this will produce a tsconfig.buildinfo file, which–basically–holds a set of checksums of each file in its current state and when it was last built. By comparing the version and signature attributes of a given section within the buildinfo file, the TS compiler can know when to rebuild that specific piece.