From 6d9b1279899cbc1fbaa2b98a2ab118a2c3081778 Mon Sep 17 00:00:00 2001 From: Douglas Christopher Wilson Date: Wed, 1 Mar 2017 17:44:13 -0500 Subject: [PATCH 01/14] build: Node.js@7.6 --- .travis.yml | 2 +- appveyor.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 824e6b2a17..1230c7e2f9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,7 @@ node_js: - "4.8" - "5.12" - "6.10" - - "7.7" + - "7.6" matrix: include: - node_js: "8.0" diff --git a/appveyor.yml b/appveyor.yml index 1b399ce4ab..b4bb184dd8 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -8,7 +8,7 @@ environment: - nodejs_version: "4.8" - nodejs_version: "5.12" - nodejs_version: "6.10" - - nodejs_version: "7.7" + - nodejs_version: "7.6" cache: - node_modules install: From 4012846d2534addd8de0b0c237cd63ada104109a Mon Sep 17 00:00:00 2001 From: Jamie Barton Date: Sun, 26 Feb 2017 13:38:26 +0000 Subject: [PATCH 02/14] examples: use static assets in search example closes #3224 --- examples/search/index.js | 11 +---------- examples/search/{ => public}/client.js | 0 examples/search/public/index.html | 20 ++++++++++++++++++++ examples/search/search.jade | 15 --------------- 4 files changed, 21 insertions(+), 25 deletions(-) rename examples/search/{ => public}/client.js (100%) create mode 100644 examples/search/public/index.html delete mode 100644 examples/search/search.jade diff --git a/examples/search/index.js b/examples/search/index.js index d614ac2407..8027635f19 100644 --- a/examples/search/index.js +++ b/examples/search/index.js @@ -15,8 +15,7 @@ var db = redis.createClient(); var app = express(); -app.set('view engine', 'jade'); -app.set('views', __dirname); +app.use(express.static(__dirname + '/public')); // populate search @@ -26,14 +25,6 @@ db.sadd('ferret', 'jane'); db.sadd('cat', 'manny'); db.sadd('cat', 'luna'); -/** - * GET the search page. - */ - -app.get('/', function(req, res){ - res.render('search'); -}); - /** * GET search for :query. */ diff --git a/examples/search/client.js b/examples/search/public/client.js similarity index 100% rename from examples/search/client.js rename to examples/search/public/client.js diff --git a/examples/search/public/index.html b/examples/search/public/index.html new file mode 100644 index 0000000000..4a5540fdf3 --- /dev/null +++ b/examples/search/public/index.html @@ -0,0 +1,20 @@ + + + + + Search example + + + +

Search

+

Try searching for "ferret" or "cat".

+ +
+  
+
+
diff --git a/examples/search/search.jade b/examples/search/search.jade
deleted file mode 100644
index 37d77e434c..0000000000
--- a/examples/search/search.jade
+++ /dev/null
@@ -1,15 +0,0 @@
-doctype
-html
-  head
-    title Search example
-    style.
-      body {
-        font: 14px "Helvetica Neue", Helvetica;
-        padding: 50px;
-      }
-  body
-    h2 Search
-    p Try searching for "ferret" or "cat".
-    input(type='search')
-    pre
-    script(src='client.js')

From b4550fbe7a154d3fb9e935935e266a9eca9a4d69 Mon Sep 17 00:00:00 2001
From: Jamie Barton 
Date: Sun, 26 Feb 2017 13:12:35 +0000
Subject: [PATCH 03/14] Use ejs instead of jade within engine jsdoc

closes #3222
---
 lib/application.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lib/application.js b/lib/application.js
index 0fe0eb4402..21a81ee9ef 100644
--- a/lib/application.js
+++ b/lib/application.js
@@ -262,9 +262,9 @@ app.route = function route(path) {
  *
  * By default will `require()` the engine based on the
  * file extension. For example if you try to render
- * a "foo.jade" file Express will invoke the following internally:
+ * a "foo.ejs" file Express will invoke the following internally:
  *
- *     app.engine('jade', require('jade').__express);
+ *     app.engine('ejs', require('ejs').__express);
  *
  * For engines that do not provide `.__express` out of the box,
  * or if you wish to "map" a different extension to the template engine

From 7027b37764050c550366e808ea84fee1c58233ed Mon Sep 17 00:00:00 2001
From: Jianru Lin 
Date: Wed, 1 Mar 2017 10:38:13 +0800
Subject: [PATCH 04/14] lint: remove unused err argument

closes #3228
---
 lib/router/index.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/router/index.js b/lib/router/index.js
index 1f426068d7..51db4c28ff 100644
--- a/lib/router/index.js
+++ b/lib/router/index.js
@@ -626,7 +626,7 @@ function restore(fn, obj) {
     vals[i] = obj[props[i]];
   }
 
-  return function(err){
+  return function () {
     // restore vals
     for (var i = 0; i < props.length; i++) {
       obj[props[i]] = vals[i];

From dc8acc8676bed4aa4afa391ee312baa497d680e2 Mon Sep 17 00:00:00 2001
From: Douglas Christopher Wilson 
Date: Sun, 5 Mar 2017 00:04:47 -0500
Subject: [PATCH 05/14] tests: use supertest expect for simple assertions

---
 test/app.param.js         |  9 ++++-----
 test/app.router.js        |  4 ++--
 test/req.signedCookies.js |  6 +-----
 test/res.clearCookie.js   | 14 ++++----------
 test/res.cookie.js        | 28 ++++++++--------------------
 5 files changed, 19 insertions(+), 42 deletions(-)

diff --git a/test/app.param.js b/test/app.param.js
index 30885bcdc8..c7a375418c 100644
--- a/test/app.param.js
+++ b/test/app.param.js
@@ -29,8 +29,8 @@ describe('app', function(){
 
       request(app)
       .get('/user/tj')
-      .end(function(err, res){
-        res.text.should.equal('tj');
+      .expect(200, 'tj', function (err) {
+        if (err) return done(err)
         request(app)
         .get('/user/123')
         .expect(404, done);
@@ -69,9 +69,8 @@ describe('app', function(){
 
       request(app)
       .get('/user/123')
-      .end(function(err, res){
-        res.text.should.equal('123');
-
+      .expect(200, '123', function (err) {
+        if (err) return done(err)
         request(app)
         .get('/post/123')
         .expect('123', done);
diff --git a/test/app.router.js b/test/app.router.js
index e838b2e33f..95680f9139 100644
--- a/test/app.router.js
+++ b/test/app.router.js
@@ -539,8 +539,8 @@ describe('app.router', function(){
 
     request(app)
     .get('/user/10')
-    .end(function(err, res){
-      res.statusCode.should.equal(200);
+    .expect(200, function (err) {
+      if (err) return done(err)
       request(app)
       .get('/user/tj')
       .expect(404, done);
diff --git a/test/req.signedCookies.js b/test/req.signedCookies.js
index 111a0f77df..73880b01b4 100644
--- a/test/req.signedCookies.js
+++ b/test/req.signedCookies.js
@@ -28,11 +28,7 @@ describe('req', function(){
         request(app)
         .get('/')
         .set('Cookie', cookie)
-        .end(function(err, res){
-          if (err) return done(err);
-          res.body.should.eql({ obj: { foo: 'bar' } });
-          done();
-        });
+        .expect(200, { obj: { foo: 'bar' } }, done)
       });
     })
   })
diff --git a/test/res.clearCookie.js b/test/res.clearCookie.js
index 92c9d049f0..4822057e92 100644
--- a/test/res.clearCookie.js
+++ b/test/res.clearCookie.js
@@ -13,11 +13,8 @@ describe('res', function(){
 
       request(app)
       .get('/')
-      .end(function(err, res){
-        var val = 'sid=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT';
-        res.header['set-cookie'].should.eql([val]);
-        done();
-      })
+      .expect('Set-Cookie', 'sid=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT')
+      .expect(200, done)
     })
   })
 
@@ -31,11 +28,8 @@ describe('res', function(){
 
       request(app)
       .get('/')
-      .end(function(err, res){
-        var val = 'sid=; Path=/admin; Expires=Thu, 01 Jan 1970 00:00:00 GMT';
-        res.header['set-cookie'].should.eql([val]);
-        done();
-      })
+      .expect('Set-Cookie', 'sid=; Path=/admin; Expires=Thu, 01 Jan 1970 00:00:00 GMT')
+      .expect(200, done)
     })
   })
 })
diff --git a/test/res.cookie.js b/test/res.cookie.js
index 543af99dcd..4eeaaf094a 100644
--- a/test/res.cookie.js
+++ b/test/res.cookie.js
@@ -16,11 +16,8 @@ describe('res', function(){
 
       request(app)
       .get('/')
-      .end(function(err, res){
-        var val = ['user=' + encodeURIComponent('j:{"name":"tobi"}') + '; Path=/'];
-        res.headers['set-cookie'].should.eql(val);
-        done();
-      })
+      .expect('Set-Cookie', 'user=j%3A%7B%22name%22%3A%22tobi%22%7D; Path=/')
+      .expect(200, done)
     })
   })
 
@@ -34,11 +31,8 @@ describe('res', function(){
 
       request(app)
       .get('/')
-      .end(function(err, res){
-        var val = ['name=tobi; Path=/'];
-        res.headers['set-cookie'].should.eql(val);
-        done();
-      })
+      .expect('Set-Cookie', 'name=tobi; Path=/')
+      .expect(200, done)
     })
 
     it('should allow multiple calls', function(done){
@@ -72,11 +66,8 @@ describe('res', function(){
 
       request(app)
       .get('/')
-      .end(function(err, res){
-        var val = ['name=tobi; Path=/; HttpOnly; Secure'];
-        res.headers['set-cookie'].should.eql(val);
-        done();
-      })
+      .expect('Set-Cookie', 'name=tobi; Path=/; HttpOnly; Secure')
+      .expect(200, done)
     })
 
     describe('maxAge', function(){
@@ -178,11 +169,8 @@ describe('res', function(){
 
         request(app)
         .get('/')
-        .end(function(err, res){
-          var val = ['name=s%3Atobi.xJjV2iZ6EI7C8E5kzwbfA9PVLl1ZR07UTnuTgQQ4EnQ; Path=/'];
-          res.headers['set-cookie'].should.eql(val);
-          done();
-        })
+        .expect('Set-Cookie', 'name=s%3Atobi.xJjV2iZ6EI7C8E5kzwbfA9PVLl1ZR07UTnuTgQQ4EnQ; Path=/')
+        .expect(200, done)
       })
     })
   })

From c0089d971b9880b17c652bfde95cc4f36fd8aaf8 Mon Sep 17 00:00:00 2001
From: Douglas Christopher Wilson 
Date: Sun, 5 Mar 2017 00:06:59 -0500
Subject: [PATCH 06/14] deps: send@0.15.1

---
 History.md   | 7 +++++++
 package.json | 2 +-
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/History.md b/History.md
index 24f0c2e41f..aadd7ece04 100644
--- a/History.md
+++ b/History.md
@@ -1,3 +1,10 @@
+unreleased
+==========
+
+  * deps: send@0.15.1
+    - Fix issue when `Date.parse` does not return `NaN` on invalid date
+    - Fix strict violation in broken environments
+
 4.15.0 / 2017-03-01
 ===================
 
diff --git a/package.json b/package.json
index cc6f36633f..aea1a83bc1 100644
--- a/package.json
+++ b/package.json
@@ -48,7 +48,7 @@
     "proxy-addr": "~1.1.3",
     "qs": "6.3.1",
     "range-parser": "~1.2.0",
-    "send": "0.15.0",
+    "send": "0.15.1",
     "serve-static": "1.12.0",
     "setprototypeof": "1.0.3",
     "statuses": "~1.3.1",

From 67168fe231445a82dc1e8dde6a93ee9441be28c1 Mon Sep 17 00:00:00 2001
From: Douglas Christopher Wilson 
Date: Sun, 5 Mar 2017 00:08:16 -0500
Subject: [PATCH 07/14] deps: serve-static@1.12.1

fixes #3233
---
 History.md   | 3 +++
 package.json | 2 +-
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/History.md b/History.md
index aadd7ece04..e4de69bc48 100644
--- a/History.md
+++ b/History.md
@@ -4,6 +4,9 @@ unreleased
   * deps: send@0.15.1
     - Fix issue when `Date.parse` does not return `NaN` on invalid date
     - Fix strict violation in broken environments
+  * deps: serve-static@1.12.1
+    - Fix issue when `Date.parse` does not return `NaN` on invalid date
+    - deps: send@0.15.1
 
 4.15.0 / 2017-03-01
 ===================
diff --git a/package.json b/package.json
index aea1a83bc1..1b442295e0 100644
--- a/package.json
+++ b/package.json
@@ -49,7 +49,7 @@
     "qs": "6.3.1",
     "range-parser": "~1.2.0",
     "send": "0.15.1",
-    "serve-static": "1.12.0",
+    "serve-static": "1.12.1",
     "setprototypeof": "1.0.3",
     "statuses": "~1.3.1",
     "type-is": "~1.6.14",

From 8eb95ae57973b2cbe7778bc2e10450a380ca2efe Mon Sep 17 00:00:00 2001
From: chainhelen 
Date: Mon, 6 Mar 2017 02:44:22 +0800
Subject: [PATCH 08/14] examples: use path.join instead of concatenation

closes #3236
---
 examples/auth/index.js             |  3 ++-
 examples/downloads/index.js        |  6 ++---
 examples/ejs/index.js              |  3 ++-
 examples/error-pages/index.js      |  3 ++-
 examples/jade/index.js             |  5 +++--
 examples/markdown/index.js         |  3 ++-
 examples/mvc/index.js              |  5 +++--
 examples/mvc/lib/boot.js           | 35 ++++++++++++++++--------------
 examples/route-separation/index.js |  5 +++--
 examples/search/index.js           |  5 +++--
 10 files changed, 42 insertions(+), 31 deletions(-)

diff --git a/examples/auth/index.js b/examples/auth/index.js
index 1c3ca21751..084fba79a9 100644
--- a/examples/auth/index.js
+++ b/examples/auth/index.js
@@ -5,6 +5,7 @@
 var express = require('../..');
 var bodyParser = require('body-parser');
 var hash = require('pbkdf2-password')()
+var path = require('path');
 var session = require('express-session');
 
 var app = module.exports = express();
@@ -12,7 +13,7 @@ var app = module.exports = express();
 // config
 
 app.set('view engine', 'ejs');
-app.set('views', __dirname + '/views');
+app.set('views', path.join(__dirname, 'views'));
 
 // middleware
 
diff --git a/examples/downloads/index.js b/examples/downloads/index.js
index 6ab6ba0213..e6f3fa9db6 100644
--- a/examples/downloads/index.js
+++ b/examples/downloads/index.js
@@ -3,6 +3,7 @@
  */
 
 var express = require('../../');
+var path = require('path');
 var app = module.exports = express();
 
 app.get('/', function(req, res){
@@ -16,10 +17,9 @@ app.get('/', function(req, res){
 // /files/* is accessed via req.params[0]
 // but here we name it :file
 app.get('/files/:file(*)', function(req, res, next){
-  var file = req.params.file;
-  var path = __dirname + '/files/' + file;
+  var filePath = path.join(__dirname, 'files', req.params.file);
 
-  res.download(path, function(err){
+  res.download(filePath, function (err) {
     if (!err) return; // file sent
     if (err && err.status !== 404) return next(err); // non-404 error
     // file for download not found
diff --git a/examples/ejs/index.js b/examples/ejs/index.js
index bf78a9cc80..13a80efc19 100644
--- a/examples/ejs/index.js
+++ b/examples/ejs/index.js
@@ -3,6 +3,7 @@
  */
 
 var express = require('../../');
+var path = require('path');
 
 var app = module.exports = express();
 
@@ -21,7 +22,7 @@ app.engine('.html', require('ejs').__express);
 
 // Optional since express defaults to CWD/views
 
-app.set('views', __dirname + '/views');
+app.set('views', path.join(__dirname, 'views'));
 
 // Without this you would need to
 // supply the extension to res.render()
diff --git a/examples/error-pages/index.js b/examples/error-pages/index.js
index d1219689f2..790f6e30df 100644
--- a/examples/error-pages/index.js
+++ b/examples/error-pages/index.js
@@ -3,12 +3,13 @@
  */
 
 var express = require('../../');
+var path = require('path');
 var app = module.exports = express();
 var logger = require('morgan');
 var silent = 'test' == process.env.NODE_ENV;
 
 // general config
-app.set('views', __dirname + '/views');
+app.set('views', path.join(__dirname, 'views'));
 app.set('view engine', 'ejs');
 
 // our custom "verbose errors" setting
diff --git a/examples/jade/index.js b/examples/jade/index.js
index 738b382d26..86ca14c426 100644
--- a/examples/jade/index.js
+++ b/examples/jade/index.js
@@ -3,10 +3,11 @@
  */
 
 var express = require('../../lib/express');
+var path = require('path');
 
 // Path to our public directory
 
-var pub = __dirname + '/public';
+var pub = path.join(__dirname, 'public');
 
 // setup middleware
 
@@ -15,7 +16,7 @@ app.use(express.static(pub));
 
 // Optional since express defaults to CWD/views
 
-app.set('views', __dirname + '/views');
+app.set('views', path.join(__dirname, 'views'));
 
 // Set our default template engine to "jade"
 // which prevents the need for extensions
diff --git a/examples/markdown/index.js b/examples/markdown/index.js
index 430628701f..df8c195fb4 100644
--- a/examples/markdown/index.js
+++ b/examples/markdown/index.js
@@ -6,6 +6,7 @@ var escapeHtml = require('escape-html');
 var express = require('../..');
 var fs = require('fs');
 var marked = require('marked');
+var path = require('path');
 
 var app = module.exports = express();
 
@@ -21,7 +22,7 @@ app.engine('md', function(path, options, fn){
   });
 });
 
-app.set('views', __dirname + '/views');
+app.set('views', path.join(__dirname, 'views'));
 
 // make it the default so we dont need .md
 app.set('view engine', 'md');
diff --git a/examples/mvc/index.js b/examples/mvc/index.js
index bf7f726e30..c5e2678697 100644
--- a/examples/mvc/index.js
+++ b/examples/mvc/index.js
@@ -4,6 +4,7 @@
 
 var express = require('../..');
 var logger = require('morgan');
+var path = require('path');
 var session = require('express-session');
 var bodyParser = require('body-parser');
 var methodOverride = require('method-override');
@@ -17,7 +18,7 @@ var app = module.exports = express();
 app.set('view engine', 'jade');
 
 // set views for error and 404 pages
-app.set('views', __dirname + '/views');
+app.set('views', path.join(__dirname, 'views'));
 
 // define a custom res.message() method
 // which stores messages in the session
@@ -34,7 +35,7 @@ app.response.message = function(msg){
 if (!module.parent) app.use(logger('dev'));
 
 // serve static files
-app.use(express.static(__dirname + '/public'));
+app.use(express.static(path.join(__dirname, 'public')));
 
 // session support
 app.use(session({
diff --git a/examples/mvc/lib/boot.js b/examples/mvc/lib/boot.js
index a0ca6ec37b..422330dc06 100644
--- a/examples/mvc/lib/boot.js
+++ b/examples/mvc/lib/boot.js
@@ -4,23 +4,26 @@
 
 var express = require('../../..');
 var fs = require('fs');
+var path = require('path');
 
 module.exports = function(parent, options){
+  var dir = path.join(__dirname, '..', 'controllers');
   var verbose = options.verbose;
-  fs.readdirSync(__dirname + '/../controllers').forEach(function(name){
-    if (!fs.statSync(__dirname + '/../controllers/' + name).isDirectory()) return;
+  fs.readdirSync(dir).forEach(function(name){
+    var file = path.join(dir, name)
+    if (!fs.statSync(file).isDirectory()) return;
     verbose && console.log('\n   %s:', name);
-    var obj = require('./../controllers/' + name);
+    var obj = require(file);
     var name = obj.name || name;
     var prefix = obj.prefix || '';
     var app = express();
     var handler;
     var method;
-    var path;
+    var url;
 
     // allow specifying the view engine
     if (obj.engine) app.set('view engine', obj.engine);
-    app.set('views', __dirname + '/../controllers/' + name + '/views');
+    app.set('views', path.join(__dirname, '..', 'controllers', name, 'views'));
 
     // generate routes based
     // on the exported methods
@@ -31,27 +34,27 @@ module.exports = function(parent, options){
       switch (key) {
         case 'show':
           method = 'get';
-          path = '/' + name + '/:' + name + '_id';
+          url = '/' + name + '/:' + name + '_id';
           break;
         case 'list':
           method = 'get';
-          path = '/' + name + 's';
+          url = '/' + name + 's';
           break;
         case 'edit':
           method = 'get';
-          path = '/' + name + '/:' + name + '_id/edit';
+          url = '/' + name + '/:' + name + '_id/edit';
           break;
         case 'update':
           method = 'put';
-          path = '/' + name + '/:' + name + '_id';
+          url = '/' + name + '/:' + name + '_id';
           break;
         case 'create':
           method = 'post';
-          path = '/' + name;
+          url = '/' + name;
           break;
         case 'index':
           method = 'get';
-          path = '/';
+          url = '/';
           break;
         default:
           /* istanbul ignore next */
@@ -60,15 +63,15 @@ module.exports = function(parent, options){
 
       // setup
       handler = obj[key];
-      path = prefix + path;
+      url = prefix + url;
 
       // before middleware support
       if (obj.before) {
-        app[method](path, obj.before, handler);
-        verbose && console.log('     %s %s -> before -> %s', method.toUpperCase(), path, key);
+        app[method](url, obj.before, handler);
+        verbose && console.log('     %s %s -> before -> %s', method.toUpperCase(), url, key);
       } else {
-        app[method](path, handler);
-        verbose && console.log('     %s %s -> %s', method.toUpperCase(), path, key);
+        app[method](url, handler);
+        verbose && console.log('     %s %s -> %s', method.toUpperCase(), url, key);
       }
     }
 
diff --git a/examples/route-separation/index.js b/examples/route-separation/index.js
index 3d93d5cfd9..c6605ada6c 100644
--- a/examples/route-separation/index.js
+++ b/examples/route-separation/index.js
@@ -3,6 +3,7 @@
  */
 
 var express = require('../..');
+var path = require('path');
 var app = express();
 var logger = require('morgan');
 var cookieParser = require('cookie-parser');
@@ -17,7 +18,7 @@ module.exports = app;
 // Config
 
 app.set('view engine', 'jade');
-app.set('views', __dirname + '/views');
+app.set('views', path.join(__dirname, 'views'));
 
 /* istanbul ignore next */
 if (!module.parent) {
@@ -27,7 +28,7 @@ if (!module.parent) {
 app.use(methodOverride('_method'));
 app.use(cookieParser());
 app.use(bodyParser.urlencoded({ extended: true }));
-app.use(express.static(__dirname + '/public'));
+app.use(express.static(path.join(__dirname, 'public')));
 
 // General
 
diff --git a/examples/search/index.js b/examples/search/index.js
index 8027635f19..79f5d9f4d3 100644
--- a/examples/search/index.js
+++ b/examples/search/index.js
@@ -7,6 +7,7 @@
  */
 
 var express = require('../..');
+var path = require('path');
 var redis = require('redis');
 
 var db = redis.createClient();
@@ -15,7 +16,7 @@ var db = redis.createClient();
 
 var app = express();
 
-app.use(express.static(__dirname + '/public'));
+app.use(express.static(path.join(__dirname, 'public')));
 
 // populate search
 
@@ -45,7 +46,7 @@ app.get('/search/:query?', function(req, res){
  */
 
 app.get('/client.js', function(req, res){
-  res.sendFile(__dirname + '/client.js');
+  res.sendFile(path.join(__dirname, 'client.js'));
 });
 
 /* istanbul ignore next */

From eece3850bc5206c28bfac78c986fbe0c193b34b8 Mon Sep 17 00:00:00 2001
From: chainhelen 
Date: Mon, 6 Mar 2017 02:44:22 +0800
Subject: [PATCH 09/14] tests: use path.join instead of concatenation

closes #3236
---
 test/app.engine.js   |  9 +++++----
 test/app.render.js   | 47 ++++++++++++++++++++++++++++----------------
 test/res.render.js   | 47 +++++++++++++++++++++++++-------------------
 test/res.sendFile.js |  4 ++--
 4 files changed, 64 insertions(+), 43 deletions(-)

diff --git a/test/app.engine.js b/test/app.engine.js
index 88311b2f6d..6d1ee1cacb 100644
--- a/test/app.engine.js
+++ b/test/app.engine.js
@@ -1,6 +1,7 @@
 
 var express = require('../')
   , fs = require('fs');
+var path = require('path')
 
 function render(path, options, fn) {
   fs.readFile(path, 'utf8', function(err, str){
@@ -15,7 +16,7 @@ describe('app', function(){
     it('should map a template engine', function(done){
       var app = express();
 
-      app.set('views', __dirname + '/fixtures');
+      app.set('views', path.join(__dirname, 'fixtures'))
       app.engine('.html', render);
       app.locals.user = { name: 'tobi' };
 
@@ -36,7 +37,7 @@ describe('app', function(){
     it('should work without leading "."', function(done){
       var app = express();
 
-      app.set('views', __dirname + '/fixtures');
+      app.set('views', path.join(__dirname, 'fixtures'))
       app.engine('html', render);
       app.locals.user = { name: 'tobi' };
 
@@ -50,7 +51,7 @@ describe('app', function(){
     it('should work "view engine" setting', function(done){
       var app = express();
 
-      app.set('views', __dirname + '/fixtures');
+      app.set('views', path.join(__dirname, 'fixtures'))
       app.engine('html', render);
       app.set('view engine', 'html');
       app.locals.user = { name: 'tobi' };
@@ -65,7 +66,7 @@ describe('app', function(){
     it('should work "view engine" with leading "."', function(done){
       var app = express();
 
-      app.set('views', __dirname + '/fixtures');
+      app.set('views', path.join(__dirname, 'fixtures'))
       app.engine('.html', render);
       app.set('view engine', '.html');
       app.locals.user = { name: 'tobi' };
diff --git a/test/app.render.js b/test/app.render.js
index c9737b7a06..729b1c97cc 100644
--- a/test/app.render.js
+++ b/test/app.render.js
@@ -1,5 +1,7 @@
 
+var assert = require('assert')
 var express = require('..');
+var path = require('path')
 var tmpl = require('./support/tmpl');
 
 describe('app', function(){
@@ -9,7 +11,7 @@ describe('app', function(){
 
       app.locals.user = { name: 'tobi' };
 
-      app.render(__dirname + '/fixtures/user.tmpl', function (err, str) {
+      app.render(path.join(__dirname, 'fixtures', 'user.tmpl'), function (err, str) {
         if (err) return done(err);
         str.should.equal('

tobi

'); done(); @@ -22,7 +24,7 @@ describe('app', function(){ app.set('view engine', 'tmpl'); app.locals.user = { name: 'tobi' }; - app.render(__dirname + '/fixtures/user', function(err, str){ + app.render(path.join(__dirname, 'fixtures', 'user'), function (err, str) { if (err) return done(err); str.should.equal('

tobi

'); done(); @@ -32,7 +34,7 @@ describe('app', function(){ it('should expose app.locals', function(done){ var app = createApp(); - app.set('views', __dirname + '/fixtures'); + app.set('views', path.join(__dirname, 'fixtures')) app.locals.user = { name: 'tobi' }; app.render('user.tmpl', function (err, str) { @@ -45,7 +47,7 @@ describe('app', function(){ it('should support index.', function(done){ var app = createApp(); - app.set('views', __dirname + '/fixtures'); + app.set('views', path.join(__dirname, 'fixtures')) app.set('view engine', 'tmpl'); app.render('blog/post', function (err, str) { @@ -80,9 +82,10 @@ describe('app', function(){ it('should provide a helpful error', function(done){ var app = createApp(); - app.set('views', __dirname + '/fixtures'); + app.set('views', path.join(__dirname, 'fixtures')) app.render('rawr.tmpl', function (err) { - err.message.should.equal('Failed to lookup view "rawr.tmpl" in views directory "' + __dirname + '/fixtures"'); + assert.ok(err) + assert.equal(err.message, 'Failed to lookup view "rawr.tmpl" in views directory "' + path.join(__dirname, 'fixtures') + '"') done(); }); }) @@ -92,7 +95,7 @@ describe('app', function(){ it('should invoke the callback', function(done){ var app = createApp(); - app.set('views', __dirname + '/fixtures'); + app.set('views', path.join(__dirname, 'fixtures')) app.render('user.tmpl', function (err, str) { // nextTick to prevent cyclic @@ -108,7 +111,7 @@ describe('app', function(){ it('should render the template', function(done){ var app = createApp(); - app.set('views', __dirname + '/fixtures'); + app.set('views', path.join(__dirname, 'fixtures')) app.render('email.tmpl', function (err, str) { if (err) return done(err); @@ -123,7 +126,7 @@ describe('app', function(){ var app = createApp(); app.set('view engine', 'tmpl'); - app.set('views', __dirname + '/fixtures'); + app.set('views', path.join(__dirname, 'fixtures')) app.render('email', function(err, str){ if (err) return done(err); @@ -137,7 +140,7 @@ describe('app', function(){ it('should lookup the file in the path', function(done){ var app = createApp(); - app.set('views', __dirname + '/fixtures/default_layout'); + app.set('views', path.join(__dirname, 'fixtures', 'default_layout')) app.locals.user = { name: 'tobi' }; app.render('user.tmpl', function (err, str) { @@ -150,7 +153,10 @@ describe('app', function(){ describe('when array of paths', function(){ it('should lookup the file in the path', function(done){ var app = createApp(); - var views = [__dirname + '/fixtures/local_layout', __dirname + '/fixtures/default_layout']; + var views = [ + path.join(__dirname, 'fixtures', 'local_layout'), + path.join(__dirname, 'fixtures', 'default_layout') + ] app.set('views', views); app.locals.user = { name: 'tobi' }; @@ -164,7 +170,10 @@ describe('app', function(){ it('should lookup in later paths until found', function(done){ var app = createApp(); - var views = [__dirname + '/fixtures/local_layout', __dirname + '/fixtures/default_layout']; + var views = [ + path.join(__dirname, 'fixtures', 'local_layout'), + path.join(__dirname, 'fixtures', 'default_layout') + ] app.set('views', views); app.locals.name = 'tobi'; @@ -178,13 +187,17 @@ describe('app', function(){ it('should error if file does not exist', function(done){ var app = createApp(); - var views = [__dirname + '/fixtures/local_layout', __dirname + '/fixtures/default_layout']; + var views = [ + path.join(__dirname, 'fixtures', 'local_layout'), + path.join(__dirname, 'fixtures', 'default_layout') + ] app.set('views', views); app.locals.name = 'tobi'; 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"'); + assert.ok(err) + assert.equal(err.message, 'Failed to lookup view "pet.tmpl" in views directories "' + views[0] + '" or "' + views[1] + '"') done(); }) }) @@ -281,7 +294,7 @@ describe('app', function(){ it('should render the template', function(done){ var app = createApp(); - app.set('views', __dirname + '/fixtures'); + app.set('views', path.join(__dirname, 'fixtures')) var user = { name: 'tobi' }; @@ -295,7 +308,7 @@ describe('app', function(){ it('should expose app.locals', function(done){ var app = createApp(); - app.set('views', __dirname + '/fixtures'); + app.set('views', path.join(__dirname, 'fixtures')) app.locals.user = { name: 'tobi' }; app.render('user.tmpl', {}, function (err, str) { @@ -308,7 +321,7 @@ describe('app', function(){ it('should give precedence to app.render() locals', function(done){ var app = createApp(); - app.set('views', __dirname + '/fixtures'); + app.set('views', path.join(__dirname, 'fixtures')) app.locals.user = { name: 'tobi' }; var jane = { name: 'jane' }; diff --git a/test/res.render.js b/test/res.render.js index d4d2a7616d..2e3a16f137 100644 --- a/test/res.render.js +++ b/test/res.render.js @@ -1,5 +1,6 @@ var express = require('..'); +var path = require('path') var request = require('supertest'); var tmpl = require('./support/tmpl'); @@ -11,7 +12,7 @@ describe('res', function(){ app.locals.user = { name: 'tobi' }; app.use(function(req, res){ - res.render(__dirname + '/fixtures/user.tmpl'); + res.render(path.join(__dirname, 'fixtures', 'user.tmpl')) }); request(app) @@ -26,7 +27,7 @@ describe('res', function(){ app.set('view engine', 'tmpl'); app.use(function(req, res){ - res.render(__dirname + '/fixtures/user'); + res.render(path.join(__dirname, 'fixtures', 'user')) }); request(app) @@ -40,7 +41,7 @@ describe('res', function(){ app.locals.user = { name: 'tobi' }; app.use(function(req, res){ - res.render(__dirname + '/fixtures/user'); + res.render(path.join(__dirname, 'fixtures', 'user')) }); request(app) @@ -51,7 +52,7 @@ describe('res', function(){ it('should expose app.locals', function(done){ var app = createApp(); - app.set('views', __dirname + '/fixtures'); + app.set('views', path.join(__dirname, 'fixtures')) app.locals.user = { name: 'tobi' }; app.use(function(req, res){ @@ -66,7 +67,7 @@ describe('res', function(){ it('should expose app.locals with `name` property', function(done){ var app = createApp(); - app.set('views', __dirname + '/fixtures'); + app.set('views', path.join(__dirname, 'fixtures')) app.locals.name = 'tobi'; app.use(function(req, res){ @@ -81,7 +82,7 @@ describe('res', function(){ it('should support index.', function(done){ var app = createApp(); - app.set('views', __dirname + '/fixtures'); + app.set('views', path.join(__dirname, 'fixtures')) app.set('view engine', 'tmpl'); app.use(function(req, res){ @@ -97,7 +98,7 @@ describe('res', function(){ it('should next(err)', function(done){ var app = createApp(); - app.set('views', __dirname + '/fixtures'); + app.set('views', path.join(__dirname, 'fixtures')) app.use(function(req, res){ res.render('user.tmpl'); @@ -118,7 +119,7 @@ describe('res', function(){ var app = createApp(); app.set('view engine', 'tmpl'); - app.set('views', __dirname + '/fixtures'); + app.set('views', path.join(__dirname, 'fixtures')) app.use(function(req, res){ res.render('email'); @@ -134,7 +135,7 @@ describe('res', function(){ it('should lookup the file in the path', function(done){ var app = createApp(); - app.set('views', __dirname + '/fixtures/default_layout'); + app.set('views', path.join(__dirname, 'fixtures', 'default_layout')) app.use(function(req, res){ res.render('user.tmpl', { user: { name: 'tobi' } }); @@ -148,7 +149,10 @@ describe('res', function(){ describe('when array of paths', function(){ it('should lookup the file in the path', function(done){ var app = createApp(); - var views = [__dirname + '/fixtures/local_layout', __dirname + '/fixtures/default_layout']; + var views = [ + path.join(__dirname, 'fixtures', 'local_layout'), + path.join(__dirname, 'fixtures', 'default_layout') + ] app.set('views', views); @@ -163,7 +167,10 @@ describe('res', function(){ it('should lookup in later paths until found', function(done){ var app = createApp(); - var views = [__dirname + '/fixtures/local_layout', __dirname + '/fixtures/default_layout']; + var views = [ + path.join(__dirname, 'fixtures', 'local_layout'), + path.join(__dirname, 'fixtures', 'default_layout') + ] app.set('views', views); @@ -183,7 +190,7 @@ describe('res', function(){ it('should render the template', function(done){ var app = createApp(); - app.set('views', __dirname + '/fixtures'); + app.set('views', path.join(__dirname, 'fixtures')) var user = { name: 'tobi' }; @@ -199,7 +206,7 @@ describe('res', function(){ it('should expose app.locals', function(done){ var app = createApp(); - app.set('views', __dirname + '/fixtures'); + app.set('views', path.join(__dirname, 'fixtures')) app.locals.user = { name: 'tobi' }; app.use(function(req, res){ @@ -214,7 +221,7 @@ describe('res', function(){ it('should expose res.locals', function(done){ var app = createApp(); - app.set('views', __dirname + '/fixtures'); + app.set('views', path.join(__dirname, 'fixtures')) app.use(function(req, res){ res.locals.user = { name: 'tobi' }; @@ -229,7 +236,7 @@ describe('res', function(){ it('should give precedence to res.locals over app.locals', function(done){ var app = createApp(); - app.set('views', __dirname + '/fixtures'); + app.set('views', path.join(__dirname, 'fixtures')) app.locals.user = { name: 'tobi' }; app.use(function(req, res){ @@ -245,7 +252,7 @@ describe('res', function(){ it('should give precedence to res.render() locals over res.locals', function(done){ var app = createApp(); - app.set('views', __dirname + '/fixtures'); + app.set('views', path.join(__dirname, 'fixtures')) var jane = { name: 'jane' }; app.use(function(req, res){ @@ -261,7 +268,7 @@ describe('res', function(){ it('should give precedence to res.render() locals over app.locals', function(done){ var app = createApp(); - app.set('views', __dirname + '/fixtures'); + app.set('views', path.join(__dirname, 'fixtures')) app.locals.user = { name: 'tobi' }; var jane = { name: 'jane' }; @@ -279,7 +286,7 @@ describe('res', function(){ it('should pass the resulting string', function(done){ var app = createApp(); - app.set('views', __dirname + '/fixtures'); + app.set('views', path.join(__dirname, 'fixtures')) app.use(function(req, res){ var tobi = { name: 'tobi' }; @@ -299,7 +306,7 @@ describe('res', function(){ it('should pass the resulting string', function(done){ var app = createApp(); - app.set('views', __dirname + '/fixtures'); + app.set('views', path.join(__dirname, 'fixtures')) app.use(function(req, res){ res.locals.user = { name: 'tobi' }; @@ -318,7 +325,7 @@ describe('res', function(){ it('should pass it to the callback', function(done){ var app = createApp(); - app.set('views', __dirname + '/fixtures'); + app.set('views', path.join(__dirname, 'fixtures')) app.use(function(req, res){ res.render('user.tmpl', function (err) { diff --git a/test/res.sendFile.js b/test/res.sendFile.js index 927d31991f..be3a23ebc2 100644 --- a/test/res.sendFile.js +++ b/test/res.sendFile.js @@ -613,7 +613,7 @@ describe('res', function(){ var app = express(); app.use(function(req, res){ - res.sendfile(__dirname + '/fixtures/user.html'); + res.sendfile(path.join(__dirname, '/fixtures/user.html')) }); request(app) @@ -718,7 +718,7 @@ describe('res', function(){ , calls = 0; app.use(function(req, res){ - res.sendfile(__dirname + '/fixtures/name.txt'); + res.sendfile(path.join(__dirname, '/fixtures/name.txt')) }); request(app) From 57d3dfd9f828c4529fa90dde4b3d216898181e99 Mon Sep 17 00:00:00 2001 From: Jamie Barton Date: Sun, 26 Feb 2017 13:26:39 +0000 Subject: [PATCH 10/14] examples: merge the jade example into ejs closes #3223 --- examples/ejs/index.js | 4 ++ .../public/stylesheets/style.css | 0 examples/ejs/views/header.html | 9 +--- examples/jade/index.js | 52 ------------------- examples/jade/views/header.jade | 3 -- examples/jade/views/layout.jade | 5 -- examples/jade/views/users/index.jade | 8 --- examples/jade/views/users/user.jade | 3 -- 8 files changed, 6 insertions(+), 78 deletions(-) rename examples/{jade => ejs}/public/stylesheets/style.css (100%) delete mode 100644 examples/jade/index.js delete mode 100644 examples/jade/views/header.jade delete mode 100644 examples/jade/views/layout.jade delete mode 100644 examples/jade/views/users/index.jade delete mode 100644 examples/jade/views/users/user.jade diff --git a/examples/ejs/index.js b/examples/ejs/index.js index 13a80efc19..b868bdd7cb 100644 --- a/examples/ejs/index.js +++ b/examples/ejs/index.js @@ -24,6 +24,10 @@ app.engine('.html', require('ejs').__express); app.set('views', path.join(__dirname, 'views')); +// Path to our public directory + +app.use(express.static(path.join(__dirname + 'public'))); + // Without this you would need to // supply the extension to res.render() // ex: res.render('users.html'). diff --git a/examples/jade/public/stylesheets/style.css b/examples/ejs/public/stylesheets/style.css similarity index 100% rename from examples/jade/public/stylesheets/style.css rename to examples/ejs/public/stylesheets/style.css diff --git a/examples/ejs/views/header.html b/examples/ejs/views/header.html index 8dbeb8d3c0..4396bc444f 100644 --- a/examples/ejs/views/header.html +++ b/examples/ejs/views/header.html @@ -2,12 +2,7 @@ - <%= title %> - + <%= title %> + diff --git a/examples/jade/index.js b/examples/jade/index.js deleted file mode 100644 index 86ca14c426..0000000000 --- a/examples/jade/index.js +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Module dependencies. - */ - -var express = require('../../lib/express'); -var path = require('path'); - -// Path to our public directory - -var pub = path.join(__dirname, 'public'); - -// setup middleware - -var app = express(); -app.use(express.static(pub)); - -// Optional since express defaults to CWD/views - -app.set('views', path.join(__dirname, 'views')); - -// Set our default template engine to "jade" -// which prevents the need for extensions -// (although you can still mix and match) -app.set('view engine', 'jade'); - -function User(name, email) { - this.name = name; - this.email = email; -} - -// Dummy users -var users = [ - new User('tj', 'tj@vision-media.ca') - , new User('ciaran', 'ciaranj@gmail.com') - , new User('aaron', 'aaron.heckmann+github@gmail.com') -]; - -app.get('/', function(req, res){ - res.render('users', { users: users }); -}); - -// change this to a better error handler in your code -// sending stacktrace to users in production is not good -app.use(function(err, req, res, next) { - res.send(err.stack); -}); - -/* istanbul ignore next */ -if (!module.parent) { - app.listen(3000); - console.log('Express started on port 3000'); -} diff --git a/examples/jade/views/header.jade b/examples/jade/views/header.jade deleted file mode 100644 index 6c42929d83..0000000000 --- a/examples/jade/views/header.jade +++ /dev/null @@ -1,3 +0,0 @@ -head - title Jade Example - link(rel="stylesheet", href="/stylesheets/style.css") \ No newline at end of file diff --git a/examples/jade/views/layout.jade b/examples/jade/views/layout.jade deleted file mode 100644 index 300cdc7847..0000000000 --- a/examples/jade/views/layout.jade +++ /dev/null @@ -1,5 +0,0 @@ -doctype html -html - include header - body - block content diff --git a/examples/jade/views/users/index.jade b/examples/jade/views/users/index.jade deleted file mode 100644 index feb7623fa3..0000000000 --- a/examples/jade/views/users/index.jade +++ /dev/null @@ -1,8 +0,0 @@ - -extends ../layout - -block content - h1 Users - #users - for user in users - include user \ No newline at end of file diff --git a/examples/jade/views/users/user.jade b/examples/jade/views/users/user.jade deleted file mode 100644 index 9e603298cb..0000000000 --- a/examples/jade/views/users/user.jade +++ /dev/null @@ -1,3 +0,0 @@ -.user - h2= user.name - .email= user.email \ No newline at end of file From d32ed68b2995e0322100ace29d86e7a86b9c6378 Mon Sep 17 00:00:00 2001 From: Douglas Christopher Wilson Date: Sun, 5 Mar 2017 23:19:32 -0500 Subject: [PATCH 11/14] 4.15.1 --- History.md | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/History.md b/History.md index e4de69bc48..82511c3f40 100644 --- a/History.md +++ b/History.md @@ -1,5 +1,5 @@ -unreleased -========== +4.15.1 / 2017-03-05 +=================== * deps: send@0.15.1 - Fix issue when `Date.parse` does not return `NaN` on invalid date diff --git a/package.json b/package.json index 1b442295e0..727064b665 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "express", "description": "Fast, unopinionated, minimalist web framework", - "version": "4.15.0", + "version": "4.15.1", "author": "TJ Holowaychuk ", "contributors": [ "Aaron Heckmann ", From 85c96fd64edad8ce076bb82c065ef0c9fea6c559 Mon Sep 17 00:00:00 2001 From: Douglas Christopher Wilson Date: Mon, 6 Mar 2017 08:32:13 -0500 Subject: [PATCH 12/14] deps: qs@6.4.0 --- History.md | 6 ++++++ package.json | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/History.md b/History.md index 82511c3f40..dd529f1632 100644 --- a/History.md +++ b/History.md @@ -1,3 +1,9 @@ +unreleased +========== + + * deps: qs@6.4.0 + - Fix regression parsing keys starting with `[` + 4.15.1 / 2017-03-05 =================== diff --git a/package.json b/package.json index 727064b665..05a9ce56d9 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "parseurl": "~1.3.1", "path-to-regexp": "0.1.7", "proxy-addr": "~1.1.3", - "qs": "6.3.1", + "qs": "6.4.0", "range-parser": "~1.2.0", "send": "0.15.1", "serve-static": "1.12.1", From 05fd1e444198954c1e275d485bccabafed052868 Mon Sep 17 00:00:00 2001 From: Douglas Christopher Wilson Date: Mon, 6 Mar 2017 08:33:37 -0500 Subject: [PATCH 13/14] deps: update example dependencies --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 05a9ce56d9..7894722c4d 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ }, "devDependencies": { "after": "0.8.2", - "body-parser": "1.17.0", + "body-parser": "1.17.1", "cookie-parser": "~1.4.3", "ejs": "2.5.6", "express-session": "1.15.1", From d43b074f0b3b56a91f240e62798c932ba104b79a Mon Sep 17 00:00:00 2001 From: Douglas Christopher Wilson Date: Mon, 6 Mar 2017 08:34:38 -0500 Subject: [PATCH 14/14] 4.15.2 --- History.md | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/History.md b/History.md index dd529f1632..5bfd5690a5 100644 --- a/History.md +++ b/History.md @@ -1,5 +1,5 @@ -unreleased -========== +4.15.2 / 2017-03-06 +=================== * deps: qs@6.4.0 - Fix regression parsing keys starting with `[` diff --git a/package.json b/package.json index 7894722c4d..ef49b40d42 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "express", "description": "Fast, unopinionated, minimalist web framework", - "version": "4.15.1", + "version": "4.15.2", "author": "TJ Holowaychuk ", "contributors": [ "Aaron Heckmann ",