UNPKG

@balderdash/sails-edge

Version:

API-driven framework for building realtime apps, using MVC conventions (based on Express and Socket.io)

77 lines (68 loc) 2.26 kB
var _ = require('lodash'); /** * Load views and generate view-serving middleware for each one * * @param {Sails} sails * @param {Hook} hook * @api private */ module.exports = function detectAndPrepareViews (sails, hook) { sails.modules.statViews(function (err, detectedViews) { if (err) throw err; // Save existence tree in `sails.views` for consumption later sails.views = detectedViews || {}; // Generate view-serving middleware and stow it in `hook.middleware` createMiddleware(detectedViews); }); /** * Generates view-serving middleware for each view */ function createMiddleware (detectedViews) { // If there are any matching views which don't have an action // create middleware to serve them _.each(detectedViews, function (view, id) { // Create middleware for a top-level view if (view === true) { sails.log.silly('Building action for view: ', id); hook.middleware[id] = serveView(id); } // Create middleware for each subview else { hook.middleware[id] = {}; for (var subViewId in detectedViews[id]) { sails.log.silly('Building action for view: ', id, '/', subViewId); hook.middleware[id][subViewId] = serveView(id, subViewId); } } }); } /** * Returns a middleware chain that remembers a view id and * runs simple middleware to template and serve the view file. * Used to serve views w/o controllers * * (This concatenation approach is crucial to allow policies to be bound) * * @param {[type]} viewId [description] * @param {[type]} subViewId [description] * @return {Array} */ function serveView (viewId, subViewId) { // Save for use in closure // (handle top-level and subview cases) var viewExpression = viewId + (subViewId ? '/' + subViewId : ''); return [ function rememberViewId(req, res, next) { // Save reference for view in res.view() middleware // (only needs to happen if subViewId is not set [top-level view]) if (viewId) { req.options.view = viewExpression; } next(); }, function serveView(req, res) { res.view(); } ]; } };