1 var fs = require('graceful-fs')
2 var path = require('path')
4 var mkdirp = require('mkdirp')
5 var mr = require('npm-registry-mock')
6 var osenv = require('osenv')
7 var rimraf = require('rimraf')
8 var test = require('tap').test
10 var common = require('../common-tap.js')
13 var pkg = path.resolve(__dirname, 'update-save')
14 var cache = path.resolve(pkg, 'cache')
20 npm_config_registry: common.registry,
21 npm_config_loglevel: 'verbose',
22 npm_config_save_prefix: '^'
27 name: 'update-save-example',
41 function extend (a, b) {
42 for (var key in b) { a[key] = b[key] }
46 test('setup', function (t) {
49 mr({ port: common.port }, function (er, s) {
56 test('update regular dependencies only', function (t) {
59 common.npm(['update', '--save'], EXEC_OPTS, function (err, code) {
61 t.notOk(code, 'npm update exited with code 0')
63 var pkgdata = JSON.parse(fs.readFileSync(path.join(pkg, 'package.json'), 'utf8'))
67 'only dependencies updated'
70 pkgdata.devDependencies,
72 'dev dependencies should be untouched'
75 pkgdata.optionalDependencies,
76 json.optionalDependencies,
77 'optional dependencies should be untouched'
84 test('update devDependencies only', function (t) {
87 common.npm(['update', '--save-dev'], EXEC_OPTS, function (err, code) {
89 t.notOk(code, 'npm update exited with code 0')
91 var pkgdata = JSON.parse(fs.readFileSync(path.join(pkg, 'package.json'), 'utf8'))
95 'dependencies should be untouched'
98 pkgdata.devDependencies,
99 { underscore: '^1.3.3' },
100 'dev dependencies should be updated'
103 pkgdata.optionalDependencies,
104 json.optionalDependencies,
105 'optional dependencies should be untouched'
112 test('update optionalDependencies only', function (t) {
113 setup({ optionalDependencies: { underscore: '~1.3.1' } })
115 common.npm(['update', '--save-optional'], EXEC_OPTS, function (err, code) {
117 t.notOk(code, 'npm update exited with code 0')
119 var pkgdata = JSON.parse(fs.readFileSync(path.join(pkg, 'package.json'), 'utf8'))
121 pkgdata.dependencies,
123 'dependencies should be untouched'
126 pkgdata.devDependencies,
127 json.devDependencies,
128 'dev dependencies should be untouched'
131 pkgdata.optionalDependencies,
132 { underscore: '^1.3.3' },
133 'optional dependencies should be updated'
140 test('optionalDependencies are merged into dependencies during --save', function (t) {
141 var cloned = setup({ optionalDependencies: { underscore: '~1.3.1' } })
143 common.npm(['update', '--save'], EXEC_OPTS, function (err, code) {
145 t.notOk(code, 'npm update exited with code 0')
147 var pkgdata = JSON.parse(fs.readFileSync(path.join(pkg, 'package.json'), 'utf8'))
149 pkgdata.dependencies,
150 { mkdirp: '^0.3.5' },
151 'dependencies should not include optional dependencies'
154 pkgdata.devDependencies,
155 cloned.devDependencies,
156 'dev dependencies should be untouched'
159 pkgdata.optionalDependencies,
160 cloned.optionalDependencies,
161 'optional dependencies should be untouched'
168 test('semver prefix is replaced with configured save-prefix', function (t) {
171 common.npm(['update', '--save', '--save-prefix', '~'], EXEC_OPTS, function (err, code) {
173 t.notOk(code, 'npm update exited with code 0')
175 var pkgdata = JSON.parse(fs.readFileSync(path.join(pkg, 'package.json'), 'utf8'))
177 pkgdata.dependencies,
178 { mkdirp: '~0.3.5' },
179 'dependencies should be updated'
182 pkgdata.devDependencies,
183 json.devDependencies,
184 'dev dependencies should be untouched'
187 pkgdata.optionalDependencies,
188 json.optionalDependencies,
189 'optional dependencies should be updated'
196 test('cleanup', function (t) {
202 function cleanup () {
203 process.chdir(osenv.tmpdir())
207 function setup (extendWith) {
212 var template = clone(json)
213 extend(template, extendWith)
215 path.join(pkg, 'package.json'),
216 JSON.stringify(template, null, 2)