2023 Long Term Projects: March & April Updates
By Kathy Davis
There is a lot to catch up on! Check out the March and April 2023 updates from:
Bozhidar Batsov
Michiel Borkent
Sean Corfield
Eric Dallo
Christophe Grand
Thomas Heller
Nikita Prokopov
Tommi Reiman
Peter Stromberg
Peter Taoussanis
Bozhidar Batsov
(Published 29 April 2023)
CIDER
- Released CIDER 1.7.
- Deprecate
cider-*-global-options
configuration options. - Document how to load REPL utils in REPL buffers.
- Disable the problematic
paredit-RET
keybinding automatically. - Some work-in-progress work towards adding “debug-on-exception” functionality.
- Discussed how to support
add-lib
in CIDER it’s bundled with Clojure.
inf-clojure
- Updated CI pipeline to match that of CIDER.
- Added the ability to start socket REPLs straight from Emacs (see
inf-clojure-socket-repl
). - That’s similar to
cider-jack-in
clojure-ts-mode
- Improve the CI (made it similar to that of
clojure-mode
). - Various documentation and code consistency updates.
clojure-mode
- Font-lock
defproject
as a keyword.
nREPL
- Make the test suite compatible with Windows.
- Various small Windows-related fixes (e.g. now Unix sockets should work on recent versions of Windows).
- Replace
Makefile
withbb
for portability reasons.
Michiel Borkent
Sponsors
But first off, I’d like to thank all the sponsors and contributors that make this work possible! Top sponsors:
If you want to ensure that the projects I work on are sustainably maintained, you can sponsor this work in the following ways. Thank you!
- Github Sponsors
- The Babaska or Clj-kondo OpenCollective
- Ko-fi
- Patreon
- Clojurists Together
If you’re used to sponsoring through some other means which isn’t listed above, please get in touch. On to the projects that I’ve been working on!
March Report
(Published 07 April 2023)
cherry
Experimental ClojureScript to ES6 module compiler
This month I’ve been preparing cherry as a compiler that you can embed in your existing CLJS / shadow-cljs applications. This makes cherry an additional alternative to SCI and self-hosted CLJS.
Read about embedding cherry into your application here.
I’ve been working on several PRs to include cherry as an additional evaluator in:
scimacs
The Small Clojure Interpreter (SCI) integrated with emacs as a loadable module.
This is a new project by Jack Rusher and I’ve helped him with the SCI integration.
clj2el
Transpile clojure to elisp. A brand new project to transpile Clojure to Elisp.
It might be of value for those who know Clojure better than Elisp and want to have something to get started. It’s far from complete. Try it in the playground here.
deflet
Make let-expressions REPL-friendly!
The deflet
macro lets your write inline-def expressions, while expanding those to regular let expressions, giving you the benefits of REPL-driven development without polluting production code with top level vars.
babashka
Native, fast starting Clojure interpreter for scripting
New release: 1.3.175 (2023-03-18)), 1.3.176 (2023-03-18)
Highlights:
- The
clojure.core.async/go
macro now uses virtual threads. - Many small fixes and upgrades.
- See the complete CHANGELOG.
babashka.json
This is a JSON abstraction library that you can include in babashka and JVM projects while also including your own favorite JSON implementation. The idea is that babashka libraries can include this, while JVM projects don’t have to switch their JSON implementation to cheshire.core.
Babashka compatibility in external libs
I worked together with the maintainers of the following libraries to make them compatible with babashka:
- martian: HTTP abstraction library for Clojure/script, supporting OpenAPI, Swagger, Schema, re-frame and more
clj-kondo
Static analyzer and linter for Clojure code that sparks joy
New release: 2023.03.17 Some highlights:
- #2010: Support inline macro configuration. See docs
- #2010: Short syntax to disable linters:
{:ignore [:unresolved-symbol]}
or{:ignore true}
, valid in ns-metadata,:config-in-ns
,:config-in-call
- #2009: new
:var-same-name-except-case
linter: warn when vars have names that differ only in case (important for AOT compilation and case-insensitive filesystems) - #1269: warn on
:jvm-opts
in top level ofdeps.edn
- #2003: detect invalid arity call for function passed to
update
,update-in
,swap!
,swap-vals!
,send
,send-off
, andsend-via
Check the changelog for details.
SCI
Configurable Clojure/Script interpreter suitable for scripting and Clojure DSLs
New release: 0.7.39 (2023-03-07)
Contributions to other projects:
- clojurescript:
- clojure-lsp: fix reflection issue on JDK 19
- http-kit: add native-image tests
- promesa: fix GraalVM native-image compilation
- etaoin: JDK 19 + babashka issue
Brief mentions:
The following projects also got updates, mostly in the form of maintenance and performance improvements. This post would get too long if I had to go into detail about them, so I’ll briefly mention them in random order:
- CLI: Turn Clojure functions into CLIs!
- quickdoc: Quick and minimal API doc generation for Clojure
- rewrite-clj: Rewrite Clojure code and edn
- sql pods: babashka pods for SQL databases
- squint: CLJS syntax to JS compiler
- pod-babashka-buddy: A pod around buddy core (Cryptographic Api for Clojure).
- gh-release-artifact: Upload artifacts to Github releases idempotently
- edamame: Configurable EDN/Clojure parser with location metadata
- Nbb: Scripting in Clojure on Node.js using SCI
- neil: A CLI to add common aliases and features to deps.edn-based projects
- jet: CLI to transform between JSON, EDN, YAML and Transit using Clojure
- http-client: Babashka’s http-client
Other projects:
These are (some of the) other projects I’m involved with but little to no activity happened in the past month.
- cljs-showcase: Showcase CLJS libs using SCI
- carve - Remove unused Clojure vars
- deps.clj: A faithful port of the clojure CLI bash script to Clojure
- grasp: Grep Clojure code using clojure.spec regexes
- scittle: Execute Clojure(Script) directly from browser script tags via SCI
- quickblog: Light-weight static blog engine for Clojure and babashka
- sci.configs: A collection of ready to be used SCI configs
- lein2deps: leiningen to deps.edn converter
- 4ever-clojure - Pure CLJS version of 4clojure, meant to run forever!
- instaparse-bb
- fs - File system utility library for Clojure
- process: Clojure library for shelling out / spawning sub-processes
- pod-babashka-lanterna: Interact with clojure-lanterna from babashka
- joyride: VSCode CLJS scripting and REPL (via SCI)
Discuss this post here.
Tagged: clojure oss updates
April 2023 Report
(Published: 30 April 2023)
In this post I’ll give updates about open source I worked on during April 2023. To see previous OSS updates, go here.
Babashka-conf
Babashka-conf is happening June 10th in Berlin. Save the date and/or submit your babashka/clojure-related talk or workshop in the CfP!
Projects
The following projects had updates in the last month. Note that only highlights are mentioned and not a full overview of all changes. See the project’s changelogs for all changes.
- clj-kondo: static analyzer and linter for Clojure code that sparks joy.
- babashka: native, fast starting Clojure interpreter for scripting
- cherry Experimental ClojureScript to ES6 module compiler
- Improve
cherry.embed
- Improve
- SCI: Configurable Clojure/Script interpreter suitable for scripting and Clojure DSLs
- Better error message when trying to
recur
acrosstry
- Improvement for error locations in multiple threads
- Better error message when trying to
- edamame: Configurable EDN/Clojure parser with location metadata
- Improvements for reading namespaced maps
- babashka.book: Babashka manual
- Several corrections
- Dynamic
:exec-args
- Script-adjacent
bb.edn
docs
- CLI: Turn Clojure functions into CLIs!
- Support
--no-option
and parse as{:option false}
- Support grouped aliase like
-ome
as{:o true, :m true, :e true}
- Support
- http-client: Babashka’s http-client
- Support
java.net.URI
directly in:uri
option - Better
:ssl-config
option support - Better
:proxy
option support
- Support
- pod-babashka-go-sqlite3: A babashka pod for interacting with sqlite3
- Better error message when connection is not a string
- nbb: Scripting in Clojure on Node.js using SCI
- Fix
:local/root
deps innbb.edn
when not invoking from current working directory - Fix regression,
cljs.core/PersistentQueue.EMPTY
no longer working
- Fix
- instaparse-bb
- Add transform function
- jet: CLI to transform between JSON, EDN, YAML and Transit using Clojure
- Add option to elide commas
- deps.clj: A faithful port of the clojure CLI bash script to Clojure
- Catch up with clojure CLI changes
Contributions to other projects:
- clojurescript:
- malli: cherry integration
- clerk: cherry integration
- clojure-lsp: integrated a new clj-kondo feature: showing the languages in a CLJC context
Other projects:
These are (some of the) other projects I’m involved with but little to no activity happened in the past month.
- process: Clojure library for shelling out / spawning sub-processes
- quickdoc: Quick and minimal API doc generation for Clojure
- rewrite-clj: Rewrite Clojure code and edn
- sql pods: babashka pods for SQL databases
- squint: CLJS syntax to JS compiler
- pod-babashka-buddy: A pod around buddy core (Cryptographic Api for Clojure).
- gh-release-artifact: Upload artifacts to Github releases idempotently
- neil: A CLI to add common aliases and features to deps.edn-based projects
- cljs-showcase: Showcase CLJS libs using SCI
- carve - Remove unused Clojure vars
- grasp: Grep Clojure code using clojure.spec regexes
- scittle: Execute Clojure(Script) directly from browser script tags via SCI
- quickblog: Light-weight static blog engine for Clojure and babashka
- sci.configs: A collection of ready to be used SCI configs
- lein2deps: leiningen to deps.edn converter
- 4ever-clojure - Pure CLJS version of 4clojure, meant to run forever!
- fs - File system utility library for Clojure
- pod-babashka-lanterna: Interact with clojure-lanterna from babashka
- pod-babashka-fswatcher: babashka filewatcher pod
- joyride: VSCode CLJS scripting and REPL (via SCI)
- clj2el: transpile Clojure to elisp
- deflet: make let-expressions REPL-friendly!
- babashka.json: babashka JSON library/adapter
Discuss this post here.
Tagged: clojure oss updates
Sean Corfield
(Published 30 April 2023)
In my previous Long-Term Funding update) I said that I planned “to review and/or overhaul the Getting Started, Introduction, and Web Development sections, with a focus on the latter.” (of the clojure-doc.org website). I mostly achieved that goal but didn’t get to the additional goal I set of writing a tools.build
cookbook. I have sketched out the topics I hope to cover in that cookbook, however.
How did the past two months go?
clojure-doc.org
I updated Getting Started with Clojure to talk about both Leiningen and the Clojure CLI and wrote a new Getting Started with the Clojure CLI page that also covers tools.build
/ build.clj
and building uberjars. Both pages now have a new section highlighting Interactive Development (as opposed to “just” using a REPL).
I reviewed the Introduction to Clojure and decided it was mostly sound, but added more examples, tweaked the formatting, and added references to the Clojure CLI.
I reworked John Gabriele’s excellent Basic Web Development guide to use the Clojure CLI, updated all the library references, and reordered the sections to work bottom-up so that code could always be evaluated in the REPL.
I didn’t get as far as I wanted with the tools.build
cookbook due to a combination of writer’s block (and stress over my mother being taken to hospital unexpectedly for a fractured hip – she’s nearly 90, has osteoporosis, and her oxygen levels are too low/precarious for surgery at this point; she’s home now but it’s been a rough few weeks).
deps-new
As the Practical.li project templates were being developed, John found a bug in the template
project which I fixed and in turn I reviewed drafts of his articles about creating project templates using deps.new
, both of which are now linked from the deps-new
README and documentation.
honeysql
During March/April, HoneySQL saw four new releases, which were mostly an even
split between improving documentation and expanding ANSI SQL support.
Many of the questions I see about HoneySQL on Slack (and other places) suggest
deficiencies in the documentation so, while I try to answer those questions
directly on Slack, I also tend to create GitHub issues for them to see if I
can improve the documentation in those areas.
Some of the ANSI SQL improvements including support for INTERVAL
,
keyword arguments in function calls, nested JOIN
, standardizing TRUNCATE
syntax,
and WITH ORDINALITY
. There were also bug fixes and documentation
improvements around DO UPDATE SET
and a number of other constructs.
I’d also like to give a special shout-out to Eugene Pakhomov who contributed three pull requests to the release that went out in early March.
next.jdbc
next.jdbc
also saw four releases, which provided a mix of bug fixes,
compatibility improvements (with clojure.java.jdbc
, to ease migration),
documentation improvements, and a few enhancements.
next.jdbc.xt
The Juxt team were present in force at
Clojure/conj this year and announced
early access to XTDB 2.0.
I think this will be a very exciting release, with improved bitemporality
(including temporal joins and range scans), a new columnar architecture,
and – the part that interests me the most – a dynamic relation engine
that provides both a Datalog API and a SQL API.
That inspired me to create a new project, offering experimental support
for XTDB 2.0 in next.jdbc
: next.jdbc.xt
.
This allows you to treat an XTDB client “node” as a “connectable” so
you can call execute!
, execute-one!
, and plan
on it (as well as the
full range of “friendly SQL functions”).
As XTDB 2.0 evolves, I plan to continue to enhance this new project to
hopefully support batch operations and perhaps full transaction support, if possible.
What’s Next?
In May/June, I hope to get the tools.build
cookbook written and
to review/overhaul the Libraries pages (both authoring and the directory).
Tags:“clojure” “clojure-doc.org” “open source” “tools.build” “community”
Eric Dallo
(Published 1 May 2023)
These 2 months I spent a considerable time improving java interop support in both clj-kondo and clojure-lsp, so LSP can understand it better and provide completion, definition, hover and other features in a close future as mentioned below.
clojure-lsp
The main highlights for this release are:
- clojure-lsp feedback for Editor UI is faster (Emacs users you may notice that reducing
lsp-idle-delay
to something lower like0.05
) - We now have a new edn tree visualization from
documentSymbolfeature
, showing all keyords of a edn for faster navigation/visualization! - Adds support for completion of Static java classes (for now only for classes from .class, not .java, check print), I’m working on improvements on clj-kondo and clojure-lsp to improve that even further being able to see docs of java methods and more, stay tuned!
2023.04.19-12.43.29
General:
- Fix reflection issue in JDK19 with
Thread/sleep
#1520 - Bump clj-kondo to
2023.04.15-20230418.173453-3
, fixing analysis inconsistencies withschema.core
- Ignore vars defined wrongly via config. #1510
- Add support for
:output {:langs true}
in clj-kondo config to show.cljc
language contexts
Editor:
- Fix classpath issue message to properly ignore or retry after user input. #1500
- Decreate debounce time for calculating changes and diagnostics, improving UX in cost of performance, it doesn’t seem to highly affect performance though.
- Add new setting to change diagnostics range type. #1530
- Spec compliance: avoid registering client capabilities if dynamic registration is not set. #1535
- Improve java support: using new
java-member-definitions
analysis, first feature is the allow completion of static members (fields and methods) for java classes. - Show edn tree when in edn files via
documentSymbol
feature. - Improve java db cache consistency + analysis performance.
clj-kondo
#2503: parse java files via javaparser to produce java-member-definitions analysis #1983: add support for java member analysis, via new java-member-definitions bucket (@ericdallo).
ClojureConj 2023
I gave a talk at ClojureConj about how to use clojure-lsp as a linter for multiple projects and how to manage everything in a single place, should be available soon in https://www.youtube.com/@ClojureTV/videos
Christophe Grand
(Published 4 May 2023)
ClojureDart
The period ended with the Conj and our ClojureDart talk was well received 🎉. Still it’s worth repeating the core message: ClojureDart is useable right now! You can use it to write mobile or desktop apps, CLIs and lambdas. Web even. It doesn’t mean our work is done but language-wise the only missing feature are multimethods. Macros do work but sometimes need some annotations – this will be fixed once we are self-hosted. And there are so many places where we can still make interop nicer.
Speaking of self-hosted, the reader rewrite (the previous one was accidentally quadratic 🙄) is coming to fruition now that the design is settled. Design took time because I wanted to have a chunked reader, so as to be able to process big files and REPL input.
A lot of time was spent fixing bugs or making usability improvements (I’m looking forward to porting gen tests from CLJ/CLJS) and helping users on Slack. More often than not fixes/improvements were an answer to users experiences.
Fixes:
Chunked seqs on vectors (twice!), inconsistent hash values across platforms (web vs others), fixed cross-nses protocols which AOT compiled fine but failed on hot-reload, fixed bug with collisions on transient maps, fixed issue with comparator fns.
Improvements:
- better error message on macro expansion failure,
- update README Flutter example to use
cljd.flutter
(plain interop before) as we are confident with our design now and that the default experience (especially towards hot reloading works as expected) - removed small inefficiencies in maps
- tear-off support: unlike in JS, in Dart
obj.meth
returns a function closing overobj
asthis
– likeobj.meth.bind(obj)
would do in JS. That’s what they call “tear-offs” in Dart. We have added (or rather re-enabled) support for tear-offs in Dart. More work needs to be done for better type inference of the returned function. - removed
nullWriter
usage which required Java 11 and caused bad first experiences for some users. So now Java 8 is enough.
New features:
- sorted colls are at parity with Clojure’s: rseq, subseq, rsubseq support have been added.
- rseq on subvecs
- in
cljd.flutter
,:watch
accepts an:as
option for the common case of local state, e.g.:watch [the-value (atom nil) :as the-atom]
. Previously the more involved:managed [the-atom (atom nil) :dispose nil] :watch [the-value the-atom]
was required and non-obvious to many users. While we are on it:dispose nil
(orfalse
) is new too: previously to have the same effect (no disposal) you had to write hacks such as:dispose comment
,:dispose do
,:dispose ->
…
Future work:
ClojureDart
- Finish the new chunked reader
- We have found a path allowing a Flutter-only REPL could be hacked in a couple of days, is it worth the hack?
- Look into porting Datascript and SCI to ClojureDart
- New APIs to leverage our persistent data structures:
- maps (hash and sorted) in ClojureDart are original implementations (not the same as CLJ/CLJS) – hash maps could be seen as another refinement of the original, sorted maps constitute a novel implementation.
- Sorted colls should be good enough for direct use by Datascript.
- Both hash and sorted maps can support accelerated merge/diff/join/etc. operations.
- Multimethods
- Dart 3 support
cljd
CLI written incljd
for easier project creation etc.- gen tests
Thomas Heller
(Published 3 May 2023)
shadow-cljs
Time was mostly spent on doing maintenance work and some bugfixes. As well as helping people out via the typical channels (eg. Clojurians Slack).
Current shadow-cljs version: 2.23.3 Changelog
Notable Updates:
- Tweaked :js-provider :external to optionally output ESM code (JS
import
), which enables some tools such as webpack to tree shake npm dependencies properly.
Nikita Prokopov
(Published 1 May 2023)
Three big things happened in the last two months:
- Clojure Sublimed 3.0 release with new pluggable REPL infrastructure and Socket Server REPL support
- Proper accented input support in JWM on macOS
- Majority of research for new state implementation and component DSL for Humble UI
Humble UI
- Text fields now support accented input with ApplePressAndHoldEnabled on macOS
- Basic paragraph impl (!)
- Fixed linux dependencies #72
- Setting/Debug toggle works across tools.namespace reloads
- fixed label to apply all features instead of just last one
- Draw inside vscroll uses child height instead of Integer/MAX_VALUE
- Preliminary signals impl
- Treemap example that scans a directory on your disk and displays what occupies the most space
- Switched to Socket REPL
- hash-p for easier debugging
JWM
- macOS: Fixed missed trackpad clicks when tap to click is enabled. This has been annoying me and few other folks for quite a while, turned out you can’t trust AppKit API, but luckily can work around it.
- macOS: Reworked text input system to support accented input with ApplePressAndHoldEnabled. Also quite a ride, at some point I had to dig into OpenJDK sources and use same proprietary APIs Apple built into macOS just for AWT (accented input was added much later than JDK).
- Windows: Merged Window::bringToFront & ::isFront #266
Clojure Sublimed
- Released 3.0.0 and some quick fixes (3.1.0) after that.
- Documented my journey at Adventures in REPL implementation
Sublime Executor
- Convenience: executor_repeat_last will now automatically stop current process if present. Stop + start again now is a single command!
- Execute any shell command #4
Uberdeps:
- Fixed merging data_readers.cljc with reader conditionals #51
Blogging:
- Adventures in REPL implementation. It even inspired some people to implement their own REPLs!
- Humble Chronicles: State Management. Great feedback on that one, with lots more to learn!
Tommi Reiman
(Published 03 April 2023)
Malli
- pushed out 3 patch and 1 minor releases (0.10.2, 0.10.3, 0.10.4 and 0.11.0) with lot’s of stuff in
Reitit
- mostly reviewing and helping with upcoming OpenAPI3 release, releasing it next month
New stuff
- worked on
metosin/viesti
and the attached state machine abstraction, something have used in project, planning to push as open source. - created
metosin/ctrl-merge
, a fork ofweavejester/meta-merge
with breaking changes needed to simplify reitit interanls. Rationale on fork here.
Malli CHANGELOG
0.11.0 (2023-04-12)
- BREAKING: remove map syntax:
mu/from-map-syntax
,mu/to-map-syntax
. Note that AST syntax and lite syntax remain unchanged. - BREAKING: walking a
:schema
with anid
no longer passes[id]
instead ofchildren
to the walker function [#884] (https://github.com/metosin/malli/issues/884) - Support converting recursive malli schemas to json-schema #464 #868
- Add cherry as alternative CLJS evaluator #888
- Replace
goog/mixin
withObject.assign
#890 - Simplify uuid regex for accept non-standard and zero uuids #889
- Fix clj-doc API import #887
0.10.4 (2023-03-19)
- FIX
malli.swagger
ns, broken test on reitit.
0.10.3 (2023-03-18)
- Add support for default branch
::m/default
for:map
schema #871, see docs: README.md#map-with-default-schemas.
(m/validate
[:map
[:x :int]
[:y :int]
[::m/default [:map-of :string :string]]]
{:x 1, :y 2, "kikka" "kukka"})
; => true
mt/strip-extra-keys-transformer
works with:map-of
.
(m/decode
[:map-of :int :int]
{1 1, 2 "2", "3" 3, "4" "4"}
(mt/strip-extra-keys-transformer))
; => {1 1}
m/default-schema
to pull the::m/default
schema from entry schemasm/explicit-keys
to get a vector of explicit keys from entry schemas (no::m/default
)- Simplify content-dependent schema creation with
m/-simple-schema
andm/-collection-schema
via new 3-arity:compile
function of typechildren properties options -> props
. Old 2-arity top-level callback function ism/deprecated!
and support for it will be removed in future versions. #866 - FIX Repeated calls to
malli.util/assoc-in
referencing non-existing maps fail #874 - Updated dependencies:
borkdude/edamame 1.1.17 -> 1.3.20
0.10.2 (2023-03-05)
- Implement
malli.experimental.time
schemas for clojurescript using js-joda #853 - Allow instrumenting external functions #841
- Add clj-kondo support for cljs function schemas #833
- Turn on instrumentation for
mx/defn
with:malli/always
meta #825 - Support type-properties in
m/-map-schema
,m/-map-of-schema
andm/-tuple-schema
#856 - FIX: properly compose interceptors in :map-of json-transformer #849
- FIX: error paths for
:multi
schemas when value is not a map #845 - FIX: Malli generates
:nilable/any
which is not a valid type in clj-kondo #821 - FIX:
mi/collect!
without args doesn’t work properly #834 - Updated dependencies:
mvxcvi/mvxcvi 2.0.0 -> 2.1.0
borkdude/edamame 1.0.0 -> 1.1.17
Something else
Retuning from my first Conj, really enjoyed the trip!
Peter Stromberg
(Published 3 May 2023)
It’s fantastic being sponsored to work on something I love to work with, for people I love to work for. These two month I have been even more user feedback driven than usual. Letting the conversations with users inform me where Calva could help them better. I have then quite immediately addressed the things I think I understand how to address.
With other things it can take quite some time to understand what should be done. The idea for a solution needs to present itself, but some times the idea is very shy! This has been the case with REPL connection automation. It’s an area where Calva is strong, yet it hasn’t been possible to bring it to zero interaction, and some users really want that. Now, finally, Calva can quite easily be configured for this. While at it, Calva REPL start and connection (a.k.a. Jack-in) is now available for many more projects, even with quite special setup requirements. The solution was to let the user provide their own scripts and Calva will call the script providing environment and command line arguments to control that the REPL is started in a shape that Calva needs it to be. It’s quite obvious, but it took several years to figure it out. 😄
A common mistake in monorepos was to use the Calva command for copying the Jack-in command line for a particular project and then run this command line in the wrong monorepo directory. Note the past tense there. Now the copied command can be run from any directory on the computer. Further, the problems on some OS:s with Calva Jack-in zombies walking around after a REPL session are now much less pronounced.
Another thing that talking to users make obvious is that a lot of Calva’s functionality is something of a secret. It is satisfying to be able to answer: ”How do I do X?” with: ”There’s a settings Y”, or ”Use the command Z”. Though, this often means that Calva is making Y and Z hard to find. We’ve now been able to focus a bit on this and to use feedback from users to surface important REPL functionality better.
Calva Notebooks got some nice attention from Kira McLean at The Conj. As great as the Notebooks are for some users, a bug in VS Code LiveShare has made the Notebook feature a blocker for using Calva in LiveShare sessions. Stefan van den Oord have been maintaining a build of Calva with Notebooks disabled, but many users probably have had no idea about this. We finally found a more convenient workaround, where we can ship the Notebook configuration in a separate extension (named Calva Spritz) that is bundled with Calva. This extension can easily be disabled during LiveShare sessions.
As a side effect to the LiveShare and Notebooks problem workaround, we also realized that the same mechanism can be used to make Joyride reach the parts of the VS Code API we thought was denied to Joyride scripts. Users can provide Joyride with a Sidecar extension manifest, and this way control all of VS Code with ClojureScript, in user space.
** Some more things we got done:
- Add commands for copying HTML code as Hiccup, and also for pasting HTML code as Hiccup.
- Provide access to clojure-lsp commands from VS Code keyboard shortcuts (and from Joyride).
- Add some more Rich Comment Form evaluation convenience.
- Fix many issues with Calva’s Clojure indenter, and also a few regarding the formatter.
During the past months both Brandon Ringe and I have gotten increasingly fed up with a family of problems stemming from the limitations posed by using a regular file for REPL output, and other output, and also for REPL input. This is a bit ironic because with the Clojurists Together Summer of Bugs 2020 sponsoring, I used a lot of the time to get rid of the problematic Webview solution for REPL Window that Calva had back then. Misunderstand this correctly (as we say in Sweden), the regular file solution has served Calva very well, and saved us from the impossible task of fixing the problems with the old Webview. But the limitations are getting too obvious, and now replacing the regular file REPL Window with one based on a Webview is a hot candidate for our time spent the coming two months…
Peter Taoussanis
(Published 25 April 2023)
Mar/Apr 2023 updates for Peter Taoussanis More details now also at taoensso.com/clojure/2023 👍
http-kit
http-kit v2.7.0-beta2 has been released 🎉 This is the first major http-kit release since June 2022, and includes work from 15 contributors.
Improvements include:
- Several important stability fixes
- Client+server support for Unix Domain Sockets
- SNI client is now enabled by default on Java 8+
- A new wiki for community documentation See the release notes for more info.
Tempel
One of my major open-source goals for this year is the release of a new data security framework, currently planned for August. This will be the first major all-new Clojure work I’ve put out in over 7 years, and has been my main focus so far this year.
Will share more details closer to release, but as a quick teaser: the high-level goal is to make it easy for non-experts to quickly integrate solid data encryption into a variety of types of apps. The work is being grown from an expansion of techniques I’ve used in my own apps, and heavily optimised for ease-of-use.
More beginner-focused documentation
Another of my goals for this year (and moving forward) is to put more emphasis on documentation quality, and on providing a smoother experience for beginners.
As part of that work, I’ve started rolling out GitHub wikis for community documentation on my various projects.
I’ll be seeding these myself over time, but ultimately my hope is to make it easier and more sustainable for each project’s own community to contribute documentation and tips. Tempel (mentioned above) will be my first release to be built from the start with this wiki-focused documentation concept in mind.
What’s next:
The current plan:
- A major Sente release in May.
- A major Carmine release in June.
- The first Tempel release in August.
- Additional Carmine work through EoY.
A big thanks to Clojurists Together, Nubank, lambdaschmiede, and other sponsors of my open-source work 🙏