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.
- 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 +51 -22
- package/example/app-layoutsDir.js +32 -38
- package/example/app.js +27 -33
- package/lib/hbs.js +90 -89
- package/lib/resolver.js +10 -9
- package/package.json +29 -22
- package/renovate.json +9 -2
- package/test/apps/async/index.js +54 -41
- package/test/apps/i18n/index.js +9 -6
- package/test/asyncSpecs.js +12 -12
- package/test/cacheSpecs.js +18 -21
- package/test/customExtension.js +15 -15
- package/test/handlebarsSpecs.js +16 -19
- package/test/helperSpecs.js +24 -20
- package/test/helpers.js +3 -3
- package/test/i18nSpecs.js +10 -8
- package/test/issues.js +164 -122
- package/test/layoutSpecs.js +35 -19
- package/test/localTemplateOptions.js +48 -42
- package/test/multiple.js +30 -32
- package/test/nonExpress.js +11 -10
- package/test/optionsSpecs.js +5 -7
- package/test/resolverSpecs.js +54 -0
- package/.eslintrc +0 -42
package/test/layoutSpecs.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
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
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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(
|
|
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
|
-
|
|
82
|
-
|
|
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
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
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
|
});
|
package/test/nonExpress.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
});
|
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});
|
|
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
|
-
}
|