diff --git a/packages/pnpm/src/requirePnpmfile.ts b/packages/pnpm/src/requirePnpmfile.ts index f008d7b3a9..de2dbe1b37 100644 --- a/packages/pnpm/src/requirePnpmfile.ts +++ b/packages/pnpm/src/requirePnpmfile.ts @@ -1,4 +1,5 @@ import logger from '@pnpm/logger' +import { PackageJson } from '@pnpm/types' import chalk from 'chalk' import fs = require('fs') @@ -14,8 +15,12 @@ export default (pnpmFilePath: string, prefix: string) => { } if (pnpmfile && pnpmfile.hooks && pnpmfile.hooks.readPackage) { const readPackage = pnpmfile.hooks.readPackage - pnpmfile.hooks.readPackage = function (...args: any[]) { // tslint:disable-line - const newPkg = readPackage(...args) + pnpmfile.hooks.readPackage = function (pkg: PackageJson, ...args: any[]) { // tslint:disable-line + pkg.dependencies = pkg.dependencies || {} + pkg.devDependencies = pkg.devDependencies || {} + pkg.optionalDependencies = pkg.optionalDependencies || {} + pkg.peerDependencies = pkg.peerDependencies || {} + const newPkg = readPackage(pkg, ...args) if (!newPkg) { const err = new Error(`readPackage hook did not return a package manifest object. Hook imported via ${pnpmFilePath}`) // tslint:disable:no-string-literal diff --git a/packages/pnpm/test/install/hooks.ts b/packages/pnpm/test/install/hooks.ts index c0835494bc..60709a4ac2 100644 --- a/packages/pnpm/test/install/hooks.ts +++ b/packages/pnpm/test/install/hooks.ts @@ -10,6 +10,7 @@ import { } from '../utils' const test = promisifyTape(tape) +const testOnly = promisifyTape(tape.only) test('readPackage hook', async (t: tape.Test) => { const project = prepare(t) @@ -378,3 +379,28 @@ test('pnpmfile: run afterAllResolved hook', async (t: tape.Test) => { t.equal(hookLog.hook, 'afterAllResolved', 'logged hook name') t.equal(hookLog.message, 'All resolved', 'logged the message') }) + +test('readPackage hook normalizes the package manifest', async (t: tape.Test) => { + const project = prepare(t) + + await fs.writeFile('pnpmfile.js', ` + 'use strict' + module.exports = { + hooks: { + readPackage (pkg) { + if (pkg.name === 'dep-of-pkg-with-1-dep') { + pkg.dependencies['is-positive'] = '*' + pkg.optionalDependencies['is-negative'] = '*' + pkg.peerDependencies['is-negative'] = '*' + pkg.devDependencies['is-positive'] = '*' + } + return pkg + } + } + } + `, 'utf8') + + await execPnpm('install', 'dep-of-pkg-with-1-dep') + + t.pass('code in pnpmfile did not fail') +})