fix(rulesets): duplicated-entry-in-enum - support null values - #2960
Conversation
…s when checking for duplicates
|
Nice follow-up to the enum edge cases — null in enum arrays is easy to miss. From #2934 land: worth confirming |
slegarraga
left a comment
There was a problem hiding this comment.
LGTM — null enum handling matches OAS 3.0 nullable enums and 3.1 semantics from #2959.
- Test matrix covers null in
enumarrays without false positives on valid enums. validators.tstweak is minimal and scoped to the duplicated-entry rule path.
No concerns from my side; thanks for the fix.
slegarraga
left a comment
There was a problem hiding this comment.
LGTM — null enum handling matches #2959; tests cover nullable enums without false positives. Thanks for the fix.
|
@DougEdey-Slice Thanks — this addresses the regression from #2934 (my merge). Suggest adding a test case for issue #2959 reproducer ( |
|
@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. |
## 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
left a comment
There was a problem hiding this comment.
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.
|
@tomek-tursa-sb @pareshb3089 Could we get a review on this please? |
I think we need to wait for: stoplightio/spectral#2960 Signed-off-by: 卜部 昌平 <s-urabe@sakura.ad.jp>
## [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))
|
🎉 This PR is included in version 1.22.7 🎉 The release is available on Your semantic-release bot 📦🚀 |
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.
Fixes #2959.
This handles
nullenum values, which is supported/required by OAS3.1 for nullable enumsThis 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
Does this PR introduce a breaking change?