1var test = require('tap').test 2var path = require('path') 3var fs = require('fs') 4var rimraf = require('rimraf') 5var common = require('../common-tap.js') 6var Tacks = require('tacks') 7var unixFormatPath = require('../../lib/utils/unix-format-path.js') 8var File = Tacks.File 9var Dir = Tacks.Dir 10 11var testdir = common.pkg 12var cachedir = common.cache 13var config = ['--cache=' + cachedir, '--loglevel=error'] 14 15var shrinkwrap = { 16 name: 'shrinkwrap-local-dependency', 17 version: '1.0.0', 18 dependencies: { 19 mod2: { 20 version: 'file:' + unixFormatPath(path.join('mods', 'mod2')), 21 dependencies: { 22 mod1: { 23 version: 'file:' + unixFormatPath(path.join('mods', 'mod1')) 24 } 25 } 26 } 27 } 28} 29 30var fixture = new Tacks( 31 Dir({ 32 cache: Dir(), 33 mods: Dir({ 34 mod1: Dir({ 35 'package.json': File({ 36 name: 'mod1', 37 version: '1.0.0' 38 }) 39 }), 40 mod2: Dir({ 41 'package.json': File({ 42 name: 'mod2', 43 version: '1.0.0', 44 dependencies: { 45 mod1: 'file:' + path.join('..', 'mod1') 46 } 47 }) 48 }) 49 }), 50 'package.json': File({ 51 name: 'shrinkwrap-local-dependency', 52 version: '1.0.0', 53 dependencies: { 54 mod2: 'file:' + path.join('mods', 'mod2') 55 } 56 }) 57 }) 58) 59 60function setup () { 61 cleanup() 62 fixture.create(testdir) 63} 64 65function cleanNodeModules () { 66 rimraf.sync(path.resolve(testdir, 'node_modules')) 67} 68 69function cleanup () { 70 fixture.remove(testdir) 71} 72 73test('shrinkwrap uses resolved with file: on local deps', function (t) { 74 setup() 75 76 common.npm(config.concat(['install', '--legacy']), {cwd: testdir}, function (err, code, stdout, stderr) { 77 if (err) throw err 78 t.comment(stdout.trim()) 79 t.comment(stderr.trim()) 80 t.equal(code, 0, 'npm exited normally') 81 82 common.npm(config.concat('shrinkwrap'), {cwd: testdir}, function (err, code, stdout, stderr) { 83 if (err) throw err 84 t.comment(stdout.trim()) 85 t.comment(stderr.trim()) 86 t.equal(code, 0, 'npm exited normally') 87 var data = fs.readFileSync(path.join(testdir, 'npm-shrinkwrap.json'), { encoding: 'utf8' }) 88 t.like( 89 JSON.parse(data).dependencies, 90 shrinkwrap.dependencies, 91 'shrinkwrap looks correct' 92 ) 93 t.end() 94 }) 95 }) 96}) 97 98function exists (file) { 99 try { 100 fs.statSync(file) 101 return true 102 } catch (ex) { 103 return false 104 } 105} 106 107test("'npm install' should install local packages from shrinkwrap", function (t) { 108 cleanNodeModules() 109 110 common.npm(config.concat(['install']), {cwd: testdir}, function (err, code, stdout, stderr) { 111 if (err) throw err 112 t.comment(stdout.trim()) 113 t.comment(stderr.trim()) 114 t.equal(code, 0, 'npm exited normally') 115 t.ok(exists(path.join(testdir, 'node_modules', 'mod2')), 'mod2 exists') 116 t.ok(exists(path.join(testdir, 'node_modules', 'mod2', 'node_modules', 'mod1')), 'mod1 exists') 117 t.end() 118 }) 119}) 120 121test('cleanup', function (t) { 122 cleanup() 123 t.end() 124}) 125