# Versions Document

## 0.1.0

- initial release
- support for JSONSchema-draft 6 and almost all of JSONSchema-draft 7

## 0.1.1
- defp support
- function_from_file support
- format_options -> format
- specification for broad formatting
- ability to use other decoders (e.g. YAML)

# 0.2.0
- error details for compositions like anyOf, oneOf
- "ref traces" for jumping through references
- support for draft-4, draft-6, draft-7 and draft-2019, draft-2020

# 0.2.1
- expose missing `required` as an extra paramter

# 0.2.2
- fixes it so that defp content with metadata don't cause compilation
  errors

# 0.3.0
- switch to using `:json_ptr` library
- implementation of `unevaluatedItems` and `unevaluatedProperties`

# 0.3.1
- pinned elixir version to minimum 1.14.1, due to use of Macro.expand_literals

# 0.3.2
- changed common uri to exonerate:// over function:// -- this allows for resources
  to be pinned based on sha256 of the schema
- store string content using resource id.
- refactors array processing for performance
- changes `dump: true` to provide function names which can be copy/pasted into
  elixir and recompiled.
- `maybe_dump` function now expands macros inside of functions.

# 0.3.3
- fixes a bug where prefixItems are never evaluted before items

# 1.0.0
- fixes regression where id properties are labelled as ids
- moves to using JsonPtr 

# 1.0.1
- fixes problem where $ref walking doesn't properly substitute location

# 1.1.0
- deprecates `:content_type` option and renames it `:encoding`

# 1.1.1
- updates elixir versioning requirements

# 1.1.2
- adds extra message when the reference pointer is not found
- fixes bug where references are not recursively cached when the entrypoint
  isn't the root entrypoint

# 1.1.3
- fixes bug in degeneracy calculations

# 1.2.0

## New Features
- adds single-pass optimization for allOf combining filters with property-only sub-schemas
  - when allOf contains 2+ sub-schemas that only have properties/patternProperties,
    consolidates validation into a single iteration pass instead of once per sub-schema
  - reduces iteration complexity from O(N×M) to O(M) where N = sub-schemas, M = properties
- adds decimal mode for precise numeric validation
- adds support for gzip compressed schema files
- adds Bowtie test harness integration
- generates narrowed @spec based on schema type constraints
- adds expected type to type mismatch errors

## Performance
- eliminates lambdas in combining filters for better performance
- refactors compile-time architecture for consistent combining filter handling
- implements two-phase compilation for consistent function naming

## Bug Fixes
- fixes typing warnings in anyOf and decimal mode
- fixes schemas with id/$id failing when using $ref to definitions
- fixes relative file $ref with fragment losing the fragment
- propagates type constraints to combining schemas (fixes #85)
- fixes type checker warnings for visited = false (fixes #87)
- fixes relative path refs support

## Breaking Changes
- reverts `:encoding` option back to `:content_type` (`:encoding` is now deprecated)
  - this reverses the change made in 1.1.0
  - `:encoding` still works but emits a deprecation warning
- decimal mode changes numeric validation behavior
  - when enabled, numbers are validated using Decimal for precise comparisons
  - this may cause different validation results for edge cases involving floating point

# 1.2.1
- updates to match_spec 1.0.0
- makes Jason optional, preferring built-in JSON module (Elixir 1.18+)
- moves Bowtie test harness to test/support

# 1.2.2
- Elixir 1.20 type-checker cleanliness (compiles with --warnings-as-errors):
  - mark generated object-iterator functions `generated: true` so unreachable
    error clauses in infallible-filter schemas aren't flagged redundant
  - drop a redundant `is_list/1` guard in the format filter
  - remove a dead `is_charlist?([])` clause (empty list handled by the caller)
  - group `build_filter/4` clauses in the uniqueItems filter
- move `preferred_cli_env` into `def cli` (Mix deprecation)
- update stale README error-tuple examples (now include `expected:`)