Require modules from parent modules.
Require modules from parent (i.e. loading) module.
$ npm install parent-require
parent-require addresses an annoying error condition that arises when
developing plugins, which have peer dependencies,
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.
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 = ;moduleexports = UserSchema;
The important bit here is that
mongoose is a peer dependency of this
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'mongoosemodel'User' schemasUserSchema;
So far, so good.
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.
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.
tryvar mongoose = require'mongoose';catch _// workaround when `npm link`'ed for developmentvar prequire = require'parent-require'mongoose = prequire'mongoose';var UserSchema = ;moduleexports = UserSchema;
With the fallback in place, we can both
npm install and
npm link this
plugin, correctly resolving peer dependencies in both cases.
$ npm install $ npm test
Copyright (c) 2013 Jared Hanson <http://jaredhanson.net/>