hunk.code_window:   await installPkgs(['ajv@4.10.4', 'ajv-keywords@1.5.0'], testDefaults())
     t.ok(await exists(path.join(NM, '.localhost+4873', 'ajv-keywords', '1.5.0', 'ajv@4.10.4', NM, 'ajv')), 'peer dependency is linked')
   })
   test('peer dependencies are linked', async t => {
     const project = prepare(t)
     await installPkgs(['abc-parent-with-ab', 'abc-grand-parent-with-c', 'peer-c@2.0.0'], testDefaults())
     const pkgVariationsDir = path.join(NM, '.localhost+4873', 'abc', '1.0.0')
  
hunk.labels: keep keep keep keep add keep keep keep keep keep
hunk.after_edit: test('peer dependency is linked on subsequent install', async t => {
     const project = prepare(t)
     await installPkgs(['ajv@4.10.4'], testDefaults())
     await installPkgs(['ajv-keywords@1.5.0'], testDefaults())
     t.ok(await exists(path.join(NM, '.localhost+4873', 'ajv-keywords', '1.5.0', 'ajv@4.10.4', NM, 'ajv')), 'peer dependency is linked')
   })
  
hunk.file_path: test/install/peerDependencies.ts
hunk.type: add
file: import path = require('path')
  import pFilter = require('p-filter')
  import {PnpmOptions} from '../types'
  import extendOptions from './extendOptions'
  import getContext from './getContext'
  import untouched from '../pkgIsUntouched'
  import {shortIdToFullId} from '../fs/shrinkwrap'
  
  export default async function (maybeOpts: PnpmOptions) {
    const opts = extendOptions(maybeOpts)
    const ctx = await getContext(opts)
    if (!ctx.shrinkwrap) return []
  
    const pkgPaths = Object.keys(ctx.shrinkwrap.packages || {})
      .map(id => shortIdToFullId(id, ctx.shrinkwrap.registry))
      .filter(pkgId => ctx.skipped.indexOf(pkgId) === -1)
      .map(pkgPath => path.join(ctx.storePath, pkgPath))
  
    return await pFilter(pkgPaths, async (pkgPath: string) => !await untouched(pkgPath))
  }
  