Skip to content

Files

Latest commit

 

History

History
 
 

react-relay

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 

cljsjs/react-relay

[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))

Usage

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 ...)).