From 94a8b1c9b872737b5c581383b69ef62799de1f2f Mon Sep 17 00:00:00 2001 From: Yacov Date: Sun, 9 Aug 2026 22:35:46 +0300 Subject: [PATCH 1/2] feat: add unregisterFilter method --- .../source/tutorials/register-filters-tags.md | 12 +++++++- src/liquid.ts | 3 ++ .../liquid/register-filters.spec.ts | 30 +++++++++++++++++++ 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/docs/source/tutorials/register-filters-tags.md b/docs/source/tutorials/register-filters-tags.md index 2e6bf7d334..29656f1943 100644 --- a/docs/source/tutorials/register-filters-tags.md +++ b/docs/source/tutorials/register-filters-tags.md @@ -62,7 +62,15 @@ See existing filter implementations here: { liquid = new Liquid() }) + + it('should unregister a custom filter', async () => { + liquid.registerFilter('greet', value => `hello ${value}`) + liquid.unregisterFilter('greet') + const html = await liquid.parseAndRender('{{ "world" | greet }}') + return expect(html).toBe('world') + }) + + it('should unregister a built-in filter', () => { + liquid = new Liquid({ strictFilters: true }) + liquid.unregisterFilter('upcase') + return expect(liquid.parseAndRender('{{ "foo" | upcase }}')).rejects.toThrow('undefined filter: upcase') + }) + + it('should support re-registering a filter', async () => { + liquid.registerFilter('greet', value => `hello ${value}`) + liquid.unregisterFilter('greet') + liquid.registerFilter('greet', value => `hi ${value}`) + const html = await liquid.parseAndRender('{{ "world" | greet }}') + return expect(html).toBe('hi world') + }) + + it('should not throw for an unknown filter', () => { + expect(() => liquid.unregisterFilter('unknown')).not.toThrow() + }) +}) From a612d11409d21c16f74f50cd5e002c2eec5ae0d4 Mon Sep 17 00:00:00 2001 From: Yacov Date: Sun, 9 Aug 2026 22:52:34 +0300 Subject: [PATCH 2/2] docs: show how to re-register built-in filters --- docs/source/tutorials/register-filters-tags.md | 8 ++++++++ test/integration/liquid/register-filters.spec.ts | 13 ++++++------- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/docs/source/tutorials/register-filters-tags.md b/docs/source/tutorials/register-filters-tags.md index 29656f1943..53af1b9f9f 100644 --- a/docs/source/tutorials/register-filters-tags.md +++ b/docs/source/tutorials/register-filters-tags.md @@ -70,6 +70,14 @@ engine.unregisterFilter('plus') With [`strictFilters`][strict-filters] enabled, using an unregistered filter will throw an error. Otherwise, the filter will be skipped. +Built-in filters can be registered again using the exported `filters` object: + +```javascript +import { filters } from 'liquidjs' + +engine.registerFilter('plus', filters.plus) +``` + To disable a tag, or to make a disabled filter throw regardless of `strictFilters`, register a dummy implementation that throws a corresponding error (see [#324](https://github.com/harttle/liquidjs/issues/324)): ```javascript diff --git a/test/integration/liquid/register-filters.spec.ts b/test/integration/liquid/register-filters.spec.ts index 4ab7bb98be..dbf6f16eb3 100644 --- a/test/integration/liquid/register-filters.spec.ts +++ b/test/integration/liquid/register-filters.spec.ts @@ -1,4 +1,4 @@ -import { Liquid } from '../../../src/liquid' +import { Liquid, filters } from '../../../src' describe('liquid#registerFilter()', function () { let liquid: Liquid @@ -85,12 +85,11 @@ describe('liquid#unregisterFilter()', function () { return expect(liquid.parseAndRender('{{ "foo" | upcase }}')).rejects.toThrow('undefined filter: upcase') }) - it('should support re-registering a filter', async () => { - liquid.registerFilter('greet', value => `hello ${value}`) - liquid.unregisterFilter('greet') - liquid.registerFilter('greet', value => `hi ${value}`) - const html = await liquid.parseAndRender('{{ "world" | greet }}') - return expect(html).toBe('hi world') + it('should support re-registering a built-in filter', async () => { + liquid.unregisterFilter('upcase') + liquid.registerFilter('upcase', filters.upcase) + const html = await liquid.parseAndRender('{{ "foo" | upcase }}') + return expect(html).toBe('FOO') }) it('should not throw for an unknown filter', () => {