diff --git a/src/api/install.ts b/src/api/install.ts index 16046a77fa2..37900cc4442 100644 --- a/src/api/install.ts +++ b/src/api/install.ts @@ -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' diff --git a/src/link/index.ts b/src/link/index.ts index f8ae78ffc1d..8cb43f6cac4 100644 --- a/src/link/index.ts +++ b/src/link/index.ts @@ -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, @@ -35,7 +35,7 @@ export default async function ( baseNodeModules: string, } ): Promise { - 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') @@ -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) @@ -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(R.values(pkgsToLink)) - return pkgsToLink } diff --git a/src/link/linkPeers.ts b/src/link/resolvePeers.ts similarity index 52% rename from src/link/linkPeers.ts rename to src/link/resolvePeers.ts index ffa4457c0d8..85ab47a060c 100644 --- a/src/link/linkPeers.ts +++ b/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 = { - [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 { 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 } diff --git a/tsconfig.json b/tsconfig.json index 151ac3769d3..06b7e6317c0 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -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",