Require modules from parent modules.
JavaScript
Latest commit 29892bf Aug 12, 2013 @jaredhanson Delint.
Permalink
Failed to load latest commit information.
support/mk Add support files. Aug 12, 2013
test Add test suite. Aug 12, 2013
.gitignore Initial commit. Aug 8, 2013
.jshintrc Initial commit. Aug 8, 2013
.npmignore Initial commit. Aug 8, 2013
.travis.yml Initial commit. Aug 8, 2013
LICENSE Add support files. Aug 12, 2013
Makefile Add test suite. Aug 12, 2013
README.md Add README. Aug 12, 2013
index.js Delint. Aug 12, 2013
package.json Add test suite. Aug 12, 2013

README.md

parent-require

Build Coverage Dependencies

Require modules from parent (i.e. loading) module.

Install

$ npm install parent-require

Usage

parent-require addresses an annoying error condition that arises when developing plugins, which have peer dependencies, that are npm link'd into an application.

The problem is best illustrated by example. We'll use a shared package of Mongoose schemas, but the concept applies equally well to any module you plugin to a larger framework.

Develop a Plugin for a Framework

Let's develop a set of shared Mongoose schemas for a user database, packaged as mongoose-schemas-users for reuse by any application that needs to query the database.

var mongoose = require('mongoose');

var UserSchema = new mongoose.Schema(...);

module.exports = UserSchema;

The important bit here is that mongoose is a peer dependency of this package.

Require a Plugin from an App

Now, let's install this package...

npm install mongoose-schemas-users

..and require it within our application:

var mongoose = require('mongoose')
  , schemas = require('mongoose-schemas-users')
  
mongoose.model('User', schemas.UserSchema);

So far, so good.

npm link Plugin for Development

During the course of developing the application, we discover that we need to tweak the schemas we've defined. This is usually easy:

npm link mongoose-schemas-users

We've made some edits, and run the application:

Error: Cannot find module 'mongoose'

WTF?!? This issue arises because mongoose is a peer dependency. Now that it has been npm link'd to a directory that resides outside of the application itself, Node's typical resolution algorithm fails to find it.

Fallback to Parent Require

This is where parent-require comes into play. It provides a fallback to require modules from the loading (aka parent) module. Because the loading module exists within the application itself, Node's resolution algorithm will correctly find our peer dependency.

try {
  var mongoose = require('mongoose');
} catch (_) {
  // workaround when `npm link`'ed for development
  var prequire = require('parent-require')
    , mongoose = prequire('mongoose');
}

var UserSchema = new mongoose.Schema(...);

module.exports = UserSchema;

With the fallback in place, we can both npm install and npm link this plugin, correctly resolving peer dependencies in both cases.

Tests

$ npm install
$ npm test

Credits

License

The MIT License

Copyright (c) 2013 Jared Hanson <http://jaredhanson.net/>