All notable changes to this project will be documented in this file.

[0.27.0] - 2026-11-04

New JSV.valid?/2 function: it returns a boolean and stops at the first error. It skips building errors and tracking the paths used to report them, so it is cheaper than JSV.validate/3 when the errors are not needed. Cast functions are still called, because a failing cast makes the data invalid, but the cast data is not returned. Thanks to @larshesel for this contribution (#155).

JSV.validate/3 is also faster: it executes 4% to 11% fewer instructions than in 0.26.2 on the library benchmarks, and more on schemas using $ref or module schemas.

Custom vocabularies. With JSV.valid?/2, the first error stops the whole validation. Keywords that test the result of a subschema and can accept the data that the subschema rejects, like not, anyOf or contains, must validate it with JSV.Validator.validate_detach/4, or with the new JSV.Validator.validate_in_detach/6 for a property or array item. With validate/3, validate_in/6 or validate_as/4, such keywords would wrongly reject data under JSV.valid?/2. Results with JSV.validate/3 are unchanged. The JSV.Vocabulary documentation describes which function to use.

The validators and opts fields of the validation context moved to an internal config field. Read them with JSV.Validator.ValidationContext.config/2, for instance ValidationContext.config(vctx, :opts).

๐Ÿš€ Features

  • Add JSV.valid?/2, a fail-fast validation mode (#155) (Lars Hesel Christensen)

๐Ÿšœ Refactor

  • Reduce fail-fast validator helpers to validatedetach and validate_in_detach (_lud)

โšก Performance

  • Pin benchmarks to one CPU and count instructions per call (lud)
  • Group constant validation context fields in a record (lud)
  • Read the fail-fast flag in existing context matches (lud)
  • Limit validator context lookups when changing scope (lud)
  • Report allocated words per call in benchmarks (lud)
  • Update the validator context only once when entering and leaving a $ref (lud)

๐Ÿงช Testing

  • Cover fail-fast catches in 'contains', if and custom keywords (lud)

โš™๏ธ Miscellaneous Tasks

  • Make JSV.Validator.Error type non-opaque (lud)

[0.26.2] - 2026-10-31

Security fix: CVE-2026-117680 / GHSA-cvmg-hgv6-jqcp. All users validating untrusted data against schemas with pattern or patternProperties should upgrade.

When a regex exhausted its backtracking budget, the match was reported as a non-match. Data that matches a pattern only after heavy backtracking could then skip patternProperties subschemas, be validated by additionalProperties instead, or pass a not: {pattern: ...} deny-list.

An exhausted budget is now an indeterminate result: validation stops and returns a JSV.ValidationError with a single error of kind indeterminate_pattern, which combinators cannot invert. Such data is now always rejected, even when it would match. If valid data gets rejected this way, rewrite the pattern without nested quantifiers or overlapping alternatives.

minLength and maxLength now count Unicode code points instead of grapheme clusters, as required by the specification. For instance "รฉ" written as e followed by U+0301 now has a length of 2.

๐Ÿ› Bug Fixes

  • Count minLength and maxLength in code points (#151) (Lars Hesel Christensen)
  • Fail validation when a regex exhausts its backtracking budget (lud)

โšก Performance

  • Keep a single cast stack per data level (lud)
  • Zip array items with their schemas without streams (#153) (Lars Hesel Christensen)

๐Ÿงช Testing

  • Updated JSON Schema test suite (lud)
  • Run stderr capturing tests synchronously (lud)

[0.26.1] - 2026-10-14

๐Ÿš€ Features

  • Strict RFC 3339 validation for date, time and date-time formats (lud)

๐Ÿ› Bug Fixes

  • Reject comma as decimal separator in date-time format (lud)

[0.26.0] - 2026-10-04

๐Ÿš€ Features

  • Expose error context data in normalized keyword errors (lud)

[0.25.0] - 2026-09-25

๐Ÿš€ Features

  • Allow to configure current stacktrace for build warnings (lud)

[0.24.0] - 2026-09-23

๐Ÿš€ Features

  • Warn on unresolved module atoms during schema normalization (lud)

๐Ÿงช Testing

  • Updated JSON Schema Test Suite (lud)

[0.23.1] - 2026-09-21

๐Ÿ› Bug Fixes

  • Rename 'default' error level to 'cause' (lud)

[0.23.0] - 2026-09-17

๐Ÿš€ Features

  • Allow hiding intermediary errors in error formatter (lud)

๐Ÿ› Bug Fixes

  • Accept compressed IPv6 and embedded IPv4 hosts in uri and iri formats (lud)
  • Fix propertyNames schemaLocation on errors (lud)

๐Ÿงช Testing

  • Updated JSON Schema Test Suite (lud)

โš™๏ธ Miscellaneous Tasks

  • Limit justfile verbosity on mix.deps (lud)

[0.22.0] - 2026-08-07

๐Ÿš€ Features

  • Implement uniqueItems for Decimal (lud)

๐Ÿ› Bug Fixes

  • Raise explicit message on defschema without :properties (lud)

๐Ÿšœ Refactor

  • Extract test suite generation into JSV.TestSuiteGenerator (Ludovic Dem)

๐Ÿงช Testing

  • Render floats as erlang would decode them when generating test suite (lud)
  • Updated JSON Schema Test Suite (lud)
  • Updated JSON Schema Test Suite and updated conformity tests (lud)

โš™๏ธ Miscellaneous Tasks

  • Document invalid JSON files in JSON Schema Test Suite (lud)

[0.21.2] - 2026-07-10

๐Ÿ› Bug Fixes

  • Ignore httpc cache chmod tests on windows (Ludovic Dem)
  • Add missing type: object on arprops schema helper (lud)

๐Ÿ“š Documentation

  • Added missing docs for public API (lud)

[0.21.1] - 2026-07-06

๐Ÿš€ Features

  • Allow to define @doc above defschema to document jsonschema/0 generated function (_lud)

[0.21.0] - 2026-07-05

๐Ÿ› Bug Fixes

  • Prevent infinite recursion in cross ref schemas (lud)
  • [breaking] JSV.Resolver.Httpc security defaults (no redirects, TLS verification, private atomic cache, size/timeout limits) (lud)
  • Bound regex backtracking cost in pattern and patternProperties matching (lud)
  • Support dynamicAnchor in id-less root schemas and fail gracefully on malformed keywords (lud)

๐Ÿ“š Documentation

  • Document internal resolver security considerations (lud)

๐Ÿงช Testing

  • Updated JSON Schema Test Suite (lud)
  • Updated JSON Schema Test Suite (lud)

[0.20.0] - 2026-06-26

๐Ÿš€ Features

  • Removed NimbleOptions dependency and changed internal options to use maps (lud)

๐Ÿšœ Refactor

  • Skip tracking casts and unevaluated paths when schemas do not need it (lud)

[0.19.6] - 2026-06-25

๐Ÿ› Bug Fixes

  • Support unicode general categories in pattern/patternProperties (lud)

๐Ÿงช Testing

  • Updated JSON Schema Test Suite (lud)

[0.19.5] - 2026-06-15

๐Ÿ› Bug Fixes

  • Properly handle Draft-7 style anchor IDs (lud)

๐Ÿงช Testing

  • Updated JSON Schema Test Suite (lud)

[0.19.4] - 2026-06-07

๐Ÿ› Bug Fixes

  • Fixed nested anchor resolution without root namespace (lud)

[0.19.3] - 2026-05-30

๐Ÿ› Bug Fixes

  • Allow module-based schemas in schema helpers typespecs (lud)

[0.19.2] - 2026-05-29

๐Ÿ› Bug Fixes

  • Make local resolver work on Windows (#95) (Ludovic Dem)
  • Reject +/- prefixes on 'date' format (lud)

โš™๏ธ Miscellaneous Tasks

  • Updated JSON Schema test suite (lud)
  • Fix compilation warnings for Elixir 1.20 (lud)

[0.19.1] - 2026-05-13

๐Ÿš€ Features

  • Return better stacktraces in builder warnings (lud)

[0.19.0] - 2026-05-10

๐Ÿš€ Features

  • [breaking] New cast system see https://hexdocs.pm/jsv/002-api-changes-v0-19.html (#90) (Ludovic Dem)
  • [breaking] Converted schema presets to new cast system (lud)
  • Added schema build warnings on atom casters (#91) (Ludovic Dem)
  • Pass raw schema to casters at build time (lud)
  • Added the aprops and arprops helpers to cast properties schemas to atom keys (lud)
  • Removed the deprecated schema presets in JSV.Schema (lud)
  • [breaking] Support Decimal 3.0 and drop support for Poison (lud)

๐Ÿ› Bug Fixes

  • MultipleOf with Decimal support (lud)
  • Ignore examples keyword when scanning schema (lud)
  • Nullable() will now add nil to enums (lud)

๐Ÿ“š Documentation

  • Document buildkey usage with refs (_lud)
  • Reference drop of Poison support in migration guide (lud)

โš™๏ธ Miscellaneous Tasks

  • Added roadmap section to readme (lud)
  • Refactor of the JSON Schema test suite generators (lud)
  • Simplify built-in casts output syntax (lud)

[0.18.3] - 2026-04-21

๐Ÿ› Bug Fixes

  • Fixed schema scanning around non-schemas like properties (lud)
  • Allow to dereference numeric pointers from maps in refs (lud)

โš™๏ธ Miscellaneous Tasks

  • Updated JSON Schema Test Suite (lud)

[0.18.2] - 2026-04-19

๐Ÿ› Bug Fixes

  • Allow root $ref to resolve against root $id in Draft-7 (lud)

๐Ÿ“š Documentation

  • Fixed documentation for httpc resolver (lud)

โš™๏ธ Miscellaneous Tasks

  • Updated JSON Schema test suite (lud)

[0.18.1] - 2026-04-08

๐Ÿš€ Features

  • Return a BuildError instead of raising a RuntimeError for :invalidproperties (_Bruce Williams)

[0.18.0] - 2026-04-02

๐Ÿš€ Features

  • [breaking] Removed support for deprecated schema/0 export from schema modules (lud)

[0.17.1] - 2026-03-19

๐Ÿ› Bug Fixes

  • Revert undesired regex compilation change (lud)

โš™๏ธ Miscellaneous Tasks

  • Relax idna version requirements (lud)

[0.17.0] - 2026-03-19

๐Ÿš€ Features

  • New return type signature for custom error formatters (lud)
  • [breaking] Read and consume module attributes for defschema/3 (lud)

๐Ÿงช Testing

  • Upgraded JSON Schema Test Suite (lud)

โš™๏ธ Miscellaneous Tasks

  • Updated license to Apache-2.0 (lud)

[0.16.0] - 2026-01-20

๐Ÿš€ Features

  • [breaking] Changed schema titles for JSV.KeywordError, JSV.ValidationError and JSV.ValidationUnit (lud)

[0.15.2] - 2026-01-19

๐Ÿ› Bug Fixes

  • Fixed type error on serialization optional values (lud)

[0.15.1] - 2026-01-06

๐Ÿš€ Features

  • Added :asroot option for normalize_collect (_lud)

๐Ÿ› Bug Fixes

  • Do not add description to schema with defschema/3 if nil (lud)

[0.15.0] - 2026-01-06

๐Ÿš€ Features

  • Added JSV.Schema.normalizecollect to generate self-contained schemas from modules (_lud)
  • Added the nullable/1 schema helper (Jaden)

๐Ÿ“š Documentation

  • Fixed docs for the optional helper (lud)

[0.14.0] - 2025-12-30

๐Ÿš€ Features

  • Allow to use schema helpers with import JSV and defschema/3 (lud)
  • Added json serialization skip option in optional() properties (lud)

[0.13.1] - 2025-11-26

๐Ÿ› Bug Fixes

  • Invalidate empty labels in hostname validation (lud)

[0.13.0] - 2025-11-25

๐Ÿš€ Features

  • Relax additional properties in error schemas (lud)
  • Support the @skipkeys attribute for structs created with defschema (_lud)
  • New hostname validator based on :idna (new JSON Schema suite tests) (lud)

[0.12.0] - 2025-11-19

๐Ÿš€ Features

  • Support normalizing structs into non-map values in the Normalizer (lud)
  • Added support for collecting additionalProperties in structs (lud)

[0.11.5] - 2025-11-12

๐Ÿ› Bug Fixes

  • Relax Poison dependency version constraints (lud)

๐Ÿ“š Documentation

  • Document function groups in main JSV module (lud)

[0.11.4] - 2025-10-23

๐Ÿ› Bug Fixes

  • Ignore all error values from Code.ensurecompiled (_lud)

[0.11.3] - 2025-10-23

๐Ÿ› Bug Fixes

  • Fixed module-based schema loading in Elixir 1.19 (lud)

[0.11.2] - 2025-10-13

๐Ÿ“š Documentation

  • Fixed doc on schema preset helpers (lud)

[0.11.0] - 2025-09-16

๐Ÿš€ Features

  • [breaking] ABNF parsers are now automatically enabled (lud)

๐Ÿงช Testing

  • Updated JSON Schema Test Suite (lud)

โš™๏ธ Miscellaneous Tasks

  • Updated README.md (lud)

[0.10.1] - 2025-08-11

๐Ÿš€ Features

  • Export required keys from generated struct modules (lud)

โš™๏ธ Miscellaneous Tasks

  • Fix JSON tests for elixir 1.17 (lud)

[0.10.0] - 2025-07-10

๐Ÿš€ Features

  • Define and expect schema modules to export jsonschema/0 instead of schema/0 (_lud)
  • Allow to call defschema with a list of properties (lud)
  • Added the defschema/3 macro to define schemas as submodules (lud)

๐Ÿ› Bug Fixes

  • Ensure defschema with keyword syntax supports module-based properties (lud)

[0.9.0] - 2025-07-05

๐Ÿš€ Features

  • Provide a schema representing normalized validation errors (lud)
  • Deprecated the schema composition API in favor of presets (lud)

๐Ÿ› Bug Fixes

  • Emit a build error with empty oneOf/allOf/anyOf (lud)
  • Reset errors when using a detached validator (lud)
  • Ensure casts are applied after all validations (lud)
  • Revert default normalized error to atoms (lud)

โš™๏ธ Miscellaneous Tasks

  • Define titles for normal validation error schemas (lud)

[0.8.1] - 2025-06-29

โš™๏ธ Miscellaneous Tasks

  • Export the localswithout_parens formatter opts for public macros (_lud)

[0.8.0] - 2025-06-23

๐Ÿš€ Features

  • Declare formatting support from main JSON codec (lud)
  • Added the JSV.validate! bang functions (lud)
  • Added explicit error when a sub schema is not buildable (lud)
  • Export JSV.resolverchain/1 for integration in 3rd parties (_lud)
  • [breaking] Defschema does not automatically define $id anymore (lud)
  • Added stringto_number and string_to_boolean casters (_lud)
  • Return sub errors when oneOf has no matches (lud)
  • Order sub-errors by ascending item index in array validation (lud)
  • Added ability to build only a nested schema or multiple schemas (lud)
  • Expose the map extensions helpers (lud)
  • Added the prewalk traverse utility for schema normalization (lud)
  • [breaking] Error normalizer will now sort error by instanceLocation (lud)
  • [breaking] Changed caster tag of defschema to 0 (lud)
  • Allow custom formats to validate other types than strings (lud)
  • Provide a function to create reference from a list of path segments (lud)

๐Ÿ› Bug Fixes

  • Ensure keys are json-pointer encoded in instanceLoction in errors (lud)
  • Return meaningful error for unknow keys in :required in defschema (lud)
  • Fixed typespec on JSV.buildkey! (_lud)
  • Fixed typespec and argument name in Builder.build! (lud)

๐Ÿšœ Refactor

  • Renamed Schema.override/2 to Schema.merge/2 (lud)
  • Defined different typespecs for normal schema and native schema (lud)
  • Build error will now be raised with a proper stacktrace (lud)
  • Removed useless accumulation of atoms when normalizing schemas (lud)
  • [breaking] Changed order of arguments for Normalizer.normalize/3 (lud)
  • Renamed buildroot to to_root as it is not building validators (_lud)

๐Ÿ“š Documentation

  • Rework Decimal support limitations (lud)

๐Ÿงช Testing

  • Verify that unknown formats are ignored when formats assertion is disabled (lud)

โš™๏ธ Miscellaneous Tasks

  • Clarify defschema error when no properties are given (lud)
  • Fix warning when Poison.EncodeError is not defined (lud)
  • Updated JSON Schema Test Suite (lud)
  • Renamed keycast module attribute to jsvkeycast in defschema (_lud)
  • Provide correct line/column in debanged functions (lud)
  • Allow to customize Inspect for Builder and Resolver (lud)
  • Fix Elixir 1.19 warnings (lud)

[0.7.2] - 2025-05-08

๐Ÿš€ Features

  • Added the nonempty_string schema helper (_lud)
  • Atom enums will use stringto_atom to support compile-time builds (_lud)

โš™๏ธ Miscellaneous Tasks

  • Updated JSON Schema Test Suite (lud)
  • Enhanced JSTS updater (lud)
  • Fixed warning on code when Decimal is missing (lud)

[0.7.1] - 2025-04-27

๐Ÿ› Bug Fixes

  • Fixed hex package definition (lud)

[0.7.0] - 2025-04-27

๐Ÿš€ Features

  • Mailaddress dependency is no longer used (_lud)
  • Validation support for Decimal (lud)

๐Ÿ“š Documentation

  • Updated doc examples with generated code (lud)

๐Ÿงช Testing

  • Enable tests for the 'uuid' format (lud)
  • Enable tests for the 'hostname' format (lud)
  • Enable tests for all uri/iri/pointer formats (lud)

โš™๏ธ Miscellaneous Tasks

  • Changed JSON schema test suite updater (lud)

[0.6.3] - 2025-04-13

โš™๏ธ Miscellaneous Tasks

  • Fix missing file in hex package breaking installs (lud)

[0.6.2] - 2025-04-13

๐Ÿš€ Features

  • Added Jason/Poison/JSON encoder implementations for JSV.NValidationError (lud)

[0.6.1] - 2025-04-13

โš™๏ธ Miscellaneous Tasks

  • Use mixversion for release process (_lud)

[0.6.0] - 2025-04-13

๐Ÿš€ Features

  • Resolvers do not need to normalize schemas anymore (lud)
  • Added support to override existing vocabularies (lud)
  • Schema definition helpers do not enforce a Schema struct anymore (lud)
  • Provide a generic JSON normalizer for data and schemas (lud)
  • Allow resolvers to mark schemas as normalized (lud)
  • [breaking] Use jsv-cast keyword in schemas for struct and cast functions (lud)

๐Ÿ› Bug Fixes

  • Removed conversion to string in codec formatto_iodata (_lud)

๐Ÿ“š Documentation

  • Fix documentation grammar and typos (lud)
  • Organize docs sidebar in categories (lud)

โš™๏ธ Miscellaneous Tasks

  • Update Elixir Github workflow (#17) (Ludovic Dem)
  • Use absolute path for JSTS ref file (lud)

[0.5.1] - 2025-03-28

๐Ÿ› Bug Fixes

  • Fixed compilation with Mix.install (lud)

โš™๏ธ Miscellaneous Tasks

  • Release v0.5.1 (lud)

[0.5.0] - 2025-03-25

๐Ÿš€ Features

  • Added JSV.Resolver.Local to resolve disk stored schemas (lud)
  • Special error format for additionalProperties:false (lud)
  • Provide correct schemaLocation in all errors (lud)
  • Added defschemafor to use different modules for schema and struct (_lud)
  • Provide ordered JSON encoding with native JSON modules (lud)

๐Ÿ› Bug Fixes

  • Check presence of JSON module in CI (lud)

๐Ÿงช Testing

  • Make JSON codecs easier to test (lud)
  • Fixed assertions for JSON codec on old OTP versions (lud)

โš™๏ธ Miscellaneous Tasks

  • Refactored schema normalization (lud)
  • Removed unused alias (lud)
  • Use readmix to generate formats docs (lud)

[0.4.0] - 2025-02-08

๐Ÿš€ Features

  • Support module-based schemas with structs (lud)

[0.3.0] - 2025-01-08

๐Ÿš€ Features

  • Added a default resolver using static schemas (lud)

๐Ÿ› Bug Fixes

  • Upgrade abnfparsec to correctly parse IRIs and IRI references (_lud)

[0.2.0] - 2025-01-03

๐Ÿ“š Documentation

  • Document atom conversion (lud)
  • Document functions with doc and spec (lud)

[0.1.0] - 2025-01-01