Add Handlebars.js behavioral spec, coverage tests, and net10 dev environment#616
Merged
Conversation
…ronment to net10 - Add HandlebarsSpec.md: exhaustive Handlebars.js behavioral specification derived from the JS spec files, documentation, and the Mustache spec (32 sections, 200+ behaviors, and a new Known Implementation Gaps section documenting 5 confirmed deviations from the canonical spec with root causes and compat risk ratings) - Add HandlebarsSpecCoverageTests.cs: ~100 test methods across 22 behavioral categories covering areas not exercised by the existing suite. 1746/1746 tests pass. Gap tests assert current (non-spec-compliant) behavior as documented regressions so that any future changes in those areas are detected immediately. - Update test and benchmark projects to target net10.0; drop EOL frameworks (netcoreapp3.1, net6, net452, net46, net461); bump BenchmarkDotNet and Microsoft.NET.Test.Sdk to current versions. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- actions/checkout v2/master → v4 - actions/setup-dotnet v1 → v4; SDK versions 2.1.x/3.1.x/6.0.x → 6.0.x/10.0.x (2.1.x and 3.1.x are EOL and no longer available; 10.0.x needed for net10 test target) - actions/cache v1 → v4 - actions/upload-artifact v2 → v4 (v2 was shut off by GitHub, causing benchmark job to fail) - actions/setup-java v4 already current; left unchanged - Fix deprecated ::set-output syntax → $GITHUB_OUTPUT in benchmark job - sonar.login → sonar.token (sonar.login deprecated in recent SonarScanner versions) - Remove stale nuget cache-clearing workaround (setup-dotnet/issues/155 is long fixed) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
BenchmarkDotNet auto-detects all installed runtimes on the runner; ubuntu-latest has .NET Core 3.1 pre-installed, causing it to generate a netcoreapp3.1 subprocess project that is incompatible with the benchmark project's net10.0 target (NU1201). Pinning to -f net10.0 constrains BenchmarkDotNet to the single supported TFM. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Program.cs was explicitly forcing BenchmarkDotNet to use the .NET Core 3.1 toolchain (CsProjCoreToolchain.NetCoreApp31), which broke once the benchmark project moved to net10.0. Dropping the explicit toolchain lets BenchmarkDotNet use the current process runtime (net10.0 via dotnet run -f net10.0 in CI). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
windows-2019 runners have stalled at queue on two consecutive runs tonight (24+ min each vs 2-13s historical baseline). Switching to windows-latest (Server 2022) which was used in prior successful runs on this repo. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
SonarCloud quality gate failing on security hotspot S7637 — third-party GitHub Actions referenced by floating tags rather than commit SHAs, which allows supply-chain attacks if a tag is moved. Pin: Happypig375/github-action-benchmark@v1.8.2 → @e7cb068 release-drafter/release-drafter@v5 → @09c613e Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…t> key param empty on Linux/Windows) On Linux and Windows, the 'key' block param was not bound when iterating Dictionary<string, int> in #each. Switch to Dictionary<string, object> (consistent with existing DictionaryEnumeratorWithBlockParams) and rename block params to itemVal/itemKey to avoid any ambiguity with built-in names. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
S6702: SONAR_TOKEN was hardcoded in plain text in both workflow files.
Move to ${{ secrets.SONAR_TOKEN }} and reference via $env:SONAR_TOKEN
in the PowerShell run blocks.
S7630: pull_request.yml used github.event.pull_request.head.ref directly
in a run block, enabling script injection from external actors. Bind the
PR context expressions to env vars (PR_KEY, PR_BRANCH, PR_BASE) and
reference them as $env:* in the PowerShell command.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Member
Author
|
@oformaniuk we're back baby |
oformaniuk
approved these changes
Jun 19, 2026
windows-2019 runners were stalling (same issue seen previously in pull_request.yml). windows-latest uses the current stable runner pool and picks up in seconds. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.



Summary
HandlebarsSpec.md— exhaustive behavioral specification derived from the canonical Handlebars.js spec files (spec/*.js), the Mustache spec, official docs, and source analysis. 32 sections covering every feature of the templating language. Includes a new Known Implementation Gaps section documenting 5 confirmed behavioral differences from Handlebars.js, each with root cause and backward-compatibility risk rating.HandlebarsSpecCoverageTests.cs— ~100 test methods across 22 behavioral categories covering areas not exercised by the existing suite (HTML encoding edge cases, whitespace control,#eachdata variables, block params, subexpressions, partials, decorators, helper interactions, etc.). Uses the existingHandlebarsEnvGeneratorpattern so every test runs across 5IHandlebarsconfigurations.Dev environment update — bumped
Handlebars.TestandHandlebars.Benchmarkfrom EOLnetcoreapp3.1/net6targets tonet10.0; updatedMicrosoft.NET.Test.SdkandBenchmarkDotNetto current versions.Documented implementation gaps (tests assert current behavior as regressions)
'`=HtmlEncoderLegacy(default) skips 3;HtmlEncoder(opt-in) is correct{{log}}not registeredHandlebarsRuntimeExceptionat render timefalserenders as"False""false"(lowercase)bool.ToString()→"False"{{~! x ~}}strips whitespace{{^}}bare caret as else{{#x}}a{{^}}b{{/x}}like{{else}}context.ToString(); use{{else}}Test plan
dotnet test— 1746/1746 passing (all pre-existing tests plus new coverage tests)