1- // emit JSON describing versions of all packages currently installed (for later
2- // use with shrinkwrap install)
3-
4- module . exports = exports = shrinkwrap
5-
6- var path = require ( 'path' )
7- var log = require ( 'npmlog' )
8- var writeFileAtomic = require ( 'write-file-atomic' )
9- var iferr = require ( 'iferr' )
10- var readPackageJson = require ( 'read-package-json' )
11- var readPackageTree = require ( 'read-package-tree' )
12- var validate = require ( 'aproba' )
13- var chain = require ( 'slide' ) . chain
14- var npm = require ( './npm.js' )
15- var recalculateMetadata = require ( './install/deps.js' ) . recalculateMetadata
16- var validatePeerDeps = require ( './install/deps.js' ) . validatePeerDeps
17- var isExtraneous = require ( './install/is-extraneous.js' )
18- var packageId = require ( './utils/package-id.js' )
19- var moduleName = require ( './utils/module-name.js' )
20- var output = require ( './utils/output.js' )
21- var lifecycle = require ( './utils/lifecycle.js' )
22- var isDevDep = require ( './install/is-dev-dep.js' )
23- var isProdDep = require ( './install/is-prod-dep.js' )
24- var isOptDep = require ( './install/is-opt-dep.js' )
1+ 'use strict'
2+
3+ const BB = require ( 'bluebird' )
4+
5+ const chain = require ( 'slide' ) . chain
6+ const iferr = require ( 'iferr' )
7+ const isDevDep = require ( './install/is-dev-dep.js' )
8+ const isExtraneous = require ( './install/is-extraneous.js' )
9+ const isOptDep = require ( './install/is-opt-dep.js' )
10+ const isProdDep = require ( './install/is-prod-dep.js' )
11+ const fs = BB . promisifyAll ( require ( 'graceful-fs' ) )
12+ const lifecycle = require ( './utils/lifecycle.js' )
13+ const log = require ( 'npmlog' )
14+ const moduleName = require ( './utils/module-name.js' )
15+ const move = require ( 'move-concurrently' )
16+ const npm = require ( './npm.js' )
17+ const packageId = require ( './utils/package-id.js' )
18+ const path = require ( 'path' )
19+ const readPackageJson = require ( 'read-package-json' )
20+ const readPackageTree = require ( 'read-package-tree' )
21+ const recalculateMetadata = require ( './install/deps.js' ) . recalculateMetadata
2522const ssri = require ( 'ssri' )
23+ const validate = require ( 'aproba' )
24+ const validatePeerDeps = require ( './install/deps.js' ) . validatePeerDeps
25+ const writeFileAtomic = require ( 'write-file-atomic' )
26+
27+ const SHRINKWRAP = 'npm-shrinkwrap.json'
28+ const PKGLOCK = 'package-lock.json'
2629
30+ // emit JSON describing versions of all packages currently installed (for later
31+ // use with shrinkwrap install)
2732shrinkwrap . usage = 'npm shrinkwrap'
2833
34+ module . exports = exports = shrinkwrap
2935function shrinkwrap ( args , silent , cb ) {
3036 if ( typeof cb !== 'function' ) {
3137 cb = silent
@@ -39,9 +45,18 @@ function shrinkwrap (args, silent, cb) {
3945 var packagePath = path . join ( npm . localPrefix , 'package.json' )
4046 var prod = npm . config . get ( 'production' ) || / ^ p r o d / . test ( npm . config . get ( 'only' ) )
4147
42- readPackageJson ( packagePath , iferr ( cb , function ( pkg ) {
43- createShrinkwrap ( npm . localPrefix , pkg , ! prod , silent , cb )
44- } ) )
48+ move (
49+ path . resolve ( npm . prefix , PKGLOCK ) ,
50+ path . resolve ( npm . prefix , SHRINKWRAP ) ,
51+ { Promise : BB }
52+ ) . then ( ( ) => {
53+ log . notice ( '' , `${ PKGLOCK } has been renamed to ${ SHRINKWRAP } . ${ SHRINKWRAP } will be used for future installations.` )
54+ cb ( )
55+ } ) . catch ( { code : 'ENOENT' } , ( ) => {
56+ readPackageJson ( packagePath , iferr ( cb , function ( pkg ) {
57+ createShrinkwrap ( npm . localPrefix , pkg , ! prod , silent , cb )
58+ } ) )
59+ } )
4560}
4661
4762module . exports . createShrinkwrap = createShrinkwrap
@@ -101,10 +116,6 @@ function shrinkwrapDeps (dev, problems, deps, tree, seen) {
101116 } )
102117 tree . children . sort ( function ( aa , bb ) { return moduleName ( aa ) . localeCompare ( moduleName ( bb ) ) } ) . forEach ( function ( child ) {
103118 var childIsOnlyDev = isOnlyDev ( child )
104- if ( ! dev && childIsOnlyDev ) {
105- log . warn ( 'shrinkwrap' , 'Excluding devDependency: %s' , child . location )
106- return
107- }
108119 var pkginfo = deps [ moduleName ( child ) ] = { }
109120 pkginfo . version = child . package . version
110121 if ( child . package . _inBundle ) {
@@ -153,14 +164,33 @@ function save (pkginfo, silent, cb) {
153164 return cb ( er )
154165 }
155166
156- var file = path . resolve ( npm . prefix , 'npm-shrinkwrap.json' )
167+ BB . join (
168+ checkShrinkwrap ( SHRINKWRAP ) ,
169+ checkShrinkwrap ( PKGLOCK ) ,
170+ ( shrinkwrap , lockfile ) => {
171+ const file = (
172+ shrinkwrap ||
173+ lockfile ||
174+ path . resolve ( npm . prefix , PKGLOCK )
175+ )
176+ writeFileAtomic ( file , swdata , ( err ) => {
177+ if ( err ) return cb ( err )
178+ if ( silent ) return cb ( null , pkginfo )
179+ if ( ! shrinkwrap && ! lockfile ) {
180+ log . notice ( '' , `created a lockfile as ${ path . basename ( file ) } . You should commit this file.` )
181+ }
182+ cb ( null , pkginfo )
183+ } )
184+ }
185+ ) . then ( ( file ) => {
186+ } , cb )
187+ }
157188
158- writeFileAtomic ( file , swdata , function ( er ) {
159- if ( er ) return cb ( er )
160- if ( silent ) return cb ( null , pkginfo )
161- output ( 'wrote npm-shrinkwrap.json' )
162- cb ( null , pkginfo )
163- } )
189+ function checkShrinkwrap ( name ) {
190+ const file = path . resolve ( npm . prefix , name )
191+ return fs . lstatAsync (
192+ file
193+ ) . then ( ( ) => file ) . catch ( { code : 'ENOENT' } , ( ) => { } )
164194}
165195
166196// Returns true if the module `node` is only required direcctly as a dev
0 commit comments