From 6c4e780ab83a05e03d6419050b1135b1106d60bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miroslav=20Bajto=C5=A1?= Date: Tue, 7 Jan 2014 16:13:34 +0100 Subject: [PATCH 1/4] Replace strong-remoting ext/swagger with app.docs Use `app.docs()` to expose Swagger specs. This way we don't have to depend on loopback's dependency strong-remoting. --- index.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/index.js b/index.js index 5965e89..eb0ba40 100644 --- a/index.js +++ b/index.js @@ -3,7 +3,6 @@ */ var path = require('path'); var loopback = require('loopback'); -var swagger = requireLoopbackDependency('strong-remoting/ext/swagger'); var express = requireLoopbackDependency('express'); var STATIC_ROOT = path.join(__dirname, 'public'); @@ -13,13 +12,13 @@ module.exports = explorer; * Example usage: * * var explorer = require('loopback-explorer'); - * app.use('/explorer', explorer(app)); + * app.use('/explorer', explorer(app, options)); */ function explorer(loopbackApplication, options) { var options = options || {}; - var remotes = loopbackApplication.remotes(); - swagger(remotes, options); + + loopbackApplication.docs(options); var app = express(); app.get('/config.json', function(req, res) { From 8b6fc55de8eceb4d7880d133aea2b2353d641ff1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miroslav=20Bajto=C5=A1?= Date: Tue, 7 Jan 2014 16:56:58 +0100 Subject: [PATCH 2/4] Use `app.get('restApiRoot')` as default basePath --- index.js | 4 +++- test/explorer.test.js | 55 ++++++++++++++++++++++++++++++------------- 2 files changed, 42 insertions(+), 17 deletions(-) diff --git a/index.js b/index.js index eb0ba40..a2b012e 100644 --- a/index.js +++ b/index.js @@ -2,6 +2,7 @@ * Adds dynamically-updated docs as /explorer */ var path = require('path'); +var extend = require('util')._extend; var loopback = require('loopback'); var express = requireLoopbackDependency('express'); var STATIC_ROOT = path.join(__dirname, 'public'); @@ -16,7 +17,8 @@ module.exports = explorer; */ function explorer(loopbackApplication, options) { - var options = options || {}; + options = extend({}, options); + options.basePath = options.basePath || loopbackApplication.get('restApiRoot'); loopbackApplication.docs(options); diff --git a/test/explorer.test.js b/test/explorer.test.js index a208544..6d839d9 100644 --- a/test/explorer.test.js +++ b/test/explorer.test.js @@ -41,7 +41,7 @@ describe('explorer', function() { done(); }); }); - }) + }); describe('with custom baseUrl', function() { beforeEach(givenLoopBackAppWithExplorer('/api')); @@ -60,25 +60,48 @@ describe('explorer', function() { }); }); + describe('with custom app.restApiRoot', function() { + it('should serve correct swagger-ui config', function(done) { + var app = loopback(); + app.set('restApiRoot', '/rest-api-root'); + configureRestApiAndExplorer(app); + + request(app) + .get('/explorer/config.json') + .expect(200) + .end(function(err, res) { + if (err) return done(err); + expect(res.body).to + .have.property('discoveryUrl', '/rest-api-root/swagger/resources'); + done(); + }); + }); + }); + function givenLoopBackAppWithExplorer(restUrlBase) { return function(done) { var app = this.app = loopback(); - var Product = loopback.Model.extend('product'); - Product.attachTo(loopback.memory()); - app.model(Product); - - if (restUrlBase) { - app.use(restUrlBase, loopback.rest()); - app.use('/explorer', explorer(app, { basePath: restUrlBase })); - } else { - // 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()); - } + configureRestApiAndExplorer(app, restUrlBase); done(); + }; + } + + function configureRestApiAndExplorer(app, restUrlBase) { + var Product = loopback.Model.extend('product'); + Product.attachTo(loopback.memory()); + app.model(Product); + + if (restUrlBase) { + app.use(restUrlBase, loopback.rest()); + app.use('/explorer', explorer(app, { basePath: restUrlBase })); + } else { + // 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. + // This way we can acess `/explorer` even when REST is mounted at `/` + app.use('/explorer', explorer(app)); + app.use(app.get('restApiRoot') || '/', loopback.rest()); } } }); From 2d15b9c0520d2e7fcb038c022c0a8e7192062e5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miroslav=20Bajto=C5=A1?= Date: Tue, 14 Jan 2014 08:34:34 +0100 Subject: [PATCH 3/4] Bump up loopback min version to 1.5 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index a15e9b0..b722481 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "test": "mocha" }, "peerDependencies": { - "loopback": "1.x.x" + "loopback": "1.x >=1.5" }, "repository": { "type": "git", @@ -26,7 +26,7 @@ "url": "https://github.com/strongloop/loopback-explorer/issues" }, "devDependencies": { - "loopback": "1.x.x", + "loopback": "1.x", "mocha": "~1.14.0", "supertest": "~0.8.1", "chai": "~1.8.1" From d47a060b9d4f22153187d5b5ec5131b8c96302f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miroslav=20Bajto=C5=A1?= Date: Tue, 14 Jan 2014 09:42:06 +0100 Subject: [PATCH 4/4] v1.1.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 80564bd..5dec811 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "loopback-explorer", - "version": "1.0.2", + "version": "1.1.0", "description": "Browse and test your LoopBack app's APIs", "main": "index.js", "scripts": {