88 lines
2.7 KiB
JavaScript
88 lines
2.7 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
var Promise = require('bluebird');
|
||
|
var get = require('lodash.get');
|
||
|
var readPkgUp = require('read-pkg-up');
|
||
|
var path = require('path');
|
||
|
var debug = require('debug')('get-package-info');
|
||
|
|
||
|
var getInfo = function getInfo(props, dir, result) {
|
||
|
if (!Array.isArray(props)) return Promise.reject(new Error('First argument must be array of properties to retrieve.'));
|
||
|
if (!props.length) return Promise.resolve(result);
|
||
|
|
||
|
debug('Getting props: ', props);
|
||
|
debug('Looking up starting from directory: ', dir);
|
||
|
debug('Result so far:', result);
|
||
|
|
||
|
return Promise.resolve(readPkgUp({ cwd: dir, normalize: false })).then(function (_ref) {
|
||
|
var src = _ref.path;
|
||
|
var pkg = _ref.pkg;
|
||
|
|
||
|
if (!src) {
|
||
|
debug('Couldn\'t find any more package.json files');
|
||
|
var err = new Error('Unable to find all properties in parent package.json files. Missing props: ' + props.map(function (prop) {
|
||
|
return JSON.stringify(prop);
|
||
|
}).join(', '));
|
||
|
err.missingProps = props;
|
||
|
err.result = result;
|
||
|
throw err;
|
||
|
}
|
||
|
|
||
|
debug('Checking props in package.json found at:', src);
|
||
|
var nextProps = [];
|
||
|
|
||
|
props.forEach(function (prop) {
|
||
|
// For props given as array
|
||
|
// Look for props in that order, and when found
|
||
|
// save value under all given props
|
||
|
if (Array.isArray(prop)) {
|
||
|
(function () {
|
||
|
var value = void 0,
|
||
|
sourceProp = void 0;
|
||
|
|
||
|
prop.some(function (p) {
|
||
|
sourceProp = p;
|
||
|
value = get(pkg, p);
|
||
|
return value;
|
||
|
});
|
||
|
|
||
|
if (value !== undefined) {
|
||
|
debug('Found prop:', prop);
|
||
|
prop.forEach(function (p) {
|
||
|
result.values[p] = value;
|
||
|
result.source[p] = { src: src, pkg: pkg, prop: sourceProp };
|
||
|
});
|
||
|
} else {
|
||
|
debug('Couldn\'t find prop:', prop);
|
||
|
nextProps.push(prop);
|
||
|
}
|
||
|
})();
|
||
|
} else {
|
||
|
// For regular string props, just look normally
|
||
|
var _value = get(pkg, prop);
|
||
|
|
||
|
if (_value !== undefined) {
|
||
|
debug('Found prop:', prop);
|
||
|
result.values[prop] = _value;
|
||
|
result.source[prop] = { src: src, pkg: pkg, prop: prop };
|
||
|
} else {
|
||
|
debug('Couldn\'t find prop:', prop);
|
||
|
nextProps.push(prop);
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
|
||
|
// Still have props to look for, look at another package.json above this one
|
||
|
if (nextProps.length) {
|
||
|
debug('Not all props satisfied, looking for parent package.json');
|
||
|
return getInfo(nextProps, path.join(path.dirname(src), '..'), result);
|
||
|
}
|
||
|
|
||
|
debug('Found all props!');
|
||
|
return result;
|
||
|
});
|
||
|
};
|
||
|
|
||
|
module.exports = function (props, dir, cb) {
|
||
|
return getInfo(props, dir, { values: {}, source: {} }).nodeify(cb);
|
||
|
};
|