Skip to content

fix(rulesets): duplicated-entry-in-enum - support null values - #2960

Merged
Patrycja-dz merged 2 commits into
stoplightio:developfrom
DougEdey-Slice:fix_enum_dupes
Jul 30, 2026
Merged

fix(rulesets): duplicated-entry-in-enum - support null values#2960
Patrycja-dz merged 2 commits into
stoplightio:developfrom
DougEdey-Slice:fix_enum_dupes

Conversation

@DougEdey-Slice

@DougEdey-Slice DougEdey-Slice commented May 21, 2026

Copy link
Copy Markdown
Contributor

Fixes #2959.

This handles null enum values, which is supported/required by OAS3.1 for nullable enums

This updates the tests & the ruleset to support nulls, which OAS3.0 does support: https://swagger.io/docs/specification/v3_0/data-models/enums/#nullable-enums

First time contributor so let me know if I need anything else :)

Checklist

  • Tests added / updated
  • Docs added / updated

Does this PR introduce a breaking change?

  • No

@DougEdey-Slice
DougEdey-Slice requested a review from a team as a code owner May 21, 2026 14:01
@slegarraga

Copy link
Copy Markdown
Contributor

Nice follow-up to the enum edge cases — null in enum arrays is easy to miss. From #2934 land: worth confirming resolved: false behavior on $ref-wrapped enums matches your test cases. Thanks for pushing this.

@slegarraga slegarraga left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM — null enum handling matches OAS 3.0 nullable enums and 3.1 semantics from #2959.

  • Test matrix covers null in enum arrays without false positives on valid enums.
  • validators.ts tweak is minimal and scoped to the duplicated-entry rule path.

No concerns from my side; thanks for the fix.

@slegarraga slegarraga left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM — null enum handling matches #2959; tests cover nullable enums without false positives. Thanks for the fix.

@slegarraga

Copy link
Copy Markdown
Contributor

@DougEdey-Slice Thanks — this addresses the regression from #2934 (my merge). Suggest adding a test case for issue #2959 reproducer (components.examples.*.value with foo: null) so we don’t regress the JSONPath guard again. Approved from my side.

@slegarraga

Copy link
Copy Markdown
Contributor

Opened #2963 with the #2959 reproducer test + same guard — happy to close #2963 if you prefer landing this PR instead.

@slegarraga

Copy link
Copy Markdown
Contributor

@tomek-tursa-sb Maintainer review when possible — 2 contributor approvals, fixes #2959 (production crash). Alternative: #2963 has the same guard + explicit reproducer test from the issue. Either PR unblocks users on spectral-cli 6.16.x.

carlhoerberg pushed a commit to cloudamqp/lavinmq that referenced this pull request May 25, 2026
## Summary
- Pin `@stoplight/spectral-rulesets` to `1.22.2` in the `lint-openapi`
target.
- `1.22.3` introduced a regression in the `duplicated-entry-in-enum`
rule that crashes Spectral with `Cannot read properties of null (reading
'enum')`. See
[stoplightio/spectral#2959](stoplightio/spectral#2959).
- Fix is in flight upstream
([#2960](stoplightio/spectral#2960) /
[#2963](stoplightio/spectral#2963))

---------

Co-authored-by: Patrik Ragnarsson <patrik@starkast.net>

@slegarraga slegarraga left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed this against #2959 and my own #2963, since they overlap.

The 3.1 coverage here is the right call: null is a valid enum member in OAS 3.1 (enum: [1, 2, 3, null]), and flagging duplicated nulls ([null, …, null] → items #0 and #6) is a real gap the original rule missed. Nice.

One coordination note: this and #2963 fix different facets of #2959 and will conflict on oas/index.ts and duplicated-entry-in-enum.test.ts. #2963 adds @ != null to the rule's given selector to stop a TypeError when the selector hits a null node (e.g. foo: null inside an example value, where reading @.enum throws). That null-node crash isn't exercised by the cases here (these are all schema enums), so I think both changes are needed: the selector guard to avoid the crash, plus your 3.1 null-entry semantics. Happy to rebase #2963 on top of this so it's a single clean change if that's easier to merge.

@DougEdey-Slice

Copy link
Copy Markdown
Contributor Author

@tomek-tursa-sb @pareshb3089 Could we get a review on this please?

@Patrycja-dz
Patrycja-dz merged commit eabe7f5 into stoplightio:develop Jul 30, 2026
8 checks passed
shyouhei added a commit to sacloud/sacloud-sdk-go that referenced this pull request Aug 3, 2026
I think we need to wait for:
stoplightio/spectral#2960

Signed-off-by: 卜部 昌平 <s-urabe@sakura.ad.jp>
stoplight-bot pushed a commit that referenced this pull request Aug 3, 2026
## [1.22.7](https://github.com/stoplightio/spectral/compare/@stoplight/spectral-rulesets-1.22.6...@stoplight/spectral-rulesets-1.22.7) (2026-08-03)

### Bug Fixes

* add GOPATH bin to PATH for ghr command ([#3008](#3008)) ([71cdeb1](71cdeb1))
* docker image release ([#3004](#3004)) ([e929dea](e929dea))
* **repo:** docker image ci cd ([#3009](#3009)) ([3a5c40c](3a5c40c))
* **repo:** docker image release ([#3000](#3000)) ([6af0317](6af0317))
* **repo:** docker image release ([#3001](#3001)) ([0234765](0234765))
* **repo:** docker image release ([#3002](#3002)) ([fa50e6a](fa50e6a))
* **repo:** docker image release ([#3003](#3003)) ([0f5d42a](0f5d42a))
* **repo:** docker image release ([#3005](#3005)) ([fd21616](fd21616))
* **repo:** docker image release ([#3006](#3006)) ([c62dbb7](c62dbb7))
* **repo:** fix ruleset test ([#3016](#3016)) ([0d46443](0d46443))
* **rulesets:** duplicated-entry-in-enum - support null values in enums when checking for duplicates ([#2960](#2960)) ([eabe7f5](eabe7f5))
* split binary build into separate steps ([#3007](#3007)) ([30aa1e0](30aa1e0))
* trigger release action ([#3026](#3026)) ([f85f1a6](f85f1a6))
* updated yarn lock ([#2992](#2992)) ([076f0d2](076f0d2))
* updates cli readme ([#2998](#2998)) ([dbcb26e](dbcb26e))

### Features

* **repo:** add scarf to docker image ([#3010](#3010)) ([cd88ea8](cd88ea8))
@stoplight-bot

Copy link
Copy Markdown
Collaborator

🎉 This PR is included in version 1.22.7 🎉

The release is available on @stoplight/spectral-rulesets-1.22.7

Your semantic-release bot 📦🚀

hdamker added a commit to camaraproject/tooling that referenced this pull request Aug 5, 2026
Upstream shipped the null-guard fix (stoplightio/spectral#2960) in
1.22.7, so the 1.22.2 pin from #329 is no longer needed. Lockfile now
resolves and hoists a single 1.22.7 copy.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Missing null guard causes "Cannot read properties of null (reading 'enum')"

6 participants