Browse code

Add basic app

Joseph Weston authored on 02/03/2022 06:04:39
Showing 18 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,15 @@
1
+{:lint-as {day8.re-frame.tracing/defn-traced clojure.core/defn
2
+           day8.re-frame.tracing/fn-traced clojure.core/fn}
3
+ :linters {:unresolved-symbol {:exclude [goog.DEBUG]}
4
+           :unused-namespace {:exclude [cljs.repl]}
5
+           :unused-referred-var {:exclude {cljs.repl [Error->map
6
+                                                      apropos
7
+                                                      dir
8
+                                                      doc
9
+                                                      error->str
10
+                                                      ex-str
11
+                                                      ex-triage
12
+                                                      find-doc
13
+                                                      print-doc
14
+                                                      pst
15
+                                                      source]}}}}
0 16
new file mode 100644
... ...
@@ -0,0 +1 @@
1
+eval "$(lorri direnv)"
0 2
new file mode 100644
... ...
@@ -0,0 +1,18 @@
1
+/out/
2
+/resources/public/js/compiled/
3
+/target/
4
+/*-init.clj
5
+/*.log
6
+
7
+# Leiningen
8
+/.lein-*
9
+/.nrepl-port
10
+
11
+# Node.js dependencies
12
+/node_modules/
13
+
14
+# shadow-cljs cache, port files
15
+/.shadow-cljs/
16
+
17
+# clj-kondo cache
18
+/.clj-kondo/.cache
0 19
new file mode 100644
... ...
@@ -0,0 +1,223 @@
1
+## Getting Started
2
+
3
+### Project Overview
4
+
5
+* Architecture:
6
+[Single Page Application (SPA)](https://en.wikipedia.org/wiki/Single-page_application)
7
+* Languages
8
+  - Front end is [ClojureScript](https://clojurescript.org/) with ([re-frame](https://github.com/day8/re-frame))
9
+  - CSS compilation is [Garden](https://github.com/noprompt/garden) with [Spade](https://github.com/dhleong/spade)
10
+* Dependencies
11
+  - UI framework: [re-frame](https://github.com/day8/re-frame)
12
+  ([docs](https://github.com/day8/re-frame/blob/master/docs/README.md),
13
+  [FAQs](https://github.com/day8/re-frame/blob/master/docs/FAQs/README.md)) ->
14
+  [Reagent](https://github.com/reagent-project/reagent) ->
15
+  [React](https://github.com/facebook/react)
16
+  - CSS rendering: [Garden](https://github.com/noprompt/garden)
17
+* Build tools
18
+  - CLJS compilation, dependency management, REPL, & hot reload: [`shadow-cljs`](https://github.com/thheller/shadow-cljs)
19
+* Development tools
20
+  - Debugging: [CLJS DevTools](https://github.com/binaryage/cljs-devtools),
21
+  [`re-frame-10x`](https://github.com/day8/re-frame-10x)
22
+  - Emacs integration: [CIDER](https://github.com/clojure-emacs/cider)
23
+  - Linter: [clj-kondo](https://github.com/borkdude/clj-kondo)
24
+
25
+#### Directory structure
26
+
27
+* [`/`](/../../): project config files
28
+* [`.clj-kondo/`](.clj-kondo/): lint config and cache files (cache files are not tracked; see
29
+[`.gitignore`](.gitignore))
30
+* [`dev/`](dev/): source files compiled only with the [dev](#running-the-app) profile
31
+  - [`user.cljs`](dev/cljs/user.cljs): symbols for use during development in the
32
+[ClojureScript REPL](#connecting-to-the-browser-repl-from-a-terminal)
33
+* [`resources/public/`](resources/public/): SPA root directory;
34
+[dev](#running-the-app) / [prod](#production) profile depends on the most recent build
35
+  - [`index.html`](resources/public/index.html): SPA home page
36
+    - Dynamic SPA content rendered in the following `div`:
37
+        ```html
38
+        <div id="app"></div>
39
+        ```
40
+    - Customizable; add headers, footers, links to other scripts and styles, etc.
41
+  - Generated directories and files
42
+    - Created on build with either the [dev](#running-the-app) or [prod](#production) profile
43
+    - `js/compiled/`: compiled CLJS (`shadow-cljs`)
44
+      - Not tracked in source control; see [`.gitignore`](.gitignore)
45
+* [`src/dm/styles.cljs`](src/dm/styles.cljs): CSS compilation source file (ClojureScript,
46
+[Garden](https://github.com/noprompt/garden))
47
+* [`src/dm/`](src/dm/): SPA source files (ClojureScript,
48
+[re-frame](https://github.com/Day8/re-frame))
49
+  - [`core.cljs`](src/dm/core.cljs): contains the SPA entry point, `init`
50
+* [`.github/workflows/`](.github/workflows/): contains the
51
+[github actions](https://github.com/features/actions) pipelines.
52
+  - [`test.yaml`](.github/workflows/test.yaml): Pipeline for testing.
53
+
54
+
55
+### Editor/IDE
56
+
57
+Use your preferred editor or IDE that supports Clojure/ClojureScript development. See
58
+[Clojure tools](https://clojure.org/community/resources#_clojure_tools) for some popular options.
59
+
60
+### Environment Setup
61
+
62
+1. Install [JDK 8 or later](https://openjdk.java.net/install/) (Java Development Kit)
63
+2. Install [Node.js](https://nodejs.org/) (JavaScript runtime environment) which should include
64
+   [NPM](https://docs.npmjs.com/cli/npm) or if your Node.js installation does not include NPM also install it.
65
+4. Install [clj-kondo](https://github.com/borkdude/clj-kondo/blob/master/doc/install.md) (linter)
66
+5. Clone this repo and open a terminal in the `dm` project root directory
67
+6. (Optional) Setup [lint cache](https://github.com/borkdude/clj-kondo#project-setup):
68
+    ```sh
69
+    clj-kondo --lint "$(npx shadow-cljs classpath)"
70
+    ```
71
+7. Setup
72
+[linting in your editor](https://github.com/borkdude/clj-kondo/blob/master/doc/editor-integration.md)
73
+
74
+### Browser Setup
75
+
76
+Browser caching should be disabled when developer tools are open to prevent interference with
77
+[`shadow-cljs`](https://github.com/thheller/shadow-cljs) hot reloading.
78
+
79
+Custom formatters must be enabled in the browser before
80
+[CLJS DevTools](https://github.com/binaryage/cljs-devtools) can display ClojureScript data in the
81
+console in a more readable way.
82
+
83
+#### Chrome/Chromium
84
+
85
+1. Open [DevTools](https://developers.google.com/web/tools/chrome-devtools/) (Linux/Windows: `F12`
86
+or `Ctrl-Shift-I`; macOS: `⌘-Option-I`)
87
+2. Open DevTools Settings (Linux/Windows: `?` or `F1`; macOS: `?` or `Fn+F1`)
88
+3. Select `Preferences` in the navigation menu on the left, if it is not already selected
89
+4. Under the `Network` heading, enable the `Disable cache (while DevTools is open)` option
90
+5. Under the `Console` heading, enable the `Enable custom formatters` option
91
+
92
+#### Firefox
93
+
94
+1. Open [Developer Tools](https://developer.mozilla.org/en-US/docs/Tools) (Linux/Windows: `F12` or
95
+`Ctrl-Shift-I`; macOS: `⌘-Option-I`)
96
+2. Open [Developer Tools Settings](https://developer.mozilla.org/en-US/docs/Tools/Settings)
97
+(Linux/macOS/Windows: `F1`)
98
+3. Under the `Advanced settings` heading, enable the `Disable HTTP Cache (when toolbox is open)`
99
+option
100
+
101
+Unfortunately, Firefox does not yet support custom formatters in their devtools. For updates, follow
102
+the enhancement request in their bug tracker:
103
+[1262914 - Add support for Custom Formatters in devtools](https://bugzilla.mozilla.org/show_bug.cgi?id=1262914).
104
+
105
+
106
+## Development
107
+
108
+### Running the App
109
+
110
+Start a temporary local web server, build the app with the `dev` profile, and serve the app,
111
+browser test runner and karma test runner with hot reload:
112
+
113
+```sh
114
+npm install
115
+npx shadow-cljs watch app
116
+```
117
+
118
+Please be patient; it may take over 20 seconds to see any output, and over 40 seconds to complete.
119
+
120
+When `[:app] Build completed` appears in the output, browse to
121
+[http://localhost:8280/](http://localhost:8280/).
122
+
123
+[`shadow-cljs`](https://github.com/thheller/shadow-cljs) will automatically push ClojureScript code
124
+changes to your browser on save. To prevent a few common issues, see
125
+[Hot Reload in ClojureScript: Things to avoid](https://code.thheller.com/blog/shadow-cljs/2019/08/25/hot-reload-in-clojurescript.html#things-to-avoid).
126
+
127
+Opening the app in your browser starts a
128
+[ClojureScript browser REPL](https://clojurescript.org/reference/repl#using-the-browser-as-an-evaluation-environment),
129
+to which you may now connect.
130
+
131
+#### Connecting to the browser REPL from Emacs with CIDER
132
+
133
+Connect to the browser REPL:
134
+```
135
+M-x cider-jack-in-cljs
136
+```
137
+
138
+See
139
+[Shadow CLJS User's Guide: Emacs/CIDER](https://shadow-cljs.github.io/docs/UsersGuide.html#cider)
140
+for more information. Note that the mentioned [`.dir-locals.el`](.dir-locals.el) file has already
141
+been created for you.
142
+
143
+#### Connecting to the browser REPL from VS Code with Calva
144
+
145
+See the [re-frame-template README](https://github.com/day8/re-frame-template) for [Calva](https://github.com/BetterThanTomorrow/calva) instuctions. See also https://calva.io for Calva documentation.
146
+
147
+
148
+#### Connecting to the browser REPL from other editors
149
+
150
+See
151
+[Shadow CLJS User's Guide: Editor Integration](https://shadow-cljs.github.io/docs/UsersGuide.html#_editor_integration).
152
+Note that `npm run watch` runs `npx shadow-cljs watch` for you, and that this project's running build ids is
153
+`app`, `browser-test`, `karma-test`, or the keywords `:app`, `:browser-test`, `:karma-test` in a Clojure context.
154
+
155
+Alternatively, search the web for info on connecting to a `shadow-cljs` ClojureScript browser REPL
156
+from your editor and configuration.
157
+
158
+For example, in Vim / Neovim with `fireplace.vim`
159
+1. Open a `.cljs` file in the project to activate `fireplace.vim`
160
+2. In normal mode, execute the `Piggieback` command with this project's running build id, `:app`:
161
+    ```vim
162
+    :Piggieback :app
163
+    ```
164
+
165
+#### Connecting to the browser REPL from a terminal
166
+
167
+1. Connect to the `shadow-cljs` nREPL:
168
+    ```sh
169
+    lein repl :connect localhost:8777
170
+    ```
171
+    The REPL prompt, `shadow.user=>`, indicates that is a Clojure REPL, not ClojureScript.
172
+
173
+2. In the REPL, switch the session to this project's running build id, `:app`:
174
+    ```clj
175
+    (shadow.cljs.devtools.api/nrepl-select :app)
176
+    ```
177
+    The REPL prompt changes to `cljs.user=>`, indicating that this is now a ClojureScript REPL.
178
+3. See [`user.cljs`](dev/cljs/user.cljs) for symbols that are immediately accessible in the REPL
179
+without needing to `require`.
180
+
181
+### Running `shadow-cljs` Actions
182
+
183
+See a list of [`shadow-cljs CLI`](https://shadow-cljs.github.io/docs/UsersGuide.html#_command_line)
184
+actions:
185
+```sh
186
+npx shadow-cljs --help
187
+```
188
+
189
+Please be patient; it may take over 10 seconds to see any output. Also note that some actions shown
190
+may not actually be supported, outputting "Unknown action." when run.
191
+
192
+Run a shadow-cljs action on this project's build id (without the colon, just `app`):
193
+```sh
194
+npx shadow-cljs <action> app
195
+```
196
+### Debug Logging
197
+
198
+The `debug?` variable in [`config.cljs`](src/cljs/dm/config.cljs) defaults to `true` in
199
+[`dev`](#running-the-app) builds, and `false` in [`prod`](#production) builds.
200
+
201
+Use `debug?` for logging or other tasks that should run only on `dev` builds:
202
+
203
+```clj
204
+(ns dm.example
205
+  (:require [dm.config :as config])
206
+
207
+(when config/debug?
208
+  (println "This message will appear in the browser console only on dev builds."))
209
+```
210
+
211
+## Production
212
+
213
+Build the app with the `prod` profile:
214
+
215
+```sh
216
+npm install
217
+npm run release
218
+```
219
+
220
+Please be patient; it may take over 15 seconds to see any output, and over 30 seconds to complete.
221
+
222
+The `resources/public/js/compiled` directory is created, containing the compiled `app.js` and
223
+`manifest.edn` files.
0 224
new file mode 100644
... ...
@@ -0,0 +1,26 @@
1
+# Jambda
2
+
3
+A web-based playground for jamming with lambda calculus!
4
+
5
+Inpired by https://youtu.be/Bt11BsAZMq8
6
+
7
+## Table of Contents
8
+
9
+- [Jambda](#jambda)
10
+  - [Table of Contents](#table-of-contents)
11
+  - [Install](#install)
12
+  - [Usage](#usage)
13
+  - [Contributing](#contributing)
14
+  - [Licensing](#licensing)
15
+
16
+## Install
17
+
18
+## Usage
19
+
20
+## Contributing
21
+
22
+Check out [CONTRIBUTING.md](./CONTRIBUTING.md) for instructions on how to get started hacking on DMR.
23
+
24
+## Licensing
25
+
26
+This software is made available under the GNU Affero GPL (see [LICENSE](./LICENSE) for details) unless otherwise noted.
0 27
new file mode 100644
... ...
@@ -0,0 +1,11 @@
1
+(ns cljs.user
2
+  "Commonly used symbols for easy access in the ClojureScript REPL during
3
+  development."
4
+  (:require
5
+    [cljs.repl :refer (Error->map apropos dir doc error->str ex-str ex-triage
6
+                       find-doc print-doc pst source)]
7
+    [clojure.pprint :refer (pprint)]
8
+    [clojure.string :as str]))
9
+
10
+(comment
11
+  (pprint (str/trim "This line suppresses some clj-kondo warnings.")))
0 12
new file mode 100644
... ...
@@ -0,0 +1,27 @@
1
+module.exports = function (config) {
2
+  var junitOutputDir = process.env.CIRCLE_TEST_REPORTS || "target/junit"
3
+
4
+  config.set({
5
+    browsers: ['ChromeHeadless'],
6
+    basePath: 'target',
7
+    files: ['karma-test.js'],
8
+    frameworks: ['cljs-test'],
9
+    plugins: [
10
+        'karma-cljs-test',
11
+        'karma-chrome-launcher',
12
+        'karma-junit-reporter'
13
+    ],
14
+    colors: true,
15
+    logLevel: config.LOG_INFO,
16
+    client: {
17
+      args: ['shadow.test.karma.init']
18
+    },
19
+
20
+    // the default configuration
21
+    junitReporter: {
22
+      outputDir: junitOutputDir + '/karma', // results will be saved as outputDir/browserName.xml
23
+      outputFile: undefined, // if included, results will be saved as outputDir/browserName/outputFile
24
+      suite: '' // suite will become the package name attribute in xml testsuite element
25
+    }
26
+  })
27
+}
0 28
new file mode 100644
... ...
@@ -0,0 +1,997 @@
1
+{
2
+	"name": "jambda",
3
+	"requires": true,
4
+	"lockfileVersion": 1,
5
+	"dependencies": {
6
+		"asn1.js": {
7
+			"version": "5.4.1",
8
+			"resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz",
9
+			"integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==",
10
+			"dev": true,
11
+			"requires": {
12
+				"bn.js": "^4.0.0",
13
+				"inherits": "^2.0.1",
14
+				"minimalistic-assert": "^1.0.0",
15
+				"safer-buffer": "^2.1.0"
16
+			},
17
+			"dependencies": {
18
+				"bn.js": {
19
+					"version": "4.12.0",
20
+					"resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
21
+					"integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
22
+					"dev": true
23
+				}
24
+			}
25
+		},
26
+		"assert": {
27
+			"version": "1.5.0",
28
+			"resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz",
29
+			"integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==",
30
+			"dev": true,
31
+			"requires": {
32
+				"object-assign": "^4.1.1",
33
+				"util": "0.10.3"
34
+			},
35
+			"dependencies": {
36
+				"inherits": {
37
+					"version": "2.0.1",
38
+					"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
39
+					"integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
40
+					"dev": true
41
+				},
42
+				"util": {
43
+					"version": "0.10.3",
44
+					"resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
45
+					"integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
46
+					"dev": true,
47
+					"requires": {
48
+						"inherits": "2.0.1"
49
+					}
50
+				}
51
+			}
52
+		},
53
+		"base64-js": {
54
+			"version": "1.5.1",
55
+			"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
56
+			"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
57
+			"dev": true
58
+		},
59
+		"bn.js": {
60
+			"version": "5.2.0",
61
+			"resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz",
62
+			"integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==",
63
+			"dev": true
64
+		},
65
+		"brorand": {
66
+			"version": "1.1.0",
67
+			"resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
68
+			"integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
69
+			"dev": true
70
+		},
71
+		"browserify-aes": {
72
+			"version": "1.2.0",
73
+			"resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
74
+			"integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
75
+			"dev": true,
76
+			"requires": {
77
+				"buffer-xor": "^1.0.3",
78
+				"cipher-base": "^1.0.0",
79
+				"create-hash": "^1.1.0",
80
+				"evp_bytestokey": "^1.0.3",
81
+				"inherits": "^2.0.1",
82
+				"safe-buffer": "^5.0.1"
83
+			}
84
+		},
85
+		"browserify-cipher": {
86
+			"version": "1.0.1",
87
+			"resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
88
+			"integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
89
+			"dev": true,
90
+			"requires": {
91
+				"browserify-aes": "^1.0.4",
92
+				"browserify-des": "^1.0.0",
93
+				"evp_bytestokey": "^1.0.0"
94
+			}
95
+		},
96
+		"browserify-des": {
97
+			"version": "1.0.2",
98
+			"resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
99
+			"integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
100
+			"dev": true,
101
+			"requires": {
102
+				"cipher-base": "^1.0.1",
103
+				"des.js": "^1.0.0",
104
+				"inherits": "^2.0.1",
105
+				"safe-buffer": "^5.1.2"
106
+			}
107
+		},
108
+		"browserify-rsa": {
109
+			"version": "4.1.0",
110
+			"resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz",
111
+			"integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==",
112
+			"dev": true,
113
+			"requires": {
114
+				"bn.js": "^5.0.0",
115
+				"randombytes": "^2.0.1"
116
+			}
117
+		},
118
+		"browserify-sign": {
119
+			"version": "4.2.1",
120
+			"resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz",
121
+			"integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==",
122
+			"dev": true,
123
+			"requires": {
124
+				"bn.js": "^5.1.1",
125
+				"browserify-rsa": "^4.0.1",
126
+				"create-hash": "^1.2.0",
127
+				"create-hmac": "^1.1.7",
128
+				"elliptic": "^6.5.3",
129
+				"inherits": "^2.0.4",
130
+				"parse-asn1": "^5.1.5",
131
+				"readable-stream": "^3.6.0",
132
+				"safe-buffer": "^5.2.0"
133
+			},
134
+			"dependencies": {
135
+				"readable-stream": {
136
+					"version": "3.6.0",
137
+					"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
138
+					"integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
139
+					"dev": true,
140
+					"requires": {
141
+						"inherits": "^2.0.3",
142
+						"string_decoder": "^1.1.1",
143
+						"util-deprecate": "^1.0.1"
144
+					}
145
+				},
146
+				"safe-buffer": {
147
+					"version": "5.2.1",
148
+					"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
149
+					"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
150
+					"dev": true
151
+				}
152
+			}
153
+		},
154
+		"browserify-zlib": {
155
+			"version": "0.2.0",
156
+			"resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
157
+			"integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
158
+			"dev": true,
159
+			"requires": {
160
+				"pako": "~1.0.5"
161
+			}
162
+		},
163
+		"buffer": {
164
+			"version": "4.9.2",
165
+			"resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz",
166
+			"integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==",
167
+			"dev": true,
168
+			"requires": {
169
+				"base64-js": "^1.0.2",
170
+				"ieee754": "^1.1.4",
171
+				"isarray": "^1.0.0"
172
+			}
173
+		},
174
+		"buffer-from": {
175
+			"version": "1.1.2",
176
+			"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
177
+			"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
178
+			"dev": true
179
+		},
180
+		"buffer-xor": {
181
+			"version": "1.0.3",
182
+			"resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
183
+			"integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
184
+			"dev": true
185
+		},
186
+		"builtin-status-codes": {
187
+			"version": "3.0.0",
188
+			"resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
189
+			"integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
190
+			"dev": true
191
+		},
192
+		"cipher-base": {
193
+			"version": "1.0.4",
194
+			"resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
195
+			"integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
196
+			"dev": true,
197
+			"requires": {
198
+				"inherits": "^2.0.1",
199
+				"safe-buffer": "^5.0.1"
200
+			}
201
+		},
202
+		"concat-stream": {
203
+			"version": "1.6.2",
204
+			"resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
205
+			"integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
206
+			"dev": true,
207
+			"requires": {
208
+				"buffer-from": "^1.0.0",
209
+				"inherits": "^2.0.3",
210
+				"readable-stream": "^2.2.2",
211
+				"typedarray": "^0.0.6"
212
+			}
213
+		},
214
+		"console-browserify": {
215
+			"version": "1.2.0",
216
+			"resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
217
+			"integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==",
218
+			"dev": true
219
+		},
220
+		"constants-browserify": {
221
+			"version": "1.0.0",
222
+			"resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
223
+			"integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
224
+			"dev": true
225
+		},
226
+		"core-util-is": {
227
+			"version": "1.0.3",
228
+			"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
229
+			"integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
230
+			"dev": true
231
+		},
232
+		"create-ecdh": {
233
+			"version": "4.0.4",
234
+			"resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz",
235
+			"integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==",
236
+			"dev": true,
237
+			"requires": {
238
+				"bn.js": "^4.1.0",
239
+				"elliptic": "^6.5.3"
240
+			},
241
+			"dependencies": {
242
+				"bn.js": {
243
+					"version": "4.12.0",
244
+					"resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
245
+					"integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
246
+					"dev": true
247
+				}
248
+			}
249
+		},
250
+		"create-hash": {
251
+			"version": "1.2.0",
252
+			"resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
253
+			"integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
254
+			"dev": true,
255
+			"requires": {
256
+				"cipher-base": "^1.0.1",
257
+				"inherits": "^2.0.1",
258
+				"md5.js": "^1.3.4",
259
+				"ripemd160": "^2.0.1",
260
+				"sha.js": "^2.4.0"
261
+			}
262
+		},
263
+		"create-hmac": {
264
+			"version": "1.1.7",
265
+			"resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
266
+			"integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
267
+			"dev": true,
268
+			"requires": {
269
+				"cipher-base": "^1.0.3",
270
+				"create-hash": "^1.1.0",
271
+				"inherits": "^2.0.1",
272
+				"ripemd160": "^2.0.0",
273
+				"safe-buffer": "^5.0.1",
274
+				"sha.js": "^2.4.8"
275
+			}
276
+		},
277
+		"cross-spawn": {
278
+			"version": "5.1.0",
279
+			"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
280
+			"integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
281
+			"dev": true,
282
+			"requires": {
283
+				"lru-cache": "^4.0.1",
284
+				"shebang-command": "^1.2.0",
285
+				"which": "^1.2.9"
286
+			}
287
+		},
288
+		"crypto-browserify": {
289
+			"version": "3.12.0",
290
+			"resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
291
+			"integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
292
+			"dev": true,
293
+			"requires": {
294
+				"browserify-cipher": "^1.0.0",
295
+				"browserify-sign": "^4.0.0",
296
+				"create-ecdh": "^4.0.0",
297
+				"create-hash": "^1.1.0",
298
+				"create-hmac": "^1.1.0",
299
+				"diffie-hellman": "^5.0.0",
300
+				"inherits": "^2.0.1",
301
+				"pbkdf2": "^3.0.3",
302
+				"public-encrypt": "^4.0.0",
303
+				"randombytes": "^2.0.0",
304
+				"randomfill": "^1.0.3"
305
+			}
306
+		},
307
+		"des.js": {
308
+			"version": "1.0.1",
309
+			"resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz",
310
+			"integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==",
311
+			"dev": true,
312
+			"requires": {
313
+				"inherits": "^2.0.1",
314
+				"minimalistic-assert": "^1.0.0"
315
+			}
316
+		},
317
+		"diffie-hellman": {
318
+			"version": "5.0.3",
319
+			"resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
320
+			"integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
321
+			"dev": true,
322
+			"requires": {
323
+				"bn.js": "^4.1.0",
324
+				"miller-rabin": "^4.0.0",
325
+				"randombytes": "^2.0.0"
326
+			},
327
+			"dependencies": {
328
+				"bn.js": {
329
+					"version": "4.12.0",
330
+					"resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
331
+					"integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
332
+					"dev": true
333
+				}
334
+			}
335
+		},
336
+		"domain-browser": {
337
+			"version": "1.2.0",
338
+			"resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
339
+			"integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
340
+			"dev": true
341
+		},
342
+		"elliptic": {
343
+			"version": "6.5.4",
344
+			"resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
345
+			"integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
346
+			"dev": true,
347
+			"requires": {
348
+				"bn.js": "^4.11.9",
349
+				"brorand": "^1.1.0",
350
+				"hash.js": "^1.0.0",
351
+				"hmac-drbg": "^1.0.1",
352
+				"inherits": "^2.0.4",
353
+				"minimalistic-assert": "^1.0.1",
354
+				"minimalistic-crypto-utils": "^1.0.1"
355
+			},
356
+			"dependencies": {
357
+				"bn.js": {
358
+					"version": "4.12.0",
359
+					"resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
360
+					"integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
361
+					"dev": true
362
+				}
363
+			}
364
+		},
365
+		"events": {
366
+			"version": "3.3.0",
367
+			"resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
368
+			"integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
369
+			"dev": true
370
+		},
371
+		"evp_bytestokey": {
372
+			"version": "1.0.3",
373
+			"resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
374
+			"integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
375
+			"dev": true,
376
+			"requires": {
377
+				"md5.js": "^1.3.4",
378
+				"safe-buffer": "^5.1.1"
379
+			}
380
+		},
381
+		"hash-base": {
382
+			"version": "3.1.0",
383
+			"resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
384
+			"integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
385
+			"dev": true,
386
+			"requires": {
387
+				"inherits": "^2.0.4",
388
+				"readable-stream": "^3.6.0",
389
+				"safe-buffer": "^5.2.0"
390
+			},
391
+			"dependencies": {
392
+				"readable-stream": {
393
+					"version": "3.6.0",
394
+					"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
395
+					"integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
396
+					"dev": true,
397
+					"requires": {
398
+						"inherits": "^2.0.3",
399
+						"string_decoder": "^1.1.1",
400
+						"util-deprecate": "^1.0.1"
401
+					}
402
+				},
403
+				"safe-buffer": {
404
+					"version": "5.2.1",
405
+					"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
406
+					"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
407
+					"dev": true
408
+				}
409
+			}
410
+		},
411
+		"hash.js": {
412
+			"version": "1.1.7",
413
+			"resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
414
+			"integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
415
+			"dev": true,
416
+			"requires": {
417
+				"inherits": "^2.0.3",
418
+				"minimalistic-assert": "^1.0.1"
419
+			}
420
+		},
421
+		"highlight.js": {
422
+			"version": "11.1.0",
423
+			"resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.1.0.tgz",
424
+			"integrity": "sha512-X9VVhYKHQPPuwffO8jk4bP/FVj+ibNCy3HxZZNDXFtJrq4O5FdcdCDRIkDis5MiMnjh7UwEdHgRZJcHFYdzDdA=="
425
+		},
426
+		"hmac-drbg": {
427
+			"version": "1.0.1",
428
+			"resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
429
+			"integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
430
+			"dev": true,
431
+			"requires": {
432
+				"hash.js": "^1.0.3",
433
+				"minimalistic-assert": "^1.0.0",
434
+				"minimalistic-crypto-utils": "^1.0.1"
435
+			}
436
+		},
437
+		"https-browserify": {
438
+			"version": "1.0.0",
439
+			"resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
440
+			"integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
441
+			"dev": true
442
+		},
443
+		"ieee754": {
444
+			"version": "1.2.1",
445
+			"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
446
+			"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
447
+			"dev": true
448
+		},
449
+		"inherits": {
450
+			"version": "2.0.4",
451
+			"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
452
+			"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
453
+			"dev": true
454
+		},
455
+		"isarray": {
456
+			"version": "1.0.0",
457
+			"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
458
+			"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
459
+			"dev": true
460
+		},
461
+		"isexe": {
462
+			"version": "2.0.0",
463
+			"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
464
+			"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
465
+			"dev": true
466
+		},
467
+		"js-tokens": {
468
+			"version": "4.0.0",
469
+			"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
470
+			"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
471
+		},
472
+		"loose-envify": {
473
+			"version": "1.4.0",
474
+			"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
475
+			"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
476
+			"requires": {
477
+				"js-tokens": "^3.0.0 || ^4.0.0"
478
+			}
479
+		},
480
+		"lru-cache": {
481
+			"version": "4.1.5",
482
+			"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
483
+			"integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
484
+			"dev": true,
485
+			"requires": {
486
+				"pseudomap": "^1.0.2",
487
+				"yallist": "^2.1.2"
488
+			}
489
+		},
490
+		"md5.js": {
491
+			"version": "1.3.5",
492
+			"resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
493
+			"integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
494
+			"dev": true,
495
+			"requires": {
496
+				"hash-base": "^3.0.0",
497
+				"inherits": "^2.0.1",
498
+				"safe-buffer": "^5.1.2"
499
+			}
500
+		},
501
+		"miller-rabin": {
502
+			"version": "4.0.1",
503
+			"resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
504
+			"integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
505
+			"dev": true,
506
+			"requires": {
507
+				"bn.js": "^4.0.0",
508
+				"brorand": "^1.0.1"
509
+			},
510
+			"dependencies": {
511
+				"bn.js": {
512
+					"version": "4.12.0",
513
+					"resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
514
+					"integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
515
+					"dev": true
516
+				}
517
+			}
518
+		},
519
+		"minimalistic-assert": {
520
+			"version": "1.0.1",
521
+			"resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
522
+			"integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
523
+			"dev": true
524
+		},
525
+		"minimalistic-crypto-utils": {
526
+			"version": "1.0.1",
527
+			"resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
528
+			"integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=",
529
+			"dev": true
530
+		},
531
+		"node-libs-browser": {
532
+			"version": "2.2.1",
533
+			"resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz",
534
+			"integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==",
535
+			"dev": true,
536
+			"requires": {
537
+				"assert": "^1.1.1",
538
+				"browserify-zlib": "^0.2.0",
539
+				"buffer": "^4.3.0",
540
+				"console-browserify": "^1.1.0",
541
+				"constants-browserify": "^1.0.0",
542
+				"crypto-browserify": "^3.11.0",
543
+				"domain-browser": "^1.1.1",
544
+				"events": "^3.0.0",
545
+				"https-browserify": "^1.0.0",
546
+				"os-browserify": "^0.3.0",
547
+				"path-browserify": "0.0.1",
548
+				"process": "^0.11.10",
549
+				"punycode": "^1.2.4",
550
+				"querystring-es3": "^0.2.0",
551
+				"readable-stream": "^2.3.3",
552
+				"stream-browserify": "^2.0.1",
553
+				"stream-http": "^2.7.2",
554
+				"string_decoder": "^1.0.0",
555
+				"timers-browserify": "^2.0.4",
556
+				"tty-browserify": "0.0.0",
557
+				"url": "^0.11.0",
558
+				"util": "^0.11.0",
559
+				"vm-browserify": "^1.0.1"
560
+			}
561
+		},
562
+		"object-assign": {
563
+			"version": "4.1.1",
564
+			"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
565
+			"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
566
+		},
567
+		"os-browserify": {
568
+			"version": "0.3.0",
569
+			"resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
570
+			"integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
571
+			"dev": true
572
+		},
573
+		"os-shim": {
574
+			"version": "0.1.3",
575
+			"resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz",
576
+			"integrity": "sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc=",
577
+			"dev": true
578
+		},
579
+		"pako": {
580
+			"version": "1.0.11",
581
+			"resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
582
+			"integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
583
+			"dev": true
584
+		},
585
+		"parse-asn1": {
586
+			"version": "5.1.6",
587
+			"resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz",
588
+			"integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==",
589
+			"dev": true,
590
+			"requires": {
591
+				"asn1.js": "^5.2.0",
592
+				"browserify-aes": "^1.0.0",
593
+				"evp_bytestokey": "^1.0.0",
594
+				"pbkdf2": "^3.0.3",
595
+				"safe-buffer": "^5.1.1"
596
+			}
597
+		},
598
+		"path-browserify": {
599
+			"version": "0.0.1",
600
+			"resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
601
+			"integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==",
602
+			"dev": true
603
+		},
604
+		"pbkdf2": {
605
+			"version": "3.1.2",
606
+			"resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz",
607
+			"integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==",
608
+			"dev": true,
609
+			"requires": {
610
+				"create-hash": "^1.1.2",
611
+				"create-hmac": "^1.1.4",
612
+				"ripemd160": "^2.0.1",
613
+				"safe-buffer": "^5.0.1",
614
+				"sha.js": "^2.4.8"
615
+			}
616
+		},
617
+		"pre-commit": {
618
+			"version": "1.2.2",
619
+			"resolved": "https://registry.npmjs.org/pre-commit/-/pre-commit-1.2.2.tgz",
620
+			"integrity": "sha1-287g7p3nI15X95xW186UZBpp7sY=",
621
+			"dev": true,
622
+			"requires": {
623
+				"cross-spawn": "^5.0.1",
624
+				"spawn-sync": "^1.0.15",
625
+				"which": "1.2.x"
626
+			}
627
+		},
628
+		"process": {
629
+			"version": "0.11.10",
630
+			"resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
631
+			"integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
632
+			"dev": true
633
+		},
634
+		"process-nextick-args": {
635
+			"version": "2.0.1",
636
+			"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
637
+			"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
638
+			"dev": true
639
+		},
640
+		"pseudomap": {
641
+			"version": "1.0.2",
642
+			"resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
643
+			"integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
644
+			"dev": true
645
+		},
646
+		"public-encrypt": {
647
+			"version": "4.0.3",
648
+			"resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
649
+			"integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
650
+			"dev": true,
651
+			"requires": {
652
+				"bn.js": "^4.1.0",
653
+				"browserify-rsa": "^4.0.0",
654
+				"create-hash": "^1.1.0",
655
+				"parse-asn1": "^5.0.0",
656
+				"randombytes": "^2.0.1",
657
+				"safe-buffer": "^5.1.2"
658
+			},
659
+			"dependencies": {
660
+				"bn.js": {
661
+					"version": "4.12.0",
662
+					"resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
663
+					"integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
664
+					"dev": true
665
+				}
666
+			}
667
+		},
668
+		"punycode": {
669
+			"version": "1.4.1",
670
+			"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
671
+			"integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
672
+			"dev": true
673
+		},
674
+		"querystring": {
675
+			"version": "0.2.0",
676
+			"resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
677
+			"integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
678
+			"dev": true
679
+		},
680
+		"querystring-es3": {
681
+			"version": "0.2.1",
682
+			"resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
683
+			"integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
684
+			"dev": true
685
+		},
686
+		"randombytes": {
687
+			"version": "2.1.0",
688
+			"resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
689
+			"integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
690
+			"dev": true,
691
+			"requires": {
692
+				"safe-buffer": "^5.1.0"
693
+			}
694
+		},
695
+		"randomfill": {
696
+			"version": "1.0.4",
697
+			"resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
698
+			"integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
699
+			"dev": true,
700
+			"requires": {
701
+				"randombytes": "^2.0.5",
702
+				"safe-buffer": "^5.1.0"
703
+			}
704
+		},
705
+		"react": {
706
+			"version": "17.0.2",
707
+			"resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz",
708
+			"integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==",
709
+			"requires": {
710
+				"loose-envify": "^1.1.0",
711
+				"object-assign": "^4.1.1"
712
+			}
713
+		},
714
+		"react-dom": {
715
+			"version": "17.0.2",
716
+			"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz",
717
+			"integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==",
718
+			"requires": {
719
+				"loose-envify": "^1.1.0",
720
+				"object-assign": "^4.1.1",
721
+				"scheduler": "^0.20.2"
722
+			}
723
+		},
724
+		"readable-stream": {
725
+			"version": "2.3.7",
726
+			"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
727
+			"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
728
+			"dev": true,
729
+			"requires": {
730
+				"core-util-is": "~1.0.0",
731
+				"inherits": "~2.0.3",
732
+				"isarray": "~1.0.0",
733
+				"process-nextick-args": "~2.0.0",
734
+				"safe-buffer": "~5.1.1",
735
+				"string_decoder": "~1.1.1",
736
+				"util-deprecate": "~1.0.1"
737
+			}
738
+		},
739
+		"readline-sync": {
740
+			"version": "1.4.10",
741
+			"resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz",
742
+			"integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==",
743
+			"dev": true
744
+		},
745
+		"ripemd160": {
746
+			"version": "2.0.2",
747
+			"resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
748
+			"integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
749
+			"dev": true,
750
+			"requires": {
751
+				"hash-base": "^3.0.0",
752
+				"inherits": "^2.0.1"
753
+			}
754
+		},
755
+		"safe-buffer": {
756
+			"version": "5.1.2",
757
+			"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
758
+			"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
759
+			"dev": true
760
+		},
761
+		"safer-buffer": {
762
+			"version": "2.1.2",
763
+			"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
764
+			"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
765
+			"dev": true
766
+		},
767
+		"scheduler": {
768
+			"version": "0.20.2",
769
+			"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz",
770
+			"integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==",
771
+			"requires": {
772
+				"loose-envify": "^1.1.0",
773
+				"object-assign": "^4.1.1"
774
+			}
775
+		},
776
+		"setimmediate": {
777
+			"version": "1.0.5",
778
+			"resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
779
+			"integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=",
780
+			"dev": true
781
+		},
782
+		"sha.js": {
783
+			"version": "2.4.11",
784
+			"resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
785
+			"integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
786
+			"dev": true,
787
+			"requires": {
788
+				"inherits": "^2.0.1",
789
+				"safe-buffer": "^5.0.1"
790
+			}
791
+		},
792
+		"shadow-cljs": {
793
+			"version": "2.16.12",
794
+			"resolved": "https://registry.npmjs.org/shadow-cljs/-/shadow-cljs-2.16.12.tgz",
795
+			"integrity": "sha512-6JqOhN5X3n0IkxA/gSUcZ1lImwcW1LmpgzlaBDOC/u/pIysdNm0tiOxpOTEnExl9nKZBS/EYS7bXIIInywPJUA==",
796
+			"dev": true,
797
+			"requires": {
798
+				"node-libs-browser": "^2.2.1",
799
+				"readline-sync": "^1.4.7",
800
+				"shadow-cljs-jar": "1.3.2",
801
+				"source-map-support": "^0.4.15",
802
+				"which": "^1.3.1",
803
+				"ws": "^7.4.6"
804
+			},
805
+			"dependencies": {
806
+				"which": {
807
+					"version": "1.3.1",
808
+					"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
809
+					"integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
810
+					"dev": true,
811
+					"requires": {
812
+						"isexe": "^2.0.0"
813
+					}
814
+				}
815
+			}
816
+		},
817
+		"shadow-cljs-jar": {
818
+			"version": "1.3.2",
819
+			"resolved": "https://registry.npmjs.org/shadow-cljs-jar/-/shadow-cljs-jar-1.3.2.tgz",
820
+			"integrity": "sha512-XmeffAZHv8z7451kzeq9oKh8fh278Ak+UIOGGrapyqrFBB773xN8vMQ3O7J7TYLnb9BUwcqadKkmgaq7q6fhZg==",
821
+			"dev": true
822
+		},
823
+		"shebang-command": {
824
+			"version": "1.2.0",
825
+			"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
826
+			"integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
827
+			"dev": true,
828
+			"requires": {
829
+				"shebang-regex": "^1.0.0"
830
+			}
831
+		},
832
+		"shebang-regex": {
833
+			"version": "1.0.0",
834
+			"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
835
+			"integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
836
+			"dev": true
837
+		},
838
+		"source-map": {
839
+			"version": "0.5.7",
840
+			"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
841
+			"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
842
+			"dev": true
843
+		},
844
+		"source-map-support": {
845
+			"version": "0.4.18",
846
+			"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
847
+			"integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
848
+			"dev": true,
849
+			"requires": {
850
+				"source-map": "^0.5.6"
851
+			}
852
+		},
853
+		"spawn-sync": {
854
+			"version": "1.0.15",
855
+			"resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz",
856
+			"integrity": "sha1-sAeZVX63+wyDdsKdROih6mfldHY=",
857
+			"dev": true,
858
+			"requires": {
859
+				"concat-stream": "^1.4.7",
860
+				"os-shim": "^0.1.2"
861
+			}
862
+		},
863
+		"stream-browserify": {
864
+			"version": "2.0.2",
865
+			"resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz",
866
+			"integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
867
+			"dev": true,
868
+			"requires": {
869
+				"inherits": "~2.0.1",
870
+				"readable-stream": "^2.0.2"
871
+			}
872
+		},
873
+		"stream-http": {
874
+			"version": "2.8.3",
875
+			"resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz",
876
+			"integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==",
877
+			"dev": true,
878
+			"requires": {
879
+				"builtin-status-codes": "^3.0.0",
880
+				"inherits": "^2.0.1",
881
+				"readable-stream": "^2.3.6",
882
+				"to-arraybuffer": "^1.0.0",
883
+				"xtend": "^4.0.0"
884
+			}
885
+		},
886
+		"string_decoder": {
887
+			"version": "1.1.1",
888
+			"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
889
+			"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
890
+			"dev": true,
891
+			"requires": {
892
+				"safe-buffer": "~5.1.0"
893
+			}
894
+		},
895
+		"timers-browserify": {
896
+			"version": "2.0.12",
897
+			"resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz",
898
+			"integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==",
899
+			"dev": true,
900
+			"requires": {
901
+				"setimmediate": "^1.0.4"
902
+			}
903
+		},
904
+		"to-arraybuffer": {
905
+			"version": "1.0.1",
906
+			"resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
907
+			"integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
908
+			"dev": true
909
+		},
910
+		"tty-browserify": {
911
+			"version": "0.0.0",
912
+			"resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
913
+			"integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
914
+			"dev": true
915
+		},
916
+		"typedarray": {
917
+			"version": "0.0.6",
918
+			"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
919
+			"integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
920
+			"dev": true
921
+		},
922
+		"url": {
923
+			"version": "0.11.0",
924
+			"resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
925
+			"integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
926
+			"dev": true,
927
+			"requires": {
928
+				"punycode": "1.3.2",
929
+				"querystring": "0.2.0"
930
+			},
931
+			"dependencies": {
932
+				"punycode": {
933
+					"version": "1.3.2",
934
+					"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
935
+					"integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
936
+					"dev": true
937
+				}
938
+			}
939
+		},
940
+		"util": {
941
+			"version": "0.11.1",
942
+			"resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz",
943
+			"integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==",
944
+			"dev": true,
945
+			"requires": {
946
+				"inherits": "2.0.3"
947
+			},
948
+			"dependencies": {
949
+				"inherits": {
950
+					"version": "2.0.3",
951
+					"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
952
+					"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
953
+					"dev": true
954
+				}
955
+			}
956
+		},
957
+		"util-deprecate": {
958
+			"version": "1.0.2",
959
+			"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
960
+			"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
961
+			"dev": true
962
+		},
963
+		"vm-browserify": {
964
+			"version": "1.1.2",
965
+			"resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
966
+			"integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==",
967
+			"dev": true
968
+		},
969
+		"which": {
970
+			"version": "1.2.14",
971
+			"resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz",
972
+			"integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=",
973
+			"dev": true,
974
+			"requires": {
975
+				"isexe": "^2.0.0"
976
+			}
977
+		},
978
+		"ws": {
979
+			"version": "7.5.7",
980
+			"resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz",
981
+			"integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==",
982
+			"dev": true
983
+		},
984
+		"xtend": {
985
+			"version": "4.0.2",
986
+			"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
987
+			"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
988
+			"dev": true
989
+		},
990
+		"yallist": {
991
+			"version": "2.1.2",
992
+			"resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
993
+			"integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
994
+			"dev": true
995
+		}
996
+	}
997
+}
0 998
new file mode 100644
... ...
@@ -0,0 +1,25 @@
1
+{
2
+	"name": "jambda",
3
+	"scripts": {
4
+		"ancient": "clojure -Sdeps '{:deps {com.github.liquidz/antq {:mvn/version \"RELEASE\"}}}' -m antq.core",
5
+		"watch": "npx shadow-cljs watch app browser-test karma-test",
6
+        "build": "npx shadow-cljs compile app",
7
+		"release": "npx shadow-cljs release app",
8
+		"build-report": "npx shadow-cljs run shadow.cljs.build-report app target/build-report.html",
9
+		"lint": "clj-kondo --lint src",
10
+		"test": "npx shadow-cljs test"
11
+	},
12
+	"pre-commit": [
13
+		"lint",
14
+		"build"
15
+	],
16
+	"dependencies": {
17
+		"highlight.js": "11.1.0",
18
+		"react": "17.0.2",
19
+		"react-dom": "17.0.2"
20
+	},
21
+	"devDependencies": {
22
+		"shadow-cljs": "2.16.12",
23
+		"pre-commit": "1.2.2"
24
+	}
25
+}
0 26
new file mode 100644
... ...
@@ -0,0 +1,15 @@
1
+<!DOCTYPE html>
2
+<html lang="en">
3
+  <head>
4
+    <meta charset='utf-8'>
5
+    <meta name="viewport" content="width=device-width,initial-scale=1">
6
+    <title>jambda</title>
7
+  </head>
8
+  <body>
9
+    <noscript>
10
+      jambda is a JavaScript app. Please enable JavaScript to continue.
11
+    </noscript>
12
+    <div id="app"></div>
13
+    <script src="/js/compiled/app.js"></script>
14
+  </body>
15
+</html>
0 16
new file mode 100644
... ...
@@ -0,0 +1,43 @@
1
+{:nrepl {:port 8777}
2
+
3
+ 
4
+
5
+ :source-paths ["src" "test"]
6
+
7
+ :dependencies
8
+ [[reagent "1.1.0"]
9
+  [re-frame "1.2.0"]
10
+  [day8.re-frame/tracing "0.6.2"]
11
+
12
+  [binaryage/devtools "1.0.4"]
13
+  [day8.re-frame/re-frame-10x "1.2.2"]
14
+  [day8/shadow-git-inject "0.0.5"]]
15
+
16
+ :build-defaults
17
+ {:build-hooks [(shadow-git-inject.core/hook)]}
18
+
19
+ :dev-http
20
+ {8280 "resources/public"
21
+  8290 "target/browser-test"}
22
+
23
+ :builds
24
+ {:app
25
+  {:target     :browser
26
+   :output-dir "resources/public/js/compiled"
27
+   :asset-path "/js/compiled"
28
+   :modules
29
+   {:app {:init-fn jambda.core/init}}
30
+   :compiler-options
31
+   {:closure-defines
32
+    { jambda.config/version :shadow-git-inject/version}}
33
+   :devtools
34
+   {:preloads [day8.re-frame-10x.preload]}
35
+   :dev
36
+   {:compiler-options
37
+    {:closure-defines
38
+     { re-frame.trace.trace-enabled? true
39
+      day8.re-frame.tracing.trace-enabled? true}}}
40
+   :release
41
+   {:build-options
42
+    {:ns-aliases
43
+     {day8.re-frame.tracing day8.re-frame.tracing-stubs}}}}}}
0 44
new file mode 100644
... ...
@@ -0,0 +1,11 @@
1
+{ pkgs ? import <nixpkgs> {} }:
2
+
3
+pkgs.mkShell {
4
+  buildInputs = with pkgs; [
5
+    clojure
6
+    clj-kondo
7
+    leiningen
8
+    jdk16
9
+    nodejs
10
+  ];
11
+}
0 12
new file mode 100644
... ...
@@ -0,0 +1,6 @@
1
+(ns jambda.config)
2
+
3
+(def debug?
4
+  ^boolean goog.DEBUG)
5
+
6
+(goog-define ^js/String version "unknown")
0 7
new file mode 100644
... ...
@@ -0,0 +1,24 @@
1
+(ns jambda.core
2
+  (:require
3
+   [reagent.dom :as rdom]
4
+   [re-frame.core :as re-frame]
5
+   [jambda.events :as events]
6
+   [jambda.views :as views]
7
+   [jambda.config :as config]
8
+   ))
9
+
10
+
11
+(defn dev-setup []
12
+  (when config/debug?
13
+    (println "dev mode")))
14
+
15
+(defn ^:dev/after-load mount-root []
16
+  (re-frame/clear-subscription-cache!)
17
+  (let [root-el (.getElementById js/document "app")]
18
+    (rdom/unmount-component-at-node root-el)
19
+    (rdom/render [views/main-panel] root-el)))
20
+
21
+(defn init []
22
+  (re-frame/dispatch-sync [::events/initialize-db])
23
+  (dev-setup)
24
+  (mount-root))
0 25
new file mode 100644
... ...
@@ -0,0 +1,4 @@
1
+(ns jambda.db)
2
+
3
+(def default-db
4
+  {:name "re-frame"})
0 5
new file mode 100644
... ...
@@ -0,0 +1,11 @@
1
+(ns jambda.events
2
+  (:require
3
+   [re-frame.core :as re-frame]
4
+   [jambda.db :as db]
5
+   [day8.re-frame.tracing :refer-macros [fn-traced]]
6
+   ))
7
+
8
+(re-frame/reg-event-db
9
+ ::initialize-db
10
+ (fn-traced [_ _]
11
+   db/default-db))
0 12
new file mode 100644
... ...
@@ -0,0 +1,8 @@
1
+(ns jambda.subs
2
+  (:require
3
+   [re-frame.core :as re-frame]))
4
+
5
+(re-frame/reg-sub
6
+ ::name
7
+ (fn [db]
8
+   (:name db)))
0 9
new file mode 100644
... ...
@@ -0,0 +1,13 @@
1
+(ns jambda.views
2
+  (:require
3
+   [re-frame.core :as re-frame]
4
+   [jambda.subs :as subs]
5
+   [jambda.config :as config]
6
+   ))
7
+
8
+(defn main-panel []
9
+  (let [name (re-frame/subscribe [::subs/name])]
10
+    [:div
11
+     [:h1
12
+      "Hello from " @name". Version " config/version]
13
+     ]))