| /* |
| * 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); |
| } |
| else if (!dir || dir === '.') { |
| throw new Error('Cannot find package.json from unspecified directory'); |
| } |
| |
| return pkginfo.find(pmodule, 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 |
| }); |