~sjm/nesktop

410017d5999b5f822157bdf0c52180fbe67a35e9 — Sam Marshall 1 year, 11 months ago b2c66f8 master
chore: pull data into separate namespace. Add spec
M package.json => package.json +2 -2
@@ 10,10 10,10 @@
    "react": "^16.12.0",
    "react-dom": "^16.12.0",
    "react-flip-move": "^3.0.1",
    "react-highlight.js": "1.0.7",
    "shadow-cljs": "^2.8.76"
    "react-highlight.js": "1.0.7"
  },
  "devDependencies": {
    "shadow-cljs": "2.10.5",
    "vercel": "^19.0.1"
  }
}

M src/nesktop/components/note.cljs => src/nesktop/components/note.cljs +9 -5
@@ 1,8 1,11 @@
(ns nesktop.components.note
  (:require [re-frame.core :as rf]
            [nesktop.queries :as q]
            [nesktop.data.note :as n]
            [nesktop.data.pos :as pos]
            [nesktop.events :as e]))


(defn note-style
  [w h x y]
  {:background "#FFFFFF"


@@ 22,14 25,16 @@
  {:padding 0
   :margin 0})

(defn note [{:keys [id content]}]
  (let [on-mouse-down #(rf/dispatch [::e/drag-note id true])]
(defn note [nt]
  (let [id (n/id nt)
        content (n/content nt)
        on-mouse-down #(rf/dispatch [::e/drag-note id true])]
    (fn []
      (let [position @(rf/subscribe [::q/note id])
            mouse-position @(rf/subscribe [::q/mouse-position])
            dragging? @(rf/subscribe [::q/note-ui-dragging? id])
            x (if dragging? (first mouse-position) (:x position))
            y (if dragging? (second mouse-position) (:y position))
            x (if dragging? (first mouse-position) (::pos/x position))
            y (if dragging? (second mouse-position) (::pos/y position))
            w 200
            h 80]
        [:div


@@ 38,4 43,3 @@
         [:p 
          {:style (note-p-style)} 
          (str content)]]))))
        

M src/nesktop/components/root_view.cljs => src/nesktop/components/root_view.cljs +2 -1
@@ 4,6 4,7 @@
    [reagent.core :as reagent]
    [nesktop.events :as e]
    [nesktop.queries :as q]
    [nesktop.data.note :as n]
    [nesktop.components.note :refer [note]]))

(defn root-view


@@ 18,5 19,5 @@
              :height "100%"}}
     (let [notes (rf/subscribe [::q/notes])]
       (map (fn [n]
              [note (into n {:key (:id n)})])
              [note (into n {:key (::n/id n)})])
            (vals @notes)))]))

M src/nesktop/core.cljs => src/nesktop/core.cljs +1 -1
@@ 4,8 4,8 @@
    [reagent.core :as reagent]
    [nesktop.events :as e]
    [nesktop.queries :as q]
    [nesktop.data.note :as note]
    [nesktop.components.root-view :refer [root-view]]))

     
(defn ^:export render []
  (reagent/render [root-view]

A src/nesktop/data/app.cljs => src/nesktop/data/app.cljs +40 -0
@@ 0,0 1,40 @@
(ns nesktop.data.app
  (:require [clojure.spec.alpha :as s]
            [nesktop.data.pos :as p]
            [nesktop.data.note :as n]
            [nesktop.data.ui :as ui]
            [nesktop.data.note-ui :as nui]
            [nesktop.data.notes :as nts]))


(s/def ::notes ::nts/notes)
(s/def ::note-positions (s/map-of ::n/id ::p/pos))
(s/def ::note-ui (s/map-of ::n/id ::nui/ui))
(s/def ::ui ::ui/ui)

(s/def ::app-db
  (s/keys :req [::notes ::note-positions ::note-ui ::ui]))

(defn create
  []
  {::notes {}
   ::note-positions {}
   ::note-ui {}
   ::ui { ::ui/mouse-position [0, 0]}})

(defn add-note
  [db content]
  (let [note (n/from-content content)]
    (->
      db
      (assoc-in [::notes (n/id note)] note)
      (assoc-in [::note-positions (n/id note)] (p/create 100 100))
      (assoc-in [::note-ui (n/id note)] {:dragging false}))))

(s/fdef add-note
        :args (s/cat :db ::app-db :content ::n/content)
        :ret ::app-db)
         
(s/fdef create
        :args (s/cat)
        :ret ::app-db)

A src/nesktop/data/note.cljs => src/nesktop/data/note.cljs +37 -0
@@ 0,0 1,37 @@
(ns nesktop.data.note
  (:require [clojure.spec.alpha :as s]))

(s/def ::id keyword?) 
(s/def ::content string?)
(s/def ::note 
  (s/keys :req [::id ::content])) 

(defn create 
  [id content]
  {::id id
   ::content content})
  
(defn from-content [content]
  (create (keyword (str (random-uuid))) content))

(defn id [note]
  (::id note))

(defn content [note]
  (::content note))

(s/fdef create
        :args (s/cat ::id ::content)
        :ret ::note)

(s/fdef from-content
        :args ::content
        :ret ::note)

(s/fdef id
        :args ::note
        :ret ::id)

(s/fdef content
        :args ::note
        :ret ::content)

A src/nesktop/data/note_ui.cljs => src/nesktop/data/note_ui.cljs +6 -0
@@ 0,0 1,6 @@
(ns nesktop.data.note-ui
  (:require [clojure.spec.alpha :as s]))

(s/def ::dragging boolean?)
(s/def ::ui
  (s/keys :req [::dragging]))

A src/nesktop/data/notes.cljs => src/nesktop/data/notes.cljs +22 -0
@@ 0,0 1,22 @@
(ns nesktop.data.notes
  (:require [clojure.spec.alpha :as s]
            [nesktop.data.note :as note]))

(s/def ::notes 
  (s/map-of ::note/id ::note/note))

(defn from-notes 
  [ns]
  (into {} (map (fn [n] [(note/id n) n]) ns)))

(defn from-content
  [strs]
  (from-notes (map note/from-content strs)))

(s/fdef from-notes
        :args (s/coll-of ::note/note)
        :ret ::notes)

(s/fdef from-content
        :args (s/coll-of ::note/content)
        :ret ::notes)

A src/nesktop/data/pos.cljs => src/nesktop/data/pos.cljs +11 -0
@@ 0,0 1,11 @@
(ns nesktop.data.pos
    (:require [clojure.spec.alpha :as s]))

(s/def ::x int?)
(s/def ::y int?)
(s/def ::pos (s/keys :req [::x ::y]))

(defn create
  [x y]
  {::x x
   ::y y})

A src/nesktop/data/ui.cljs => src/nesktop/data/ui.cljs +5 -0
@@ 0,0 1,5 @@
(ns nesktop.data.ui
  (:require [clojure.spec.alpha :as s]))

(s/def ::mouse-position (s/cat :x int? :y int?))
(s/def ::ui (s/keys :req [::mouse-position]))

M src/nesktop/events.cljs => src/nesktop/events.cljs +18 -23
@@ 1,5 1,8 @@
(ns nesktop.events
  (:require [re-frame.core :as rf]))
  (:require [re-frame.core :as rf]
            [nesktop.data.app :as a]
            [nesktop.data.pos :as pos]
            [nesktop.data.ui :as ui]))

;; 2. Event Handling
;;    register a handler for a given event.


@@ 11,42 14,34 @@
(rf/reg-event-db ::update-note-pos
                 (fn [db [_ id x y]]
                   (-> db
                       (assoc-in [:note-positions id :x] x)
                       (assoc-in [:note-positions id :y] y))))
                       (assoc-in [::a/note-positions id] (pos/create x y)))))

(rf/reg-event-db ::drag-note
                 (fn [db [_ id dragging]]
                   (assoc-in db [:note-ui id :dragging] dragging)))
                   (assoc-in db [::a/note-ui id :dragging] dragging)))

(rf/reg-event-fx ::update-note-position
                 (fn [cofx [_ id]]
                   (let [db (:db cofx)
                         [x y] (:mouse-position (:ui db))]
                     {:db (assoc-in db [:note-positions id] {:x x :y y})
                         [x y] (::ui/mouse-position (::a/ui db))]
                     {:db (assoc-in db [::a/note-positions id] (pos/create x y))
                      :dispatch [::undrag]})))

(rf/reg-event-db ::undrag
                 (fn [db _]
                   (assoc db 
                          :note-ui 
                          (into {} 
                                (map (fn [[key val]]
                                       [key (assoc val :dragging false)])
                                     (:note-ui db))))))
                          ::a/note-ui 
                          (->>
                            (::a/note-ui db)
                            (map (fn [[key val]] [key (assoc val :dragging false)]))
                            (into {})))))

(rf/reg-event-db ::update-mouse
                 (fn [db [_ x y]]
                   (assoc-in db [:ui :mouse-position] [x y])))
                   (assoc-in db [::a/ui ::ui/mouse-position] [x y])))

(rf/reg-event-db :initialize
                 ;; we'll call this once, at the beginning, to set up the db.
                 (constantly {:note-positions {:0 {:x 180
                                                    :y 100}}
                              :ui {:mouse-position [0, 0]}
                              :note-ui {:0 {:dragging false}}
                              :notes {:0 {:id :0 
                                           :content "Hello World"}}}))
                              
(into {} (map (fn [[key val]] 
                [key (update val :b inc)]) 
              {:a {:b 0} :c {:b 0}}))
                 #(-> (a/create)
                     (a/add-note "Hello, World!")
                     (a/add-note "Another Note!")))


M src/nesktop/queries.cljs => src/nesktop/queries.cljs +8 -6
@@ 1,6 1,8 @@
(ns nesktop.queries
  (:require [re-frame.core :as rf]
            [nesktop.events :as e]))
            [nesktop.events :as e]
            [nesktop.data.ui :as ui]
            [nesktop.data.app :as a]))

;; 3. Queries
;;    make a query for every kind of 'read' into the db.


@@ 12,19 14,19 @@

(rf/reg-sub ::notes
            (fn [db _]
              (:notes db)))
              (::a/notes db)))

(rf/reg-sub ::note-positions
            (fn [db _]
              (:note-positions db)))
              (::a/note-positions db)))

(rf/reg-sub ::notes-ui
            (fn [db _]
              (:note-ui db)))
              (::a/note-ui db)))

(rf/reg-sub ::ui
            (fn [db _]
              (:ui db)))
              (::a/ui db)))

(rf/reg-sub ::note



@@ 53,4 55,4 @@
(rf/reg-sub ::mouse-position
            :<- [::ui]
            (fn [ui _]
              (:mouse-position ui)))
              (::ui/mouse-position ui)))

M yarn.lock => yarn.lock +70 -66
@@ 34,10 34,15 @@ base64-js@^1.0.2:
  resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1"
  integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==

bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
  version "4.11.8"
  resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
  integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==
bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.4.0:
  version "4.11.9"
  resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828"
  integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==

bn.js@^5.1.1:
  version "5.1.2"
  resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.2.tgz#c9686902d3c9a27729f43ab10f9d79c2004da7b0"
  integrity sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==

brorand@^1.0.1:
  version "1.1.0"


@@ 75,7 80,7 @@ browserify-des@^1.0.0:
    inherits "^2.0.1"
    safe-buffer "^5.1.2"

browserify-rsa@^4.0.0:
browserify-rsa@^4.0.0, browserify-rsa@^4.0.1:
  version "4.0.1"
  resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
  integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=


@@ 84,17 89,19 @@ browserify-rsa@^4.0.0:
    randombytes "^2.0.1"

browserify-sign@^4.0.0:
  version "4.0.4"
  resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"
  integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=
  dependencies:
    bn.js "^4.1.1"
    browserify-rsa "^4.0.0"
    create-hash "^1.1.0"
    create-hmac "^1.1.2"
    elliptic "^6.0.0"
    inherits "^2.0.1"
    parse-asn1 "^5.0.0"
  version "4.2.0"
  resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.0.tgz#545d0b1b07e6b2c99211082bf1b12cce7a0b0e11"
  integrity sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==
  dependencies:
    bn.js "^5.1.1"
    browserify-rsa "^4.0.1"
    create-hash "^1.2.0"
    create-hmac "^1.1.7"
    elliptic "^6.5.2"
    inherits "^2.0.4"
    parse-asn1 "^5.1.5"
    readable-stream "^3.6.0"
    safe-buffer "^5.2.0"

browserify-zlib@^0.2.0:
  version "0.2.0"


@@ 158,7 165,7 @@ create-ecdh@^4.0.0:
    bn.js "^4.1.0"
    elliptic "^6.0.0"

create-hash@^1.1.0, create-hash@^1.1.2:
create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
  integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==


@@ 169,7 176,7 @@ create-hash@^1.1.0, create-hash@^1.1.2:
    ripemd160 "^2.0.1"
    sha.js "^2.4.0"

create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7:
  version "1.1.7"
  resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
  integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==


@@ 229,7 236,7 @@ domain-browser@^1.1.1:
  resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
  integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==

elliptic@^6.0.0:
elliptic@^6.0.0, elliptic@^6.5.2:
  version "6.5.2"
  resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762"
  integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==


@@ 250,9 257,9 @@ encoding@^0.1.11:
    iconv-lite "~0.4.13"

events@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88"
  integrity sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==
  version "3.1.0"
  resolved "https://registry.yarnpkg.com/events/-/events-3.1.0.tgz#84279af1b34cb75aa88bf5ff291f6d0bd9b31a59"
  integrity sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==

evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
  version "1.0.3"


@@ 276,12 283,13 @@ fbjs@^0.8.9:
    ua-parser-js "^0.7.18"

hash-base@^3.0.0:
  version "3.0.4"
  resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
  integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=
  version "3.1.0"
  resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33"
  integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==
  dependencies:
    inherits "^2.0.1"
    safe-buffer "^5.0.1"
    inherits "^2.0.4"
    readable-stream "^3.6.0"
    safe-buffer "^5.2.0"

hash.js@^1.0.0, hash.js@^1.0.3:
  version "1.1.7"


@@ 337,7 345,7 @@ inherits@2.0.3:
  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
  integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=

inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3:
  version "2.0.4"
  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
  integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==


@@ 404,18 412,6 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
  resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
  integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=

minimist@0.0.8:
  version "0.0.8"
  resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
  integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=

mkdirp@^0.5.1:
  version "0.5.1"
  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
  integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
  dependencies:
    minimist "0.0.8"

node-fetch@^1.0.1:
  version "1.7.3"
  resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef"


@@ 464,11 460,11 @@ os-browserify@^0.3.0:
  integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=

pako@~1.0.5:
  version "1.0.10"
  resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732"
  integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==
  version "1.0.11"
  resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
  integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==

parse-asn1@^5.0.0:
parse-asn1@^5.0.0, parse-asn1@^5.1.5:
  version "5.1.5"
  resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e"
  integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==


@@ 486,9 482,9 @@ path-browserify@0.0.1:
  integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==

pbkdf2@^3.0.3:
  version "3.0.17"
  resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6"
  integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==
  version "3.1.1"
  resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94"
  integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==
  dependencies:
    create-hash "^1.1.2"
    create-hmac "^1.1.4"


@@ 607,9 603,9 @@ react@^16.12.0:
    prop-types "^15.6.2"

readable-stream@^2.0.2, readable-stream@^2.3.3, readable-stream@^2.3.6:
  version "2.3.6"
  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
  integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==
  version "2.3.7"
  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
  integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
  dependencies:
    core-util-is "~1.0.0"
    inherits "~2.0.3"


@@ 619,6 615,15 @@ readable-stream@^2.0.2, readable-stream@^2.3.3, readable-stream@^2.3.6:
    string_decoder "~1.1.1"
    util-deprecate "~1.0.1"

readable-stream@^3.6.0:
  version "3.6.0"
  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
  integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
  dependencies:
    inherits "^2.0.3"
    string_decoder "^1.1.1"
    util-deprecate "^1.0.1"

readline-sync@^1.4.7:
  version "1.4.10"
  resolved "https://registry.yarnpkg.com/readline-sync/-/readline-sync-1.4.10.tgz#41df7fbb4b6312d673011594145705bf56d8873b"


@@ 632,10 637,10 @@ ripemd160@^2.0.0, ripemd160@^2.0.1:
    hash-base "^3.0.0"
    inherits "^2.0.1"

safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0:
  version "5.2.0"
  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519"
  integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==
safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0:
  version "5.2.1"
  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
  integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==

safe-buffer@~5.1.0, safe-buffer@~5.1.1:
  version "5.1.2"


@@ 668,20 673,19 @@ sha.js@^2.4.0, sha.js@^2.4.8:
    inherits "^2.0.1"
    safe-buffer "^5.0.1"

shadow-cljs-jar@1.3.1:
  version "1.3.1"
  resolved "https://registry.yarnpkg.com/shadow-cljs-jar/-/shadow-cljs-jar-1.3.1.tgz#a5f8ab7664b40e11345837e4c6bce8e0ac9b2cc3"
  integrity sha512-IJSm4Gfu/wWDsOQ0wNrSxuaGdjzsd78us+3bop3cpWsoO2Igdu6VIBItYrZHRRBKl5LIZKXfnSh/2eWG3C1EFw==
shadow-cljs-jar@1.3.2:
  version "1.3.2"
  resolved "https://registry.yarnpkg.com/shadow-cljs-jar/-/shadow-cljs-jar-1.3.2.tgz#97273afe1747b6a2311917c1c88d9e243c81957b"
  integrity sha512-XmeffAZHv8z7451kzeq9oKh8fh278Ak+UIOGGrapyqrFBB773xN8vMQ3O7J7TYLnb9BUwcqadKkmgaq7q6fhZg==

shadow-cljs@^2.8.76:
  version "2.8.76"
  resolved "https://registry.yarnpkg.com/shadow-cljs/-/shadow-cljs-2.8.76.tgz#241a1a5856976887171df3470a66ea7d2fd6e3a8"
  integrity sha512-xh2KwuvUhzlQHuL/y0h5zxVmCMalLg9rMiaYW7LwhDJ0x6QAzbuMIsRNVsoPneXVl7Z81FARi2ie3wzizWbzWA==
shadow-cljs@2.10.5:
  version "2.10.5"
  resolved "https://registry.yarnpkg.com/shadow-cljs/-/shadow-cljs-2.10.5.tgz#f9210dee5db369c677e9fc1bd77f6ddd39232bc9"
  integrity sha512-2FpUZ1DKax2Fpz7amLxSAFVx/GuHH4NAyQsw6meVccYTTzoHz0vqmRVReIVNaQu3qFQV2PDq++aEKYJVCz79wg==
  dependencies:
    mkdirp "^0.5.1"
    node-libs-browser "^2.0.0"
    readline-sync "^1.4.7"
    shadow-cljs-jar "1.3.1"
    shadow-cljs-jar "1.3.2"
    source-map-support "^0.4.15"
    which "^1.3.1"
    ws "^3.0.0"


@@ 717,7 721,7 @@ stream-http@^2.7.2:
    to-arraybuffer "^1.0.0"
    xtend "^4.0.0"

string_decoder@^1.0.0:
string_decoder@^1.0.0, string_decoder@^1.1.1:
  version "1.3.0"
  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
  integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==


@@ 766,7 770,7 @@ url@^0.11.0:
    punycode "1.3.2"
    querystring "0.2.0"

util-deprecate@~1.0.1:
util-deprecate@^1.0.1, util-deprecate@~1.0.1:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
  integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=