Skip to content

Commit 97d0a09

Browse files
add demos cache, middleware and POST echo
1 parent f4b918d commit 97d0a09

File tree

3 files changed

+112
-3
lines changed

3 files changed

+112
-3
lines changed

demos/index.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
"use strict";
2+
3+
var project = 'demos';
4+
var demos = require('../middleware/demos')(project, {
5+
title: "MooTools Demos"
6+
});
7+
8+
module.exports = function(app){
9+
app.get('/demos/', demos);
10+
};

index.js

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ app.use(bodyParser.json());
4949

5050
// fix trailing slashes in path
5151
app.use(function(req, res, next){
52+
if (req.method == 'POST') return next();
5253
if (req.path != '/' && req.path.substr(-1) == '/'){
5354
var query = req.url.slice(req.path.length);
5455
res.redirect(301, req.path.slice(0, -1) + query);
@@ -62,7 +63,6 @@ if (app.get('env') == 'development'){
6263

6364
app.use(morgan('dev'));
6465
app.use(errorhandler());
65-
6666
app.use(function setJadePretty(req, res, next){
6767
res.locals.pretty = true;
6868
res.locals.cache = false;
@@ -79,7 +79,7 @@ require('./middleware/build-static')(app, {
7979
dirname: __dirname
8080
});
8181

82-
app.use(express.static(__dirname + '/public'));
82+
app.use(express.static(__dirname + '/public', { redirect: false }));
8383

8484
// github, twitter & blog feeds
8585
var githubEvents = require('./middleware/githubEvents')({
@@ -88,7 +88,7 @@ var githubEvents = require('./middleware/githubEvents')({
8888
var twitter = require('./middleware/twitter')();
8989
var blogData = require('./blog/data');
9090
function getLatestBlog(req, res, next){
91-
blogData.get(function(err, blog) {
91+
blogData.get(function(err, blog){
9292
if (err) next(err);
9393
res.locals.lastBlogPost = blog.posts[0];
9494
next();
@@ -114,6 +114,7 @@ app.get('/search', function(req, res){
114114

115115
require('./core')(app);
116116
require('./more')(app);
117+
require('./demos')(app);
117118
require('./blog')(app);
118119
require('./books')(app);
119120
require('./builder')(app);
@@ -139,6 +140,13 @@ app.get(/^\/download/i, function(req, res){
139140
res.redirect(301, '/core');
140141
});
141142

143+
// for demos to echo Requests
144+
app.post('/echo/:type', function(req, res){
145+
var type = req.params.type;
146+
res.send(req.body[type]);
147+
res.end();
148+
});
149+
142150
// handle 404 errors
143151
app.get('*', function(req, res, next){
144152
var err = new Error();

middleware/demos.js

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
"use strict";
2+
3+
var fs = require('fs');
4+
var path = require('path');
5+
var async = require('async');
6+
var pkg = require('../package.json');
7+
var waitForIt = require('../lib/waitForIt');
8+
var getFiles = require('../lib/getFiles');
9+
var loadJSON = require('../lib/loadJSON');
10+
var associate = require('../lib/associate');
11+
var debounce = require('../lib/debounce');
12+
13+
14+
function filterToc(file, cb){
15+
cb(!fs.statSync(file).isDirectory() && file.indexOf('toc-demos.json') == -1 && path.extname(file).slice(1) == 'json');
16+
}
17+
18+
function loadFiles(dir, callback){
19+
20+
var addPath = function(files, cb){
21+
async.map(files, function(fileName, cbMap){
22+
cbMap(null, path.join(dir, fileName));
23+
}, cb);
24+
}
25+
var filterFiles = function(files, cb){
26+
async.filter(files, filterToc, function(filtered){
27+
cb(null, filtered);
28+
});
29+
}
30+
var addContent = function(arr, cb){
31+
async.map(arr, loadJSON, cb);
32+
}
33+
var loadToc = function(filesContent, cb){
34+
loadJSON(dir + '/toc-demos.json', function(err, data){
35+
cb(err, !err && {
36+
content: associate(Object.keys(data), filesContent),
37+
toc: data
38+
});
39+
});
40+
}
41+
var compiler = async.compose(loadToc, addContent, filterFiles, addPath, fs.readdir);
42+
compiler(dir, callback);
43+
}
44+
45+
module.exports = function(project, options){
46+
47+
if (!project){
48+
throw new Error("'project' argument is required");
49+
}
50+
51+
if (!options) options = {};
52+
if (!options.title) options.title = project;
53+
54+
var dir = path.join(__dirname, '..', pkg._buildOutput, project, 'docs');
55+
var files = async.apply(loadFiles, dir);
56+
var loadDemos = waitForIt(files);
57+
58+
fs.watch(dir, debounce(function(){
59+
console.log('resetting ' + dir + ' docs data');
60+
loadDemos.reset();
61+
}));
62+
63+
function send404(next){
64+
var err404 = new Error();
65+
err404.status = 404;
66+
next(err404);
67+
}
68+
69+
return function(req, res, next){
70+
71+
loadDemos.get(function(err, results){
72+
73+
if (err) return next(err);
74+
var demo = req.query.demo || Object.keys(results.content)[0];
75+
var toc = results.toc[demo];
76+
var data = results.content[demo];
77+
if (!data) return send404(next);
78+
79+
res.render(project, {
80+
title: options.title,
81+
navigation: 'demos',
82+
content: data,
83+
description: data.details,
84+
demoName: toc.description.name,
85+
dependencies: toc.description.dependencies || 'dependencies/more/',
86+
version: pkg._projects.core.versions[0],
87+
toc: results.toc
88+
});
89+
});
90+
};
91+
};

0 commit comments

Comments
 (0)