loopback-component-explorer/index.js

67 lines
2.0 KiB
JavaScript

'use strict';
/*!
* Adds dynamically-updated docs as /explorer
*/
var path = require('path');
var urlJoin = require('./lib/url-join');
var _defaults = require('lodash.defaults');
var express = require('express');
var swagger = require('./lib/swagger');
var SWAGGER_UI_ROOT = path.join(__dirname, 'node_modules',
'swagger-ui', 'dist');
var STATIC_ROOT = path.join(__dirname, 'public');
module.exports = explorer;
/**
* Example usage:
*
* var explorer = require('loopback-explorer');
* app.use('/explorer', explorer(app, options));
*/
function explorer(loopbackApplication, options) {
options = _defaults({}, options, {
resourcePath: 'resources',
apiInfo: loopbackApplication.get('apiInfo') || {},
preMiddleware: []
});
var app = express();
swagger(loopbackApplication, app, options);
// Allow the user to attach middleware that will run before any
// explorer routes, e.g. for access control.
if (typeof options.preMiddleware === 'function' ||
(Array.isArray(options.preMiddleware) && options.preMiddleware.length)) {
app.use(options.preMiddleware);
}
app.disable('x-powered-by');
// config.json is loaded by swagger-ui. The server should respond
// with the relative URI of the resource doc.
app.get('/config.json', function(req, res) {
var resourcePath = req.originalUrl.replace(/\/config.json(\?.*)?$/,
urlJoin('/', options.resourcePath));
res.send({
url: resourcePath
});
});
// Allow specifying a static file root for swagger files. Any files in
// that folder 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.swaggerDistRoot) {
app.use(express.static(options.swaggerDistRoot));
}
// File in node_modules are overridden by a few customizations
app.use(express.static(STATIC_ROOT));
// Swagger UI distribution
app.use(express.static(SWAGGER_UI_ROOT));
return app;
}