Editors
REPL-Tooling Clients
Chlorine, Clover and Clematis are all implementations of the same library: REPL-Tooling. In this post I will show you how to create a new implementation of it in a way that’s completely disconnected from any editors, so you can grasp the general concepts.
Suppose I want to do an implementation for an editor that doesn’t run JavaScript – so it’ll connect by some kind of socket. In this example I’m going to use WebSockets because… why not?
We’re going to create a shadow-cljs node project and add repl-tooling as a dependency. We will also had some more dependencies: mostly ws for websockets and the same react libraries that we use for reagent (react, create-react-class and react-dom) – repl-tooling still needs reagent, and probably in the future I will split it into two different libraries (one for the REPL handling and other for the visual rendering part). This supposedly is not to much of a problem because ClojureScript compiler will probably remove these parts in the dead code elimination process anyway. So, our package.json file will just be like this:
{
"name": "ws-repl",
"devDependencies": {
"shadow-cljs": "^2.8.83"
},
"dependencies": {
"create-react-class": "^15.6.3",
"install": "^0.13.0",
"react": "^16.12.0",
"react-dom": "^16.12.0",
"ws": "^7.2.1"
}
}
And our shadow-cljs.edn file:
{:source-paths ["src"]
:dependencies [[repl-tooling "0.4.0"]]
:builds {:node {:output-to "index.js"
:target :node-script
:main ws-repl.core/main}}}
The first step is when someone connects to the WebSocket. Then, we’ll just create a connection to the client, and send a list of supported commands – for now, is just the “connect” command:
(more…)