[cljsjs/react-relay "0.10.0-0"] ;; latest release
This jar comes with deps.cljs
as used by the Foreign Libs feature
of the ClojureScript compiler. After adding the above dependency to your project
you can require the packaged library like so:
(ns application.core
(:require cljsjs.react-relay))
Because JavaScript lacks macros, Relay currently depends on Babel to compile Relay.QL
query strings.
Because ClojureScript has macros, we can use them to shell out to Node, like this:
(ns my.project.relay ; .clj macro file
(:require
[clojure.java.io :as io]
[clojure.string :as str]
[me.raynes.conch :as conch]))
(defn ^:private ql* [env query]
(let [filename (-> env :ns :name)
{:keys [line column]} env
code (str "/* " filename " " line " " column "*/" ; unique key for every query
"Relay.QL`" (str/replace query #"\r\n|\n|\r" " ") "`;")
schema (-> "relay/schema.json" io/resource slurp) ; GraphQL schema from introspection query
script (str "var schema = " schema ";"
"var schemaData = schema.data;"
"var getBabelRelayPlugin = require('babel-relay-plugin');"
"var babel = require('babel-core');"
"var code = '" code "';"
"var options = {};"
"options.plugins = [getBabelRelayPlugin(schemaData)];"
"options.filename = '" filename "';"
"options.compact = true;"
"options.comments = false;"
"babel.transform(code, options).code;")]
(conch/execute "node" "--print" script)))
(defmacro ql [^String query]
`(js/eval ~(ql* &env query)))
It's hacky, but it works (even in advanced compilation).
You'll need Node as well as babel-core
and babel-relay-plugin
.
The version of babel-relay-plugin
must exactly match the version react-relay
.
For embedding fragments, fully qualify the fragment component (e.g., "${my.ui.MyComponent.getFragment(\"viewer\")}"
)
when referenced in GraphQL and export the component where it is defined (e.g., (def ^:export MyComponent ...)
).