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:
1 2 3 4 5 6 7 8 9 10 11 12 13 | { "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:
1 2 3 4 5 6 | { :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…)