Skip to content

Commit

Permalink
fix(peers): binstubs of peer dependencies are linked to the dependent…
Browse files Browse the repository at this point in the history
… package's bin folder
  • Loading branch information
zkochan committed Mar 26, 2017
1 parent 77f752e commit 1a7528d
Show file tree
Hide file tree
Showing 4 changed files with 15 additions and 28 deletions.
1 change: 0 additions & 1 deletion src/api/install.ts
Expand Up @@ -3,7 +3,6 @@ import RegClient = require('npm-registry-client')
import logger from 'pnpm-logger'
import pLimit = require('p-limit')
import npa = require('npm-package-arg')
import symlinkDir from 'symlink-dir'
import pFilter = require('p-filter')
import isInnerLink from '../isInnerLink'
import {PnpmOptions, StrictPnpmOptions, Dependencies} from '../types'
Expand Down
8 changes: 3 additions & 5 deletions src/link/index.ts
Expand Up @@ -10,7 +10,7 @@ import {InstalledPackage} from '../install/installMultiple'
import {InstalledPackages} from '../api/install'
import linkBins from './linkBins'
import {Package} from '../types'
import linkPeers from './linkPeers'
import resolvePeers from './resolvePeers'

export type LinkedPackage = {
id: string,
Expand All @@ -35,7 +35,7 @@ export default async function (
baseNodeModules: string,
}
): Promise<LinkedPackagesMap> {
const pkgsToLink = R.values(installedPkgs)
const pkgsToLink = await resolvePeers(R.values(installedPkgs)
.filter(installedPkg => installedPkg.isInstallable)
.reduce((pkgsToLink, installedPkg) => {
const modules = path.join(opts.baseNodeModules, `.${installedPkg.id}`, 'node_modules')
Expand All @@ -49,7 +49,7 @@ export default async function (
dependencies: installedPkg.dependencies,
}
return pkgsToLink
}, {})
}, {}))

for (let id of R.keys(pkgsToLink)) {
await linkPkg(pkgsToLink[id], opts)
Expand All @@ -67,8 +67,6 @@ export default async function (
const binPath = opts.global ? globalBinPath() : path.join(opts.baseNodeModules, '.bin')
await linkBins(opts.baseNodeModules, binPath)

await linkPeers(<LinkedPackage[]>R.values(pkgsToLink))

return pkgsToLink
}

Expand Down
32 changes: 11 additions & 21 deletions src/link/linkPeers.ts → src/link/resolvePeers.ts
@@ -1,49 +1,39 @@
import mkdirp = require('mkdirp-promise')
import symlinkDir from 'symlink-dir'
import path = require('path')
import semver = require('semver')
import {InstalledPackages} from '../api/install'
import {Package} from '../types'
import {LinkedPackage} from '.'
import {LinkedPackagesMap} from '.'
import logger from 'pnpm-logger'

type Dict<T> = {
[index: string]: T
}
import R = require('ramda')

type PackageVersions = {
[version: string]: LinkedPackage
[version: string]: string
}

type InstalledPackageVersions = {
[pkgName: string]: PackageVersions
}

export default async function linkPeers (pkgs: LinkedPackage[]) {
if (!pkgs) return

export default async function linkPeers (pkgs: LinkedPackagesMap): Promise<LinkedPackagesMap> {
const groupedPkgs: InstalledPackageVersions = {}

pkgs.forEach(pkgData => {
R.values(pkgs).forEach(pkgData => {
if (!pkgData.pkg.version) return

const pkgName = pkgData.pkg.name
groupedPkgs[pkgName] = groupedPkgs[pkgName] || {}
groupedPkgs[pkgName][pkgData.pkg.version] = pkgData
groupedPkgs[pkgName][pkgData.pkg.version] = pkgData.id
})

return Promise.all(pkgs.map(pkgData => {
await Promise.all(R.values(pkgs).map(async pkgData => {
const peerDependencies = pkgData.pkg.peerDependencies || {}
return Promise.all(Object.keys(peerDependencies).map(peerName => {
await Promise.all(Object.keys(peerDependencies).map(async peerName => {
const version = semver.maxSatisfying(Object.keys(groupedPkgs[peerName] || {}), peerDependencies[peerName], true)
if (!version) {
logger.warn(`${pkgData.id} requires a peer of ${peerName}@${peerDependencies[peerName]} but none was installed.`)
return
}
return symlinkDir(
groupedPkgs[peerName][version].hardlinkedLocation,
path.join(pkgData.modules, peerName)
)
pkgData.dependencies.push(groupedPkgs[peerName][version])
}))
}))

return pkgs
}
2 changes: 1 addition & 1 deletion tsconfig.json
Expand Up @@ -66,7 +66,7 @@
"src/isInnerLink.ts",
"src/link/index.ts",
"src/link/linkBins.ts",
"src/link/linkPeers.ts",
"src/link/resolvePeers.ts",
"src/logging/fileLogger.ts",
"src/logging/logInstallStatus.ts",
"src/logging/streamParser.ts",
Expand Down

0 comments on commit 1a7528d

Please sign in to comment.