Skip to content

Commit 9a723a6

Browse files
authored
require-cljs misc. improvements (#680)
1 parent 757d4e8 commit 9a723a6

File tree

5 files changed

+53
-45
lines changed

5 files changed

+53
-45
lines changed

.github/workflows/main.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ jobs:
145145
- name: 📓 Build Clerk Book
146146
run: |
147147
cp notebooks/editor.clj editor.clj
148-
clojure -J-Dclojure.main.report=stderr -X:demo:nextjournal/clerk :git/sha '"${{ github.sha }}"' :git/url '"https://github.com/nextjournal/clerk"' :paths '["book.clj" "CHANGELOG.md" "editor.clj"]'
148+
clojure -J-Dclojure.main.report=stderr -X:dev:demo:nextjournal/clerk :git/sha '"${{ github.sha }}"' :git/url '"https://github.com/nextjournal/clerk"' :paths '["book.clj" "CHANGELOG.md" "editor.clj"]'
149149
150150
- name: 🏗 Build Clerk Static App with default Notebooks
151151
run: clojure -J-Dclojure.main.report=stderr -X:demo:nextjournal/clerk :package :single-file

notebooks/eval_cljs.clj

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
;; # 📑 Eval CLJS
22
(ns eval-cljs
3-
(:require [nextjournal.clerk :as clerk]
4-
[viewers.viewer-with-cljs-source :as wcs]))
3+
(:require [nextjournal.clerk :as clerk]))
54

65
;; > ⚠️ Please see [require_cljs.clj](/notebooks/require_cljs.clj) for a much easier way to do the same thing.
76

notebooks/render_fns.cljs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,3 @@
44

55
(defn motion-div [props]
66
[:> (.-div motion) props])
7-
8-
(js/console.log :foo!!)

notebooks/require_cljs_test.clj

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
(ns require-cljs-test
2+
(:require [nextjournal.clerk :as clerk]
3+
[viewers.viewer-with-cljs-source :as wcs]))
4+
5+
;; This notebook tests that:
6+
;; - [x] You can load a viewer in a notebook that uses :require-cljs without using :require-cljs itself in the notebook
7+
;; - [x] The used viewer can have a transitive .cljs or .cljc dependency
8+
9+
^{::clerk/no-cache true}
10+
(clerk/with-viewer wcs/my-cool-viewer
11+
[1 2 3 4])

src/nextjournal/clerk/cljs_libs.clj

Lines changed: 40 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -12,32 +12,32 @@
1212
[rewrite-clj.node :as rnode]
1313
[rewrite-clj.parser :as rparse]))
1414

15-
(def ^:private already-loaded-sci-namespaces
16-
'#{applied-science.js-interop
17-
cljs.math
18-
cljs.repl
19-
clojure.core
20-
clojure.edn
21-
clojure.repl
22-
clojure.set
23-
clojure.string
24-
clojure.template
25-
clojure.walk
26-
nextjournal.clerk
27-
nextjournal.clerk.parser
28-
nextjournal.clerk.render
29-
nextjournal.clerk.render.code
30-
nextjournal.clerk.render.editor
31-
nextjournal.clerk.render.hooks
32-
nextjournal.clerk.render.navbar
33-
nextjournal.clerk.viewer
34-
nextjournal.clojure-mode.commands
35-
nextjournal.clojure-mode.extensions.eval-region
36-
nextjournal.clojure-mode.keymap
37-
reagent.core
38-
reagent.debug
39-
reagent.ratom
40-
user})
15+
(def already-loaded-sci-namespaces
16+
(atom '#{applied-science.js-interop
17+
cljs.math
18+
cljs.repl
19+
clojure.core
20+
clojure.edn
21+
clojure.repl
22+
clojure.set
23+
clojure.string
24+
clojure.template
25+
clojure.walk
26+
nextjournal.clerk
27+
nextjournal.clerk.parser
28+
nextjournal.clerk.render
29+
nextjournal.clerk.render.code
30+
nextjournal.clerk.render.editor
31+
nextjournal.clerk.render.hooks
32+
nextjournal.clerk.render.navbar
33+
nextjournal.clerk.viewer
34+
nextjournal.clojure-mode.commands
35+
nextjournal.clojure-mode.extensions.eval-region
36+
nextjournal.clojure-mode.keymap
37+
reagent.core
38+
reagent.debug
39+
reagent.ratom
40+
user}))
4141

4242
(defn- ns-decl?
4343
"Returns true if form is a (ns ...) declaration."
@@ -72,24 +72,25 @@
7272
exts ["cljs" "cljc"]]
7373
(or (some #(io/resource (str prefix "." %))
7474
exts)
75-
(binding [*out* *err*]
76-
(println "[clerk] Could not find source for CLJS namespace:" ns)))))
75+
(throw (ex-info (str "Could not find source for CLJS namespace: " ns)
76+
{:ns ns
77+
:already-loaded-sci-namespaces @already-loaded-sci-namespaces})))))
7778

7879
(comment
7980
(ns->resource 'viewers.viewer-with-cljs-source)
8081
(ns->resource 'viewers.viewer-lib)
8182
)
8283

83-
(defn require-cljs* [state & nss]
84+
(defn- require-cljs* [state & nss]
8485
(doseq [ns nss]
85-
(when-not (or (contains? already-loaded-sci-namespaces ns)
86+
(when-not (or (contains? @already-loaded-sci-namespaces ns)
8687
(contains? (:loaded-libs @state) ns))
8788
(when-let [cljs-file (ns->resource ns)]
8889
(let [ns-decl (with-open [^java.io.Closeable rdr (e/reader (io/reader cljs-file))]
8990
(read-ns-decl rdr))
9091
ns-decl (e/parse-ns-form ns-decl)
9192
nom (name-from-ns-decl ns-decl)
92-
deps (remove already-loaded-sci-namespaces
93+
deps (remove @already-loaded-sci-namespaces
9394
(deps-from-ns-decl ns-decl))]
9495
(apply require-cljs* state deps)
9596
(swap! state (fn [state]
@@ -109,13 +110,13 @@
109110

110111
;;;; Selection of reader conditionals, borrowed from clj-kondo.impl.utils
111112

112-
(defn first-non-whitespace [nodes]
113+
(defn- first-non-whitespace [nodes]
113114
(some #(when (and (not (rnode/whitespace-or-comment? %))
114115
(not= :uneval (rnode/tag %)))
115116
%)
116117
nodes))
117118

118-
(defn process-reader-conditional [node langs splice?]
119+
(defn- process-reader-conditional [node langs]
119120
(if (and node
120121
(= :reader-macro (rnode/tag node))
121122
(let [sv (-> node :children first :string-value)]
@@ -136,12 +137,12 @@
136137

137138
(declare select-langs)
138139

139-
(defn select-lang-children [node langs]
140+
(defn- select-lang-children [node langs]
140141
(if-let [children (:children node)]
141142
(let [new-children (reduce
142143
(fn [acc node]
143144
(let [splice? (= "?@" (some-> node :children first :string-value))]
144-
(if-let [processed (select-langs node langs splice?)]
145+
(if-let [processed (select-langs node langs)]
145146
(if splice?
146147
(into acc (:children processed))
147148
(conj acc processed))
@@ -152,15 +153,14 @@
152153
new-children))
153154
node))
154155

155-
(defn select-langs
156-
([node langs] (select-langs node langs nil))
157-
([node langs splice?]
158-
(when-let [processed (process-reader-conditional node langs splice?)]
156+
(defn- select-langs
157+
([node langs]
158+
(when-let [processed (process-reader-conditional node langs)]
159159
(select-lang-children processed langs))))
160160

161161
;;;; End selection of reader conditionals
162162

163-
(defn slurp-resource [resource]
163+
(defn- slurp-resource [resource]
164164
(if (str/ends-with? (str resource) ".cljc")
165165
(-> (slurp resource)
166166
(rparse/parse-string-all)

0 commit comments

Comments
 (0)