From eb0640415799ae4d87f4b3d55dec660345d3800d Mon Sep 17 00:00:00 2001 From: Miroslav Bajtos Date: Mon, 9 Dec 2013 11:27:38 +0100 Subject: [PATCH 1/4] Fix loading of loopback dependencies. Loopback-explorer loads express and strong-remoting from loopback's `node_modules` folder. This fails when one of those dependencies was installed to the parent project, e.g. as a peer dependency. app/node_modules +- express # <- express installed as peer to loopback +- loopback +- node_modules # <- express is not there As of this commit, loopback-explorer will retry the `require()` call without `loopback/node_modules` prefix if the first require fails. 1. `require('loopback/node_modules/express')` 2. `require('express')` The change should fix (some of) unit-tests failures in https://github.com/strongloop/loopback-workspace --- index.js | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index 645fd5c..5965e89 100644 --- a/index.js +++ b/index.js @@ -3,8 +3,8 @@ */ var path = require('path'); var loopback = require('loopback'); -var swagger = require('loopback/node_modules/strong-remoting/ext/swagger'); -var express = require('loopback/node_modules/express'); +var swagger = requireLoopbackDependency('strong-remoting/ext/swagger'); +var express = requireLoopbackDependency('express'); var STATIC_ROOT = path.join(__dirname, 'public'); module.exports = explorer; @@ -30,3 +30,24 @@ function explorer(loopbackApplication, options) { app.use(loopback.static(STATIC_ROOT)); return app; } + +function requireLoopbackDependency(module) { + try { + return require('loopback/node_modules/' + module); + } catch (err) { + if (err.code !== 'MODULE_NOT_FOUND') throw err; + try { + // Dependencies may be installed outside the loopback module, + // e.g. as peer dependencies. Try to load the dependency from there. + return require(module); + } catch (errPeer) { + if (errPeer.code !== 'MODULE_NOT_FOUND') throw errPeer; + // Rethrow the initial error to make it clear that we were trying + // to load a module that should have been installed inside + // "loopback/node_modules". This should minimise end-user's confusion. + // However, such situation should never happen as `require('loopback')` + // would have failed before this function was even called. + throw err; + } + } +} From 1ca2d2ccade7eda42c5ec301a4c10891651e821e Mon Sep 17 00:00:00 2001 From: Miroslav Bajtos Date: Mon, 9 Dec 2013 11:44:46 +0100 Subject: [PATCH 2/4] Reorder middleware to fix unit-test failures. LoopBack REST adapter owns the whole URL space and does not let other middleware handle same URLs. It's possible to circumvent this measure by installing the explorer middleware before the REST middleware. --- test/explorer.test.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/test/explorer.test.js b/test/explorer.test.js index 05cb851..a208544 100644 --- a/test/explorer.test.js +++ b/test/explorer.test.js @@ -71,8 +71,12 @@ describe('explorer', function() { app.use(restUrlBase, loopback.rest()); app.use('/explorer', explorer(app, { basePath: restUrlBase })); } else { - app.use(loopback.rest()); + // LoopBack REST adapter owns the whole URL space and does not + // let other middleware handle same URLs. + // It's possible to circumvent this measure by installing + // the explorer middleware before the REST middleware. app.use('/explorer', explorer(app)); + app.use(loopback.rest()); } done(); } From 2686f254cf0de8e25494c7797c4e5b25473b7baf Mon Sep 17 00:00:00 2001 From: Miroslav Bajtos Date: Mon, 9 Dec 2013 18:12:30 +0100 Subject: [PATCH 3/4] README: mount REST at /api in the sample code --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9871cfc..f0cc4cd 100644 --- a/README.md +++ b/README.md @@ -15,8 +15,8 @@ var Product = loopback.Model.extend('product'); Product.attachTo(loopback.memory()); app.model(Product); -app.use(loopback.rest()); -app.use('/explorer', explorer(app)); +app.use('/api', loopback.rest()); +app.use('/explorer', explorer(app, { basePath: '/api' })); app.listen(3000); ``` From b4f91a57a2d64548cf07e628c4f549f56f8db0b1 Mon Sep 17 00:00:00 2001 From: Raymond Feng Date: Mon, 13 Jan 2014 13:42:14 -0800 Subject: [PATCH 4/4] Bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a15e9b0..3c87249 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "loopback-explorer", - "version": "1.0.1", + "version": "1.0.2", "description": "Browse and test your LoopBack app's APIs", "main": "index.js", "scripts": {