pkginfo.js

/*
 * pkginfo.js: Top-level include for the pkginfo module
 *
 * (C) 2011, Charlie Robbins
 *
 */
 
var fs = require('fs'),
    path = require('path');

function pkginfo ([options, 'property', 'property' ..])

@pmodule {Module} Parent module to read from.

@options {Object|Array|string} Optional Options used when exposing properties.

@arguments {string...} Optional Specified properties to expose.

Exposes properties from the package.json file for the parent module on it's exports. Valid usage:

require('pkginfo')()

require('pkginfo')('version', 'author');

require('pkginfo')(['version', 'author']);

require('pkginfo')({ include: ['version', 'author'] });

var pkginfo = module.exports = function (pmodule, options) {
  var args = [].slice.call(arguments, 2).filter(function (arg) {
    return typeof arg === 'string';
  });
  

Parse variable arguments

  if (Array.isArray(options)) {

If the options passed in is an Array assume that it is the Array of properties to expose from the on the package.json file on the parent module.

    options = { include: options };
  }
  else if (typeof options === 'string') {

Otherwise if the first argument is a string, then assume that it is the first property to expose from the package.json file on the parent module.

    options = { include: [options] };
  }
  

Setup default options

  options = options || { include: [] };
  
  if (args.length > 0) {

If additional string arguments have been passed in then add them to the properties to expose on the parent module.

    options.include = options.include.concat(args);
  }
  
  var pkg = pkginfo.read(pmodule, options.dir).package;
  Object.keys(pkg).forEach(function (key) {
    if (options.include.length > 0 && !~options.include.indexOf(key)) {
      return;
    }
    
    if (!pmodule.exports[key]) {
      pmodule.exports[key] = pkg[key];
    }
  });
  
  return pkginfo;
};

function find (dir)

@pmodule {Module} Parent module to read from.

@dir {string} Optional Directory to start search from.

Searches up the directory tree from dir until it finds a directory which contains a package.json file.

pkginfo.find = function (pmodule, dir) {
  dir = dir || pmodule.filename;
  dir = path.dirname(dir); 
  
  var files = fs.readdirSync(dir);
  
  if (~files.indexOf('package.json')) {
    return path.join(dir, 'package.json');
  }
  
  if (dir === '/') {
    throw new Error('Could not find package.json up from: ' + dir);
  }
  
  return pkginfo.find(dir);
};

function read (pmodule, dir)

@pmodule {Module} Parent module to read from.

@dir {string} Optional Directory to start search from.

Searches up the directory tree from dir until it finds a directory which contains a package.json file and returns the package information.

pkginfo.read = function (pmodule, dir) { 
  dir = pkginfo.find(pmodule, dir);
  
  var data = fs.readFileSync(dir).toString();
      
  return {
    dir: dir, 
    package: JSON.parse(data)
  };
};

Call pkginfo on this module and expose version.

pkginfo(module, {
  dir: __dirname,
  include: ['version'],
  target: pkginfo
});