@mono-repo/utils v1.4.4
Core util functions to aid writing tools and libraries for managing mono repos.
Getting started
yarn add @mono-repo/utils
Usage
findMonoRepo({ cwd: string })
Walks up directories until it finds a mono repo root directory then returns it's config.
import { findMonoRepo } from "@mono-repo/utils";
const monoRepo = await findMonoRepo({
cwd: process.cwd(), // default
});
console.log(monoRepo);
/**
* {
* dir: "/absolute/path/to/root",
* packageGlobs: ["packages/**"],
* }
*/
Currently only supports using Yarn Workspaces config.
findPackages(monoRepo, { order: "alphabetical" | "dependency-graph", scope: package | undefined })
Find packages within a mono repo.
By default packages are returned in alphabetical order.
import { findMonoRepo, findPackages } from "@mono-repo/utils";
const monoRepo = await findMonoRepo();
const packages = await findPackages(monoRepo, { order: "alphabetical" });
console.log(packages);
/**
* [
* {
* dir: "/absolute/path/to/package/a",
* json: {
* name: "a",
* version: "1.0.0",
* license: "MIT",
* public: true,
* ...
* }
* },
* {
* dir: "/absolute/path/to/package/b",
* json: {
* name: "b",
* version: "1.0.0",
* license: "MIT",
* public: true,
* ...
* }
* }
* ]
*
*
*/
You can also return packages in dependency-graph order. This is very useful for getting all packages in a mono repo in an optimal build order.
import { findMonoRepo, findPackages } from "@mono-repo/utils";
const monoRepo = await findMonoRepo();
const packages = await findPackages(monoRepo, { order: "dependency-graph" });
console.log(packages);
/**
* [
* {
* dir: "/absolute/path/to/package/b",
* json: {
* name: "b",
* version: "1.0.0",
* license: "MIT",
* public: true,
* ...
* }
* },
* {
* dir: "/absolute/path/to/package/a",
* json: {
* name: "a",
* version: "1.0.0",
* license: "MIT",
* public: true,
* dependencies: {
* "b": "1.0.0"
* }
* ...
* }
* }
* ]
*/
You can also return packages that are in the dependency tree on a particular package. This is very useful for getting all the packages required to build just a particular particular package in an optimal build order.
import { findMonoRepo, findPackages } from "@mono-repo/utils";
const monoRepo = await findMonoRepo();
const packages = await findPackages(monoRepo);
console.log(packages);
/**
* [
* {
* dir: "/absolute/path/to/package/a",
* json: {
* name: "a",
* version: "1.0.0",
* license: "MIT",
* public: true,
* dependencies: {
* "b": "1.0.0"
* }
* ...
* }
* },
* {
* dir: "/absolute/path/to/package/b",
* json: {
* name: "b",
* version: "1.0.0",
* license: "MIT",
* public: true,
* ...
* }
* },
* {
* dir: "/absolute/path/to/package/c",
* json: {
* name: "c",
* version: "1.0.0",
* license: "MIT",
* public: true,
* dependencies: {
* "a": "1.0.0"
* }
* ...
* }
* },
* ]
*/
const packageADependencies = await findPackages(monoRepo, {
order: "dependency-graph",
scope: packages[0],
});
console.log(packageADependencies);
/**
* [
* {
* dir: "/absolute/path/to/package/b",
* json: {
* name: "b",
* version: "1.0.0",
* license: "MIT",
* public: true,
* ...
* }
* },
* ]
*/
findPackageGroups(monoRepo, { groupBy: "parallelizable" })
Find packages within a mono repo and group them in groups that are safe to perform parallel tasks on such as building in dependency order efficiently.
import { findMonoRepo, findPackageGroups } from "@mono-repo/utils";
const monoRepo = await findMonoRepo();
const packageGroups = await findPackageGroups(monoRepo, {
order: "parallelizable",
});
console.log(packageGroups);
/**
* [
* [
* {
* dir: "/absolute/path/to/package/b",
* json: {
* name: "b",
* version: "1.0.0",
* license: "MIT",
* public: true,
* ...
* }
* },
* {
* dir: "/absolute/path/to/package/c",
* json: {
* name: "c",
* version: "1.0.0",
* license: "MIT",
* public: true,
* ...
* }
* }
* ],
* [
* {
* dir: "/absolute/path/to/package/a",
* json: {
* name: "a",
* version: "1.0.0",
* license: "MIT",
* public: true,
* dependencies: {
* "b": "1.0.0"
* }
* ...
* }
* }
* ]
* ]
*/