Skip to content

Commit

Permalink
feat: Support optionalDependencies
Browse files Browse the repository at this point in the history
Fixes #121
  • Loading branch information
evocateur committed Mar 28, 2018
1 parent 6abae76 commit b73e19d
Show file tree
Hide file tree
Showing 9 changed files with 59 additions and 5 deletions.
7 changes: 6 additions & 1 deletion commands/bootstrap/index.js
Expand Up @@ -287,7 +287,12 @@ class BootstrapCommand extends Command {
);

// collect root dependency versions
const mergedRootDeps = Object.assign({}, rootPkg.devDependencies, rootPkg.dependencies);
const mergedRootDeps = Object.assign(
{},
rootPkg.optionalDependencies,
rootPkg.devDependencies,
rootPkg.dependencies
);
const rootExternalVersions = new Map(
Object.keys(mergedRootDeps).map(externalName => [externalName, mergedRootDeps[externalName]])
);
Expand Down
Expand Up @@ -3,6 +3,9 @@
"dependencies": {
"package-1": "^1.0.0"
},
"optionalDependencies": {
"package-3": "^1.0.0"
},
"private": true,
"version": "1.0.0"
}
3 changes: 3 additions & 0 deletions commands/publish/__tests__/publish-command.test.js
Expand Up @@ -139,6 +139,9 @@ describe("PublishCommand", () => {
expect(updatedPackageJSON("package-5").dependencies).toMatchObject({
"package-1": "^1.0.1",
});
expect(updatedPackageJSON("package-5").optionalDependencies).toMatchObject({
"package-3": "^1.0.1",
});

expect(gitAddedFiles(testDir)).toMatchSnapshot("git added files");
expect(gitCommitMessage()).toEqual("v1.0.1");
Expand Down
7 changes: 6 additions & 1 deletion core/package-graph/index.js
Expand Up @@ -66,7 +66,12 @@ class PackageGraph extends Map {
const graphDependencies =
graphType === "dependencies"
? Object.assign({}, currentNode.pkg.dependencies)
: Object.assign({}, currentNode.pkg.devDependencies, currentNode.pkg.dependencies);
: Object.assign(
{},
currentNode.pkg.optionalDependencies,
currentNode.pkg.devDependencies,
currentNode.pkg.dependencies
);

Object.keys(graphDependencies).forEach(depName => {
const depNode = this.get(depName);
Expand Down
9 changes: 9 additions & 0 deletions core/package/__tests__/core-package.test.js
Expand Up @@ -96,6 +96,15 @@ describe("Package", () => {
});
});

describe("get .optionalDependencies", () => {
it("should return the optionalDependencies", () => {
const pkg = factory({
optionalDependencies: { "my-optional-dependency": "^1.0.0" },
});
expect(pkg.optionalDependencies).toEqual({ "my-optional-dependency": "^1.0.0" });
});
});

describe("get .peerDependencies", () => {
it("should return the peerDependencies", () => {
const pkg = factory({
Expand Down
12 changes: 11 additions & 1 deletion core/package/index.js
Expand Up @@ -65,6 +65,11 @@ class Package {
return pkg.devDependencies;
},
},
optionalDependencies: {
get() {
return pkg.optionalDependencies;
},
},
peerDependencies: {
get() {
return pkg.peerDependencies;
Expand Down Expand Up @@ -106,7 +111,12 @@ class Package {
// first, try runtime dependencies
let depCollection = this.json.dependencies;

// fall back to devDependencies (it will always be one of these two)
// try optionalDependencies if that didn't work
if (!depCollection || !depCollection[depName]) {
depCollection = this.json.optionalDependencies;
}

// fall back to devDependencies
if (!depCollection || !depCollection[depName]) {
depCollection = this.json.devDependencies;
}
Expand Down
Expand Up @@ -8,5 +8,8 @@
},
"dependencies": {
"pify": "^2.0.0"
},
"optionalDependencies": {
"tiny-tarball": "^1.0.0"
}
}
3 changes: 3 additions & 0 deletions integration/__snapshots__/lerna-publish.test.js.snap
Expand Up @@ -411,6 +411,9 @@ Array [
package-1: ^1.0.1,
},
name: package-5,
optionalDependencies: Object {
package-3: ^1.0.1,
},
private: true,
version: 1.0.1,
},
Expand Down
17 changes: 15 additions & 2 deletions integration/lerna-bootstrap.test.js
Expand Up @@ -25,7 +25,13 @@ describe("lerna bootstrap", () => {
expect(lock1).toMatchObject({
name: "@integration/package-1",
version: "1.0.0",
dependencies: { pify: expect.any(Object) },
dependencies: {
pify: expect.any(Object),
"tiny-tarball": {
version: "1.0.0",
optional: true,
},
},
});
expect(lock2).toMatchObject({
name: "@integration/package-2",
Expand Down Expand Up @@ -65,8 +71,15 @@ describe("lerna bootstrap", () => {
expect(rootLock).toMatchObject({
name: "integration",
version: "0.0.0",
dependencies: { pify: expect.any(Object) },
dependencies: {
pify: expect.any(Object),
"tiny-tarball": {
version: "1.0.0",
// root hoist does not preserve optional
},
},
});
expect(rootLock).not.toHaveProperty("dependencies.tiny-tarball.optional");
});

test("--npm-client yarn", async () => {
Expand Down

0 comments on commit b73e19d

Please sign in to comment.