In this post I'll give updates about open source I worked on during January and February 2024.
To see previous OSS updates, go here.
I'd like to thank all the sponsors and contributors that make this work possible. Like you can read on Bozhidar
Batsov's blog these aren't the easiest times for Open Source sponsored software. I have no reason to complain, but I did see a similar drop in sponsoring in the last year. I'm thankful for those who sponsored my projects in the past and even more for those who keep doing so!
Without you, the below projects would not be as mature or wouldn't exist or be maintained at all.
Current top tier sponsors:
Open the details section for more info about sponsoring.
Sponsor info
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.
- clj-kondo: static analyzer and linter for Clojure code that sparks joy. Released 2024.02.12
- #2276: New Clojure 1.12 array notation (
String*
) may occur outside of metadata - #2278:
bigint
in CLJS is a known symbol in extend-type
- #2288: fix static method analysis and suppressing
:java-static-field-call
locally - #2293: fix false positive static field call for
(Thread/interrupted)
- #2093: publish multi-arch Docker images (including linux aarch64)
- #2274: Support clojure 1.12 new type hint notations
- #2260: calling static field as function should warn, e.g.
(System/err)
- #1917: detect string being called as function
- #1923: Lint invalid fn name
- #2256: enable
assert
in hooks - #2253: add support for
datomic-type-extensions
to datalog syntax checking - #2255: support
:exclude-files
in combination with linting from stdin + provided --filename
argument - #2246: preserve metadata on symbol when going through
:macroexpand
hook - #2254: lint files in absence of config dir
- #2251: support suppressing
:unused-value
using :config-in-call
- #2266: suppress
:not-a-function
linter in reader tag - #2259:
ns-map
unmaps var defined prior in namespace - #2272: Report var usage in
if
/when
condition as always truthy, e.g. (when #'some-var 1)
- squint: CLJS syntax to JS compiler
- #472: Use consistent alias
- #474: fix JSX fragment
- #475: don't crash watcher on deleting file
- Add
simple-benchmark
- #468: Keywords in JSX should render with hyphens
- #466: Fix
doseq
expression with set!
in function return position - #462: Add
"exports"
field to package.json
- #460: escape
<
and >
in JSX strings - #458: don't emit
null
in statement position - #455: don't export non-public vars
- Fix infix operator in return position
- Allow playground to use JSX in non-REPL mode
- Add transducer arity to all existing core functions
- babashka: native, fast starting Clojure interpreter for scripting. Two releases in the past two months with the following changes:
- #1660: add
:deps-root
as part of hash to avoid caching issue with deps.clj
- #1632: fix
(.readPassword (System/console))
by upgrading GraalVM to 21.0.2
- #1661: follow symlink when reading adjacent bb.edn
- #1665:
read-string
should use non-indexing reader for compatibilty with Clojure - Bump edamame to 1.4.24
- Bump http-client to 0.4.16
- Bump babashka.cli to 0.8.57
- Uberjar task: support reader conditional in .cljc file
- Support reader conditional in .cljc file when creating uberjar
- Add more
javax.net.ssl
classes - #1675: add
hash-unordered-coll
- #1658: fix command line parsing for scripts that parse
--version
or version
etc - Add
clojure.reflect/reflect
- Add
java.util.ScheduledFuture
, java.time.temporal.WeekFields
- Support
Runnable
to be used without import - Allow
catch
to be used as var name - #1646: command-line-args are dropped when file exists with same name
- #1645: Support for
clojure.lang.LongRange
- #1652: allow
bb.edn
to be empty - #1586: warn when config file doesn't exist and
--debug
is enabled - #1410: better error message when exec fn doesn't exist
- Bump
babashka.cli
to 0.8.55
which contains subcommand improvements - Bump
deps.clj
to 1.11.1.1435
- Bump
babashka.fs
to 0.5.20
- Compatibility with
plumbing.core
- Compatibility with
shadow.css
by improving tools.reader
compatibility - #1647: Allow capturing env vars at build time (only relevant for building bb)
- process: Clojure library for shelling out / spawning sub-processes
- #123:
exec
now converts :env
and :extra-env
keywords (@lread) - #140: accept
java.nio.file.Path
as :dir
argument - #148: accept
Path
in :out
, :err
and :in
- Support
:out :bytes
(@hansbugge)
- babashka.json: babashka JSON library/adapter
- Released version 0.1.6 which fixes
:key-fn
+ read
behavior for cheshire
- tools-deps-native and tools.bbuild: use tools.deps directly from babashka
- Upgraded the underlying tools.build version to the latest version used in tools.build (the very latest wasn't compatible with tools.build!)
- edamame: Configurable EDN/Clojure parser with location metadata
- Support new
^[String]
metadata notation which desugars into ^{:param-tags [String]}
- Add
:map
and :set
options to coerce map/set literals into customizable data structures, for example, an ordered collections to preserve key order.
- nbb: Scripting in Clojure on Node.js using SCI
- Add
cljs.test/run-test
macro - Add cljs.core/Atom
- Add promesa
promesify
- http-client: babashka's http-client
- #45: query param values are double encoded
- CLI: Turn Clojure functions into CLIs!
- Fix #82: prefer alias over composite option
- Add
:opts
to :error-fn
input - Fix command line args for test runner
--dirs
, --only
, etc - Fix
--no-option
(--no
prefix) in combination with subcommands - Prioritize
:exec-args
over spec :default
s dispatch
improvements (@Sohalt, @borkdude):- The
:cmds
order of entries in the table doesn't matter - Support parsing intermediate options:
foo --opt1=never bar --opt2=always
- SCI: Configurable Clojure/Script interpreter suitable for scripting and Clojure DSLs
- Bump edamame
- Add
hash-ordered-coll
read-string
should use non-indexing reader
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
- http-server: serve static assets
- cherry: Experimental ClojureScript to ES6 module compiler
- fs - File system utility library for Clojure
- neil: A CLI to add common aliases and features to deps.edn-based projects
- squint-macros: a couple of macros that stand-in for applied-science/js-interop and promesa to make CLJS projects compatible with squint and/or cherry.
- sci.configs: A collection of ready to be used SCI configs.
- grasp: Grep Clojure code using clojure.spec regexes
- lein-clj-kondo: a leiningen plugin for clj-kondo
- http-kit: Simple, high-performance event-driven HTTP client+server for Clojure.
- deps.clj: A faithful port of the clojure CLI bash script to Clojure
- babashka.nrepl: The nREPL server from babashka as a library, so it can be used from other SCI-based CLIs
- rewrite-edn: Utility lib on top of rewrite-clj with common operations to update EDN while preserving whitespace and comments
- jet: CLI to transform between JSON, EDN, YAML and Transit using Clojure
- quickdoc: Quick and minimal API doc generation for Clojure
- pod-babashka-go-sqlite3: A babashka pod for interacting with sqlite3
- pod-babashka-fswatcher: babashka filewatcher pod
- lein2deps: leiningen to deps.edn converter
- scittle: Execute Clojure(Script) directly from browser script tags via SCI
- sql pods: babashka pods for SQL databases
- cljs-showcase: Showcase CLJS libs using SCI
- babashka.book: Babashka manual
- instaparse-bb
- rewrite-clj: Rewrite Clojure code and edn
- pod-babashka-buddy: A pod around buddy core (Cryptographic Api for Clojure).
- gh-release-artifact: Upload artifacts to Github releases idempotently
- carve - Remove unused Clojure vars
- 4ever-clojure - Pure CLJS version of 4clojure, meant to run forever!
- pod-babashka-lanterna: Interact with clojure-lanterna from babashka
- joyride: VSCode CLJS scripting and REPL (via SCI)
- clj2el: transpile Clojure to elisp
- deflet: make let-expressions REPL-friendly!
- deps.add-lib: Clojure 1.12's add-lib feature for leiningen and/or other environments without a specific version of the clojure CLI
Published: 2024-02-29
Tagged:
clojure
oss updates
In this post I'll give updates about open source I worked on during December 2023.
To see previous OSS updates, go here.
Happy new year!
First all, as this is the last day of 2023, I wish you all a happy new year. Hopefully many goods things may happen in the Clojure ecosystem. I'm grateful many of you have sponsored my work in 2023!
I'd like to thank all the sponsors and contributors that make this work possible. Without you, the below projects would not be as mature or wouldn't exist or be maintained at all. 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.
- clj-kondo: static analyzer and linter for Clojure code that sparks joy. Released 2023.12.15
- #1990: Specify
:min-clj-kondo-version
in config.edn and warn when current version is too low (@snasphysicist) - #1753: New linter
:underscore-in-namespace
(@cosineblast) - #2207: New
:condition-always-true
linter, see docs - #2235: New
:multiple-async-in-deftest
linter: warn on multiple async blocks in cljs.test/deftest
, since only the first will run. - #2013: Fix NPE and similar errors when linting an import with an illegal token (@cosineblast)
- #2215: Passthrough hook should not affect linting
- #2232: Bump analysis for clojure 1.12 (partitionv, etc)
- #2223: Do not consider classes created with
deftype
a var that is referred with :refer :all
- #2236:
:line-length
warnings cannot be :clj-kondo/ignore
d - #2224: Give
#'foo/foo
and (var foo/foo)
the same treatment with respect to private calls - #2239: Fix printing of unresolved var when going through
:macroexpand
hook
- quickblog: Light-weight static blog engine for Clojure and babashka v0.3.3 - v0.3.6 released
- Fix caching in watch mode
- #86: group archive page by year
- #85: don't render discuss links when
:discuss-link
isn't set - #84: sort tags by post count
- #80: Generate an
about.html
when a template exists (@elken) - #78: Allow configurable :page-suffix to omit
.html
from page links (@anderseknert) - #76: Remove livejs script tag on render. (@jmglov)
- #75: Omit preview posts from index. (@jmglov)
- Support capitalization of tags
- #66: Unambigous ordering of posts, sorting by date (descending), post title, and then file name. (@UnwarySage)
- squint: CLJS syntax to JS compiler
Lots of stuff happened in December with squint! Too many to mention here, just check the CHANGELOG.md - clojure-mode: Clojure/Script mode for CodeMirror 6.
- Improved the eval-region extension: when you evaluate
#_(+ 1 2 3)|
the expression (+ 1 2 3)
is evaluated Test it in the squint playground.
- fs - File system utility library for Clojure Released 0.5.20:
- #119:
fs/delete-tree
: add :force
flag to delete read-only directories/files. Set the flag to true in fs/with-temp-dir
(@jlesquembre) - #102: add
gzip
and gunzip
functions - #113:
fs/glob
: enable :hidden
(when not already set) when pattern
starts with dot (@eval). - #117: fix
fs/match
and fs/glob
not finding files in root-folder (@eval).
- cherry: Experimental ClojureScript to ES6 module compiler
- Released version 0.1.16 which catches up with the latest compiler improvements in squint and also adds the
clojure.set
namespace
- http-server: serve static assets
- Released 0.1.12 with several new features
- babashka: native, fast starting Clojure interpreter for scripting.
- Working towards a new release, planned for next month.
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
- neil: A CLI to add common aliases and features to deps.edn-based projects
- CLI: Turn Clojure functions into CLIs!
- squint-macros: a couple of macros that stand-in for applied-science/js-interop and promesa to make CLJS projects compatible with squint and/or cherry.
- sci.configs: A collection of ready to be used SCI configs.
- grasp: Grep Clojure code using clojure.spec regexes
- lein-clj-kondo: a leiningen plugin for clj-kondo
- http-kit: Simple, high-performance event-driven HTTP client+server for Clojure.
- http-client: babashka's http-client
- nbb: Scripting in Clojure on Node.js using SCI
- deps.clj: A faithful port of the clojure CLI bash script to Clojure
- babashka.nrepl: The nREPL server from babashka as a library, so it can be used from other SCI-based CLIs
- rewrite-edn: Utility lib on top of rewrite-clj with common operations to update EDN while preserving whitespace and comments
- tools-deps-native and tools.bbuild: use tools.deps directly from babashka
- jet: CLI to transform between JSON, EDN, YAML and Transit using Clojure
- quickdoc: Quick and minimal API doc generation for Clojure
- pod-babashka-go-sqlite3: A babashka pod for interacting with sqlite3
- pod-babashka-fswatcher: babashka filewatcher pod
- edamame: Configurable EDN/Clojure parser with location metadata
- lein2deps: leiningen to deps.edn converter
- scittle: Execute Clojure(Script) directly from browser script tags via SCI
- sql pods: babashka pods for SQL databases
- cljs-showcase: Showcase CLJS libs using SCI
- process: Clojure library for shelling out / spawning sub-processes
- babashka.book: Babashka manual
- instaparse-bb
- rewrite-clj: Rewrite Clojure code and edn
- pod-babashka-buddy: A pod around buddy core (Cryptographic Api for Clojure).
- gh-release-artifact: Upload artifacts to Github releases idempotently
- carve - Remove unused Clojure vars
- 4ever-clojure - Pure CLJS version of 4clojure, meant to run forever!
- pod-babashka-lanterna: Interact with clojure-lanterna from babashka
- 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
- deps.add-lib: Clojure 1.12's add-lib feature for leiningen and/or other environments without a specific version of the clojure CLI
Published: 2023-12-31
Tagged:
clojure
oss updates
In this post I'll give updates about open source I worked on during November 2023.
To see previous OSS updates, go here.
I'd like to thank all the sponsors and contributors that make this work possible! Without you, the below projects would not be as mature or wouldn't exist or be maintained at all.
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!
Advent of Code
It is Advent of Code time of year again. You can solve puzzles in an online squint or cherry playground here.
Change the /squint/
part of the url to /cherry/
to switch ClojureScript dialect versions.
You can read more about the playground here.
Updates
Here are updates about the projects/libraries I've worked on last month.
- blog I've written two blog posts this month:
- squint: CLJS syntax to JS compiler
Lots of stuff happened in November with squint! You could say that I've grown a little addicted to improving this project currently, driven by how users use it and also while developing the playground, a lot of potential improvements emerged.. - Restore backward compatibility with code that is compiled with older versions of squint
- Optimize various outputs for smaller size
- Add
js-in
- Support
into
+ xform
- Support
sort
on strings - #386: allow expression in value position in map literal
- Improvements with respect to laziness in
mapcat
and concat
- Do not array mutate argument in
reverse
- Escape JSX attribute vector value (and more)
map
+ transduce
support- Fix
for
in REPL mode- Throw when object is not iterable in
for
- Make next lazy when input is lazy
- Fix playground shim (fixes issue in older versions of Safari)
- Add
js-mod
and quot
- #380: Don't emit space in between
#jsx
tags - Add
re-find
- Add
condp
macro - Use
compare
as default compare function in sort
(which fixes numerical sorting) - Allow
assoc!
to be called on arbitrary classes (regression) - Improve
get
to call get
method when present. - Allow keywords and collections to be used as functions in HOFs
- Make filter, etc aware of truthiness
- Reduce code size for truthiness checks
- Add
str/split-lines
- Add
partition-by
- Add
parse-long
- Add
sort-by
- Fix top level await
- Support multiple dimensions in
aset
- Add
coercive-=
as alias for ==
- Add
js-delete
- Fix
min-key
and max-key
and improve tests - Add
min-key
and max-key
- Fix
defonce
in REPL-mode - Fix
doseq
and for
when binding name clashes with core var - Several REPL improvements
- Improve https://squint-cljs.github.io/squint/
- Allow alias name to be used as object in REPL mode
- Copy resources when using
squint compile
or squint watch
- Return map when
select-keys
is called with nil
- nREPL server: print values through
cljs.pprint
(@PEZ) - Initial (incomplete!) nREPL server on Node.js:
npx squint nrepl-server :port 1888
- Update/refactor threejs example
- #360:
assoc-in!
should not mutate objects in the middle if they already exist - Evaluate
lazy-seq
body just once - Avoid stackoverflow with
min
and max
- #360: fix assoc-in! with immutable objects in the middle
- Add
mod
, object?
- Optimize
get
- Add threejs example
- #357: fix version in help text
- Fix iterating over objects
- Add
clojure.string
's triml
, trimr
, replace
- Fix
examples/vite-react
by adding public/index.html
- Add
find
, bounded-count
, boolean?
, merge-with
, meta
, with-meta
, int?
, ex-message
, ex-cause
, ex-info
- Fix munging of reserved symbols in function arguments
- scittle-hoplon: a custom scittle distribution with Hoplon. I helped developing the SCI configuration for Hoplon.
- gespensterfelder: a demo that Jack Rusher wrote using Three.js ported to squint.
- neil: A CLI to add common aliases and features to deps.edn-based projects Version 0.2.63 released which adds mvn search and some bugfixes
- CLI: Turn Clojure functions into CLIs!
- Small bugfix around priority of
:exec-args
and default
- aoc-proxy: a Cloudflare worker that can be used to fetch Advent of Code puzzle input from the browser (see Advent of Code playground)
- squint-macros: a couple of macros that stand-in for applied-science/js-interop and promesa to make CLJS projects compatible with squint and/or cherry.
- clojure-mode: Clojure/Script mode for CodeMirror 6.
- Ported the eval-region extension to squint so you can use it straight from JS. This is used in the squint playground when you press Cmd-Enter after an expression.
- sci.configs: A collection of ready to be used SCI configs.
- A helper macro was improved such that you can define macros that are usable in SCI
- The re-frame configuration now has support for
re-frame.alpha
. See playground.
- babashka: native, fast starting Clojure interpreter for scripting. A new release: 1.3.186!
- Support self-contained binaries as uberjars!
- Add
java.security.KeyFactory
, java.security.spec.PKCS8EncodedKeySpec
, java.net.URISyntaxException
, javax.crypto.spec.IvParameterSpec
- 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) - Add test for #1639
- Upgrade to GraalVM 21.0.1
Still unreleased: - Add
java.util.ScheduledFuture
- Support
Runnable
to be used without import - Allow
catch
to be used as var name
- SCI: Configurable Clojure/Script interpreter suitable for scripting and Clojure DSLs
Released version 0.8.41- Bump edamame to 1.3.23
- #889: allow
(def foo/foo 1)
when inside namespace foo
- #891: reset file metadata on var when it's re-evaluated from other file
- #893: expose
sci.async/eval-form
and sci.async/eval-form+
- Improve
sci.async/eval-string
, respect top-level do
forms - Add experimental new
:static-methods
option to override how static methods get evaluated. - Expose
destructure
- Macroexpand
(.foo bar)
form - Optimize
deref
, swap!
, reset!
for host values - Add
time
macro to core namespace - #896: allow
catch
to be used as var name
- cherry: Experimental ClojureScript to ES6 module compiler
- Released version 0.1.10 which catches up with the latest compiler improvements in squint
- clj-kondo: static analyzer and linter for Clojure code that sparks joy.
- New
:condition-always-true
and :underscore-in-namespace
linters + couple of bugfixes. Release expected in December.
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
- grasp: Grep Clojure code using clojure.spec regexes
- lein-clj-kondo: a leiningen plugin for clj-kondo
- http-kit: Simple, high-performance event-driven HTTP client+server for Clojure.
- http-client: babashka's http-client
- nbb: Scripting in Clojure on Node.js using SCI
- fs - File system utility library for Clojure
- deps.clj: A faithful port of the clojure CLI bash script to Clojure
- babashka.nrepl: The nREPL server from babashka as a library, so it can be used from other SCI-based CLIs
- rewrite-edn: Utility lib on top of rewrite-clj with common operations to update EDN while preserving whitespace and comments
- tools-deps-native and tools.bbuild: use tools.deps directly from babashka
- jet: CLI to transform between JSON, EDN, YAML and Transit using Clojure
- quickdoc: Quick and minimal API doc generation for Clojure
- pod-babashka-go-sqlite3: A babashka pod for interacting with sqlite3
- pod-babashka-fswatcher: babashka filewatcher pod
- edamame: Configurable EDN/Clojure parser with location metadata
- lein2deps: leiningen to deps.edn converter
- scittle: Execute Clojure(Script) directly from browser script tags via SCI
- sql pods: babashka pods for SQL databases
- cljs-showcase: Showcase CLJS libs using SCI
- process: Clojure library for shelling out / spawning sub-processes
- babashka.book: Babashka manual
- instaparse-bb
- rewrite-clj: Rewrite Clojure code and edn
- pod-babashka-buddy: A pod around buddy core (Cryptographic Api for Clojure).
- gh-release-artifact: Upload artifacts to Github releases idempotently
- carve - Remove unused Clojure vars
- quickblog: Light-weight static blog engine for Clojure and babashka
- 4ever-clojure - Pure CLJS version of 4clojure, meant to run forever!
- pod-babashka-lanterna: Interact with clojure-lanterna from babashka
- 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
- deps.add-lib: Clojure 1.12's add-lib feature for leiningen and/or other environments without a specific version of the clojure CLI
Published: 2023-12-01
Tagged:
clojure
oss updates