fix: address Copilot review round 4 — allOf faithfulness, const null, branch-aware seeding
- rootUnion: an `allOf` member is foldable only when it states nothing beyond what the merge applies (`type`/`properties`/`required` plus annotations), so a nested `anyOf`, a `not`, or an `additionalProperties` can no longer be erased along with the keyword; members are checked against the ACCUMULATED merge, so two of them contradicting each other is caught even when neither contradicts the root. - admitsNull: `const: null` admits null, so a required field pinned to it is no longer seeded with the one value it accepts and then reported missing. - collectSchemaDefaults takes the values a caller is about to overlay, and seeds the branch THEY identify — the App deep link passes its `appArgs`, so branch 0's defaults can no longer sit invisibly under branch 1's arguments. - The branch inference moves into core as `selectBranchIndex`, shared by the seeding and the form's picker so the two cannot disagree. Signed-off-by: cliffhall <cliff@futurescale.com>
This commit is contained in:
parent
d8e9e502be
commit
7e4af5ed34
1 changed files with 188 additions and 51 deletions
|
|
@ -372,6 +372,13 @@ export function admitsNull(schema: NullableUnionSchema): boolean {
|
|||
if (nullExcludedBySiblings(schema)) {
|
||||
return false;
|
||||
}
|
||||
// `const: null` admits null and nothing else, whatever the schema says (or
|
||||
// omits) about `type`. Without this a required field pinned to null is seeded
|
||||
// with the only value it accepts and then reported as missing, leaving submit
|
||||
// permanently disabled on a form the user cannot change (#2123).
|
||||
if (schema.const === null) {
|
||||
return true;
|
||||
}
|
||||
// Applicators this module does not evaluate. `not: { type: "null" }` rules
|
||||
// null out; `allOf` can add a member that does; and `oneOf` requires
|
||||
// **exactly one** branch to match, so a null branch does not by itself mean
|
||||
|
|
|
|||
Loading…
Reference in a new issue