12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- '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);
- };
|