Merge tag '3.18.6'
This commit is contained in:
commit
4aa2801054
20
History.md
20
History.md
@ -1,3 +1,8 @@
|
||||
unreleased
|
||||
==========
|
||||
|
||||
* Fix exception in `req.fresh`/`req.stale` without response headers
|
||||
|
||||
4.10.5 / 2014-12-10
|
||||
===================
|
||||
|
||||
@ -608,6 +613,21 @@
|
||||
- `app.route()` - Proxy to the app's `Router#route()` method to create a new route
|
||||
- Router & Route - public API
|
||||
|
||||
3.18.6 / 2014-12-12
|
||||
===================
|
||||
|
||||
* Fix exception in `req.fresh`/`req.stale` without response headers
|
||||
|
||||
3.18.5 / 2014-12-11
|
||||
===================
|
||||
|
||||
* deps: connect@2.27.6
|
||||
- deps: compression@~1.2.2
|
||||
- deps: express-session@~1.9.3
|
||||
- deps: http-errors@~1.2.8
|
||||
- deps: serve-index@~1.5.3
|
||||
- deps: type-is@~1.5.4
|
||||
|
||||
3.18.4 / 2014-11-23
|
||||
===================
|
||||
|
||||
|
@ -9,7 +9,7 @@ var silent = 'test' == process.env.NODE_ENV;
|
||||
|
||||
// general config
|
||||
app.set('views', __dirname + '/views');
|
||||
app.set('view engine', 'jade');
|
||||
app.set('view engine', 'ejs');
|
||||
|
||||
// our custom "verbose errors" setting
|
||||
// which we can use in the templates
|
||||
@ -25,7 +25,7 @@ silent || app.use(logger('dev'));
|
||||
// Routes
|
||||
|
||||
app.get('/', function(req, res){
|
||||
res.render('index.jade');
|
||||
res.render('index.ejs');
|
||||
});
|
||||
|
||||
app.get('/404', function(req, res, next){
|
||||
@ -96,7 +96,6 @@ app.use(function(err, req, res, next){
|
||||
res.render('500', { error: err });
|
||||
});
|
||||
|
||||
|
||||
/* istanbul ignore next */
|
||||
if (!module.parent) {
|
||||
app.listen(3000);
|
||||
|
3
examples/error-pages/views/404.ejs
Normal file
3
examples/error-pages/views/404.ejs
Normal file
@ -0,0 +1,3 @@
|
||||
<% include error_header %>
|
||||
<h2>Cannot find <%= url %></h2>
|
||||
<% include footer %>
|
@ -1,5 +0,0 @@
|
||||
|
||||
extends error
|
||||
|
||||
block content
|
||||
h2 Cannot find #{url}
|
8
examples/error-pages/views/500.ejs
Normal file
8
examples/error-pages/views/500.ejs
Normal file
@ -0,0 +1,8 @@
|
||||
<% include error_header %>
|
||||
<h2>Error: <%= error.message %></h2>
|
||||
<% if (settings['verbose errors']) { %>
|
||||
<pre><%= error.stack %></pre>
|
||||
<% } else { %>
|
||||
<p>An error occurred!</p>
|
||||
<% } %>
|
||||
<% include footer %>
|
@ -1,13 +0,0 @@
|
||||
|
||||
// note that we extend a different
|
||||
// layout with jade for 4xx & 5xx
|
||||
// responses
|
||||
|
||||
extends error
|
||||
|
||||
block content
|
||||
h1 Error: #{error.message}
|
||||
if settings['verbose errors']
|
||||
pre= error.stack
|
||||
else
|
||||
p An error ocurred!
|
@ -1,6 +0,0 @@
|
||||
html
|
||||
head
|
||||
title Error
|
||||
body
|
||||
h1 An error occurred!
|
||||
block content
|
8
examples/error-pages/views/error_header.ejs
Normal file
8
examples/error-pages/views/error_header.ejs
Normal file
@ -0,0 +1,8 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Error</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>An error occurred!</h1>
|
2
examples/error-pages/views/footer.ejs
Normal file
2
examples/error-pages/views/footer.ejs
Normal file
@ -0,0 +1,2 @@
|
||||
</body>
|
||||
</html>
|
18
examples/error-pages/views/index.ejs
Normal file
18
examples/error-pages/views/index.ejs
Normal file
@ -0,0 +1,18 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Custom Pages Example</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>My Site</h1>
|
||||
<h2>Pages Example</h2>
|
||||
|
||||
<ul>
|
||||
<li>visit <a href="/500">500</a></li>
|
||||
<li>visit <a href="/404">404</a></li>
|
||||
<li>visit <a href="/403">403</a></li>
|
||||
</ul>
|
||||
|
||||
</body>
|
||||
</html>
|
@ -1,15 +0,0 @@
|
||||
|
||||
extends layout
|
||||
|
||||
block content
|
||||
h2 Pages Example
|
||||
ul
|
||||
li
|
||||
| visit
|
||||
a(href="/500") 500
|
||||
li
|
||||
| visit
|
||||
a(href="/404") 404
|
||||
li
|
||||
| visit
|
||||
a(href='/403') 403
|
@ -1,6 +0,0 @@
|
||||
html
|
||||
head
|
||||
title Custom Pages Example
|
||||
body
|
||||
h1 My Site
|
||||
block content
|
@ -4,6 +4,8 @@
|
||||
|
||||
var db = require('../../db');
|
||||
|
||||
exports.engine = 'ejs';
|
||||
|
||||
exports.before = function(req, res, next){
|
||||
var pet = db.pets[req.params.pet_id];
|
||||
if (!pet) return next('route');
|
||||
|
15
examples/mvc/controllers/pet/views/edit.ejs
Normal file
15
examples/mvc/controllers/pet/views/edit.ejs
Normal file
@ -0,0 +1,15 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<link rel="stylesheet" href="/style.css">
|
||||
<title>Edit <%= pet.name %></title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1><%= pet.name %></h1>
|
||||
<form action="/pet/<%= pet.id %>?_method=put" method="post">
|
||||
<label>Name: <input type="text" name="user[name]" value="<%= pet.name %>"></label>
|
||||
<input type="submit" value="Update">
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
@ -1,6 +0,0 @@
|
||||
link(rel='stylesheet', href='/style.css')
|
||||
h1= pet.name
|
||||
form(action='/pet/#{pet.id}?_method=put', method='post')
|
||||
label= 'Name: '
|
||||
input(type='text', name='pet[name]', value=pet.name)
|
||||
input(type='submit', value='Update')
|
13
examples/mvc/controllers/pet/views/show.ejs
Normal file
13
examples/mvc/controllers/pet/views/show.ejs
Normal file
@ -0,0 +1,13 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<link rel="stylesheet" href="/style.css">
|
||||
<title><%= pet.name %></title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1><%= pet.name %> <a href="/pet/<%= pet.id %>/edit">edit</a></h1>
|
||||
|
||||
<p>You are viewing <%= pet.name %></p>
|
||||
</body>
|
||||
</html>
|
@ -1,6 +0,0 @@
|
||||
link(rel='stylesheet', href='/style.css')
|
||||
|
||||
h1= pet.name
|
||||
a(href='/pet/#{pet.id}/edit') edit
|
||||
|
||||
p You are viewing #{pet.name}
|
@ -412,7 +412,7 @@ defineGetter(req, 'fresh', function(){
|
||||
|
||||
// 2xx or 304 as per rfc2616 14.26
|
||||
if ((s >= 200 && s < 300) || 304 == s) {
|
||||
return fresh(this.headers, this.res._headers);
|
||||
return fresh(this.headers, (this.res._headers || {}));
|
||||
}
|
||||
|
||||
return false;
|
||||
|
@ -54,9 +54,9 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"after": "0.8.1",
|
||||
"istanbul": "0.3.2",
|
||||
"istanbul": "0.3.5",
|
||||
"mocha": "~2.0.0",
|
||||
"should": "~4.3.0",
|
||||
"should": "~4.3.1",
|
||||
"supertest": "~0.15.0",
|
||||
"ejs": "~1.0.0",
|
||||
"marked": "0.3.2",
|
||||
|
@ -1,65 +0,0 @@
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var express = require('../');
|
||||
|
||||
var app = express()
|
||||
, blog = express()
|
||||
, admin = express();
|
||||
|
||||
blog.use('/admin', admin);
|
||||
app.use('/blog', blog);
|
||||
app.set('views', __dirname + '/views');
|
||||
app.set('view engine', 'jade');
|
||||
app.locals.self = true;
|
||||
|
||||
app.get('/render', function(req, res){
|
||||
res.render('hello');
|
||||
});
|
||||
|
||||
admin.get('/', function(req, res){
|
||||
res.send('Hello World\n');
|
||||
});
|
||||
|
||||
blog.get('/', function(req, res){
|
||||
res.send('Hello World\n');
|
||||
});
|
||||
|
||||
app.get('/', function(req, res){
|
||||
res.send('Hello World\n');
|
||||
});
|
||||
|
||||
app.get('/json', function(req, res){
|
||||
res.send({ name: 'Tobi', role: 'admin' });
|
||||
});
|
||||
|
||||
app.get('/json/:n', function(req, res){
|
||||
var n = ~~req.params.n;
|
||||
var arr = [];
|
||||
var obj = { name: 'Tobi', role: 'admin' };
|
||||
while (n--) arr.push(obj);
|
||||
res.send(arr);
|
||||
});
|
||||
|
||||
function foo(req, res, next) {
|
||||
next();
|
||||
}
|
||||
|
||||
app.get('/middleware', foo, foo, foo, foo, function(req, res){
|
||||
res.send('Hello World\n');
|
||||
});
|
||||
|
||||
var n = 100;
|
||||
while (n--) {
|
||||
app.get('/foo', foo, foo, function(req, res){
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
app.get('/match', function(req, res){
|
||||
res.send('Hello World\n');
|
||||
});
|
||||
|
||||
app.listen(8000);
|
@ -1 +0,0 @@
|
||||
p Hello
|
@ -1,14 +1,15 @@
|
||||
|
||||
var express = require('../');
|
||||
var express = require('..');
|
||||
var tmpl = require('./support/tmpl');
|
||||
|
||||
describe('app', function(){
|
||||
describe('.render(name, fn)', function(){
|
||||
it('should support absolute paths', function(done){
|
||||
var app = express();
|
||||
var app = createApp();
|
||||
|
||||
app.locals.user = { name: 'tobi' };
|
||||
|
||||
app.render(__dirname + '/fixtures/user.jade', function(err, str){
|
||||
app.render(__dirname + '/fixtures/user.tmpl', function (err, str) {
|
||||
if (err) return done(err);
|
||||
str.should.equal('<p>tobi</p>');
|
||||
done();
|
||||
@ -16,9 +17,9 @@ describe('app', function(){
|
||||
})
|
||||
|
||||
it('should support absolute paths with "view engine"', function(done){
|
||||
var app = express();
|
||||
var app = createApp();
|
||||
|
||||
app.set('view engine', 'jade');
|
||||
app.set('view engine', 'tmpl');
|
||||
app.locals.user = { name: 'tobi' };
|
||||
|
||||
app.render(__dirname + '/fixtures/user', function(err, str){
|
||||
@ -29,12 +30,12 @@ describe('app', function(){
|
||||
})
|
||||
|
||||
it('should expose app.locals', function(done){
|
||||
var app = express();
|
||||
var app = createApp();
|
||||
|
||||
app.set('views', __dirname + '/fixtures');
|
||||
app.locals.user = { name: 'tobi' };
|
||||
|
||||
app.render('user.jade', function(err, str){
|
||||
app.render('user.tmpl', function (err, str) {
|
||||
if (err) return done(err);
|
||||
str.should.equal('<p>tobi</p>');
|
||||
done();
|
||||
@ -42,12 +43,12 @@ describe('app', function(){
|
||||
})
|
||||
|
||||
it('should support index.<engine>', function(done){
|
||||
var app = express();
|
||||
var app = createApp();
|
||||
|
||||
app.set('views', __dirname + '/fixtures');
|
||||
app.set('view engine', 'jade');
|
||||
app.set('view engine', 'tmpl');
|
||||
|
||||
app.render('blog/post', function(err, str){
|
||||
app.render('blog/post', function (err, str) {
|
||||
if (err) return done(err);
|
||||
str.should.equal('<h1>blog post</h1>');
|
||||
done();
|
||||
@ -77,10 +78,11 @@ describe('app', function(){
|
||||
|
||||
describe('when the file does not exist', function(){
|
||||
it('should provide a helpful error', function(done){
|
||||
var app = express();
|
||||
var app = createApp();
|
||||
|
||||
app.set('views', __dirname + '/fixtures');
|
||||
app.render('rawr.jade', function(err){
|
||||
err.message.should.equal('Failed to lookup view "rawr.jade" in views directory "' + __dirname + '/fixtures"');
|
||||
app.render('rawr.tmpl', function (err) {
|
||||
err.message.should.equal('Failed to lookup view "rawr.tmpl" in views directory "' + __dirname + '/fixtures"');
|
||||
done();
|
||||
});
|
||||
})
|
||||
@ -88,11 +90,11 @@ describe('app', function(){
|
||||
|
||||
describe('when an error occurs', function(){
|
||||
it('should invoke the callback', function(done){
|
||||
var app = express();
|
||||
var app = createApp();
|
||||
|
||||
app.set('views', __dirname + '/fixtures');
|
||||
|
||||
app.render('user.jade', function(err, str){
|
||||
app.render('user.tmpl', function (err, str) {
|
||||
// nextTick to prevent cyclic
|
||||
process.nextTick(function(){
|
||||
err.message.should.match(/Cannot read property '[^']+' of undefined/);
|
||||
@ -104,11 +106,11 @@ describe('app', function(){
|
||||
|
||||
describe('when an extension is given', function(){
|
||||
it('should render the template', function(done){
|
||||
var app = express();
|
||||
var app = createApp();
|
||||
|
||||
app.set('views', __dirname + '/fixtures');
|
||||
|
||||
app.render('email.jade', function(err, str){
|
||||
app.render('email.tmpl', function (err, str) {
|
||||
if (err) return done(err);
|
||||
str.should.equal('<p>This is an email</p>');
|
||||
done();
|
||||
@ -118,9 +120,9 @@ describe('app', function(){
|
||||
|
||||
describe('when "view engine" is given', function(){
|
||||
it('should render the template', function(done){
|
||||
var app = express();
|
||||
var app = createApp();
|
||||
|
||||
app.set('view engine', 'jade');
|
||||
app.set('view engine', 'tmpl');
|
||||
app.set('views', __dirname + '/fixtures');
|
||||
|
||||
app.render('email', function(err, str){
|
||||
@ -133,12 +135,12 @@ describe('app', function(){
|
||||
|
||||
describe('when "views" is given', function(){
|
||||
it('should lookup the file in the path', function(done){
|
||||
var app = express();
|
||||
var app = createApp();
|
||||
|
||||
app.set('views', __dirname + '/fixtures/default_layout');
|
||||
app.locals.user = { name: 'tobi' };
|
||||
|
||||
app.render('user.jade', function(err, str){
|
||||
app.render('user.tmpl', function (err, str) {
|
||||
if (err) return done(err);
|
||||
str.should.equal('<p>tobi</p>');
|
||||
done();
|
||||
@ -147,13 +149,13 @@ describe('app', function(){
|
||||
|
||||
describe('when array of paths', function(){
|
||||
it('should lookup the file in the path', function(done){
|
||||
var app = express();
|
||||
var app = createApp();
|
||||
var views = [__dirname + '/fixtures/local_layout', __dirname + '/fixtures/default_layout'];
|
||||
|
||||
app.set('views', views);
|
||||
app.locals.user = { name: 'tobi' };
|
||||
|
||||
app.render('user.jade', function(err, str){
|
||||
app.render('user.tmpl', function (err, str) {
|
||||
if (err) return done(err);
|
||||
str.should.equal('<span>tobi</span>');
|
||||
done();
|
||||
@ -161,13 +163,13 @@ describe('app', function(){
|
||||
})
|
||||
|
||||
it('should lookup in later paths until found', function(done){
|
||||
var app = express();
|
||||
var app = createApp();
|
||||
var views = [__dirname + '/fixtures/local_layout', __dirname + '/fixtures/default_layout'];
|
||||
|
||||
app.set('views', views);
|
||||
app.locals.name = 'tobi';
|
||||
|
||||
app.render('name.jade', function(err, str){
|
||||
app.render('name.tmpl', function (err, str) {
|
||||
if (err) return done(err);
|
||||
str.should.equal('<p>tobi</p>');
|
||||
done();
|
||||
@ -175,14 +177,14 @@ describe('app', function(){
|
||||
})
|
||||
|
||||
it('should error if file does not exist', function(done){
|
||||
var app = express();
|
||||
var app = createApp();
|
||||
var views = [__dirname + '/fixtures/local_layout', __dirname + '/fixtures/default_layout'];
|
||||
|
||||
app.set('views', views);
|
||||
app.locals.name = 'tobi';
|
||||
|
||||
app.render('pet.jade', function(err, str){
|
||||
err.message.should.equal('Failed to lookup view "pet.jade" in views directories "' + __dirname + '/fixtures/local_layout" or "' + __dirname + '/fixtures/default_layout"');
|
||||
app.render('pet.tmpl', function (err, str) {
|
||||
err.message.should.equal('Failed to lookup view "pet.tmpl" in views directories "' + __dirname + '/fixtures/local_layout" or "' + __dirname + '/fixtures/default_layout"');
|
||||
done();
|
||||
})
|
||||
})
|
||||
@ -277,13 +279,13 @@ describe('app', function(){
|
||||
|
||||
describe('.render(name, options, fn)', function(){
|
||||
it('should render the template', function(done){
|
||||
var app = express();
|
||||
var app = createApp();
|
||||
|
||||
app.set('views', __dirname + '/fixtures');
|
||||
|
||||
var user = { name: 'tobi' };
|
||||
|
||||
app.render('user.jade', { user: user }, function(err, str){
|
||||
app.render('user.tmpl', { user: user }, function (err, str) {
|
||||
if (err) return done(err);
|
||||
str.should.equal('<p>tobi</p>');
|
||||
done();
|
||||
@ -291,12 +293,12 @@ describe('app', function(){
|
||||
})
|
||||
|
||||
it('should expose app.locals', function(done){
|
||||
var app = express();
|
||||
var app = createApp();
|
||||
|
||||
app.set('views', __dirname + '/fixtures');
|
||||
app.locals.user = { name: 'tobi' };
|
||||
|
||||
app.render('user.jade', {}, function(err, str){
|
||||
app.render('user.tmpl', {}, function (err, str) {
|
||||
if (err) return done(err);
|
||||
str.should.equal('<p>tobi</p>');
|
||||
done();
|
||||
@ -304,13 +306,13 @@ describe('app', function(){
|
||||
})
|
||||
|
||||
it('should give precedence to app.render() locals', function(done){
|
||||
var app = express();
|
||||
var app = createApp();
|
||||
|
||||
app.set('views', __dirname + '/fixtures');
|
||||
app.locals.user = { name: 'tobi' };
|
||||
var jane = { name: 'jane' };
|
||||
|
||||
app.render('user.jade', { user: jane }, function(err, str){
|
||||
app.render('user.tmpl', { user: jane }, function (err, str) {
|
||||
if (err) return done(err);
|
||||
str.should.equal('<p>jane</p>');
|
||||
done();
|
||||
@ -350,3 +352,11 @@ describe('app', function(){
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
function createApp() {
|
||||
var app = express();
|
||||
|
||||
app.engine('.tmpl', tmpl);
|
||||
|
||||
return app;
|
||||
}
|
||||
|
1
test/fixtures/blog/post/index.jade
vendored
1
test/fixtures/blog/post/index.jade
vendored
@ -1 +0,0 @@
|
||||
h1 blog post
|
1
test/fixtures/blog/post/index.tmpl
vendored
Normal file
1
test/fixtures/blog/post/index.tmpl
vendored
Normal file
@ -0,0 +1 @@
|
||||
<h1>blog post</h1>
|
1
test/fixtures/default_layout/name.jade
vendored
1
test/fixtures/default_layout/name.jade
vendored
@ -1 +0,0 @@
|
||||
p= name
|
1
test/fixtures/default_layout/name.tmpl
vendored
Normal file
1
test/fixtures/default_layout/name.tmpl
vendored
Normal file
@ -0,0 +1 @@
|
||||
<p>$name</p>
|
1
test/fixtures/default_layout/user.jade
vendored
1
test/fixtures/default_layout/user.jade
vendored
@ -1 +0,0 @@
|
||||
p= user.name
|
1
test/fixtures/default_layout/user.tmpl
vendored
Normal file
1
test/fixtures/default_layout/user.tmpl
vendored
Normal file
@ -0,0 +1 @@
|
||||
<p>$user.name</p>
|
1
test/fixtures/email.jade
vendored
1
test/fixtures/email.jade
vendored
@ -1 +0,0 @@
|
||||
p This is an email
|
1
test/fixtures/email.tmpl
vendored
Normal file
1
test/fixtures/email.tmpl
vendored
Normal file
@ -0,0 +1 @@
|
||||
<p>This is an email</p>
|
1
test/fixtures/local_layout/user.jade
vendored
1
test/fixtures/local_layout/user.jade
vendored
@ -1 +0,0 @@
|
||||
span= user.name
|
1
test/fixtures/local_layout/user.tmpl
vendored
Normal file
1
test/fixtures/local_layout/user.tmpl
vendored
Normal file
@ -0,0 +1 @@
|
||||
<span>$user.name</span>
|
1
test/fixtures/name.jade
vendored
1
test/fixtures/name.jade
vendored
@ -1 +0,0 @@
|
||||
p= name
|
1
test/fixtures/name.tmpl
vendored
Normal file
1
test/fixtures/name.tmpl
vendored
Normal file
@ -0,0 +1 @@
|
||||
<p>$name</p>
|
1
test/fixtures/pet.jade
vendored
1
test/fixtures/pet.jade
vendored
@ -1 +0,0 @@
|
||||
p #{first} #{last} is a #{species}
|
1
test/fixtures/user.jade
vendored
1
test/fixtures/user.jade
vendored
@ -1 +0,0 @@
|
||||
p= user.name
|
1
test/fixtures/user.tmpl
vendored
Normal file
1
test/fixtures/user.tmpl
vendored
Normal file
@ -0,0 +1 @@
|
||||
<p>$user.name</p>
|
@ -32,5 +32,18 @@ describe('req', function(){
|
||||
.set('If-None-Match', '"12345"')
|
||||
.expect(200, 'false', done);
|
||||
})
|
||||
|
||||
it('should return false without response headers', function(done){
|
||||
var app = express();
|
||||
|
||||
app.use(function(req, res){
|
||||
res._headers = undefined;
|
||||
res.send(req.fresh);
|
||||
});
|
||||
|
||||
request(app)
|
||||
.get('/')
|
||||
.expect(200, 'false', done);
|
||||
})
|
||||
})
|
||||
})
|
||||
|
@ -32,5 +32,18 @@ describe('req', function(){
|
||||
.set('If-None-Match', '"12345"')
|
||||
.expect(200, 'true', done);
|
||||
})
|
||||
|
||||
it('should return true without response headers', function(done){
|
||||
var app = express();
|
||||
|
||||
app.use(function(req, res){
|
||||
res._headers = undefined;
|
||||
res.send(req.stale);
|
||||
});
|
||||
|
||||
request(app)
|
||||
.get('/')
|
||||
.expect(200, 'true', done);
|
||||
})
|
||||
})
|
||||
})
|
||||
|
@ -1,16 +1,17 @@
|
||||
|
||||
var express = require('../')
|
||||
, request = require('supertest');
|
||||
var express = require('..');
|
||||
var request = require('supertest');
|
||||
var tmpl = require('./support/tmpl');
|
||||
|
||||
describe('res', function(){
|
||||
describe('.render(name)', function(){
|
||||
it('should support absolute paths', function(done){
|
||||
var app = express();
|
||||
var app = createApp();
|
||||
|
||||
app.locals.user = { name: 'tobi' };
|
||||
|
||||
app.use(function(req, res){
|
||||
res.render(__dirname + '/fixtures/user.jade');
|
||||
res.render(__dirname + '/fixtures/user.tmpl');
|
||||
});
|
||||
|
||||
request(app)
|
||||
@ -19,10 +20,10 @@ describe('res', function(){
|
||||
})
|
||||
|
||||
it('should support absolute paths with "view engine"', function(done){
|
||||
var app = express();
|
||||
var app = createApp();
|
||||
|
||||
app.locals.user = { name: 'tobi' };
|
||||
app.set('view engine', 'jade');
|
||||
app.set('view engine', 'tmpl');
|
||||
|
||||
app.use(function(req, res){
|
||||
res.render(__dirname + '/fixtures/user');
|
||||
@ -34,13 +35,13 @@ describe('res', function(){
|
||||
})
|
||||
|
||||
it('should expose app.locals', function(done){
|
||||
var app = express();
|
||||
var app = createApp();
|
||||
|
||||
app.set('views', __dirname + '/fixtures');
|
||||
app.locals.user = { name: 'tobi' };
|
||||
|
||||
app.use(function(req, res){
|
||||
res.render('user.jade');
|
||||
res.render('user.tmpl');
|
||||
});
|
||||
|
||||
request(app)
|
||||
@ -49,13 +50,13 @@ describe('res', function(){
|
||||
})
|
||||
|
||||
it('should expose app.locals with `name` property', function(done){
|
||||
var app = express();
|
||||
var app = createApp();
|
||||
|
||||
app.set('views', __dirname + '/fixtures');
|
||||
app.locals.name = 'tobi';
|
||||
|
||||
app.use(function(req, res){
|
||||
res.render('name.jade');
|
||||
res.render('name.tmpl');
|
||||
});
|
||||
|
||||
request(app)
|
||||
@ -64,10 +65,10 @@ describe('res', function(){
|
||||
})
|
||||
|
||||
it('should support index.<engine>', function(done){
|
||||
var app = express();
|
||||
var app = createApp();
|
||||
|
||||
app.set('views', __dirname + '/fixtures');
|
||||
app.set('view engine', 'jade');
|
||||
app.set('view engine', 'tmpl');
|
||||
|
||||
app.use(function(req, res){
|
||||
res.render('blog/post');
|
||||
@ -80,12 +81,12 @@ describe('res', function(){
|
||||
|
||||
describe('when an error occurs', function(){
|
||||
it('should next(err)', function(done){
|
||||
var app = express();
|
||||
var app = createApp();
|
||||
|
||||
app.set('views', __dirname + '/fixtures');
|
||||
|
||||
app.use(function(req, res){
|
||||
res.render('user.jade');
|
||||
res.render('user.tmpl');
|
||||
});
|
||||
|
||||
app.use(function(err, req, res, next){
|
||||
@ -100,9 +101,9 @@ describe('res', function(){
|
||||
|
||||
describe('when "view engine" is given', function(){
|
||||
it('should render the template', function(done){
|
||||
var app = express();
|
||||
var app = createApp();
|
||||
|
||||
app.set('view engine', 'jade');
|
||||
app.set('view engine', 'tmpl');
|
||||
app.set('views', __dirname + '/fixtures');
|
||||
|
||||
app.use(function(req, res){
|
||||
@ -117,12 +118,12 @@ describe('res', function(){
|
||||
|
||||
describe('when "views" is given', function(){
|
||||
it('should lookup the file in the path', function(done){
|
||||
var app = express();
|
||||
var app = createApp();
|
||||
|
||||
app.set('views', __dirname + '/fixtures/default_layout');
|
||||
|
||||
app.use(function(req, res){
|
||||
res.render('user.jade', { user: { name: 'tobi' } });
|
||||
res.render('user.tmpl', { user: { name: 'tobi' } });
|
||||
});
|
||||
|
||||
request(app)
|
||||
@ -132,13 +133,13 @@ describe('res', function(){
|
||||
|
||||
describe('when array of paths', function(){
|
||||
it('should lookup the file in the path', function(done){
|
||||
var app = express();
|
||||
var app = createApp();
|
||||
var views = [__dirname + '/fixtures/local_layout', __dirname + '/fixtures/default_layout'];
|
||||
|
||||
app.set('views', views);
|
||||
|
||||
app.use(function(req, res){
|
||||
res.render('user.jade', { user: { name: 'tobi' } });
|
||||
res.render('user.tmpl', { user: { name: 'tobi' } });
|
||||
});
|
||||
|
||||
request(app)
|
||||
@ -147,13 +148,13 @@ describe('res', function(){
|
||||
})
|
||||
|
||||
it('should lookup in later paths until found', function(done){
|
||||
var app = express();
|
||||
var app = createApp();
|
||||
var views = [__dirname + '/fixtures/local_layout', __dirname + '/fixtures/default_layout'];
|
||||
|
||||
app.set('views', views);
|
||||
|
||||
app.use(function(req, res){
|
||||
res.render('name.jade', { name: 'tobi' });
|
||||
res.render('name.tmpl', { name: 'tobi' });
|
||||
});
|
||||
|
||||
request(app)
|
||||
@ -166,14 +167,14 @@ describe('res', function(){
|
||||
|
||||
describe('.render(name, option)', function(){
|
||||
it('should render the template', function(done){
|
||||
var app = express();
|
||||
var app = createApp();
|
||||
|
||||
app.set('views', __dirname + '/fixtures');
|
||||
|
||||
var user = { name: 'tobi' };
|
||||
|
||||
app.use(function(req, res){
|
||||
res.render('user.jade', { user: user });
|
||||
res.render('user.tmpl', { user: user });
|
||||
});
|
||||
|
||||
request(app)
|
||||
@ -182,13 +183,13 @@ describe('res', function(){
|
||||
})
|
||||
|
||||
it('should expose app.locals', function(done){
|
||||
var app = express();
|
||||
var app = createApp();
|
||||
|
||||
app.set('views', __dirname + '/fixtures');
|
||||
app.locals.user = { name: 'tobi' };
|
||||
|
||||
app.use(function(req, res){
|
||||
res.render('user.jade');
|
||||
res.render('user.tmpl');
|
||||
});
|
||||
|
||||
request(app)
|
||||
@ -197,13 +198,13 @@ describe('res', function(){
|
||||
})
|
||||
|
||||
it('should expose res.locals', function(done){
|
||||
var app = express();
|
||||
var app = createApp();
|
||||
|
||||
app.set('views', __dirname + '/fixtures');
|
||||
|
||||
app.use(function(req, res){
|
||||
res.locals.user = { name: 'tobi' };
|
||||
res.render('user.jade');
|
||||
res.render('user.tmpl');
|
||||
});
|
||||
|
||||
request(app)
|
||||
@ -212,14 +213,14 @@ describe('res', function(){
|
||||
})
|
||||
|
||||
it('should give precedence to res.locals over app.locals', function(done){
|
||||
var app = express();
|
||||
var app = createApp();
|
||||
|
||||
app.set('views', __dirname + '/fixtures');
|
||||
app.locals.user = { name: 'tobi' };
|
||||
|
||||
app.use(function(req, res){
|
||||
res.locals.user = { name: 'jane' };
|
||||
res.render('user.jade', {});
|
||||
res.render('user.tmpl', {});
|
||||
});
|
||||
|
||||
request(app)
|
||||
@ -228,14 +229,14 @@ describe('res', function(){
|
||||
})
|
||||
|
||||
it('should give precedence to res.render() locals over res.locals', function(done){
|
||||
var app = express();
|
||||
var app = createApp();
|
||||
|
||||
app.set('views', __dirname + '/fixtures');
|
||||
var jane = { name: 'jane' };
|
||||
|
||||
app.use(function(req, res){
|
||||
res.locals.user = { name: 'tobi' };
|
||||
res.render('user.jade', { user: jane });
|
||||
res.render('user.tmpl', { user: jane });
|
||||
});
|
||||
|
||||
request(app)
|
||||
@ -244,14 +245,14 @@ describe('res', function(){
|
||||
})
|
||||
|
||||
it('should give precedence to res.render() locals over app.locals', function(done){
|
||||
var app = express();
|
||||
var app = createApp();
|
||||
|
||||
app.set('views', __dirname + '/fixtures');
|
||||
app.locals.user = { name: 'tobi' };
|
||||
var jane = { name: 'jane' };
|
||||
|
||||
app.use(function(req, res){
|
||||
res.render('user.jade', { user: jane });
|
||||
res.render('user.tmpl', { user: jane });
|
||||
});
|
||||
|
||||
request(app)
|
||||
@ -262,13 +263,13 @@ describe('res', function(){
|
||||
|
||||
describe('.render(name, options, fn)', function(){
|
||||
it('should pass the resulting string', function(done){
|
||||
var app = express();
|
||||
var app = createApp();
|
||||
|
||||
app.set('views', __dirname + '/fixtures');
|
||||
|
||||
app.use(function(req, res){
|
||||
var tobi = { name: 'tobi' };
|
||||
res.render('user.jade', { user: tobi }, function(err, html){
|
||||
res.render('user.tmpl', { user: tobi }, function (err, html) {
|
||||
html = html.replace('tobi', 'loki');
|
||||
res.end(html);
|
||||
});
|
||||
@ -282,13 +283,13 @@ describe('res', function(){
|
||||
|
||||
describe('.render(name, fn)', function(){
|
||||
it('should pass the resulting string', function(done){
|
||||
var app = express();
|
||||
var app = createApp();
|
||||
|
||||
app.set('views', __dirname + '/fixtures');
|
||||
|
||||
app.use(function(req, res){
|
||||
res.locals.user = { name: 'tobi' };
|
||||
res.render('user.jade', function(err, html){
|
||||
res.render('user.tmpl', function (err, html) {
|
||||
html = html.replace('tobi', 'loki');
|
||||
res.end(html);
|
||||
});
|
||||
@ -301,12 +302,12 @@ describe('res', function(){
|
||||
|
||||
describe('when an error occurs', function(){
|
||||
it('should pass it to the callback', function(done){
|
||||
var app = express();
|
||||
var app = createApp();
|
||||
|
||||
app.set('views', __dirname + '/fixtures');
|
||||
|
||||
app.use(function(req, res){
|
||||
res.render('user.jade', function(err){
|
||||
res.render('user.tmpl', function (err) {
|
||||
res.end(err.message);
|
||||
});
|
||||
});
|
||||
@ -318,3 +319,11 @@ describe('res', function(){
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
function createApp() {
|
||||
var app = express();
|
||||
|
||||
app.engine('.tmpl', tmpl);
|
||||
|
||||
return app;
|
||||
}
|
||||
|
35
test/support/tmpl.js
Normal file
35
test/support/tmpl.js
Normal file
@ -0,0 +1,35 @@
|
||||
var fs = require('fs');
|
||||
|
||||
var variableRegExp = /\$([0-9a-zA-Z\.]+)/g;
|
||||
|
||||
module.exports = function renderFile(fileName, options, callback) {
|
||||
function onReadFile(err, str) {
|
||||
if (err) {
|
||||
callback(err);
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
str = str.replace(variableRegExp, generateVariableLookup(options));
|
||||
} catch (e) {
|
||||
err = e;
|
||||
}
|
||||
|
||||
callback(err, str);
|
||||
}
|
||||
|
||||
fs.readFile(fileName, 'utf8', onReadFile);
|
||||
};
|
||||
|
||||
function generateVariableLookup(data) {
|
||||
return function variableLookup(str, path) {
|
||||
var parts = path.split('.');
|
||||
var value = data;
|
||||
|
||||
for (var i = 0; i < parts.length; i++) {
|
||||
value = value[parts[i]];
|
||||
}
|
||||
|
||||
return value;
|
||||
};
|
||||
}
|
Loading…
Reference in New Issue
Block a user