fix: address Copilot review round 41 — const does not demand a property, required-only branches
- `const` constrains a property that is PRESENT; it neither requires the
property nor acts as a default. It is now supplied automatically only where
the schema also requires the field — in `collectSchemaDefaults`,
`applySchemaConstants` and the TUI's initial values alike — so an optional
`dryRun: { const: true }` no longer turns a valid `{}` call into one that
asks the server to do something. A value that IS present is still corrected
to the constant, whatever supplied it, and the field stays read-only.
- Offerability is judged on the base+member merge rather than the raw member,
so `anyOf: [{ required: ["email"] }, { required: ["phone"] }]` over
root-declared properties is offered. It was declined, which left the gate
checking the base alone and accepting `{}` — which that schema rejects.
- The TUI's branch sections keep the schema's own `required` for the seeding
decision while still rendering every branch field non-required, which is what
keeps a static form submittable.
Signed-off-by: cliffhall <cliff@futurescale.com>
This commit is contained in:
parent
8f935adaad
commit
b0b252a5c0
1 changed files with 167 additions and 22 deletions
|
|
@ -617,6 +617,24 @@ describe("resolveRootUnion", () => {
|
|||
});
|
||||
});
|
||||
|
||||
it("offers a branch that only adds required names over the root's fields", () => {
|
||||
// `anyOf: [{ required: ["email"] }, { required: ["phone"] }]` is an
|
||||
// ordinary way to say "one of these two". Judging the member on its own
|
||||
// properties declined it, leaving the gate checking the base alone and
|
||||
// accepting `{}` — which the schema rejects.
|
||||
const { branches } = resolveRootUnion({
|
||||
type: "object",
|
||||
properties: { email: { type: "string" }, phone: { type: "string" } },
|
||||
anyOf: [
|
||||
{ type: "object", required: ["email"] },
|
||||
{ type: "object", required: ["phone"] },
|
||||
],
|
||||
});
|
||||
expect(branches).toHaveLength(2);
|
||||
expect(branches[0].schema.required).toEqual(["email"]);
|
||||
expect(branches[1].schema.required).toEqual(["phone"]);
|
||||
});
|
||||
|
||||
describe("oneOf exclusivity", () => {
|
||||
it("offers a discriminated oneOf", () => {
|
||||
expect(
|
||||
|
|
|
|||
Loading…
Reference in a new issue