Release v20.61.3
Fixed
- A regex validation rule whose pattern already escapes a slash —
Matches(@"^\d{2}\/\d{2}$")— generated a client validator that did not parse: the slash was escaped a second time, and the resulting\\/let the slash terminate the regex literal early. Slash escaping is now escape-aware, so a pattern's own escapes pass through untouched and only a bare slash is escaped. - An exact-length rule —
Length(4)— projected to the client aslength(0, 0), since the extractor read aLengthproperty thatExactLengthValidatordoes not have. It reads the validator'sMin(which carries the exact length) instead, solength(4, 4)is generated.
Both were latent in the client validation projection introduced by #2363. The generation scenarios now hold the emitted proxy against the TypeScript compiler's own diagnostics rather than a best-effort transpilation — ts.transpile emits output even for code that does not parse, so the previous check could not fail — and a corpus scenario pins every projectable rule shape to its exact emission; it caught the exact-length defect on its first run. Both fixes verified to have teeth by reverting them and watching the specs fail. Full suite green: 3,987 passed, 0 failed.