feat: readPackage hook normalizes the package manifest

close #1622
This commit is contained in:
Zoltan Kochan
2019-04-08 02:21:40 +03:00
parent 9f49cf6a93
commit 637aa331cd
2 changed files with 33 additions and 2 deletions

View File

@@ -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

View File

@@ -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')
})