liquify
A powerful and extensible Liquid template engine for Dart. Supports full Liquid syntax, custom tags and filters, and high-performance parsing and rendering.
1.6.1
16K downloads/mo
#2436 most downloaded on pub.dev
kingwill101/liquify
What this package is like to depend on
Last release 23 days ago
01 Aug 2026
Release timing varies
gaps range from 2 weeks to 6 months
Nearly every release is documented
notes for 32 of 35 stable releases
Nothing withdrawn
no release was ever pulled
2 years old
37 releases · first in 2024
8 releases in the last 12 months
see the full history below
Release timeline
37 releases · Aug 2024 to Aug 2026Releases
latest 37-
1.6.101 Aug 2026Release notes
Open source → -
1.6.026 Jul 2026Release notes
Open source →Browser Support
- Make the package usable from browser builds - Split the filesystem exports so
webdev/browser entrypoints no longer pull indart:io, allowing the package to be used more freely in the browser and in the playground.
Bug Fixes
- Switch date filter strftime formatting to d4_time_format - Replaced custom
_applyStrftime()converter withd4_time_formatpackage for standard strftime specifiers. Custom%P,%:z,%Z(timezone name), and%q(ordinal suffix) specifiers are preserved via a small shim.
Release notes
Open source →Browser Support
- Make the package usable from browser builds - Split the filesystem exports so
webdev/browser entrypoints no longer pull indart:io, allowing the package to be used more freely in the browser and in the playground.
Bug Fixes
- Switch date filter strftime formatting to d4_time_format - Replaced custom
_applyStrftime()converter withd4_time_formatpackage for standard strftime specifiers. Custom%P,%:z,%Z(timezone name), and%q(ordinal suffix) specifiers are preserved via a small shim.
- Make the package usable from browser builds - Split the filesystem exports so
-
1.5.119 Jan 2026Release notes
Open source →Bug Fixes
- Fix keyword word boundary parsing - Keywords
empty,true,false, andnilno longer incorrectly match prefixes of identifiers (e.g.,empty_title,true_value,false_flag,nil_checknow correctly parse as identifiers)
Release notes
Open source →Bug Fixes
- Fix keyword word boundary parsing - Keywords
empty,true,false, andnilno longer incorrectly match prefixes of identifiers (e.g.,empty_title,true_value,false_flag,nil_checknow correctly parse as identifiers)
- Fix keyword word boundary parsing - Keywords
-
1.5.018 Jan 2026Release notes
Open source →New Features
- Custom delimiters support - Configure alternative template delimiters via
LiquidConfig- Use ERB-style (
<% %>,<%= %>), bracket-style ([% %],[[ ]]), or any custom delimiters - Built-in presets:
LiquidConfig.erbfor ERB-style templates - Custom tags automatically support configured delimiters via
createTagStart(),createTagEnd(), etc. - Parser caching ensures performance is not impacted when using multiple configurations
- Use ERB-style (
Performance Improvements
- 92-95% reduction in parser activations through comprehensive optimization:
- Lookahead-based element routing (skips tag parsers for plain text)
- Precedence-based expression parser (eliminates repeated prefix parsing)
- Pattern-based text(), identifier(), and memberAccess() parsers
- First-character routing in primaryTerm() (skips impossible alternatives)
Breaking Changes
-
Custom tags using
{{ }}syntax must now explicitly declare their delimiter typeIf you have a custom tag that uses variable-style delimiters (
{{ mytag }}), you must now overridedelimiterType:class MyCustomTag with CustomTagParser { @override TagDelimiterType get delimiterType => TagDelimiterType.variable; @override Parser parser() { // ... your parser implementation } }
Custom tags using standard
{% %}syntax (the default) require no changes.
Internal Changes
- Add
TagDelimiterTypeenum to distinguish custom tag delimiter styles - Optimize parser routing based on delimiter lookahead
Release notes
Open source →New Features
- Custom delimiters support - Configure alternative template delimiters via
LiquidConfig- Use ERB-style (
<% %>,<%= %>), bracket-style ([% %],[[ ]]), or any custom delimiters - Built-in presets:
LiquidConfig.erbfor ERB-style templates - Custom tags automatically support configured delimiters via
createTagStart(),createTagEnd(), etc. - Parser caching ensures performance is not impacted when using multiple configurations
- Use ERB-style (
Performance Improvements
- 92-95% reduction in parser activations through comprehensive optimization:
- Lookahead-based element routing (skips tag parsers for plain text)
- Precedence-based expression parser (eliminates repeated prefix parsing)
- Pattern-based text(), identifier(), and memberAccess() parsers
- First-character routing in primaryTerm() (skips impossible alternatives)
Breaking Changes
-
Custom tags using
{{ }}syntax must now explicitly declare their delimiter typeIf you have a custom tag that uses variable-style delimiters (
{{ mytag }}), you must now overridedelimiterType:class MyCustomTag with CustomTagParser { @override TagDelimiterType get delimiterType => TagDelimiterType.variable; @override Parser parser() { // ... your parser implementation } }Custom tags using standard
{% %}syntax (the default) require no changes.
Internal Changes
- Add
TagDelimiterTypeenum to distinguish custom tag delimiter styles - Optimize parser routing based on delimiter lookahead
- Custom delimiters support - Configure alternative template delimiters via
-
1.4.208 Jan 2026 -
1.4.106 Jan 2026 -
1.4.006 Jan 2026Release notes
Open source →Release notes
Open source →Liquid tag improvements
- Treat each non-empty line in
{% liquid %}blocks as a statement - Ignore whitespace-only lines inside
{% liquid %}blocks - Error on CR-only line endings in
{% liquid %}blocks for consistent parsing behavior - Route
{% liquid %}output through the active buffer (works correctly inside captures)
Output and scope semantics
- Preserve value types for single-expression tag content so numeric filters (e.g.,
times) behave correctly assigninsideforloops now persists after the loop while keepingforloopand loop variables local
Tests
- Add
{% liquid %}shorthand syntax and whitespace handling tests - Add capture regression coverage for
{% liquid %}output routing
- Treat each non-empty line in
-
1.3.127 Oct 2025Release notes
Open source →Release notes
Open source →- Fix string literal parsing to correctly handle escaped quotes and characters
- Add regression tests covering render tag and evaluator behaviour with escaped strings
-
1.3.003 Jul 2025Release notes
Open source →What's Changed
- Fix MapRoot docs by @kingwill101 in #27
- Better parsing of if/for/case tags by @kingwill101 in #31
Full Changelog: v1.2.0...v1.3.0
Release notes
Open source →- Correctly check for elsif tags and not elseif
- tablerow - use seperate buffer for each row being rendered
- refactor parsers for if/case/for to better capture content in else branches etc
-
1.2.021 Jun 2025Release notes
Open source →🔒 Environment-Scoped Registry
- Add environment-scoped filter and tag registration
- Add strict mode for security sandboxing
- Add
Environment.withStrictMode()constructor - Add Template API support for custom environments
- Add environment cloning with local registrations
🔧 Parser Improvements
- Fix operators to prevent invalid matches with adjacent words
- Enhance comparison, logical, and unary operator parsing
- Improve operator precedence handling
🏷️ Render Tag Fixes
- Fix variable scope isolation in render tags
- Prevent variable leakage to parent scope
- Add comprehensive scope isolation tests
📚 Documentation
- Add environment-scoped registry documentation
-
1.1.018 Jun 2025Release notes
Open source →📚 Documentation
- Complete documentation overhaul: Added comprehensive documentation system
- Examples documentation: Added 5 detailed example guides covering basic usage, layouts, custom tags, drop objects, and file system integration
- Tags documentation: Complete reference for all 21 tags with usage patterns and examples
- Filters documentation: Comprehensive documentation for 68+ filters across 7 categories (array, string, math, date, HTML, URL, misc)
- API documentation: Structured documentation hub with cross-references and navigation
🧮 Filters
- NEW: Add
parse_jsonfilter for parsing JSON strings into Dart objects - Enhancement: Math filters now handle null values gracefully (null treated as 0, prevents runtime type cast errors)
- Enhancement: Complete expression-based filters (where_exp, find_exp, group_by_exp, etc.) with proper Liquid expression evaluation
- Enhancement: Add missing array manipulation filters: compact, concat, push, pop, shift, unshift, reject, sum, sort_natural, group_by, has
- Fix: Filter arguments now support member access expressions (e.g.,
append: features.size)
🏗️ Core Improvements
- Fix: Boolean literal parsing in comparison operations (true/false now parsed as literals instead of identifiers)
- Enhancement: FileSystemRoot and MapRoot now have extensions and throwOnError support
- Complete: 100% filter test coverage with comprehensive regression tests
🏷️ Tags
- NEW: comment
- NEW: doc
🧪 Testing
- Complete test coverage for all implemented filters
- Add regression tests for boolean literal parsing
- Enhanced render tag tests
-
1.0.401 Jun 2025Release notes
Open source →- Fix FileSystemRoot to handle null fileSystem argument safely and consistently fallback to LocalFileSystem
- Add tests for FileSystemRoot null fileSystem behavior
-
1.0.315 Apr 2025 -
1.0.214 Apr 2025 -
1.0.119 Mar 2025 -
1.0.017 Mar 2025 -
1.0.0-dev.214 Feb 2025 pre-releaseRelease notes
Open source →-
Template Enhancements:
- Added layout tag support with title filter.
- Implemented template analyzer and resolver.
-
Analyzer Improvements:
- Initial support for a static analyzer.
- Extensive testing and improvements in static analysis.
- Enhanced resolver and analyzer integration.
-
Filter Enhancements:
- Enabled dot notation for array filters.
-
-
1.0.0-dev.111 Feb 2025 pre-release -
0.8.224 Jan 2025 -
0.8.130 Oct 2024 -
0.8.026 Oct 2024 -
0.7.426 Oct 2024 -
0.7.322 Oct 2024 -
0.7.222 Oct 2024Nothing published for this version
-
0.7.121 Oct 2024 -
0.7.021 Oct 2024Release notes
Open source →- Fix parse failure for single { character
- Better whitespace control handling
- Optional tracing and linting
-
0.6.604 Sep 2024 -
0.6.527 Aug 2024 -
0.6.427 Aug 2024Nothing published for this version
-
0.6.326 Aug 2024 -
0.6.226 Aug 2024 -
0.6.126 Aug 2024Nothing published for this version
-
0.6.026 Aug 2024 -
0.5.024 Aug 2024 -
0.3.023 Aug 2024 -
0.2.023 Aug 2024 -
0.1.023 Aug 2024