express-hbs 2.5.0 → 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.
@@ -3,7 +3,6 @@ var assert = require('assert');
3
3
  var path = require('path');
4
4
  var hbs = require('..');
5
5
 
6
-
7
6
  function stripWs(s) {
8
7
  return s.replace(/\s+/g, '');
9
8
  }
@@ -13,7 +12,7 @@ function createLocals(which, viewsDir, locals) {
13
12
  var opts = {};
14
13
  if (which === 'express3') {
15
14
  opts.settings = {
16
- views: viewsDir
15
+ views: viewsDir,
17
16
  };
18
17
  opts.cache = process.env.NODE_ENV === 'production';
19
18
  opts.settings.views = viewsDir;
@@ -25,74 +24,74 @@ function createLocals(which, viewsDir, locals) {
25
24
  return opts;
26
25
  }
27
26
 
28
- describe('layouts', function() {
27
+ describe('layouts', function () {
29
28
  var app;
30
29
 
31
- beforeEach(function() {
30
+ beforeEach(function () {
32
31
  var example = require('../example/app');
33
32
  app = example.create(hbs.create());
34
33
  });
35
34
 
36
-
37
- describe('layoutsDir', function() {
35
+ describe('layoutsDir', function () {
38
36
  var app;
39
37
 
40
- beforeEach(function() {
38
+ beforeEach(function () {
41
39
  app = require('../example/app-layoutsDir');
42
40
  });
43
41
 
44
- it('should render layout declared in markup', function(done) {
42
+ it('should render layout declared in markup', function (done) {
45
43
  request(app)
46
44
  .get('/fruits')
47
45
  .expect(/DECLARATIVE LAYOUT/, done);
48
46
  });
49
47
 
50
- it('should allow specifying layout in locals without dir', function(done) {
48
+ it('should allow specifying layout in locals without dir', function (done) {
51
49
  request(app)
52
50
  .get('/veggies')
53
51
  .expect(/PROGRAMMATIC LAYOUT/, done);
54
52
  });
55
53
 
56
- 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) {
57
55
  request(app)
58
56
  .get('/veggies/explicit-dir')
59
57
  .expect(/PROGRAMMATIC LAYOUT/, done);
60
58
  });
61
59
  });
62
60
 
63
-
64
- describe('options.layout', function() {
61
+ describe('options.layout', function () {
65
62
  var dirname = __dirname + '/views/disableLayoutDirective';
66
63
 
67
- it ('should process template-specified layout without option', function(done) {
64
+ it('should process template-specified layout without option', function (done) {
68
65
  var render = hbs.create().express3({
69
- restrictLayoutsTo: dirname
66
+ restrictLayoutsTo: dirname,
70
67
  });
71
68
  var locals = createLocals('express3', dirname);
72
69
 
73
- render(dirname + '/index.hbs', locals, function(err, html) {
70
+ render(dirname + '/index.hbs', locals, function (err, html) {
74
71
  assert.equal('<dld>dld</dld>', stripWs(html));
75
72
  done();
76
73
  });
77
74
  });
78
75
 
79
- it ('should allow options.layout to be specified', function(done) {
76
+ it('should allow options.layout to be specified', function (done) {
80
77
  var render = hbs.create().express3({
81
- restrictLayoutsTo: dirname
78
+ restrictLayoutsTo: dirname,
82
79
  });
83
80
  var locals = createLocals('express3', dirname, { layout: 'layouts/default' });
84
81
 
85
- render(dirname + '/aside.hbs', locals, function(err, html) {
82
+ render(dirname + '/aside.hbs', locals, function (err, html) {
86
83
  assert.equal('<dld>aside</dld>', stripWs(html));
87
84
  done();
88
85
  });
89
86
  });
90
87
 
91
- it('should error when using a layout outside of the restrictLayoutsTo', function(done) {
88
+ it('should error when using a layout outside of the restrictLayoutsTo', function (done) {
92
89
  var render = hbs.create().express3({
93
- restrictLayoutsTo: path.resolve(path.join(__dirname, '../'))
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
94
  });
95
- var locals = createLocals('express3', dirname, {layout: '/Users/egg/Code/Ghost/ghost/core/package.json'});
96
95
 
97
96
  render(dirname + '/aside.hbs', locals, function (err, html) {
98
97
  if (!err) {
@@ -102,17 +101,16 @@ describe('layouts', function() {
102
101
  });
103
102
  });
104
103
 
105
- it ('should not process template-specified layout when options.layout is falsy', function(done) {
104
+ it('should not process template-specified layout when options.layout is falsy', function (done) {
106
105
  var render = hbs.create().express3({
107
- restrictLayoutsTo: dirname
106
+ restrictLayoutsTo: dirname,
108
107
  });
109
108
  var locals = createLocals('express3', dirname, { layout: false });
110
109
 
111
- render(dirname + '/index.hbs', locals, function(err, html) {
110
+ render(dirname + '/index.hbs', locals, function (err, html) {
112
111
  assert.equal('dld', stripWs(html));
113
112
  done();
114
113
  });
115
114
  });
116
115
  });
117
-
118
116
  });
@@ -8,31 +8,30 @@ 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
13
  var render = instance.express3({
15
- restrictLayoutsTo: dirname
14
+ restrictLayoutsTo: dirname,
16
15
  });
17
16
  instance.updateTemplateOptions({
18
- data: {
19
- greeting: 'Hello,',
20
- firstName: 'Freddy',
21
- lastName: 'Krueger'
22
- }
17
+ data: {
18
+ greeting: 'Hello,',
19
+ firstName: 'Freddy',
20
+ lastName: 'Krueger',
21
+ },
23
22
  });
24
23
 
25
24
  var locals = H.createLocals('express3', dirname, {
26
25
  _templateOptions: {
27
26
  data: {
28
- lastName: 'Mercury'
29
- }
30
- }
27
+ lastName: 'Mercury',
28
+ },
29
+ },
31
30
  });
32
31
 
33
32
  render(path.join(dirname, 'template.hbs'), locals, function (err, html) {
34
33
  assert.ifError(err);
35
- assert.strictEqual(H.stripWs(html), H.stripWs('Hello, Freddy Mercury'));
34
+ assert.strictEqual(H.stripWs(html), H.stripWs('Hello, Freddy Mercury'));
36
35
  done(err);
37
36
  });
38
37
  });
@@ -40,58 +39,57 @@ describe('local template options', function () {
40
39
  it('removes _templateOptions from the locals data', function (done) {
41
40
  var instance = hbs.create();
42
41
  var render = instance.express3({
43
- restrictLayoutsTo: dirname
42
+ restrictLayoutsTo: dirname,
44
43
  });
45
44
  instance.updateTemplateOptions({
46
- data: {
47
- greeting: 'Hello,',
48
- firstName: 'Freddy',
49
- lastName: 'Krueger'
50
- }
45
+ data: {
46
+ greeting: 'Hello,',
47
+ firstName: 'Freddy',
48
+ lastName: 'Krueger',
49
+ },
51
50
  });
52
51
 
53
52
  var locals = H.createLocals('express3', dirname, {
54
53
  _templateOptions: {
55
54
  data: {
56
- lastName: 'Mercury'
57
- }
58
- }
55
+ lastName: 'Mercury',
56
+ },
57
+ },
59
58
  });
60
59
 
61
60
  render(path.join(dirname, 'data-access-template.hbs'), locals, function (err, html) {
62
61
  assert.ifError(err);
63
- assert.strictEqual(H.stripWs(html), H.stripWs(''));
62
+ assert.strictEqual(H.stripWs(html), H.stripWs(''));
64
63
  done(err);
65
64
  });
66
65
  });
67
66
  });
68
67
 
69
68
  describe('express4', function () {
70
-
71
69
  it('merges res.locals._templateOptions with the self._templateOptions', function (done) {
72
70
  var instance = hbs.create();
73
71
  var render = instance.express4({
74
- restrictLayoutsTo: dirname
72
+ restrictLayoutsTo: dirname,
75
73
  });
76
74
  instance.updateTemplateOptions({
77
- data: {
78
- greeting: 'Hello,',
79
- firstName: 'Freddy',
80
- lastName: 'Krueger'
81
- }
75
+ data: {
76
+ greeting: 'Hello,',
77
+ firstName: 'Freddy',
78
+ lastName: 'Krueger',
79
+ },
82
80
  });
83
81
 
84
82
  var locals = H.createLocals('express4', dirname, {
85
83
  _templateOptions: {
86
84
  data: {
87
- lastName: 'Mercury'
88
- }
89
- }
85
+ lastName: 'Mercury',
86
+ },
87
+ },
90
88
  });
91
89
 
92
90
  render(path.join(dirname, 'template.hbs'), locals, function (err, html) {
93
91
  assert.ifError(err);
94
- assert.strictEqual(H.stripWs(html), H.stripWs('Hello, Freddy Mercury'));
92
+ assert.strictEqual(H.stripWs(html), H.stripWs('Hello, Freddy Mercury'));
95
93
  done(err);
96
94
  });
97
95
  });
@@ -99,27 +97,27 @@ describe('local template options', function () {
99
97
  it('removes _templateOptions from the locals data', function (done) {
100
98
  var instance = hbs.create();
101
99
  var render = instance.express3({
102
- restrictLayoutsTo: dirname
100
+ restrictLayoutsTo: dirname,
103
101
  });
104
102
  instance.updateTemplateOptions({
105
- data: {
106
- greeting: 'Hello,',
107
- firstName: 'Freddy',
108
- lastName: 'Krueger'
109
- }
103
+ data: {
104
+ greeting: 'Hello,',
105
+ firstName: 'Freddy',
106
+ lastName: 'Krueger',
107
+ },
110
108
  });
111
109
 
112
110
  var locals = H.createLocals('express3', dirname, {
113
111
  _templateOptions: {
114
112
  data: {
115
- lastName: 'Mercury'
116
- }
117
- }
113
+ lastName: 'Mercury',
114
+ },
115
+ },
118
116
  });
119
117
 
120
118
  render(path.join(dirname, 'data-access-template.hbs'), locals, function (err, html) {
121
119
  assert.ifError(err);
122
- assert.strictEqual(H.stripWs(html), H.stripWs(''));
120
+ assert.strictEqual(H.stripWs(html), H.stripWs(''));
123
121
  done(err);
124
122
  });
125
123
  });
package/test/multiple.js CHANGED
@@ -5,14 +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({
14
- restrictLayoutsTo: './test/views/multiple'
15
- }));
13
+ app.engine(
14
+ 'hbs',
15
+ hbs.express3({
16
+ restrictLayoutsTo: './test/views/multiple',
17
+ }),
18
+ );
16
19
  app.set('view engine', 'hbs');
17
20
  app.get('/test1', function (req, res) {
18
21
  res.render('test1');
@@ -28,7 +31,7 @@ describe('multiple directories', function() {
28
31
  });
29
32
  });
30
33
 
31
- it('should handle single folder', function(done) {
34
+ it('should handle single folder', function (done) {
32
35
  app.set('views', './test/views/multiple/views1');
33
36
  request(app)
34
37
  .get('/test1')
@@ -40,7 +43,7 @@ describe('multiple directories', function() {
40
43
  });
41
44
  });
42
45
 
43
- it('should handle multiple folders', function(done) {
46
+ it('should handle multiple folders', function (done) {
44
47
  app.set('views', ['./test/views/multiple/views1', './test/views/multiple/views2']);
45
48
  request(app)
46
49
  .get('/test2')
@@ -52,9 +55,8 @@ describe('multiple directories', function() {
52
55
  });
53
56
  });
54
57
 
55
- describe('should handle multiple folders in specific order', function() {
56
-
57
- it('views1, views2', function(done) {
58
+ describe('should handle multiple folders in specific order', function () {
59
+ it('views1, views2', function (done) {
58
60
  app.set('views', ['./test/views/multiple/views1', './test/views/multiple/views2']);
59
61
  request(app)
60
62
  .get('/collide')
@@ -66,7 +68,7 @@ describe('multiple directories', function() {
66
68
  });
67
69
  });
68
70
 
69
- it('views2, views1', function(done) {
71
+ it('views2, views1', function (done) {
70
72
  app.set('views', ['./test/views/multiple/views2', './test/views/multiple/views1']);
71
73
  request(app)
72
74
  .get('/collide')
@@ -77,43 +79,37 @@ describe('multiple directories', function() {
77
79
  done();
78
80
  });
79
81
  });
80
-
81
82
  });
82
83
 
83
- /* eslint-disable no-unused-vars */
84
- describe('should report the filename in error', function() {
85
-
86
- 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) {
87
86
  app.set('views', ['./test/views/multiple/views1', './test/views/multiple/views2']);
88
- app.use(function(err, req, res, next) {
87
+ app.use(function (err, req, res, next) {
89
88
  res.status(500).send(err.stack);
90
89
  });
91
90
 
92
91
  request(app)
93
- .get('/error')
94
- .end(function(err, res) {
95
- assert.ifError(err);
96
- assert(res.error.text.indexOf('views1/error.hbs]') > 0);
97
- done();
98
- });
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
+ });
99
98
  });
100
99
 
101
-
102
- it('should report from second folder', function(done) {
100
+ it('should report from second folder', function (done) {
103
101
  app.set('views', ['./test/views/multiple/views2', './test/views/multiple/views1']);
104
- app.use(function(err, req, res, next) {
102
+ app.use(function (err, req, res, next) {
105
103
  res.status(500).send(err.stack);
106
104
  });
107
105
 
108
106
  request(app)
109
- .get('/error')
110
- .end(function(err, res) {
111
- assert.ifError(err);
112
- assert(res.error.text.indexOf('views2/error.hbs]') > 0);
113
- done();
114
- });
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
+ });
115
113
  });
116
114
  });
117
- /* eslint-enable no-unused-vars */
118
-
119
115
  });
@@ -2,33 +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
11
  viewsDir: dirname,
13
- restrictLayoutsTo: dirname
12
+ restrictLayoutsTo: dirname,
14
13
  });
15
14
  var locals = H.createLocals('express3', dirname);
16
15
 
17
- render(dirname + '/sub/directive.hbs', locals, function(err, html) {
16
+ render(dirname + '/sub/directive.hbs', locals, function (err, html) {
18
17
  assert.equal('<vd>directive</vd>', H.stripWs(html));
19
18
  done();
20
19
  });
21
20
  });
22
21
 
23
- it ('should work with layoutsDir', function(done) {
22
+ it('should work with layoutsDir', function (done) {
24
23
  var render = hbs.create().express3({
25
24
  viewsDir: dirname,
26
25
  layoutsDir: dirname + '/layouts',
27
- restrictLayoutsTo: dirname
26
+ restrictLayoutsTo: dirname,
28
27
  });
29
- var locals = H.createLocals('express3', dirname, {layout: 'default.hbs'});
28
+ var locals = H.createLocals('express3', dirname, { layout: 'default.hbs' });
30
29
 
31
- render(dirname + '/sub/lay.hbs', locals, function(err, html) {
30
+ render(dirname + '/sub/lay.hbs', locals, function (err, html) {
32
31
  assert.equal('<vd>lay</vd>', H.stripWs(html));
33
32
  done();
34
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, restrictLayoutsTo: dirname});
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
- }