46 KiB
Vendored
Malli CHANGELOG
We use Break Versioning. The version numbers follow a <major>.<minor>.<patch> scheme with the following intent:
| Bump | Intent |
|---|---|
major |
Major breaking changes -- check the changelog for details. |
minor |
Minor breaking changes -- check the changelog for details. |
patch |
No breaking changes, ever!! |
-SNAPSHOT versions are preview versions for upcoming releases.
Malli is in well matured alpha.
UNRELEASED
- Compile recursive functions for recursive validators #1245
0.20.0 (2025-11-17)
- Optimize -parent-child-transformer #1239
- Robust
:andparser, add:andn#1182- Correctly handle recursive schemas #1234
- Add JDK 25 to CI #1233
0.19.2 (2025-10-06)
- Performance improvements in
malli.transform/transformer#1220 andmalli.core/-intercepting#1219 malli.clj-kondo/emit!saves to.clj-kondo/importsnow as recommended by clj-kondo. #1216malli.clj-kondo/emit!no longer deletes anything automatically. Usemalli.clj-kondo/clean!to clean up.- Add
malli.core/old-parse-formatfor converting output ofparseto the pre-0.18.0 format. #1223 - FIX: Malli dev-mode no longer throws
java.lang.UnsupportedOperationExceptionwhen printing out an#instof typejava.sql.Date#1214 - Updated dependencies:
borkdude/edamame '1.4.30' to '1.4.32'
fipp '0.6.27' to '0.6.29'
0.19.1 (2025-06-09)
- Technical release
0.19.0 (2025-06-09)
- BREAKING FIX:
json-transformeris now better at inferring en/decoders for:enumand:=. #1205- For example
[:enum 1 2 3]gets encoded as a JSON number, not a string. - If you need the old behaviour, you can override the en/decoders using properties. See docs.
- For example
- Value generation:
:+and:*now support generator directives:gen/min,:gen/maxas well as:minand:maxschema directives #1208 - CLJS bundle size reduced #1211
- FIX:
:default/fnnow works in map entry properties in addition to schema properties #1209
0.18.0 (2025-05-12)
- BREAKING Output of
parsenow uses newmalli.core.Tagandmalli.core.Tagsrecords for:orn,:multi,:altn,:catnetc. #1123 #1153 - BREAKING Swagger and JSON-Schema outputs now use
.instead of/(encoded as~1) as the separator. #1183- This will only affect you if you rely on the exact name of the schema
- Docs: elaborate optional-keys and required-keys #1117
- JSON Schema for
:tuplenow uses"prefixItems"#1151 - FIX:
:pathwhen explaining:referrors #1106 - FIX: don't instrument functions with primitive type hints (like
^double), instead, emit a warning #1176 - FIX:
:map-ofand:mapdecode now retain the input map type (eg.sorted-map) #1189 - FIX: schemas and into-schemas are printed to the console and the REPL in CLJS the same way as they are in CLJ. #1186
- FIX:
:mergeand:unionnow work with 1 child. With no children, throw a clearer error. #1147 - FIX:
default-value-transformerfor:refs inside:maps #1145 - FIX: generator for
empty?schema #1196
0.17.0 (2024-12-08)
- Don't output
:definitions nilin swagger. #1134 - BREAKING:
:gen/fmapproperty requires its schema to create a generator.- previous behavior defaulted to a
nil-returning generator, even if the schema doesn't acceptnil - use
:gen/return nilproperty to restore this behavior
- previous behavior defaulted to a
- Support decoding map keys into keywords for
[:mapschemas injson-transformer#1135 :nothumanizer #1138- FIX:
:seqablegeneratesnilwhen:minis greater than 0 #1121 - FIX:
malli.registry/{mode,type}not respected in Babashka #1124 - FIX:
:floataccepts doubles but never generates them #1132 - FIX:
:floatmissing humanizer #1122 - Updated dependencies:
fipp/fipp '0.6.26' to '0.6.27'
0.16.4 (2024-08-30)
- Distribute
:mergeover:multi#1086, see documentation :multiwith keyword:dispatchaccumulates data to generated values #1095- Allow
m/-proxy-schemachild to be adelay#1090 json-transformerdecodes 123.0 into 123 for schemas like:int,pos-int?etc. #986- Fix
malli.dev.prettythrows when explaining errors in nested maps #1094 - Fix ClojureScript arithmetic warning
- Fix
(-some-pred [])should returnfalse#1101 - Doc
mu/assocandmu/dissoconly handle one key at a time #1099 - Try to make
map-of-min-max-testless flaky by fixing seed #1098 - Updated dependencies:
borkdude/edamame '1.4.25' to '1.4.27'
0.16.3 (2024-08-05)
:->added to default registry, see documentation.- New
:seqableand:everyschemas #1041, see docs - Fix OOM error with infinitely expanding schema #1069
- Correctly form prop-less schemas that have map/nil as first child #1071
- Support min/max on uncountables like eductions #1075
- Fix clj-kondo can't parse config.edn written by
(malli.dev/start!)#1083 - unstrument before instrumenting #1081
- Replace
.entryAtwith.valAtduring validation #1079 - Corrected DEPRECATED warning for
m/-simple-schema#1077
0.16.2 (2024-06-30)
- Experimental
:->for simpler function defintions (not available on default schema registry) #1027
[:-> :any] ; [:=> :cat :any]
[:-> :int :any] ; [:=> [:cat :int] :any]
[:-> [:cat :int] :any] ; [:=> [:cat [:cat :int]] :any]
[:-> a b c d :any] ; [:=> [:cat a b c d] :any]
;; guard property
[:-> {:guard (fn [[[arg] ret]] ...)} :string :boolean]
; [:=> [:cat :string] :boolean [:fn (fn [[[arg] ret]] ...)]]
- Fix
mu/get-infor false-y keys #1065 - Add
:float#1055 - Make clj-kondo dir configurable #1062
- Improve doc for transformers #1058
:doublegenerates Long if:min is Long #1034- Fix Swagger definitions collecting #1002
0.16.1 (2024-04-30)
- Enabled Java8 tests back, no need to limit the version.
0.16.0 (2024-04-20)
- BREAKING: minimum Java-version is now Java11
- allow changing prefix of json-schema $refs via option
:malli.json-schema/definitions-path#1045 - Inline refs in non-
:bodyswagger parameters #1044 - Fix flaky test #1040
- Utility to update entry properties:
mu/update-entry-properties#1037 - Fix actions cache #1036
- Only humanize one of
:min/:maxwhen different #1032 - Distinguish between symbols and strings in humanize #1031
- Fix
:map-of:minand unreachable generator, explain such-that failures #1029
0.15.0 (2024-03-23)
:=>takes optional 3rd child, the guard schema validating vector of arguments and return value[args ret]. See Function Guards for more details. Fixes #764 and #764.
;; function of arg:int -> ret:int, where arg < ret
[:=>
[:cat :int]
:int
[:fn (fn [[[arg] ret]] (< arg ret))]]
-
BREAKING:
malli.generator/function-checkerreturns explanations under new keys:::mg/explain-input->::m/explain-input::mg/explain-output->::m/explain-output- new
::m/explain-guardto return guard explanation, if any
-
m/explainfor:=>returns also errors for args, return and guard if they exist -
FIX
m/deref-recursivedoesn't play nice with:mergeschema #997 via #999 -
FIX nested
:repeatsequence schema's doesn't seem to work #761 via #1024 -
FIX Invalid Swagger JSON with
[:or :nil]alternatives #1006 via #1023 -
FIX
(explain :tuple [])#1022 -
Enforce entry specs in open map destructurings #1021
-
FIX
goog/mixinwas deprecated and is now removed #1016 -
Updated dependencies:
borkdude/edamame 1.3.23 -> 1.4.25
0.14.0 (2024-01-16)
- Better development-time tooling
- New
m/deref-recursiveto recursive deref all schemas (not:refs) - FIX: Malli generates incorrect clj-kondo spec for :fn schemas #836 via #987
- Support for Var references #985, see guide for details.
- BREAKING:
m/coerceandm/coercerthrow::m/coercioninstead of::m/invalid-input - New Guide for Reusable Schemas
- Less printing of Var instumentation
- BREAKING: qualified symbols are valid reference types #984
- Fixing
mt/strip-extra-keys-transformerfor recursive map encoding #963 - Support passing custom
:typein into-schema opt for:mapand:map-of#968 mu/path->inworks with:orn,:catnand:altn.
0.13.0 (2023-09-24)
- BREAKING Fallback to use result of first branch when decoding
:orand:orn, #946 - BREAKING:
decodefor:doubleanddouble?in cljs doesn't allow trailing garbage any more #942 - Faster generators for
:map, #948 & #949 - FIX:
:altncan't handle just one child entry when nested in sequence schema #945 - Officially drop Clojure 1.10 support. Tests haven't passed for some time with Clojure 1.10, but this was not noticed due to a faulty CI setup.
- Use type inferrer when encoding enums #951
- Use
bound-fninmalli.dev/start!to preserve*out*#954 - FIX: Malli generates invalid clj-kondo type spec for [:map [:keys [:+ :keyword]]] #952
- FIX:
malli.experimental.describedescriptions of:minand:maxare backwards #959 - FIX: Malli tuple should generate clj-kondo seqable #962
0.12.0 (2023-08-31)
- FIX: retain order with
:catnunparse, fixes #925 - BREAKING: Do not require timezone data directly for cljs #898 with
malli.experimental.time - Remove non-root swagger definitions #900
- FIX:
malli.core/-compkeeps interceptor order with long chains #905 - FIX:
malli.dev/start!exception does not contain source #896 - FIX: don't add extra :schema nil to swagger :parameters #939
- Add
:gen/returnsupport in malli.generator #933 - Make uuid transformer to be case insensitive #929
- Add
:default/fnprop for default-value-transformer #927 - Updated dependencies:
borkdude/edamame 1.3.20 -> 1.3.23
0.11.0 (2023-04-12)
- BREAKING: remove map syntax:
mu/from-map-syntax,mu/to-map-syntax. Note that AST syntax and lite syntax remain unchanged. - BREAKING: walking a
:schemawith anidno longer passes[id]instead ofchildrento the walker function #884 - Support converting recursive malli schemas to json-schema #464 #868
- Add cherry as alternative CLJS evaluator #888
- Replace
goog/mixinwithObject.assign#890 - Simplify uuid regex for accept non-standard and zero uuids #889
- Fix clj-doc API import #887
0.10.4 (2023-03-19)
- FIX
malli.swaggerns, broken test on reitit.
0.10.3 (2023-03-18)
(m/validate
[:map
[:x :int]
[:y :int]
[::m/default [:map-of :string :string]]]
{:x 1, :y 2, "kikka" "kukka"})
; => true
mt/strip-extra-keys-transformerworks with:map-of.
(m/decode
[:map-of :int :int]
{1 1, 2 "2", "3" 3, "4" "4"}
(mt/strip-extra-keys-transformer))
; => {1 1}
- BREAKING (post-note 16.8.2023, this should have been a MINOR version bump).
mt/strip-extra-keys-transformerstrips non-defined keys of implicitely open:map:
(m/decode
[:map [:x :int]]
{:x 1, :y 2, :z 3}
(mt/strip-extra-keys-transformer))
; => {:x 1}
m/default-schemato pull the::m/defaultschema from entry schemasm/explicit-keysto get a vector of explicit keys from entry schemas (no::m/default)- Simplify content-dependent schema creation with
m/-simple-schemaandm/-collection-schemavia new 3-arity:compilefunction of typechildren properties options -> props. Old 2-arity top-level callback function ism/deprecated!and support for it will be removed in future versions. #866 - FIX Repeated calls to
malli.util/assoc-inreferencing non-existing maps fail #874 - Updated dependencies:
borkdude/edamame 1.1.17 -> 1.3.20
0.10.2 (2023-03-05)
-
Implement
malli.experimental.timeschemas for clojurescript using js-joda #853 -
Allow instrumenting external functions #841
-
Add clj-kondo support for cljs function schemas #833
-
Turn on instrumentation for
mx/defnwith:malli/alwaysmeta #825 -
Support type-properties in
m/-map-schema,m/-map-of-schemaandm/-tuple-schema#856 -
FIX: properly compose interceptors in :map-of json-transformer #849
-
FIX: error paths for
:multischemas when value is not a map #845 -
FIX: Malli generates
:nilable/anywhich is not a valid type in clj-kondo #821 -
FIX:
mi/collect!without args doesn't work properly #834 -
Updated dependencies:
mvxcvi/mvxcvi 2.0.0 -> 2.1.0
borkdude/edamame 1.0.0 -> 1.1.17
0.10.1 (2023-01-21)
- Strip-extra-keys should not break on non-map values #818
0.10.0 (2023-01-12)
- New optional time-schemas for the JVM on top of
java.time::time/duration,:time/instant,:time/local-date,:time/local-date-time,:time/local-time,:time/offset-date-time,:time/offset-time,:time/zone-id,:time/zone-offset,:time/zoned-date-time, see README
- automatic type inferring with
:enumand:=withmalli.transformandmalli.json-schema- detects homogenous:string,:keyword,:symbol,:intand:double), #782 & #784 - New
malli.core/coercerandmalli.core/coerceto both decode and validate a value, see Docs - New
malli.core/-no-op-transformer - BREAKING: new implemenation for
:map-ofinferring viamalli.provider/provide:- Option
:malli.provider/map-of-thresholddefault dropped (was 3) - New and configurable (
malli.provider/map-of-accept) function ofstats -> booleanfor identifying:map-of
- Option
- BREAKING: Prefer to real Schemas instead of predicates in inferring (e.g.
:intover'int?) - Adds
:predoption tom/-map-schema#767 - New
:someschema (likesome?) - New
malli.experimental.describeto describe Schemas in english:
* (require '[malli.experimental.describe :as med])
(med/describe [:map {:closed true} [:x int?]])
; => "map where {:x -> <integer>} with no other keys"
0.9.2 (2022-10-18)
- Fix report-fn fn-name symbol constructor in instrument #768
0.9.1 (2022-10-17)
- Fix instrument! in dev.cljs/start! - pass cljs function schemas #766
0.9.0 (2022-10-16)
- Improve regex driver cache performance #756
- Refactor cljs fn instrumentation to happen at runtime #755
- Add jdk 19 to ci #760
- Fix pos? json schema mapping #757
- Generate alphanumeric strings with
:min/:max#759 - Add cljs instrumentation support for multi-arity and varargs functions #753
- Attach fn-name metadata to instrumented CLJS functions #746
- Improve generator distribution for sized schemas #748
- Group instrumentation logging so it doesn't spam the browser console #747
- Fix recursive gen #677, fixed On fixing Malli's recursive generation
- Mask valid values by default with
malli.dev.pretty/explain#738 - Add seq to tuple transformation #735, fixes #734
- Switch Value and Errors in the pretty output order, #720
- Ensure all examples work without sci unless mentioned otherwise #733
- Set additionalProperties if map is closed #719, fixes #716
- Fix registry lookup in schema vector syntax, #729, fixes #451
- Source-compatible with nbb, #726
- Initial Development Guide
- Better humanized results with sets
::m/extra-keyerror retains the error value- New
malli.error/error-valueutility for compact error value presentation. - BREAKING:
me/-pushtakes extra argument - BREAKING:
me/-assoc-inis now calledme/-push-in - Updated dependencies:
borkdude/dynaload 0.3.4 -> 0.3.5
0.8.9 (2022-07-01)
borkdude/dynaload 0.2.2 -> 0.3.4
0.8.8 (2022-06-23)
- new guide for Static type checking via Typed Clojure
- new guide for To and from JSON
- much improved support for instrumentation & type checking with ClojureScript via #660, #661, #662, #667, #681, #685, #696, #697, #700, #703
- new
malli.dev.pretty/prettierhelper, [#672] - faster stripping away extra keys from maps, #674
- fix regex unparsing, [#690]
- fix Warning under advanced compilation via #692
- Map :re schema to clj-kondo :string
- added
mall.util/explain-data,malli.util/data-explainerandmalli.util/keys#707 - fix mu/open-schema does not open a closed schema via #709
- Show function input arguments on invalid return value
- fix Don't lose properties when updating a key
malli.transform/default-value-transformeracceptsmt/add-optional-keysoption:
(m/decode
[:map
[:name [:string {:default "kikka"}]]
[:description {:optional true} [:string {:default "kikka"}]]]
{}
(mt/default-value-transformer {::mt/add-optional-keys true}))
; => {:name "kikka", :description "kikka"}
- updated dependencies:
fipp/fipp 0.2.5 -> 0.2.6
borkdude/edamame 0.0.18 -> 1.0.0
0.8.7 (2022-06-23)
- technical redeploy
0.8.6 (2022-06-23)
- technical redeploy
0.8.5 (2022-06-23)
- technical redeploy
0.8.4 (2022-03-02)
- support for 2-arity
default-fnoption inmt/default-value-transformer#582 & #644 - fix malli.dev.cljs implementation #655
0.8.3 (2022-02-15)
- FIX: qualified-keyword with namespace doesn't generate the ns #642
0.8.2 (2022-02-14)
- new ns,
malli.experimental.lite, see the docs.
(require '[malli.experimental.lite :as l])
{:id string?
:tags [:set keyword?]
:address {:street string?
:city string?
:zip (l/optional int?)
:lonlat [:tuple double? double?]}}
- updated deps:
borkdude/edamame 0.0.18 -> 0.0.19
0.8.1 (2022-02-05)
- FIX: bug in inferring with value encoders #631
- FIX: The malli pretty printer (virhe) is failing when it tries to print a datomic dbwhen it tries to pr #629
0.8.0 (2022-01-23)
-
new
malli.instrument.cljsandmalli.dev.cljsnamespaces for instrumentationa and dev-tooling for ClojureScript -
malli.dev/start!usesmalli.dev.pretty/reporterby default -
allow
:malli/schemato be defined via arglist meta-data, #615 -
BREAKING: local registries with schemas in vector syntax are stored as identity, not as form
-
BREAKING:
:malli.provider/tuple-thresholdhas no default value -
FIX:
me/-resolve-root-errordoes not respect:error/path, #554 -
FIX:
m/from-astdoes not work with symbols or unamespaced keywords, #626 -
FIX:
:+parsing returns vector, not sequence -
new
malli.destructurens for parsing Clojure & Plumatic destructuring binding syntaxes, see Destructuring.
(require '[malli.destructure :as md])
(-> '[a b & cs] (md/parse) :schema)
; => [:cat :any :any [:* :any]]
(-> '[a :- :string, b & cs :- [:* :int]] (md/parse) :schema)
; => [:cat :string :any [:* :int]]
- new
malli.experimentalnamespace with schematizeddefn, automatically registers the functions schemas withm/=>.
(require '[malli.experimental :as mx])
(mx/defn kakka :- :int
"inline schemas (plumatic-style)"
[x :- :int] (inc x))
- transformer names can be qualified, schema properties support
:decodeand:encodekeys:
(m/decode
[:string {:decode {:string (partial str "olipa "}}]
"kerran" mt/string-transformer)
; => "olipa kerran"
malli.dev.pretty/explainfor pretty-printing explanations
- updated dependencies:
fipp/fipp 0.6.24 -> 0.6.25
0.7.5 (2021-12-19)
- clj-kondo 2021.12.16+ can load malli type configs automatically from new location (
.clj-kondo/metosin/malli-types/config.edn) - use fipp for fast pretty-printing the clj-kondo configs
- updated dependencies:
mvxcvi/arrangement 1.2.0 -> 2.0.0
borkdude/edamame 0.0.11 -> 0.0.18
org.clojure/test.check 1.1.0 -> 1.1.1
0.7.4 (2021-12-18)
- schema inferring supports value decoding via options
(mp/provide
[{:id "caa71a26-5fe1-11ec-bf63-0242ac130002"}
{:id "8aadbf5e-5fe3-11ec-bf63-0242ac130002"}]
{::mp/value-decoders {'string? {:uuid mt/-string->uuid}}})
; => [:map [:id :uuid]]
0.7.3 (2021-12-15)
:map-ofinferring can be forced with:malli.provider/hint :map-ofmeta-data:
(require '[malli.provider :as mp])
(mp/provide
[^{::mp/hint :map-of}
{:a {:b 1, :c 2}
:b {:b 2, :c 1}
:c {:b 3}
:d nil}])
;[:map-of
; keyword?
; [:maybe [:map
; [:b int?]
; [:c {:optional true} int?]]]]
:tupleinferring (supports type-hints and threshold options)
(mp/provide
[[1 "kikka" true]
[2 "kukka" true]
[3 "kakka" true]]
{::mp/tuple-threshold 3})
; [:tuple int? string? boolean?]
0.7.2 (2021-12-12)
- FIX Function with Sequential return value cannot define as function schema #585
0.7.1 (2021-12-11)
- FIX
decimal?predicate schema was removed in 0.7.0, #590
0.7.0 (2021-12-07)
Performance
Schema Creation
(def ?schema
[:map
[:x boolean?]
[:y {:optional true} int?]
[:z [:map
[:x boolean?]
[:y {:optional true} int?]]]])
(def schema (m/schema ?schema))
;; 44µs -> 2.5µs (18x)
(bench (m/schema ?schema))
;; 44µs -> 240ns (180x, not realized)
(p/bench (m/schema ?schema {::m/lazy-entries true}))
Schema Transformation
;; 26µs -> 1.2µs (21x)
(bench (m/walk schema (m/schema-walker identity)))
;; 4.2µs -> 0.54µs (7x)
(bench (mu/assoc schema :w :string))
;; 51µs -> 3.4µs (15x)
(bench (mu/closed-schema schema))
;; 5µs -> 28ns (180x)
(p/bench (m/deref-all ref-schema))
;; 134µs -> 9µs (15x)
(p/bench (mu/merge schema schema))
Schema Workers
(def schema (m/schema ?schema))
;; 1.6µs -> 64ns (25x)
(p/bench (m/validate schema {:x true, :z {:x true}}))
;; 1.6µs -> 450ns (3x)
(p/bench (m/explain schema {:x true, :z {:x true}}))
Schema Inferring
(def samples
[{:id "Lillan"
:tags #{:artesan :coffee :hotel}
:address {:street "Ahlmanintie 29"
:city "Tampere"
:zip 33100
:lonlat [61.4858322, 23.7854658]}}
{:id "Huber",
:description "Beefy place"
:tags #{:beef :wine :beer}
:address {:street "Aleksis Kiven katu 13"
:city "Tampere"
:zip 33200
:lonlat [61.4963599 23.7604916]}}])
;; 126ms -> 2.5ms (50x)
(p/bench (mp/provide samples))
;; 380µs (330x)
(let [provide (mp/provider)]
(p/bench (provide samples)))
Schema AST
New optimized map-syntax to super-fast schema creation, see README.
(def ast (m/ast ?schema))
;{:type :map,
; :keys {:x {:order 0, :value {:type boolean?}},
; :y {:order 1, :value {:type int?}
; :properties {:optional true}},
; :z {:order 2,
; :value {:type :map,
; :keys {:x {:order 0
; :value {:type boolean?}},
; :y {:order 1
; :value {:type int?}
; :properties {:optional true}}}}}}}
;; 150ns (16x)
(p/bench (m/from-ast ast))
(-> ?schema
(m/schema)
(m/ast)
(m/from-ast)
(m/form)
(= ?schema))
; => true
Currently in alpha, will fully replace the old map-syntax at some point.
Swappable default registry
No need to play with Compiler options or JVM properties to swap the default registry (only if you want to get DCE on CLJS with small set of schemas). Can be disabled with new malli.registry/mode=strict option.
(require '[malli.core :as m]
'[malli.util :as mu]
'[malli.registry :as mr]
'[malli.generator :as mg])
;; look ma, just works
(mr/set-default-registry!
(mr/composite-registry
(m/default-schemas)
(mu/schemas)))
(mg/generate
[:merge
[:map [:x :int]]
[:map [:y :int]]])
; => {:x 0, :y 92}
Public API
- BREAKING:
m/explain:errorsare plain maps, notErrorrecords. - BREAKING:
malli.provider/schemais moved into extender API:malli.provider/-schema - BREAKING: strings generate alphanumeric chars by default
malli.providersupports inferring of:maybeand:map-of- configure default registry in less invasive manner, #488
nilis a valid default withmt/default-value-transformer#576- fixed
:schemaexplain path, #573 - fixed
:enumexplain path, #553 - fixed pretty printing of function values, #509
- fixed
:functionlenses - fixed arity error in
m/function-schema - add localized error messages for all type-schemas
- support for Lazy EntrySchema parsing
empty?Schema does not throw exceptions
Extender API
- BREAKING:
m/EntrySchemareplacesm/MapSchemawith new-entry-parsermethod - BREAKING: (eager)
m/-parse-entriesis removed, usem/-entry-parserinstead - BREAKING:
m/-create-formsupports 2 & 4 arities (was: 3) m/EntryParserprotocolm/-entry-formshelperm/walk-leaf,m/-walk-entries&m/-walk-indexedhelpersm/Cachedprotocol andm/-create-cachefor memoization of-validator,-explainer,-parserand-unparserwhen usingm/validator,m/explain,m/parserandm/unparser.
0.6.1 (2021-08-08)
- add missing optional dependency to
mvxcvi/arrangementto make pretty printing work
0.6.0 (2021-08-08)
- Much faster validators on CLJ (loop unrolling & programming against interfaces) with
:or,:and,:ornand:map, thanks to Ben Sless:
;; 164ns -> 28ns
(let [valid? (m/validator [:and [:> 0] [:> 1] [:> 2] [:> 3] [:> 4]])]
(cc/quick-bench (valid? 5)))
;; 150ns -> 30ns
(let [valid? (m/validator [:map [:a :any] [:b :any] [:c :any] [:d :any] [:e :any]])
value {:a 1, :b 2, :c 3, :d 4, :e 5}]
(cc/quick-bench (valid? value)))
- Much faster collection transformers on CLJ (loop unrolling & programming against interfaces):
(let [decode (m/decoder
[:map
[:id :string]
[:type :keyword]
[:address
[:map
[:street :string]
[:lonlat [:tuple :double :double]]]]]
(mt/json-transformer))
json {:id "pulla"
:type "food"
:address {:street "hämeenkatu 14"
:lonlat [61 23.7644223]}}]
;; 920ns => 160ns
(cc/quick-bench
(decode json)))
Public API
-
BREAKING:
malli.json-schema/unlift-keysis removed in favor ofmalli.core/-unlift-keys -
BREAKING:
malli.json-schema/unliftis removed in favor ofget -
BREAKING:
malli.provider/statsis removed (was already deprecated) -
BREAKING:
malli.util/updatedoesn't the properties of the key it updates, fixes #412 -
BREAKING: New rules for humanized errors, see #502, fixes #80, #428 and #499.
-
new
malli.instrumentandmalli.devfor instrumenting function Vars (e.g.defns), see the guide. -
new
malli.plantumlnamespace for PlantUML generation -
new
malli.generator/checkfor generative testing of functions anddefns. -
new
malli.core/parent -
:map-ofsupports:minand:maxproperties -
Collection Schemas emit correct JSON Schema min & max declarations
-
humanized errors for
:boolean&:malli.core/tuple-limit -
predicate schema for
fn? -
malli.util/transform-entriespasses in options [#340]/(https://github.com/metosin/malli/pull/340) -
BETA: humanized errors can be read from parent schemas (also from map entries), fixes #86:
(-> [:map
[:foo {:error/message "entry-failure"} :int]]
(m/explain {:foo "1"})
(me/humanize {:resolve me/-resolve-root-error}))
; => {:foo ["entry-failure"]}
-
New experimental pretty printer for schema errors, using fipp.
Extender API
malli.util.impl/-fail!is nowmalli.core/-fail!malli.core/-unlift-keysmalli.core/-instrument- BREAKING:
malli.core/-register-function-schema!is now 4-arity, new argument is data map - BREAKING:
malli.core/-fail!has only arity 1 & 2 versions
0.5.1 (2021-05-02)
Public API
- Fix #435: :re ignores :gen/xxx properties in absence of :gen/gen
- More customization on -collection-schema #433
0.5.0 (2021-04-28)
Public API
- Add
ifn?predicate, #416 - Accumulate errors correctly with
m/-explainwith:functionand:=>Schemas - New
m/properties-schemaandm/children-schemato resolve Malli Schemas forIntoSchemas. Empty implementations. - New
:gen/schemaproperty for declarative generation, e.g.[:string {:gen/schema :int, :gen/fmap str}] - Support double generator options via schema properties
- Fix #419: Parsing bug in :map schema
- Fix #418: Better error messages / docs for registry references
- Fix #415: Default branch in multi schema are not transformed
- Fix #427: Generated sets of :ref are always empty
Extender API
- BREAKING:
-typeis moved fromSchematoIntoSchema. - BREAKING:
-type-propertiesis moved fromSchematoIntoSchema. - new Protocol methods in
IntoSchemaProtocol(-properties-schema [this options] "maybe returns :map schema describing schema properties")(-children-schema [this options] "maybe returns sequence schema describing schema children")
0.4.0 (2021-03-31)
Public API
:nilschema, #401- BREAKING/FIX: parsing
:multireturns branch information, #403 :andmerges using first child, #405
0.3.1 (2021-03-21)
Public API
- Add
:ornjson-schema & generator, #400 - Ignore optional properties in
mt/default-value-transformer, #397 - Support
nilkeys in maps, #392 :m/defaultfor:multi, #391- Fix inconsistent park-ing in alt(n)-parser, #390
- Fix json schema generation when all attributes of a map are optional, #385
- Note about transformers best-effort behavior, #384
- Humanized regex/sequence errors, #383
- Humanized error for
:double, #382
0.3.0 (2021-03-02)
Public API
-
support for sequence schemas:
:cat,catn,alt,altn,:?,:*,:+andrepeat, see Sequence Schemas. -
support for parsing and unparsing schemas:
m/parse,m/parser,m/unparse,m/unparser, see Parsing values. -
support for function schmas:
:=>and:function, see Function Schemas. -
new schemas:
:any(e.g.any?),:not(complement) and:orn(or with named branches) -
:qualified-keywordsupport:namespaceproperty -
FIX: Schema vizualization is not working for
[:< ...]like schemas, #370 -
Ensure we use size 30 for generator (for more variety), #364
-
Set JSON Schema types and formats for numbers properly #354
-
-memoize actually memoized. easily 100x faster now #350
-
Fix interceptor composition, #347
-
malli.util: add a rename-keys utility, similar to clojure.set #338 -
Let
mu/updateaccept plain data schemas, #329 -
mu/find, #322
Extender API
- BREAKING:
m/Schemahas new methods:-parent,-parserand-unparser - BREAKING:
m/-coderandm/-chainare replaced wihm/-intercepting - BREAKING:
m/-fail!is nowmiu/-fail! - BREAKING:
m/-erroris nowmiu/-error
0.2.1 (2020-10-22)
- fix
:sequentialdecoding with empty sequence undermt/json-transformer, fixes #288- removed broken
mt/-sequential->seq
- removed broken
0.2.0 (2020-10-18)
- BREAKING (MINOR):
m/derefreturns original schema, does not throw, fixes #284. - BREAKING (MINOR): the following utilities in
malli.utilderef top-level refs recursively:merge,union,transform-entries,optional-keys,required-keys,select-keysanddissoc. m/deref-allderefs all top-level references recursively, e.g.
(m/deref-all [:schema [:schema int?]])
; => int?
:ref,:schema,::m/schemahave now generators, JSON Schema and Swagger supportmu/subschemaswalks over top-level:refand all:schemas.m/walkcan walk over:refand:schemareference schemas. Walking can be enabled using options:malli.core/walk-refsand:malli.core/walk-schema-refs.- Welcome declarative schema transformations!
There are also declarative versions of schema transforming utilities in malli.util/schemas. These include :merge, :union and :select-keys:
(def registry (merge (m/default-schemas) (mu/schemas)))
(def Merged
(m/schema
[:merge
[:map [:x :string]]
[:map [:y :int]]]
{:registry registry}))
Merged
;[:merge
; [:map [:x :string]]
; [:map [:y :int]]]
(m/deref Merged)
;[:map
; [:x :string]
; [:y :int]]
(m/validate Merged {:x "kikka", :y 6})
; => true
-
New options for SCI:
:malli.core/disable-scifor explicitly disablingsci, fixes #276:malli.core/sci-optionsfor configuringsci
-
malli.transform/default-value-transformeraccepts options:keyand:defaults:
(m/decode
[:map
[:user [:map
[:name :string]
[:description {:ui/default "-"} :string]]]]
nil
(mt/default-value-transformer
{:key :ui/default
:defaults {:map (constantly {})
:string (constantly "")}}))
; => {:user {:name "", :description "-"}}
- Support microsecond precision when parsing datetime strings. #280
0.1.0 (2020-10-08)
First stable release.
Breaking Changes in pre-alpha:
- 8.10.2020
- removed
:listschema - removed
malli.error/SchemaErrorprotocol in favor of usingm/type-propertiesfor custom errors
- removed
- 20.9.2020
- removed
m/-predicate-schema,m/-partial-predicate-schemaandm/-leaf-schema
- removed
- 19.9.2020
- new mandatory Protocol method in
m/Schema:-type-properties
- new mandatory Protocol method in
- 1.9.2020
m/childrenreturns 3-tuple (key, properties, schema) forMapSchemasm/map-entriesis removed,m/entriesreturns aMapEntryof key &m/-val-schema
- 4.8.2020
:pathin explain is re-implemented: map keys by value, others by child indexm/-walkandm/Walkeruses:path, not:inm/-outerhas new parameter order:walker schema path children optionsmalli.util/path-schemasreplaced withmalli.util/subschemas&malli.util/distict-byLensSchemahas a new-keymethod- renamed some non-user apis in
malli.core&malli.util - moved map-syntax helpers from
malli.coretomalli.util - dynaload
com.gfredericks/test.chuck
- 23.7.2020
sciis not a default dependency. Enabling sci-support:- Clojure: add a dependency to
borkdude/sci - ClojureScript: also require
sci.core(directly or via:preloads)
- Clojure: add a dependency to
- 18.7.2020
- big cleanup of
malli.transforminternals.
- big cleanup of
- 12.7.2020
malli.mermaidis removed (in favor ofmalli.dot)
- 10.7.2020
[metosin/malli "0.0.1-20200710.075225-19"]- Visitor is implemented using a Walker.
m/accept->m/walkm/schema-visitor->m/schema-walkerm/map-syntax-visitor->m/map-syntax-walker
- 31.6.2020
- new
-childrenmethod inSchema, to return child schemas as instances (instead of just AST)
- new
- 17.6.2020
- change all
malli.core/*-registrydefs intomalli.core/*-schemasdefns to enable DCE for clojurescript
- change all
- 9.6.2020
malli.core/name&malli.core/-namerenamed tomalli.core/type&malli.core/-typemalli.generator/-generatoris renamed tomalli.generator/-schema-generator
