Compare commits

...
Sign in to create a new pull request.

173 commits
async ... main

Author SHA1 Message Date
FrankS
f72c1c163a
Expose cljs.core/Cons in SCI config (#142)
This allows (instance? cljs.core/Cons x) to work in Scittle code.

The Cons type exists in the compiled ClojureScript runtime but was not
exposed by name in SCI's symbol table. Libraries like Trove need this
for type checking in their const-form? function.
2025-12-09 22:11:25 +01:00
Peter Strömberg
93cb7874bf
Enable customizing the nrepl websocket port (#141)
* Enable customizing the nrepl websocket port

* Fixes #140

* Update changelog
2025-12-05 23:07:09 +01:00
Kyle Passarelli
c449f55a9b
Fix attribution in README (#139) 2025-11-18 17:35:19 +01:00
Michiel Borkent
a9b58a3c82 scittle name by Alessandra 2025-11-15 08:59:18 -05:00
Jeroen van Dijk
5b3a3acb54
Enable source maps (#138)
* Enable source maps

* Update changelog
2025-10-08 15:18:10 +02:00
Michiel Borkent
4ec8026b51 links 2025-09-13 20:17:08 +02:00
Michiel Borkent
b29b8b6752 0.7.28 2025-09-13 20:14:53 +02:00
Michiel Borkent
57f886e3ab Fix #137 2025-09-13 20:14:10 +02:00
Marduk Bolaños
cc09c6eb59
Added the inverse diagonal winning path (#136) 2025-09-09 19:00:04 +02:00
Michiel Borkent
f2517187bf Bump SCI 2025-08-22 12:45:38 +02:00
Michiel Borkent
76a32f63e5 README 2025-08-21 15:12:20 +02:00
Michiel Borkent
9e1feb81af version 2025-08-21 15:03:34 +02:00
Michiel Borkent
6b56464bd6 0.7.27 2025-08-21 15:03:00 +02:00
Michiel Borkent
c48f9868c6 changelog 2025-08-21 15:02:29 +02:00
Michiel Borkent
3129a212b3 Add js lib docs 2025-08-21 15:01:10 +02:00
Chris McCormick
7aebb5bbb0
Support string requires of globalThis js deps #95 (#129)
* Add a :load-fn for js libs on globalThis.

Fixes #95.

* Update changelog.
2025-08-21 11:08:56 +02:00
Michiel Borkent
ab527ad5a1 0.7.26 2025-08-20 15:17:08 +02:00
Michiel Borkent
a0e46da91e 0.7.26 2025-08-20 15:16:53 +02:00
Michiel Borkent
64dd057f74 0.7.26 2025-08-20 15:15:44 +02:00
Michiel Borkent
d5baa2eb30 Bump SCI 2025-08-20 15:15:11 +02:00
Michiel Borkent
30f63ba08d 0.7.25 2025-08-20 15:14:21 +02:00
Michiel Borkent
74f2c92b17 fix links 2025-08-20 15:13:53 +02:00
Michiel Borkent
1857a18ee9 bump version 2025-08-20 15:07:36 +02:00
Michiel Borkent
982ffadaea 0.7.24 2025-08-20 15:06:30 +02:00
Michiel Borkent
04df449d6f changelog 2025-08-20 15:04:48 +02:00
Michiel Borkent
cb968d06e3
Scittle dev (#127) 2025-08-20 14:58:23 +02:00
Michiel Borkent
c57a5f9285 Bump SCI: support set! syntax 2025-08-12 20:30:05 +02:00
Michiel Borkent
c4d7e74d2d Bump sci.nrepl 2025-07-21 14:36:32 +02:00
Michiel Borkent
e8670cb1c8 minor 2025-07-21 11:53:38 +02:00
Jeroen van Dijk
f92e23d8f2
Add dataspex plugin (#122) 2025-07-14 18:34:23 +02:00
Jeroen van Dijk
9a83349d69
Add goog.string/format #118 (#119)
* Add goog.string/format #118

Also add empty goog.string.format for Cljs compatibility

* Update changelog
2025-07-09 15:24:35 +02:00
Chris McCormick
c039781058
Document service worker usage. (#117) 2025-07-02 08:38:37 +02:00
Michiel Borkent
a9c0373fe4 fix gh pages 2025-06-18 11:29:50 +02:00
Michiel Borkent
b01eb6b5eb Fix replicant example 2025-06-18 11:27:48 +02:00
Michiel Borkent
31b3719920 changelog 2025-06-18 11:24:21 +02:00
Michiel Borkent
2a9cea17b4 Add js-interop link 2025-06-18 11:22:06 +02:00
Michiel Borkent
86a54ab37c Add replicant to links page 2025-06-18 11:20:09 +02:00
Michiel Borkent
3845e9962a Bump versions 2025-06-18 11:19:24 +02:00
Michiel Borkent
b6d37ece23 0.7.23 2025-06-18 11:18:15 +02:00
Michiel Borkent
6068026436 Bump minor version 2025-06-18 11:17:38 +02:00
Michiel Borkent
cc8f830704 changelog 2025-06-18 11:16:49 +02:00
Michiel Borkent
6d92f73262 Bump SCI.configs 2025-06-18 11:09:57 +02:00
Michiel Borkent
fea2ec5910 Fix #113: add unchecked-set and unchecked-get 2025-06-17 23:52:37 +02:00
Jeroen van Dijk
d9da6ffce1
Update release script for Replicant Tictactoe case (#112) 2025-06-16 16:06:08 +02:00
Jeroen van Dijk
a1b2723ef6
Use replicant via sci.configs (#109)
* Update Replicant plugin to use sci.configs

* Update Replicant to 2025.03.27
2025-06-16 15:31:38 +02:00
Jeroen van Dijk
1977424508
Add Replicant plugin (#108)
* Add replicant tictactoe example

* Update Changelog
2025-06-16 10:43:04 +02:00
ikappaki
07c8d4847d
Add goog.string/htmlEscape (#106)
Co-authored-by: ikappaki <ikappaki@users.noreply.github.com>
2025-06-02 23:07:53 +02:00
Michiel Borkent
dc54e3d6b2 eliminate unpkg 2025-03-15 11:07:06 +01:00
Michiel Borkent
9a4804e1b9 Use jsdelivr 2025-03-15 11:00:15 +01:00
Chris McCormick
fc6c2a9643
Note about :scittle reader conditional. (#104) 2025-03-09 11:59:16 +01:00
Michiel Borkent
f65ba9d853 Fix changelog 2025-01-06 10:54:00 +01:00
Chris McCormick
df1e5a429a
Added applied-science/js-interop plugin. (#101)
* Added applied-science/js-interop plugin.

* Changelog update.
2024-12-21 20:23:47 +01:00
Michiel Borkent
6359392c97 Bump SCI 2024-12-19 17:15:27 +01:00
Michiel Borkent
7409c6ec76 Bump ver 2024-12-19 17:13:49 +01:00
Michiel Borkent
6c3b5f5688 0.6.22 2024-12-19 17:12:58 +01:00
Michiel Borkent
72190e8422 fix import 2024-12-19 17:12:25 +01:00
Michiel Borkent
1cbca37342 bump version 2024-12-19 17:08:03 +01:00
Michiel Borkent
d3a80411f5 0.6.21 2024-12-19 17:07:19 +01:00
Michiel Borkent
e06db91212 v0.6.21 2024-12-19 17:06:41 +01:00
Michiel Borkent
2019b3263f
Fix #99: make js/import work (#100) 2024-12-19 17:05:28 +01:00
Jurjan-Paul Medema
1b021e4d14
Fix CodeMirror example with newly introduced CodeMirror dependency (#97) 2024-12-11 10:48:30 +01:00
Michiel Borkent
f67fc21a80 fix replace-version script 2024-11-24 12:43:47 +01:00
Michiel Borkent
b68c953247 links 2024-11-24 12:26:08 +01:00
Michiel Borkent
f63b3999bf v0.6.20 2024-11-24 12:25:24 +01:00
Michiel Borkent
763ad37227 0.6.20 2024-11-24 12:25:02 +01:00
Michiel Borkent
ac55404dd7 Bump sci 2024-11-24 12:24:21 +01:00
Chris McCormick
d23cbc10bd
Ability to evaluate single, query, or col of script tags. (#93) 2024-11-23 23:07:40 +01:00
Chris McCormick
6da99ffc90
Fix #55: create gh-pages dir before copying. (#91)
* Fix #55: create gh-pages dir before copying.

* Update changelog.
2024-11-15 12:24:56 +01:00
Chris McCormick
fa99b05b06
Only remove js dir if it exists. (#88)
* Only remove js dir if it exists.

This is to fix a bug where scittle throws an error if you do a prod build on a fresh checkout.

* Update changelog.

* Simplify clean prod fix.
2024-11-15 12:14:48 +01:00
Chris McCormick
06621b2dab
Fix #89: Allow evaluate_script_tags to specify scripts. (#90)
* Fix #89: Allow evaluate_script_tags to specify scripts.

* Updatte changelog.
2024-11-15 12:06:58 +01:00
Michiel Borkent
dbbb3ef2d2 nREPL readme 2024-10-28 10:27:17 +01:00
Michiel Borkent
3c216a8ab5 bump SCI 2024-10-08 12:07:38 +02:00
Michiel Borkent
63a4202912 update links 2024-10-08 10:43:23 +02:00
Michiel Borkent
c9651b68d8 v0.6.19 2024-10-08 10:41:38 +02:00
Michiel Borkent
413f5a424f 0.6.19 2024-10-08 10:40:46 +02:00
Michiel Borkent
b91c78d972 v0.6.18 2024-10-08 10:40:15 +02:00
Martin Kavalar
a99cf25226
Bump sci.nrepl and and use it (#81) 2024-07-09 15:03:00 +02:00
Michiel Borkent
691ed3a31a v0.6.17 2024-04-30 11:16:17 +02:00
Michiel Borkent
9260508a19 0.6.17 2024-04-30 11:14:53 +02:00
Michiel Borkent
dcb3c85174
Fix #77: make dep on js/document optional (#78) 2024-04-30 11:12:56 +02:00
Michiel Borkent
fcc1d1b843 Bump version 2024-04-22 14:25:26 +02:00
Michiel Borkent
1748d7d3b1 0.6.16 2024-04-22 14:24:28 +02:00
Michiel Borkent
d427054a86 Bump sci.configs 2024-04-22 14:20:25 +02:00
Michiel Borkent
2d4782702c
Fix #75: support reader conditionals in source code (#76) 2024-04-22 14:19:07 +02:00
Michiel Borkent
e83a1baa79 swap args 2023-12-22 14:18:43 +01:00
Michiel Borkent
719de62423 Avoid EDN read error in scittle nREPL 2023-12-22 14:07:03 +01:00
Alan Dipert
9791c281e3
Update README.md (#74) 2023-11-20 20:00:58 +01:00
Marcelo Nomoto
d456009ca1
Add hoplon and javelin as a plugin (#73)
* Hoplon and Javelin plugins

* Only Hoplon plugin

* Bump promesa

* Update sci context access/update

* Bump sci
2023-11-20 18:39:38 +01:00
Michiel Borkent
f63d50215d Fix #72: add update-vals and other fns 2023-11-07 10:43:39 +01:00
Michiel Borkent
71c224baa7 Bump SCI 2023-10-27 15:06:47 +02:00
Michiel Borkent
1bbf579241
Fix #69: executing script tag with src + whitespace doesn't work (#70) 2023-07-25 19:47:38 +02:00
Greg Warner
381f3d8234
Bump sci.configs (#67) 2023-06-13 14:33:35 +02:00
Michiel Borkent
465ea2af73 Bump sci.configs 2023-05-27 16:55:05 +02:00
Peter Szalai
84664532db
Fix typo in README.md (#62) 2023-05-13 10:46:19 +02:00
Michiel Borkent
0fd1342144 Fix #60: dev task 2023-05-13 10:45:10 +02:00
Michiel Borkent
1cd75fba28 promesa in codemirror 2023-05-04 22:57:15 +02:00
Michiel Borkent
44f973b965 docs 2023-05-04 17:07:07 +02:00
Michiel Borkent
a270f19c10 bump example version 2023-05-04 17:05:54 +02:00
Michiel Borkent
725c9934d0 0.6.15 2023-05-04 17:03:00 +02:00
Michiel Borkent
923ac92b61 remove optional module 2023-05-04 17:02:35 +02:00
Michiel Borkent
0270b989f0 prepare version 2023-05-04 17:01:27 +02:00
Michiel Borkent
5369c65bf4 changelog 2023-05-04 17:00:20 +02:00
Michiel Borkent
cd4ac5c74e minor 2023-05-03 22:24:34 +02:00
Michiel Borkent
2c9f2b4c52 docs 2023-05-03 21:46:24 +02:00
Michiel Borkent
b2879447ef doc 2023-05-03 21:42:41 +02:00
Michiel Borkent
0e15d9de79 docs 2023-05-03 21:42:24 +02:00
Michiel Borkent
d6d5d48e44 plugins 2023-05-03 21:40:52 +02:00
Michiel Borkent
a3554fa4a2
Fix #58: build system (#59) 2023-05-03 21:27:54 +02:00
Michiel Borkent
11b7a56ab8 globalThis 2023-02-25 21:13:40 +01:00
Benjamin
cfaf6b0b33
Use latest sci.nrepl in the example (#53) 2023-02-25 13:16:50 +01:00
Michiel Borkent
fd15f13aa1 Point to latest SCI 2023-02-25 13:02:56 +01:00
Benjamin
12c59b6f68
Upgrade sci configs (#51) (#52) 2023-02-18 10:08:27 +01:00
Benjamin
95740162d4
Update nrepl to handle describe and eldoc (#51)
* Update nrepl to handle describe and eldoc

See https://github.com/babashka/sci.nrepl/issues/2

* Update changelog
2023-02-17 20:30:15 +01:00
Benjamin
f24fbbbd79
Upgrade sci configs (#50)
https://github.com/babashka/sci.configs/pull/18#issuecomment-1398978353
2023-01-21 10:06:08 +01:00
Michael Camilleri
57536819c3
Use window.location.hostname for WebSocket connection (#49)
* Use window.location.hostname for WebSocket connection

* Update CHANGELOG
2023-01-20 18:57:33 +01:00
Michiel Borkent
151ea479f3 Remove println 2023-01-11 18:48:05 +01:00
Michiel Borkent
42701311d4 Fix changelog 2023-01-06 11:37:59 +01:00
Michiel Borkent
c74036274c Upgrade 2023-01-05 11:36:18 +01:00
Michiel Borkent
b6a3e98626 0.5.14 2023-01-05 11:33:53 +01:00
Michiel Borkent
34e7cffad9 Fix destructuring in multimethods 2023-01-05 11:33:19 +01:00
Michiel Borkent
4c5b74397e Update links 2022-12-22 23:02:36 +01:00
Michiel Borkent
97ba12ffb7 0.5.13 2022-12-22 22:56:58 +01:00
Michiel Borkent
2463f54680 Fix pprint plugin 2022-12-22 22:56:27 +01:00
Michiel Borkent
e675ad3353 changelog 2022-12-22 22:14:14 +01:00
Michiel Borkent
deb6166ce1 dev docs 2022-12-22 21:28:59 +01:00
Michiel Borkent
0f22ba7bf8 dev 2022-12-22 21:27:30 +01:00
Michiel Borkent
25feaf2641 Update versions 2022-12-22 21:26:47 +01:00
Michiel Borkent
ade3c6e111 0.5.12 2022-12-22 21:21:40 +01:00
Michiel Borkent
7517e1afc5 Prep release 2022-12-22 21:21:10 +01:00
Michiel Borkent
638efa590b Prep release 2022-12-22 21:18:20 +01:00
Michiel Borkent
ef3d1c0873 Add test codemirror 2022-12-22 21:14:11 +01:00
Michiel Borkent
47b10966e1 Upgrades 2022-12-22 21:13:43 +01:00
Michiel Borkent
d16cbd6486 Upgrade SCI 2022-12-21 17:01:44 +01:00
Michiel Borkent
3e67519400 Upgrade SCI, fixes #47 2022-12-19 15:03:49 +01:00
Michiel Borkent
bb930b7506 index 2022-11-23 13:58:59 +01:00
Michiel Borkent
1f2d3eab6c Changelog 2022-11-23 13:42:24 +01:00
Michiel Borkent
3fcc3978e5 Update codemirror example 2022-11-23 13:40:09 +01:00
Michiel Borkent
c18ba8ebd8 Add re-frame to codemirror 2022-11-23 13:31:52 +01:00
Michiel Borkent
fe0efbc705 Update versions 2022-11-23 13:27:49 +01:00
Michiel Borkent
e75a1ad6ef 0.4.11 2022-11-23 13:26:34 +01:00
Michiel Borkent
98b904c819 Prepare npm publish 2022-11-23 13:26:10 +01:00
Michiel Borkent
39ffad7899 re-frame tweaks 2022-11-23 13:23:53 +01:00
Brandon Olivier
ec81500dcb
Add support for re-frame (#46)
* Bump sci.configs for re-frame

* Update changelog

Co-authored-by: Michiel Borkent <michielborkent@gmail.com>
2022-11-23 12:51:49 +01:00
Michiel Borkent
623e9707bd Upgrade SCI 2022-11-23 12:48:34 +01:00
Michiel Borkent
b10afa88ac Upgrade libs 2022-11-23 11:43:21 +01:00
Michiel Borkent
2db6f44219 Upgrade libs 2022-11-23 11:42:45 +01:00
Michiel Borkent
0ceda6ec9f Add all public vars of cljs ajax core 2022-11-23 11:39:41 +01:00
Michiel Borkent
7756155576 Bump sci.configs 2022-11-09 12:15:57 +01:00
Michiel Borkent
b2cad51995 Bump SCI 2022-10-18 17:14:07 +02:00
Srijayanth Sridhar
693d6ff8c2
Fix scittle.nrepl to honor SCITTLE_NREPL_WEBSOCKET_PORT (#45) 2022-10-18 17:06:03 +02:00
rgkirch
12e5a33964
Update README.md (#42) 2022-10-13 20:47:15 +02:00
Michiel Borkent
83e96ceb4a fix codemirror 2022-10-10 15:28:51 +02:00
Michiel Borkent
c9741b235e fix codemirror 2022-10-10 15:28:42 +02:00
Michiel Borkent
a1c4464fdc demo 2022-10-10 14:46:16 +02:00
Michiel Borkent
87a74118f6 codemirror 2022-10-10 14:44:19 +02:00
Michiel Borkent
5cd791e09f codemirror 2022-10-10 14:44:10 +02:00
Michiel Borkent
7eec6ef0aa update codemirror page 2022-10-10 13:52:52 +02:00
Michiel Borkent
5157f98e09 codemirror example 2022-10-10 12:50:35 +02:00
Michiel Borkent
50ff95440c Add codemirror example 2022-10-10 12:46:23 +02:00
Michiel Borkent
cf74e1a33d changelog 2022-08-31 17:47:03 +02:00
Michiel Borkent
2ec46c8531 Fix changelog 2022-08-31 17:34:32 +02:00
Michiel Borkent
fe8bc0dc08 Bump version 2022-08-31 17:33:49 +02:00
Michiel Borkent
60c01d45e3 0.3.10 2022-08-31 17:33:22 +02:00
Michiel Borkent
a049c8eddb Bump version 2022-08-31 17:32:52 +02:00
Michiel Borkent
2cb9e7de68 Improve error renderer 2022-08-31 17:28:07 +02:00
Michiel Borkent
cfac8dbaa5 Improve error during analysis, #34 2022-08-31 17:22:26 +02:00
Michiel Borkent
ef34e84e59 better location info in error, #33 2022-08-31 14:07:01 +02:00
Michiel Borkent
f4b10bc46c html 2022-08-31 13:48:13 +02:00
Michiel Borkent
cf65ffaf20
cljs.pprint (#39) 2022-08-31 13:45:37 +02:00
Ray McDermott
7bf5bc087d
Add promesa (#38)
* Add promesa

* Add promesa
2022-08-30 11:02:11 +02:00
Carnun Marcus-Page
25e9ea61af
Fix fix of bookmarklet share link (#37)
Related issue: https://github.com/babashka/scittle/issues/36
2022-08-16 13:00:51 +02:00
Carnun Marcus-Page
a698bd4ed9
Fix bookmarklet share link (#35)
For some reason, Twitter (and possibly other sites!) cut closing parens from the "Copy this link to share ⤴️" link. So a quick-and-dirty fix is to just append a bit of whitespace.

A little more context (with pictures): https://twitter.com/CarnunMP/status/1559148858118111234
2022-08-15 14:34:44 +02:00
Søren Sjørup
fe353c4c08
add brackets in require in README.md (#30) 2022-07-15 10:44:42 +02:00
64 changed files with 1267 additions and 173 deletions

3
.gitignore vendored
View file

@ -16,3 +16,6 @@ gh-pages/
/dist
/.clj-kondo/.cache
/.clj-kondo/rewrite-clj
/plugins/demo/resources/public/js/
.portal
resources/public/test/scratch.html

View file

@ -1,5 +1,103 @@
# Changelog
[Scittle](https://github.com/babashka/scittle): execute Clojure(Script) directly from browser script tags via SCI!
<!-- To create a new NPM release: -->
<!-- - Run `bb npm-publish`: this will compile, bump patch version, create tag and and push to npm and Github -->
<!-- - `bb replace-version 0.6.22 0.7.23` -->
<!-- - Create Github release with updated links from `doc/links.md` -->
<!-- - `bb gh-pages` -->
- [#114](https://github.com/babashka/scittle/issues/114): Enable source maps ([@jeroenvandijk](https://github.com/jeroenvandijk))
- [#140](https://github.com/babashka/scittle/issues/140): Enable customizing the nrepl websocket port ([@PEZ](https://github.com/PEZ))
## v0.7.28 (2025-09-13)
- [#137](https://github.com/babashka/scittle/issues/137): fix JS interop with reserved JS keyword (incorrectly munged) by bumping SCI
## v0.7.27 (2025-08-21)
- [#95](https://github.com/babashka/scittle/issues/121): support string requires
of `globalThis` js deps ([@chr15m](https://github.com/chr15m)). See
[docs](https://github.com/babashka/scittle/blob/main/doc/js-libraries.md).
- Potentially breaking: `(.-foo-bar {})` now behaves as `{}.foo_bar`, i.e. the property or method name is munged.
## v0.7.26 (2025-08-20)
- [#121](https://github.com/babashka/scittle/issues/121): add `cjohansen/dataspex` plugin ([@jeroenvandijk](https://github.com/jeroenvandijk))
- [#118](https://github.com/babashka/scittle/issues/118): add `goog.string/format` ([@jeroenvandijk](https://github.com/jeroenvandijk))
- Support alternative `(set! #js {} -a 1)` CLJS syntax (by bumping SCI)
- Add source maps to distribution
- Add dev versions of all modules in the `dev` folder of the distribution + a `dev/scitte.cljs-devtools.js` module
## v0.7.23 (2025-06-18)
- [#107](https://github.com/babashka/scittle/issues/107): add `replicant` plugin ([@jeroenvandijk](https://github.com/jeroenvandijk))
- [#102](https://github.com/babashka/scittle/issues/102): add `applied-science/js-interop` plugin ([@chr15m](https://github.com/chr15m))
- [#105](https://github.com/babashka/scittle/issues/105): add `goog.string/htmlEscape` ([@ikappaki](https://github.com/ikappaki) )
- [#113](https://github.com/babashka/scittle/issues/113): add `unchecked-set` and `unchecked-get`
## v0.6.22 (2024-12-19)
- [#99](https://github.com/babashka/scittle/issues/99): make `js/import` work
## v0.6.20 (2024-11-24)
- [#55](https://github.com/babashka/scittle/issues/55): create gh-pages dir before using.
- [#89](https://github.com/babashka/scittle/issues/89): allow `evaluate_script_tags` to specify individual scripts.
- [#87](https://github.com/babashka/scittle/issues/87): prod build on fresh checkout fails
## v0.6.19 (2024-10-08)
- Add `cljs.pprint/code-dispatch` and `cljs.pprint/with-pprint-dispatch`
## v0.6.18 (2024-04-30)
- [#77](https://github.com/babashka/scittle/issues/77): make dependency on browser (`js/document`) optional so scittle can run in webworkers, Node.js, etc.
## v0.6.17 (2024-04-22)
- [#69](https://github.com/babashka/scittle/issues/69): executing script tag with src + whitespace doesn't work
- [#72](https://github.com/babashka/scittle/issues/72): add clojure 1.11 functions like `update-vals`
- [#75](https://github.com/babashka/scittle/issues/75): Support reader conditionals in source code
## v0.6.16 (2023-05-04)
- [#58](https://github.com/babashka/scittle/issues/58): build system for creating scittle distribution with custom libraries. See [plugins/demo](plugins/demo).
- Use `window.location.hostname` for WebSocket connection instead of hardcoding `"localhost"` ([@pyrmont](https://github.com/pyrmont))
- Upgrade `sci.configs` to `"33bd51e53700b224b4cb5bda59eb21b62f962745"`
- Update nREPL implementation: implement `eldoc` (`info`, `lookup`) ([@benjamin-asdf](https://github.com/benjamin-asdf))
## v0.6.15 (2023-01-05)
- Fix destructuring in `defmethod` (by upgrading SCI)
## v0.5.13 (2022-12-23)
- Fix `cljs.pprint` plugin
## v0.5.12 (2022-12-23)
- Fix `reagent` `with-let` macro with advanced compiled builds
- Upgrade promesa and shadow-cljs
- Fix `#queue` literal
- SCI: performance improvements
## v0.4.11 (2022-11-23)
- Add `scittle.re-frame` plugin. This gives access to the
[re-frame](https://github.com/day8/re-frame) library.
- Fix for [44](https://github.com/babashka/scittle/issues/44): Honoring `SCITTLE_NREPL_WEBSOCKET_PORT` in `scittle.nrepl`
- Add all public vars of `cljs-ajax` `ajax.core`
- Upgrade several built-in libraries
## v0.3.10
- Add `scittle.promesa.js` plugin. This gives access to the [promesa](https://cljdoc.org/d/funcool/promesa/8.0.450/doc/user-guide) library.
- Add `scittle.pprint.js` plugin. This gives access to [cljs.pprint](https://cljs.github.io/api/cljs.pprint/).
- Improve error messages
## v0.2.8
- Upgrade to SCI 0.3.1

View file

@ -21,7 +21,7 @@ babashka or Clojure JVM):
``` clojure
(require '[babashka.http-server :as http])
(http/serve {:port 1341 :dir "resoures/public"}
(http/serve {:port 1341 :dir "resources/public"})
@(promise) ;; wait until process is killed
```
@ -29,6 +29,10 @@ babashka or Clojure JVM):
See [doc/nrepl](doc/nrepl).
### Service worker
See [doc/serviceworker.md](doc/serviceworker.md).
## Tasks
Run `bb tasks` to see all available tasks:
@ -46,6 +50,7 @@ release Updates Github pages with new release build.
## Credits
Idea by Arne Brasseur a.k.a [plexus](https://github.com/plexus).
Name by Alessandra Sierra (the name occurs first in [this](https://stuartsierra.com/2019/12/21/clojure-start-time-in-2019/) blog post).
## License

43
bb.edn
View file

@ -1,21 +1,25 @@
{:deps {io.github.babashka/sci.nrepl
#_{:local/root "../sci.nrepl"}
{:git/sha "c14b5b4ef4390ff206cdb71f763f327799f5e853"}
{:git/sha "2f8a9ed2d39a1b09d2b4d34d95494b56468f4a23"}
io.github.babashka/http-server
{:git/sha "b38c1f16ad2c618adae2c3b102a5520c261a7dd3"}}
{:git/sha "b38c1f16ad2c618adae2c3b102a5520c261a7dd3"}
io.github.scittle/build
{:local/root "build"}}
:tasks
{:requires ([babashka.fs :as fs]
{:requires ([scittle.build :as build]
[babashka.fs :as fs]
[cheshire.core :as json]
[babashka.process :as p :refer [process]])
clean {:doc "Start from clean slate."
:task (do (run! fs/delete (fs/list-dir (fs/file "resources" "public" "js") "**.*"))
:task (do (fs/delete-tree (fs/file "resources" "public" "js"))
(fs/delete-tree ".cpcache")
(fs/delete-tree ".shadow-cljs"))}
shadow:watch {:doc "Development build. Starts webserver and watches for changes."
:task (clojure "-M:dev -m shadow.cljs.devtools.cli watch main")}
:task (build/build {:action "watch"
:args *command-line-args*})}
http-server {:doc "Starts http server for serving static files"
:requires ([babashka.http-server :as http])
@ -33,35 +37,40 @@
(deref (promise)))}
prod {:doc "Builds production artifacts."
:task (clojure {:extra-env {"SCI_ELIDE_VARS" "true"}}
"-M:dev -m shadow.cljs.devtools.cli release main")}
:task (build/build {})
:depends [clean]}
dist {:doc "Prepare dist folder for npm package"
:depends [prod]
:task (do
(fs/delete-tree "dist")
(fs/create-dirs "dist")
(run! (fn [f] (fs/copy f "dist"))
(fs/glob "resources/public/js" "*.js")))}
(fs/create-dirs "dist/dev")
(run! (fn [f] (fs/copy f "dist" {:replace-existing true}))
(fs/glob "resources/public/js" "*.{js,js.map}"))
(run! (fn [f] (fs/copy f "dist/dev" {:replace-existing true}))
(fs/glob "resources/public/js/dev" "*.{js,js.map}")))}
bump-version {:doc "Bumps package.json and pushes new git tag"
:task (do (shell "npm version patch")
(shell "git push --atomic origin main"
(str "v" (:version (json/parse-string (slurp "package.json") true)))))}
npm-publish {:doc "Updates Github pages with new release build."
npm-publish {:doc "Updates NPM ibrary"
:task (do (run 'dist)
(run 'bump-version)
(shell "npm publish"))}
gh-pages {:doc "Updates Github pages with new release build."
:task (shell "script/release.clj")}
replace-version {:doc "Ported from bash one-liners. Expects two versions. TODO: port to Clojure."
replace-version {:doc "Ported from bash one-liners. Expects two versions.
TODO: port to Clojure.
TODO: skip changelog.md
"
:task
(let [[prev next] *command-line-args*]
(-> (process ["bash" "-c"
(format "rg %s --files-with-matches | xargs sed -i '' 's/%s/%s/g'"
(format "rg %s --files-with-matches -g '!/CHANGELOG.md' | xargs sed -i '' 's/%s/%s/g'"
prev prev next)]
{:inherit true})
p/check))}}}
p/check))}
gh-pages {:doc "Updates Github pages with new release build."
:task (shell "script/release.clj")}}}

1
build/deps.edn Normal file
View file

@ -0,0 +1 @@
{}

View file

@ -0,0 +1,83 @@
(ns scittle.build
"Provides bb tasks for building and releasing scittle"
(:require
[babashka.classpath :as classpath]
[babashka.fs :as fs]
[babashka.tasks :refer [clojure]]
[clojure.edn :as edn]
[clojure.string :as str]))
(defn- feature-files
[]
(filter fs/exists?
(map (fn [d]
(fs/file d "scittle_plugin.edn"))
(classpath/split-classpath (classpath/get-classpath)))))
(defn- read-configs
[files]
(->> files
(mapcat (comp edn/read-string slurp str))))
(defn- build-cmd [cmd scittle-dir]
(let [files (feature-files)
feature-configs (read-configs files)
;; Each ./src/scittle_plugin.edn has a ./deps.edn
feature-dirs (map (comp fs/parent fs/parent) files)
cmd' (if (seq files)
(format "-Sdeps '%s' %s"
{:deps
(merge (into {}
(map (fn [dir]
[(symbol (str (fs/file-name dir) "/deps"))
{:local/root (str dir)}])
feature-dirs))
{'scittle/deps {:local/root scittle-dir}})}
cmd)
cmd)]
(when (seq feature-configs)
(println "Building features:" (str/join ", " (map :name feature-configs)) "..."))
(if (seq feature-configs)
(apply str cmd'
(map (fn [m] (format " --config-merge '%s'" (pr-str (:shadow-config m))))
feature-configs))
cmd')))
(defn- build*
[cmd]
(let [building-outside-scittle? (not (fs/exists? "shadow-cljs.edn"))
scittle-dir (when building-outside-scittle?
(->> (classpath/get-classpath)
classpath/split-classpath
;; Pull out scittle from local/root or git/url
(some #(when (re-find #"(scittle/[0-9a-f]+|scittle)/src" %) %))
fs/parent))]
(when building-outside-scittle?
(fs/copy (fs/file scittle-dir "shadow-cljs.edn") "shadow-cljs.edn"))
(let [cmd (build-cmd cmd (str scittle-dir))]
(println "> clojure" cmd)
(clojure {:extra-env {"SCI_ELIDE_VARS" "true"}} cmd))
(when building-outside-scittle?
(fs/delete "shadow-cljs.edn"))))
(defn build
"Build scittle shadow builds using clojure cmd and commandline args. Features on
classpath are automatically added.
Options:
* :action - compile action, defaults to release, but may also be compile or watch"
[{:keys [action
args] :or {action "release"}}]
(build* (format "-M -m shadow.cljs.devtools.cli --force-spawn %s main %s" action (str/join " " args)))
(when (= "release" action)
(println "Also building dev release build")
(build* (format "-M -m shadow.cljs.devtools.cli --force-spawn %s main %s %s"
action
"--config-merge '{:compiler-options {:optimizations :simple
:pretty-print true
:pseudo-names true}
:output-dir \"resources/public/js/dev\"
:modules {:scittle.cljs-devtools {:entries [scittle.cljs-devtools]
:depends-on #{:scittle}}}}'"
(str/join " " args)))))

View file

@ -1,21 +1,30 @@
{:paths ["src" "resources"]
:deps
{org.clojure/clojure {:mvn/version "1.10.3"}
org.babashka/sci {:mvn/version "0.3.5"}
reagent/reagent {:mvn/version "1.1.0"}
cljsjs/react {:mvn/version "17.0.2-0"}
cljsjs/react-dom {:mvn/version "17.0.2-0"}
cljsjs/react-dom-server {:mvn/version "17.0.2-0"}
cljs-ajax/cljs-ajax {:mvn/version "0.8.3"}
{org.clojure/clojure {:mvn/version "1.12.2"}
thheller/shadow-cljs {:mvn/version "3.1.8"}
org.babashka/sci {:git/url "https://github.com/babashka/sci"
:git/sha "6758ba028da559c536a06becbbedade7b0ba6448"}
#_{:local/root "../babashka/sci"}
reagent/reagent {:mvn/version "1.1.1"}
no.cjohansen/replicant {:mvn/version "2025.03.27"}
re-frame/re-frame {:mvn/version "1.3.0"}
cljsjs/react {:mvn/version "18.2.0-1"}
cljsjs/react-dom {:mvn/version "18.2.0-1"}
cljsjs/react-dom-server {:mvn/version "18.2.0-1"}
cljs-ajax/cljs-ajax {:mvn/version "0.8.4"}
applied-science/js-interop {:mvn/version "0.4.2"}
funcool/promesa {:mvn/version "11.0.678"}
io.github.babashka/sci.nrepl
#_{:local/root "../sci.nrepl"}
{:git/sha "e83421ce9349c36df56a2eb936196dbb65b0de63"}
{:git/url "https://github.com/babashka/sci.nrepl"
:git/sha "75f379c685bbd58c3e23f531339eb144e104937d"}
io.github.babashka/sci.configs
{:git/sha "fcd367c6a6115c5c4e41f3a08ee5a8d5b3387a18"}}
#_{:local/root "/Users/borkdude/dev/sci.configs"}
{:git/url "https://github.com/babashka/sci.configs"
:git/sha "aa84a1b4f1fe45735e5b748769309fc842f737c1"
:exclusions [org.babashka/sci]}
binaryage/devtools {:mvn/version "1.0.7"}}
:aliases
{:dev
{:extra-paths ["dev"]
:extra-deps {thheller/shadow-cljs {:mvn/version "2.14.0"}}}}}
:extra-deps {}}}}

View file

@ -86,18 +86,24 @@ To deploy to Github Pages:
script/release.clj
```
To create a new release:
To create a new NPM release:
To upgrade examples:
- Prepare version `package.json`, except patch (if anything should change here)
- Run `bb npm-publish`: this will compile, bump patch version, create tag and and push to npm and Github
- `bb replace-version 0.6.16 0.7.28`
- Create Github release with updated links from `doc/links.md`
- `bb gh-pages`
```
rg '0.0.1' --files-with-matches | xargs sed -i '' 's/0.0.2.8.1.0/g'
bb release
cd gh-pages
git checkout -b v0.2.8
git push --set-upstream origin v0.2.8
git checkout gh-pages
cd ..
```
<!-- To upgrade examples: -->
Then make a new release on Github with the `v0.2.8` tag.
<!-- ``` -->
<!-- rg '0.0.1' --files-with-matches | xargs sed -i '' 's/0.0.7.28.1.0/g' -->
<!-- bb release -->
<!-- cd gh-pages -->
<!-- git checkout -b v0.7.28 -->
<!-- git push --set-upstream origin v0.7.28 -->
<!-- git checkout gh-pages -->
<!-- cd .. -->
<!-- ``` -->
<!-- Then make a new release on Github with the `v0.7.28` tag. -->

49
doc/js-libraries.md Normal file
View file

@ -0,0 +1,49 @@
# Loading JS libraries
Since `v0.7.28` scittle allows to load libraries from the global enviroment.
This means you can load a library in a `<script>` tag and use it via `:require` in scittle.
An example:
``` html
<html>
<head>
<script src="https://cdn.jsdelivr.net/npm/scittle@0.7.28/dist/scittle.js" type="application/javascript"></script>
<script src="https://cdn.jsdelivr.net/npm/js-confetti@latest/dist/js-confetti.browser.js"></script>
<script type="application/x-scittle">
(require '["JSConfetti" :as confetti])
(.addConfetti (confetti.))
</script>
</head>
<body>
</body>
</html>
```
## ES modules
The async nature of ES modules makes them a litte bit more difficult to work
with in scittle. You need to disable automatic evaluation of script tags first
using `scittle.core.disable_auto_eval()`. In a `module` type `<script>` tag you
can then load ES modules, attach them to the global object and manually invoke
`scittle.core.eval_script_tags();` when setup is completed.
``` html
<html>
<head>
<script src="https://cdn.jsdelivr.net/npm/scittle@0.7.28/dist/scittle.js" type="application/javascript"></script>
<script>scittle.core.disable_auto_eval()</script>
<script type="module">
import confetti from "https://esm.sh/canvas-confetti@1.6.0"
globalThis.JSConfetti = confetti;
scittle.core.eval_script_tags();
</script>
<script type="application/x-scittle">
(require '["JSConfetti" :as confetti])
(confetti)
</script>
</head>
<body>
</body>
</html>
```

20
doc/links.md Normal file
View file

@ -0,0 +1,20 @@
https://cdn.jsdelivr.net/npm/scittle@0.7.28/dist/scittle.js
https://cdn.jsdelivr.net/npm/scittle@0.7.28/dist/scittle.js-interop.js
https://cdn.jsdelivr.net/npm/scittle@0.7.28/dist/scittle.cljs-ajax.js
https://cdn.jsdelivr.net/npm/scittle@0.7.28/dist/scittle.reagent.js
https://cdn.jsdelivr.net/npm/scittle@0.7.28/dist/scittle.re-frame.js
https://cdn.jsdelivr.net/npm/scittle@0.7.28/dist/scittle.replicant.js
https://cdn.jsdelivr.net/npm/scittle@0.7.28/dist/scittle.promesa.js
https://cdn.jsdelivr.net/npm/scittle@0.7.28/dist/scittle.pprint.js
https://cdn.jsdelivr.net/npm/scittle@0.7.28/dist/scittle.nrepl.js
https://cdn.jsdelivr.net/npm/scittle@0.7.28/dist/dev/scittle.js
https://cdn.jsdelivr.net/npm/scittle@0.7.28/dist/dev/scittle.js-interop.js
https://cdn.jsdelivr.net/npm/scittle@0.7.28/dist/dev/scittle.cljs-ajax.js
https://cdn.jsdelivr.net/npm/scittle@0.7.28/dist/dev/scittle.reagent.js
https://cdn.jsdelivr.net/npm/scittle@0.7.28/dist/dev/scittle.re-frame.js
https://cdn.jsdelivr.net/npm/scittle@0.7.28/dist/dev/scittle.replicant.js
https://cdn.jsdelivr.net/npm/scittle@0.7.28/dist/dev/scittle.promesa.js
https://cdn.jsdelivr.net/npm/scittle@0.7.28/dist/dev/scittle.pprint.js
https://cdn.jsdelivr.net/npm/scittle@0.7.28/dist/dev/scittle.nrepl.js
https://cdn.jsdelivr.net/npm/scittle@0.7.28/dist/dev/scittle.cljs-devtools.js

View file

@ -7,7 +7,7 @@ In babashka or Clojure JVM, use the
[sci.nrepl](https://github.com/babashka/sci.nrepl) dependency and run:
``` clojure
(require 'sci.nrepl.browser-server :as nrepl)
(require '[sci.nrepl.browser-server :as nrepl])
(nrepl/start! {:nrepl-port 1339 :websocket-port 1340})
```
@ -21,7 +21,7 @@ the normal routine:
``` html
<script>var SCITTLE_NREPL_WEBSOCKET_PORT = 1340;</script>
<script src="https://cdn.jsdelivr.net/npm/scittle@0.2.8/dist/scittle.nrepl.js" type="application/javascript"></script>
<script src="https://cdn.jsdelivr.net/npm/scittle@0.7.28/dist/scittle.nrepl.js" type="application/javascript"></script>
```
Also include the CLJS file that you want to evaluate with nREPL:
@ -42,20 +42,18 @@ you should be able evaluate expressions in `playground.cljs`. See a demo
Note that the nREPL server connection stays alive even after the browser window
refreshes.
### CIDER
### Custom host address
Currently when connecting from CIDER, you need to use this snippet:
By default, the browser will connect to a websocket on the same host as it is loaded
from, using `window.location.hostname`. If you need something else you can specify
that setting the window variable `SCITTLE_NREPL_WEBSOCKET_HOST` like so:
``` elisp
(cider-register-cljs-repl-type 'sci-js "(+ 1 2 3)")
(defun mm/cider-connected-hook ()
(when (eq 'sci-js cider-cljs-repl-type)
(setq-local cider-show-error-buffer nil)
(cider-set-repl-type 'cljs)))
(add-hook 'cider-connected-hook #'mm/cider-connected-hook)
``` html
<script>var SCITTLE_NREPL_WEBSOCKET_HOST = 'localhost';</script>
```
Then choose `cider-connect-cljs`, select port `1339`, followed by the `sci-js`
REPL type.
### CIDER
Choose `cider-connect-cljs`, select port `1339`, followed by the `nbb` REPL
type. If you use multiple REPLs in your project, choose
`sesman-link-with-buffer` to choose the right REPL for the right buffer.

View file

@ -1,5 +1,6 @@
{:deps {io.github.babashka/sci.nrepl
{:git/sha "c14b5b4ef4390ff206cdb71f763f327799f5e853"}
#_{:local/root "/Users/borkdude/dev/sci.nrepl"}
{:git/sha "4f7f6d652a71b5bdc0c110313a4908d956e7a97d"}
io.github.babashka/http-server
{:git/sha "b38c1f16ad2c618adae2c3b102a5520c261a7dd3"}}
:tasks {http-server {:doc "Starts http server for serving static files"

View file

@ -1,9 +1,9 @@
<!DOCTYPE html>
<html>
<head>
<script src="https://cdn.jsdelivr.net/npm/scittle@0.2.8/dist/scittle.js" type="application/javascript"></script>
<script src="https://cdn.jsdelivr.net/npm/scittle@0.7.28/dist/scittle.js" type="application/javascript"></script>
<script>var SCITTLE_NREPL_WEBSOCKET_PORT = 1340;</script>
<script src="https://cdn.jsdelivr.net/npm/scittle@0.2.8/dist/scittle.nrepl.js" type="application/javascript"></script>
<script src="https://cdn.jsdelivr.net/npm/scittle@0.7.28/dist/scittle.nrepl.js" type="application/javascript"></script>
<script type="application/x-scittle" src="playground.cljs"></script>
</head>
<body>

26
doc/serviceworker.md Normal file
View file

@ -0,0 +1,26 @@
# Scittle in a service worker
You can use Scittle to bootstrap a ClojureScript based service worker.
Put the following code into e.g. `scittle-sw.js` to create a JavaScript based service worker, load Scittle, then fetch your script and eval it.
```javascript
importScripts("scittle.min.js");
const request = await fetch("sw.cljs");
const text = await request.text();
const result = scittle.core.eval_string(text);
```
Then load `scittle-sw.js` in your HTML:
```html
<script>
if('serviceWorker' in navigator)
navigator.serviceWorker.register('scittle-sw.js');
</script>
```
This will load `sw.cljs` and eval it in the context of the service worker.
A ready-made example can be found at [chr15m/scittle-template-serviceworker](https://github.com/chr15m/scittle-template-serviceworker).

4
package-lock.json generated
View file

@ -8,7 +8,7 @@
"react": "17.0.1",
"react-dom": "17.0.1"
},
"version": "0.2.8"
"version": "0.7.28"
},
"node_modules/js-tokens": {
"version": "4.0.0",
@ -129,5 +129,5 @@
}
}
},
"version": "0.2.8"
"version": "0.7.28"
}

View file

@ -1,6 +1,6 @@
{
"name": "scittle",
"version": "0.2.8",
"version": "0.7.28",
"files": [
"dist"
],

View file

@ -0,0 +1,4 @@
{:deps
{datascript/datascript {:mvn/version "1.3.12"}
io.github.babashka/sci.configs {:git/sha "aa84a1b4f1fe45735e5b748769309fc842f737c1"
:exclusions [org.babashka/sci]}}}

View file

@ -0,0 +1,9 @@
(ns scittle.datascript
{:no-doc true}
(:require [sci.configs.tonsky.datascript :refer [config]]
[scittle.core :as scittle]))
(defn init []
(scittle/register-plugin!
::datascript
config))

View file

@ -0,0 +1,12 @@
[{:name scittle/datascript
:namespaces [datascript.core datascript.db]
:js "./scittle.datascript.js"
:shadow-config
{:compiler-options {:externs ["datascript/externs.js"]}
:modules
{:scittle.datascript
{:init-fn scittle.datascript/init
;; From https://github.com/tonsky/datascript/issues/298#issuecomment-813790783
:prepend "globalThis.datascript = {};"
:depends-on #{:scittle}
:entries [datascript.core]}}}}]

View file

@ -0,0 +1,8 @@
{:deps
{no.cjohansen/dataspex {:git/url "https://github.com/cjohansen/dataspex"
:git/sha "02112200651c2bd932907bb69fba1ff50b881741"
:exclusions [ring/ring-core
ring/ring-jetty-adapter
com.cognitect/transit-clj]}
io.github.babashka/sci.configs {:git/sha "aa84a1b4f1fe45735e5b748769309fc842f737c1"
:exclusions [org.babashka/sci]}}}

View file

@ -0,0 +1,9 @@
(ns scittle.dataspex
{:no-doc true}
(:require [sci.configs.cjohansen.dataspex :refer [config]]
[scittle.core :as scittle]))
(defn init []
(scittle/register-plugin!
::dataspex
config))

View file

@ -0,0 +1,8 @@
[{:name scittle/dataspex
:namespaces [dataspex.core]
:js "./scittle.dataspex.js"
:shadow-config
{:modules
{:scittle.dataspex {:init-fn scittle.dataspex/init
:depends-on #{:scittle :scittle.datascript}
:entries [dataspex.core]}}}}]

29
plugins/demo/README.md Normal file
View file

@ -0,0 +1,29 @@
# Demo
A demo project of a custom scittle build.
This demo project uses the `scittle.javelin` and `scittle.hoplon` plugins which aren't part of the normal scittle distribution.
To produce release `.js` files, run: `bb release`.
See:
- `bb.edn` with
- `:deps` which includes:
- a dependency on the `scittle.build` project to build scittle + custom features
- zero or more plugin dependencies
- helpers like static file server
- development `:tasks`. Run `bb dev` for development and `bb release` to produce release artifacts.
- `deps.edn`: this only contains a dependency on scittle itself
Available plugins are in the `plugins` directory inside the top level directory of this repo.
Writing a plugin involves writing
- SCI configuration (this can be shared via the [sci.configs](https://github.com/babashka/sci.configs) project too)
- Adding a `scittle_plugin.edn` file on the plugin's classpath (e.g. in the `src` directory). This EDN file contains:
- `:name`, name of the plugin
- `:namespaces`: the namespaces exposed to SCI
- `:js`: the name of the produced `.js` module file
- `:shadow-config`: the shadow-cljs configuration specific to this plugin
- A `.cljs` file with an `init` function which calls `scittle/register-plugin!`.

22
plugins/demo/bb.edn Normal file
View file

@ -0,0 +1,22 @@
{:deps {io.github.babashka/scittle.build {:local/root "../../build"}
;; datascript plugin
; io.github.babashka/scittle.datascript {:local/root "../../plugins/datascript"}
io.github.babashka/scittle.dataspex {:local/root "../../plugins/dataspex"}
io.github.babashka/scittle.javelin {:local/root "../../plugins/javelin"}
io.github.babashka/scittle.hoplon {:local/root "../../plugins/hoplon"}
io.github.babashka/http-server
{:git/sha "b38c1f16ad2c618adae2c3b102a5520c261a7dd3"}}
:tasks
{:requires ([scittle.build :as build])
watch {:doc "Watch build"
:task (build/build {:action "watch"})}
serve {:doc "Starts http server for serving static files"
:requires ([babashka.http-server :as http])
:task (do (http/serve {:port 1341 :dir "resources/public"})
(println "Serving static assets at http://localhost:1341"))}
-dev {:depends [watch serve]}
dev {:doc "Run compilation in watch mode and start http server"
:task (do (run '-dev {:parallel true})
(deref (promise)))}
release {:doc "Release build (advanced compiled JS)"
:task (build/build {})}}}

1
plugins/demo/deps.edn Normal file
View file

@ -0,0 +1 @@
{:deps {io.github.babashka/scittle {:local/root "../.."}}}

View file

@ -0,0 +1,21 @@
<!DOCTYPE html>
<html>
<head>
<!-- <link rel="stylesheet" href="/css/style.css"> -->
<script src="/js/scittle.js" type="application/javascript"></script>
<script src="/js/scittle.javelin.js" type="application/javascript"></script>
<script src="/js/scittle.hoplon.js" type="application/javascript"></script>
<script type="application/x-scittle">
(require '[hoplon.core :as h])
(require '[javelin.core :as j])
(j/defc title "From Hoplon")
(h/body
(h/h1 (h/text "~{title}")))
</script>
</head>
<body>
<h1>Hello Hoplon!</h1>
</body>
</html>

View file

@ -0,0 +1,32 @@
{:deps
{:aliases [:dev]}
:dev-http
{8000 "classpath:public"}
:builds
{:main
{:target :browser
:js-options
{:resolve {"react" {:target :global
:global "React"}
"react-dom" {:target :global
:global "ReactDOM"}}}
:modules
{:scittle {:entries [scittle.core]}
:scittle.nrepl {:entries [scittle.nrepl]
:depends-on #{:scittle}}
:scittle.promesa {:entries [scittle.promesa]
:depends-on #{:scittle}}
:scittle.pprint {:entries [scittle.pprint]
:depends-on #{:scittle}}
:scittle.reagent {:entries [scittle.reagent]
:depends-on #{:scittle}}
:scittle.re-frame {:entries [scittle.re-frame]
:depends-on #{:scittle.reagent
:scittle}}
:scittle.cljs-ajax {:entries [scittle.cljs-ajax]
:depends-on #{:scittle}}}
:build-hooks [(shadow.cljs.build-report/hook)]
:output-dir "resources/public/js"
:devtools {:repl-pprint true}}}}

4
plugins/hoplon/deps.edn Normal file
View file

@ -0,0 +1,4 @@
{:deps
{hoplon/hoplon {:mvn/version "7.5.0"}
io.github.babashka/sci.configs {:git/sha "aa84a1b4f1fe45735e5b748769309fc842f737c1"
:exclusions [org.babashka/sci]}}}

View file

@ -0,0 +1,9 @@
(ns scittle.hoplon
{:no-doc true}
(:require [sci.configs.hoplon.hoplon :refer [config]]
[scittle.core :as scittle]))
(defn init []
(scittle/register-plugin!
::hoplon
config))

View file

@ -0,0 +1,9 @@
(ns scittle.javelin
{:no-doc true}
(:require [sci.configs.hoplon.javelin :refer [config]]
[scittle.core :as scittle]))
(defn init []
(scittle/register-plugin!
::javelin
config))

View file

@ -0,0 +1,13 @@
[{:name scittle/hoplon
:namespaces [javelin.core
hoplon.core
hoplon.dom]
:js "./scittle.hoplon.js"
:shadow-config
{:modules
{:scittle.hoplon {:init-fn scittle.hoplon/init
:depends-on #{:scittle :scittle.javelin}
:entries [hoplon.core hoplon.dom]}
:scittle.javelin {:init-fn scittle.javelin/init
:depends-on #{:scittle}
:entries [javelin.core]}}}}]

4
plugins/javelin/deps.edn Normal file
View file

@ -0,0 +1,4 @@
{:deps
{hoplon/javelin {:mvn/version "3.9.3"}
io.github.babashka/sci.configs {:git/sha "aa84a1b4f1fe45735e5b748769309fc842f737c1"
:exclusions [org.babashka/sci]}}}

View file

@ -0,0 +1,9 @@
(ns scittle.javelin
{:no-doc true}
(:require [sci.configs.hoplon.javelin :refer [config]]
[scittle.core :as scittle]))
(defn init []
(scittle/register-plugin!
::javelin
config))

View file

@ -0,0 +1,8 @@
[{:name scittle/javelin
:namespaces [javelin.core]
:js "./scittle.javelin.js"
:shadow-config
{:modules
{:scittle.javelin {:init-fn scittle.javelin/init
:depends-on #{:scittle}
:entries [javelin.core]}}}}]

View file

@ -4,9 +4,8 @@
<meta charset="utf-8">
<link rel="stylesheet" href="css/style.css">
<script src="https://babashka.github.io/scittle/js/scittle.js" type="application/javascript"></script>
<script crossorigin src="https://unpkg.com/react@17/umd/react.production.min.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.production.min.js"></script>
<script crossorigin src="https://cdn.jsdelivr.net/npm/react@18/umd/react.production.min.js"></script>
<script crossorigin src="https://cdn.jsdelivr.net/npm/react-dom@18/umd/react-dom.production.min.js"></script>
<script src="https://babashka.github.io/scittle/js/scittle.reagent.js" type="application/javascript"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.7.2/highlight.min.js" type="text/javascript"></script>

View file

@ -134,6 +134,7 @@
[:br]
[(fn []
[:a {:href (str "?name=" (js/encodeURIComponent @*bookmark-name)
"&code=" (js/encodeURIComponent @*code))} "Copy this link to share ⤴️"])]]))
"&code=" (js/encodeURIComponent @*code)
"%20")} "Copy this link to share ⤴️"])]]))
(rdom/render [workspace] (.getElementById js/document "app"))

View file

@ -0,0 +1,56 @@
(require '[clojure.string :as str])
(declare cm)
(defn eval-me []
(js/scittle.core.eval_string (-> cm .-state .-doc .toString)))
(def extension
(.of js/cv.keymap
(clj->js [{:key "Mod-Enter"
:run (fn []
(eval-me))}
#_{:key (str modifier "-Enter")
:shift (partial eval-top-level on-result)
:run (partial eval-at-cursor on-result)}])))
(def cm
(let [doc (str/trim "
(require '[reagent.core :as r]
'[reagent.dom :as rdom]
'[re-frame.core :as rf])
(rf/reg-event-fx ::click (fn [{:keys [db]} _] {:db (update db :clicks (fnil inc 0))}))
(rf/reg-sub ::clicks (fn [db] (:clicks db)))
(defn my-component []
(let [clicks (rf/subscribe [::clicks])]
[:div
[:p \"Clicks: \" @clicks]
[:p [:button {:on-click #(rf/dispatch [::click])}
\"Click me!\"]]]))
(rdom/render [my-component] (.getElementById js/document \"reagent\"))
")]
(js/cm.EditorView. #js {:doc doc
:extensions #js [js/cm.basicSetup, (js/lc.clojure), (.highest js/cs.Prec extension)]
:parent (js/document.querySelector "#app")
#_#_:dispatch (fn [tr] (-> cm (.update #js [tr])) (eval-me))
})))
(set! (.-eval_me js/globalThis) eval-me)
(set! (.-cm_instance js/globalThis) cm)
(defn linux? []
(some? (re-find #"(Linux)|(X11)" js/navigator.userAgent)))
(defn mac? []
(and (not (linux?))
(some? (re-find #"(Mac)|(iPhone)|(iPad)|(iPod)" js/navigator.platform))))
(let [elt (js/document.getElementById "evalMe")
txt (.-innerText elt)
mod-symbol (if (mac?)
"⌘"
"⌃")
txt (str txt " " mod-symbol"-⏎")]
(set! (.-innerHTML elt) txt))
(eval-me)

View file

@ -0,0 +1,33 @@
;; COPIED FROM https://github.com/cjohansen/replicant-tic-tac-toe/blob/7a33fb12f0cd6658b2f555ff673dee031d4aa921/src/tic_tac_toe/core.cljs
(ns replicant-tictactoe.core
(:require [replicant.dom :as r]
[replicant-tictactoe.game :as game]
[replicant-tictactoe.ui :as ui]))
(defn start-new-game [store]
(reset! store (game/create-game {:size 3})))
(defn main []
;; Set up the atom
(let [store (atom nil)
el (js/document.getElementById "app")]
;; Globally handle DOM events
(r/set-dispatch!
(fn [_ [action & args]]
(case action
:tic (apply swap! store game/tic args)
:reset (start-new-game store))))
;; Render on every change
(add-watch store ::render
(fn [_ _ _ game]
(->> (ui/game->ui-data game)
ui/render-game
(r/render el))))
;; Trigger the first render by initializing the game.
(start-new-game store)))
(main)

View file

@ -0,0 +1,44 @@
;; COPIED FROM https://github.com/cjohansen/replicant-tic-tac-toe/blob/7a33fb12f0cd6658b2f555ff673dee031d4aa921/src/tic_tac_toe/game.cljs
(ns replicant-tictactoe.game)
(defn create-game [{:keys [size]}]
{:next-player :x
:size size})
(def next-player {:x :o, :o :x})
(defn winner? [tics path]
(when (= 1 (count (set (map tics path))))
path))
(defn get-winning-path [{:keys [size tics]} y x]
(let [flip-y (fn [y] (- size 1 y))]
(or (winner? tics (mapv #(vector y %) (range 0 size)))
(winner? tics (mapv #(vector % x) (range 0 size)))
(when (= y x)
(winner? tics (mapv #(vector % %) (range 0 size))))
(when (= (flip-y y) x)
(winner? tics (mapv #(vector (flip-y %) %) (range 0 size)))))))
(defn maybe-conclude [game y x]
(if-let [path (get-winning-path game y x)]
(-> (dissoc game :next-player)
(assoc :over? true
:victory {:player (get-in game [:tics [y x]])
:path path}))
(let [tie? (= (count (:tics game)) (* (:size game) (:size game)))]
(cond-> game
tie? (dissoc :next-player)
tie? (assoc :over? true)))))
(defn tic [game y x]
(let [player (:next-player game)]
(if (or (get-in game [:tics [y x]])
(<= (:size game) x)
(<= (:size game) y))
game
(-> game
(assoc-in [:tics [y x]] player)
(assoc :next-player (next-player player))
(maybe-conclude y x)))))

View file

@ -0,0 +1,50 @@
/* COPIED from https://github.com/cjohansen/replicant-tic-tac-toe/blob/7a33fb12f0cd6658b2f555ff673dee031d4aa921/resources/public/styles.css */
.cell {
aspect-ratio: 1 / 1;
background: rgba(255, 255, 255, 0.8);
border-radius: 6%;
border: none;
display: block;
flex: 1 1 0%;
outline: none;
position: relative;
width: 100%;
}
.cell-content {
opacity: 1;
transition: opacity 0.25s;
}
.transparent {
opacity: 0;
}
.cell-dim {
background: rgba(249, 249, 240, 0.3);
}
.cell-highlight {
background: #fcfcf3;
}
.clickable {
cursor: pointer;
}
.board {
--gap: 0.75rem;
background: #833ab4;
background: linear-gradient(90deg, #833ab4 0%, #fd1d1d 50%, #fcb045 100%);
display: flex;
flex-direction: column;
gap: var(--gap);
padding: var(--gap);
max-width: 80vh;
}
.row {
display: flex;
flex-direction: row;
gap: var(--gap);
}

View file

@ -0,0 +1,75 @@
;; COPIED FROM https://github.com/cjohansen/replicant-tic-tac-toe/blob/7a33fb12f0cd6658b2f555ff673dee031d4aa921/src/tic_tac_toe/ui.cljs
(ns replicant-tictactoe.ui)
(def mark-x
[:svg {:xmlns "http://www.w3.org/2000/svg"
:viewBox "0 -10 108 100"}
[:path
{:fill "currentColor"
:d "m1.753 69.19.36-1.08q.35-1.09 1.92-2.97 1.58-1.87 3.85-3.84 2.29-1.97 4.6-3.54 2.31-1.57 4.93-3.24 2.62-1.66 4.65-2.9 2.04-1.23 3.91-2.27 1.87-1.05 3.98-2.31 2.11-1.27 4.12-2.5 2.01-1.24 4.33-2.51l4.6-2.52q2.27-1.25 4.84-2.86 2.56-1.62 5.03-3.09 2.47-1.47 4.5-2.88 2.03-1.4 3.82-2.82t3.81-3.47q2.01-2.06 3.7-3.51 1.69-1.46 3.47-3.03 1.77-1.57 4.01-3.69 2.24-2.11 4.13-3.7 1.89-1.58 3.93-2.97 2.04-1.39 4.05-2.49 2.01-1.11 5.26-2.54 3.24-1.44 4.48-1.46 1.24-.01 2.42.37 1.18.37 2.18 1.11 1 .74 1.71 1.75.71 1.02 1.06 2.21.34 1.19.3 2.43-.05 1.24-.5 2.39-.44 1.16-1.23 2.12-.79.95-1.84 1.61-1.05.65-2.26.94-1.21.28-2.44.16-1.23-.11-2.37-.62-1.13-.5-2.04-1.34-.91-.84-1.51-1.93-.6-1.08-.81-2.3-.22-1.22-.04-2.45.18-1.23.75-2.33.56-1.1 1.45-1.97.89-.86 2.01-1.4 1.11-.54 2.35-.69 1.23-.15 2.44.1t2.29.87q1.07.63 1.88 1.56.82.93 1.29 2.08.48 1.14.56 2.38.09 1.24-.23 2.44-.31 1.19-.99 2.23-.68 1.04-1.66 1.8-.98.76-2.15 1.18l-1.16.41-2.28 1.17q-2.28 1.18-4.38 2.7-2.1 1.51-4.2 3.44-2.1 1.92-4.18 3.7-2.08 1.77-3.9 3.44-1.81 1.68-3.41 3.13-1.6 1.46-3.38 3.09-1.79 1.62-3.44 2.97-1.66 1.34-3.53 2.4-1.88 1.06-4.17 2.65-2.3 1.6-4.79 2.74-2.48 1.14-4.98 2.71-2.5 1.57-4.51 2.47-2.01.9-3.99 1.87-1.98.97-3.88 2.02-1.91 1.05-4.38 2.34-2.46 1.28-4.94 2.53-2.47 1.25-4.48 2.38-2 1.12-3.96 2.14-1.95 1.01-3.83 1.99-1.89.98-4.37 2.05-2.48 1.06-2.96 2.01-.48.96-.78 1.49-.3.53-.71.97-.41.44-.92.77-.51.34-1.09.54-.57.2-1.17.25-.6.06-1.2-.03t-1.16-.32q-.56-.23-1.05-.59-.49-.35-.89-.82-.39-.46-.65-1.01-.27-.54-.4-1.14-.13-.59-.12-1.19.02-.6.18-1.19l.16-.59Z"}]
[:path
{:fill "currentColor"
:d "m28.099 4.991 2.69 1.97q2.69 1.96 4.5 3.22 1.8 1.28 4.54 3.46 2.74 2.18 4.57 3.89t3.38 3.72q1.54 2.02 2.88 4.3 1.34 2.28 2.83 4.46 1.48 2.18 2.63 4.14 1.15 1.96 2.74 4.07 1.59 2.1 3.59 4.19 1.99 2.08 4.23 4.48 2.24 2.4 3.7 4.04 1.47 1.64 2.91 3.23 1.44 1.59 3.08 3.58 1.64 1.99 3.51 4.08 1.87 2.09 3.55 3.77 1.69 1.68 4.1 3.51 2.42 1.83 3.9 2.58 1.48.74 2.14 1.34.66.6 1.15 1.33.5.74.8 1.57.31.84.4 1.72.1.88-.02 1.76-.12.88-.44 1.71-.33.82-.84 1.55-.51.72-1.19 1.3-.67.58-1.46.98-.79.41-1.65.61-.87.2-1.76.19-.88-.01-1.74-.24-.86-.22-1.64-.64-.78-.42-2.27-2.72-1.48-2.3-1.52-3.49-.03-1.19.31-2.33.35-1.14 1.04-2.11.69-.97 1.66-1.67.96-.7 2.1-1.05 1.14-.35 2.33-.32 1.19.02 2.31.43t2.05 1.15q.93.75 1.58 1.75.64 1 .93 2.15.29 1.16.2 2.35-.09 1.18-.56 2.28-.47 1.1-1.26 1.99-.79.88-1.83 1.47t-2.2.82q-1.17.23-2.35.07-1.19-.16-2.25-.68-1.07-.53-1.92-1.37-.84-.84-1.37-1.9-.54-1.07-.7-2.25-.17-1.18.06-2.35.22-1.17.8-2.21.58-1.04 1.47-1.84.88-.79 1.98-1.27 1.09-.47 2.28-.57 1.18-.1 2.34.18 1.16.29 2.16.93 1.01.63 1.76 1.56.74.93-.33-.26-1.07-1.18-.41-.58.66.59 1.15 1.33.5.74.8 1.57.31.83.4 1.72.1.88-.02 1.76-.12.88-.44 1.7-.33.83-.84 1.55-.51.73-1.19 1.31-.67.58-1.46.98-.79.41-1.65.61-.87.2-1.75.19-.89-.01-1.75-.24-.86-.22-1.64-.64-.78-.42-2.73-1.57-1.95-1.14-4.26-2.95-2.31-1.8-3.87-3.43-1.57-1.62-3.17-3.29-1.6-1.66-3.55-4.05-1.95-2.39-3.33-4.15-1.39-1.76-2.77-3.4-1.38-1.64-3.07-3.56-1.7-1.91-3.91-4.13-2.2-2.22-3.74-4.1-1.54-1.88-2.79-3.75-1.24-1.87-2.4-4.33t-2.39-4.46q-1.23-2.01-2.4-4.59-1.17-2.59-2.53-5.01-1.36-2.43-3.35-4.44-1.99-2.02-4.52-4.27-2.54-2.25-5.33-4.04-2.81-1.79-3.28-2.21-.47-.41-.83-.92-.35-.51-.58-1.1-.22-.58-.3-1.2-.08-.62-.01-1.23.08-.62.29-1.21.22-.58.58-1.1.35-.51.81-.93.47-.42 1.02-.71t1.16-.45q.61-.15 1.23-.15t1.22.14q.61.15 1.17.44l.55.28Z"}]])
(def mark-o
[:svg {:xmlns "http://www.w3.org/2000/svg"
:viewBox "0 0 114 114"}
[:path
{:fill "none"
:stroke "currentColor"
:stroke-linecap "round"
:stroke-width "6"
:d "M74.616 8.935c7.73 2.38 15.96 9.34 21.58 16.04 5.63 6.69 10.57 15.46 12.18 24.11 1.6 8.65.74 19.67-2.53 27.77-3.27 8.11-10.12 15.37-17.09 20.88-6.98 5.51-16.07 10.81-24.76 12.17-8.7 1.35-19.32-.76-27.42-4.06-8.1-3.29-15.73-8.93-21.21-15.73-5.48-6.81-10.32-16.5-11.67-25.09-1.35-8.6.19-18.39 3.57-26.51 3.38-8.11 9.99-16.6 16.71-22.19 6.72-5.59 13.95-10.52 23.63-11.36 9.68-.84 28.04 4.34 34.45 6.32 6.42 1.97 4.37 4.6 4.04 5.55m-48.33-9.69c7.65-3.32 19.78-3.63 28.63-2.01 8.86 1.63 17.85 5.89 24.49 11.76 6.64 5.87 12.7 15.08 15.37 23.48 2.67 8.41 2.5 18.4.65 26.95-1.85 8.54-5.98 17.59-11.77 24.34-5.78 6.74-14.56 13.05-22.93 16.11-8.37 3.06-18.75 4.19-27.29 2.25-8.54-1.93-17.37-7.89-23.96-13.87-6.59-5.97-12.89-13.58-15.57-21.96-2.69-8.39-2.31-19.94-.56-28.34 1.75-8.4 5.21-15.74 11.06-22.09 5.85-6.35 19.92-13.32 24.04-16.01 4.12-2.7.37-1.1.67-.16"}]])
(defn render-cell [{:keys [content on-click dim? highlight? clickable?]}]
[:button.cell
{:on {:click on-click}
:class (cond-> []
dim? (conj "cell-dim")
highlight? (conj "cell-highlight")
clickable? (conj "clickable"))}
(when content
[:div.cell-content
{:replicant/mounting {:class "transparent"}
:replicant/unmounting {:class "transparent"}}
content])])
(defn render-board [{:keys [rows]}]
[:div.board
(for [row rows]
[:div.row
(for [cell row]
(render-cell cell))])])
(defn render-game [{:keys [board button]}]
[:div
(render-board board)
(when button
[:button {:on {:click (:on-click button)}
:style {:margin-top 20
:font-size 20}}
(:text button)])])
(def player->mark
{:x mark-x
:o mark-o})
(defn game->ui-data [{:keys [size tics victory over?]}]
(let [highlight? (set (:path victory))]
{:button (when over?
{:text "Start over"
:on-click [:reset]})
:board
{:rows
(for [y (range size)]
(for [x (range size)]
(if-let [player (get tics [y x])]
(let [victorious? (highlight? [y x])]
(cond-> {:content (player->mark player)}
victorious? (assoc :highlight? true)
(and over? (not victorious?)) (assoc :dim? true)))
(if over?
{:dim? true}
{:clickable? true
:on-click [:tic y x]}))))}}))

View file

@ -0,0 +1,57 @@
<html>
<head>
<script async src="https://ga.jspm.io/npm:es-module-shims@1.6.1/dist/es-module-shims.js"></script>
<script src="https://cdn.jsdelivr.net/npm/scittle@0.7.28/dist/scittle.js"></script>
<script>scittle.core.disable_auto_eval();</script>
<script crossorigin src="https://cdn.jsdelivr.net/npm/react@18/umd/react.production.min.js"></script>
<script crossorigin src="https://cdn.jsdelivr.net/npm/react-dom@18/umd/react-dom.production.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/scittle@0.7.28/dist/scittle.reagent.js"> </script>
<script src="https://cdn.jsdelivr.net/npm/scittle@0.7.28/dist/scittle.re-frame.js"> </script>
<script src="https://cdn.jsdelivr.net/npm/scittle@0.7.28/dist/scittle.promesa.js"> </script>
<script type="importmap">
{
"imports": {
"codemirror": "https://cdn.jsdelivr.net/npm/codemirror/dist/index.js",
"@codemirror/commands": "https://cdn.jsdelivr.net/npm/@codemirror/commands/dist/index.js",
"@codemirror/search": "https://cdn.jsdelivr.net/npm/@codemirror/search/dist/index.js",
"@codemirror/autocomplete": "https://cdn.jsdelivr.net/npm/@codemirror/autocomplete/dist/index.js",
"@codemirror/lint": "https://cdn.jsdelivr.net/npm/@codemirror/lint/dist/index.js",
"crelt": "https://cdn.jsdelivr.net/npm/crelt/index.es.js",
"@nextjournal/lang-clojure": "https://cdn.jsdelivr.net/npm/@nextjournal/lang-clojure/dist/index.js",
"@nextjournal/lezer-clojure": "https://cdn.jsdelivr.net/npm/@nextjournal/lezer-clojure/dist/index.es.js",
"@lezer/highlight": "https://cdn.jsdelivr.net/npm/@lezer/highlight/dist/index.js",
"@lezer/lr": "https://cdn.jsdelivr.net/npm/@lezer/lr/dist/index.js",
"@lezer/common": "https://cdn.jsdelivr.net/npm/@lezer/common/dist/index.js",
"@codemirror/language": "https://cdn.jsdelivr.net/npm/@codemirror/language/dist/index.js",
"@marijn/find-cluster-break": "https://cdn.jsdelivr.net/npm/@marijn/find-cluster-break",
"@codemirror/state": "https://cdn.jsdelivr.net/npm/@codemirror/state/dist/index.js",
"@codemirror/view": "https://cdn.jsdelivr.net/npm/@codemirror/view/dist/index.js",
"style-mod": "https://cdn.jsdelivr.net/npm/style-mod/src/style-mod.js",
"w3c-keyname": "https://cdn.jsdelivr.net/npm/w3c-keyname/index.es.js"
}
}
</script>
<script type="module" type="application/javascript">
import * as cm from 'codemirror';
import * as lc from '@nextjournal/lang-clojure'
import * as cv from '@codemirror/view';
import * as cs from '@codemirror/state';
globalThis.cm = cm;
globalThis.lc = lc;
globalThis.cv = cv;
globalThis.cs = cs;
scittle.core.eval_script_tags();
</script>
<script type="application/x-scittle" src="cljs/codemirror.cljs"></script>
</head>
<body>
<h1>Using <a href="https://www.npmjs.com/package/@nextjournal/lang-clojure">@nextjournal/lang-clojure</a> directly from npm in HTML!</h1>
<div id="app">
</div>
<div id="reagent">
</div>
<button id="evalMe" onClick="eval_me()">Eval</button>
</body>
</html>

View file

@ -1,7 +1,7 @@
<html>
<head>
<script src="https://cdn.jsdelivr.net/npm/scittle@0.2.8/dist/scittle.js" type="application/javascript"></script>
<script src="https://cdn.jsdelivr.net/npm/scittle@0.2.8/dist/scittle.cljs-ajax.js" type="application/javascript"></script>
<script src="https://cdn.jsdelivr.net/npm/scittle@0.7.28/dist/scittle.js" type="application/javascript"></script>
<script src="https://cdn.jsdelivr.net/npm/scittle@0.7.28/dist/scittle.cljs-ajax.js" type="application/javascript"></script>
<script type="application/x-scittle">
(require '[ajax.core :refer [GET]])

View file

@ -1,6 +1,6 @@
<html>
<head>
<script src="https://cdn.jsdelivr.net/npm/scittle@0.2.8/dist/scittle.js" type="application/javascript"></script>
<script src="https://cdn.jsdelivr.net/npm/scittle@0.7.28/dist/scittle.js" type="application/javascript"></script>
<script type="application/x-scittle">
(defn my-alert []
(js/alert "You clicked!"))

View file

@ -1,22 +1,12 @@
<html>
<head>
<script src="../js/scittle.js" type="application/javascript"></script>
<script crossorigin src="https://unpkg.com/react@17/umd/react.production.min.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.production.min.js"></script>
<script crossorigin src="https://cdn.jsdelivr.net/npm/react@18/umd/react.production.min.js"></script>
<script crossorigin src="https://cdn.jsdelivr.net/npm/react-dom@18/umd/react-dom.production.min.js"></script>
<script src="../js/scittle.reagent.js" type="application/javascript"></script>
<script type="application/x-scittle">
(require '[reagent.core :as r]
'[reagent.dom :as rdom])
(def state (r/atom {:clicks 0}))
(defn my-component []
[:div
[:p "Clicks: " (:clicks @state)]
[:p [:button {:on-click #(do (print :foo) (println :dude) (prn (with-out-str (prn :foo))) (swap! state update :clicks inc))}
"Click me!"]]])
(rdom/render [my-component] (.getElementById js/document "app"))
(defn f [x]
(inc n))
</script>
</head>
<body>

View file

@ -1,9 +1,9 @@
<html>
<head>
<script src="https://cdn.jsdelivr.net/npm/scittle@0.2.8/dist/scittle.js" type="application/javascript"></script>
<script crossorigin src="https://unpkg.com/react@17/umd/react.production.min.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.production.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/scittle@0.2.8/dist/scittle.reagent.js" type="application/javascript"></script>
<script src="https://cdn.jsdelivr.net/npm/scittle@0.7.28/dist/scittle.js" type="application/javascript"></script>
<script crossorigin src="https://cdn.jsdelivr.net/npm/react@18/umd/react.production.min.js"></script>
<script crossorigin src="https://cdn.jsdelivr.net/npm/react-dom@18/umd/react-dom.production.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/scittle@0.7.28/dist/scittle.reagent.js" type="application/javascript"></script>
<script type="application/x-scittle">
(require '[reagent.core :as r]
'[reagent.dom :as rdom])

View file

@ -3,10 +3,13 @@
<head>
<link rel="stylesheet" href="css/style.css">
<script src="js/scittle.js" type="application/javascript"></script>
<script crossorigin src="https://unpkg.com/react@17/umd/react.production.min.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.production.min.js"></script>
<script crossorigin src="https://cdn.jsdelivr.net/npm/react@18/umd/react.production.min.js"></script>
<script crossorigin src="https://cdn.jsdelivr.net/npm/react-dom@18/umd/react-dom.production.min.js"></script>
<script src="js/scittle.reagent.js" type="application/javascript"></script>
<!-- <script src="js/scittle.re-frame.js" type="application/javascript"></script> -->
<script src="js/scittle.cljs-ajax.js" type="application/javascript"></script>
<script src="js/scittle.pprint.js" type="application/javascript"></script>
<script type="application/x-scittle">
(defn my-alert []
(js/alert "You clicked!"))
@ -18,14 +21,26 @@
(def state (r/atom {:clicks 0}))
#_(require '[re-frame.core :as rf]
'[reagent.dom :as rdom])
#_(rf/reg-event-fx ::click (fn [{:keys [db]} [_]] {:db (update db :clicks (fnil inc 0))}))
#_(rf/reg-sub ::clicks (fn [db _] (:clicks db)))
(defn my-component []
[:div
[:p "Clicks: " (:clicks @state)]
[:p [:button {:on-click #(swap! state update :clicks inc)}
[:p [:button {:on-click #(do (swap! state update :clicks inc)
#_(rf/dispatch [::click]))}
"Click me!"]]])
#_(defn re-frame-component []
(let [clicks (rf/subscribe [::clicks])]
[:div "Clicks:" @clicks]))
(rdom/render [my-component] (.getElementById js/document "app"))
#_(rdom/render [re-frame-component] (.getElementById js/document "re-frame"))
(require '[ajax.core :refer [GET]])
(defn handler [response]
@ -72,7 +87,7 @@
To embed scittle in your website, it is recommended to use the links
published to
the <a href="https://github.com/babashka/scittle/releases/tag/v0.2.8">releases
the <a href="https://github.com/babashka/scittle/releases/tag/v0.7.28">releases
page</a>.
Include <tt>scittle.js</tt> and write a <tt>script</tt> tag
@ -106,6 +121,14 @@
<div id="app"></div>
<a name="re-frame"></a>
<h2><a href="#re-frame">Re-frame plugin</a></h2>
To enable <a href="https://github.com/day8/re-frame">re-frame</a>,
in addition to the files needed for reagent, you need to include <tt>scittle.re-frame.js</tt>.
Also see the <a href="codemirror.html">codemirror</a> playground.
<a name="cljs-ajax"></a>
<h2><a href="#cljs-ajax">Cljs-ajax plugin</a></h2>
@ -118,6 +141,31 @@
Click me!
</button>
<a name="pprint"></a>
<h2><a href="#pprint">cljs.pprint plugin</a></h2> To
enable <a href="https://cljs.github.io/api/cljs.pprint/">cljs.pprint</a>, in
addition to <tt>scittle.js</tt>, you need to
include <tt>scittle.pprint.js</tt>.
<a name="reader-conditional"></a>
<h2><a href="#reader-conditional">Target :scittle in cljc</a></h2>
You can target scittle in .cljc files (use a script tag to include the cljc file) with the <code>:scittle</code> reader conditional like this:<br>
<pre><code class="clojure">
#?(:scittle
(js/console.log "In scittle")
:org.babashka/nbb
(js/console.log "In nbb")
:cljs
(js/console.log "In cljs"))
</code></pre>
<a name="JS libraries"></a>
<h2><a href="#js-libraries">JS libraries</a></h2>
To use JavaScript libraries with Scittle,
see <a href="https://github.com/babashka/scittle/blob/main/doc/js-libraries.md">README.md</a>
<a name="repl"></a>
<h2><a href="#nrepl">REPL</a></h2>
@ -135,6 +183,8 @@
<a href="https://github.com/kloimhardt/babashka-scittle-guestbook">
Babashka + scittle implementation of the Luminus guestbook.
</a></li>
<li><a href="codemirror.html">Codemirror</a></li>
<li><a href="replicant_tictactoe.html">Tic-tac-toe with Replicant</a></li>
</ul>
</body>

View file

@ -0,0 +1,13 @@
<!DOCTYPE html>
<html>
<head>
<script src="js/scittle.js" type="application/javascript"></script>
<script src="js/scittle.cljs-devtools.js" type="application/javascript"></script>
<script type="application/x-scittle">
(js/console.log {:a 1})
</script>
</head>
<body>
</body>
</html>

View file

@ -0,0 +1,46 @@
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="css/style.css">
<script src="js/scittle.js" type="application/javascript"></script>
<script src="js/scittle.replicant.js" type="application/javascript"></script>
<script type="application/x-scittle" src="cljs/replicant_tictactoe/ui.cljs"></script>
<script type="application/x-scittle" src="cljs/replicant_tictactoe/game.cljs"></script>
<script type="application/x-scittle" src="cljs/replicant_tictactoe/core.cljs"></script>
<link rel="stylesheet" href="cljs/replicant-tictactoe/style.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.7.2/highlight.min.js" type="text/javascript"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.7.2/languages/clojure.min.js" type="text/javascript"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.7.2/styles/zenburn.min.css" integrity="sha512-JPxjD2t82edI35nXydY/erE9jVPpqxEJ++6nYEoZEpX2TRsmp2FpZuQqZa+wBCen5U16QZOkMadGXHCfp+tUdg==" crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
<body>
<h1>Scittle tic-tac-toe built with Replicant</h1>
<h2>What is Scittle?</h2>
<p>Read <a href="index.html">the main page</a> for more details.</p>
<h2>The game</h2>
<div id="app"></div>
<p>The following source was loaded and interpreted
from <a href="cljs/replicant_tictactoe/core.cljs"><tt>cljs/replicant_tictactoe/core.cljs</tt></a> using the
script tag:
<pre><code class="html">
&lt;script type=&quot;application/x-scittle&quot; src=&quot;cljs/replicant_tictactoe/ui.cljs&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;application/x-scittle&quot; src=&quot;cljs/replicant_tictactoe/game.cljs&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;application/x-scittle&quot; src=&quot;cljs/replicant_tictactoe/core.cljs&quot;&gt;&lt;/script&gt;
</code></pre>
</p>
<pre><code class="language-clojure" id="cljs"></code></pre>
<script type="application/x-scittle">
(defn set-text [progress-event]
(let [elt (.getElementById js/document "cljs")]
(set! (.-innerHTML elt) (.. progress-event -srcElement -responseText))
(.highlightAll js/hljs)))
(def oreq (js/XMLHttpRequest.))
(.addEventListener oreq "load" set-text)
(.open oreq "GET" "cljs/replicant_tictactoe/core.cljs")
(.send oreq)
</script>
</body>
</html>

View file

@ -0,0 +1,56 @@
<html>
<head>
<!-- This HTML file is for local debugging -->
<script async src="https://ga.jspm.io/npm:es-module-shims@1.6.1/dist/es-module-shims.js"></script>
<script src="/js/scittle.js"></script>
<script>scittle.core.disable_auto_eval();</script>
<script crossorigin src="https://cdn.jsdelivr.net/npm/react@18/umd/react.production.min.js"></script>
<script crossorigin src="https://cdn.jsdelivr.net/npm/react-dom@18/umd/react-dom.production.min.js"></script>
<script src="/js/scittle.reagent.js"> </script>
<script src="/js/scittle.re-frame.js"> </script>
<script src="/js/scittle.pprint.js"> </script>
<script type="importmap">
{
"imports": {
"codemirror": "https://cdn.jsdelivr.net/npm/codemirror/dist/index.js",
"@codemirror/commands": "https://cdn.jsdelivr.net/npm/@codemirror/commands/dist/index.js",
"@codemirror/search": "https://cdn.jsdelivr.net/npm/@codemirror/search/dist/index.js",
"@codemirror/autocomplete": "https://cdn.jsdelivr.net/npm/@codemirror/autocomplete/dist/index.js",
"@codemirror/lint": "https://cdn.jsdelivr.net/npm/@codemirror/lint/dist/index.js",
"crelt": "https://cdn.jsdelivr.net/npm/crelt/index.es.js",
"@nextjournal/lang-clojure": "https://cdn.jsdelivr.net/npm/@nextjournal/lang-clojure/dist/index.js",
"@nextjournal/lezer-clojure": "https://cdn.jsdelivr.net/npm/@nextjournal/lezer-clojure/dist/index.es.js",
"@lezer/highlight": "https://cdn.jsdelivr.net/npm/@lezer/highlight/dist/index.js",
"@lezer/lr": "https://cdn.jsdelivr.net/npm/@lezer/lr/dist/index.js",
"@lezer/common": "https://cdn.jsdelivr.net/npm/@lezer/common/dist/index.js",
"@codemirror/language": "https://cdn.jsdelivr.net/npm/@codemirror/language/dist/index.js",
"@codemirror/state": "https://cdn.jsdelivr.net/npm/@codemirror/state/dist/index.js",
"@codemirror/view": "https://cdn.jsdelivr.net/npm/@codemirror/view/dist/index.js",
"style-mod": "https://cdn.jsdelivr.net/npm/style-mod/src/style-mod.js",
"w3c-keyname": "https://cdn.jsdelivr.net/npm/w3c-keyname/index.es.js"
}
}
</script>
<script type="module" type="application/javascript">
import * as cm from 'codemirror';
import * as lc from '@nextjournal/lang-clojure'
import * as cv from '@codemirror/view';
import * as cs from '@codemirror/state';
globalThis.cm = cm;
globalThis.lc = lc;
globalThis.cv = cv;
globalThis.cs = cs;
scittle.core.eval_script_tags();
</script>
<script type="application/x-scittle" src="/cljs/codemirror.cljs"></script>
</head>
<body>
<h1>Using <a href="https://www.npmjs.com/package/@nextjournal/lang-clojure">@nextjournal/lang-clojure</a> directly from npm in HTML!</h1>
<div id="app">
</div>
<div id="reagent">
</div>
<button id="evalMe" onClick="eval_me()">Eval</button>
</body>
</html>

View file

@ -3,9 +3,8 @@
<head>
<link rel="stylesheet" href="css/style.css">
<script src="js/scittle.js" type="application/javascript"></script>
<script crossorigin src="https://unpkg.com/react@17/umd/react.production.min.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.production.min.js"></script>
<script crossorigin src="https://cdn.jsdelivr.net/npm/react@18/umd/react.production.min.js"></script>
<script crossorigin src="https://cdn.jsdelivr.net/npm/react-dom@18/umd/react-dom.production.min.js"></script>
<script src="js/scittle.reagent.js" type="application/javascript"></script>
<script type="application/x-scittle" src="cljs/tictactoe.cljs"></script>

17
script/changelog.clj Executable file
View file

@ -0,0 +1,17 @@
#!/usr/bin/env bb
(ns changelog
(:require [clojure.string :as str]))
(let [changelog (slurp "CHANGELOG.md")
replaced (str/replace changelog
#" #(\d+)"
(fn [[_ issue after]]
(format " [#%s](https://github.com/babashka/scittle/issues/%s)%s"
issue issue (str after))))
replaced (str/replace replaced
#"@([a-zA-Z0-9-_]+)([, \.)])"
(fn [[_ name after]]
(format "[@%s](https://github.com/%s)%s"
name name after)))]
(spit "CHANGELOG.md" replaced))

View file

@ -3,6 +3,8 @@
(require '[babashka.fs :as fs]
'[babashka.tasks :refer [shell]])
(fs/create-dirs "gh-pages")
(fs/copy "resources/public/index.html" "gh-pages"
{:replace-existing true})
@ -21,6 +23,12 @@
(fs/copy "resources/public/disable_auto_eval.html" "gh-pages"
{:replace-existing true})
(fs/copy "resources/public/codemirror.html" "gh-pages"
{:replace-existing true})
(fs/copy "resources/public/replicant_tictactoe.html" "gh-pages"
{:replace-existing true})
(def html-source-dir (fs/file "resources" "public" "html"))
(def html-target-dir (fs/file "gh-pages" "html"))
(fs/create-dirs html-target-dir)
@ -57,6 +65,9 @@
{:replace-existing true}))
(fs/glob cljs-source-dir "*.cljs"))
(println "Copying dir resources/public/cljs/replicant_tictactoe")
(fs/copy-tree (fs/file cljs-source-dir "replicant_tictactoe") (fs/file cljs-target-dir "replicant_tictactoe") {:replace-existing true})
(run! (fn [f]
(println "Copying" (str f))
(fs/copy f

View file

@ -6,7 +6,14 @@
:builds
{:main
{:target :browser
{;:compiler-options {:source-map true}
;; for dev build
#_#_
:compiler-options {:optimizations :simple
:pretty-print true
:pseudo-names true
:source-map true}
:target :browser
:js-options
{:resolve {"react" {:target :global
:global "React"}
@ -16,10 +23,22 @@
{:scittle {:entries [scittle.core]}
:scittle.nrepl {:entries [scittle.nrepl]
:depends-on #{:scittle}}
:scittle.promesa {:entries [scittle.promesa]
:depends-on #{:scittle}}
:scittle.js-interop {:entries [scittle.js-interop]
:depends-on #{:scittle}}
:scittle.pprint {:entries [scittle.pprint]
:depends-on #{:scittle}}
:scittle.reagent {:entries [scittle.reagent]
:depends-on #{:scittle}}
:scittle.replicant {:entries [scittle.replicant]
:depends-on #{:scittle}}
:scittle.re-frame {:entries [scittle.re-frame]
:depends-on #{:scittle.reagent
:scittle}}
:scittle.cljs-ajax {:entries [scittle.cljs-ajax]
:depends-on #{:scittle}}}
:build-hooks [(shadow.cljs.build-report/hook)]
:output-dir "resources/public/js"
:devtools {:repl-pprint true}}}}
:output-dir "resources/public/js" ;; + "/dev" for dev build
:devtools {:repl-pprint true}
}}}

View file

@ -1,13 +1,12 @@
(ns scittle.cljs-ajax
(:require [ajax.core :as ajx]
(:require [ajax.core]
[sci.core :as sci]
[scittle.core :as scittle]))
(def ans (sci/create-ns 'ajax.core nil))
(def ajax-namespace
{'GET (sci/copy-var ajx/GET ans)
'POST (sci/copy-var ajx/POST ans)})
(sci/copy-ns ajax.core ans))
(scittle/register-plugin!
::ajax

View file

@ -0,0 +1,6 @@
(ns scittle.cljs-devtools
(:require [devtools.core :as devtools]))
(devtools/set-pref! :disable-advanced-mode-check true)
(devtools/install!)

View file

@ -2,10 +2,19 @@
(:refer-clojure :exclude [time])
(:require [cljs.reader :refer [read-string]]
[goog.object :as gobject]
[goog.string]
[goog.string :as gstring]
[goog.string.format]
[sci.core :as sci]
[sci.ctx-store :as store]
[sci.impl.unrestrict]
[scittle.impl.common :refer [cljns]]
[scittle.impl.error :as error]))
[scittle.impl.error :as error]
[clojure.string :as str]))
(set! sci.impl.unrestrict/*unrestricted* true)
;; make document conditional
(def ^js doc js/globalThis.document)
(clojure.core/defmacro time
"Evaluates expr and prints the time it took. Returns the value of expr."
@ -24,16 +33,42 @@
{'clojure.core
{'time (sci/copy-var time cljns)
'system-time (sci/copy-var system-time cljns)
'random-uuid random-uuid
'read-string (sci/copy-var read-string rns)}
'random-uuid (sci/copy-var random-uuid cljns)
'read-string (sci/copy-var read-string cljns)
'update-keys (sci/copy-var update-keys cljns)
'update-vals (sci/copy-var update-vals cljns)
'parse-boolean (sci/copy-var parse-boolean cljns)
'parse-double (sci/copy-var parse-double cljns)
'parse-long (sci/copy-var parse-long cljns)
'parse-uuid (sci/copy-var parse-uuid cljns)
'NaN? (sci/copy-var NaN? cljns)
'infinite? (sci/copy-var infinite? cljns)
'iteration (sci/copy-var iteration cljns)
'abs (sci/copy-var abs cljns)
'Cons cljs.core/Cons}
'goog.object {'set gobject/set
'get gobject/get}})
'get gobject/get}
'goog.string {'format gstring/format
'htmlEscape gstring/htmlEscape}
'goog.string.format {} ;; For cljs compatibility
'sci.core {'stacktrace sci/stacktrace
'format-stacktrace sci/format-stacktrace}})
(def !sci-ctx (atom (sci/init {:namespaces namespaces
:classes {'js js/window
:allow :all}
:disable-arity-checks true})))
(defn load-fn [{:keys [ctx] :as opts}]
(when-let [lib (and (string? (:namespace opts))
(gobject/get js/globalThis (:namespace opts)))]
(sci/add-js-lib! ctx (:namespace opts) lib)))
(store/reset-ctx!
(sci/init {:namespaces namespaces
:classes {'js js/globalThis
:allow :all
'Math js/Math}
:ns-aliases {'clojure.pprint 'cljs.pprint}
:features #{:scittle :cljs}
:load-fn load-fn}))
(unchecked-set js/globalThis "import" (js/eval "(x) => import(x)"))
(def !last-ns (volatile! @sci/ns))
@ -41,51 +76,54 @@
(sci/binding [sci/ns @!last-ns]
(let [rdr (sci/reader s)]
(loop [res nil]
(let [form (sci/parse-next @!sci-ctx rdr)]
(let [form (sci/parse-next (store/get-ctx) rdr)]
(if (= :sci.core/eof form)
(do
(vreset! !last-ns @sci/ns)
res)
(recur (sci/eval-form @!sci-ctx form))))))))
(recur (sci/eval-form (store/get-ctx) form))))))))
(defn ^:export eval-string [s]
(try (-eval-string s)
(catch :default e
(error/error-handler e (:src @!sci-ctx))
(let [sci-error? (isa? (:type (ex-data e)) :sci/error)]
(throw (if sci-error?
(or (ex-cause e) e)
e))))))
(error/error-handler e (:src (store/get-ctx)))
(throw e))))
(defn register-plugin! [plug-in-name sci-opts]
plug-in-name ;; unused for now
(swap! !sci-ctx sci/merge-opts sci-opts))
(defn register-plugin! [_plug-in-name sci-opts]
(store/swap-ctx! sci/merge-opts sci-opts))
(defn- eval-script-tags* [script-tags]
(when-let [tag (first script-tags)]
(if-let [text (not-empty (gobject/get tag "textContent"))]
(let [scittle-id (str (gensym "scittle-tag-"))]
(gobject/set tag "scittle_id" scittle-id)
(swap! !sci-ctx assoc-in [:src scittle-id] text)
(sci/binding [sci/file scittle-id]
(eval-string text))
(eval-script-tags* (rest script-tags)))
(let [src (.getAttribute tag "src")
req (js/XMLHttpRequest.)
(if-let [src (.getAttribute tag "src")]
(let [req (js/XMLHttpRequest.)
_ (.open req "GET" src true)
_ (gobject/set req "onload"
(fn [] (this-as this
(let [response (gobject/get this "response")]
(gobject/set tag "scittle_id" src)
;; save source for error messages
(swap! !sci-ctx assoc-in [:src src] response)
(store/swap-ctx! assoc-in [:src src] response)
(sci/binding [sci/file src]
(eval-string response)))
(eval-script-tags* (rest script-tags)))))]
(.send req)))))
(.send req))
(if-let [text (not-empty (str/trim (gobject/get tag "textContent")))]
(let [scittle-id (str (gensym "scittle-tag-"))]
(gobject/set tag "scittle_id" scittle-id)
(store/swap-ctx! assoc-in [:src scittle-id] text)
(sci/binding [sci/file scittle-id]
(eval-string text))
(eval-script-tags* (rest script-tags)))
(eval-script-tags* (rest script-tags))))))
(defn ^:export eval-script-tags []
(let [script-tags (js/document.querySelectorAll "script[type='application/x-scittle']")]
(defn ^:export eval-script-tags [& [script-tags]]
(let [script-tags (or script-tags
(.querySelectorAll
doc "script[type='application/x-scittle']"))
script-tags (if (or (coll? script-tags)
(aget script-tags "length"))
script-tags
[script-tags])]
(eval-script-tags* script-tags)))
(def auto-load-disabled? (volatile! false))
@ -97,10 +135,10 @@
[]
(vreset! auto-load-disabled? true))
(js/document.addEventListener
(when doc
(.addEventListener doc
"DOMContentLoaded"
(fn [] (when-not @auto-load-disabled? (eval-script-tags))), false)
(fn [] (when-not @auto-load-disabled? (eval-script-tags))), false))
(enable-console-print!)
(sci/alter-var-root sci/print-fn (constantly *print-fn*))

View file

@ -69,8 +69,8 @@
(when-let [m (.-message e)]
(println (str "Message: " m)))
(when-let [d (ex-data (ex-cause e) #_(.getCause e))]
(print (str "Data: "))
(prn d))
(println (str "Data: ")
(pr-str d)))
(let [{:keys [:file :line :column]} d]
(when line
(println (str "Location: "

View file

@ -0,0 +1,8 @@
(ns scittle.js-interop
(:require
[sci.configs.applied-science.js-interop :as j]
[scittle.core :as scittle]))
(scittle/register-plugin!
::js-interop
j/config)

View file

@ -1,45 +1,21 @@
(ns scittle.nrepl
(:require
[clojure.edn :as edn]
[sci.nrepl.completions :refer [completions]]
[scittle.core :refer [!last-ns eval-string !sci-ctx]]))
[sci.nrepl.server :as nrepl-server]))
(defn nrepl-websocket []
(.-ws_nrepl js/window))
(defn ws-url [host port path]
(str "ws://" host ":" port "/" path))
(defn nrepl-reply [{:keys [id session]} payload]
(.send (nrepl-websocket)
(str (assoc payload :id id :session session :ns (str @!last-ns)))))
(defn handle-nrepl-eval [{:keys [code] :as msg}]
(let [[kind val] (try [::success (eval-string code)]
(catch :default e
[::error (str e)]))]
(case kind
::success
(do (nrepl-reply msg {:value (pr-str val)})
(nrepl-reply msg {:status ["done"]}))
::error
(do
(nrepl-reply msg {:err (pr-str val)})
(nrepl-reply msg {:ex (pr-str val)
:status ["error" "done"]})))))
(defn handle-nrepl-message [msg]
(case (:op msg)
:eval (handle-nrepl-eval msg)
:complete (let [completions (completions (assoc msg :ctx @!sci-ctx))]
(nrepl-reply msg completions))))
(when (.-SCITTLE_NREPL_WEBSOCKET_PORT js/window)
(when-let [ws-port (.-SCITTLE_NREPL_WEBSOCKET_PORT js/window)]
(set! (.-ws_nrepl js/window)
(new js/WebSocket "ws://localhost:1340/_nrepl")))
(new js/WebSocket (ws-url (or (.-SCITTLE_NREPL_WEBSOCKET_HOST js/window)
(.-hostname (.-location js/window)))
ws-port "_nrepl"))))
(when-let [ws (nrepl-websocket)]
(prn :ws ws)
(when-let [ws (nrepl-server/nrepl-websocket)]
(set! (.-onmessage ws)
(fn [event]
(handle-nrepl-message (edn/read-string (.-data event)))))
(nrepl-server/handle-nrepl-message (edn/read-string (.-data event)))))
(set! (.-onerror ws)
(fn [event]
(js/console.log event))))

8
src/scittle/pprint.cljs Normal file
View file

@ -0,0 +1,8 @@
(ns scittle.pprint
(:require
[sci.configs.cljs.pprint :refer [config]]
[scittle.core :as scittle]))
(scittle/register-plugin!
::pprint
config)

8
src/scittle/promesa.cljs Normal file
View file

@ -0,0 +1,8 @@
(ns scittle.promesa
(:require
[sci.configs.funcool.promesa :as p]
[scittle.core :as scittle]))
(scittle/register-plugin!
::promesa
p/config)

View file

@ -0,0 +1,8 @@
(ns scittle.re-frame
(:require
[sci.configs.re-frame.re-frame :as rf]
[scittle.core :as scittle]))
(scittle/register-plugin!
::re-frame
rf/config)

View file

@ -0,0 +1,8 @@
(ns scittle.replicant
(:require
[sci.configs.cjohansen.replicant :refer [config]]
[scittle.core :as scittle]))
(scittle/register-plugin!
::replicant
config)