json-schema-diff icon indicating copy to clipboard operation
json-schema-diff copied to clipboard

feat: Add enum support with context-aware breaking change detection

Open domdomegg opened this issue 5 months ago • 0 comments

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 EnumAdd and EnumRemove change types with context flags (lhs_has_no_enum and rhs_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

domdomegg avatar Oct 07 '25 13:10 domdomegg