cljs.repl.rhino/rhino-setup

functionremoved v1.10.738added v0.0-927Edit
(rhino-setup repl-env opts)

Source code @ clojurescript:src/main/clojure/cljs/repl/rhino.clj
(defn rhino-setup [repl-env opts]
  (let [scope   (:scope repl-env)
        env     (ana/empty-env)
        core    (io/resource "cljs/core.cljs")
        base-js (io/resource "goog/base.js")
        core-js (closure/compile core
                  (assoc opts :output-file
                    (closure/src-file->target-file
                      core (dissoc opts :output-dir))))
        deps    (closure/add-dependencies opts core-js)
        output-dir (util/output-directory opts)
        repl-deps (io/file output-dir "rhino_repl_deps.js")]
    ;; emit core and deps
    (apply closure/output-unoptimized
      (assoc opts :output-to (.getPath repl-deps)) deps)

    ;; setup back references & output stream
    (ScriptableObject/putProperty scope
      "___repl_env" (Context/javaToJS repl-env scope))
    (ScriptableObject/putProperty scope "__repl_opts"
      (Context/javaToJS opts scope))
    (ScriptableObject/putProperty scope
      "out" (Context/javaToJS *out* scope))
    (ScriptableObject/putProperty scope
      "err" (Context/javaToJS *err* scope))

    ;; define file loading, load goog.base, load repl deps
    (rhino-eval repl-env "bootjs" 1 bootjs)
    (rhino-eval repl-env "goog/base.js" 1 (io/reader base-js))
    (rhino-eval repl-env "rhino_repl_deps.js" 1 (io/reader repl-deps))

    ;; === Bootstrap ===
    ;; load cljs.core, setup printing
    (repl/evaluate-form repl-env env ""
      '(do
         (.require js/goog "cljs.core")
         (set! *print-fn* (fn [x] (.write js/out x)))
         (set! *print-err-fn* (fn [x] (.write js/err x)))))

    ;; allow namespace reloading
    (repl/evaluate-form repl-env env ""
      '(set! js/goog.isProvided_ (fn [x] false)))

    ;; monkey-patch goog.require
    (repl/evaluate-form repl-env env ""
      '(do
         (set! *loaded-libs* #{"cljs.core"})
         (set! (.-require js/goog)
           (fn [name reload]
             (when (or (not (contains? *loaded-libs* name)) reload)
               (set! *loaded-libs* (conj (or *loaded-libs* #{}) name))
               (js/CLOSURE_IMPORT_SCRIPT
                 (if (some? goog/debugLoader_)
                   (.getPathFromDeps_ goog/debugLoader_ name)
                   (goog.object/get (.. js/goog -dependencies_ -nameToPath) name))))))))

    ;; set closure-defines
    (rhino-eval repl-env "CLOSURE_UNCOMPILED_DEFINES" 1
      (str "goog.global.CLOSURE_UNCOMPILED_DEFINES = "
        (json/write-str (:closure-defines opts)) ";"))))