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…)