Fuaran.UI.Validator
0.94.0
Prefix Reserved
dotnet add package Fuaran.UI.Validator --version 0.94.0
NuGet\Install-Package Fuaran.UI.Validator -Version 0.94.0
<PackageReference Include="Fuaran.UI.Validator" Version="0.94.0" />
<PackageVersion Include="Fuaran.UI.Validator" Version="0.94.0" />
<PackageReference Include="Fuaran.UI.Validator" />
paket add Fuaran.UI.Validator --version 0.94.0
#r "nuget: Fuaran.UI.Validator, 0.94.0"
#:package Fuaran.UI.Validator@0.94.0
#addin nuget:?package=Fuaran.UI.Validator&version=0.94.0
#tool nuget:?package=Fuaran.UI.Validator&version=0.94.0
Fuaran.UI.Validator
Build-time validator for Fuaran UI trees — an F# AST walker that gates Fuaran.X "id" { ... } author code against the schema contract in fuaran-validator.manifest.json before runtime. Surfaces structural defects (duplicate NodeIds, malformed Bindings, Action.Dispatch payloads against unknown Msg cases, RowType mismatches) as CLI findings with file:line locations, with FUARAN9xx warning + error codes mirroring the §4d AI-recovery error format.
Usage
Fuaran.UI.Validator <project.fsproj> [--module-pattern SUBSTR]
[--manifest PATH]
[--format plain|json]
Exit codes: 0 on no Error-severity findings, 1 on at least one Error, 2 on malformed CLI arguments or missing project file. Warnings do not affect the exit code; an absent manifest emits FUARAN900 (warning) and silences the schema-coupled checks. See Fuaran/docs/VALIDATOR-MANIFEST.md for the manifest schema; see Fuaran/docs/TECHNICAL_GUIDE.md for how the validator integrates with the wider Phase 12 pipeline.
How it runs
Each source file under the project is parsed once, and every check is a visitor over that one parsed-input list. The set of smart constructors it recognises, and which of them root a tree for NodeId uniqueness (an outermost constructor that takes a child node — Fuaran.box, stack, card, dashboard, …), is derived from the Fuaran module by reflection rather than listed by hand, so a new constructor is checked from the release that adds it. Every code it emits is an entry of the one code registry, Fuaran.UI.PreEmitValidate.FindingCodes, which also holds the dead-on-decode lint's and the query-binding check's codes beside the tree-time table; a check names its entry, never a string. A finding is PreEmitValidate.Finding<Location>, the shape the lints share, and its severity is Fuaran.Core.Severity. The codes, and the build-time codes retired in favour of the tree-time validator, are listed in docs/ERROR_CODES.md §4.
Suppressing a finding
Some source deliberately holds a shape the validator is right to reject in application code — most often a negative test, whose whole purpose is to construct the defect and assert the runtime reports it. There the finding is correct about the code and wrong about the intent, and no edit fixes it without destroying the test. Two comment pragmas opt a source out:
// fuaran-validator: disable FUARAN-DUP-ID, FUARAN058 — negative-test fixtures
File-scoped: suppresses the listed codes anywhere in the file, wherever the comment sits (convention: beside the module's doc comment, so a reader meets it before the fixtures).
// fuaran-validator: disable-next-line FUARAN044
Line-scoped: suppresses the listed codes on the following source line only — the precise form, for a single exceptional call site in a file that should otherwise stay gated.
Any text after the codes is free prose, so a pragma carries its justification on the same line. A code is FUARAN + digits or FUARAN- + a name (FUARAN-DUP-ID); a retired code that is still accepted (FUARAN001, which reported duplicate ids until 0.94.0) suppresses the code that replaced it. A pragma naming a code that never fires is inert, and a pragma naming no code at all suppresses nothing (a bare disable is a typo, not a blanket). Suppression applies to warnings as well as errors, and filters only the reporting layer — every check still runs. Suppressed findings are counted in the run summary (… 0 error(s), 3 warning(s), 2 suppressed, …) so a silenced rule stays visible in the build log.
Apache-2.0 licensed — see the repo LICENSE.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Fable.Core (>= 5.0.0)
- FSharp.Compiler.Service (>= 43.12.204)
- FSharp.Core (>= 10.1.300)
- Fuaran.Compute.DataFrame (>= 0.38.1)
- Fuaran.Core.AiSurface (>= 0.36.0)
- Fuaran.Core.Column (>= 0.36.0)
- Fuaran.Core.Conformance (>= 0.36.0)
- Fuaran.Core.Function (>= 0.36.0)
- Fuaran.Core.Idl (>= 0.36.0)
- Fuaran.Core.Observer (>= 0.36.0)
- Fuaran.Core.Ops (>= 0.36.0)
- Fuaran.Core.OpStream (>= 0.36.0)
- Fuaran.Core.OpStream.Dag (>= 0.36.0)
- Fuaran.Core.Projection (>= 0.36.0)
- Fuaran.Core.Propagation (>= 0.36.0)
- Fuaran.Core.Query (>= 0.36.0)
- Fuaran.Core.Tree (>= 0.36.0)
- Fuaran.Core.Validator (>= 0.36.0)
- Fuaran.Core.Wire (>= 0.36.0)
- Fuaran.UI (>= 0.94.0)
- Fuaran.UI.Core.Function (>= 0.94.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.94.0 | 26 | 10/14/2026 |
| 0.93.0 | 106 | 10/10/2026 |
| 0.92.0 | 92 | 10/6/2026 |
| 0.91.0 | 87 | 10/4/2026 |
| 0.90.0 | 92 | 10/2/2026 |
| 0.88.0 | 146 | 9/30/2026 |
| 0.86.0 | 96 | 9/28/2026 |
| 0.85.0 | 170 | 9/20/2026 |
| 0.84.0 | 228 | 9/17/2026 |
| 0.83.0 | 119 | 9/15/2026 |
| 0.81.0 | 98 | 9/12/2026 |
| 0.80.0 | 188 | 9/9/2026 |
| 0.79.0 | 128 | 9/9/2026 |
| 0.78.1 | 175 | 9/8/2026 |
| 0.78.0 | 111 | 9/7/2026 |
| 0.77.0 | 110 | 9/6/2026 |
| 0.76.0 | 185 | 9/6/2026 |
| 0.75.0 | 151 | 9/4/2026 |
| 0.71.0 | 102 | 9/4/2026 |
| 0.70.0 | 122 | 9/4/2026 |