Skip to content

fix: apply sibling keywords when dereferencing $ref - #870

Open
haoku123 wants to merge 1 commit into
fastify:mainfrom
haoku123:fix/ref-sibling-keywords
Open

fix: apply sibling keywords when dereferencing $ref#870
haoku123 wants to merge 1 commit into
fastify:mainfrom
haoku123:fix/ref-sibling-keywords

Conversation

@haoku123

Copy link
Copy Markdown

Fixes #866

When a schema contains $ref alongside sibling keywords (e.g. { $ref: 'Foo', required: ['extra'] }), buildValue resolved the reference and replaced the local schema wholesale, silently discarding the siblings. Objects missing a sibling-required field were serialized as valid.

Solution

Added resolveRefLocation(): schemas containing $ref alone keep the direct-dereference fast path; schemas with siblings merge the resolved reference with the sibling keywords using the same mergeLocations path as allOf (required arrays are unioned by @fastify/merge-json-schemas). All eager resolveRef call sites in buildInnerObject and buildArray now route through it, so properties, array items and tuple items behave consistently.

Tests

  • ref external with sibling required keyword keeps both constraints: missing sibling-required field throws.
  • ref external with sibling required keyword keeps ref constraints: missing ref-required field still throws.

Full suite: 493/493 pass, lint clean.

buildValue resolved $ref by replacing the whole schema, discarding
sibling keywords like required. A property such as
{ $ref: 'Foo', required: ['extra'] } serialized objects missing 'extra'
without raising, letting incomplete data pass silently.

Resolve $ref with siblings by merging the resolved reference with the
sibling keywords (same mergeLocations path used by allOf), keeping the
direct-dereference fast path for schemas containing $ref alone. All
call sites that eagerly resolve $ref now share resolveRefLocation so
properties, array items and nested object properties behave the same.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Sibling required keyword is dropped when a property uses $ref to an external schema

1 participant