Skip to content

Commit

Permalink
fix(publish): Map packument requests concurrently directly from packa…
Browse files Browse the repository at this point in the history
…ge graph
  • Loading branch information
evocateur committed Jan 11, 2019
1 parent 713f72d commit c79a827
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 27 deletions.
44 changes: 40 additions & 4 deletions commands/publish/__tests__/get-unpublished-packages.test.js
Expand Up @@ -2,9 +2,15 @@

jest.mock("libnpm/packument");

// mocked module(s)
const getPackument = require("libnpm/packument");
const Project = require("@lerna/project");

// helpers
const PackageGraph = require("@lerna/package-graph");
const { getPackages } = require("@lerna/project");
const initFixture = require("@lerna-test/init-fixture")(__dirname);

// file under test
const getUnpublishedPackages = require("../lib/get-unpublished-packages");

getPackument.mockImplementation(async pkg => {
Expand All @@ -27,8 +33,38 @@ getPackument.mockImplementation(async pkg => {

test("getUnpublishedPackages", async () => {
const cwd = await initFixture("licenses-names");
const project = new Project(cwd);
const packages = await getPackages(cwd);
const packageGraph = new PackageGraph(packages);

const opts = new Map();
const pkgs = await getUnpublishedPackages(packageGraph, opts);

const pkgs = await getUnpublishedPackages(project, {});
expect(pkgs.map(p => p.name)).toEqual(["package-1", "package-3", "package-4", "package-5"]);
expect(pkgs).toMatchInlineSnapshot(`
Array [
PackageGraphNode {
"externalDependencies": Map {},
"localDependencies": Map {},
"localDependents": Map {},
"name": "package-1",
},
PackageGraphNode {
"externalDependencies": Map {},
"localDependencies": Map {},
"localDependents": Map {},
"name": "package-3",
},
PackageGraphNode {
"externalDependencies": Map {},
"localDependencies": Map {},
"localDependents": Map {},
"name": "package-4",
},
PackageGraphNode {
"externalDependencies": Map {},
"localDependencies": Map {},
"localDependents": Map {},
"name": "package-5",
},
]
`);
});
11 changes: 4 additions & 7 deletions commands/publish/__tests__/publish-command.test.js
Expand Up @@ -22,7 +22,6 @@ const checkWorkingTree = require("@lerna/check-working-tree");
const getNpmUsername = require("../lib/get-npm-username");
const verifyNpmPackageAccess = require("../lib/verify-npm-package-access");
const getUnpublishedPackages = require("../lib/get-unpublished-packages");
const Project = require("@lerna/project");

// helpers
const loggingOutput = require("@lerna-test/logging-output");
Expand Down Expand Up @@ -259,11 +258,10 @@ Map {
describe("from-package", () => {
it("publishes unpublished packages", async () => {
const testDir = await initFixture("normal");
const project = new Project(testDir);

getUnpublishedPackages.mockImplementationOnce(async () => {
const pkgs = await project.getPackages();
return pkgs.slice(1, 3);
getUnpublishedPackages.mockImplementationOnce(packageGraph => {
const pkgs = packageGraph.rawPackageList.slice(1, 3);
return pkgs.map(pkg => packageGraph.get(pkg.name));
});

await lernaPublish(testDir)("from-package");
Expand All @@ -277,9 +275,8 @@ Map {

it("publishes unpublished independent packages", async () => {
const testDir = await initFixture("independent");
const project = new Project(testDir);

getUnpublishedPackages.mockImplementationOnce(() => project.getPackages());
getUnpublishedPackages.mockImplementationOnce(packageGraph => Array.from(packageGraph.values()));

await lernaPublish(testDir)("from-package");

Expand Down
8 changes: 4 additions & 4 deletions commands/publish/index.js
Expand Up @@ -251,13 +251,13 @@ class PublishCommand extends Command {
detectFromPackage() {
let chain = Promise.resolve();

chain = chain.then(() => getUnpublishedPackages(this.project, this.conf.snapshot));
chain = chain.then(unpublishedPackages => {
if (!unpublishedPackages.length) {
chain = chain.then(() => getUnpublishedPackages(this.packageGraph, this.conf.snapshot));
chain = chain.then(unpublished => {
if (!unpublished.length) {
this.logger.notice("from-package", "No unpublished release found");
}

return unpublishedPackages.map(({ name }) => this.packageGraph.get(name));
return unpublished;
});

return chain.then(updates => {
Expand Down
21 changes: 9 additions & 12 deletions commands/publish/lib/get-unpublished-packages.js
@@ -1,33 +1,30 @@
"use strict";

const log = require("libnpm/log");
const pReduce = require("p-reduce");
const pMap = require("p-map");
const getPackument = require("libnpm/packument");

module.exports = getUnpublishedPackages;

function getUnpublishedPackages(project, opts) {
log.silly("getPackageVersions");
function getUnpublishedPackages(packageGraph, opts) {
log.silly("getUnpublishedPackages");

let chain = Promise.resolve();

const mapper = (unpublished, pkg) =>
const mapper = pkg =>
getPackument(pkg.name, opts).then(
packument => {
if (packument.versions[pkg.version] === undefined) {
unpublished.push(pkg);
return pkg;
}

return unpublished;
},
() => {
log.warn("", "Unable to determine published versions, assuming unpublished.");
return unpublished.concat([pkg]);
log.warn("", "Unable to determine published version, assuming %j unpublished.", pkg.name);
return pkg;
}
);

chain = chain.then(() => project.getPackages());
chain = chain.then(packages => pReduce(packages, mapper, []));
chain = chain.then(() => pMap(packageGraph.values(), mapper, { concurrency: 4 }));

return chain;
return chain.then(results => results.filter(Boolean));
}

0 comments on commit c79a827

Please sign in to comment.