Skip to content

Commit 6f5f47a

Browse files
committed
fix: show spinner while installing
1 parent e849398 commit 6f5f47a

File tree

5 files changed

+195
-23
lines changed

5 files changed

+195
-23
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
},
4747
"dependencies": {
4848
"chalk": "^3.0.0",
49+
"ora": "^4.0.3",
4950
"semver": "^6.3.0",
5051
"shelljs": "^0.8.3"
5152
},

src/create_cljs_app/lib.cljs

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
(ns create-cljs-app.lib
2-
(:require [create-cljs-app.template :refer [use-template]]
2+
(:require [cljs.core.async :refer [take!]]
3+
[create-cljs-app.template :refer [use-template]]
34
[create-cljs-app.utils :refer
45
[exit-with-reason get-commands has-java? should-use-git? should-use-yarn?
5-
is-supported-node?]]
6+
is-supported-node? silent-install]]
67
[create-cljs-app.messages :refer
78
[begin-msg done-msg init-git-msg install-packages-msg java-warning
89
node-error]]
@@ -31,20 +32,23 @@
3132
(use-template abs-path name commands)
3233
(.chdir js/process path)
3334
(install-packages-msg)
34-
(exec (if use-yarn "yarn" "npm install"))
35-
(when use-git
36-
(let [exec-options #js {:silent true :fatal true}]
37-
(try
38-
(exec "git init" exec-options)
39-
(exec "git add -A" exec-options)
40-
(exec
41-
"git commit -m \"Initial commit from Create CLJS App\""
42-
exec-options)
43-
(init-git-msg)
44-
; Catch and remove the .git directory to not leave it
45-
; half-done.
46-
(catch js/Object _e (rm "-rf" ".git")))))
47-
(when (not (has-java?)) (java-warning))
48-
(done-msg name path abs-path commands)))))
35+
(take!
36+
(silent-install commands)
37+
(fn [code]
38+
(let [install-failed? (not= code 0)]
39+
(when use-git
40+
(let [exec-options #js {:silent true :fatal true}]
41+
(try
42+
(exec "git init" exec-options)
43+
(exec "git add -A" exec-options)
44+
(exec
45+
"git commit -m \"Initial commit from Create CLJS App\""
46+
exec-options)
47+
(init-git-msg)
48+
; Catch and remove the .git directory to not leave it
49+
; half-done.
50+
(catch js/Object _e (rm "-rf" ".git")))))
51+
(when (not (has-java?)) (java-warning))
52+
(done-msg name path abs-path commands install-failed?))))))))
4953

5054
(def exports #js {:create create})

src/create_cljs_app/messages.cljs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
(.log js/console "\nInitialized a git repository."))
1212

1313
(defn done-msg
14-
[name path abs-path commands]
14+
[name path abs-path commands install-failed?]
1515
(.log
1616
js/console
1717
(str
@@ -30,7 +30,8 @@ Inside that directory, you can run several commands:
3030
We suggest that you begin by typing:
3131
3232
" (blue (str "cd " path)) "
33-
" (blue (:start commands)) "
33+
" (when install-failed? (str (blue (:install commands)) "\n "))
34+
(blue (:start commands)) "
3435
3536
Happy hacking!
3637
")))

src/create_cljs_app/utils.cljs

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
(ns create-cljs-app.utils
2-
(:require ["chalk" :refer [red]]
2+
(:require [cljs.core.async :refer [go chan <! put!]]
3+
["chalk" :refer [red]]
34
["semver" :refer [coerce satisfies]]
4-
["shelljs" :refer [which]]))
5+
["ora" :as ora]
6+
["shelljs" :refer [exec which]]))
57

68
(defn exit-with-reason
79
"Show a message in red in the error stream, then exit with code 1."
@@ -12,7 +14,8 @@
1214
(defn get-commands
1315
[use-yarn]
1416
(if use-yarn
15-
{:start "yarn start"
17+
{:install "yarn"
18+
:start "yarn start"
1619
:cards "yarn cards"
1720
:server "yarn server"
1821
:build "yarn build"
@@ -22,7 +25,8 @@
2225
:lint "yarn lint"
2326
:report "yarn report"
2427
:format "yarn format"}
25-
{:start "npm start"
28+
{:install "npm install"
29+
:start "npm start"
2630
:cards "npm run cards"
2731
:server "npm run server"
2832
:build "npm run build"
@@ -42,3 +46,21 @@
4246
(defn has-java? [] (has-binary-on-PATH? "java"))
4347

4448
(defn is-supported-node? [version] (satisfies (coerce version) ">=10.12.0"))
49+
50+
(defn silent-install
51+
"Asynchronously install npm packages while showing a spinner.
52+
Returns a channel that contains will receive the exit code.
53+
Must be asynchronous otherwise the spinner would not spin."
54+
[commands]
55+
(let [command (:install commands)
56+
spinner (.start (ora "Installing packages..."))
57+
c (chan)]
58+
; Note: put! must be used instead of >! because go block analysis stops at
59+
; function boundaries
60+
; https://github.com/clojure/core.async/wiki/Go-Block-Best-Practices#unsupported-constructs-and-other-limitations-in-go-blocks
61+
(go (exec command #js {:silent true} #(put! c %))
62+
(let [code (<! c)]
63+
(if (= code 0)
64+
(.succeed spinner "Packages installed successfully.")
65+
(.fail spinner (str "Package install failed, please run '" command "' in the app folder.")))
66+
code))))

yarn.lock

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,18 @@ ajv@^6.5.5:
3333
json-schema-traverse "^0.4.1"
3434
uri-js "^4.2.2"
3535

36+
ansi-regex@^5.0.0:
37+
version "5.0.0"
38+
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
39+
integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
40+
41+
ansi-styles@^3.2.1:
42+
version "3.2.1"
43+
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
44+
integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
45+
dependencies:
46+
color-convert "^1.9.0"
47+
3648
ansi-styles@^4.1.0:
3749
version "4.1.0"
3850
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.1.0.tgz#d3ba8047b818293eaaa7978321dd61bff9842cfc"
@@ -250,6 +262,15 @@ chainsaw@~0.1.0:
250262
dependencies:
251263
traverse ">=0.3.0 <0.4"
252264

265+
chalk@^2.4.2:
266+
version "2.4.2"
267+
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
268+
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
269+
dependencies:
270+
ansi-styles "^3.2.1"
271+
escape-string-regexp "^1.0.5"
272+
supports-color "^5.3.0"
273+
253274
chalk@^3.0.0:
254275
version "3.0.0"
255276
resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4"
@@ -271,6 +292,18 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
271292
inherits "^2.0.1"
272293
safe-buffer "^5.0.1"
273294

295+
cli-cursor@^3.1.0:
296+
version "3.1.0"
297+
resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307"
298+
integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==
299+
dependencies:
300+
restore-cursor "^3.1.0"
301+
302+
cli-spinners@^2.2.0:
303+
version "2.2.0"
304+
resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.2.0.tgz#e8b988d9206c692302d8ee834e7a85c0144d8f77"
305+
integrity sha512-tgU3fKwzYjiLEQgPMD9Jt+JjHVL9kW93FiIMX/l7rivvOD4/LL0Mf7gda3+4U2KJBloybwgj5KEoQgGRioMiKQ==
306+
274307
clj-kondo@2019.11.23:
275308
version "2019.11.23"
276309
resolved "https://registry.yarnpkg.com/clj-kondo/-/clj-kondo-2019.11.23.tgz#c892c593c86090f187694936973991c6a955e7fd"
@@ -279,13 +312,30 @@ clj-kondo@2019.11.23:
279312
binwrap "^0.2.2"
280313
request "^2.88.0"
281314

315+
clone@^1.0.2:
316+
version "1.0.4"
317+
resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
318+
integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4=
319+
320+
color-convert@^1.9.0:
321+
version "1.9.3"
322+
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
323+
integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
324+
dependencies:
325+
color-name "1.1.3"
326+
282327
color-convert@^2.0.1:
283328
version "2.0.1"
284329
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
285330
integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
286331
dependencies:
287332
color-name "~1.1.4"
288333

334+
color-name@1.1.3:
335+
version "1.1.3"
336+
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
337+
integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
338+
289339
color-name@~1.1.4:
290340
version "1.1.4"
291341
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
@@ -385,6 +435,13 @@ date-now@^0.1.4:
385435
resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
386436
integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=
387437

438+
defaults@^1.0.3:
439+
version "1.0.3"
440+
resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d"
441+
integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=
442+
dependencies:
443+
clone "^1.0.2"
444+
388445
delayed-stream@~1.0.0:
389446
version "1.0.0"
390447
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
@@ -438,6 +495,11 @@ es6-object-assign@^1.0.3:
438495
resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c"
439496
integrity sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=
440497

498+
escape-string-regexp@^1.0.5:
499+
version "1.0.5"
500+
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
501+
integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
502+
441503
events@^3.0.0:
442504
version "3.0.0"
443505
resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88"
@@ -566,6 +628,11 @@ har-validator@~5.1.0:
566628
ajv "^6.5.5"
567629
har-schema "^2.0.0"
568630

631+
has-flag@^3.0.0:
632+
version "3.0.0"
633+
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
634+
integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
635+
569636
has-flag@^4.0.0:
570637
version "4.0.0"
571638
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
@@ -655,6 +722,11 @@ is-glob@^4.0.1:
655722
dependencies:
656723
is-extglob "^2.1.1"
657724

725+
is-interactive@^1.0.0:
726+
version "1.0.0"
727+
resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e"
728+
integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==
729+
658730
is-number@^7.0.0:
659731
version "7.0.0"
660732
resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
@@ -715,6 +787,13 @@ lodash@^4.17.11:
715787
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
716788
integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
717789

790+
log-symbols@^3.0.0:
791+
version "3.0.0"
792+
resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4"
793+
integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==
794+
dependencies:
795+
chalk "^2.4.2"
796+
718797
md5.js@^1.3.4:
719798
version "1.3.5"
720799
resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
@@ -757,6 +836,11 @@ mime-types@^2.1.12, mime-types@~2.1.19:
757836
dependencies:
758837
mime-db "1.40.0"
759838

839+
mimic-fn@^2.1.0:
840+
version "2.1.0"
841+
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
842+
integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
843+
760844
minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
761845
version "1.0.1"
762846
resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
@@ -811,6 +895,11 @@ mustache@^3.0.1:
811895
resolved "https://registry.yarnpkg.com/mustache/-/mustache-3.1.0.tgz#9fba26e7aefc5709f07ff585abb7e0abced6c372"
812896
integrity sha512-3Bxq1R5LBZp7fbFPZzFe5WN4s0q3+gxZaZuZVY+QctYJiCiVgXHOTIC0/HgZuOPFt/6BQcx5u0H2CUOxT/RoGQ==
813897

898+
mute-stream@0.0.8:
899+
version "0.0.8"
900+
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
901+
integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
902+
814903
node-libs-browser@^2.0.0:
815904
version "2.2.1"
816905
resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425"
@@ -857,6 +946,27 @@ once@^1.3.0:
857946
dependencies:
858947
wrappy "1"
859948

949+
onetime@^5.1.0:
950+
version "5.1.0"
951+
resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5"
952+
integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==
953+
dependencies:
954+
mimic-fn "^2.1.0"
955+
956+
ora@^4.0.3:
957+
version "4.0.3"
958+
resolved "https://registry.yarnpkg.com/ora/-/ora-4.0.3.tgz#752a1b7b4be4825546a7a3d59256fa523b6b6d05"
959+
integrity sha512-fnDebVFyz309A73cqCipVL1fBZewq4vwgSHfxh43vVy31mbyoQ8sCH3Oeaog/owYOs/lLlGVPCISQonTneg6Pg==
960+
dependencies:
961+
chalk "^3.0.0"
962+
cli-cursor "^3.1.0"
963+
cli-spinners "^2.2.0"
964+
is-interactive "^1.0.0"
965+
log-symbols "^3.0.0"
966+
mute-stream "0.0.8"
967+
strip-ansi "^6.0.0"
968+
wcwidth "^1.0.1"
969+
860970
os-browserify@^0.3.0:
861971
version "0.3.0"
862972
resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
@@ -1062,6 +1172,14 @@ resolve@^1.1.6:
10621172
dependencies:
10631173
path-parse "^1.0.6"
10641174

1175+
restore-cursor@^3.1.0:
1176+
version "3.1.0"
1177+
resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e"
1178+
integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==
1179+
dependencies:
1180+
onetime "^5.1.0"
1181+
signal-exit "^3.0.2"
1182+
10651183
reusify@^1.0.0:
10661184
version "1.0.4"
10671185
resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
@@ -1149,6 +1267,11 @@ shx@^0.3.2:
11491267
minimist "^1.2.0"
11501268
shelljs "^0.8.1"
11511269

1270+
signal-exit@^3.0.2:
1271+
version "3.0.2"
1272+
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
1273+
integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=
1274+
11521275
source-map-support@^0.4.15:
11531276
version "0.4.18"
11541277
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
@@ -1214,6 +1337,20 @@ string_decoder@~1.1.1:
12141337
dependencies:
12151338
safe-buffer "~5.1.0"
12161339

1340+
strip-ansi@^6.0.0:
1341+
version "6.0.0"
1342+
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
1343+
integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
1344+
dependencies:
1345+
ansi-regex "^5.0.0"
1346+
1347+
supports-color@^5.3.0:
1348+
version "5.5.0"
1349+
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
1350+
integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
1351+
dependencies:
1352+
has-flag "^3.0.0"
1353+
12171354
supports-color@^7.1.0:
12181355
version "7.1.0"
12191356
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1"
@@ -1357,6 +1494,13 @@ vm-browserify@^1.0.1:
13571494
resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.0.tgz#bd76d6a23323e2ca8ffa12028dc04559c75f9019"
13581495
integrity sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==
13591496

1497+
wcwidth@^1.0.1:
1498+
version "1.0.1"
1499+
resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"
1500+
integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=
1501+
dependencies:
1502+
defaults "^1.0.3"
1503+
13601504
which@^1.3.1:
13611505
version "1.3.1"
13621506
resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"

0 commit comments

Comments
 (0)