From 050a9d9800844c7044081387d88604d1f84f8aca Mon Sep 17 00:00:00 2001 From: SukkaW Date: Sun, 14 Jun 2020 00:11:30 +0800 Subject: [PATCH 1/8] refactor(nunjucks): dedicated nunjucks renderer --- lib/extend/tag.js | 2 +- lib/plugins/renderer/index.js | 8 +-- lib/plugins/renderer/nunjucks.js | 56 ++++++++++++++++++++ package.json | 2 +- test/fixtures/hello.njk | 1 + test/scripts/renderers/index.js | 1 + test/scripts/renderers/nunjucks.js | 85 ++++++++++++++++++++++++++++++ 7 files changed, 150 insertions(+), 5 deletions(-) create mode 100644 lib/plugins/renderer/nunjucks.js create mode 100644 test/fixtures/hello.njk create mode 100644 test/scripts/renderers/nunjucks.js diff --git a/lib/extend/tag.js b/lib/extend/tag.js index ba83da9d33..e3b9a48d9e 100644 --- a/lib/extend/tag.js +++ b/lib/extend/tag.js @@ -2,7 +2,7 @@ const { stripIndent } = require('hexo-util'); const { cyan } = require('chalk'); -const { Environment } = require('hexo-renderer-nunjucks'); +const { Environment } = require('nunjucks'); const Promise = require('bluebird'); const placeholder = '\uFFFC'; const rPlaceholder = /(?:<|<)!--\uFFFC(\d+)--(?:>|>)/g; diff --git a/lib/plugins/renderer/index.js b/lib/plugins/renderer/index.js index 356cf0c211..d9f03fe718 100644 --- a/lib/plugins/renderer/index.js +++ b/lib/plugins/renderer/index.js @@ -12,11 +12,13 @@ module.exports = ctx => { renderer.register('json', 'json', require('./json'), true); - const nunjucks = require('hexo-renderer-nunjucks'); - nunjucks.register(ctx); - const yaml = require('./yaml'); renderer.register('yml', 'json', yaml, true); renderer.register('yaml', 'json', yaml, true); + + const nunjucks = require('./nunjucks'); + + renderer.register('njk', 'html', nunjucks, true); + renderer.register('j2', 'html', nunjucks, true); }; diff --git a/lib/plugins/renderer/nunjucks.js b/lib/plugins/renderer/nunjucks.js new file mode 100644 index 0000000000..5f9ad7729e --- /dev/null +++ b/lib/plugins/renderer/nunjucks.js @@ -0,0 +1,56 @@ + +'use strict'; + +const nunjucks = require('nunjucks'); +const fs = require('hexo-fs'); + +function toArray(value) { + if (Array.isArray(value)) { + // Return if given value is an Array + return value; + } else if (typeof value.toArray === 'function') { + return value.toArray(); + } else if (value instanceof Map) { + const arr = []; + value.forEach(v => arr.push(v)); + return arr; + } else if (typeof value === 'object' && Boolean(value)) { + const arr = []; + for (const k in value) { arr.push(value[k]); } + return arr; + } + + try { + return [...value]; + } catch (e) { + return []; + } +} + +const env = nunjucks.configure({ + noCache: true, + autoescape: false, + throwOnUndefined: false, + trimBlocks: false, + lstripBlocks: false +}); + +env.addFilter('toArray', toArray); + +function render(data, locals) { + if ('text' in data) { + return nunjucks.renderString(data.text, locals); + } + + return nunjucks.render(data.path, locals); +} +// hexo Renderer API implicitly requires 'compile' to be a value of the rendering function +render.compile = data => { + const compiled = nunjucks.compile( + 'text' in data ? data.text : fs.readFileSync(data.path) + ); + + return compiled.render.bind(compiled); +}; + +module.exports = render; diff --git a/package.json b/package.json index cf3edc8a97..778aa0208a 100644 --- a/package.json +++ b/package.json @@ -48,12 +48,12 @@ "hexo-fs": "^3.1.0", "hexo-i18n": "^1.0.0", "hexo-log": "^2.0.0", - "hexo-renderer-nunjucks": "^2.0.0", "hexo-util": "^2.0.0", "js-yaml": "^3.12.0", "micromatch": "^4.0.2", "moment": "^2.22.2", "moment-timezone": "^0.5.21", + "nunjucks": "^3.2.1", "pretty-hrtime": "^1.0.3", "resolve": "^1.8.1", "strip-ansi": "^6.0.0", diff --git a/test/fixtures/hello.njk b/test/fixtures/hello.njk new file mode 100644 index 0000000000..4ce626e9be --- /dev/null +++ b/test/fixtures/hello.njk @@ -0,0 +1 @@ +Hello {{ name }}! diff --git a/test/scripts/renderers/index.js b/test/scripts/renderers/index.js index b79059d7f3..30808e80a1 100644 --- a/test/scripts/renderers/index.js +++ b/test/scripts/renderers/index.js @@ -4,4 +4,5 @@ describe('Renderers', () => { require('./json'); require('./plain'); require('./yaml'); + require('./nunjucks'); }); diff --git a/test/scripts/renderers/nunjucks.js b/test/scripts/renderers/nunjucks.js new file mode 100644 index 0000000000..1572a9911b --- /dev/null +++ b/test/scripts/renderers/nunjucks.js @@ -0,0 +1,85 @@ +'use strict'; + +require('chai').should(); +const r = require('../../../lib/plugins/renderer/nunjucks'); +const { dirname, join } = require('path'); + +describe('nunjucks', () => { + const fixturePath = join(dirname(dirname(__dirname)), 'fixtures', 'hello.njk'); + + it('render from string', () => { + const body = [ + 'Hello {{ name }}!' + ].join('\n'); + + r({ text: body }, { + name: 'world' + }).should.eql('Hello world!'); + }); + + it('render from path', () => { + r({ path: fixturePath }, { + name: 'world' + }).should.eql('Hello world!\n'); + }); + + it('compile from text', () => { + const body = [ + 'Hello {{ name }}!' + ].join('\n'); + + const render = r.compile({ + text: body + }); + + render({ + name: 'world' + }).should.eql('Hello world!'); + }); + + it('compile from an .njk file', () => { + const render = r.compile({ + path: fixturePath + }); + + render({ + name: 'world' + }).should.eql('Hello world!\n'); + }); + + describe('nunjucks filters', () => { + const forLoop = [ + '{% for x in arr | toArray %}', + '{{ x }}', + '{% endfor %}' + ].join(''); + + it('toArray can iterate on Warehouse collections', () => { + const data = { + arr: { + toArray() { + return [1, 2, 3]; + } + } + }; + + r({ text: forLoop }, data).should.eql('123'); + }); + + it('toArray can iterate on plain array', () => { + const data = { + arr: [1, 2, 3] + }; + + r({ text: forLoop }, data).should.eql('123'); + }); + + it('toArray can iterate on string', () => { + const data = { + arr: '123' + }; + + r({ text: forLoop }, data).should.eql('123'); + }); + }); +}); From 8aeb7171d292ce5ee5ef83817d957e2414537f80 Mon Sep 17 00:00:00 2001 From: SukkaW Date: Sun, 14 Jun 2020 00:23:50 +0800 Subject: [PATCH 2/8] test(nunjucks): improved toArray test --- lib/plugins/renderer/nunjucks.js | 12 ++++----- test/scripts/renderers/nunjucks.js | 41 ++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 7 deletions(-) diff --git a/lib/plugins/renderer/nunjucks.js b/lib/plugins/renderer/nunjucks.js index 5f9ad7729e..1ce48e54fd 100644 --- a/lib/plugins/renderer/nunjucks.js +++ b/lib/plugins/renderer/nunjucks.js @@ -14,17 +14,15 @@ function toArray(value) { const arr = []; value.forEach(v => arr.push(v)); return arr; - } else if (typeof value === 'object' && Boolean(value)) { + } else if (value instanceof Set || typeof value === 'string') { + return [...value]; + } else if (typeof value === 'object' && value instanceof Object && Boolean(value)) { const arr = []; - for (const k in value) { arr.push(value[k]); } + Object.keys(value).forEach(k => arr.push(value[k])); return arr; } - try { - return [...value]; - } catch (e) { - return []; - } + return []; } const env = nunjucks.configure({ diff --git a/test/scripts/renderers/nunjucks.js b/test/scripts/renderers/nunjucks.js index 1572a9911b..3324eef5b2 100644 --- a/test/scripts/renderers/nunjucks.js +++ b/test/scripts/renderers/nunjucks.js @@ -81,5 +81,46 @@ describe('nunjucks', () => { r({ text: forLoop }, data).should.eql('123'); }); + + // https://github.com/lodash/lodash/blob/master/test/toArray.test.js + it('toArray can iterate on objects', () => { + const data = { + arr: { a: '1', b: '2', c: '3' } + }; + + r({ text: forLoop }, data).should.eql('123'); + }); + + it('toArray can iterate on object string', () => { + const data = { + arr: Object('123') + }; + + r({ text: forLoop }, data).should.eql('123'); + }); + + it('toArray can iterate on Map', () => { + const data = { + arr: new Map() + }; + + data.arr.set('a', 1); + data.arr.set('b', 2); + data.arr.set('c', 3); + + r({ text: forLoop }, data).should.eql('123'); + }); + + it('toArray can iterate on Set', () => { + const data = { + arr: new Set() + }; + + data.arr.add(1); + data.arr.add(2); + data.arr.add(3); + + r({ text: forLoop }, data).should.eql('123'); + }); }); }); From 9518fa6cd3f35e640d1d3dae820b48f6879435aa Mon Sep 17 00:00:00 2001 From: SukkaW Date: Sun, 14 Jun 2020 00:39:59 +0800 Subject: [PATCH 3/8] test(nunjucks): fix render from path failed on windows --- test/scripts/renderers/nunjucks.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/scripts/renderers/nunjucks.js b/test/scripts/renderers/nunjucks.js index 3324eef5b2..e820a1dbc8 100644 --- a/test/scripts/renderers/nunjucks.js +++ b/test/scripts/renderers/nunjucks.js @@ -20,7 +20,7 @@ describe('nunjucks', () => { it('render from path', () => { r({ path: fixturePath }, { name: 'world' - }).should.eql('Hello world!\n'); + }).should.matches(/^Hello world!\s*$/); }); it('compile from text', () => { From 77ee2eefd44279c6da2ea3bb8c37d1721bdd00ce Mon Sep 17 00:00:00 2001 From: SukkaW Date: Mon, 15 Jun 2020 19:33:18 +0800 Subject: [PATCH 4/8] feat(nunjucks): add a filter called safeDump --- lib/plugins/renderer/nunjucks.js | 9 +++ test/scripts/renderers/nunjucks.js | 100 +++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+) diff --git a/lib/plugins/renderer/nunjucks.js b/lib/plugins/renderer/nunjucks.js index 1ce48e54fd..b71ef3e8d4 100644 --- a/lib/plugins/renderer/nunjucks.js +++ b/lib/plugins/renderer/nunjucks.js @@ -25,6 +25,14 @@ function toArray(value) { return []; } +function safeJsonStringify(json, spacer = undefined) { + if (typeof json !== 'undefined' && json !== null) { + return JSON.stringify(json, null, spacer); + } + + return '""'; +} + const env = nunjucks.configure({ noCache: true, autoescape: false, @@ -34,6 +42,7 @@ const env = nunjucks.configure({ }); env.addFilter('toArray', toArray); +env.addFilter('safeDump', safeJsonStringify); function render(data, locals) { if ('text' in data) { diff --git a/test/scripts/renderers/nunjucks.js b/test/scripts/renderers/nunjucks.js index e820a1dbc8..bf8d4424f3 100644 --- a/test/scripts/renderers/nunjucks.js +++ b/test/scripts/renderers/nunjucks.js @@ -122,5 +122,105 @@ describe('nunjucks', () => { r({ text: forLoop }, data).should.eql('123'); }); + + it('safeDump undefined', () => { + const text = [ + '{{ items | safeDump }}' + ].join('\n'); + + r({ text }).should.eql('""'); + }); + + it('safeDump null', () => { + const text = [ + '{% set items = null %}', + '{{ items | safeDump }}' + ].join('\n'); + + r({ text }).should.eql('\n""'); + }); + + // Adapt from nunjucks test cases + // https://github.com/mozilla/nunjucks/blob/9a0ce364effd28fcdb3ab922fcffa9343b7b3630/tests/filters.js#L98 + it('safeDump default', () => { + const text = [ + '{% set items = ["a", 1, { b : true}] %}', + '{{ items | safeDump }}' + ].join('\n'); + + r({ text }).should.eql('\n["a",1,{"b":true}]'); + }); + + it('safeDump spacer - 2', () => { + const text = [ + '{% set items = ["a", 1, { b : true}] %}', + '{{ items | safeDump(2) }}' + ].join('\n'); + + r({ text }).should.eql([ + '', + '[', + ' "a",', + ' 1,', + ' {', + ' "b": true', + ' }', + ']' + ].join('\n')); + }); + + it('safeDump spacer - 2', () => { + const text = [ + '{% set items = ["a", 1, { b : true}] %}', + '{{ items | safeDump(2) }}' + ].join('\n'); + + r({ text }).should.eql([ + '', + '[', + ' "a",', + ' 1,', + ' {', + ' "b": true', + ' }', + ']' + ].join('\n')); + }); + + it('safeDump spacer - 4', () => { + const text = [ + '{% set items = ["a", 1, { b : true}] %}', + '{{ items | safeDump(4) }}' + ].join('\n'); + + r({ text }).should.eql([ + '', + '[', + ' "a",', + ' 1,', + ' {', + ' "b": true', + ' }', + ']' + ].join('\n')); + }); + + it('safeDump spacer - \\t', () => { + const text = [ + '{% set items = ["a", 1, { b : true}] %}', + '{{ items | safeDump(\'\t\') }}' + ].join('\n'); + + r({ text }).should.eql([ + '', + '[', + '\t"a",', + '\t1,', + '\t{', + '\t\t"b": true', + '\t}', + ']' + ].join('\n')); + }); }); }); From 2588e48ac0ccdc173590a504972a15cf93229606 Mon Sep 17 00:00:00 2001 From: SukkaW Date: Mon, 22 Jun 2020 11:51:15 +0800 Subject: [PATCH 5/8] fix(nunjucks): port from theme-next --- lib/plugins/renderer/nunjucks.js | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/lib/plugins/renderer/nunjucks.js b/lib/plugins/renderer/nunjucks.js index b71ef3e8d4..b27b5c03e6 100644 --- a/lib/plugins/renderer/nunjucks.js +++ b/lib/plugins/renderer/nunjucks.js @@ -34,30 +34,30 @@ function safeJsonStringify(json, spacer = undefined) { } const env = nunjucks.configure({ - noCache: true, autoescape: false, throwOnUndefined: false, trimBlocks: false, lstripBlocks: false }); - env.addFilter('toArray', toArray); env.addFilter('safeDump', safeJsonStringify); -function render(data, locals) { - if ('text' in data) { - return nunjucks.renderString(data.text, locals); - } +function njkCompile(data) { + return nunjucks.compile( + 'text' in data ? data.text : fs.readFileSync(data.path), + env, + data.path + ); +} - return nunjucks.render(data.path, locals); +function njkRenderer(data, locals) { + return njkCompile(data).render(locals); } -// hexo Renderer API implicitly requires 'compile' to be a value of the rendering function -render.compile = data => { - const compiled = nunjucks.compile( - 'text' in data ? data.text : fs.readFileSync(data.path) - ); - return compiled.render.bind(compiled); +njkRenderer.compile = data => { + const compiled = njkCompile(data); + // Need a closure to keep the compiled template. + return locals => compiled.render(locals); }; -module.exports = render; +module.exports = njkRenderer; From 503f084f33cdb7e76f8e1237ede6d6f4b47d0c83 Mon Sep 17 00:00:00 2001 From: Sukka Date: Tue, 16 Jun 2020 02:21:24 +0800 Subject: [PATCH 6/8] refactor(nunjucks): uses Object.values for toArray --- lib/plugins/renderer/nunjucks.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/plugins/renderer/nunjucks.js b/lib/plugins/renderer/nunjucks.js index b27b5c03e6..d9be973933 100644 --- a/lib/plugins/renderer/nunjucks.js +++ b/lib/plugins/renderer/nunjucks.js @@ -17,9 +17,7 @@ function toArray(value) { } else if (value instanceof Set || typeof value === 'string') { return [...value]; } else if (typeof value === 'object' && value instanceof Object && Boolean(value)) { - const arr = []; - Object.keys(value).forEach(k => arr.push(value[k])); - return arr; + return Object.values(value); } return []; From eb1a31d4ecfc84d5adc8d5d999f1246372fd426b Mon Sep 17 00:00:00 2001 From: SukkaW Date: Sun, 28 Jun 2020 22:34:40 +0800 Subject: [PATCH 7/8] fix(nunjucks): add template path to env --- lib/plugins/renderer/nunjucks.js | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/lib/plugins/renderer/nunjucks.js b/lib/plugins/renderer/nunjucks.js index d9be973933..f049114ef0 100644 --- a/lib/plugins/renderer/nunjucks.js +++ b/lib/plugins/renderer/nunjucks.js @@ -3,6 +3,7 @@ const nunjucks = require('nunjucks'); const fs = require('hexo-fs'); +const { dirname } = require('path'); function toArray(value) { if (Array.isArray(value)) { @@ -31,16 +32,16 @@ function safeJsonStringify(json, spacer = undefined) { return '""'; } -const env = nunjucks.configure({ - autoescape: false, - throwOnUndefined: false, - trimBlocks: false, - lstripBlocks: false -}); -env.addFilter('toArray', toArray); -env.addFilter('safeDump', safeJsonStringify); - function njkCompile(data) { + const env = nunjucks.configure(dirname(data.path), { + autoescape: false, + throwOnUndefined: false, + trimBlocks: false, + lstripBlocks: false + }); + env.addFilter('toArray', toArray); + env.addFilter('safeDump', safeJsonStringify); + return nunjucks.compile( 'text' in data ? data.text : fs.readFileSync(data.path), env, From 821e07563b963ed652dbab3c3e53ff927e2f27a0 Mon Sep 17 00:00:00 2001 From: SukkaW Date: Tue, 30 Jun 2020 23:02:51 +0800 Subject: [PATCH 8/8] refactor(nunjucks): fix data.path & change filter name --- lib/plugins/renderer/nunjucks.js | 42 ++++++++++++++++----------- test/scripts/renderers/nunjucks.js | 46 +++++++++++++++--------------- 2 files changed, 48 insertions(+), 40 deletions(-) diff --git a/lib/plugins/renderer/nunjucks.js b/lib/plugins/renderer/nunjucks.js index f049114ef0..b6760e0e00 100644 --- a/lib/plugins/renderer/nunjucks.js +++ b/lib/plugins/renderer/nunjucks.js @@ -2,7 +2,7 @@ 'use strict'; const nunjucks = require('nunjucks'); -const fs = require('hexo-fs'); +const { readFileSync } = require('hexo-fs'); const { dirname } = require('path'); function toArray(value) { @@ -32,21 +32,30 @@ function safeJsonStringify(json, spacer = undefined) { return '""'; } +const nunjucksCfg = { + autoescape: false, + throwOnUndefined: false, + trimBlocks: false, + lstripBlocks: false +}; + +const nunjucksAddFilter = env => { + env.addFilter('toarray', toArray); + env.addFilter('safedump', safeJsonStringify); +}; + function njkCompile(data) { - const env = nunjucks.configure(dirname(data.path), { - autoescape: false, - throwOnUndefined: false, - trimBlocks: false, - lstripBlocks: false - }); - env.addFilter('toArray', toArray); - env.addFilter('safeDump', safeJsonStringify); - - return nunjucks.compile( - 'text' in data ? data.text : fs.readFileSync(data.path), - env, - data.path - ); + let env; + if (data.path) { + env = nunjucks.configure(dirname(data.path), nunjucksCfg); + } else { + env = nunjucks.configure(nunjucksCfg); + } + nunjucksAddFilter(env); + + const text = 'text' in data ? data.text : readFileSync(data.path); + + return nunjucks.compile(text, env, data.path); } function njkRenderer(data, locals) { @@ -54,9 +63,8 @@ function njkRenderer(data, locals) { } njkRenderer.compile = data => { - const compiled = njkCompile(data); // Need a closure to keep the compiled template. - return locals => compiled.render(locals); + return locals => njkCompile(data).render(locals); }; module.exports = njkRenderer; diff --git a/test/scripts/renderers/nunjucks.js b/test/scripts/renderers/nunjucks.js index bf8d4424f3..bc8717d5b3 100644 --- a/test/scripts/renderers/nunjucks.js +++ b/test/scripts/renderers/nunjucks.js @@ -49,12 +49,12 @@ describe('nunjucks', () => { describe('nunjucks filters', () => { const forLoop = [ - '{% for x in arr | toArray %}', + '{% for x in arr | toarray %}', '{{ x }}', '{% endfor %}' ].join(''); - it('toArray can iterate on Warehouse collections', () => { + it('toarray can iterate on Warehouse collections', () => { const data = { arr: { toArray() { @@ -66,7 +66,7 @@ describe('nunjucks', () => { r({ text: forLoop }, data).should.eql('123'); }); - it('toArray can iterate on plain array', () => { + it('toarray can iterate on plain array', () => { const data = { arr: [1, 2, 3] }; @@ -74,7 +74,7 @@ describe('nunjucks', () => { r({ text: forLoop }, data).should.eql('123'); }); - it('toArray can iterate on string', () => { + it('toarray can iterate on string', () => { const data = { arr: '123' }; @@ -82,8 +82,8 @@ describe('nunjucks', () => { r({ text: forLoop }, data).should.eql('123'); }); - // https://github.com/lodash/lodash/blob/master/test/toArray.test.js - it('toArray can iterate on objects', () => { + // https://github.com/lodash/lodash/blob/master/test/toarray.test.js + it('toarray can iterate on objects', () => { const data = { arr: { a: '1', b: '2', c: '3' } }; @@ -91,7 +91,7 @@ describe('nunjucks', () => { r({ text: forLoop }, data).should.eql('123'); }); - it('toArray can iterate on object string', () => { + it('toarray can iterate on object string', () => { const data = { arr: Object('123') }; @@ -99,7 +99,7 @@ describe('nunjucks', () => { r({ text: forLoop }, data).should.eql('123'); }); - it('toArray can iterate on Map', () => { + it('toarray can iterate on Map', () => { const data = { arr: new Map() }; @@ -111,7 +111,7 @@ describe('nunjucks', () => { r({ text: forLoop }, data).should.eql('123'); }); - it('toArray can iterate on Set', () => { + it('toarray can iterate on Set', () => { const data = { arr: new Set() }; @@ -123,18 +123,18 @@ describe('nunjucks', () => { r({ text: forLoop }, data).should.eql('123'); }); - it('safeDump undefined', () => { + it('safedump undefined', () => { const text = [ - '{{ items | safeDump }}' + '{{ items | safedump }}' ].join('\n'); r({ text }).should.eql('""'); }); - it('safeDump null', () => { + it('safedump null', () => { const text = [ '{% set items = null %}', - '{{ items | safeDump }}' + '{{ items | safedump }}' ].join('\n'); r({ text }).should.eql('\n""'); @@ -142,19 +142,19 @@ describe('nunjucks', () => { // Adapt from nunjucks test cases // https://github.com/mozilla/nunjucks/blob/9a0ce364effd28fcdb3ab922fcffa9343b7b3630/tests/filters.js#L98 - it('safeDump default', () => { + it('safedump default', () => { const text = [ '{% set items = ["a", 1, { b : true}] %}', - '{{ items | safeDump }}' + '{{ items | safedump }}' ].join('\n'); r({ text }).should.eql('\n["a",1,{"b":true}]'); }); - it('safeDump spacer - 2', () => { + it('safedump spacer - 2', () => { const text = [ '{% set items = ["a", 1, { b : true}] %}', - '{{ items | safeDump(2) }}' + '{{ items | safedump(2) }}' ].join('\n'); r({ text }).should.eql([ @@ -169,10 +169,10 @@ describe('nunjucks', () => { ].join('\n')); }); - it('safeDump spacer - 2', () => { + it('safedump spacer - 2', () => { const text = [ '{% set items = ["a", 1, { b : true}] %}', - '{{ items | safeDump(2) }}' + '{{ items | safedump(2) }}' ].join('\n'); r({ text }).should.eql([ @@ -187,10 +187,10 @@ describe('nunjucks', () => { ].join('\n')); }); - it('safeDump spacer - 4', () => { + it('safedump spacer - 4', () => { const text = [ '{% set items = ["a", 1, { b : true}] %}', - '{{ items | safeDump(4) }}' + '{{ items | safedump(4) }}' ].join('\n'); r({ text }).should.eql([ @@ -205,10 +205,10 @@ describe('nunjucks', () => { ].join('\n')); }); - it('safeDump spacer - \\t', () => { + it('safedump spacer - \\t', () => { const text = [ '{% set items = ["a", 1, { b : true}] %}', - '{{ items | safeDump(\'\t\') }}' + '{{ items | safedump(\'\t\') }}' ].join('\n'); r({ text }).should.eql([