diff --git a/lib/extend/tag.js b/lib/extend/tag.js index 03f6a66626..31f9f2aa5b 100644 --- a/lib/extend/tag.js +++ b/lib/extend/tag.js @@ -214,6 +214,14 @@ class Tag { this.env.addExtension(name, tag); } + unregister(name) { + if (!name) throw new TypeError('name is required'); + + const { env } = this; + + if (env.hasExtension(name)) env.removeExtension(name); + } + render(str, options, callback) { if (!callback && typeof options === 'function') { callback = options; diff --git a/test/scripts/extend/tag.js b/test/scripts/extend/tag.js index 2481ea96b8..1788a12166 100644 --- a/test/scripts/extend/tag.js +++ b/test/scripts/extend/tag.js @@ -161,6 +161,37 @@ describe('Tag', () => { errorCallback.calledOnce.should.be.true; }); + it('unregister()', () => { + const tag = new Tag(); + + tag.register('test', (args, content) => Promise.resolve(args.join(' ')), {async: true}); + tag.unregister('test'); + + return tag.render('{% test foo bar %}') + .then(result => { + console.log(result); + throw new Error('should return error'); + }) + .catch(err => { + err.should.have.property('type', 'unknown block tag: test'); + }); + }); + + it('unregister() - name is required', () => { + const errorCallback = sinon.spy(err => { + err.should.have.property('message', 'name is required'); + }); + + try { + tag.unregister(); + } catch (err) { + errorCallback(err); + } + + errorCallback.calledOnce.should.be.true; + }); + + it('render() - context', () => { const tag = new Tag();