Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file added .eslintignore
Empty file.
10 changes: 10 additions & 0 deletions .eslintrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"extends": "loopback",
"rules": {
"max-len": ["error", 90, 4, {
"ignoreComments": true,
"ignoreUrls": true,
"ignorePattern": "^\\s*var\\s.+=\\s*(require\\s*\\()|(/)"
}]
}
}
13 changes: 0 additions & 13 deletions .jshintrc

This file was deleted.

4 changes: 2 additions & 2 deletions example/hidden.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,13 @@ var User = loopback.Model.extend('user', {
username: 'string',
email: 'string',
sensitiveInternalProperty: 'string',
}, {hidden: ['sensitiveInternalProperty']});
}, { hidden: ['sensitiveInternalProperty'] });

User.attachTo(loopback.memory());
app.model(User);

var apiPath = '/api';
app.use('/explorer', explorer(app, {basePath: apiPath}));
app.use('/explorer', explorer(app, { basePath: apiPath }));
app.use(apiPath, loopback.rest());
console.log('Explorer mounted at localhost:' + port + '/explorer');

Expand Down
6 changes: 3 additions & 3 deletions example/simple.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@ var explorer = require('../');
var port = 3000;

var Product = loopback.PersistedModel.extend('product', {
foo: {type: 'string', required: true},
foo: { type: 'string', required: true },
bar: 'string',
aNum: {type: 'number', min: 1, max: 10, required: true, default: 5}
aNum: { type: 'number', min: 1, max: 10, required: true, default: 5 },
});
Product.attachTo(loopback.memory());
app.model(Product);

var apiPath = '/api';
app.use('/explorer', explorer(app, {basePath: apiPath}));
app.use('/explorer', explorer(app, { basePath: apiPath }));
app.use(apiPath, loopback.rest());
console.log('Explorer mounted at http://localhost:' + port + '/explorer');

Expand Down
136 changes: 68 additions & 68 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,17 @@
/*!
* Adds dynamically-updated docs as /explorer
*/
var url = require('url');
var path = require('path');
var urlJoin = require('./lib/url-join');
var _defaults = require('lodash').defaults;
var cors = require('cors');
var createSwaggerObject = require('loopback-swagger').generateSwaggerSpec;
var SWAGGER_UI_ROOT = require('strong-swagger-ui/index').dist;
var STATIC_ROOT = path.join(__dirname, 'public');

module.exports = explorer;
explorer.routes = routes;
var url = require('url');
var path = require('path');
var urlJoin = require('./lib/url-join');
var _defaults = require('lodash').defaults;
var cors = require('cors');
var createSwaggerObject = require('loopback-swagger').generateSwaggerSpec;
var SWAGGER_UI_ROOT = require('strong-swagger-ui/index').dist;
var STATIC_ROOT = path.join(__dirname, 'public');

module.exports = explorer;
explorer.routes = routes;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Amir-61 @superkhau this has re-indented whole index.js by one level of nesting :(

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh that's weird! Sorry I did not notice that...

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@bajtos I didn't notice it. Not a big deal though, let's submit another PR to fix it. ;)


/**
* Example usage:
Expand All @@ -21,70 +21,70 @@ explorer.routes = routes;
* explorer(app, options);
*/

function explorer(loopbackApplication, options) {
options = _defaults({}, options, { mountPath: '/explorer' });
loopbackApplication.use(options.mountPath, routes(loopbackApplication, options));
loopbackApplication.set('loopback-component-explorer', options);
}
function explorer(loopbackApplication, options) {
options = _defaults({}, options, { mountPath: '/explorer' });
loopbackApplication.use(options.mountPath, routes(loopbackApplication, options));
loopbackApplication.set('loopback-component-explorer', options);
}

function routes(loopbackApplication, options) {
var loopback = loopbackApplication.loopback;
var loopbackMajor = loopback && loopback.version &&
function routes(loopbackApplication, options) {
var loopback = loopbackApplication.loopback;
var loopbackMajor = loopback && loopback.version &&
loopback.version.split('.')[0] || 1;

if (loopbackMajor < 2) {
throw new Error('loopback-component-explorer requires loopback 2.0 or newer');
}
if (loopbackMajor < 2) {
throw new Error('loopback-component-explorer requires loopback 2.0 or newer');
}

options = _defaults({}, options, {
resourcePath: 'swagger.json',
apiInfo: loopbackApplication.get('apiInfo') || {},
swaggerUI: true
});
options = _defaults({}, options, {
resourcePath: 'swagger.json',
apiInfo: loopbackApplication.get('apiInfo') || {},
swaggerUI: true,
});

var router = new loopback.Router();
var router = new loopback.Router();

mountSwagger(loopbackApplication, router, options);
mountSwagger(loopbackApplication, router, options);

// config.json is loaded by swagger-ui. The server should respond
// with the relative URI of the resource doc.
router.get('/config.json', function(req, res) {
router.get('/config.json', function(req, res) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At the same time, many comments were not reindented, which creates a real mess.

// Get the path we're mounted at. It's best to get this from the referer
// in case we're proxied at a deep path.
var source = url.parse(req.headers.referer || '').pathname;
var source = url.parse(req.headers.referer || '').pathname;
// If no referer is available, use the incoming url.
if (!source) {
source = req.originalUrl.replace(/\/config.json(\?.*)?$/, '');
}
res.send({
url: urlJoin(source, '/' + options.resourcePath)
if (!source) {
source = req.originalUrl.replace(/\/config.json(\?.*)?$/, '');
}
res.send({
url: urlJoin(source, '/' + options.resourcePath),
});
});
});

if (options.swaggerUI) {
if (options.swaggerUI) {
// Allow specifying a static file roots for swagger files. Any files in
// these folders will override those in the swagger-ui distribution.
// In this way one could e.g. make changes to index.html without having
// to worry about constantly pulling in JS updates.
if (options.uiDirs) {
if (typeof options.uiDirs === 'string') {
router.use(loopback.static(options.uiDirs));
} else if (Array.isArray(options.uiDirs)) {
options.uiDirs.forEach(function(dir) {
router.use(loopback.static(dir));
});
if (options.uiDirs) {
if (typeof options.uiDirs === 'string') {
router.use(loopback.static(options.uiDirs));
} else if (Array.isArray(options.uiDirs)) {
options.uiDirs.forEach(function(dir) {
router.use(loopback.static(dir));
});
}
}
}

// File in node_modules are overridden by a few customizations
router.use(loopback.static(STATIC_ROOT));
router.use(loopback.static(STATIC_ROOT));

// Swagger UI distribution
router.use(loopback.static(SWAGGER_UI_ROOT));
}
router.use(loopback.static(SWAGGER_UI_ROOT));
}

return router;
}
return router;
}

/**
* Setup Swagger documentation on the given express app.
Expand All @@ -95,30 +95,30 @@ function routes(loopbackApplication, options) {
* swagger documentation.
* @param {Object} opts Options.
*/
function mountSwagger(loopbackApplication, swaggerApp, opts) {
var swaggerObject = createSwaggerObject(loopbackApplication, opts);
function mountSwagger(loopbackApplication, swaggerApp, opts) {
var swaggerObject = createSwaggerObject(loopbackApplication, opts);

// listening to modelRemoted event for updating the swaggerObject
// with the newly created model to appear in the Swagger UI.
loopbackApplication.on('modelRemoted', function() {
swaggerObject = createSwaggerObject(loopbackApplication, opts);
});
loopbackApplication.on('modelRemoted', function() {
swaggerObject = createSwaggerObject(loopbackApplication, opts);
});

var resourcePath = opts && opts.resourcePath || 'swagger.json';
if (resourcePath[0] !== '/') resourcePath = '/' + resourcePath;
var resourcePath = opts && opts.resourcePath || 'swagger.json';
if (resourcePath[0] !== '/') resourcePath = '/' + resourcePath;

var remotes = loopbackApplication.remotes();
setupCors(swaggerApp, remotes);
var remotes = loopbackApplication.remotes();
setupCors(swaggerApp, remotes);

swaggerApp.get(resourcePath, function sendSwaggerObject(req, res) {
res.status(200).send(swaggerObject);
});
}
swaggerApp.get(resourcePath, function sendSwaggerObject(req, res) {
res.status(200).send(swaggerObject);
});
}

function setupCors(swaggerApp, remotes) {
var corsOptions = remotes.options && remotes.options.cors ||
function setupCors(swaggerApp, remotes) {
var corsOptions = remotes.options && remotes.options.cors ||
{ origin: true, credentials: true };

// TODO(bajtos) Skip CORS when remotes.options.cors === false
swaggerApp.use(cors(corsOptions));
}
swaggerApp.use(cors(corsOptions));
}
10 changes: 7 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
"description": "Browse and test your LoopBack app's APIs",
"main": "index.js",
"scripts": {
"test": "mocha"
"lint": "eslint .",
"test": "mocha",
"posttest": "npm run lint"
},
"repository": {
"type": "git",
Expand All @@ -21,10 +23,12 @@
"url": "https://github.com/strongloop/loopback-component-explorer/issues"
},
"devDependencies": {
"chai": "^3.2.0",
"eslint": "^2.8.0",
"eslint-config-loopback": "^2.0.0",
"loopback": "^2.19.1",
"mocha": "^2.2.5",
"supertest": "^1.0.1",
"chai": "^3.2.0"
"supertest": "^1.0.1"
},
"license": "MIT",
"dependencies": {
Expand Down
22 changes: 11 additions & 11 deletions public/lib/loadSwaggerUI.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
/*global SwaggerUi, log, ApiKeyAuthorization, hljs, window, $ */
$(function() {
// Pre load translate...
if(window.SwaggerTranslator) {
if (window.SwaggerTranslator) {
window.SwaggerTranslator.translate();
}

Expand All @@ -17,6 +17,7 @@ $(function() {
var accessToken;
function loadSwaggerUi(config) {
var methodOrder = ['get', 'head', 'options', 'put', 'post', 'delete'];
/* eslint-disable camelcase */
window.swaggerUi = new SwaggerUi({
validatorUrl: null,
url: config.url || '/swagger/resources',
Expand All @@ -28,7 +29,7 @@ $(function() {
log(swaggerApi);
log(swaggerUi);

if(window.SwaggerTranslator) {
if (window.SwaggerTranslator) {
window.SwaggerTranslator.translate();
}

Expand Down Expand Up @@ -56,8 +57,9 @@ $(function() {
return pathCompare !== 0 ?
pathCompare :
methodOrder.indexOf(a.method) - methodOrder.indexOf(b.method);
}
},
});
/* eslint-disable camelcase */

$('#explore').click(setAccessToken);
$('#api_selector').submit(setAccessToken);
Expand All @@ -71,9 +73,10 @@ $(function() {
e.preventDefault();
var key = $('#input_accessToken')[0].value;
log('key: ' + key);
if(key && key.trim() !== '') {
if (key && key.trim() !== '') {
log('added accessToken ' + key);
var apiKeyAuth = new SwaggerClient.ApiKeyAuthorization('access_token', key, 'query');
var apiKeyAuth =
new SwaggerClient.ApiKeyAuthorization('access_token', key, 'query');
window.swaggerUi.api.clientAuthorizations.add('key', apiKeyAuth);
accessToken = key;
$('.accessTokenDisplay').text('Token Set.').addClass('set');
Expand All @@ -83,10 +86,9 @@ $(function() {
if (window.localStorage) {
window.localStorage.setItem(lsKey, key);
}
}
// If submitted with an empty token, remove the current token. Can be
// useful to intentionally remove authorization.
else {
} else {
// If submitted with an empty token, remove the current token. Can be
// useful to intentionally remove authorization.
log('removed accessToken.');
$('.accessTokenDisplay').text('Token Not Set.').removeClass('set');
$('.accessTokenDisplay').removeAttr('data-tooltip');
Expand Down Expand Up @@ -116,5 +118,3 @@ $(function() {
}
}
});


11 changes: 5 additions & 6 deletions test/explorer.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ var urlJoin = require('../lib/url-join');
var os = require('os');

describe('explorer', function() {

describe('with default config', function() {
beforeEach(givenLoopBackAppWithExplorer());

Expand Down Expand Up @@ -117,7 +116,7 @@ describe('explorer', function() {
beforeEach(function setupExplorerWithUiDirs() {
app = loopback();
explorer(app, {
uiDirs: [path.resolve(__dirname, 'fixtures', 'dummy-swagger-ui')]
uiDirs: [path.resolve(__dirname, 'fixtures', 'dummy-swagger-ui')],
});
});

Expand All @@ -143,7 +142,7 @@ describe('explorer', function() {
beforeEach(function setupExplorerWithoutUI() {
app = loopback();
explorer(app, {
swaggerUI: false
swaggerUI: false,
});
});

Expand Down Expand Up @@ -200,7 +199,7 @@ describe('explorer', function() {

it('should allow `uiDirs` to be defined as an Array', function(done) {
explorer(app, {
uiDirs: [path.resolve(__dirname, 'fixtures', 'dummy-swagger-ui')]
uiDirs: [path.resolve(__dirname, 'fixtures', 'dummy-swagger-ui')],
});

request(app).get('/explorer/')
Expand All @@ -212,7 +211,7 @@ describe('explorer', function() {

it('should allow `uiDirs` to be defined as an String', function(done) {
explorer(app, {
uiDirs: path.resolve(__dirname, 'fixtures', 'dummy-swagger-ui')
uiDirs: path.resolve(__dirname, 'fixtures', 'dummy-swagger-ui'),
});

request(app).get('/explorer/')
Expand All @@ -238,7 +237,7 @@ describe('explorer', function() {

it('can be disabled by configuration', function(done) {
var app = loopback();
app.set('remoting', { cors: { origin: false } });
app.set('remoting', { cors: { origin: false }});
configureRestApiAndExplorer(app, '/explorer');

request(app)
Expand Down