hunk.code_window: })
   export type SkippedOptionalDependencyMessage = {
     details?: object,
     parents?: Array<{id: string, name: string, version: string}>,
   } & ({
     package: {
       id: string,
       name: string,
  
hunk.labels: keep keep keep replace keep keep keep keep keep
hunk.after_edit:   details?: string,
  
hunk.file_path: src/loggers.ts
hunk.type: replace
file: import isCI = require('is-ci')
  import mkdirp = require('mkdirp-promise')
  import fs = require('mz/fs')
  import {install, installPkgs} from 'supi'
  import tape = require('tape')
  import promisifyTape from 'tape-promise'
  import {prepare, testDefaults} from './utils'
  
  const test = promisifyTape(tape)
  
  test('fail on non-compatible node_modules', async (t) => {
    const project = prepare(t)
    const opts = await testDefaults()
  
    await saveModulesYaml('0.50.0', opts.store)
  
    try {
      await installPkgs(['is-negative'], opts)
      t.fail('should have failed')
    } catch (err) {
      t.equal(err.code, 'MODULES_BREAKING_CHANGE', 'modules breaking change error is thrown')
    }
  })
  
  test("don't fail on non-compatible node_modules when forced", async (t) => {
    const project = prepare(t)
    const opts = await testDefaults({force: true})
  
    await saveModulesYaml('0.50.0', opts.store)
  
    await install(opts)
  
    t.pass('install did not fail')
  })
  
  test('fail on non-compatible node_modules when forced with a named installation', async (t) => {
    const project = prepare(t)
    const opts = await testDefaults({force: true})
  
    await saveModulesYaml('0.50.0', opts.store)
  
    try {
      await installPkgs(['is-negative'], opts)
      t.fail('should have failed')
    } catch (err) {
      t.ok(err.message.indexOf('Named installation cannot be used to regenerate the node_modules structure') !== -1)
    }
  })
  
  test("don't fail on non-compatible store when forced", async (t) => {
    const project = prepare(t)
    const opts = await testDefaults({force: true})
  
    await saveModulesYaml('0.32.0', opts.store)
  
    await install(opts)
  
    t.pass('install did not fail')
  })
  
  test('fail on non-compatible store when forced during named installation', async (t) => {
    const project = prepare(t)
    const opts = await testDefaults({force: true})
  
    await saveModulesYaml('0.32.0', opts.store)
  
    try {
      await installPkgs(['is-negative'], opts)
      t.fail('should have failed')
    } catch (err) {
      t.ok(err.message.indexOf('Named installation cannot be used to regenerate the node_modules structure') !== -1)
    }
  })
  
  async function saveModulesYaml (pnpmVersion: string, storePath: string) {
    await mkdirp('node_modules')
    await fs.writeFile('node_modules/.modules.yaml', `packageManager: pnpm@${pnpmVersion}\nstore: ${storePath}\nindependentLeaves: false`)
  }
  
  test('fail on non-compatible shrinkwrap.yaml', async (t) => {
    if (isCI) {
      t.skip('this test will always fail on CI servers')
      return
    }
  
    const project = prepare(t)
    await fs.writeFile('shrinkwrap.yaml', '')
  
    try {
      await installPkgs(['is-negative'], await testDefaults())
      t.fail('should have failed')
    } catch (err) {
      t.equal(err.code, 'SHRINKWRAP_BREAKING_CHANGE', 'shrinkwrap breaking change error is thrown')
    }
  })
  
  test("don't fail on non-compatible shrinkwrap.yaml when forced", async (t) => {
    const project = prepare(t)
    await fs.writeFile('shrinkwrap.yaml', '')
  
    await installPkgs(['is-negative'], await testDefaults({force: true}))
  
    t.pass('install did not fail')
  })
  