| I came to the comments to make a similar assertion of Clojure(script) being fun.
Usually I work in IntelliJ with Cursive. VSCode with calva isn't bad. The stack for my project is: Backend: Redis (no relational DB needed for my use case) Clojure: Carmine - (redis interop) Reitit - Nice API definition and routing Malli - Nice schema validation and coercion Timbre - Logging without known RCE vulnerability ;) Frontend: Clojurescript Figwheel - CLJS compiling and hot-reloading in browser. Would probably use ShadowCLJS these days though. Rum - It's a simple wrapper around react, with Hiccup-style list syntax for HTML. Though in a do-over I'd probably try Reagent since it seems to have a bigger ecosystem of wrapped react libraries, but I really like Rum best. That said, it's also not that hard to use native JS React components with Rum. All of the libraries and idioms in this stack guide the design to push side effects out to the edges of the program - this makes testing easier in a lot of cases. E.g., for a web request you can craft a test request, or pretty-print a literal request object and paste it into your code, then pass it to your API in Reitit without an http-server attached, and get back the result object, and assert that it matches the desired output. Clojure's mutability make it pretty simple to stub or mock calls to storage, or to create a fixture to use a test database. |