In this post I'll give updates about open source I worked on during October 2023.
To see previous OSS updates, go here.
I'd like to thank all the sponsors and contributors that make this work possible! Open the details section for more info.
Sponsor info
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!
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!
Updates
Here are updates about the projects/libraries I've worked on last month.
- babashka: native, fast starting Clojure interpreter for scripting.
- Support self-contained binaries as uberjars!
- Add
java.security.KeyFactory
, java.security.spec.PKCS8EncodedKeySpec
, java.net.URISyntaxException
- Fix babashka.process/exec wrt
babashka.process/*defaults*
- #1632: Partial fix for
(.readPassword (System/console))
- Enable producing self-contained binaries using uberjars
- Bump httpkit to
2.8.0-beta3
(fixes GraalVM issue with virtual threads) - Bump
deps.clj
and fs
- Expose
taoensso.timbre.appenders.core
- nREPL: implement
ns-list
op - SCI: optimize
swap!
, deref
and reset!
for normal atoms (rather than user-created IAtom
s)
- sci.configs: A collection of ready to be used SCI configs.
- A configuration for hoplon and javelin was added. You can play around with hoplon in a SCI-enabled environment here
- clj-kondo: static analyzer and linter for Clojure code that sparks joy.
- #2207: New
:condition-always-true
linter, see docs) - #2013: Fix NPE and similar errors when linting an import with an illegal token
Published a new version (2023.10.20) with these changes: - #1804: new linter
:self-requiring-namespace
- #2065: new linter
:equals-false
, counterpart of :equals-true
(@svdo) - #2199: add
:syntax
check for var names starting or ending with dot (reserved by Clojure) - #2179: consider alias-as-object usage in CLJS for :unused-alias linter
- #2183: respect
:level
in :discouraged-var
config - #2184: Add missing documentation for
:single-logical-operand
linter (@wtfleming) - #2187: Fix type annotation of argument of
clojure.core/parse-uuid
from nilable/string
to string (@dbunin) - #2192: Support
:end-row
and :end-col
in :pattern
output format (@joshgelbard) - #2182: Namespace local configuration does not silence
:missing-else-branch
- #2186: Improve warning when
--copy-configs
is enabled but no config dir exists - #2190: false positive with
:unused-alias
and namespaced map - #2200: include optional
:callstack
in analysis
- squint: CLJS syntax to JS compiler
Lots of stuff happened in October with squint!- #350:
js*
should default to :context :expr
- #352: fix
zero?
in return position - Add
NaN?
(@sher) - #347: Add
:pre
and :post
support in fn
- Add
number?
- Support
docstring
in def
- Handle multipe source
:paths
in a more robust fashion - #344: macros can't be used via aliases
- Add
squint.edn
support, see docs - Add
watch
subcommand to watch :paths
from squint.edn
- Make generated
let
variable names in JS more deterministic, which helps hot reloading in React - Added a vite + react example project.
- Resolve symbolic namespaces
(:require [foo.bar])
from :paths
- Add
bit-and
and bit-or
- Include
lib/squint.core.umd.js
which defines a global squint.core
object (easy to use in browsers, see docs) - Add
subs
, fn?
, re-seq
- Add
squint.edn
with :paths
to resolve macros from (via :require-macros
)
- neil: A CLI to add common aliases and features to deps.edn-based projects Version 0.2.62 released
- Fix NPE during
neil dep upgrade
- clojure-mode
- Porting this CLJS project such that it can run with squint also. You can now use this library directly from NPM as a JS library. See this page for a demo on how to use it directly from a CDN! This work is funded by Nextjournal.
- cherry: Experimental ClojureScript to ES6 module compiler
- grasp: Grep Clojure code using clojure.spec regexes
- Fix self-requiring namespace (which clj-kondo now also catches via optional linter!)
- lein-clj-kondo: a leiningen plugin for clj-kondo
- http-kit: Simple, high-performance event-driven HTTP client+server for Clojure.
- #543 Migrate away from
SimpleDateFormat
to java.time
, fixes native-image issue and virtual threads
- http-client: babashka's http-client
- A number of small bugfixes and additions
- SCI: Configurable Clojure/Script interpreter suitable for scripting and Clojure DSLs
- Expose
destructure
to scripts - Macroexpand
(.foo bar)
form in macroexpand-1
- Optimize
deref
, swap!
, reset!
for host values - Add
time
macro
- nbb: Scripting in Clojure on Node.js using SCI
sci.core
itself was exposed to nbb users
- fs - File system utility library for Clojure
- Minor fixes in
glob
by @eval, thanks!
- deps.clj: A faithful port of the clojure CLI bash script to Clojure
- Get home directory via environment variable rather than system property by @DerGuteMoritz, thanks!
- babashka.nrepl: The nREPL server from babashka as a library, so it can be used from other SCI-based CLIs
- Fix
classpath
op - Implement
ns-list
op
Other projects
These are (some of the) other projects I'm involved with but little to no activity happened in the past month.
Click for more details
- [rewrite-edn](https://github.com/borkdude/rewrite-edn): Utility lib on top of
rewrite-clj with common operations to update EDN while preserving whitespace
and comments
- [tools-deps-native](https://github.com/babashka/tools-deps-native) and [tools.bbuild](https://github.com/babashka/tools.bbuild): use tools.deps directly from babashka
- [CLI](https://github.com/babashka/cli): Turn Clojure functions into CLIs!
- [jet](https://github.com/borkdude/jet): CLI to transform between JSON, EDN, YAML and Transit using Clojure
- [quickdoc](https://github.com/borkdude/quickdoc): Quick and minimal API doc generation for Clojure
- [pod-babashka-go-sqlite3](https://github.com/babashka/pod-babashka-go-sqlite3): A babashka pod for interacting with sqlite3
- [pod-babashka-fswatcher](https://github.com/babashka/pod-babashka-fswatcher): babashka filewatcher pod
- [edamame](https://github.com/borkdude/edamame): Configurable EDN/Clojure parser with location metadata
- [lein2deps](https://github.com/borkdude/lein2deps): leiningen to deps.edn converter
- [scittle](https://github.com/babashka/scittle): Execute Clojure(Script) directly from browser script tags via SCI
- [sql pods](https://github.com/babashka/babashka-sql-pods): babashka pods for SQL databases
- [cljs-showcase](https://github.com/borkdude/cljs-showcase): Showcase CLJS libs using SCI
- [process](https://github.com/babashka/process): Clojure library for shelling out / spawning sub-processes
- [babashka.book](https://github.com/babashka/book): Babashka manual
- [instaparse-bb](https://github.com/babashka/instaparse-bb)
- [rewrite-clj](https://github.com/clj-commons/rewrite-clj): Rewrite Clojure code and edn
- [pod-babashka-buddy](https://github.com/babashka/pod-babashka-buddy): A pod around buddy core (Cryptographic Api for Clojure).
- [gh-release-artifact](https://github.com/borkdude/gh-release-artifact): Upload artifacts to Github releases idempotently
- [carve](https://github.com/borkdude/carve) - Remove unused Clojure vars
- [quickblog](https://github.com/borkdude/quickblog): Light-weight static blog engine for Clojure and babashka
- [4ever-clojure](https://github.com/oxalorg/4ever-clojure) - Pure CLJS version of 4clojure, meant to run forever!
- [pod-babashka-lanterna](https://github.com/babashka/pod-babashka-lanterna): Interact with clojure-lanterna from babashka
- [joyride](https://github.com/BetterThanTomorrow/joyride): VSCode CLJS scripting and REPL (via [SCI](https://github.com/babashka/sci))
- [clj2el](https://borkdude.github.io/clj2el/): transpile Clojure to elisp
- [deflet](https://github.com/borkdude/deflet): make let-expressions REPL-friendly!
- [babashka.json](https://github.com/babashka/json): babashka JSON library/adapter
- [deps.add-lib](https://github.com/borkdude/deps.add-lib): Clojure 1.12's add-lib feature for leiningen and/or other environments without a specific version of the clojure CLI