json-schema-diff
json-schema-diff copied to clipboard
feat: Add enum support with context-aware breaking change detection
Summary
Implements detection of JSON Schema enum changes with context-aware breaking change detection.
Resolves the issue where enum arrays being extended or reduced were not detected by the tool.
Changes
-
Added
EnumAddandEnumRemovechange types with context flags (lhs_has_no_enumandrhs_has_no_enum) -
Smart breaking change logic:
- Adding values to existing enum: non-breaking (accepts more data)
- Removing values from existing enum: breaking (rejects previously valid data)
- Adding enum constraint entirely: breaking (restricts previously valid data)
- Removing enum constraint entirely: non-breaking (accepts more data)
- Comprehensive test coverage: 9 test cases covering all scenarios including the real-world case from the issue
Examples
# Adding a value to existing enum (non-breaking)
$ json-schema-diff old.json new.json
{"path":"","change":{"EnumAdd":{"added":"debug","lhs_has_no_enum":false}},"is_breaking":false}
# Removing a value from existing enum (breaking)
$ json-schema-diff old.json new.json
{"path":"","change":{"EnumRemove":{"removed":"debug","rhs_has_no_enum":false}},"is_breaking":true}
# Adding enum constraint (breaking)
$ json-schema-diff old.json new.json
{"path":"","change":{"EnumAdd":{"added":"error","lhs_has_no_enum":true}},"is_breaking":true}
# Removing enum constraint (non-breaking)
$ json-schema-diff old.json new.json
{"path":"","change":{"EnumRemove":{"removed":"error","rhs_has_no_enum":true}},"is_breaking":false}
Fixes #38