fix: installing in single project of a workspace

close #4073
This commit is contained in:
Zoltan Kochan
2022-01-03 20:03:59 +02:00
parent 0d1424b978
commit 03eace5d05
2 changed files with 45 additions and 2 deletions

View File

@@ -1,6 +1,6 @@
import fs from 'fs'
import path from 'path'
import { addDependenciesToPackage, install } from '@pnpm/core'
import { addDependenciesToPackage, install, mutateModules } from '@pnpm/core'
import { prepareEmpty } from '@pnpm/prepare'
import { sync as loadJsonFile } from 'load-json-file'
import { addDistTag, testDefaults } from '../utils'
@@ -66,3 +66,46 @@ test('preserve subdeps on update', async () => {
expect(loadJsonFile<{ version: string }>('node_modules/foobarqar/package.json').version).toBe('1.0.1')
expect(loadJsonFile<{ version: string }>('node_modules/foobarqar/node_modules/bar/package.json').version).toBe('100.0.0')
})
test('adding a new dependency to one of the the workspace projects', async () => {
prepareEmpty()
let [{ manifest }] = await mutateModules([
{
buildIndex: 0,
manifest: {
name: 'project-1',
version: '1.0.0',
dependencies: {
bar: '100.0.0',
},
},
mutation: 'install',
rootDir: path.resolve('project-1'),
},
{
buildIndex: 1,
manifest: {
name: 'project-2',
version: '1.0.0',
dependencies: {
foobarqar: '1.0.0',
},
},
mutation: 'install',
rootDir: path.resolve('project-2'),
},
], await testDefaults({ nodeLinker: 'hoisted' }))
manifest = await addDependenciesToPackage(
manifest,
['is-negative@1.0.0'],
await testDefaults({ nodeLinker: 'hoisted', prefix: path.resolve('project-1'), targetDependenciesField: 'devDependencies' })
)
expect(manifest.dependencies).toStrictEqual({ bar: '100.0.0' })
expect(manifest.devDependencies).toStrictEqual({ 'is-negative': '1.0.0' })
expect(loadJsonFile<{ version: string }>('node_modules/bar/package.json').version).toBe('100.0.0')
expect(loadJsonFile<{ version: string }>('node_modules/is-negative/package.json').version).toBe('1.0.0')
})

View File

@@ -217,7 +217,7 @@ export default async (opts: HeadlessOptions) => {
registries: opts.registries,
skipped,
}
const importerIds = opts.ignorePackageManifest
const importerIds = (opts.ignorePackageManifest === true || opts.nodeLinker === 'hoisted')
? Object.keys(wantedLockfile.importers)
: opts.projects.map(({ id }) => id)
const filteredLockfile = filterLockfileByImportersAndEngine(wantedLockfile, importerIds, {