express-hbs 2.5.0 → 4.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.
Files changed (114) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +50 -22
  3. package/lib/hbs.js +89 -91
  4. package/lib/resolver.js +10 -9
  5. package/package.json +32 -21
  6. package/.editorconfig +0 -8
  7. package/.eslintrc +0 -42
  8. package/.github/workflows/test.yml +0 -24
  9. package/.jsbeautifyrc +0 -17
  10. package/SECURITY.md +0 -9
  11. package/example/app-layoutsDir.js +0 -106
  12. package/example/app.js +0 -110
  13. package/example/public/css/style.css +0 -17
  14. package/example/views/fruits/details-layoutsDir.hbs +0 -3
  15. package/example/views/fruits/details.hbs +0 -4
  16. package/example/views/fruits/index-layoutsDir.hbs +0 -20
  17. package/example/views/fruits/index.hbs +0 -20
  18. package/example/views/index.hbs +0 -34
  19. package/example/views/layout/default.hbs +0 -13
  20. package/example/views/layout/fruit-details.hbs +0 -9
  21. package/example/views/layout/fruits.hbs +0 -6
  22. package/example/views/layout/html-struct.hbs +0 -21
  23. package/example/views/layout/veggie-details.hbs +0 -9
  24. package/example/views/layout/veggie.hbs +0 -6
  25. package/example/views/partials/scripts.hbs +0 -5
  26. package/example/views/partials/sub/comment.hbs +0 -1
  27. package/example/views/partials-other/other.hbs +0 -1
  28. package/example/views/replace.hbs +0 -6
  29. package/example/views/tos.txt +0 -3
  30. package/example/views/veggies/details.hbs +0 -1
  31. package/example/views/veggies.hbs +0 -17
  32. package/renovate.json +0 -6
  33. package/test/apps/async/index.js +0 -127
  34. package/test/apps/async/views/failer.hbs +0 -4
  35. package/test/apps/async/views/index.hbs +0 -16
  36. package/test/apps/async/views/layout.hbs +0 -1
  37. package/test/apps/i18n/index.js +0 -55
  38. package/test/apps/i18n/locales/en.json +0 -8
  39. package/test/apps/i18n/locales/fr.json +0 -8
  40. package/test/apps/i18n/views/index.hbs +0 -3
  41. package/test/asyncSpecs.js +0 -69
  42. package/test/cacheSpecs.js +0 -138
  43. package/test/customExtension.js +0 -36
  44. package/test/handlebarsSpecs.js +0 -95
  45. package/test/helperSpecs.js +0 -56
  46. package/test/helpers.js +0 -24
  47. package/test/i18nSpecs.js +0 -34
  48. package/test/issues/144/index.hbs +0 -1
  49. package/test/issues/153/index.hbs +0 -3
  50. package/test/issues/21/views/index.hbs +0 -1
  51. package/test/issues/21/views/layouts/default.hbs +0 -1
  52. package/test/issues/21/views/layouts/sub/child.hbs +0 -1
  53. package/test/issues/21/views/sub/relativeLayout.hbs +0 -1
  54. package/test/issues/21/views/sub/sub.hbs +0 -1
  55. package/test/issues/21/views/useLayoutInDir.hbs +0 -1
  56. package/test/issues/22/layout1.hbs +0 -1
  57. package/test/issues/22/layout2.hbs +0 -1
  58. package/test/issues/22/template.hbs +0 -1
  59. package/test/issues/23/empty.hbs +0 -0
  60. package/test/issues/23/emptyComment.hbs +0 -1
  61. package/test/issues/23/emptyPartial.hbs +0 -1
  62. package/test/issues/23/index.hbs +0 -4
  63. package/test/issues/23/layout.hbs +0 -1
  64. package/test/issues/23/partials/custom/comment-only.hbs +0 -1
  65. package/test/issues/23/partials/custom/empty.hbs +0 -0
  66. package/test/issues/23/partials/hello.hbs +0 -1
  67. package/test/issues/49/error.hbs +0 -1
  68. package/test/issues/49/front/error.hbs +0 -1
  69. package/test/issues/49/index.hbs +0 -2
  70. package/test/issues/49/layouts/default.hbs +0 -1
  71. package/test/issues/49/partial.hbs +0 -1
  72. package/test/issues/49/partials/partial-error.hbs +0 -1
  73. package/test/issues/53/default.hbs +0 -15
  74. package/test/issues/53/index.hbs +0 -7
  75. package/test/issues/53/partials/.gitkeep +0 -0
  76. package/test/issues/59/index.hbs +0 -2
  77. package/test/issues/62/basic.hbs +0 -2
  78. package/test/issues/62/block.hbs +0 -11
  79. package/test/issues/73/index.hbs +0 -5
  80. package/test/issues/73/partials/partial.hbs +0 -6
  81. package/test/issues/76/mypartial.hbs +0 -0
  82. package/test/issues/84/index.hbs +0 -1
  83. package/test/issues/84/partials/abc/def/ghi/test.hbs +0 -1
  84. package/test/issues.js +0 -476
  85. package/test/layoutSpecs.js +0 -118
  86. package/test/localTemplateOptions/data-access-template.hbs +0 -1
  87. package/test/localTemplateOptions/template.hbs +0 -1
  88. package/test/localTemplateOptions.js +0 -127
  89. package/test/multiple.js +0 -119
  90. package/test/nonExpress.js +0 -37
  91. package/test/optionsSpecs.js +0 -24
  92. package/test/views/beautify/expected.hbs +0 -9
  93. package/test/views/beautify/index.hbs +0 -2
  94. package/test/views/customExtension/layout.server.view.html +0 -1
  95. package/test/views/customExtension/partialsDir/partial1.server.view.html +0 -1
  96. package/test/views/customExtension/partialsDir/partial2.server.view.html +0 -1
  97. package/test/views/customExtension/partialsDir/subs/subPartial1.server.view.html +0 -1
  98. package/test/views/customExtension/partialsDir/subs/subPartial2.server.view.html +0 -1
  99. package/test/views/customExtension/template.server.view.html +0 -5
  100. package/test/views/disableLayoutDirective/aside.hbs +0 -1
  101. package/test/views/disableLayoutDirective/index.hbs +0 -2
  102. package/test/views/disableLayoutDirective/layouts/default.hbs +0 -1
  103. package/test/views/helpers/home/async.hbs +0 -6
  104. package/test/views/helpers/home/index.hbs +0 -3
  105. package/test/views/helpers/layouts/default.hbs +0 -1
  106. package/test/views/multiple/views1/collide.hbs +0 -1
  107. package/test/views/multiple/views1/error.hbs +0 -1
  108. package/test/views/multiple/views1/test1.hbs +0 -1
  109. package/test/views/multiple/views2/collide.hbs +0 -1
  110. package/test/views/multiple/views2/error.hbs +0 -1
  111. package/test/views/multiple/views2/test2.hbs +0 -1
  112. package/test/views/viewsDir/layouts/default.hbs +0 -1
  113. package/test/views/viewsDir/sub/directive.hbs +0 -2
  114. package/test/views/viewsDir/sub/lay.hbs +0 -1
@@ -1,118 +0,0 @@
1
- var request = require('supertest');
2
- var assert = require('assert');
3
- var path = require('path');
4
- var hbs = require('..');
5
-
6
-
7
- function stripWs(s) {
8
- return s.replace(/\s+/g, '');
9
- }
10
-
11
- function createLocals(which, viewsDir, locals) {
12
- if (!locals) locals = {};
13
- var opts = {};
14
- if (which === 'express3') {
15
- opts.settings = {
16
- views: viewsDir
17
- };
18
- opts.cache = process.env.NODE_ENV === 'production';
19
- opts.settings.views = viewsDir;
20
- for (var k in locals) {
21
- if (!locals.hasOwnProperty(k)) continue;
22
- opts[k] = locals[k];
23
- }
24
- }
25
- return opts;
26
- }
27
-
28
- describe('layouts', function() {
29
- var app;
30
-
31
- beforeEach(function() {
32
- var example = require('../example/app');
33
- app = example.create(hbs.create());
34
- });
35
-
36
-
37
- describe('layoutsDir', function() {
38
- var app;
39
-
40
- beforeEach(function() {
41
- app = require('../example/app-layoutsDir');
42
- });
43
-
44
- it('should render layout declared in markup', function(done) {
45
- request(app)
46
- .get('/fruits')
47
- .expect(/DECLARATIVE LAYOUT/, done);
48
- });
49
-
50
- it('should allow specifying layout in locals without dir', function(done) {
51
- request(app)
52
- .get('/veggies')
53
- .expect(/PROGRAMMATIC LAYOUT/, done);
54
- });
55
-
56
- it('should still allow specifying layout in locals with dir', function(done) {
57
- request(app)
58
- .get('/veggies/explicit-dir')
59
- .expect(/PROGRAMMATIC LAYOUT/, done);
60
- });
61
- });
62
-
63
-
64
- describe('options.layout', function() {
65
- var dirname = __dirname + '/views/disableLayoutDirective';
66
-
67
- it ('should process template-specified layout without option', function(done) {
68
- var render = hbs.create().express3({
69
- restrictLayoutsTo: dirname
70
- });
71
- var locals = createLocals('express3', dirname);
72
-
73
- render(dirname + '/index.hbs', locals, function(err, html) {
74
- assert.equal('<dld>dld</dld>', stripWs(html));
75
- done();
76
- });
77
- });
78
-
79
- it ('should allow options.layout to be specified', function(done) {
80
- var render = hbs.create().express3({
81
- restrictLayoutsTo: dirname
82
- });
83
- var locals = createLocals('express3', dirname, { layout: 'layouts/default' });
84
-
85
- render(dirname + '/aside.hbs', locals, function(err, html) {
86
- assert.equal('<dld>aside</dld>', stripWs(html));
87
- done();
88
- });
89
- });
90
-
91
- it('should error when using a layout outside of the restrictLayoutsTo', function(done) {
92
- var render = hbs.create().express3({
93
- restrictLayoutsTo: path.resolve(path.join(__dirname, '../'))
94
- });
95
- var locals = createLocals('express3', dirname, {layout: '/Users/egg/Code/Ghost/ghost/core/package.json'});
96
-
97
- render(dirname + '/aside.hbs', locals, function (err, html) {
98
- if (!err) {
99
- return done(new Error('We expect an error when reading'));
100
- }
101
- return done();
102
- });
103
- });
104
-
105
- it ('should not process template-specified layout when options.layout is falsy', function(done) {
106
- var render = hbs.create().express3({
107
- restrictLayoutsTo: dirname
108
- });
109
- var locals = createLocals('express3', dirname, { layout: false });
110
-
111
- render(dirname + '/index.hbs', locals, function(err, html) {
112
- assert.equal('dld', stripWs(html));
113
- done();
114
- });
115
- });
116
- });
117
-
118
- });
@@ -1 +0,0 @@
1
- {{_templateOptions.data.greeting}} {{_templateOptions.data.firstName}} {{_templateOptions.data.lastName}}
@@ -1 +0,0 @@
1
- {{@greeting}} {{@firstName}} {{@lastName}}
@@ -1,127 +0,0 @@
1
- 'use strict';
2
- var assert = require('assert');
3
- var path = require('path');
4
- var hbs = require('..');
5
- var H = require('./helpers');
6
-
7
- describe('local template options', function () {
8
- var dirname = path.join(__dirname, 'localTemplateOptions');
9
-
10
- describe('express3', function () {
11
-
12
- it('merges res.locals._templateOptions with the self._templateOptions', function (done) {
13
- var instance = hbs.create();
14
- var render = instance.express3({
15
- restrictLayoutsTo: dirname
16
- });
17
- instance.updateTemplateOptions({
18
- data: {
19
- greeting: 'Hello,',
20
- firstName: 'Freddy',
21
- lastName: 'Krueger'
22
- }
23
- });
24
-
25
- var locals = H.createLocals('express3', dirname, {
26
- _templateOptions: {
27
- data: {
28
- lastName: 'Mercury'
29
- }
30
- }
31
- });
32
-
33
- render(path.join(dirname, 'template.hbs'), locals, function (err, html) {
34
- assert.ifError(err);
35
- assert.strictEqual(H.stripWs(html), H.stripWs('Hello, Freddy Mercury'));
36
- done(err);
37
- });
38
- });
39
-
40
- it('removes _templateOptions from the locals data', function (done) {
41
- var instance = hbs.create();
42
- var render = instance.express3({
43
- restrictLayoutsTo: dirname
44
- });
45
- instance.updateTemplateOptions({
46
- data: {
47
- greeting: 'Hello,',
48
- firstName: 'Freddy',
49
- lastName: 'Krueger'
50
- }
51
- });
52
-
53
- var locals = H.createLocals('express3', dirname, {
54
- _templateOptions: {
55
- data: {
56
- lastName: 'Mercury'
57
- }
58
- }
59
- });
60
-
61
- render(path.join(dirname, 'data-access-template.hbs'), locals, function (err, html) {
62
- assert.ifError(err);
63
- assert.strictEqual(H.stripWs(html), H.stripWs(''));
64
- done(err);
65
- });
66
- });
67
- });
68
-
69
- describe('express4', function () {
70
-
71
- it('merges res.locals._templateOptions with the self._templateOptions', function (done) {
72
- var instance = hbs.create();
73
- var render = instance.express4({
74
- restrictLayoutsTo: dirname
75
- });
76
- instance.updateTemplateOptions({
77
- data: {
78
- greeting: 'Hello,',
79
- firstName: 'Freddy',
80
- lastName: 'Krueger'
81
- }
82
- });
83
-
84
- var locals = H.createLocals('express4', dirname, {
85
- _templateOptions: {
86
- data: {
87
- lastName: 'Mercury'
88
- }
89
- }
90
- });
91
-
92
- render(path.join(dirname, 'template.hbs'), locals, function (err, html) {
93
- assert.ifError(err);
94
- assert.strictEqual(H.stripWs(html), H.stripWs('Hello, Freddy Mercury'));
95
- done(err);
96
- });
97
- });
98
-
99
- it('removes _templateOptions from the locals data', function (done) {
100
- var instance = hbs.create();
101
- var render = instance.express3({
102
- restrictLayoutsTo: dirname
103
- });
104
- instance.updateTemplateOptions({
105
- data: {
106
- greeting: 'Hello,',
107
- firstName: 'Freddy',
108
- lastName: 'Krueger'
109
- }
110
- });
111
-
112
- var locals = H.createLocals('express3', dirname, {
113
- _templateOptions: {
114
- data: {
115
- lastName: 'Mercury'
116
- }
117
- }
118
- });
119
-
120
- render(path.join(dirname, 'data-access-template.hbs'), locals, function (err, html) {
121
- assert.ifError(err);
122
- assert.strictEqual(H.stripWs(html), H.stripWs(''));
123
- done(err);
124
- });
125
- });
126
- });
127
- });
package/test/multiple.js DELETED
@@ -1,119 +0,0 @@
1
- 'use strict';
2
-
3
- var request = require('supertest');
4
- var assert = require('assert');
5
- var express = require('express');
6
- var hbs = require('..');
7
-
8
- describe('multiple directories', function() {
9
- var app;
10
-
11
- beforeEach(function() {
12
- app = express();
13
- app.engine('hbs', hbs.express3({
14
- restrictLayoutsTo: './test/views/multiple'
15
- }));
16
- app.set('view engine', 'hbs');
17
- app.get('/test1', function (req, res) {
18
- res.render('test1');
19
- });
20
- app.get('/test2', function (req, res) {
21
- res.render('test2');
22
- });
23
- app.get('/collide', function (req, res) {
24
- res.render('collide');
25
- });
26
- app.get('/error', function (req, res) {
27
- res.render('error');
28
- });
29
- });
30
-
31
- it('should handle single folder', function(done) {
32
- app.set('views', './test/views/multiple/views1');
33
- request(app)
34
- .get('/test1')
35
- .end(function (err, res) {
36
- assert.ifError(err);
37
- var expected = '<h1>test1</h1>\n';
38
- assert.equal(res.text, expected);
39
- done();
40
- });
41
- });
42
-
43
- it('should handle multiple folders', function(done) {
44
- app.set('views', ['./test/views/multiple/views1', './test/views/multiple/views2']);
45
- request(app)
46
- .get('/test2')
47
- .end(function (err, res) {
48
- assert.ifError(err);
49
- var expected = '<h1>test2</h1>\n';
50
- assert.equal(res.text, expected);
51
- done();
52
- });
53
- });
54
-
55
- describe('should handle multiple folders in specific order', function() {
56
-
57
- it('views1, views2', function(done) {
58
- app.set('views', ['./test/views/multiple/views1', './test/views/multiple/views2']);
59
- request(app)
60
- .get('/collide')
61
- .end(function (err, res) {
62
- assert.ifError(err);
63
- var expected = '<h1>collide1</h1>\n';
64
- assert.equal(res.text, expected);
65
- done();
66
- });
67
- });
68
-
69
- it('views2, views1', function(done) {
70
- app.set('views', ['./test/views/multiple/views2', './test/views/multiple/views1']);
71
- request(app)
72
- .get('/collide')
73
- .end(function (err, res) {
74
- assert.ifError(err);
75
- var expected = '<h1>collide2</h1>\n';
76
- assert.equal(res.text, expected);
77
- done();
78
- });
79
- });
80
-
81
- });
82
-
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) {
87
- app.set('views', ['./test/views/multiple/views1', './test/views/multiple/views2']);
88
- app.use(function(err, req, res, next) {
89
- res.status(500).send(err.stack);
90
- });
91
-
92
- 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
- });
99
- });
100
-
101
-
102
- it('should report from second folder', function(done) {
103
- app.set('views', ['./test/views/multiple/views2', './test/views/multiple/views1']);
104
- app.use(function(err, req, res, next) {
105
- res.status(500).send(err.stack);
106
- });
107
-
108
- 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
- });
115
- });
116
- });
117
- /* eslint-enable no-unused-vars */
118
-
119
- });
@@ -1,37 +0,0 @@
1
- var assert = require('assert');
2
- var hbs = require('..');
3
- var H = require('./helpers');
4
-
5
- describe('non-express', function() {
6
-
7
- describe('viewsDir', function() {
8
- var dirname = __dirname + '/views/viewsDir';
9
-
10
- it ('should use viewsDir options', function(done) {
11
- var render = hbs.create().express3({
12
- viewsDir: dirname,
13
- restrictLayoutsTo: dirname
14
- });
15
- var locals = H.createLocals('express3', dirname);
16
-
17
- render(dirname + '/sub/directive.hbs', locals, function(err, html) {
18
- assert.equal('<vd>directive</vd>', H.stripWs(html));
19
- done();
20
- });
21
- });
22
-
23
- it ('should work with layoutsDir', function(done) {
24
- var render = hbs.create().express3({
25
- viewsDir: dirname,
26
- layoutsDir: dirname + '/layouts',
27
- restrictLayoutsTo: dirname
28
- });
29
- var locals = H.createLocals('express3', dirname, {layout: 'default.hbs'});
30
-
31
- render(dirname + '/sub/lay.hbs', locals, function(err, html) {
32
- assert.equal('<vd>lay</vd>', H.stripWs(html));
33
- done();
34
- });
35
- });
36
- });
37
- });
@@ -1,24 +0,0 @@
1
- var assert = require('assert');
2
- var hbs = require('..');
3
- var path = require('path');
4
- var H = require('./helpers');
5
- var fs = require('fs');
6
-
7
-
8
- describe('options', function() {
9
- var dirname = path.join(__dirname, 'views/beautify');
10
-
11
- it('should pretty print HTML', function(done) {
12
- var hb = hbs.create();
13
- var render = hb.express3({beautify: true, restrictLayoutsTo: dirname});
14
- var locals = H.createLocals('express3', dirname, {});
15
-
16
- render(dirname + '/index.hbs', locals, function(err, html) {
17
- assert.ifError(err);
18
- var expected = fs.readFileSync(dirname + '/expected.hbs', 'utf8');
19
- assert.equal(html.trim(), expected.trim());
20
- done();
21
- });
22
- });
23
- });
24
-
@@ -1,9 +0,0 @@
1
- <html>
2
-
3
- <head>head</head>
4
-
5
- <body>
6
- <h1>heading 1</h1>
7
- <h2>heading 2</h2>
8
- </body>
9
- <html>
@@ -1,2 +0,0 @@
1
- <html>
2
- <head>head</head> <body><h1>heading 1</h1><h2>heading 2</h2></body> <html>
@@ -1 +0,0 @@
1
- <html>{{{body}}}</html>
@@ -1 +0,0 @@
1
- <partial>1</partial>
@@ -1 +0,0 @@
1
- <partial>2</partial>
@@ -1 +0,0 @@
1
- <subpartial>1</subpartial>
@@ -1 +0,0 @@
1
- <subpartial>2</subpartial>
@@ -1,5 +0,0 @@
1
- {{!< layout}}
2
- {{> subs/subPartial1}}
3
- {{> partial1}}
4
- {{> subs/subPartial2}}
5
- {{> partial2}}
@@ -1 +0,0 @@
1
- aside
@@ -1,2 +0,0 @@
1
- {{!< layouts/default}}
2
- dld
@@ -1 +0,0 @@
1
- <dld>{{{body}}}</dld>
@@ -1,6 +0,0 @@
1
- {{!< ../layouts/default}}
2
- asynctemplate
3
- {{async "foo"}}
4
- {{async "bar"}}
5
- {{async "bah"}}
6
- {{async "baz"}}
@@ -1,3 +0,0 @@
1
- {{!< ../layouts/default}}
2
- index
3
- {{sync "index"}}
@@ -1 +0,0 @@
1
- <default>{{{body}}}</default>
@@ -1 +0,0 @@
1
- <h1>collide1</h1>
@@ -1 +0,0 @@
1
- {{{http://google.co.uk}}
@@ -1 +0,0 @@
1
- <h1>test1</h1>
@@ -1 +0,0 @@
1
- <h1>collide2</h1>
@@ -1 +0,0 @@
1
- {{{http://google.co.uk}}
@@ -1 +0,0 @@
1
- <h1>test2</h1>
@@ -1 +0,0 @@
1
- <vd>{{{body}}}</vd>
@@ -1,2 +0,0 @@
1
- {{!< ../layouts/default}}
2
- directive
@@ -1 +0,0 @@
1
- lay