Skip to content

πŸ”„ Dependencies sorting algorithm. It sorts, retrieves unsortable, and returns sorting history for each package

License

Notifications You must be signed in to change notification settings

jalal246/packageSorter

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

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:

  • sorted: Array <sortedPkgJson> - all sorted packages in order.
  • sortingMap: Array <sortingMap>- map of package sorting contains:
    • form: number - original package index before sorting.
    • to: number - current package index after sorting.
  • unSorted: Array <unsortedPkgJson> - unsortable package that's missing dependency.
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

Related projects

  • move-position - Moves element index in given array from position A to B.

  • builderz - Zero Configuration JS bundler.

  • corename - Extracts package name.

  • get-info - Utility functions for projects production.

  • textics & textics-stream - Counts lines, words, chars and spaces for a given string.

  • folo - Form & Layout Components Built with React.