Skip to content

Commit

Permalink
feat(listable): Add --toposort option
Browse files Browse the repository at this point in the history
Fixes #1652
  • Loading branch information
evocateur committed Dec 7, 2018
1 parent 65a1d1b commit b387881
Show file tree
Hide file tree
Showing 8 changed files with 78 additions and 4 deletions.
1 change: 1 addition & 0 deletions commands/changed/README.md
Expand Up @@ -23,6 +23,7 @@ package-2
* [`-a`, `--all`](https://github.com/lerna/lerna/tree/master/commands/list#--all)
* [`-l`, `--long`](https://github.com/lerna/lerna/tree/master/commands/list#--long)
* [`-p`, `--parseable`](https://github.com/lerna/lerna/tree/master/commands/list#--parseable)
* [`--toposort`](https://github.com/lerna/lerna/tree/master/commands/list#--toposort)

Unlike `lerna ls`, however, `lerna changed` **does not** support [filter options](https://www.npmjs.com/package/@lerna/filter-options), as filtering is not supported by `lerna version` or `lerna publish`.

Expand Down
16 changes: 16 additions & 0 deletions commands/list/README.md
Expand Up @@ -28,6 +28,7 @@ In any case, you can always pass `--loglevel silent` to create pristine chains o
* [`-a`, `--all`](#--all)
* [`-l`, `--long`](#--long)
* [`-p`, `--parseable`](#--parseable)
* [`--toposort`](#--toposort)

`lerna ls` also respects all available [Filter Flags](https://www.npmjs.com/package/@lerna/filter-options).

Expand Down Expand Up @@ -114,3 +115,18 @@ $ lerna ls -pla
/path/to/packages/pkg-2:package-2:1.0.2
/path/to/packages/pkg-3:package-3:1.0.3:PRIVATE
```

### `--toposort`

Sort packages in topological order (dependencies before dependents) instead of lexical by directory.

```sh
$ json dependencies <packages/pkg-1/package.json
{
"pkg-2": "file:../pkg-2"
}

$ lerna ls --toposort
package-2
package-1
```
1 change: 1 addition & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

38 changes: 35 additions & 3 deletions utils/listable/__tests__/listable-format.test.js
Expand Up @@ -4,6 +4,7 @@ const chalk = require("chalk");
const path = require("path");
const tempy = require("tempy");
const Package = require("@lerna/package");
const loggingOutput = require("@lerna-test/logging-output");
const listable = require("..");

// keep snapshots stable cross-platform
Expand Down Expand Up @@ -34,9 +35,18 @@ describe("listable.format()", () => {
process.chdir(cwd);

packages = [
new Package({ name: "pkg-1", version: "1.0.0" }, path.join(cwd, "/pkgs/pkg-1")),
new Package({ name: "pkg-2" }, path.join(cwd, "/pkgs/pkg-2")),
new Package({ name: "pkg-3", version: "3.0.0", private: true }, path.join(cwd, "/pkgs/pkg-3")),
new Package(
{ name: "pkg-1", version: "1.0.0", dependencies: { "pkg-2": "file:../pkg-2" } },
path.join(cwd, "/pkgs/pkg-1")
),
new Package(
{ name: "pkg-2", devDependencies: { "pkg-3": "file:../pkg-3" } },
path.join(cwd, "/pkgs/pkg-2")
),
new Package(
{ name: "pkg-3", version: "3.0.0", dependencies: { "pkg-2": "file:../pkg-2" }, private: true },
path.join(cwd, "/pkgs/pkg-3")
),
];
});

Expand Down Expand Up @@ -174,6 +184,28 @@ pkg-3 v3.0.0 pkgs/pkg-3 (PRIVATE)
expect(text).toMatchInlineSnapshot(`
pkg-1 v1.0.0 pkgs/pkg-1
pkg-2 MISSING pkgs/pkg-2
`);
});
});

describe("toposort", () => {
test("output", () => {
const { text } = formatWithOptions({ toposort: true });

expect(text).toMatchInlineSnapshot(`
pkg-2
pkg-1
`);
});

test("cycles", () => {
const { text } = formatWithOptions({ toposort: true, all: true });

expect(loggingOutput("warn")).toContainEqual(expect.stringContaining("pkg-2 -> pkg-3 -> pkg-2"));
expect(text).toMatchInlineSnapshot(`
pkg-2
pkg-3 (PRIVATE)
pkg-1
`);
});
});
Expand Down
4 changes: 4 additions & 0 deletions utils/listable/__tests__/listable-options.test.js
Expand Up @@ -33,4 +33,8 @@ describe("listable.options()", () => {
it("provides --parseable alias -p", () => {
expect(parsed("-p")).toHaveProperty("parseable", true);
});

it("provides --toposort", () => {
expect(parsed("--toposort")).toHaveProperty("toposort", true);
});
});
16 changes: 15 additions & 1 deletion utils/listable/lib/listable-format.js
Expand Up @@ -3,6 +3,7 @@
const chalk = require("chalk");
const columnify = require("columnify");
const path = require("path");
const batchPackages = require("@lerna/batch-packages");

module.exports = listableFormat;

Expand Down Expand Up @@ -32,11 +33,24 @@ function parseViewOptions(options) {
showLong: alias === "la" || alias === "ll" || options.long,
showJSON: options.json,
showParseable: options.parseable,
isTopological: options.toposort,
};
}

function flatBatched(pkgList) {
const batches = batchPackages(pkgList);

return batches.reduce((acc, batch) => acc.concat(batch), []);
}

function filterResultList(pkgList, viewOptions) {
return viewOptions.showAll ? pkgList.slice() : pkgList.filter(pkg => !pkg.private);
let result = viewOptions.showAll ? pkgList.slice() : pkgList.filter(pkg => !pkg.private);

if (viewOptions.isTopological) {
result = flatBatched(result);
}

return result;
}

function formatJSON(resultList) {
Expand Down
5 changes: 5 additions & 0 deletions utils/listable/lib/listable-options.js
Expand Up @@ -27,5 +27,10 @@ function listableOptions(yargs) {
type: "boolean",
alias: "parseable",
},
toposort: {
group: "Command Options:",
describe: "Sort packages in topological order instead of lexical by directory",
type: "boolean",
},
});
}
1 change: 1 addition & 0 deletions utils/listable/package.json
Expand Up @@ -28,6 +28,7 @@
"test": "echo \"Error: run tests from root\" && exit 1"
},
"dependencies": {
"@lerna/batch-packages": "file:../batch-packages",
"chalk": "^2.3.1",
"columnify": "^1.5.4"
}
Expand Down

0 comments on commit b387881

Please sign in to comment.