express-hbs 2.4.2 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,8 @@
1
1
  var request = require('supertest');
2
2
  var assert = require('assert');
3
+ var path = require('path');
3
4
  var hbs = require('..');
4
5
 
5
-
6
6
  function stripWs(s) {
7
7
  return s.replace(/\s+/g, '');
8
8
  }
@@ -12,7 +12,7 @@ function createLocals(which, viewsDir, locals) {
12
12
  var opts = {};
13
13
  if (which === 'express3') {
14
14
  opts.settings = {
15
- views: viewsDir
15
+ views: viewsDir,
16
16
  };
17
17
  opts.cache = process.env.NODE_ENV === 'production';
18
18
  opts.settings.views = viewsDir;
@@ -24,77 +24,93 @@ function createLocals(which, viewsDir, locals) {
24
24
  return opts;
25
25
  }
26
26
 
27
- describe('layouts', function() {
27
+ describe('layouts', function () {
28
28
  var app;
29
29
 
30
- beforeEach(function() {
30
+ beforeEach(function () {
31
31
  var example = require('../example/app');
32
32
  app = example.create(hbs.create());
33
33
  });
34
34
 
35
-
36
- describe('layoutsDir', function() {
35
+ describe('layoutsDir', function () {
37
36
  var app;
38
37
 
39
- beforeEach(function() {
38
+ beforeEach(function () {
40
39
  app = require('../example/app-layoutsDir');
41
40
  });
42
41
 
43
- it('should render layout declared in markup', function(done) {
42
+ it('should render layout declared in markup', function (done) {
44
43
  request(app)
45
44
  .get('/fruits')
46
45
  .expect(/DECLARATIVE LAYOUT/, done);
47
46
  });
48
47
 
49
- it('should allow specifying layout in locals without dir', function(done) {
48
+ it('should allow specifying layout in locals without dir', function (done) {
50
49
  request(app)
51
50
  .get('/veggies')
52
51
  .expect(/PROGRAMMATIC LAYOUT/, done);
53
52
  });
54
53
 
55
- it('should still allow specifying layout in locals with dir', function(done) {
54
+ it('should still allow specifying layout in locals with dir', function (done) {
56
55
  request(app)
57
56
  .get('/veggies/explicit-dir')
58
57
  .expect(/PROGRAMMATIC LAYOUT/, done);
59
58
  });
60
59
  });
61
60
 
62
-
63
- describe('options.layout', function() {
61
+ describe('options.layout', function () {
64
62
  var dirname = __dirname + '/views/disableLayoutDirective';
65
63
 
66
- it ('should process template-specified layout without option', function(done) {
64
+ it('should process template-specified layout without option', function (done) {
67
65
  var render = hbs.create().express3({
66
+ restrictLayoutsTo: dirname,
68
67
  });
69
68
  var locals = createLocals('express3', dirname);
70
69
 
71
- render(dirname + '/index.hbs', locals, function(err, html) {
70
+ render(dirname + '/index.hbs', locals, function (err, html) {
72
71
  assert.equal('<dld>dld</dld>', stripWs(html));
73
72
  done();
74
73
  });
75
74
  });
76
75
 
77
- it ('should allow options.layout to be specified', function(done) {
76
+ it('should allow options.layout to be specified', function (done) {
78
77
  var render = hbs.create().express3({
78
+ restrictLayoutsTo: dirname,
79
79
  });
80
80
  var locals = createLocals('express3', dirname, { layout: 'layouts/default' });
81
81
 
82
- render(dirname + '/aside.hbs', locals, function(err, html) {
82
+ render(dirname + '/aside.hbs', locals, function (err, html) {
83
83
  assert.equal('<dld>aside</dld>', stripWs(html));
84
84
  done();
85
85
  });
86
86
  });
87
87
 
88
- it ('should not process template-specified layout when options.layout is falsy', function(done) {
88
+ it('should error when using a layout outside of the restrictLayoutsTo', function (done) {
89
89
  var render = hbs.create().express3({
90
+ restrictLayoutsTo: path.resolve(path.join(__dirname, '../')),
91
+ });
92
+ var locals = createLocals('express3', dirname, {
93
+ layout: '/Users/egg/Code/Ghost/ghost/core/package.json',
94
+ });
95
+
96
+ render(dirname + '/aside.hbs', locals, function (err, html) {
97
+ if (!err) {
98
+ return done(new Error('We expect an error when reading'));
99
+ }
100
+ return done();
101
+ });
102
+ });
103
+
104
+ it('should not process template-specified layout when options.layout is falsy', function (done) {
105
+ var render = hbs.create().express3({
106
+ restrictLayoutsTo: dirname,
90
107
  });
91
108
  var locals = createLocals('express3', dirname, { layout: false });
92
109
 
93
- render(dirname + '/index.hbs', locals, function(err, html) {
110
+ render(dirname + '/index.hbs', locals, function (err, html) {
94
111
  assert.equal('dld', stripWs(html));
95
112
  done();
96
113
  });
97
114
  });
98
115
  });
99
-
100
116
  });
@@ -8,110 +8,116 @@ describe('local template options', function () {
8
8
  var dirname = path.join(__dirname, 'localTemplateOptions');
9
9
 
10
10
  describe('express3', function () {
11
-
12
11
  it('merges res.locals._templateOptions with the self._templateOptions', function (done) {
13
12
  var instance = hbs.create();
14
- var render = instance.express3({});
13
+ var render = instance.express3({
14
+ restrictLayoutsTo: dirname,
15
+ });
15
16
  instance.updateTemplateOptions({
16
- data: {
17
- greeting: 'Hello,',
18
- firstName: 'Freddy',
19
- lastName: 'Krueger'
20
- }
17
+ data: {
18
+ greeting: 'Hello,',
19
+ firstName: 'Freddy',
20
+ lastName: 'Krueger',
21
+ },
21
22
  });
22
23
 
23
24
  var locals = H.createLocals('express3', dirname, {
24
25
  _templateOptions: {
25
26
  data: {
26
- lastName: 'Mercury'
27
- }
28
- }
27
+ lastName: 'Mercury',
28
+ },
29
+ },
29
30
  });
30
31
 
31
32
  render(path.join(dirname, 'template.hbs'), locals, function (err, html) {
32
33
  assert.ifError(err);
33
- assert.strictEqual(H.stripWs(html), H.stripWs('Hello, Freddy Mercury'));
34
+ assert.strictEqual(H.stripWs(html), H.stripWs('Hello, Freddy Mercury'));
34
35
  done(err);
35
36
  });
36
37
  });
37
38
 
38
39
  it('removes _templateOptions from the locals data', function (done) {
39
40
  var instance = hbs.create();
40
- var render = instance.express3({});
41
+ var render = instance.express3({
42
+ restrictLayoutsTo: dirname,
43
+ });
41
44
  instance.updateTemplateOptions({
42
- data: {
43
- greeting: 'Hello,',
44
- firstName: 'Freddy',
45
- lastName: 'Krueger'
46
- }
45
+ data: {
46
+ greeting: 'Hello,',
47
+ firstName: 'Freddy',
48
+ lastName: 'Krueger',
49
+ },
47
50
  });
48
51
 
49
52
  var locals = H.createLocals('express3', dirname, {
50
53
  _templateOptions: {
51
54
  data: {
52
- lastName: 'Mercury'
53
- }
54
- }
55
+ lastName: 'Mercury',
56
+ },
57
+ },
55
58
  });
56
59
 
57
60
  render(path.join(dirname, 'data-access-template.hbs'), locals, function (err, html) {
58
61
  assert.ifError(err);
59
- assert.strictEqual(H.stripWs(html), H.stripWs(''));
62
+ assert.strictEqual(H.stripWs(html), H.stripWs(''));
60
63
  done(err);
61
64
  });
62
65
  });
63
66
  });
64
67
 
65
68
  describe('express4', function () {
66
-
67
69
  it('merges res.locals._templateOptions with the self._templateOptions', function (done) {
68
70
  var instance = hbs.create();
69
- var render = instance.express4({});
71
+ var render = instance.express4({
72
+ restrictLayoutsTo: dirname,
73
+ });
70
74
  instance.updateTemplateOptions({
71
- data: {
72
- greeting: 'Hello,',
73
- firstName: 'Freddy',
74
- lastName: 'Krueger'
75
- }
75
+ data: {
76
+ greeting: 'Hello,',
77
+ firstName: 'Freddy',
78
+ lastName: 'Krueger',
79
+ },
76
80
  });
77
81
 
78
82
  var locals = H.createLocals('express4', dirname, {
79
83
  _templateOptions: {
80
84
  data: {
81
- lastName: 'Mercury'
82
- }
83
- }
85
+ lastName: 'Mercury',
86
+ },
87
+ },
84
88
  });
85
89
 
86
90
  render(path.join(dirname, 'template.hbs'), locals, function (err, html) {
87
91
  assert.ifError(err);
88
- assert.strictEqual(H.stripWs(html), H.stripWs('Hello, Freddy Mercury'));
92
+ assert.strictEqual(H.stripWs(html), H.stripWs('Hello, Freddy Mercury'));
89
93
  done(err);
90
94
  });
91
95
  });
92
96
 
93
97
  it('removes _templateOptions from the locals data', function (done) {
94
98
  var instance = hbs.create();
95
- var render = instance.express3({});
99
+ var render = instance.express3({
100
+ restrictLayoutsTo: dirname,
101
+ });
96
102
  instance.updateTemplateOptions({
97
- data: {
98
- greeting: 'Hello,',
99
- firstName: 'Freddy',
100
- lastName: 'Krueger'
101
- }
103
+ data: {
104
+ greeting: 'Hello,',
105
+ firstName: 'Freddy',
106
+ lastName: 'Krueger',
107
+ },
102
108
  });
103
109
 
104
110
  var locals = H.createLocals('express3', dirname, {
105
111
  _templateOptions: {
106
112
  data: {
107
- lastName: 'Mercury'
108
- }
109
- }
113
+ lastName: 'Mercury',
114
+ },
115
+ },
110
116
  });
111
117
 
112
118
  render(path.join(dirname, 'data-access-template.hbs'), locals, function (err, html) {
113
119
  assert.ifError(err);
114
- assert.strictEqual(H.stripWs(html), H.stripWs(''));
120
+ assert.strictEqual(H.stripWs(html), H.stripWs(''));
115
121
  done(err);
116
122
  });
117
123
  });
package/test/multiple.js CHANGED
@@ -5,12 +5,17 @@ var assert = require('assert');
5
5
  var express = require('express');
6
6
  var hbs = require('..');
7
7
 
8
- describe('multiple directories', function() {
8
+ describe('multiple directories', function () {
9
9
  var app;
10
10
 
11
- beforeEach(function() {
11
+ beforeEach(function () {
12
12
  app = express();
13
- app.engine('hbs', hbs.express3());
13
+ app.engine(
14
+ 'hbs',
15
+ hbs.express3({
16
+ restrictLayoutsTo: './test/views/multiple',
17
+ }),
18
+ );
14
19
  app.set('view engine', 'hbs');
15
20
  app.get('/test1', function (req, res) {
16
21
  res.render('test1');
@@ -26,7 +31,7 @@ describe('multiple directories', function() {
26
31
  });
27
32
  });
28
33
 
29
- it('should handle single folder', function(done) {
34
+ it('should handle single folder', function (done) {
30
35
  app.set('views', './test/views/multiple/views1');
31
36
  request(app)
32
37
  .get('/test1')
@@ -38,7 +43,7 @@ describe('multiple directories', function() {
38
43
  });
39
44
  });
40
45
 
41
- it('should handle multiple folders', function(done) {
46
+ it('should handle multiple folders', function (done) {
42
47
  app.set('views', ['./test/views/multiple/views1', './test/views/multiple/views2']);
43
48
  request(app)
44
49
  .get('/test2')
@@ -50,9 +55,8 @@ describe('multiple directories', function() {
50
55
  });
51
56
  });
52
57
 
53
- describe('should handle multiple folders in specific order', function() {
54
-
55
- it('views1, views2', function(done) {
58
+ describe('should handle multiple folders in specific order', function () {
59
+ it('views1, views2', function (done) {
56
60
  app.set('views', ['./test/views/multiple/views1', './test/views/multiple/views2']);
57
61
  request(app)
58
62
  .get('/collide')
@@ -64,7 +68,7 @@ describe('multiple directories', function() {
64
68
  });
65
69
  });
66
70
 
67
- it('views2, views1', function(done) {
71
+ it('views2, views1', function (done) {
68
72
  app.set('views', ['./test/views/multiple/views2', './test/views/multiple/views1']);
69
73
  request(app)
70
74
  .get('/collide')
@@ -75,43 +79,37 @@ describe('multiple directories', function() {
75
79
  done();
76
80
  });
77
81
  });
78
-
79
82
  });
80
83
 
81
- /* eslint-disable no-unused-vars */
82
- describe('should report the filename in error', function() {
83
-
84
- it('should report from first folder', function(done) {
84
+ describe('should report the filename in error', function () {
85
+ it('should report from first folder', function (done) {
85
86
  app.set('views', ['./test/views/multiple/views1', './test/views/multiple/views2']);
86
- app.use(function(err, req, res, next) {
87
+ app.use(function (err, req, res, next) {
87
88
  res.status(500).send(err.stack);
88
89
  });
89
90
 
90
91
  request(app)
91
- .get('/error')
92
- .end(function(err, res) {
93
- assert.ifError(err);
94
- assert(res.error.text.indexOf('views1/error.hbs]') > 0);
95
- done();
96
- });
92
+ .get('/error')
93
+ .end(function (err, res) {
94
+ assert.ifError(err);
95
+ assert(res.error.text.indexOf('views1/error.hbs]') > 0);
96
+ done();
97
+ });
97
98
  });
98
99
 
99
-
100
- it('should report from second folder', function(done) {
100
+ it('should report from second folder', function (done) {
101
101
  app.set('views', ['./test/views/multiple/views2', './test/views/multiple/views1']);
102
- app.use(function(err, req, res, next) {
102
+ app.use(function (err, req, res, next) {
103
103
  res.status(500).send(err.stack);
104
104
  });
105
105
 
106
106
  request(app)
107
- .get('/error')
108
- .end(function(err, res) {
109
- assert.ifError(err);
110
- assert(res.error.text.indexOf('views2/error.hbs]') > 0);
111
- done();
112
- });
107
+ .get('/error')
108
+ .end(function (err, res) {
109
+ assert.ifError(err);
110
+ assert(res.error.text.indexOf('views2/error.hbs]') > 0);
111
+ done();
112
+ });
113
113
  });
114
114
  });
115
- /* eslint-enable no-unused-vars */
116
-
117
115
  });
@@ -2,31 +2,32 @@ var assert = require('assert');
2
2
  var hbs = require('..');
3
3
  var H = require('./helpers');
4
4
 
5
- describe('non-express', function() {
6
-
7
- describe('viewsDir', function() {
5
+ describe('non-express', function () {
6
+ describe('viewsDir', function () {
8
7
  var dirname = __dirname + '/views/viewsDir';
9
8
 
10
- it ('should use viewsDir options', function(done) {
9
+ it('should use viewsDir options', function (done) {
11
10
  var render = hbs.create().express3({
12
- viewsDir: dirname
11
+ viewsDir: dirname,
12
+ restrictLayoutsTo: dirname,
13
13
  });
14
14
  var locals = H.createLocals('express3', dirname);
15
15
 
16
- render(dirname + '/sub/directive.hbs', locals, function(err, html) {
16
+ render(dirname + '/sub/directive.hbs', locals, function (err, html) {
17
17
  assert.equal('<vd>directive</vd>', H.stripWs(html));
18
18
  done();
19
19
  });
20
20
  });
21
21
 
22
- it ('should work with layoutsDir', function(done) {
22
+ it('should work with layoutsDir', function (done) {
23
23
  var render = hbs.create().express3({
24
24
  viewsDir: dirname,
25
- layoutsDir: dirname + '/layouts'
25
+ layoutsDir: dirname + '/layouts',
26
+ restrictLayoutsTo: dirname,
26
27
  });
27
- var locals = H.createLocals('express3', dirname, {layout: 'default.hbs'});
28
+ var locals = H.createLocals('express3', dirname, { layout: 'default.hbs' });
28
29
 
29
- render(dirname + '/sub/lay.hbs', locals, function(err, html) {
30
+ render(dirname + '/sub/lay.hbs', locals, function (err, html) {
30
31
  assert.equal('<vd>lay</vd>', H.stripWs(html));
31
32
  done();
32
33
  });
@@ -4,16 +4,15 @@ var path = require('path');
4
4
  var H = require('./helpers');
5
5
  var fs = require('fs');
6
6
 
7
+ describe('options', function () {
8
+ var dirname = path.join(__dirname, 'views/beautify');
7
9
 
8
- describe('options', function() {
9
- var dirname = path.join(__dirname, 'views/beautify');
10
-
11
- it('should pretty print HTML', function(done) {
10
+ it('should pretty print HTML', function (done) {
12
11
  var hb = hbs.create();
13
- var render = hb.express3({beautify: true});
12
+ var render = hb.express3({ beautify: true, restrictLayoutsTo: dirname });
14
13
  var locals = H.createLocals('express3', dirname, {});
15
14
 
16
- render(dirname + '/index.hbs', locals, function(err, html) {
15
+ render(dirname + '/index.hbs', locals, function (err, html) {
17
16
  assert.ifError(err);
18
17
  var expected = fs.readFileSync(dirname + '/expected.hbs', 'utf8');
19
18
  assert.equal(html.trim(), expected.trim());
@@ -21,4 +20,3 @@ describe('options', function() {
21
20
  });
22
21
  });
23
22
  });
24
-
@@ -0,0 +1,54 @@
1
+ 'use strict';
2
+
3
+ var assert = require('assert');
4
+ var generateId = require('../lib/generate-id');
5
+ var resolver = require('../lib/resolver');
6
+
7
+ describe('resolver', function () {
8
+ it('detects an unresolved helper at the start of rendered output', function () {
9
+ assert.equal(resolver.hasResolvers('__aSyNcId__<_12345678__'), true);
10
+ });
11
+
12
+ it('does not report rendered output without a resolver marker', function () {
13
+ assert.equal(resolver.hasResolvers('rendered output'), false);
14
+ });
15
+
16
+ it('resolves asynchronous helper output with its context', function (done) {
17
+ var cache = {};
18
+ var id = resolver.resolve(
19
+ cache,
20
+ function (context, callback) {
21
+ callback(context.value);
22
+ },
23
+ { value: 'resolved' },
24
+ );
25
+
26
+ resolver.done(cache, function (err, values) {
27
+ assert.ifError(err);
28
+ assert.equal(values[id], 'resolved');
29
+ done();
30
+ });
31
+ });
32
+
33
+ it('reports synchronous helper failures', function (done) {
34
+ var cache = {};
35
+ resolver.resolve(cache, function () {
36
+ throw new Error('helper failed');
37
+ });
38
+
39
+ resolver.done(cache, function (err) {
40
+ assert.equal(err.message, 'helper failed');
41
+ done();
42
+ });
43
+ });
44
+ });
45
+
46
+ describe('generateId', function () {
47
+ it('uses an eight-character default', function () {
48
+ assert.match(generateId(), /^[A-Za-z_]{8}$/);
49
+ });
50
+
51
+ it('uses the requested length', function () {
52
+ assert.match(generateId(16), /^[A-Za-z_]{16}$/);
53
+ });
54
+ });
package/.eslintrc DELETED
@@ -1,42 +0,0 @@
1
- {
2
- "env": {
3
- "node": true
4
- },
5
-
6
- "globals": {
7
- "describe": true,
8
- "beforeEach": true,
9
- "it": true
10
- },
11
-
12
- "rules": {
13
- "brace-style": [1, "1tbs"],
14
- "curly": [0, "multi"],
15
- "eqeqeq": [1, "smart"],
16
- "max-depth": [1, 4],
17
- "max-params": [1, 5],
18
- "new-cap": 2,
19
- "new-parens": 0,
20
- "no-constant-condition": 0,
21
- "no-div-regex": 1,
22
- "no-else-return": 1,
23
- "no-extra-parens": 1,
24
- "no-floating-decimal": 2,
25
- "no-inner-declarations": 2,
26
- "no-lonely-if": 1,
27
- "no-multi-str": 0,
28
- "no-nested-ternary": 2,
29
- "no-new-object": 0,
30
- "no-new-func": 0,
31
- "no-shadow": 0,
32
- "no-underscore-dangle": 0,
33
- "no-unused-vars": 2,
34
- "quotes": [2, "single", "avoid-escape"],
35
- "radix": 2,
36
- "keyword-spacing": "error",
37
- "object-curly-spacing": ["error", "never"],
38
- "array-bracket-spacing": ["error", "never"],
39
- "strict": 2,
40
- "wrap-iife": 2
41
- }
42
- }