-
-
Notifications
You must be signed in to change notification settings - Fork 187
Expand file tree
/
Copy pathenv.cljs
More file actions
67 lines (55 loc) · 1.93 KB
/
env.cljs
File metadata and controls
67 lines (55 loc) · 1.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
(ns shadow.cljs.bootstrap.env
(:require [clojure.set :as set]))
(defonce loaded-ref (atom #{}))
;; calls to this will be injected by shadow-cljs
;; it will receive an array of strings matching the goog.provide
;; names that where provided by the "app"
(defn set-loaded [namespaces]
(let [loaded (into #{} (map symbol) namespaces)]
(swap! loaded-ref set/union loaded)))
(defonce index-ref (atom nil))
(defn build-index [{:keys [sources exclude] :as data}]
(let [idx
(reduce
(fn [idx {:keys [resource-id] :as rc}]
(assoc-in idx [:sources resource-id] rc))
{:sources-ordered sources
:exclude exclude}
sources)
idx
(reduce
(fn [idx [provide resource-id]]
(assoc-in idx [:sym->id provide] resource-id))
idx
(for [{:keys [resource-id provides]} sources
provide provides]
[provide resource-id]))]
(reset! index-ref idx)
#_ (js/console.log "build-index" idx)
idx))
(defn get-ns-info [ns]
(let [idx @index-ref
id (get-in idx [:sym->id ns])]
(or (get-in idx [:sources id])
(throw (ex-info (str "ns " ns " not available") {:ns ns}))
)))
(defn find-deps [entries]
{:pre [(set? entries)
(every? symbol? entries)]}
;; abusing that :sources-ordered is in correct dependency order
;; just walk in reverse and pick up everything along the way
(->> (reverse (:sources-ordered @index-ref))
(reduce
(fn [{:keys [deps order] :as x} {:keys [resource-id output-name provides requires] :as src}]
(cond
;; don't load files that don't provide anything we want
(not (seq (set/intersection deps provides)))
x
:else
{:deps (set/union deps requires)
:order (conj order src)}))
{:deps entries
:order []})
(:order)
(reverse)
(into [])))