Style Diff
Overview
The diff command compares two Mapbox GL style JSONs at the property level. Instead of just showing which layers were added or removed, it tells you exactly which paint, layout, filter, and zoom properties differ between matched layers.
Usage
python -m elzar diff style/streets.json style/streets_classic.json
Output is organized into sections:
- REMOVED — layers only in the left file
- ADDED — layers only in the right file
- CHANGED — layers in both files with property differences
- REORDERED — layers that moved position
Each changed layer shows the property path and old → new values:
CHANGED road.highway.motorway
paint.line-color: "#fc8" → "#ffd700"
paint.line-width: 4 → 6
minzoom: 5 → 4
Options
--ignore-order
Suppress the REORDERED section. Useful when you only care about property changes, not layer ordering.
python -m elzar diff a.json b.json --ignore-order
--normalize-expressions
Convert legacy Mapbox GL filter syntax to the expression form before comparing. This prevents false diffs when one file uses ["==", "class", "motorway"] and the other uses the equivalent expression syntax.
python -m elzar diff a.json b.json --normalize-expressions
--sort-predicates
Sort children of all/any filter arrays before comparing. This treats ["all", A, B] and ["all", B, A] as identical.
python -m elzar diff a.json b.json --sort-predicates
--ignore-defaults
Suppress diffs where one side uses the Mapbox GL spec default value. For example, if one file has "line-cap": "butt" (the default) and the other omits it, this option treats them as identical.
python -m elzar diff a.json b.json --ignore-defaults
Combine them
python -m elzar diff a.json b.json \
--ignore-order \
--normalize-expressions \
--sort-predicates \
--ignore-defaults
What gets compared
For each layer present in both files:
| Property | Comparison |
|---|---|
type |
Layer type (fill, line, symbol, etc.) |
filter |
Deep equality on filter expression arrays |
minzoom / maxzoom |
Numeric comparison |
paint.* |
All paint properties — deep compare (handles interpolation stops, expressions, scalars) |
layout.* |
All layout properties — same as paint |
source / source-layer |
String comparison |
metadata.featureType |
Semantic identity |
metadata.elementTypes |
Semantic identity |
Skipped: id (match key), top-level name/sprite/glyphs/version.
Exit codes
| Code | Meaning |
|---|---|
0 |
Files are identical |
1 |
Differences found |
2 |
File error (not found, invalid JSON) |