When marshalling data containing CLJS Bean types to Transit, special handlers must be specified when creating a Transit writer.
The CLJS Bean custom handlers are provided by calling cljs-bean.transit/writer-handlers,
and are passed to Transit's writer constructor via the :handlers option. For example:
(require '[cognitect.transit :as t]
'[cljs-bean.core :refer [->clj]]
'[cljs-bean.transit])
(defn roundtrip [x]
(let [w (t/writer :json
{:handlers (cljs-bean.transit/writer-handlers)})
r (t/reader :json)]
(t/read r (t/write w x))))With this set up, Transit marshalling will work properly.
For example (roundtrip (->clj #js {:a 1})) will produce the map {:a 1}.
Note that, on the receiving end, plain ClojureScript (not CLJS Bean) types are produced.
The custom handlers cover all of the CLJS Bean types. Examples:
(->clj #js {:a 1})is a CLJS Bean map type, which becomes a persistent map when round tripping(->clj #js [1 2])is a CLJS Bean vector type, which becomes a persistent vector when round tripping(seq (->clj #js {:a 1}))is a CLJS Bean sequence type, which which becomes a persistent list when round tripping(rest (->clj #js [1 2]))is a CLJS Bean sequence type, which which becomes a persistent list when round tripping
With these handlers, nested types are properly supported. For example
(-> (->clj #js {:a 1
:b #js [1 2]
:c #js [1 2 3]})
(update :c rest))
produces a bean, where the values under :b and :c are types specific to CLJS Bean
{:a 1, :b [1 2], :c (2 3)}
and if this value is passed to roundtrip, the result is a persistent map containing a
persistent vector and persistent list.