Skip to content
This repository was archived by the owner on Nov 6, 2025. It is now read-only.

Commit bc93330

Browse files
committed
First stab at CLJS repl API
1 parent 484c5cc commit bc93330

File tree

5 files changed

+76
-31
lines changed

5 files changed

+76
-31
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,4 @@ bin/
3333
.lsp/
3434
.nrepl-port
3535
*.edn
36+
out/

build.gradle.kts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@ dependencies {
2727
implementation("org.gradle:gradle-tooling-api:7.5")
2828
testRuntimeOnly("org.ajoberstar:jovial:0.3.0")
2929
devRuntimeOnly("org.slf4j:slf4j-simple:1.7.36")
30+
31+
compileOnly("org.clojure:clojurescript:1.11.60")
32+
devImplementation("org.clojure:clojurescript:1.11.60")
33+
34+
compileOnly("cider:piggieback:0.5.3")
35+
devImplementation("cider:piggieback:0.5.3")
3036
}
3137

3238
tasks.withType<Test>() {
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
(ns dev.clojurephant.tooling.api
2+
(:require [dev.clojurephant.tooling.core :as core]
3+
[clojure.string :as string]))
4+
5+
(defonce db (atom {}))
6+
7+
(defn connect [dir]
8+
(swap! db update :con
9+
(fn [existing-con]
10+
(if existing-con
11+
(throw (ex-info "Must close existing connection" {}))
12+
(core/connect dir)))))
13+
14+
(defn close []
15+
(swap! db update :con
16+
(fn [existing-con]
17+
(when existing-con
18+
(.close existing-con)
19+
nil))))
20+
21+
(defn model []
22+
(swap! db (fn [current-db]
23+
(if-let [con (:con current-db)]
24+
(let [m (core/wait (core/clojurephant-model con))]
25+
(if (= :success (:result m))
26+
(assoc current-db :model (read-string (.getEdn (:value m))))
27+
(throw (ex-info "Failed to get Clojurephant model"
28+
(select-keys m [:error])))))
29+
(throw (ex-info "Cannot get model until connect" {}))))))
30+
31+
(defn reroot-cljs-build [build new-dir]
32+
(let [old-dir (:output-dir build)
33+
replacer (fn [dir]
34+
(cond
35+
(nil? dir) nil
36+
(boolean? dir) dir
37+
:else (string/replace dir old-dir new-dir)))]
38+
(-> (:compiler build)
39+
(update-in [:output-dir] replacer)
40+
(update-in [:output-to] replacer)
41+
(update-in [:source-map] replacer))))
42+
43+
(defn repl-cljs-builds []
44+
(let [m (:model @db)
45+
repl-dir (-> m :repl :dir)
46+
builds (:clojurescript m)]
47+
(into {} (map (fn [[id build]]
48+
[id (reroot-cljs-build build repl-dir)]))
49+
builds)))
50+
51+
(defn repl-cljs-build [id]
52+
(get (repl-cljs-builds) id))
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
(ns dev.clojurephant.tooling.repl.browser
2+
(:require [dev.clojurephant.tooling.api :as api]
3+
[cljs.build.api :as build]
4+
[cljs.repl.browser :as browser]
5+
[cider.piggieback :as piggieback]))
6+
7+
(defn cljs-build [id]
8+
(let [opts (api/repl-cljs-build id)]
9+
(build/build opts)))
10+
11+
(defn cljs-repl []
12+
(let [opts (api/repl-cljs-build :dev)]
13+
(piggieback/cljs-repl
14+
(browser/repl-env)
15+
opts)))
Lines changed: 2 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,5 @@
11
package dev.clojurephant.plugin.common;
22

3-
import java.util.Objects;
4-
5-
public class ClojurephantModel {
6-
private String edn;
7-
8-
public ClojurephantModel(String edn) {
9-
this.edn = Objects.requireNonNull(edn, "EDN must not be null.");;
10-
}
11-
12-
public String getEdn() {
13-
return edn;
14-
}
15-
16-
@Override
17-
public boolean equals(Object that) {
18-
if (that instanceof ClojurephantModel) {
19-
return this.edn.equals(((ClojurephantModel) that).edn);
20-
} else {
21-
return false;
22-
}
23-
}
24-
25-
@Override
26-
public int hashCode() {
27-
return edn.hashCode();
28-
}
29-
30-
@Override
31-
public String toString() {
32-
return edn;
33-
}
3+
public interface ClojurephantModel {
4+
String getEdn();
345
}

0 commit comments

Comments
 (0)