From 67abbf19cd393fb1a67ca80db2bbcdb2860dd879 Mon Sep 17 00:00:00 2001 From: Zoltan Kochan Date: Tue, 20 Nov 2018 01:22:35 +0200 Subject: [PATCH] fix(headless): use headless install on monorepo with dir deps --- packages/supi/src/install/index.ts | 2 +- .../supi/test/install/multipleImporters.ts | 46 +++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/packages/supi/src/install/index.ts b/packages/supi/src/install/index.ts index 8ee3bd07c3..e0c2c908c1 100644 --- a/packages/supi/src/install/index.ts +++ b/packages/supi/src/install/index.ts @@ -338,7 +338,7 @@ async function linkedPackagesAreUpToDate ( for (const depName of depNames) { if (!pkgDeps[depName]) continue const isLinked = importerDeps[depName].startsWith('link:') - if (isLinked && pkgDeps[depName].startsWith('link:')) continue + if (isLinked && (pkgDeps[depName].startsWith('link:') || pkgDeps[depName].startsWith('file:'))) continue const dir = isLinked ? path.join(prefix, importerDeps[depName].substr(5)) : (localPackages && localPackages[depName] && localPackages[depName] && localPackages[depName][importerDeps[depName]] && localPackages[depName][importerDeps[depName]].directory) diff --git a/packages/supi/test/install/multipleImporters.ts b/packages/supi/test/install/multipleImporters.ts index 800e598718..53a0f610fa 100644 --- a/packages/supi/test/install/multipleImporters.ts +++ b/packages/supi/test/install/multipleImporters.ts @@ -2,6 +2,7 @@ import assertProject from '@pnpm/assert-project' import { preparePackages } from '@pnpm/prepare' import path = require('path') import readPkg = require('read-pkg') +import sinon = require('sinon') import { install, installPkgs } from 'supi' import tape = require('tape') import promisifyTape from 'tape-promise' @@ -158,3 +159,48 @@ test('adding a new dev dependency to project that uses a shared shrinkwrap', asy t.deepEqual(pkg.dependencies, { 'is-positive': '1.0.0' }, 'prod deps unchanged in package.json') t.deepEqual(pkg.devDependencies, { 'is-negative': '^1.0.0' }, 'dev deps have a new dependency in package.json') }) + +test('headless install is used when package link to another package in the workspace', async (t) => { + const projects = preparePackages(t, [ + { + name: 'project-1', + version: '1.0.0', + + dependencies: { + 'is-positive': '1.0.0', + 'project-2': 'file:../project-2', + }, + }, + { + name: 'project-2', + version: '1.0.0', + + dependencies: { + 'is-negative': '1.0.0', + }, + }, + ]) + + const importers = [ + { + prefix: path.resolve('project-1'), + }, + { + prefix: path.resolve('project-2'), + }, + ] + await install(await testDefaults({ importers, shrinkwrapOnly: true })) + + const reporter = sinon.spy() + await install(await testDefaults({ importers: importers.slice(0, 1), reporter })) + + t.ok(reporter.calledWithMatch({ + level: 'info', + message: 'Performing headless installation', + name: 'pnpm', + }), 'start of headless installation logged') + + await projects['project-1'].has('is-positive') + await projects['project-1'].has('project-2') + await projects['project-2'].hasNot('is-negative') +})