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.
- package/.github/workflows/publish.yml +73 -0
- package/.github/workflows/test.yml +32 -8
- package/.nvmrc +1 -0
- package/.nycrc.json +16 -0
- package/.oxfmtrc.json +19 -0
- package/.oxlintrc.json +32 -0
- package/AGENTS.md +40 -0
- package/LICENSE +1 -1
- package/README.md +50 -22
- package/example/app-layoutsDir.js +32 -39
- package/example/app.js +27 -34
- package/lib/hbs.js +82 -90
- package/lib/resolver.js +10 -9
- package/package.json +29 -22
- package/renovate.json +9 -2
- package/test/apps/async/index.js +54 -42
- package/test/apps/i18n/index.js +9 -7
- package/test/asyncSpecs.js +12 -12
- package/test/cacheSpecs.js +18 -21
- package/test/customExtension.js +15 -16
- package/test/handlebarsSpecs.js +16 -19
- package/test/helperSpecs.js +22 -20
- package/test/helpers.js +3 -3
- package/test/i18nSpecs.js +10 -8
- package/test/issues.js +136 -122
- package/test/layoutSpecs.js +23 -25
- package/test/localTemplateOptions.js +40 -42
- package/test/multiple.js +30 -34
- package/test/nonExpress.js +9 -10
- package/test/optionsSpecs.js +5 -7
- package/test/resolverSpecs.js +54 -0
- package/.eslintrc +0 -42
package/test/layoutSpecs.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
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(
|
|
14
|
-
|
|
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
|
-
|
|
84
|
-
|
|
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
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
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
|
});
|
package/test/nonExpress.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
});
|
package/test/optionsSpecs.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
}
|