packageSorter

Package Sorter

Sorting a group of packages that depends on each other

Having multiple projects in workspace depending on each other is a headache. You have to build core first, then the project depends on it, and so on. You probably want this step to be automated so you can use: package-sorter

npm install package-sorter

API

packageSorter(packages? Array, coreDependency? string)

Returns result object:

const { sorted, sortingMap, unSorted } = packageSorter(
  packages,
  coreDependency
);

If coreDependency is not passed, package-sorter will extract it following monorepo naming pattern as: @coreDep/

Example (1) - All Sorted

import packageSorter from "package-sorter";

// input packages

const pkg1 = {
  name: "@pkg/first",
  dependencies: {},
};

const pkg2 = {
  name: "@pkg/second",
  dependencies: {
    "@pkg/first": "^0.1.5",
  },
};

const pkg3 = {
  name: "@pkg/third",
  dependencies: {
    "@pkg/second": "^0.1.5",
  },
};

const packages = [pkg3, pkg2, pkg1];

// our core dependency in this case is: @pkg.
const { sorted, sortingMap, unSorted } = packageSorter(packages, "@pkg");

// sorted = [pkg1, pkg2, pkg3];

// sortingMap = [
//   { from: 2, to: 0 },
//   { from: 1, to: 1 },
//   { from: 0, to: 2 },
// ];

// unSorted = [];

Example (2) - Mixed Packages

import packageSorter from "package-sorter";

// input packages

const pkg1 = {
  name: "@pkg/first",
  dependencies: {},
};

const pkg2 = {
  name: "@pkg/second",
  dependencies: {
    "@pkg/first": "^0.1.5",
  },
};

const pkg3 = {
  name: "unrelated",
  dependencies: {},
};

const packages = [pkg3, pkg2, pkg1];

// let the function gets core dependency (@pkg) by itself
const { sorted, sortingMap, unSorted } = packageSorter(packages);

// sorted = [pkg3, pkg1, pkg2];

// sortingMap = [
//   { from: 0, to: 0 },
//   { from: 2, to: 1 },
//   { from: 1, to: 2 },
// ];

// unSorted = [];

Example (3) - Some Unsorted

import packageSorter from "package-sorter";

// input packages

const pkg1 = {
  name: "@pkg/first",
  dependencies: {},
};

const pkg2 = {
  name: "@pkg/second",
  dependencies: {
    "@pkg/first": "^0.1.5",
  },
};

const pkg3 = {
  name: "@pkg/unsortable",
  dependencies: {
    "@pkg/missing": "^0.1.5",
  },
};

const packages = [pkg3, pkg2, pkg1];

const { sorted, sortingMap, unSorted } = packageSorter(packages);

// sorted = [pkg1, pkg2];

// sortingMap = [
//   { from: 2, to: 0 },
//   { from: 1, to: 1 },
// ];

// unSorted = [pkg3];

Test

npm test

License

This project is licensed under the GPL-3.0 License