diff --git a/src/link/index.ts b/src/link/index.ts index 842b17254c..e49062f6ce 100644 --- a/src/link/index.ts +++ b/src/link/index.ts @@ -39,7 +39,7 @@ export default async function ( bin: string, } ): Promise { - const pkgsToLink = await resolvePeers(R.values(installedPkgs) + const pkgsToLinkMap = R.values(installedPkgs) .reduce((pkgsToLink, installedPkg) => { pkgsToLink[installedPkg.id] = { id: installedPkg.id, @@ -53,7 +53,9 @@ export default async function ( dependencies: installedPkg.dependencies, } return pkgsToLink - }, {}), topPkgs.filter(pkg => pkg.isInstallable).map(pkg => pkg.id)) + }, {}) + const topPkgIds = topPkgs.filter(pkg => pkg.isInstallable).map(pkg => pkg.id) + const pkgsToLink = await resolvePeers(pkgsToLinkMap, topPkgIds) const flatResolvedDeps = R.values(pkgsToLink).sort((a, b) => a.depth - b.depth) diff --git a/src/link/resolvePeers.ts b/src/link/resolvePeers.ts index 0c4ac0c35e..a2518ab910 100644 --- a/src/link/resolvePeers.ts +++ b/src/link/resolvePeers.ts @@ -96,12 +96,12 @@ function getNonCircularDependencies ( function resolvePeersOfNode ( nodeId: string, - parentPkgs: {[name: string]: TreeNode}, + parentPkgs: ParentRefs, tree: {[nodeId: string]: TreeNode} ): DependencyTreeNodeMap { const node = tree[nodeId] const newParentPkgs = Object.assign({}, parentPkgs, - {[node.pkg.name]: node}, + {[node.pkg.name]: {version: node.pkg.version, nodeId: node.nodeId}}, toPkgByName(R.props(node.children, tree)) ) @@ -132,7 +132,7 @@ function resolvePeersOfNode ( function resolvePeers ( peerDependencies: Dependencies, pkgId: string, - parentPkgs: {[name: string]: TreeNode}, + parentPkgs: ParentRefs, ): string[] { return R.toPairs(peerDependencies) .map(R.apply((peerName: string, peerVersionRange: string) => { @@ -143,8 +143,8 @@ function resolvePeers ( return null } - if (!semver.satisfies(resolved.pkg.version, peerVersionRange)) { - logger.warn(`${pkgId} requires a peer of ${peerName}@${peerVersionRange} but version ${resolved.pkg.version} was installed.`) + if (!semver.satisfies(resolved.version, peerVersionRange)) { + logger.warn(`${pkgId} requires a peer of ${peerName}@${peerVersionRange} but version ${resolved.version} was installed.`) } return resolved && resolved.nodeId @@ -152,8 +152,20 @@ function resolvePeers ( .filter(Boolean) as string[] } -function toPkgByName(pkgs: TreeNode[]): {[pkgName: string]: TreeNode} { - const toNameAndPkg = R.map((node: TreeNode): R.KeyValuePair => [node.pkg.name, node]) +type ParentRefs = { + [name: string]: ParentRef +} + +type ParentRef = { + version: string, + nodeId: string, +} + +function toPkgByName(pkgs: TreeNode[]): ParentRefs { + const toNameAndPkg = R.map((node: TreeNode): R.KeyValuePair => [ + node.pkg.name, + {version: node.pkg.version, nodeId: node.nodeId} + ]) return R.fromPairs(toNameAndPkg(pkgs)) }