diff options
Diffstat (limited to 'deps/npm/lib/install/action/refresh-package-json.js')
-rw-r--r-- | deps/npm/lib/install/action/refresh-package-json.js | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/deps/npm/lib/install/action/refresh-package-json.js b/deps/npm/lib/install/action/refresh-package-json.js new file mode 100644 index 0000000000..337be0caf2 --- /dev/null +++ b/deps/npm/lib/install/action/refresh-package-json.js @@ -0,0 +1,38 @@ +'use strict' +const path = require('path') +const Bluebird = require('bluebird') +const readJson = Bluebird.promisify(require('read-package-json')) +const updatePackageJson = Bluebird.promisify(require('../update-package-json')) +const getRequested = require('../get-requested.js') + +module.exports = function (staging, pkg, log) { + log.silly('refresh-package-json', pkg.realpath) + + return readJson(path.join(pkg.path, 'package.json'), false).then((metadata) => { + Object.keys(pkg.package).forEach(function (key) { + if (key !== '_injectedFromShrinkwrap' && !isEmpty(pkg.package[key])) { + metadata[key] = pkg.package[key] + if (key === '_resolved' && metadata[key] == null && pkg.package._injectedFromShrinkwrap) { + metadata[key] = pkg.package._injectedFromShrinkwrap.resolved + } + } + }) + // These two sneak in and it's awful + delete metadata.readme + delete metadata.readmeFilename + + pkg.package = metadata + }).catch(() => 'ignore').then(() => { + const requested = pkg.package._requested || getRequested(pkg) + if (requested.type !== 'directory') { + return updatePackageJson(pkg, pkg.path) + } + }) +} + +function isEmpty (value) { + if (value == null) return true + if (Array.isArray(value)) return !value.length + if (typeof value === 'object') return !Object.keys(value).length + return false +} |