├── .github ├── FUNDING.yml └── workflows │ ├── continuous-deployment-workflow.yml │ └── continuous-integration-workflow.yml ├── .gitignore ├── CHANGELOG.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── highlight.css ├── karma.conf.js ├── package-lock.json ├── package.json ├── project.clj ├── src ├── day8 │ └── re_frame │ │ └── http_fx.cljs └── deps.cljs └── test └── day8 └── re_frame └── http_fx_test.cljs /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: mike-thompson-day8 2 | -------------------------------------------------------------------------------- /.github/workflows/continuous-deployment-workflow.yml: -------------------------------------------------------------------------------- 1 | name: cd 2 | on: 3 | push: 4 | tags: 5 | - "v[0-9]+.[0-9]+.[0-9]+*" 6 | 7 | jobs: 8 | test: 9 | name: Test 10 | runs-on: ubuntu-20.04 11 | container: 12 | image: ghcr.io/day8/dockerfile-for-dev-ci-image/chrome-56:2 13 | credentials: 14 | username: ${{ github.actor }} 15 | password: ${{ secrets.GLOBAL_TOKEN_FOR_GITHUB }} 16 | steps: 17 | - uses: actions/checkout@v2 18 | - name: Maven cache 19 | uses: actions/cache@v2 20 | with: 21 | path: /root/.m2/repository 22 | key: ${{ runner.os }}-maven-${{ hashFiles('project.clj', '.github/workflows/**') }} 23 | restore-keys: | 24 | ${{ runner.os }}-maven- 25 | - name: npm cache 26 | uses: actions/cache@v2 27 | with: 28 | path: ~/.npm 29 | key: ${{ runner.os }}-npm-${{ hashFiles('project.clj') }}-${{ hashFiles('**/deps.cljs') }} 30 | restore-keys: | 31 | ${{ runner.os }}-npm- 32 | - name: shadow-cljs compiler cache 33 | uses: actions/cache@v2 34 | with: 35 | path: .shadow-cljs 36 | key: ${{ runner.os }}-shadow-cljs-${{ github.sha }} 37 | restore-keys: | 38 | ${{ runner.os }}-shadow-cljs- 39 | - run: | 40 | lein ci 41 | - name: Slack notification 42 | uses: homoluctus/slatify@v2.0.1 43 | if: failure() || cancelled() 44 | with: 45 | type: ${{ job.status }} 46 | job_name: re-frame-http-fx Tests 47 | channel: '#oss-robots' 48 | url: ${{ secrets.SLACK_WEBHOOK }} 49 | commit: true 50 | token: ${{ secrets.GITHUB_TOKEN }} 51 | release: 52 | name: Release 53 | needs: test 54 | runs-on: ubuntu-20.04 55 | container: 56 | image: ghcr.io/day8/dockerfile-for-dev-ci-image/chrome-56:2 57 | credentials: 58 | username: ${{ github.actor }} 59 | password: ${{ secrets.GLOBAL_TOKEN_FOR_GITHUB }} 60 | steps: 61 | - uses: actions/checkout@v2 62 | with: 63 | # All of the Git history is required for day8/lein-git-inject to determine the version string. 64 | fetch-depth: 0 65 | - name: Maven cache 66 | uses: actions/cache@v2 67 | with: 68 | path: /root/.m2/repository 69 | key: ${{ runner.os }}-maven-${{ hashFiles('project.clj', '.github/workflows/**') }} 70 | restore-keys: | 71 | ${{ runner.os }}-maven- 72 | - name: Run lein release 73 | env: 74 | CLOJARS_USERNAME: ${{ secrets.CLOJARS_USERNAME }} 75 | CLOJARS_TOKEN: ${{ secrets.CLOJARS_TOKEN }} 76 | GITHUB_USERNAME: ${{ github.actor }} 77 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 78 | run: | 79 | lein release 80 | # This creates a 'GitHub Release' from the tag and includes link to the CHANGELOG 81 | # We do not use draft or prerelease features as 82 | # we always want the latest release to show in the right hand column of the project 83 | # page regardless of if it is a stable release. 84 | - name: Create GitHub Release 85 | uses: actions/create-release@v1 86 | env: 87 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 88 | with: 89 | tag_name: ${{ github.ref }} 90 | release_name: ${{ github.ref }} 91 | body: | 92 | [Changelog](https://github.com/day8/re-frame-http-fx/blob/master/CHANGELOG.md) 93 | draft: false 94 | prerelease: false 95 | - name: Slack notification 96 | uses: homoluctus/slatify@v2.0.1 97 | if: always() 98 | with: 99 | type: ${{ job.status }} 100 | job_name: re-frame-http-fx Deployment 101 | channel: '#oss-robots' 102 | url: ${{ secrets.SLACK_WEBHOOK }} 103 | commit: true 104 | token: ${{ secrets.GITHUB_TOKEN }} 105 | -------------------------------------------------------------------------------- /.github/workflows/continuous-integration-workflow.yml: -------------------------------------------------------------------------------- 1 | name: ci 2 | on: [push] 3 | 4 | jobs: 5 | test: 6 | name: Test 7 | runs-on: ubuntu-20.04 8 | container: 9 | image: ghcr.io/day8/dockerfile-for-dev-ci-image/chrome-56:2 10 | credentials: 11 | username: ${{ github.actor }} 12 | password: ${{ secrets.GLOBAL_TOKEN_FOR_GITHUB }} 13 | steps: 14 | - uses: actions/checkout@v2 15 | - name: Maven cache 16 | uses: actions/cache@v2 17 | with: 18 | path: /root/.m2/repository 19 | key: ${{ runner.os }}-maven-${{ hashFiles('project.clj', '.github/workflows/**') }} 20 | restore-keys: | 21 | ${{ runner.os }}-maven- 22 | - name: npm cache 23 | uses: actions/cache@v2 24 | with: 25 | path: ~/.npm 26 | key: ${{ runner.os }}-npm-${{ hashFiles('project.clj') }}-${{ hashFiles('**/deps.cljs') }} 27 | restore-keys: | 28 | ${{ runner.os }}-npm- 29 | - name: shadow-cljs compiler cache 30 | uses: actions/cache@v2 31 | with: 32 | path: .shadow-cljs 33 | key: ${{ runner.os }}-shadow-cljs-${{ github.sha }} 34 | restore-keys: | 35 | ${{ runner.os }}-shadow-cljs- 36 | - run: | 37 | lein ci 38 | - name: Slack notification 39 | uses: homoluctus/slatify@v2.0.1 40 | if: failure() || cancelled() 41 | with: 42 | type: ${{ job.status }} 43 | job_name: re-frame-http-fx Tests 44 | channel: '#oss-robots' 45 | url: ${{ secrets.SLACK_WEBHOOK }} 46 | commit: true 47 | token: ${{ secrets.GITHUB_TOKEN }} 48 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | *.iml 3 | *.log 4 | .nrepl-port 5 | pom.xml 6 | pom.xml.asc 7 | *.jar 8 | .lein-deps-sum 9 | .lein-repl-history 10 | .lein-plugins/ 11 | .lein-failures 12 | core/ 13 | out/ 14 | target/ 15 | run/compiled/ 16 | misc/ 17 | .floo 18 | .flooignore 19 | node_modules/ 20 | .shadow-cljs 21 | shadow-cljs.edn 22 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## Unreleased 2 | 3 | - Fix link in docs, from (https://github.com/day8/re-frame/tree/develop/docs) to (https://github.com/day8/re-frame/blob/master/docs/Effects.md) 4 | - **Upgrade cljs-ajax to 0.8.4**. Upstream project's CHANGELOG is missing this version, appears to be [these changes](https://github.com/JulianBirch/cljs-ajax/compare/af16a67982320af360c90a0dd48228d4eaf1f3ab...91540cf7e3922826bec210cd8f8d4e89f110789e) since 0.8.1. 5 | 6 | 7 | ## v0.2.3 (2021-03-03) 8 | 9 | #### Changed 10 | 11 | - **Upgrade cljs-ajax to 0.8.1**. Upstream project's CHANGELOG is missing this version, appears to be [these changes](https://github.com/JulianBirch/cljs-ajax/compare/0c2633694332bfed34847e922bd206ca0090957b...af16a67982320af360c90a0dd48228d4eaf1f3ab) since 0.8.0. 12 | - Upgrade Clojure to 1.10.2 13 | - Upgrade shadow-cljs to 2.10.18 14 | - Upgrade re-frame to 1.2.0 15 | 16 | ## v0.2.2 (2020-12-21) 17 | 18 | #### Changed 19 | 20 | - Don't require cljs-ajax API wholesale. See [#29](https://github.com/day8/re-frame-http-fx/pull/29). Thanks to [@nathell](https://github.com/nathell). 21 | - Upgrade ClojureScript to 1.10.773 22 | - Upgrade lein-git-inject to 0.0.14 23 | - Upgrade shadow-cljs to 2.10.17 24 | - Upgrade binaryage/devtools to 1.0.2 25 | - Upgrade re-frame to 1.0.0 26 | 27 | ## v0.2.0 (2019-11-04) 28 | 29 | Only a minor release mostly just to test releases with GitHub Actions. Do be 30 | wary of the cljs-ajax version bump due to [breaking changes](https://github.com/JulianBirch/cljs-ajax/blob/master/CHANGES.md#version-08). 31 | 32 | #### Fixed 33 | 34 | * Fix infer-externs compiler warning. 35 | See [#38](https://github.com/day8/re-frame-http-fx/issues/38). 36 | 37 | #### Changed 38 | 39 | * Migrate to shadow-cljs 40 | * Upgrade Clojure to 1.10.1 41 | * Upgrade ClojureScript to 1.10.520 42 | * Bump cljs-ajax to 0.8.0 43 | 44 | ## v0.1.4 (2017-06-30) 45 | 46 | * Move the http-effect into an accessible function. 47 | * Small docs improvements 48 | 49 | ## v0.1.3 (2016-12-07) 50 | 51 | * Add missing bracket in handler example 52 | 53 | ## v0.1.2 (2016-10-14) 54 | 55 | * Add examples for making POST requests 56 | * Comment out spec until it has a stable release 57 | 58 | ## v0.1.1 (2016-10-11) 59 | 60 | * Bump CLJS dependency to 1.9.229 to support the newer spec definition of `coll-of`. [#5](https://github.com/day8/re-frame-http-fx/issues/5) 61 | 62 | ## v0.1.0 (2016-10-10) 63 | 64 | * Added a spec to enforce that people provide a response format that is not a keyword. [#2](https://github.com/day8/re-frame-http-fx/issues/2) 65 | 66 | ##v0.0.5 (2016.08.22) 67 | 68 | Bump to release ver of re-frame 0.8.0 69 | 70 | ##v0.0.1 & v0.0.4 (2016.07.XX) 71 | 72 | Initial code drop based on re-frame 0.8.0-alpha9 73 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to re-frame-http-fx 2 | 3 | Thank you for taking the time to contribute! 4 | 5 | ## Support questions 6 | 7 | The Github issues are for bug reports and feature requests only. Support requests and usage 8 | questions should go to the re-frame [Clojure Slack channel](http://clojurians.net) or 9 | the [ClojureScript mailing list](https://groups.google.com/forum/#!forum/clojurescript). 10 | 11 | 12 | ## Pull requests 13 | 14 | Create pull requests to the master branch. 15 | 16 | ## Running tests 17 | 18 | #### Via Browser/HTML 19 | 20 | To auto compile the tests via shadow-cljs just: 21 | ```sh 22 | lein watch 23 | ``` 24 | but you'll need to manually open `test/test.html` in a browser. And you'll also need to 25 | manually reload this page after each auto compile. 26 | 27 | #### Via Karma 28 | 29 | To run the tests, you must have recent versions of node, npm, Leiningen, and a C++ compiler toolchain installed. 30 | If you're on Linux or Mac OS X then you will be fine, if you're on Windows then you need to install 31 | Visual Studio Community Edition, and the C++ compiler dependencies. 32 | 33 | ```sh 34 | lein ci # to build and run re-frame-http-fx tests 35 | # or 36 | lein watch 37 | karma start # to run the tests with an auto watcher 38 | ``` 39 | 40 | ## Pull requests for bugs 41 | 42 | If possible provide: 43 | 44 | * Code that fixes the bug 45 | * Failing tests which pass with the new changes 46 | * Improvements to documentation to make it less likely that others will run into issues (if relevant). 47 | * Add the change to the Unreleased section of [CHANGES.md](CHANGES.md) 48 | 49 | ## Pull requests for features 50 | 51 | If possible provide: 52 | 53 | * Code that implements the new feature 54 | * Tests to cover the new feature including all of the code paths 55 | * Docstrings for functions 56 | * Documentation examples 57 | * Add the change to the Unreleased section of [CHANGES.md](CHANGES.md) 58 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016-2021 Michael Thompson 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 6 | [![Clojars Project](https://img.shields.io/clojars/v/day8.re-frame/http-fx?style=for-the-badge&logo=clojure&logoColor=fff)](https://clojars.org/day8.re-frame/http-fx) 7 | [![GitHub issues](https://img.shields.io/github/issues-raw/day8/re-frame-http-fx?style=for-the-badge&logo=github)](https://github.com/day8/re-frame-http-fx/issues) 8 | [![License](https://img.shields.io/github/license/day8/re-frame-http-fx?style=for-the-badge)](LICENSE) 9 | 10 | ## HTTP Effects Handler For re-frame 11 | 12 | This re-frame library contains an HTTP [Effect Handler](https://github.com/day8/re-frame/blob/master/docs/Effects.md). 13 | 14 | Keyed `:http-xhrio`, it wraps the goog xhrio API of [cljs-ajax](https://github.com/JulianBirch/cljs-ajax). 15 | 16 | > **IMPORTANT**: This effect handler depends entirely on the API of [cljs-ajax](https://github.com/JulianBirch/cljs-ajax). Make sure you are familiar with the API for cljs-ajax, and especially with [`ajax-request`](https://github.com/JulianBirch/cljs-ajax#ajax-request) before proceeding. 17 | 18 | ## Quick Start Guide 19 | 20 | ### Step 1. Add Dependency 21 | 22 | Add the following project dependency:
23 | [![clojars](https://img.shields.io/clojars/v/day8.re-frame/http-fx?style=for-the-badge&logo=clojure&logoColor=fff)](https://clojars.org/day8.re-frame/http-fx) 24 | 25 | Requires re-frame >= 0.8.0 26 | 27 | ### Step 2. Registration And Use 28 | 29 | In the namespace where you register your event handlers, perhaps called `events.cljs`, you have 2 things to do. 30 | 31 | **First**, add this "require" to the `ns`: 32 | ```clj 33 | (ns app.core 34 | (:require 35 | ... 36 | [day8.re-frame.http-fx] ;; <-- add this 37 | ...)) 38 | ``` 39 | 40 | Because we never subsequently use this `require`, it 41 | appears redundant. But its existence will cause the `:http-xhrio` effect 42 | handler to self-register with re-frame, which is important 43 | to everything that follows. 44 | 45 | **Second**, write a an event handler which uses this effect: 46 | ```clj 47 | (ns app.events ;; or where ever you define your event handlers 48 | (:require 49 | ... 50 | [ajax.core :as ajax] ;; so you can use this in the response-format below 51 | ...)) 52 | 53 | (reg-event-fx ;; note the trailing -fx 54 | :handler-with-http ;; usage: (dispatch [:handler-with-http]) 55 | (fn [{:keys [db]} _] ;; the first param will be "world" 56 | {:db (assoc db :show-twirly true) ;; causes the twirly-waiting-dialog to show?? 57 | :http-xhrio {:method :get 58 | :uri "https://api.github.com/orgs/day8" 59 | :timeout 8000 ;; optional see API docs 60 | :response-format (ajax/json-response-format {:keywords? true}) ;; IMPORTANT!: You must provide this. 61 | :on-success [:good-http-result] 62 | :on-failure [:bad-http-result]}})) 63 | ``` 64 | 65 | Look at the `:http-xhrio` line above. This library defines the "effects handler" 66 | which implements `:http-xhrio`. 67 | 68 | The supplied value should be an options map as defined by the simple interface `ajax-request` [see: api docs](https://github.com/JulianBirch/cljs-ajax#ajax-request). Except for `:on-success` and `:on-failure`. All options supported by `ajax-request` 69 | should be supported by this library, as it is a thin wrapper over `ajax-request`. 70 | 71 | Here is an example of a POST request. Note that `:format` also needs to be specified (unless you pass `:body` in the 72 | map). 73 | 74 | ```cljs 75 | (re-frame/reg-event-fx 76 | ::http-post 77 | (fn [_world [_ val]] 78 | {:http-xhrio {:method :post 79 | :uri "https://httpbin.org/post" 80 | :params data 81 | :timeout 5000 82 | :format (ajax/json-request-format) 83 | :response-format (ajax/json-response-format {:keywords? true}) 84 | :on-success [::success-post-result] 85 | :on-failure [::failure-post-result]}})) 86 | ``` 87 | 88 | **N.B.**: `ajax-request` is harder to use than the `GET` and `POST` functions 89 | cljs-ajax provides, but this gives you smaller code sizes from dead code elimination. 90 | **In particular, you MUST provide a `:response-format`, it is not inferred for you.** 91 | 92 | Don't provide: 93 | 94 | :api - the effects handler explicitly uses xhrio so it will be ignored. 95 | :handler - we substitute this with one that dispatches `:on-success` or `:on-failure` events. 96 | 97 | You can also pass a list or vector of these options maps where multiple HTTPs are required. 98 | 99 | To make **multiple requests**, supply a vector of options maps: 100 | ``` 101 | {:http-xhrio [ {...} 102 | {...}]} 103 | ``` 104 | 105 | ### Step 3a. Handling `:on-success` 106 | 107 | Provide normal re-frame handlers for `:on-success` and `:on-failure`. Your event 108 | handlers will get the result as the last argument of their event vector. Here is an 109 | example written as another effect handler to put the result into db. 110 | 111 | ```clojure 112 | (reg-event-db 113 | ::success-http-result 114 | (fn [db [_ result]] 115 | (assoc db :success-http-result result))) 116 | ``` 117 | 118 | 119 | ### Step 3b. Handling `:on-failure` 120 | 121 | The `result` supplied to your `:on-failure` handler will be a map containing various xhrio details (details below). 122 | See the fn [ajax-xhrio-handler](/src/day8/re_frame/http_fx.cljs#L23) for details 123 | 124 | #### Step 3.1 :on-failure result 125 | 126 | A simple failure handler could be written this way ... 127 | 128 | ```clojure 129 | (reg-event-db 130 | ::failure-http-result 131 | (fn [db [_ result]] 132 | ;; result is a map containing details of the failure 133 | (assoc db :failure-http-result result))) 134 | ``` 135 | 136 | ##### status of 40x/50x 137 | 138 | If the network connection to the server is successful, but the server returns an 139 | error (40x/50x) HTTP status code `result` will be a map like: 140 | 141 | ```clojure 142 | {:uri "/error" 143 | :last-method "GET" 144 | :last-error "Service Unavailable [503]" 145 | :last-error-code 6 146 | :debug-message "Http response at 400 or 500 level" 147 | :status 503 148 | :status-text "Service Unavailable" 149 | :failure :error 150 | :response nil} 151 | ``` 152 | 153 | ##### Status 0 154 | 155 | In some cases, if the network connection itself is unsuccessful, it is possible 156 | to get a status code of `0`. For example: 157 | 158 | - cross-site scripting whereby access is denied; or 159 | - requesting a URI that is unreachable (typo, DNS issues, invalid hostname etc); or 160 | - request is interrupted after being sent (browser refresh or navigates away from the page); or 161 | - request is otherwise intercepted (check your ad blocker). 162 | 163 | In this case, `result` will be something like: 164 | 165 | ```clojure 166 | {:uri "http://i-do-not-exist/error" 167 | :last-method "GET" 168 | :last-error " [0]" 169 | :last-error-code 6 170 | :debug-message "Http response at 400 or 500 level" 171 | :status 0 172 | :status-text "Request failed." 173 | :failure :failed} 174 | ``` 175 | 176 | ##### Status -1 177 | 178 | If the time for the sever to respond exceeds `:timeout` `result` will be a map something 179 | like: 180 | 181 | ```clojure 182 | {:uri "/timeout" 183 | :last-method "GET" 184 | :last-error "Timed out after 1ms, aborting" 185 | :last-error-code 8 186 | :debug-message "Request timed out" 187 | :status -1 188 | :status-text "Request timed out." 189 | :failure :timeout} 190 | ``` 191 | 192 | ### Optional: Handler for :on-request 193 | 194 | If you need access to the raw request, to for example, cancel long running requests or repeated debounced requests, 195 | you can pass an `:on-request` handler that will be called with the request. 196 | 197 | ```clojure 198 | (re-frame/reg-event-fx 199 | ::http-post 200 | (fn [_world [_ val]] 201 | {:http-xhrio {:method :get 202 | :uri "https://httpbin.org/delay/60" 203 | :format (ajax/json-request-format) 204 | :response-format (ajax/json-response-format {:keywords? true}) 205 | :on-request [::track-slow-request "my-request"] 206 | :on-success [::success-get-result] 207 | :on-failure [::failure-get-result]}})) 208 | 209 | (reg-event-db 210 | ::track-slow-request 211 | (fn [db [_ my-id xhrio]] 212 | (assoc-in db [:requests my-id] xhrio))) 213 | ``` 214 | 215 | Later if you need to, you could retrieve the request from the app-db and cancel it. 216 | 217 | **N.B.**: To prevent memory leaks you need to cleanup the request in both your `:on-success` and `:on-failure` handlers. 218 | Otherwise the requests will just hang around in your app-db indefinitely. 219 | 220 | 221 | ### Tip 222 | 223 | If you need additional arguments or identifying tokens in your handler, then 224 | include them in your `:on-success` and `:on-failure` event vector in Step 3. 225 | 226 | For example ... 227 | 228 | ```cljs 229 | (re-frame/reg-event-fx 230 | ::http-post 231 | (fn [_ [_ val]] 232 | {:http-xhrio {:method :post 233 | ... 234 | :on-success [::success-post-result 42 "other"] 235 | :on-failure [::failure-post-result :something :else]}})) 236 | ``` 237 | 238 | Notice the way that additional values are encoded into the success and failure event vectors. 239 | 240 | These event vectors will be dispatched (`result` is `conj`-ed to the end) making all encoded values AND the `result` available to the handlers. 241 | -------------------------------------------------------------------------------- /highlight.css: -------------------------------------------------------------------------------- 1 | /* Style definition file generated by highlight 3.33, http://www.andre-simon.de/ */ 2 | /* highlight theme: Kwrite Editor */ 3 | body.hl { background-color:#e0eaee; } 4 | pre.hl { color:#000000; background-color:#e0eaee; font-size:10pt; font-family:'Courier New',monospace;} 5 | .hl.num { color:#b07e00; } 6 | .hl.esc { color:#ff00ff; } 7 | .hl.str { color:#bf0303; } 8 | .hl.pps { color:#818100; } 9 | .hl.slc { color:#838183; font-style:italic; } 10 | .hl.com { color:#838183; font-style:italic; } 11 | .hl.ppc { color:#008200; } 12 | .hl.opt { color:#000000; } 13 | .hl.ipl { color:#0057ae; } 14 | .hl.lin { color:#555555; } 15 | .hl.kwa { color:#000000; font-weight:bold; } 16 | .hl.kwb { color:#0057ae; } 17 | .hl.kwc { color:#000000; font-weight:bold; } 18 | .hl.kwd { color:#010181; } 19 | 20 | -------------------------------------------------------------------------------- /karma.conf.js: -------------------------------------------------------------------------------- 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 | singleRun: true 19 | }, 20 | 21 | // the default configuration 22 | junitReporter: { 23 | outputDir: junitOutputDir + '/karma', // results will be saved as outputDir/browserName.xml 24 | outputFile: undefined, // if included, results will be saved as outputDir/browserName/outputFile 25 | suite: '' // suite will become the package name attribute in xml testsuite element 26 | } 27 | }) 28 | } 29 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "day8.re-frame.http-fx", 3 | "requires": true, 4 | "lockfileVersion": 1, 5 | "dependencies": { 6 | "accepts": { 7 | "version": "1.3.7", 8 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 9 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 10 | "dev": true, 11 | "requires": { 12 | "mime-types": "~2.1.24", 13 | "negotiator": "0.6.2" 14 | } 15 | }, 16 | "after": { 17 | "version": "0.8.2", 18 | "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", 19 | "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", 20 | "dev": true 21 | }, 22 | "ansi-regex": { 23 | "version": "5.0.0", 24 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 25 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", 26 | "dev": true 27 | }, 28 | "ansi-styles": { 29 | "version": "4.3.0", 30 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 31 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 32 | "dev": true, 33 | "requires": { 34 | "color-convert": "^2.0.1" 35 | } 36 | }, 37 | "anymatch": { 38 | "version": "3.1.1", 39 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", 40 | "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", 41 | "dev": true, 42 | "requires": { 43 | "normalize-path": "^3.0.0", 44 | "picomatch": "^2.0.4" 45 | } 46 | }, 47 | "arraybuffer.slice": { 48 | "version": "0.0.7", 49 | "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", 50 | "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", 51 | "dev": true 52 | }, 53 | "asn1.js": { 54 | "version": "5.4.1", 55 | "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", 56 | "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", 57 | "dev": true, 58 | "requires": { 59 | "bn.js": "^4.0.0", 60 | "inherits": "^2.0.1", 61 | "minimalistic-assert": "^1.0.0", 62 | "safer-buffer": "^2.1.0" 63 | }, 64 | "dependencies": { 65 | "bn.js": { 66 | "version": "4.12.0", 67 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 68 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", 69 | "dev": true 70 | } 71 | } 72 | }, 73 | "assert": { 74 | "version": "1.5.0", 75 | "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", 76 | "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", 77 | "dev": true, 78 | "requires": { 79 | "object-assign": "^4.1.1", 80 | "util": "0.10.3" 81 | }, 82 | "dependencies": { 83 | "inherits": { 84 | "version": "2.0.1", 85 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", 86 | "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", 87 | "dev": true 88 | }, 89 | "util": { 90 | "version": "0.10.3", 91 | "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", 92 | "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", 93 | "dev": true, 94 | "requires": { 95 | "inherits": "2.0.1" 96 | } 97 | } 98 | } 99 | }, 100 | "async-limiter": { 101 | "version": "1.0.1", 102 | "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", 103 | "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", 104 | "dev": true 105 | }, 106 | "backo2": { 107 | "version": "1.0.2", 108 | "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", 109 | "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", 110 | "dev": true 111 | }, 112 | "balanced-match": { 113 | "version": "1.0.0", 114 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 115 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 116 | "dev": true 117 | }, 118 | "base64-arraybuffer": { 119 | "version": "0.1.4", 120 | "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", 121 | "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", 122 | "dev": true 123 | }, 124 | "base64-js": { 125 | "version": "1.5.1", 126 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 127 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 128 | "dev": true 129 | }, 130 | "base64id": { 131 | "version": "2.0.0", 132 | "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", 133 | "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", 134 | "dev": true 135 | }, 136 | "binary-extensions": { 137 | "version": "2.2.0", 138 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 139 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 140 | "dev": true 141 | }, 142 | "blob": { 143 | "version": "0.0.5", 144 | "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", 145 | "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", 146 | "dev": true 147 | }, 148 | "bn.js": { 149 | "version": "5.2.0", 150 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", 151 | "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", 152 | "dev": true 153 | }, 154 | "body-parser": { 155 | "version": "1.19.0", 156 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 157 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", 158 | "dev": true, 159 | "requires": { 160 | "bytes": "3.1.0", 161 | "content-type": "~1.0.4", 162 | "debug": "2.6.9", 163 | "depd": "~1.1.2", 164 | "http-errors": "1.7.2", 165 | "iconv-lite": "0.4.24", 166 | "on-finished": "~2.3.0", 167 | "qs": "6.7.0", 168 | "raw-body": "2.4.0", 169 | "type-is": "~1.6.17" 170 | } 171 | }, 172 | "brace-expansion": { 173 | "version": "1.1.11", 174 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 175 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 176 | "dev": true, 177 | "requires": { 178 | "balanced-match": "^1.0.0", 179 | "concat-map": "0.0.1" 180 | } 181 | }, 182 | "braces": { 183 | "version": "3.0.2", 184 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 185 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 186 | "dev": true, 187 | "requires": { 188 | "fill-range": "^7.0.1" 189 | } 190 | }, 191 | "brorand": { 192 | "version": "1.1.0", 193 | "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", 194 | "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", 195 | "dev": true 196 | }, 197 | "browserify-aes": { 198 | "version": "1.2.0", 199 | "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", 200 | "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", 201 | "dev": true, 202 | "requires": { 203 | "buffer-xor": "^1.0.3", 204 | "cipher-base": "^1.0.0", 205 | "create-hash": "^1.1.0", 206 | "evp_bytestokey": "^1.0.3", 207 | "inherits": "^2.0.1", 208 | "safe-buffer": "^5.0.1" 209 | } 210 | }, 211 | "browserify-cipher": { 212 | "version": "1.0.1", 213 | "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", 214 | "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", 215 | "dev": true, 216 | "requires": { 217 | "browserify-aes": "^1.0.4", 218 | "browserify-des": "^1.0.0", 219 | "evp_bytestokey": "^1.0.0" 220 | } 221 | }, 222 | "browserify-des": { 223 | "version": "1.0.2", 224 | "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", 225 | "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", 226 | "dev": true, 227 | "requires": { 228 | "cipher-base": "^1.0.1", 229 | "des.js": "^1.0.0", 230 | "inherits": "^2.0.1", 231 | "safe-buffer": "^5.1.2" 232 | } 233 | }, 234 | "browserify-rsa": { 235 | "version": "4.1.0", 236 | "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", 237 | "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", 238 | "dev": true, 239 | "requires": { 240 | "bn.js": "^5.0.0", 241 | "randombytes": "^2.0.1" 242 | } 243 | }, 244 | "browserify-sign": { 245 | "version": "4.2.1", 246 | "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", 247 | "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", 248 | "dev": true, 249 | "requires": { 250 | "bn.js": "^5.1.1", 251 | "browserify-rsa": "^4.0.1", 252 | "create-hash": "^1.2.0", 253 | "create-hmac": "^1.1.7", 254 | "elliptic": "^6.5.3", 255 | "inherits": "^2.0.4", 256 | "parse-asn1": "^5.1.5", 257 | "readable-stream": "^3.6.0", 258 | "safe-buffer": "^5.2.0" 259 | }, 260 | "dependencies": { 261 | "inherits": { 262 | "version": "2.0.4", 263 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 264 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 265 | "dev": true 266 | }, 267 | "readable-stream": { 268 | "version": "3.6.0", 269 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 270 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 271 | "dev": true, 272 | "requires": { 273 | "inherits": "^2.0.3", 274 | "string_decoder": "^1.1.1", 275 | "util-deprecate": "^1.0.1" 276 | } 277 | } 278 | } 279 | }, 280 | "browserify-zlib": { 281 | "version": "0.2.0", 282 | "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", 283 | "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", 284 | "dev": true, 285 | "requires": { 286 | "pako": "~1.0.5" 287 | } 288 | }, 289 | "buffer": { 290 | "version": "4.9.2", 291 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", 292 | "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", 293 | "dev": true, 294 | "requires": { 295 | "base64-js": "^1.0.2", 296 | "ieee754": "^1.1.4", 297 | "isarray": "^1.0.0" 298 | }, 299 | "dependencies": { 300 | "isarray": { 301 | "version": "1.0.0", 302 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 303 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 304 | "dev": true 305 | } 306 | } 307 | }, 308 | "buffer-xor": { 309 | "version": "1.0.3", 310 | "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", 311 | "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", 312 | "dev": true 313 | }, 314 | "builtin-status-codes": { 315 | "version": "3.0.0", 316 | "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", 317 | "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", 318 | "dev": true 319 | }, 320 | "bytes": { 321 | "version": "3.1.0", 322 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 323 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", 324 | "dev": true 325 | }, 326 | "camelcase": { 327 | "version": "5.3.1", 328 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 329 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 330 | "dev": true 331 | }, 332 | "chokidar": { 333 | "version": "3.5.1", 334 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", 335 | "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", 336 | "dev": true, 337 | "requires": { 338 | "anymatch": "~3.1.1", 339 | "braces": "~3.0.2", 340 | "fsevents": "~2.3.1", 341 | "glob-parent": "~5.1.0", 342 | "is-binary-path": "~2.1.0", 343 | "is-glob": "~4.0.1", 344 | "normalize-path": "~3.0.0", 345 | "readdirp": "~3.5.0" 346 | } 347 | }, 348 | "cipher-base": { 349 | "version": "1.0.4", 350 | "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", 351 | "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", 352 | "dev": true, 353 | "requires": { 354 | "inherits": "^2.0.1", 355 | "safe-buffer": "^5.0.1" 356 | } 357 | }, 358 | "cliui": { 359 | "version": "6.0.0", 360 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", 361 | "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", 362 | "dev": true, 363 | "requires": { 364 | "string-width": "^4.2.0", 365 | "strip-ansi": "^6.0.0", 366 | "wrap-ansi": "^6.2.0" 367 | } 368 | }, 369 | "color-convert": { 370 | "version": "2.0.1", 371 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 372 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 373 | "dev": true, 374 | "requires": { 375 | "color-name": "~1.1.4" 376 | } 377 | }, 378 | "color-name": { 379 | "version": "1.1.4", 380 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 381 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 382 | "dev": true 383 | }, 384 | "colors": { 385 | "version": "1.4.0", 386 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", 387 | "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", 388 | "dev": true 389 | }, 390 | "component-bind": { 391 | "version": "1.0.0", 392 | "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", 393 | "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", 394 | "dev": true 395 | }, 396 | "component-emitter": { 397 | "version": "1.3.0", 398 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", 399 | "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", 400 | "dev": true 401 | }, 402 | "component-inherit": { 403 | "version": "0.0.3", 404 | "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", 405 | "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", 406 | "dev": true 407 | }, 408 | "concat-map": { 409 | "version": "0.0.1", 410 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 411 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 412 | "dev": true 413 | }, 414 | "connect": { 415 | "version": "3.7.0", 416 | "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", 417 | "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", 418 | "dev": true, 419 | "requires": { 420 | "debug": "2.6.9", 421 | "finalhandler": "1.1.2", 422 | "parseurl": "~1.3.3", 423 | "utils-merge": "1.0.1" 424 | } 425 | }, 426 | "console-browserify": { 427 | "version": "1.2.0", 428 | "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", 429 | "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", 430 | "dev": true 431 | }, 432 | "constants-browserify": { 433 | "version": "1.0.0", 434 | "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", 435 | "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", 436 | "dev": true 437 | }, 438 | "content-type": { 439 | "version": "1.0.4", 440 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 441 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", 442 | "dev": true 443 | }, 444 | "cookie": { 445 | "version": "0.4.1", 446 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", 447 | "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", 448 | "dev": true 449 | }, 450 | "core-util-is": { 451 | "version": "1.0.2", 452 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 453 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 454 | "dev": true 455 | }, 456 | "create-ecdh": { 457 | "version": "4.0.4", 458 | "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", 459 | "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", 460 | "dev": true, 461 | "requires": { 462 | "bn.js": "^4.1.0", 463 | "elliptic": "^6.5.3" 464 | }, 465 | "dependencies": { 466 | "bn.js": { 467 | "version": "4.12.0", 468 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 469 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", 470 | "dev": true 471 | } 472 | } 473 | }, 474 | "create-hash": { 475 | "version": "1.2.0", 476 | "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", 477 | "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", 478 | "dev": true, 479 | "requires": { 480 | "cipher-base": "^1.0.1", 481 | "inherits": "^2.0.1", 482 | "md5.js": "^1.3.4", 483 | "ripemd160": "^2.0.1", 484 | "sha.js": "^2.4.0" 485 | } 486 | }, 487 | "create-hmac": { 488 | "version": "1.1.7", 489 | "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", 490 | "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", 491 | "dev": true, 492 | "requires": { 493 | "cipher-base": "^1.0.3", 494 | "create-hash": "^1.1.0", 495 | "inherits": "^2.0.1", 496 | "ripemd160": "^2.0.0", 497 | "safe-buffer": "^5.0.1", 498 | "sha.js": "^2.4.8" 499 | } 500 | }, 501 | "crypto-browserify": { 502 | "version": "3.12.0", 503 | "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", 504 | "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", 505 | "dev": true, 506 | "requires": { 507 | "browserify-cipher": "^1.0.0", 508 | "browserify-sign": "^4.0.0", 509 | "create-ecdh": "^4.0.0", 510 | "create-hash": "^1.1.0", 511 | "create-hmac": "^1.1.0", 512 | "diffie-hellman": "^5.0.0", 513 | "inherits": "^2.0.1", 514 | "pbkdf2": "^3.0.3", 515 | "public-encrypt": "^4.0.0", 516 | "randombytes": "^2.0.0", 517 | "randomfill": "^1.0.3" 518 | } 519 | }, 520 | "custom-event": { 521 | "version": "1.0.1", 522 | "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", 523 | "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", 524 | "dev": true 525 | }, 526 | "date-format": { 527 | "version": "3.0.0", 528 | "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", 529 | "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==", 530 | "dev": true 531 | }, 532 | "debug": { 533 | "version": "2.6.9", 534 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 535 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 536 | "dev": true, 537 | "requires": { 538 | "ms": "2.0.0" 539 | } 540 | }, 541 | "decamelize": { 542 | "version": "1.2.0", 543 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 544 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 545 | "dev": true 546 | }, 547 | "depd": { 548 | "version": "1.1.2", 549 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 550 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", 551 | "dev": true 552 | }, 553 | "des.js": { 554 | "version": "1.0.1", 555 | "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", 556 | "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", 557 | "dev": true, 558 | "requires": { 559 | "inherits": "^2.0.1", 560 | "minimalistic-assert": "^1.0.0" 561 | } 562 | }, 563 | "di": { 564 | "version": "0.0.1", 565 | "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", 566 | "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", 567 | "dev": true 568 | }, 569 | "diffie-hellman": { 570 | "version": "5.0.3", 571 | "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", 572 | "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", 573 | "dev": true, 574 | "requires": { 575 | "bn.js": "^4.1.0", 576 | "miller-rabin": "^4.0.0", 577 | "randombytes": "^2.0.0" 578 | }, 579 | "dependencies": { 580 | "bn.js": { 581 | "version": "4.12.0", 582 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 583 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", 584 | "dev": true 585 | } 586 | } 587 | }, 588 | "dom-serialize": { 589 | "version": "2.2.1", 590 | "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", 591 | "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", 592 | "dev": true, 593 | "requires": { 594 | "custom-event": "~1.0.0", 595 | "ent": "~2.2.0", 596 | "extend": "^3.0.0", 597 | "void-elements": "^2.0.0" 598 | } 599 | }, 600 | "domain-browser": { 601 | "version": "1.2.0", 602 | "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", 603 | "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", 604 | "dev": true 605 | }, 606 | "ee-first": { 607 | "version": "1.1.1", 608 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 609 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", 610 | "dev": true 611 | }, 612 | "elliptic": { 613 | "version": "6.5.4", 614 | "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", 615 | "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", 616 | "dev": true, 617 | "requires": { 618 | "bn.js": "^4.11.9", 619 | "brorand": "^1.1.0", 620 | "hash.js": "^1.0.0", 621 | "hmac-drbg": "^1.0.1", 622 | "inherits": "^2.0.4", 623 | "minimalistic-assert": "^1.0.1", 624 | "minimalistic-crypto-utils": "^1.0.1" 625 | }, 626 | "dependencies": { 627 | "bn.js": { 628 | "version": "4.12.0", 629 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 630 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", 631 | "dev": true 632 | }, 633 | "inherits": { 634 | "version": "2.0.4", 635 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 636 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 637 | "dev": true 638 | } 639 | } 640 | }, 641 | "emoji-regex": { 642 | "version": "8.0.0", 643 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 644 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 645 | "dev": true 646 | }, 647 | "encodeurl": { 648 | "version": "1.0.2", 649 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 650 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", 651 | "dev": true 652 | }, 653 | "engine.io": { 654 | "version": "3.5.0", 655 | "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.5.0.tgz", 656 | "integrity": "sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA==", 657 | "dev": true, 658 | "requires": { 659 | "accepts": "~1.3.4", 660 | "base64id": "2.0.0", 661 | "cookie": "~0.4.1", 662 | "debug": "~4.1.0", 663 | "engine.io-parser": "~2.2.0", 664 | "ws": "~7.4.2" 665 | }, 666 | "dependencies": { 667 | "debug": { 668 | "version": "4.1.1", 669 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 670 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 671 | "dev": true, 672 | "requires": { 673 | "ms": "^2.1.1" 674 | } 675 | }, 676 | "ms": { 677 | "version": "2.1.3", 678 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 679 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 680 | "dev": true 681 | } 682 | } 683 | }, 684 | "engine.io-client": { 685 | "version": "3.5.1", 686 | "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.1.tgz", 687 | "integrity": "sha512-oVu9kBkGbcggulyVF0kz6BV3ganqUeqXvD79WOFKa+11oK692w1NyFkuEj4xrkFRpZhn92QOqTk4RQq5LiBXbQ==", 688 | "dev": true, 689 | "requires": { 690 | "component-emitter": "~1.3.0", 691 | "component-inherit": "0.0.3", 692 | "debug": "~3.1.0", 693 | "engine.io-parser": "~2.2.0", 694 | "has-cors": "1.1.0", 695 | "indexof": "0.0.1", 696 | "parseqs": "0.0.6", 697 | "parseuri": "0.0.6", 698 | "ws": "~7.4.2", 699 | "xmlhttprequest-ssl": "~1.5.4", 700 | "yeast": "0.1.2" 701 | }, 702 | "dependencies": { 703 | "debug": { 704 | "version": "3.1.0", 705 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 706 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 707 | "dev": true, 708 | "requires": { 709 | "ms": "2.0.0" 710 | } 711 | } 712 | } 713 | }, 714 | "engine.io-parser": { 715 | "version": "2.2.1", 716 | "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz", 717 | "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", 718 | "dev": true, 719 | "requires": { 720 | "after": "0.8.2", 721 | "arraybuffer.slice": "~0.0.7", 722 | "base64-arraybuffer": "0.1.4", 723 | "blob": "0.0.5", 724 | "has-binary2": "~1.0.2" 725 | } 726 | }, 727 | "ent": { 728 | "version": "2.2.0", 729 | "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", 730 | "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", 731 | "dev": true 732 | }, 733 | "escape-html": { 734 | "version": "1.0.3", 735 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 736 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", 737 | "dev": true 738 | }, 739 | "eventemitter3": { 740 | "version": "4.0.7", 741 | "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", 742 | "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", 743 | "dev": true 744 | }, 745 | "events": { 746 | "version": "3.3.0", 747 | "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", 748 | "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", 749 | "dev": true 750 | }, 751 | "evp_bytestokey": { 752 | "version": "1.0.3", 753 | "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", 754 | "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", 755 | "dev": true, 756 | "requires": { 757 | "md5.js": "^1.3.4", 758 | "safe-buffer": "^5.1.1" 759 | } 760 | }, 761 | "extend": { 762 | "version": "3.0.2", 763 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 764 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", 765 | "dev": true 766 | }, 767 | "fill-range": { 768 | "version": "7.0.1", 769 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 770 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 771 | "dev": true, 772 | "requires": { 773 | "to-regex-range": "^5.0.1" 774 | } 775 | }, 776 | "finalhandler": { 777 | "version": "1.1.2", 778 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 779 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 780 | "dev": true, 781 | "requires": { 782 | "debug": "2.6.9", 783 | "encodeurl": "~1.0.2", 784 | "escape-html": "~1.0.3", 785 | "on-finished": "~2.3.0", 786 | "parseurl": "~1.3.3", 787 | "statuses": "~1.5.0", 788 | "unpipe": "~1.0.0" 789 | } 790 | }, 791 | "find-up": { 792 | "version": "4.1.0", 793 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 794 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 795 | "dev": true, 796 | "requires": { 797 | "locate-path": "^5.0.0", 798 | "path-exists": "^4.0.0" 799 | } 800 | }, 801 | "flatted": { 802 | "version": "2.0.2", 803 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", 804 | "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", 805 | "dev": true 806 | }, 807 | "follow-redirects": { 808 | "version": "1.13.3", 809 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz", 810 | "integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==", 811 | "dev": true 812 | }, 813 | "fs-extra": { 814 | "version": "8.1.0", 815 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", 816 | "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", 817 | "dev": true, 818 | "requires": { 819 | "graceful-fs": "^4.2.0", 820 | "jsonfile": "^4.0.0", 821 | "universalify": "^0.1.0" 822 | } 823 | }, 824 | "fs.realpath": { 825 | "version": "1.0.0", 826 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 827 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 828 | "dev": true 829 | }, 830 | "fsevents": { 831 | "version": "2.3.2", 832 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 833 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 834 | "dev": true, 835 | "optional": true 836 | }, 837 | "get-caller-file": { 838 | "version": "2.0.5", 839 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 840 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 841 | "dev": true 842 | }, 843 | "glob": { 844 | "version": "7.1.6", 845 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 846 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 847 | "dev": true, 848 | "requires": { 849 | "fs.realpath": "^1.0.0", 850 | "inflight": "^1.0.4", 851 | "inherits": "2", 852 | "minimatch": "^3.0.4", 853 | "once": "^1.3.0", 854 | "path-is-absolute": "^1.0.0" 855 | } 856 | }, 857 | "glob-parent": { 858 | "version": "5.1.1", 859 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", 860 | "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", 861 | "dev": true, 862 | "requires": { 863 | "is-glob": "^4.0.1" 864 | } 865 | }, 866 | "graceful-fs": { 867 | "version": "4.2.6", 868 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", 869 | "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", 870 | "dev": true 871 | }, 872 | "has-binary2": { 873 | "version": "1.0.3", 874 | "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", 875 | "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", 876 | "dev": true, 877 | "requires": { 878 | "isarray": "2.0.1" 879 | } 880 | }, 881 | "has-cors": { 882 | "version": "1.1.0", 883 | "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", 884 | "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", 885 | "dev": true 886 | }, 887 | "hash-base": { 888 | "version": "3.1.0", 889 | "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", 890 | "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", 891 | "dev": true, 892 | "requires": { 893 | "inherits": "^2.0.4", 894 | "readable-stream": "^3.6.0", 895 | "safe-buffer": "^5.2.0" 896 | }, 897 | "dependencies": { 898 | "inherits": { 899 | "version": "2.0.4", 900 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 901 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 902 | "dev": true 903 | }, 904 | "readable-stream": { 905 | "version": "3.6.0", 906 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 907 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 908 | "dev": true, 909 | "requires": { 910 | "inherits": "^2.0.3", 911 | "string_decoder": "^1.1.1", 912 | "util-deprecate": "^1.0.1" 913 | } 914 | } 915 | } 916 | }, 917 | "hash.js": { 918 | "version": "1.1.7", 919 | "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", 920 | "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", 921 | "dev": true, 922 | "requires": { 923 | "inherits": "^2.0.3", 924 | "minimalistic-assert": "^1.0.1" 925 | } 926 | }, 927 | "hmac-drbg": { 928 | "version": "1.0.1", 929 | "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", 930 | "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", 931 | "dev": true, 932 | "requires": { 933 | "hash.js": "^1.0.3", 934 | "minimalistic-assert": "^1.0.0", 935 | "minimalistic-crypto-utils": "^1.0.1" 936 | } 937 | }, 938 | "http-errors": { 939 | "version": "1.7.2", 940 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 941 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 942 | "dev": true, 943 | "requires": { 944 | "depd": "~1.1.2", 945 | "inherits": "2.0.3", 946 | "setprototypeof": "1.1.1", 947 | "statuses": ">= 1.5.0 < 2", 948 | "toidentifier": "1.0.0" 949 | } 950 | }, 951 | "http-proxy": { 952 | "version": "1.18.1", 953 | "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", 954 | "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", 955 | "dev": true, 956 | "requires": { 957 | "eventemitter3": "^4.0.0", 958 | "follow-redirects": "^1.0.0", 959 | "requires-port": "^1.0.0" 960 | } 961 | }, 962 | "https-browserify": { 963 | "version": "1.0.0", 964 | "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", 965 | "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", 966 | "dev": true 967 | }, 968 | "iconv-lite": { 969 | "version": "0.4.24", 970 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 971 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 972 | "dev": true, 973 | "requires": { 974 | "safer-buffer": ">= 2.1.2 < 3" 975 | } 976 | }, 977 | "ieee754": { 978 | "version": "1.2.1", 979 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 980 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 981 | "dev": true 982 | }, 983 | "indexof": { 984 | "version": "0.0.1", 985 | "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", 986 | "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", 987 | "dev": true 988 | }, 989 | "inflight": { 990 | "version": "1.0.6", 991 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 992 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 993 | "dev": true, 994 | "requires": { 995 | "once": "^1.3.0", 996 | "wrappy": "1" 997 | } 998 | }, 999 | "inherits": { 1000 | "version": "2.0.3", 1001 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1002 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 1003 | "dev": true 1004 | }, 1005 | "is-binary-path": { 1006 | "version": "2.1.0", 1007 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1008 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1009 | "dev": true, 1010 | "requires": { 1011 | "binary-extensions": "^2.0.0" 1012 | } 1013 | }, 1014 | "is-extglob": { 1015 | "version": "2.1.1", 1016 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1017 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 1018 | "dev": true 1019 | }, 1020 | "is-fullwidth-code-point": { 1021 | "version": "3.0.0", 1022 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1023 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1024 | "dev": true 1025 | }, 1026 | "is-glob": { 1027 | "version": "4.0.1", 1028 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 1029 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 1030 | "dev": true, 1031 | "requires": { 1032 | "is-extglob": "^2.1.1" 1033 | } 1034 | }, 1035 | "is-number": { 1036 | "version": "7.0.0", 1037 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1038 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1039 | "dev": true 1040 | }, 1041 | "isarray": { 1042 | "version": "2.0.1", 1043 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", 1044 | "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", 1045 | "dev": true 1046 | }, 1047 | "isbinaryfile": { 1048 | "version": "4.0.6", 1049 | "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.6.tgz", 1050 | "integrity": "sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg==", 1051 | "dev": true 1052 | }, 1053 | "isexe": { 1054 | "version": "2.0.0", 1055 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1056 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1057 | "dev": true 1058 | }, 1059 | "js-tokens": { 1060 | "version": "4.0.0", 1061 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1062 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 1063 | }, 1064 | "jsonfile": { 1065 | "version": "4.0.0", 1066 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", 1067 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", 1068 | "dev": true, 1069 | "requires": { 1070 | "graceful-fs": "^4.1.6" 1071 | } 1072 | }, 1073 | "karma": { 1074 | "version": "5.2.2", 1075 | "resolved": "https://registry.npmjs.org/karma/-/karma-5.2.2.tgz", 1076 | "integrity": "sha512-rB3Ua5yDxmIupTj67r3Q8itz7TxJzRE6DmVcOfV20D509Uu9AoBKlVwbZhND4kcm6BqLfbHtv4DZC9QJfrUY+w==", 1077 | "dev": true, 1078 | "requires": { 1079 | "body-parser": "^1.19.0", 1080 | "braces": "^3.0.2", 1081 | "chokidar": "^3.4.2", 1082 | "colors": "^1.4.0", 1083 | "connect": "^3.7.0", 1084 | "di": "^0.0.1", 1085 | "dom-serialize": "^2.2.1", 1086 | "glob": "^7.1.6", 1087 | "graceful-fs": "^4.2.4", 1088 | "http-proxy": "^1.18.1", 1089 | "isbinaryfile": "^4.0.6", 1090 | "lodash": "^4.17.19", 1091 | "log4js": "^6.2.1", 1092 | "mime": "^2.4.5", 1093 | "minimatch": "^3.0.4", 1094 | "qjobs": "^1.2.0", 1095 | "range-parser": "^1.2.1", 1096 | "rimraf": "^3.0.2", 1097 | "socket.io": "^2.3.0", 1098 | "source-map": "^0.6.1", 1099 | "tmp": "0.2.1", 1100 | "ua-parser-js": "0.7.21", 1101 | "yargs": "^15.3.1" 1102 | } 1103 | }, 1104 | "karma-chrome-launcher": { 1105 | "version": "3.1.0", 1106 | "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz", 1107 | "integrity": "sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==", 1108 | "dev": true, 1109 | "requires": { 1110 | "which": "^1.2.1" 1111 | } 1112 | }, 1113 | "karma-cljs-test": { 1114 | "version": "0.1.0", 1115 | "resolved": "https://registry.npmjs.org/karma-cljs-test/-/karma-cljs-test-0.1.0.tgz", 1116 | "integrity": "sha1-y4YF7w4R+ab20o9Wul298m84mSM=", 1117 | "dev": true 1118 | }, 1119 | "karma-junit-reporter": { 1120 | "version": "2.0.1", 1121 | "resolved": "https://registry.npmjs.org/karma-junit-reporter/-/karma-junit-reporter-2.0.1.tgz", 1122 | "integrity": "sha512-VtcGfE0JE4OE1wn0LK8xxDKaTP7slN8DO3I+4xg6gAi1IoAHAXOJ1V9G/y45Xg6sxdxPOR3THCFtDlAfBo9Afw==", 1123 | "dev": true, 1124 | "requires": { 1125 | "path-is-absolute": "^1.0.0", 1126 | "xmlbuilder": "12.0.0" 1127 | } 1128 | }, 1129 | "locate-path": { 1130 | "version": "5.0.0", 1131 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 1132 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 1133 | "dev": true, 1134 | "requires": { 1135 | "p-locate": "^4.1.0" 1136 | } 1137 | }, 1138 | "lodash": { 1139 | "version": "4.17.21", 1140 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1141 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 1142 | "dev": true 1143 | }, 1144 | "log4js": { 1145 | "version": "6.3.0", 1146 | "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.3.0.tgz", 1147 | "integrity": "sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw==", 1148 | "dev": true, 1149 | "requires": { 1150 | "date-format": "^3.0.0", 1151 | "debug": "^4.1.1", 1152 | "flatted": "^2.0.1", 1153 | "rfdc": "^1.1.4", 1154 | "streamroller": "^2.2.4" 1155 | }, 1156 | "dependencies": { 1157 | "debug": { 1158 | "version": "4.3.1", 1159 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 1160 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 1161 | "dev": true, 1162 | "requires": { 1163 | "ms": "2.1.2" 1164 | } 1165 | }, 1166 | "ms": { 1167 | "version": "2.1.2", 1168 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1169 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1170 | "dev": true 1171 | } 1172 | } 1173 | }, 1174 | "loose-envify": { 1175 | "version": "1.4.0", 1176 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 1177 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 1178 | "requires": { 1179 | "js-tokens": "^3.0.0 || ^4.0.0" 1180 | } 1181 | }, 1182 | "md5.js": { 1183 | "version": "1.3.5", 1184 | "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", 1185 | "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", 1186 | "dev": true, 1187 | "requires": { 1188 | "hash-base": "^3.0.0", 1189 | "inherits": "^2.0.1", 1190 | "safe-buffer": "^5.1.2" 1191 | } 1192 | }, 1193 | "media-typer": { 1194 | "version": "0.3.0", 1195 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1196 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", 1197 | "dev": true 1198 | }, 1199 | "miller-rabin": { 1200 | "version": "4.0.1", 1201 | "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", 1202 | "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", 1203 | "dev": true, 1204 | "requires": { 1205 | "bn.js": "^4.0.0", 1206 | "brorand": "^1.0.1" 1207 | }, 1208 | "dependencies": { 1209 | "bn.js": { 1210 | "version": "4.12.0", 1211 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 1212 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", 1213 | "dev": true 1214 | } 1215 | } 1216 | }, 1217 | "mime": { 1218 | "version": "2.5.2", 1219 | "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", 1220 | "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", 1221 | "dev": true 1222 | }, 1223 | "mime-db": { 1224 | "version": "1.46.0", 1225 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.46.0.tgz", 1226 | "integrity": "sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==", 1227 | "dev": true 1228 | }, 1229 | "mime-types": { 1230 | "version": "2.1.29", 1231 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.29.tgz", 1232 | "integrity": "sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==", 1233 | "dev": true, 1234 | "requires": { 1235 | "mime-db": "1.46.0" 1236 | } 1237 | }, 1238 | "minimalistic-assert": { 1239 | "version": "1.0.1", 1240 | "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", 1241 | "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", 1242 | "dev": true 1243 | }, 1244 | "minimalistic-crypto-utils": { 1245 | "version": "1.0.1", 1246 | "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", 1247 | "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", 1248 | "dev": true 1249 | }, 1250 | "minimatch": { 1251 | "version": "3.0.4", 1252 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1253 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1254 | "dev": true, 1255 | "requires": { 1256 | "brace-expansion": "^1.1.7" 1257 | } 1258 | }, 1259 | "ms": { 1260 | "version": "2.0.0", 1261 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1262 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 1263 | "dev": true 1264 | }, 1265 | "negotiator": { 1266 | "version": "0.6.2", 1267 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 1268 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", 1269 | "dev": true 1270 | }, 1271 | "node-libs-browser": { 1272 | "version": "2.2.1", 1273 | "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", 1274 | "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", 1275 | "dev": true, 1276 | "requires": { 1277 | "assert": "^1.1.1", 1278 | "browserify-zlib": "^0.2.0", 1279 | "buffer": "^4.3.0", 1280 | "console-browserify": "^1.1.0", 1281 | "constants-browserify": "^1.0.0", 1282 | "crypto-browserify": "^3.11.0", 1283 | "domain-browser": "^1.1.1", 1284 | "events": "^3.0.0", 1285 | "https-browserify": "^1.0.0", 1286 | "os-browserify": "^0.3.0", 1287 | "path-browserify": "0.0.1", 1288 | "process": "^0.11.10", 1289 | "punycode": "^1.2.4", 1290 | "querystring-es3": "^0.2.0", 1291 | "readable-stream": "^2.3.3", 1292 | "stream-browserify": "^2.0.1", 1293 | "stream-http": "^2.7.2", 1294 | "string_decoder": "^1.0.0", 1295 | "timers-browserify": "^2.0.4", 1296 | "tty-browserify": "0.0.0", 1297 | "url": "^0.11.0", 1298 | "util": "^0.11.0", 1299 | "vm-browserify": "^1.0.1" 1300 | } 1301 | }, 1302 | "normalize-path": { 1303 | "version": "3.0.0", 1304 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1305 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1306 | "dev": true 1307 | }, 1308 | "object-assign": { 1309 | "version": "4.1.1", 1310 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1311 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 1312 | }, 1313 | "on-finished": { 1314 | "version": "2.3.0", 1315 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 1316 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 1317 | "dev": true, 1318 | "requires": { 1319 | "ee-first": "1.1.1" 1320 | } 1321 | }, 1322 | "once": { 1323 | "version": "1.4.0", 1324 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1325 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1326 | "dev": true, 1327 | "requires": { 1328 | "wrappy": "1" 1329 | } 1330 | }, 1331 | "os-browserify": { 1332 | "version": "0.3.0", 1333 | "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", 1334 | "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", 1335 | "dev": true 1336 | }, 1337 | "p-limit": { 1338 | "version": "2.3.0", 1339 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 1340 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 1341 | "dev": true, 1342 | "requires": { 1343 | "p-try": "^2.0.0" 1344 | } 1345 | }, 1346 | "p-locate": { 1347 | "version": "4.1.0", 1348 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 1349 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 1350 | "dev": true, 1351 | "requires": { 1352 | "p-limit": "^2.2.0" 1353 | } 1354 | }, 1355 | "p-try": { 1356 | "version": "2.2.0", 1357 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 1358 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 1359 | "dev": true 1360 | }, 1361 | "pako": { 1362 | "version": "1.0.11", 1363 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", 1364 | "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", 1365 | "dev": true 1366 | }, 1367 | "parse-asn1": { 1368 | "version": "5.1.6", 1369 | "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", 1370 | "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", 1371 | "dev": true, 1372 | "requires": { 1373 | "asn1.js": "^5.2.0", 1374 | "browserify-aes": "^1.0.0", 1375 | "evp_bytestokey": "^1.0.0", 1376 | "pbkdf2": "^3.0.3", 1377 | "safe-buffer": "^5.1.1" 1378 | } 1379 | }, 1380 | "parseqs": { 1381 | "version": "0.0.6", 1382 | "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", 1383 | "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==", 1384 | "dev": true 1385 | }, 1386 | "parseuri": { 1387 | "version": "0.0.6", 1388 | "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", 1389 | "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==", 1390 | "dev": true 1391 | }, 1392 | "parseurl": { 1393 | "version": "1.3.3", 1394 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1395 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 1396 | "dev": true 1397 | }, 1398 | "path-browserify": { 1399 | "version": "0.0.1", 1400 | "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", 1401 | "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", 1402 | "dev": true 1403 | }, 1404 | "path-exists": { 1405 | "version": "4.0.0", 1406 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1407 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1408 | "dev": true 1409 | }, 1410 | "path-is-absolute": { 1411 | "version": "1.0.1", 1412 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1413 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1414 | "dev": true 1415 | }, 1416 | "pbkdf2": { 1417 | "version": "3.1.1", 1418 | "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", 1419 | "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", 1420 | "dev": true, 1421 | "requires": { 1422 | "create-hash": "^1.1.2", 1423 | "create-hmac": "^1.1.4", 1424 | "ripemd160": "^2.0.1", 1425 | "safe-buffer": "^5.0.1", 1426 | "sha.js": "^2.4.8" 1427 | } 1428 | }, 1429 | "picomatch": { 1430 | "version": "2.2.2", 1431 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", 1432 | "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", 1433 | "dev": true 1434 | }, 1435 | "process": { 1436 | "version": "0.11.10", 1437 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", 1438 | "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", 1439 | "dev": true 1440 | }, 1441 | "process-nextick-args": { 1442 | "version": "2.0.1", 1443 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1444 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", 1445 | "dev": true 1446 | }, 1447 | "public-encrypt": { 1448 | "version": "4.0.3", 1449 | "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", 1450 | "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", 1451 | "dev": true, 1452 | "requires": { 1453 | "bn.js": "^4.1.0", 1454 | "browserify-rsa": "^4.0.0", 1455 | "create-hash": "^1.1.0", 1456 | "parse-asn1": "^5.0.0", 1457 | "randombytes": "^2.0.1", 1458 | "safe-buffer": "^5.1.2" 1459 | }, 1460 | "dependencies": { 1461 | "bn.js": { 1462 | "version": "4.12.0", 1463 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 1464 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", 1465 | "dev": true 1466 | } 1467 | } 1468 | }, 1469 | "punycode": { 1470 | "version": "1.4.1", 1471 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 1472 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", 1473 | "dev": true 1474 | }, 1475 | "qjobs": { 1476 | "version": "1.2.0", 1477 | "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", 1478 | "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", 1479 | "dev": true 1480 | }, 1481 | "qs": { 1482 | "version": "6.7.0", 1483 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 1484 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", 1485 | "dev": true 1486 | }, 1487 | "querystring": { 1488 | "version": "0.2.0", 1489 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", 1490 | "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", 1491 | "dev": true 1492 | }, 1493 | "querystring-es3": { 1494 | "version": "0.2.1", 1495 | "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", 1496 | "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", 1497 | "dev": true 1498 | }, 1499 | "randombytes": { 1500 | "version": "2.1.0", 1501 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 1502 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 1503 | "dev": true, 1504 | "requires": { 1505 | "safe-buffer": "^5.1.0" 1506 | } 1507 | }, 1508 | "randomfill": { 1509 | "version": "1.0.4", 1510 | "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", 1511 | "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", 1512 | "dev": true, 1513 | "requires": { 1514 | "randombytes": "^2.0.5", 1515 | "safe-buffer": "^5.1.0" 1516 | } 1517 | }, 1518 | "range-parser": { 1519 | "version": "1.2.1", 1520 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1521 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 1522 | "dev": true 1523 | }, 1524 | "raw-body": { 1525 | "version": "2.4.0", 1526 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", 1527 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", 1528 | "dev": true, 1529 | "requires": { 1530 | "bytes": "3.1.0", 1531 | "http-errors": "1.7.2", 1532 | "iconv-lite": "0.4.24", 1533 | "unpipe": "1.0.0" 1534 | } 1535 | }, 1536 | "react": { 1537 | "version": "17.0.1", 1538 | "resolved": "https://registry.npmjs.org/react/-/react-17.0.1.tgz", 1539 | "integrity": "sha512-lG9c9UuMHdcAexXtigOZLX8exLWkW0Ku29qPRU8uhF2R9BN96dLCt0psvzPLlHc5OWkgymP3qwTRgbnw5BKx3w==", 1540 | "requires": { 1541 | "loose-envify": "^1.1.0", 1542 | "object-assign": "^4.1.1" 1543 | } 1544 | }, 1545 | "react-dom": { 1546 | "version": "17.0.1", 1547 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.1.tgz", 1548 | "integrity": "sha512-6eV150oJZ9U2t9svnsspTMrWNyHc6chX0KzDeAOXftRa8bNeOKTTfCJ7KorIwenkHd2xqVTBTCZd79yk/lx/Ug==", 1549 | "requires": { 1550 | "loose-envify": "^1.1.0", 1551 | "object-assign": "^4.1.1", 1552 | "scheduler": "^0.20.1" 1553 | } 1554 | }, 1555 | "readable-stream": { 1556 | "version": "2.3.7", 1557 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1558 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1559 | "dev": true, 1560 | "requires": { 1561 | "core-util-is": "~1.0.0", 1562 | "inherits": "~2.0.3", 1563 | "isarray": "~1.0.0", 1564 | "process-nextick-args": "~2.0.0", 1565 | "safe-buffer": "~5.1.1", 1566 | "string_decoder": "~1.1.1", 1567 | "util-deprecate": "~1.0.1" 1568 | }, 1569 | "dependencies": { 1570 | "isarray": { 1571 | "version": "1.0.0", 1572 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1573 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 1574 | "dev": true 1575 | }, 1576 | "safe-buffer": { 1577 | "version": "5.1.2", 1578 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1579 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 1580 | "dev": true 1581 | }, 1582 | "string_decoder": { 1583 | "version": "1.1.1", 1584 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1585 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1586 | "dev": true, 1587 | "requires": { 1588 | "safe-buffer": "~5.1.0" 1589 | } 1590 | } 1591 | } 1592 | }, 1593 | "readdirp": { 1594 | "version": "3.5.0", 1595 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", 1596 | "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", 1597 | "dev": true, 1598 | "requires": { 1599 | "picomatch": "^2.2.1" 1600 | } 1601 | }, 1602 | "readline-sync": { 1603 | "version": "1.4.10", 1604 | "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz", 1605 | "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==", 1606 | "dev": true 1607 | }, 1608 | "require-directory": { 1609 | "version": "2.1.1", 1610 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1611 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 1612 | "dev": true 1613 | }, 1614 | "require-main-filename": { 1615 | "version": "2.0.0", 1616 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 1617 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", 1618 | "dev": true 1619 | }, 1620 | "requires-port": { 1621 | "version": "1.0.0", 1622 | "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", 1623 | "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", 1624 | "dev": true 1625 | }, 1626 | "rfdc": { 1627 | "version": "1.2.0", 1628 | "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.2.0.tgz", 1629 | "integrity": "sha512-ijLyszTMmUrXvjSooucVQwimGUk84eRcmCuLV8Xghe3UO85mjUtRAHRyoMM6XtyqbECaXuBWx18La3523sXINA==", 1630 | "dev": true 1631 | }, 1632 | "rimraf": { 1633 | "version": "3.0.2", 1634 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1635 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1636 | "dev": true, 1637 | "requires": { 1638 | "glob": "^7.1.3" 1639 | } 1640 | }, 1641 | "ripemd160": { 1642 | "version": "2.0.2", 1643 | "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", 1644 | "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", 1645 | "dev": true, 1646 | "requires": { 1647 | "hash-base": "^3.0.0", 1648 | "inherits": "^2.0.1" 1649 | } 1650 | }, 1651 | "safe-buffer": { 1652 | "version": "5.2.1", 1653 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1654 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1655 | "dev": true 1656 | }, 1657 | "safer-buffer": { 1658 | "version": "2.1.2", 1659 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1660 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1661 | "dev": true 1662 | }, 1663 | "scheduler": { 1664 | "version": "0.20.1", 1665 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.1.tgz", 1666 | "integrity": "sha512-LKTe+2xNJBNxu/QhHvDR14wUXHRQbVY5ZOYpOGWRzhydZUqrLb2JBvLPY7cAqFmqrWuDED0Mjk7013SZiOz6Bw==", 1667 | "requires": { 1668 | "loose-envify": "^1.1.0", 1669 | "object-assign": "^4.1.1" 1670 | } 1671 | }, 1672 | "set-blocking": { 1673 | "version": "2.0.0", 1674 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 1675 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", 1676 | "dev": true 1677 | }, 1678 | "setimmediate": { 1679 | "version": "1.0.5", 1680 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 1681 | "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", 1682 | "dev": true 1683 | }, 1684 | "setprototypeof": { 1685 | "version": "1.1.1", 1686 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 1687 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", 1688 | "dev": true 1689 | }, 1690 | "sha.js": { 1691 | "version": "2.4.11", 1692 | "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", 1693 | "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", 1694 | "dev": true, 1695 | "requires": { 1696 | "inherits": "^2.0.1", 1697 | "safe-buffer": "^5.0.1" 1698 | } 1699 | }, 1700 | "shadow-cljs": { 1701 | "version": "2.11.18", 1702 | "resolved": "https://registry.npmjs.org/shadow-cljs/-/shadow-cljs-2.11.18.tgz", 1703 | "integrity": "sha512-7EAXl1xk2GjhViUeexn7cqAPx0lkEl2J40nAbPPCrAbfLfOWn5tjV4P3Be6IqTInSHMx04tFxDRV+0xFdIhl5A==", 1704 | "dev": true, 1705 | "requires": { 1706 | "node-libs-browser": "^2.2.1", 1707 | "readline-sync": "^1.4.7", 1708 | "shadow-cljs-jar": "1.3.2", 1709 | "source-map-support": "^0.4.15", 1710 | "which": "^1.3.1", 1711 | "ws": "^3.0.0" 1712 | }, 1713 | "dependencies": { 1714 | "safe-buffer": { 1715 | "version": "5.1.2", 1716 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1717 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 1718 | "dev": true 1719 | }, 1720 | "ws": { 1721 | "version": "3.3.3", 1722 | "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", 1723 | "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", 1724 | "dev": true, 1725 | "requires": { 1726 | "async-limiter": "~1.0.0", 1727 | "safe-buffer": "~5.1.0", 1728 | "ultron": "~1.1.0" 1729 | } 1730 | } 1731 | } 1732 | }, 1733 | "shadow-cljs-jar": { 1734 | "version": "1.3.2", 1735 | "resolved": "https://registry.npmjs.org/shadow-cljs-jar/-/shadow-cljs-jar-1.3.2.tgz", 1736 | "integrity": "sha512-XmeffAZHv8z7451kzeq9oKh8fh278Ak+UIOGGrapyqrFBB773xN8vMQ3O7J7TYLnb9BUwcqadKkmgaq7q6fhZg==", 1737 | "dev": true 1738 | }, 1739 | "socket.io": { 1740 | "version": "2.4.1", 1741 | "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.4.1.tgz", 1742 | "integrity": "sha512-Si18v0mMXGAqLqCVpTxBa8MGqriHGQh8ccEOhmsmNS3thNCGBwO8WGrwMibANsWtQQ5NStdZwHqZR3naJVFc3w==", 1743 | "dev": true, 1744 | "requires": { 1745 | "debug": "~4.1.0", 1746 | "engine.io": "~3.5.0", 1747 | "has-binary2": "~1.0.2", 1748 | "socket.io-adapter": "~1.1.0", 1749 | "socket.io-client": "2.4.0", 1750 | "socket.io-parser": "~3.4.0" 1751 | }, 1752 | "dependencies": { 1753 | "debug": { 1754 | "version": "4.1.1", 1755 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 1756 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 1757 | "dev": true, 1758 | "requires": { 1759 | "ms": "^2.1.1" 1760 | } 1761 | }, 1762 | "ms": { 1763 | "version": "2.1.3", 1764 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1765 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1766 | "dev": true 1767 | } 1768 | } 1769 | }, 1770 | "socket.io-adapter": { 1771 | "version": "1.1.2", 1772 | "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", 1773 | "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", 1774 | "dev": true 1775 | }, 1776 | "socket.io-client": { 1777 | "version": "2.4.0", 1778 | "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.4.0.tgz", 1779 | "integrity": "sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ==", 1780 | "dev": true, 1781 | "requires": { 1782 | "backo2": "1.0.2", 1783 | "component-bind": "1.0.0", 1784 | "component-emitter": "~1.3.0", 1785 | "debug": "~3.1.0", 1786 | "engine.io-client": "~3.5.0", 1787 | "has-binary2": "~1.0.2", 1788 | "indexof": "0.0.1", 1789 | "parseqs": "0.0.6", 1790 | "parseuri": "0.0.6", 1791 | "socket.io-parser": "~3.3.0", 1792 | "to-array": "0.1.4" 1793 | }, 1794 | "dependencies": { 1795 | "debug": { 1796 | "version": "3.1.0", 1797 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 1798 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 1799 | "dev": true, 1800 | "requires": { 1801 | "ms": "2.0.0" 1802 | } 1803 | }, 1804 | "socket.io-parser": { 1805 | "version": "3.3.2", 1806 | "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz", 1807 | "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==", 1808 | "dev": true, 1809 | "requires": { 1810 | "component-emitter": "~1.3.0", 1811 | "debug": "~3.1.0", 1812 | "isarray": "2.0.1" 1813 | } 1814 | } 1815 | } 1816 | }, 1817 | "socket.io-parser": { 1818 | "version": "3.4.1", 1819 | "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", 1820 | "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", 1821 | "dev": true, 1822 | "requires": { 1823 | "component-emitter": "1.2.1", 1824 | "debug": "~4.1.0", 1825 | "isarray": "2.0.1" 1826 | }, 1827 | "dependencies": { 1828 | "component-emitter": { 1829 | "version": "1.2.1", 1830 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", 1831 | "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", 1832 | "dev": true 1833 | }, 1834 | "debug": { 1835 | "version": "4.1.1", 1836 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 1837 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 1838 | "dev": true, 1839 | "requires": { 1840 | "ms": "^2.1.1" 1841 | } 1842 | }, 1843 | "ms": { 1844 | "version": "2.1.3", 1845 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1846 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1847 | "dev": true 1848 | } 1849 | } 1850 | }, 1851 | "source-map": { 1852 | "version": "0.6.1", 1853 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1854 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1855 | "dev": true 1856 | }, 1857 | "source-map-support": { 1858 | "version": "0.4.18", 1859 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", 1860 | "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", 1861 | "dev": true, 1862 | "requires": { 1863 | "source-map": "^0.5.6" 1864 | }, 1865 | "dependencies": { 1866 | "source-map": { 1867 | "version": "0.5.7", 1868 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 1869 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 1870 | "dev": true 1871 | } 1872 | } 1873 | }, 1874 | "statuses": { 1875 | "version": "1.5.0", 1876 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 1877 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", 1878 | "dev": true 1879 | }, 1880 | "stream-browserify": { 1881 | "version": "2.0.2", 1882 | "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", 1883 | "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", 1884 | "dev": true, 1885 | "requires": { 1886 | "inherits": "~2.0.1", 1887 | "readable-stream": "^2.0.2" 1888 | } 1889 | }, 1890 | "stream-http": { 1891 | "version": "2.8.3", 1892 | "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", 1893 | "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", 1894 | "dev": true, 1895 | "requires": { 1896 | "builtin-status-codes": "^3.0.0", 1897 | "inherits": "^2.0.1", 1898 | "readable-stream": "^2.3.6", 1899 | "to-arraybuffer": "^1.0.0", 1900 | "xtend": "^4.0.0" 1901 | } 1902 | }, 1903 | "streamroller": { 1904 | "version": "2.2.4", 1905 | "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.4.tgz", 1906 | "integrity": "sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ==", 1907 | "dev": true, 1908 | "requires": { 1909 | "date-format": "^2.1.0", 1910 | "debug": "^4.1.1", 1911 | "fs-extra": "^8.1.0" 1912 | }, 1913 | "dependencies": { 1914 | "date-format": { 1915 | "version": "2.1.0", 1916 | "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", 1917 | "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", 1918 | "dev": true 1919 | }, 1920 | "debug": { 1921 | "version": "4.3.1", 1922 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 1923 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 1924 | "dev": true, 1925 | "requires": { 1926 | "ms": "2.1.2" 1927 | } 1928 | }, 1929 | "ms": { 1930 | "version": "2.1.2", 1931 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1932 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1933 | "dev": true 1934 | } 1935 | } 1936 | }, 1937 | "string-width": { 1938 | "version": "4.2.2", 1939 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", 1940 | "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", 1941 | "dev": true, 1942 | "requires": { 1943 | "emoji-regex": "^8.0.0", 1944 | "is-fullwidth-code-point": "^3.0.0", 1945 | "strip-ansi": "^6.0.0" 1946 | } 1947 | }, 1948 | "string_decoder": { 1949 | "version": "1.3.0", 1950 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 1951 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1952 | "dev": true, 1953 | "requires": { 1954 | "safe-buffer": "~5.2.0" 1955 | } 1956 | }, 1957 | "strip-ansi": { 1958 | "version": "6.0.0", 1959 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 1960 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 1961 | "dev": true, 1962 | "requires": { 1963 | "ansi-regex": "^5.0.0" 1964 | } 1965 | }, 1966 | "timers-browserify": { 1967 | "version": "2.0.12", 1968 | "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", 1969 | "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", 1970 | "dev": true, 1971 | "requires": { 1972 | "setimmediate": "^1.0.4" 1973 | } 1974 | }, 1975 | "tmp": { 1976 | "version": "0.2.1", 1977 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", 1978 | "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", 1979 | "dev": true, 1980 | "requires": { 1981 | "rimraf": "^3.0.0" 1982 | } 1983 | }, 1984 | "to-array": { 1985 | "version": "0.1.4", 1986 | "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", 1987 | "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", 1988 | "dev": true 1989 | }, 1990 | "to-arraybuffer": { 1991 | "version": "1.0.1", 1992 | "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", 1993 | "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", 1994 | "dev": true 1995 | }, 1996 | "to-regex-range": { 1997 | "version": "5.0.1", 1998 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1999 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2000 | "dev": true, 2001 | "requires": { 2002 | "is-number": "^7.0.0" 2003 | } 2004 | }, 2005 | "toidentifier": { 2006 | "version": "1.0.0", 2007 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 2008 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", 2009 | "dev": true 2010 | }, 2011 | "tty-browserify": { 2012 | "version": "0.0.0", 2013 | "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", 2014 | "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", 2015 | "dev": true 2016 | }, 2017 | "type-is": { 2018 | "version": "1.6.18", 2019 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 2020 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 2021 | "dev": true, 2022 | "requires": { 2023 | "media-typer": "0.3.0", 2024 | "mime-types": "~2.1.24" 2025 | } 2026 | }, 2027 | "ua-parser-js": { 2028 | "version": "0.7.21", 2029 | "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz", 2030 | "integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==", 2031 | "dev": true 2032 | }, 2033 | "ultron": { 2034 | "version": "1.1.1", 2035 | "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", 2036 | "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", 2037 | "dev": true 2038 | }, 2039 | "universalify": { 2040 | "version": "0.1.2", 2041 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 2042 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", 2043 | "dev": true 2044 | }, 2045 | "unpipe": { 2046 | "version": "1.0.0", 2047 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 2048 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", 2049 | "dev": true 2050 | }, 2051 | "url": { 2052 | "version": "0.11.0", 2053 | "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", 2054 | "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", 2055 | "dev": true, 2056 | "requires": { 2057 | "punycode": "1.3.2", 2058 | "querystring": "0.2.0" 2059 | }, 2060 | "dependencies": { 2061 | "punycode": { 2062 | "version": "1.3.2", 2063 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", 2064 | "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", 2065 | "dev": true 2066 | } 2067 | } 2068 | }, 2069 | "util": { 2070 | "version": "0.11.1", 2071 | "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", 2072 | "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", 2073 | "dev": true, 2074 | "requires": { 2075 | "inherits": "2.0.3" 2076 | } 2077 | }, 2078 | "util-deprecate": { 2079 | "version": "1.0.2", 2080 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2081 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 2082 | "dev": true 2083 | }, 2084 | "utils-merge": { 2085 | "version": "1.0.1", 2086 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 2087 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", 2088 | "dev": true 2089 | }, 2090 | "vm-browserify": { 2091 | "version": "1.1.2", 2092 | "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", 2093 | "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", 2094 | "dev": true 2095 | }, 2096 | "void-elements": { 2097 | "version": "2.0.1", 2098 | "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", 2099 | "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", 2100 | "dev": true 2101 | }, 2102 | "which": { 2103 | "version": "1.3.1", 2104 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 2105 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 2106 | "dev": true, 2107 | "requires": { 2108 | "isexe": "^2.0.0" 2109 | } 2110 | }, 2111 | "which-module": { 2112 | "version": "2.0.0", 2113 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 2114 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", 2115 | "dev": true 2116 | }, 2117 | "wrap-ansi": { 2118 | "version": "6.2.0", 2119 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", 2120 | "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", 2121 | "dev": true, 2122 | "requires": { 2123 | "ansi-styles": "^4.0.0", 2124 | "string-width": "^4.1.0", 2125 | "strip-ansi": "^6.0.0" 2126 | } 2127 | }, 2128 | "wrappy": { 2129 | "version": "1.0.2", 2130 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2131 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 2132 | "dev": true 2133 | }, 2134 | "ws": { 2135 | "version": "7.4.3", 2136 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.3.tgz", 2137 | "integrity": "sha512-hr6vCR76GsossIRsr8OLR9acVVm1jyfEWvhbNjtgPOrfvAlKzvyeg/P6r8RuDjRyrcQoPQT7K0DGEPc7Ae6jzA==", 2138 | "dev": true 2139 | }, 2140 | "xmlbuilder": { 2141 | "version": "12.0.0", 2142 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-12.0.0.tgz", 2143 | "integrity": "sha512-lMo8DJ8u6JRWp0/Y4XLa/atVDr75H9litKlb2E5j3V3MesoL50EBgZDWoLT3F/LztVnG67GjPXLZpqcky/UMnQ==", 2144 | "dev": true 2145 | }, 2146 | "xmlhttprequest-ssl": { 2147 | "version": "1.5.5", 2148 | "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", 2149 | "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", 2150 | "dev": true 2151 | }, 2152 | "xtend": { 2153 | "version": "4.0.2", 2154 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 2155 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 2156 | "dev": true 2157 | }, 2158 | "y18n": { 2159 | "version": "4.0.1", 2160 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", 2161 | "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", 2162 | "dev": true 2163 | }, 2164 | "yargs": { 2165 | "version": "15.4.1", 2166 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", 2167 | "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", 2168 | "dev": true, 2169 | "requires": { 2170 | "cliui": "^6.0.0", 2171 | "decamelize": "^1.2.0", 2172 | "find-up": "^4.1.0", 2173 | "get-caller-file": "^2.0.1", 2174 | "require-directory": "^2.1.1", 2175 | "require-main-filename": "^2.0.0", 2176 | "set-blocking": "^2.0.0", 2177 | "string-width": "^4.2.0", 2178 | "which-module": "^2.0.0", 2179 | "y18n": "^4.0.0", 2180 | "yargs-parser": "^18.1.2" 2181 | } 2182 | }, 2183 | "yargs-parser": { 2184 | "version": "18.1.3", 2185 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", 2186 | "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", 2187 | "dev": true, 2188 | "requires": { 2189 | "camelcase": "^5.0.0", 2190 | "decamelize": "^1.2.0" 2191 | } 2192 | }, 2193 | "yeast": { 2194 | "version": "0.1.2", 2195 | "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", 2196 | "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", 2197 | "dev": true 2198 | } 2199 | } 2200 | } 2201 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "day8.re-frame.http-fx", 3 | "devDependencies": { 4 | "karma": "5.2.2", 5 | "karma-chrome-launcher": "3.1.0", 6 | "karma-cljs-test": "0.1.0", 7 | "karma-junit-reporter": "2.0.1", 8 | "shadow-cljs": "2.11.18" 9 | }, 10 | "dependencies": { 11 | "react": "17.0.1", 12 | "react-dom": "17.0.1" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /project.clj: -------------------------------------------------------------------------------- 1 | (defproject day8.re-frame/http-fx "lein-git-inject/version" 2 | :description "A re-frame effects handler for performing Ajax tasks" 3 | :url "https://github.com/day8/re-frame-http-fx.git" 4 | :license {:name "MIT"} 5 | 6 | :dependencies [[org.clojure/clojure "1.10.2" :scope "provided"] 7 | [org.clojure/clojurescript "1.10.773" :scope "provided" 8 | :exclusions [com.google.javascript/closure-compiler-unshaded 9 | org.clojure/google-closure-library 10 | org.clojure/google-closure-library-third-party]] 11 | [thheller/shadow-cljs "2.11.18" :scope "provided"] 12 | [re-frame "1.2.0" :scope "provided"] 13 | [cljs-ajax "0.8.4"]] 14 | 15 | :plugins [[day8/lein-git-inject "0.0.14"] 16 | [lein-shadow "0.3.1"] 17 | [lein-ancient "0.6.15"] 18 | [lein-shell "0.5.0"]] 19 | 20 | :middleware [leiningen.git-inject/middleware] 21 | 22 | :deploy-repositories [["clojars" {:sign-releases false 23 | :url "https://clojars.org/repo" 24 | :username :env/CLOJARS_USERNAME 25 | :password :env/CLOJARS_TOKEN}]] 26 | :release-tasks [["deploy" "clojars"]] 27 | 28 | :profiles {:dev {:dependencies [[binaryage/devtools "1.0.2"]]}} 29 | 30 | :clean-targets [:target-path 31 | "node_modules" 32 | "run/compiled"] 33 | 34 | :jvm-opts ^:replace ["-Xms256m" "-Xmx2g"] 35 | 36 | :source-paths ["src"] 37 | 38 | :test-paths ["test"] 39 | 40 | :resource-paths ["run/resources"] 41 | 42 | :shadow-cljs {:nrepl {:port 8777} 43 | 44 | :builds {:build-report 45 | {:target :browser 46 | :compiler-options {:language-in :es6 47 | :language-out :es6} 48 | :release {:modules {:http-fx {:entries [day8.re-frame.http-fx]}}}} 49 | 50 | :browser-test 51 | {:target :browser-test 52 | :ns-regexp "day8.*-test$" 53 | :test-dir "run/resources/compiled_test" 54 | :compiler-options {:pretty-print true 55 | :external-config {:devtools/config {:features-to-install [:formatters :hints]}}}} 56 | :karma-test 57 | {:target :karma 58 | :ns-regexp "day8.*-test$" 59 | :output-to "target/karma-test.js" 60 | :compiler-options {:pretty-print true}}}} 61 | 62 | :aliases {"watch" ["do" 63 | ["clean"] 64 | ["shadow" "watch" "browser-test" "karma-test"]] 65 | 66 | "build-report" ["do" 67 | ["clean"] 68 | ["shadow" "run" "shadow.cljs.build-report" "build-report" "target/build-report.html"]] 69 | 70 | "ci" ["do" 71 | ["clean"] 72 | ["shadow" "compile" "karma-test"] 73 | ["shell" "karma" "start" "--single-run" "--reporters" "junit,dots"]]}) 74 | -------------------------------------------------------------------------------- /src/day8/re_frame/http_fx.cljs: -------------------------------------------------------------------------------- 1 | (ns day8.re-frame.http-fx 2 | (:require 3 | [goog.net.ErrorCode :as errors] 4 | [re-frame.core :refer [reg-fx dispatch console]] 5 | [ajax.simple :as ajax] 6 | [ajax.xhrio] 7 | #_[cljs.spec :as s]) 8 | (:import (goog.net XhrIo))) 9 | 10 | ;; I provide the :http-xhrio effect handler leveraging cljs-ajax lib 11 | ;; see API docs https://github.com/JulianBirch/cljs-ajax 12 | ;; Note we use the ajax-request. 13 | ;; 14 | ;; Deviation from cljs-ajax options in request 15 | ;; :handler - not supported, see :on-success and :on-failure 16 | ;; :on-success - event vector dispatched with result 17 | ;; :on-failure - event vector dispatched with result 18 | ;; :on-request - event vector dispatched with raw xhrio object 19 | ;; 20 | ;; NOTE: if you need tokens or other values for your handlers, 21 | ;; provide them in the on-success, on-failure & on-request events e.g. 22 | ;; [:success-event "my-token"] your handler will get event-v 23 | ;; [:success-event "my-token" result] 24 | 25 | 26 | (defn ajax-xhrio-handler 27 | "ajax-request only provides a single handler for success and errors" 28 | [on-success on-failure xhrio [success? response]] 29 | ; see http://docs.closure-library.googlecode.com/git/class_goog_net_XhrIo.html 30 | (if success? 31 | (on-success response) 32 | (let [details (merge 33 | {:uri (.getLastUri xhrio) 34 | :last-method (.-lastMethod_ xhrio) 35 | :last-error (.getLastError xhrio) 36 | :last-error-code (.getLastErrorCode xhrio) 37 | :debug-message (-> xhrio .getLastErrorCode (errors/getDebugMessage))} 38 | response)] 39 | (on-failure details)))) 40 | 41 | 42 | (defn request->xhrio-options 43 | [{:as request 44 | :keys [on-success on-failure] 45 | :or {on-success [:http-no-on-success] 46 | on-failure [:http-no-on-failure]}}] 47 | ; wrap events in cljs-ajax callback 48 | (let [api (new goog.net.XhrIo)] 49 | (-> request 50 | (assoc 51 | :api api 52 | :handler (partial ajax-xhrio-handler 53 | #(dispatch (conj on-success %)) 54 | #(dispatch (conj on-failure %)) 55 | api)) 56 | (dissoc :on-success :on-failure :on-request)))) 57 | 58 | (defn dispatch-on-request [request xhrio] 59 | (if-let [on-request (:on-request request)] 60 | (dispatch (conj on-request xhrio)))) 61 | 62 | ;; Specs commented out until ClojureScript has a stable release of spec. 63 | ; 64 | ;(s/def ::method keyword?) 65 | ;(s/def ::uri string?) 66 | ;(s/def ::response-format (s/keys :req-un [::description ::read ::content-type])) 67 | ;(s/def ::format (s/keys :req-un [::write ::content-type])) 68 | ;(s/def ::timeout nat-int?) 69 | ;(s/def ::params any?) 70 | ;(s/def ::headers map?) 71 | ;(s/def ::with-credentials boolean?) 72 | ; 73 | ;(s/def ::on-success vector?) 74 | ;(s/def ::on-failure vector?) 75 | ;(s/def ::on-request vector?) 76 | ; 77 | ;(s/def ::request-map (s/and (s/keys :req-un [::method ::uri ::response-format ::on-success ::on-failure ::on-request] 78 | ; :opt-un [::format ::timeout ::params ::headers ::with-credentials]) 79 | ; (fn [m] (if (contains? m :params) 80 | ; (contains? m :format) 81 | ; true)))) 82 | ; 83 | ;(s/def ::sequential-or-map (s/or :request-map ::request-map :seq-request-maps (s/coll-of ::request-map 84 | ; :kind sequential? 85 | ; :into []))) 86 | 87 | (defn http-effect 88 | [request] 89 | #_(when-not (s/valid? ::sequential-or-map request) 90 | (throw (ex-info "http-xhrio fx: spec error" (s/explain-data ::sequential-or-map request)))) 91 | (let [#_ #_ [conform-val v] (s/conform ::sequential-or-map request) 92 | #_ #_ seq-request-maps (if (= :seq-request-maps conform-val) v [v]) 93 | seq-request-maps (if (sequential? request) request [request])] 94 | (doseq [request seq-request-maps] 95 | (let [xhrio (-> request request->xhrio-options ajax/ajax-request)] 96 | (dispatch-on-request request xhrio))))) 97 | 98 | (reg-fx :http-xhrio http-effect) 99 | -------------------------------------------------------------------------------- /src/deps.cljs: -------------------------------------------------------------------------------- 1 | {:npm-dev-deps {"shadow-cljs" "2.11.18" 2 | "karma" "5.2.2" 3 | "karma-chrome-launcher" "3.1.0" 4 | "karma-cljs-test" "0.1.0" 5 | "karma-junit-reporter" "2.0.1"}} 6 | -------------------------------------------------------------------------------- /test/day8/re_frame/http_fx_test.cljs: -------------------------------------------------------------------------------- 1 | (ns day8.re-frame.http-fx-test 2 | (:require 3 | [ajax.core :as ajax] 4 | [cljs.test :refer-macros [is deftest async use-fixtures]] 5 | [cljs.spec.alpha :as s] 6 | [re-frame.core :as re-frame] 7 | [day8.re-frame.http-fx])) 8 | 9 | ;; Spec from https://developer.github.com/v3/rate_limit/ 10 | (s/def ::limit int?) 11 | (s/def ::remaining int?) 12 | (s/def ::reset int?) 13 | (s/def ::resource (s/keys :req-un [::limit ::remaining ::reset])) 14 | (s/def ::core ::resource) 15 | (s/def ::search ::resource) 16 | (s/def ::resources (s/keys :req-un [::core ::search])) 17 | (s/def ::api-result (s/keys :req-un [::resources])) 18 | 19 | 20 | ;; ---- FIXTURES --------------------------------------------------------------- 21 | ;; This fixture uses the re-frame.core/make-restore-fn to checkpoint and reset 22 | ;; to cleanup any dynamically registered handlers from our tests. 23 | (defn fixture-re-frame 24 | [] 25 | (let [restore-re-frame (atom nil)] 26 | {:before #(reset! restore-re-frame (re-frame.core/make-restore-fn)) 27 | :after #(@restore-re-frame)})) 28 | 29 | (use-fixtures :each (fixture-re-frame)) 30 | 31 | ;; ---- TESTS ------------------------------------------------------------------ 32 | 33 | ;; setup success handler 34 | (re-frame/reg-event-db 35 | ::good-http-result 36 | (fn [db [_ done token result]] 37 | (is (= "test-token1" token) "expected: token passed through") 38 | ;; check shape of result using loose Spec 39 | (is (not= (s/conform ::api-result result) :cljs.spec/invalid) 40 | (s/explain-str ::api-result result)) 41 | (is (every? keyword? (keys result)) "keys should be keywords") 42 | (done) 43 | db)) 44 | 45 | (re-frame/reg-event-db 46 | ::good-post-result 47 | (fn [db [_ done data result]] 48 | ;; httpbin returns a JSON object containing headers and other 49 | ;; metadata from our request along with our JSON payload. 50 | (is (= (:json result) data)) 51 | (done) 52 | db)) 53 | 54 | (re-frame/reg-event-db 55 | ::good-post-body-result 56 | (fn [db [_ done {:strs [form] :as result}]] 57 | (is (= (get form "username") "bob")) 58 | (is (= (get form "password") "sekrit")) 59 | (done) 60 | db)) 61 | 62 | ;; setup failure handler 63 | (re-frame/reg-event-db 64 | ::bad-http-result 65 | (fn [db [_ done token error]] 66 | (is (= "test-token1" token) "expected: token passed through") 67 | (cljs.test/do-report 68 | {:type :fail 69 | :message "Unexpected HTTP error, something wrong with your internet?" 70 | :expected ::good-http-result 71 | :actual error}) 72 | (done) 73 | db)) 74 | 75 | ;; setup request handler 76 | (re-frame/reg-event-db 77 | ::on-http-request 78 | (fn [db [_ done id req]] 79 | (is (= (type req) goog.net.XhrIo) "expected: request passed through") 80 | (is (= id "my-id") "expected: id passed through") 81 | (done) 82 | db)) 83 | 84 | (re-frame/reg-event-fx 85 | ::http-test 86 | (fn [_world [_ val]] 87 | {:http-xhrio val})) 88 | 89 | (deftest xhrio-get-test 90 | ;; Setup effects handler with :http-xhrio specifying an ajax-request. 91 | ;; Note we specify optional :response-format to make sure our json result 92 | ;; has keywords for keys, and :timeout see the ajax-request API 93 | ;; for more details https://github.com/JulianBirch/cljs-ajax#ajax-request 94 | ;; We specify an :on-failure for completeness but we don't expect the request 95 | ;; to fail unless there is something wrong with your internet or github. 96 | (async done 97 | (re-frame/dispatch [::http-test {:method :get 98 | :uri "https://api.github.com/rate_limit" 99 | :timeout 5000 100 | :response-format (ajax/json-response-format {:keywords? true}) 101 | :on-request [::on-http-request done "my-id"] 102 | :on-success [::good-http-result done "test-token1"] 103 | :on-failure [::bad-http-result done "test-token1"]}]))) 104 | 105 | (deftest xhrio-post-params-test 106 | (async done 107 | (let [data {:here ["is" "a" "map"]}] 108 | (re-frame/dispatch [::http-test {:method :post 109 | :uri "https://httpbin.org/post" 110 | :params data 111 | :timeout 5000 112 | :format (ajax/json-request-format) 113 | :response-format (ajax/json-response-format {:keywords? true}) 114 | :on-success [::good-post-result done data] 115 | :on-failure [::bad-http-result done "test-token1"]}])))) 116 | 117 | (deftest xhrio-post-body-test 118 | (async done 119 | (re-frame/dispatch [::http-test {:method :post 120 | :uri "https://httpbin.org/post" 121 | :body (doto (js/FormData.) 122 | (.append "username" "bob") 123 | (.append "password" "sekrit")) 124 | :timeout 5000 125 | :response-format (ajax/json-response-format) 126 | :on-success [::good-post-body-result done] 127 | :on-failure [::bad-http-result done "test-token1"]}]))) 128 | 129 | (deftest xhrio-get-seq-test 130 | ;; Setup effects handler with :http-xhrio specifying an ajax-request. 131 | ;; Note we specify optional :response-format to make sure our json result 132 | ;; has keywords for keys, and :timeout see the ajax-request API 133 | ;; for more details https://github.com/JulianBirch/cljs-ajax#ajax-request 134 | ;; We specify an :on-failure for completeness but we don't expect the request 135 | ;; to fail unless there is something wrong with your internet or github. 136 | (async done 137 | (re-frame/dispatch [::http-test [{:method :get 138 | :uri "https://api.github.com/rate_limit" 139 | :timeout 5000 140 | :response-format (ajax/json-response-format {:keywords? true}) 141 | :on-success [::good-http-result done "test-token1"] 142 | :on-failure [::bad-http-result done "test-token1"]}]]))) 143 | 144 | ; Commented out until we re-enable spec 145 | ;(deftest invalid-fx-test 146 | ; (is (= ::s/invalid 147 | ; (s/conform ::http-fx/request-map {}))) 148 | ; (is (= ::s/invalid 149 | ; (s/conform ::http-fx/request-map {:method :get 150 | ; :uri "https://api.github.com" 151 | ; :response-format :json 152 | ; :on-success [:x] 153 | ; :on-failure [:y]}))) 154 | ; (is (= ::s/invalid 155 | ; (s/conform ::http-fx/request-map {:method :get 156 | ; :uri "https://api.github.com" 157 | ; :response-format (ajax/json-response-format) 158 | ; :on-success [:x]})))) 159 | --------------------------------------------------------------------------------