Skip to content

Backport compatible fixes and features to release/2.x - #990

Merged
sebastienros merged 20 commits into
release/2.xfrom
sebros/2x-backport-candidates
Aug 20, 2026
Merged

Backport compatible fixes and features to release/2.x#990
sebastienros merged 20 commits into
release/2.xfrom
sebros/2x-backport-candidates

Conversation

@sebastienros

Copy link
Copy Markdown
Owner

Summary

Backports the non-breaking fixes and features selected from main after v2.31.0. Each source PR is preserved as a distinct commit and adapted to the 2.x rendering and member-access APIs where necessary.

Validation

  • Release build across all target frameworks
  • 1,492 tests on .NET 10
  • 1,492 tests with the compiled Parlot grammar
  • Source-generator package contains only analyzers/dotnet/cs/Fluid.SourceGenerator.dll

Copilot AI and others added 20 commits August 20, 2026 14:51
* Initial plan

* Add .NET 10.0 TFM support to all projects

Co-authored-by: sebastienros <1165805+sebastienros@users.noreply.github.com>

* Fix version

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sebastienros <1165805+sebastienros@users.noreply.github.com>
Co-authored-by: Sebastien Ros <sebastienros@gmail.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: ee9c8775-0354-41dd-8226-89a69c60241c
Backport the security-relevant Scriban update needed for current NuGet auditing.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: ee9c8775-0354-41dd-8226-89a69c60241c
* Initial plan

* Add DefaultFileExtension property to TemplateOptions with custom extension support

Co-authored-by: sebastienros <1165805+sebastienros@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sebastienros <1165805+sebastienros@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: ee9c8775-0354-41dd-8226-89a69c60241c
* Initial plan

* Convert enums to StringValue by default

Co-authored-by: sebastienros <1165805+sebastienros@users.noreply.github.com>

* Simplify enum handling: convert to string in FluidValue.Create instead of accessors

Co-authored-by: sebastienros <1165805+sebastienros@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sebastienros <1165805+sebastienros@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: ee9c8775-0354-41dd-8226-89a69c60241c
* Initial plan

* Fix double-encoding issue with escape filter

The escape and escape_once filters now return StringValue with Encode=false
to prevent double-encoding when rendered with HtmlEncoder. This fixes the
issue where captured raw content with escape filter was being double-encoded.

Co-authored-by: sebastienros <1165805+sebastienros@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sebastienros <1165805+sebastienros@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: ee9c8775-0354-41dd-8226-89a69c60241c
…#869)

* Initial plan

* Add TemplateParsed callback to FluidViewEngineOptions with tests

Co-authored-by: sebastienros <1165805+sebastienros@users.noreply.github.com>

* Add documentation for TemplateParsed callback in README

Co-authored-by: sebastienros <1165805+sebastienros@users.noreply.github.com>

* Refactor CompositeFluidTemplate to implement IStatementList and simplify visitor usage

Co-authored-by: sebastienros <1165805+sebastienros@users.noreply.github.com>

* Fix CompositeFluidTemplate to render using Statements property like FluidTemplate

Co-authored-by: sebastienros <1165805+sebastienros@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sebastienros <1165805+sebastienros@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: ee9c8775-0354-41dd-8226-89a69c60241c
… statements (#873)

* Initial plan

* Add TemplateParsed callback support to TemplateOptions for include and render statements

Co-authored-by: sebastienros <1165805+sebastienros@users.noreply.github.com>

* Consolidate TemplateParsed to use TemplateOptions instead of FluidViewEngineOptions

Co-authored-by: sebastienros <1165805+sebastienros@users.noreply.github.com>

* Fix TemplateParsed to only invoke on first parse, not cache retrieval; update docs

Co-authored-by: sebastienros <1165805+sebastienros@users.noreply.github.com>

* Revise visitors section in README

Updated section on using visitors with templates for clarity.

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sebastienros <1165805+sebastienros@users.noreply.github.com>
Co-authored-by: Sébastien Ros <sebastienros@gmail.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: ee9c8775-0354-41dd-8226-89a69c60241c
* Initial plan

* Add support for null keyword to behave like nil

Co-authored-by: sebastienros <1165805+sebastienros@users.noreply.github.com>

* Add comment explaining nil and null keyword support

Co-authored-by: sebastienros <1165805+sebastienros@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sebastienros <1165805+sebastienros@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: ee9c8775-0354-41dd-8226-89a69c60241c
* Add StrictVariables and StrictFilters options

* Fix tests

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: ee9c8775-0354-41dd-8226-89a69c60241c
…e applying them (#924)

* Initial plan

* fix render tag named argument evaluation order

Co-authored-by: sebastienros <1165805+sebastienros@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sebastienros <1165805+sebastienros@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: ee9c8775-0354-41dd-8226-89a69c60241c
)

* Initial plan

* Preserve StringValue encode flag in string filters

Co-authored-by: sebastienros <1165805+sebastienros@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sebastienros <1165805+sebastienros@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: ee9c8775-0354-41dd-8226-89a69c60241c
* Add tablerow tag support

Implements the Liquid tablerow tag that generates HTML table rows for every item in an array.

Features:
- Basic iteration: {% tablerow item in collection %}{% endtablerow %}
- cols: parameter for column count
- limit: parameter to limit iterations
- offset: parameter to start at an offset
- Full tablerowloop object with all properties (index, index0, col, col0, row, first, last, col_first, col_last, length, rindex, rindex0)

The implementation follows the Shopify Liquid Ruby reference implementation.

* Add unit tests for tablerow tag

---------

Co-authored-by: GitHub Copilot CLI <copilot@github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: ee9c8775-0354-41dd-8226-89a69c60241c
- Add IfChangedStatement AST node that renders content only when it changes
- Register ifchanged/endifchanged block tag in FluidParser
- Add visitor methods to AstVisitor and AstRewriter
- Enable golden liquid tests for ifchanged tag (5 tests)
- Add 9 unit tests in IfChangedStatementTests.cs

Co-authored-by: GitHub Copilot CLI <copilot@github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: ee9c8775-0354-41dd-8226-89a69c60241c
Co-authored-by: GitHub Copilot CLI <copilot@github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: ee9c8775-0354-41dd-8226-89a69c60241c
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: ee9c8775-0354-41dd-8226-89a69c60241c
* Update Golden Liquid tests to 389a2987d14b218f2c04b25ac5670ed1fdcad0e8

* Fix blank and empty Liquid semantics

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: sebastienros <1165805+sebastienros@users.noreply.github.com>
Co-authored-by: Sebastien Ros <sebastienros@gmail.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: ee9c8775-0354-41dd-8226-89a69c60241c
* Add money filters

Implements the Shopify money filters, registered with the opt-in
`FilterCollection.WithMoneyFilters()`:

- money
- money_with_currency
- money_without_currency
- money_without_trailing_zeros

Formatting is derived from `TemplateOptions.CultureInfo` by default, and
configured by the new `TemplateOptions.MoneyOptions`, which is mirrored on
`TemplateContext` so a currency can be selected per rendering.

- `Currency` and a per-call filter argument select an ISO 4217 currency,
  resolved against an extensible `Currencies` collection.
- `AmountsInCents` divides the input by 100, matching Shopify where prices
  are stored as integers.
- `MoneyFormat` and `MoneyWithCurrencyFormat` override the culture based
  formatting using the Shopify placeholders, plus `{{currency}}` and
  `{{currency_symbol}}`.

Fixes #238

* Merge CLAUDE.md into AGENTS.md

The two files were both agent guidance for this repository, with the
commands and testing sections overlapping. AGENTS.md is now the single
file, and CLAUDE.md is removed.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: ee9c8775-0354-41dd-8226-89a69c60241c
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: ee9c8775-0354-41dd-8226-89a69c60241c
Backport the analyzer-only package layout applicable to the 2.x member-access generator.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: ee9c8775-0354-41dd-8226-89a69c60241c
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: ee9c8775-0354-41dd-8226-89a69c60241c
@sebastienros
sebastienros merged commit c9a8748 into release/2.x Aug 20, 2026
3 checks passed
@sebastienros
sebastienros deleted the sebros/2x-backport-candidates branch August 20, 2026 22:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants