All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cljs.loader.cljs Maven / Gradle / Ivy

;   Copyright (c) Rich Hickey. All rights reserved.
;   The use and distribution terms for this software are covered by the
;   Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
;   which can be found in the file epl-v10.html at the root of this distribution.
;   By using this software in any fashion, you are agreeing to be bound by
;   the terms of this license.
;   You must not remove this notice, or any other, from this software

(ns cljs.loader
  (:require [goog.object :as gobj])
  (:import [goog.module ModuleLoader]
           [goog.module ModuleManager]))

(def module-infos MODULE_INFOS) ;; set by compiler
(def module-uris MODULE_URIS) ;; set by compiler

(defn deps-for [x graph]
  (let [depends-on (get graph x)]
    (-> (mapcat #(deps-for % graph) depends-on)
      (concat depends-on) distinct vec)))

(defn munge-kw [x]
  (cond-> x
    (keyword? x) (-> name munge)))

(defn to-js [m]
  (reduce-kv
    (fn [ret k xs]
      (let [arr (into-array (map munge-kw xs))]
        (doto ret (gobj/set (-> k name munge) arr))))
    #js {} m))

(defn create-module-manager []
  (let [mm (ModuleManager.)
        ml (ModuleLoader.)]
    (.setLoader mm ml)
    mm))

(defonce ^:dynamic *module-manager* (create-module-manager))

(.setAllModuleInfo *module-manager* (to-js module-infos))
(.setModuleUris *module-manager* (to-js module-uris))

(defn loaded?
  "Return true if modules is loaded. module-name should be a keyword matching
   a :modules module definition."
  [module-name]
  (assert (contains? module-infos module-name)
    (str "Module " module-name " does not exist"))
  (let [mname (-> module-name name munge)
        module (.getModuleInfo *module-manager* mname)]
    (when (some? module)
      (.isLoaded module))))

(defn load
  "Load a module. module-name should be a keyword matching a :modules module
   definition."
  ([module-name]
    (load module-name nil))
  ([module-name cb]
   (assert (contains? module-infos module-name)
     (str "Module " module-name " does not exist"))
   (let [mname (-> module-name name munge)]
     (if-not (nil? cb)
       (.execOnLoad *module-manager* mname cb)
       (.load *module-manager* mname)))))

(defn set-loaded!
  "Set a module as being loaded. module-name should be a keyword matching a
  :modules module definition. Will mark all parent modules as also being
  loaded."
  [module-name]
  (assert (contains? module-infos module-name)
    (str "Module " module-name " does not exist"))
  (let [xs (deps-for module-name module-infos)]
    (doseq [x xs]
      (.setLoaded *module-manager* (munge-kw x)))
    (.setLoaded *module-manager* (munge-kw module-name))))

(defn prefetch
  "Prefetch a module. module-name should be a keyword matching a :modules
  module definition. Will download the module but not evaluate it. To
  complete module load, one must also call cljs.loader/load after prefetching
  the module. Does nothing if the module is loading or has been loaded."
  [module-name]
  (assert (contains? module-infos module-name)
          (str "Module " module-name " does not exist"))
  (when-not (loaded? module-name)
    (let [mname (-> module-name name munge)]
      (when-not (.isModuleLoading *module-manager* mname)
        (.prefetchModule *module-manager* mname)))))




© 2015 - 2025 Weber Informatics LLC | Privacy Policy