From 920ffc0d8656aed840c24274ffe0d2da8510cb9a Mon Sep 17 00:00:00 2001 From: Chris Smothers Date: Thu, 13 May 2021 11:20:33 -0700 Subject: [PATCH 01/20] docs(datalog-console): add datalog-console docs (#101) --- README.md | 8 ++++++++ docs/0675|Debugging.md | 8 ++++++++ examples/counter/package.json | 2 +- examples/counter/yarn.lock | 8 ++++---- examples/roam/package.json | 2 +- examples/roam/yarn.lock | 8 ++++---- examples/todo/package.json | 2 +- examples/todo/yarn.lock | 8 ++++---- examples/typescript-firebase-todo/package.json | 2 +- examples/typescript-firebase-todo/yarn.lock | 8 ++++---- public/images/datalog_console.png | Bin 0 -> 106173 bytes 11 files changed, 36 insertions(+), 20 deletions(-) create mode 100644 public/images/datalog_console.png diff --git a/README.md b/README.md index af7c03d2..1927a2b7 100644 --- a/README.md +++ b/README.md @@ -224,6 +224,14 @@ If you develop with [Chrome](https://www.google.com/chrome/) or a Chromium brows **Remember**: for custom formatters to work `console.log(anEntity)` must be called *after* you open the chrome console. Anything logged out before you open the console will not have custom formatting applied because chrome processes those logs in the background. +### Datalog Console Extension + +We also integrate with the [Datalog Console](https://github.com/homebaseio/datalog-console) extension. + +image of datalog console extension + +It's still in an early stage of development, but we seek to expose all common DB administration capabilities here and let you connect to any Datalog database that implements the console's interface. + ### *DEPRECATED* `_recentlyTouchedAttributes` *Use [custom chrome formatters](#custom-chrome-formatters) instead.* diff --git a/docs/0675|Debugging.md b/docs/0675|Debugging.md index da407ec7..16c8f1e5 100644 --- a/docs/0675|Debugging.md +++ b/docs/0675|Debugging.md @@ -30,6 +30,14 @@ If you develop with [Chrome](https://www.google.com/chrome/) or a Chromium brows **Remember**: for custom formatters to work `console.log(anEntity)` must be called *after* you open the chrome console. Anything logged out before you open the console will not have custom formatting applied because chrome processes those logs in the background. +### Datalog Console Extension + +We also integrate with the [Datalog Console](https://github.com/homebaseio/datalog-console) extension. + +![image of datalog console extension](https://github.com/homebaseio/homebase-react/blob/master/public/images/datalog_console.png?raw=true) + +It's still in an early stage of development, but we seek to expose all common DB administration capabilities here and let you connect to any Datalog database that implements the console's interface. + ### DEPRECATED `_recentlyTouchedAttributes` *Use [custom chrome formatters](#custom-chrome-formatters) instead.* diff --git a/examples/counter/package.json b/examples/counter/package.json index 8727f493..fe9c5781 100644 --- a/examples/counter/package.json +++ b/examples/counter/package.json @@ -6,7 +6,7 @@ "@testing-library/jest-dom": "^5.11.4", "@testing-library/react": "^11.1.0", "@testing-library/user-event": "^12.1.10", - "homebase-react": "^0.5.4", + "homebase-react": "^0.7.0", "react": "^17.0.1", "react-dom": "^17.0.1", "react-scripts": "4.0.0", diff --git a/examples/counter/yarn.lock b/examples/counter/yarn.lock index 8f964da5..230d933e 100644 --- a/examples/counter/yarn.lock +++ b/examples/counter/yarn.lock @@ -5344,10 +5344,10 @@ hmac-drbg@^1.0.1: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -homebase-react@^0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/homebase-react/-/homebase-react-0.5.4.tgz#b6c31ebb2c8852503c752ed81a010b104b9cd751" - integrity sha512-7TRm3ofQVRjc94PuVpT8UtFTD42L3ULC5o7fPrnY/7pYOBupU2pgGmV6upYmTf/WWK8T5wlcDtKl6OnBhbJnfw== +homebase-react@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/homebase-react/-/homebase-react-0.7.0.tgz#84b00ba9a81c9d13242672ba64c7579c7269ca7e" + integrity sha512-/UEpSFed4/opBx7eJ7DY+WjC4jWEcorSehjYooKntE+YMaQkzbM7fEnqOOPZCTGJtNVrfP1vyJ8URT+vG76a2g== hoopy@^0.1.4: version "0.1.4" diff --git a/examples/roam/package.json b/examples/roam/package.json index 59739bf8..e632946b 100644 --- a/examples/roam/package.json +++ b/examples/roam/package.json @@ -14,7 +14,7 @@ "autoprefixer": "^9", "firebase": "^8.2.6", "firebaseui": "^4.7.3", - "homebase-react": "^0.5.4", + "homebase-react": "^0.7.0", "lodash": "^4.17.20", "nanoid": "^3.1.20", "postcss": "^7", diff --git a/examples/roam/yarn.lock b/examples/roam/yarn.lock index da1aa81d..5c0d0487 100644 --- a/examples/roam/yarn.lock +++ b/examples/roam/yarn.lock @@ -6298,10 +6298,10 @@ hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.1.0: dependencies: react-is "^16.7.0" -homebase-react@^0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/homebase-react/-/homebase-react-0.5.4.tgz#b6c31ebb2c8852503c752ed81a010b104b9cd751" - integrity sha512-7TRm3ofQVRjc94PuVpT8UtFTD42L3ULC5o7fPrnY/7pYOBupU2pgGmV6upYmTf/WWK8T5wlcDtKl6OnBhbJnfw== +homebase-react@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/homebase-react/-/homebase-react-0.7.0.tgz#84b00ba9a81c9d13242672ba64c7579c7269ca7e" + integrity sha512-/UEpSFed4/opBx7eJ7DY+WjC4jWEcorSehjYooKntE+YMaQkzbM7fEnqOOPZCTGJtNVrfP1vyJ8URT+vG76a2g== hoopy@^0.1.4: version "0.1.4" diff --git a/examples/todo/package.json b/examples/todo/package.json index 0f8eb4d0..88028f81 100644 --- a/examples/todo/package.json +++ b/examples/todo/package.json @@ -6,7 +6,7 @@ "@testing-library/jest-dom": "^5.11.4", "@testing-library/react": "^11.1.0", "@testing-library/user-event": "^12.1.10", - "homebase-react": "^0.5.4", + "homebase-react": "^0.7.0", "react": "^17.0.1", "react-dom": "^17.0.1", "react-scripts": "4.0.0", diff --git a/examples/todo/yarn.lock b/examples/todo/yarn.lock index a1875dc6..0ce64ef7 100644 --- a/examples/todo/yarn.lock +++ b/examples/todo/yarn.lock @@ -5348,10 +5348,10 @@ hmac-drbg@^1.0.1: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -homebase-react@^0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/homebase-react/-/homebase-react-0.5.4.tgz#b6c31ebb2c8852503c752ed81a010b104b9cd751" - integrity sha512-7TRm3ofQVRjc94PuVpT8UtFTD42L3ULC5o7fPrnY/7pYOBupU2pgGmV6upYmTf/WWK8T5wlcDtKl6OnBhbJnfw== +homebase-react@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/homebase-react/-/homebase-react-0.7.0.tgz#84b00ba9a81c9d13242672ba64c7579c7269ca7e" + integrity sha512-/UEpSFed4/opBx7eJ7DY+WjC4jWEcorSehjYooKntE+YMaQkzbM7fEnqOOPZCTGJtNVrfP1vyJ8URT+vG76a2g== hoopy@^0.1.4: version "0.1.4" diff --git a/examples/typescript-firebase-todo/package.json b/examples/typescript-firebase-todo/package.json index 3d4902c9..9e5ce36b 100644 --- a/examples/typescript-firebase-todo/package.json +++ b/examples/typescript-firebase-todo/package.json @@ -12,7 +12,7 @@ "@types/react-dom": "^16.9.8", "firebase": "^8.1.1", "firebaseui": "^4.7.1", - "homebase-react": "^0.5.4", + "homebase-react": "^0.7.0", "react": "^17.0.1", "react-dom": "^17.0.1", "react-scripts": "4.0.0", diff --git a/examples/typescript-firebase-todo/yarn.lock b/examples/typescript-firebase-todo/yarn.lock index 57da630c..be7a51c9 100644 --- a/examples/typescript-firebase-todo/yarn.lock +++ b/examples/typescript-firebase-todo/yarn.lock @@ -5821,10 +5821,10 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -homebase-react@^0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/homebase-react/-/homebase-react-0.5.4.tgz#b6c31ebb2c8852503c752ed81a010b104b9cd751" - integrity sha512-7TRm3ofQVRjc94PuVpT8UtFTD42L3ULC5o7fPrnY/7pYOBupU2pgGmV6upYmTf/WWK8T5wlcDtKl6OnBhbJnfw== +homebase-react@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/homebase-react/-/homebase-react-0.7.0.tgz#84b00ba9a81c9d13242672ba64c7579c7269ca7e" + integrity sha512-/UEpSFed4/opBx7eJ7DY+WjC4jWEcorSehjYooKntE+YMaQkzbM7fEnqOOPZCTGJtNVrfP1vyJ8URT+vG76a2g== hoopy@^0.1.4: version "0.1.4" diff --git a/public/images/datalog_console.png b/public/images/datalog_console.png new file mode 100644 index 0000000000000000000000000000000000000000..b20eb8877807817863e6a321aba092d71a1d1762 GIT binary patch literal 106173 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

H@#zO1>RUAFnCkdPqVt>UnlY203q1=GUuv z*7UBA@QHp$3{#}i&kbV!+rXT2Kh#JtY%nRyogVq45t&4ot!-><--TEhy-cCW_eHSp zoMM(x#860>!5u-3 zUuGeP(a`|fy8+=Nhsm`R^KaqxFHq@7o;nn47(;DzyTAyyboFUq$=zi> z&h!_4fKHAb|EZ+>m-;~VUk|ie+TSMTunR|!!`ITOX=fLqMOq!~R?tZIM(l8)QYs*8 zd9IQE;3UgUc-8;+;jar#W362@p4;>_#v%%bSO2zCzGpBc-$p3vJbSI+-M!-~1T#Xf zCVab&p8MBUg2#Xnk;x%YqUjl^fWyFE*#m9h?t|Hf$n{hl2@Uc(aT$?K)Q3MU?oQdX z_p?L<+sMO-nUVD?DX565r?WeJ^WLv_pDlr)Uht7309coZt?lc7ycf88oX1nlph}T@ z+xqV_{?Du6UgF)fxPkg5pNyhQ|8X>!(Htr@Gax|`jw3P8lwP~pg!ex$@b_~|Gvm>s z>J;@eRWqp2oxL=BXJ_x}5)tgs#nx;-0#EJV#p4J5^An#2$s)IgRSFfl_WyX5SIi@{ zmtAfh%6vi>6^4UY{@;hcJU(RD906nPYRX>T{{1Svy(gnNuGWw)YK&~Xk4CDk3m5M5 z%K}96?}JhaY6#FBnN06B^#4vKuDQqll@DRb9~|6!_5B|U?ayNJdfT2L!N0b(*I|3AJqoGfLDy7U#QS`E|uJ`PXT zUXTBL77;5*bk!575?gxrsY3UisPoJtFyDU*NK7kx)=LN~e+vX43G_{FwYW($X+!)W zwbGf{OMg$Y#4EOuBRx!rOc^Cwy=>{3n;+hWN<5&F2UPY!Nkct+<0L+GpqFuAmG76v zf8QUj%@nx;vo6^wbpC%IdlrgNL?w*Tv4VIm34@YWzoGx{yzKu$EzVnTEF-!MshYpT z{xXXY8C1Ajh1@efkoa^33@lik$?PH4Zh>JZ|Gd1s%H?)NH4mX#@xNbS=PH(V2mg!) zz_)Mmou-~R<|meY=q*upP0&6GAMUe&7_LUXPEUOe z3?Q8F0xEj~M9;t#c7P5UF+#~)G_q)B`#kY350Y-?%FVZo{e2us5 zSja_iH1ye#-%&{6!`L3VX;ZX*P>b1o@nqv3HwWKU9M5$f60Br*RI=LJxS6`yp*Q-g z16Bs7x6gjQ0vmL?#DT0{RUbL;7N3T|*Zcokp7}I!O~;Ln)T`Te-{&|6+n&&d)*k}gDl|6u1&O|tN{yu Date: Thu, 13 May 2021 14:23:34 -0400 Subject: [PATCH 02/20] docs: update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1927a2b7..67c99e9a 100644 --- a/README.md +++ b/README.md @@ -228,7 +228,7 @@ If you develop with [Chrome](https://www.google.com/chrome/) or a Chromium brows We also integrate with the [Datalog Console](https://github.com/homebaseio/datalog-console) extension. -image of datalog console extension +image of datalog console extension It's still in an early stage of development, but we seek to expose all common DB administration capabilities here and let you connect to any Datalog database that implements the console's interface. From 60096a0b371893c67863158c818cb4da12d797b4 Mon Sep 17 00:00:00 2001 From: Chris Smothers Date: Tue, 18 May 2021 12:22:44 -0400 Subject: [PATCH 03/20] docs(readme): add link to chrome store --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 67c99e9a..2c657c08 100644 --- a/README.md +++ b/README.md @@ -232,6 +232,11 @@ We also integrate with the [Datalog Console](https://github.com/homebaseio/datal It's still in an early stage of development, but we seek to expose all common DB administration capabilities here and let you connect to any Datalog database that implements the console's interface. +#### Using the Datalog Console + +1. [Add the extension to Chrome](https://chrome.google.com/webstore/detail/datalog-console/cfgbajnnabfanfdkhpdhndegpmepnlmb) +2. Vist a page built with homebase-react [like this one](https://homebaseio.github.io/homebase-react/#!/dev.example.todo), open the inspector, click the `Datalog DB` tab, and click `Load database` to try it out + ### *DEPRECATED* `_recentlyTouchedAttributes` *Use [custom chrome formatters](#custom-chrome-formatters) instead.* From 87f37f47ee5495a4165f0dc5218018bd1ef5ff2d Mon Sep 17 00:00:00 2001 From: Chris Smothers Date: Tue, 18 May 2021 12:23:37 -0400 Subject: [PATCH 04/20] docs: add link to chrome store --- docs/0675|Debugging.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/0675|Debugging.md b/docs/0675|Debugging.md index 16c8f1e5..ad3219dd 100644 --- a/docs/0675|Debugging.md +++ b/docs/0675|Debugging.md @@ -38,6 +38,11 @@ We also integrate with the [Datalog Console](https://github.com/homebaseio/datal It's still in an early stage of development, but we seek to expose all common DB administration capabilities here and let you connect to any Datalog database that implements the console's interface. +#### Using the Datalog Console + +1. [Add the extension to Chrome](https://chrome.google.com/webstore/detail/datalog-console/cfgbajnnabfanfdkhpdhndegpmepnlmb) +2. Vist a page built with homebase-react [like this one](https://homebaseio.github.io/homebase-react/#!/dev.example.todo), open the inspector, click the `Datalog DB` tab, and click `Load database` to try it out + ### DEPRECATED `_recentlyTouchedAttributes` *Use [custom chrome formatters](#custom-chrome-formatters) instead.* @@ -48,4 +53,4 @@ If you set `debug` to `true` in your configuration, you will be able to access t -``` \ No newline at end of file +``` From 72730be7922d17d1a7de5584898496ee6ef833b1 Mon Sep 17 00:00:00 2001 From: Chris Smothers Date: Tue, 18 May 2021 16:48:20 -0400 Subject: [PATCH 05/20] build: update datalog-console sha to main (#102) --- deps.edn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps.edn b/deps.edn index dc208ad8..7fcb3c8b 100644 --- a/deps.edn +++ b/deps.edn @@ -5,6 +5,6 @@ reagent/reagent {:mvn/version "1.0.0-alpha2"} inflections/inflections {:mvn/version "0.13.2"} binaryage/devtools {:mvn/version "1.0.2"} - homebaseio/datalog-console {:git/url "https://github.com/homebaseio/datalog-console" :sha "91d5b6009d66807ceec9807a1f8ed099a0a6f219"} + homebaseio/datalog-console {:git/url "https://github.com/homebaseio/datalog-console" :sha "97d5e5eb8994124ec8dc0029b33f2e88257b39b2"} ;; homebaseio/datalog-console {:local/root "../datalog-console"} camel-snake-kebab/camel-snake-kebab {:mvn/version "0.4.2"}}} From 439d11c1a121aec3e5b75dce2ea60808a01a8567 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 May 2021 13:06:33 -0700 Subject: [PATCH 06/20] build(deps): bump react-dev-utils in /examples/todo (#76) Bumps [react-dev-utils](https://github.com/facebook/create-react-app/tree/HEAD/packages/react-dev-utils) from 11.0.0 to 11.0.4. - [Release notes](https://github.com/facebook/create-react-app/releases) - [Changelog](https://github.com/facebook/create-react-app/blob/master/CHANGELOG-1.x.md) - [Commits](https://github.com/facebook/create-react-app/commits/HEAD/packages/react-dev-utils) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Chris Smothers --- examples/todo/yarn.lock | 537 ++++++++++++++++++---------------------- 1 file changed, 242 insertions(+), 295 deletions(-) diff --git a/examples/todo/yarn.lock b/examples/todo/yarn.lock index 0ce64ef7..c84067f0 100644 --- a/examples/todo/yarn.lock +++ b/examples/todo/yarn.lock @@ -2,13 +2,20 @@ # yarn lockfile v1 -"@babel/code-frame@7.10.4", "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.5.5": +"@babel/code-frame@7.10.4": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== dependencies: "@babel/highlight" "^7.10.4" +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.5.5": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" + integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g== + dependencies: + "@babel/highlight" "^7.12.13" + "@babel/compat-data@^7.12.1", "@babel/compat-data@^7.12.5": version "7.12.5" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.5.tgz" @@ -239,6 +246,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz" integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== +"@babel/helper-validator-identifier@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" + integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== + "@babel/helper-validator-option@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz" @@ -263,12 +275,12 @@ "@babel/traverse" "^7.12.5" "@babel/types" "^7.12.5" -"@babel/highlight@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz" - integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== +"@babel/highlight@^7.10.4", "@babel/highlight@^7.12.13": + version "7.13.10" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.13.10.tgz#a8b2a66148f5b27d666b15d81774347a731d52d1" + integrity sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg== dependencies: - "@babel/helper-validator-identifier" "^7.10.4" + "@babel/helper-validator-identifier" "^7.12.11" chalk "^2.0.0" js-tokens "^4.0.0" @@ -1289,25 +1301,25 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" -"@nodelib/fs.scandir@2.1.3": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz" - integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== +"@nodelib/fs.scandir@2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69" + integrity sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA== dependencies: - "@nodelib/fs.stat" "2.0.3" + "@nodelib/fs.stat" "2.0.4" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz" - integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== +"@nodelib/fs.stat@2.0.4", "@nodelib/fs.stat@^2.0.2": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz#a3f2dd61bab43b8db8fa108a121cfffe4c676655" + integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q== "@nodelib/fs.walk@^1.2.3": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz" - integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== + version "1.2.6" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz#cce9396b30aa5afe9e3756608f5831adcb53d063" + integrity sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow== dependencies: - "@nodelib/fs.scandir" "2.1.3" + "@nodelib/fs.scandir" "2.1.4" fastq "^1.6.0" "@npmcli/move-file@^1.0.1": @@ -2047,7 +2059,7 @@ acorn@^7.1.0, acorn@^7.1.1, acorn@^7.4.0: address@1.1.2, address@^1.0.1: version "1.1.2" - resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== adjust-sourcemap-loader@3.0.0: @@ -2125,12 +2137,12 @@ ansi-regex@^4.1.0: ansi-regex@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" @@ -2185,17 +2197,17 @@ arity-n@^1.0.4: arr-diff@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= arr-flatten@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== arr-union@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= array-flatten@1.1.1: @@ -2226,7 +2238,7 @@ array-union@^1.0.1: array-union@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== array-uniq@^1.0.1: @@ -2236,7 +2248,7 @@ array-uniq@^1.0.1: array-unique@^0.3.2: version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= array.prototype.flat@^1.2.3: @@ -2298,7 +2310,7 @@ assert@^1.1.1: assign-symbols@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= ast-types-flow@^0.0.7: @@ -2340,7 +2352,7 @@ at-least-node@^1.0.0: atob@^2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== autoprefixer@^9.6.1: @@ -2542,7 +2554,7 @@ babylon@^6.18.0: balanced-match@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= base64-js@^1.0.2: @@ -2552,7 +2564,7 @@ base64-js@^1.0.2: base@^0.11.1: version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== dependencies: cache-base "^1.0.1" @@ -2587,7 +2599,7 @@ bfj@^7.0.2: big.js@^5.2.2: version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== binary-extensions@^1.0.0: @@ -2657,7 +2669,7 @@ boolbase@^1.0.0, boolbase@~1.0.0: brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -2665,7 +2677,7 @@ brace-expansion@^1.1.7: braces@^2.3.1, braces@^2.3.2: version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== dependencies: arr-flatten "^1.1.0" @@ -2681,7 +2693,7 @@ braces@^2.3.1, braces@^2.3.2: braces@^3.0.1, braces@~3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" @@ -2759,7 +2771,7 @@ browserify-zlib@^0.2.0: browserslist@4.14.2: version "4.14.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.2.tgz" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.2.tgz#1b3cec458a1ba87588cc5e9be62f19b6d48813ce" integrity sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw== dependencies: caniuse-lite "^1.0.30001125" @@ -2875,7 +2887,7 @@ cacache@^15.0.5: cache-base@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== dependencies: collection-visit "^1.0.0" @@ -2948,11 +2960,16 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001125, caniuse-lite@^1.0.30001157: +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001157: version "1.0.30001157" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001157.tgz" integrity sha512-gOerH9Wz2IRZ2ZPdMfBvyOi3cjaz4O4dgNwPGzx8EhqAs4+2IL/O+fJsbt+znSigujoZG8bVcIAUM/I/E5K3MA== +caniuse-lite@^1.0.30001125: + version "1.0.30001204" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001204.tgz#256c85709a348ec4d175e847a3b515c66e79f2aa" + integrity sha512-JUdjWpcxfJ9IPamy2f5JaRDCaqJOxDzOSKtbdx4rH9VivMd1vIzoPumsJa9LoMIi4Fx2BV2KZOxWhNkBjaYivQ== + capture-exit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz" @@ -2972,7 +2989,7 @@ caseless@~0.12.0: chalk@2.4.2, chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" @@ -3000,11 +3017,6 @@ char-regex@^1.0.2: resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - check-types@^11.1.1: version "11.1.2" resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.1.2.tgz" @@ -3081,7 +3093,7 @@ cjs-module-lexer@^0.6.0: class-utils@^0.3.5: version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== dependencies: arr-union "^3.1.0" @@ -3101,18 +3113,6 @@ clean-stack@^2.0.0: resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-width@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz" - integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== - cliui@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz" @@ -3172,7 +3172,7 @@ collect-v8-coverage@^1.0.0: collection-visit@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= dependencies: map-visit "^1.0.0" @@ -3180,7 +3180,7 @@ collection-visit@^1.0.0: color-convert@^1.9.0, color-convert@^1.9.1: version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" @@ -3194,7 +3194,7 @@ color-convert@^2.0.1: color-name@1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= color-name@^1.0.0, color-name@~1.1.4: @@ -3252,7 +3252,7 @@ commondir@^1.0.1: component-emitter@^1.2.1: version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== compose-function@3.0.3: @@ -3284,7 +3284,7 @@ compression@^1.7.4: concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= concat-stream@^1.5.0: @@ -3370,7 +3370,7 @@ copy-concurrently@^1.0.0: copy-descriptor@^0.1.0: version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= core-js-compat@^3.6.2: @@ -3797,7 +3797,7 @@ decimal.js@^10.2.0: decode-uri-component@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= dedent@^0.7.0: @@ -3844,21 +3844,21 @@ define-properties@^1.1.2, define-properties@^1.1.3: define-property@^0.2.5: version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= dependencies: is-descriptor "^0.1.0" define-property@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= dependencies: is-descriptor "^1.0.0" define-property@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== dependencies: is-descriptor "^1.0.2" @@ -3912,7 +3912,7 @@ detect-node@^2.0.4: detect-port-alt@1.1.6: version "1.1.6" - resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz" + resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== dependencies: address "^1.0.1" @@ -3934,7 +3934,7 @@ diffie-hellman@^5.0.0: dir-glob@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: path-type "^4.0.0" @@ -4073,7 +4073,7 @@ dotenv@8.2.0: duplexer@^0.1.1: version "0.1.2" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== duplexify@^3.4.2, duplexify@^3.6.0: @@ -4104,7 +4104,12 @@ ejs@^2.6.1: resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz" integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== -electron-to-chromium@^1.3.564, electron-to-chromium@^1.3.591: +electron-to-chromium@^1.3.564: + version "1.3.693" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.693.tgz#5089c506a925c31f93fcb173a003a22e341115dd" + integrity sha512-vUdsE8yyeu30RecppQtI+XTz2++LWLVEIYmzeCaCRLSdtKZ2eXqdJcrs85KwLiPOPVc6PELgWyXBsfqIvzGZag== + +electron-to-chromium@^1.3.591: version "1.3.592" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.592.tgz" integrity sha512-kGNowksvqQiPb1pUSQKpd8JFoGPLxYOwduNRCqCxGh/2Q1qE2JdmwouCW41lUzDxOb/2RIV4lR0tVIfboWlO9A== @@ -4149,7 +4154,7 @@ emojis-list@^2.0.0: emojis-list@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== encodeurl@~1.0.2: @@ -4293,12 +4298,12 @@ escape-html@~1.0.3: escape-string-regexp@2.0.0, escape-string-regexp@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= escodegen@^1.14.1: @@ -4625,7 +4630,7 @@ exit@^0.1.2: expand-brackets@^2.1.4: version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= dependencies: debug "^2.3.3" @@ -4693,14 +4698,14 @@ ext@^1.1.2: extend-shallow@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= dependencies: is-extendable "^0.1.0" extend-shallow@^3.0.0, extend-shallow@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= dependencies: assign-symbols "^1.0.0" @@ -4711,18 +4716,9 @@ extend@~3.0.2: resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - extglob@^2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== dependencies: array-unique "^0.3.2" @@ -4750,9 +4746,9 @@ fast-deep-equal@^3.1.1: integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-glob@^3.1.1: - version "3.2.4" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.4.tgz" - integrity sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ== + version "3.2.5" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661" + integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -4772,9 +4768,9 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= fastq@^1.6.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.9.0.tgz" - integrity sha512-i7FVWL8HhVY+CTkwFxkN2mk3h+787ixS5S63eb78diVRc1MCssarHq3W5cj0av7YDSwmaV928RNag+U1etRQ7w== + version "1.11.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.0.tgz#bb9fb955a07130a918eb63c1f5161cc32a5d0858" + integrity sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g== dependencies: reusify "^1.0.4" @@ -4804,13 +4800,6 @@ figgy-pudding@^3.5.1: resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz" integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== -figures@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - file-entry-cache@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz" @@ -4833,12 +4822,12 @@ file-uri-to-path@1.0.0: filesize@6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.1.0.tgz" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.1.0.tgz#e81bdaa780e2451d714d71c0d7a4f3238d37ad00" integrity sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg== fill-range@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= dependencies: extend-shallow "^2.0.1" @@ -4848,7 +4837,7 @@ fill-range@^4.0.0: fill-range@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" @@ -4886,7 +4875,7 @@ find-cache-dir@^3.3.1: find-up@4.1.0, find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: locate-path "^5.0.0" @@ -4901,7 +4890,7 @@ find-up@^2.0.0, find-up@^2.1.0: find-up@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== dependencies: locate-path "^3.0.0" @@ -4962,7 +4951,7 @@ forever-agent@~0.6.1: fork-ts-checker-webpack-plugin@4.1.6: version "4.1.6" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz#5055c703febcf37fa06405d400c122b905167fc5" integrity sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw== dependencies: "@babel/code-frame" "^7.5.5" @@ -4989,7 +4978,7 @@ forwarded@~0.1.2: fragment-cache@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= dependencies: map-cache "^0.2.2" @@ -5130,7 +5119,7 @@ get-stream@^5.0.0: get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= getpass@^0.1.1: @@ -5148,13 +5137,20 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: +glob-parent@^5.0.0, glob-parent@~5.1.0: version "5.1.1" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz" integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== dependencies: is-glob "^4.0.1" +glob-parent@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz" @@ -5169,14 +5165,14 @@ glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: global-modules@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== dependencies: global-prefix "^3.0.0" global-prefix@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== dependencies: ini "^1.3.5" @@ -5197,7 +5193,7 @@ globals@^12.1.0: globby@11.0.1, globby@^11.0.1: version "11.0.1" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== dependencies: array-union "^2.1.0" @@ -5230,7 +5226,7 @@ growly@^1.3.0: gzip-size@5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA== dependencies: duplexer "^0.1.1" @@ -5261,7 +5257,7 @@ harmony-reflect@^1.4.6: has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= has-flag@^4.0.0: @@ -5276,7 +5272,7 @@ has-symbols@^1.0.1: has-value@^0.3.1: version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= dependencies: get-value "^2.0.3" @@ -5285,7 +5281,7 @@ has-value@^0.3.1: has-value@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= dependencies: get-value "^2.0.6" @@ -5294,12 +5290,12 @@ has-value@^1.0.0: has-values@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= has-values@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= dependencies: is-number "^3.0.0" @@ -5525,7 +5521,7 @@ human-signals@^1.1.1: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== -iconv-lite@0.4.24, iconv-lite@^0.4.24: +iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -5563,13 +5559,13 @@ ignore@^4.0.6: ignore@^5.1.4: version "5.1.8" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== -immer@7.0.9: - version "7.0.9" - resolved "https://registry.yarnpkg.com/immer/-/immer-7.0.9.tgz" - integrity sha512-Vs/gxoM4DqNAYR7pugIxi0Xc8XAun/uy7AQu4fLLqaTBHxjOP9pJ266Q9MWA/ly4z6rAFZbvViOtihxUZ7O28A== +immer@8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/immer/-/immer-8.0.1.tgz#9c73db683e2b3975c424fb0572af5889877ae656" + integrity sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA== import-cwd@^2.0.0: version "2.1.0" @@ -5665,25 +5661,6 @@ ini@^1.3.5: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -inquirer@7.3.3: - version "7.3.3" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz" - integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.19" - mute-stream "0.0.8" - run-async "^2.4.0" - rxjs "^6.6.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - internal-ip@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz" @@ -5728,14 +5705,14 @@ is-absolute-url@^3.0.3: is-accessor-descriptor@^0.1.6: version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= dependencies: kind-of "^3.0.2" is-accessor-descriptor@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== dependencies: kind-of "^6.0.0" @@ -5771,7 +5748,7 @@ is-binary-path@~2.1.0: is-buffer@^1.0.2, is-buffer@^1.1.5: version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== is-callable@^1.1.4, is-callable@^1.2.2: @@ -5807,14 +5784,14 @@ is-core-module@^2.0.0, is-core-module@^2.1.0: is-data-descriptor@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= dependencies: kind-of "^3.0.2" is-data-descriptor@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== dependencies: kind-of "^6.0.0" @@ -5826,7 +5803,7 @@ is-date-object@^1.0.1: is-descriptor@^0.1.0: version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== dependencies: is-accessor-descriptor "^0.1.6" @@ -5835,7 +5812,7 @@ is-descriptor@^0.1.0: is-descriptor@^1.0.0, is-descriptor@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== dependencies: is-accessor-descriptor "^1.0.0" @@ -5854,19 +5831,19 @@ is-docker@^2.0.0: is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= is-extendable@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== dependencies: is-plain-object "^2.0.4" is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= is-fullwidth-code-point@^2.0.0: @@ -5910,14 +5887,14 @@ is-negative-zero@^2.0.0: is-number@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= dependencies: kind-of "^3.0.2" is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-obj@^1.0.1: @@ -5956,7 +5933,7 @@ is-plain-obj@^1.0.0: is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" @@ -5985,7 +5962,7 @@ is-resolvable@^1.0.0: is-root@2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== is-stream@^1.1.0: @@ -6024,7 +6001,7 @@ is-typedarray@^1.0.0, is-typedarray@~1.0.0: is-windows@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== is-wsl@^1.1.0: @@ -6034,7 +6011,7 @@ is-wsl@^1.1.0: is-wsl@^2.1.1, is-wsl@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== dependencies: is-docker "^2.0.0" @@ -6051,14 +6028,14 @@ isexe@^2.0.0: isobject@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= dependencies: isarray "1.0.0" isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= isstream@~0.1.2: @@ -6544,7 +6521,7 @@ jest@26.6.0: "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.13.1: @@ -6645,9 +6622,9 @@ json5@^1.0.1: minimist "^1.2.0" json5@^2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz" - integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== dependencies: minimist "^1.2.5" @@ -6699,31 +6676,31 @@ kind-of@^2.0.1: kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= dependencies: is-buffer "^1.1.5" kind-of@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= dependencies: is-buffer "^1.1.5" kind-of@^5.0.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== kleur@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== language-subtag-registry@~0.3.2: @@ -6842,7 +6819,7 @@ locate-path@^2.0.0: locate-path@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== dependencies: p-locate "^3.0.0" @@ -6850,7 +6827,7 @@ locate-path@^3.0.0: locate-path@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== dependencies: p-locate "^4.1.0" @@ -6964,12 +6941,12 @@ makeerror@1.0.x: map-cache@^0.2.2: version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= map-visit@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= dependencies: object-visit "^1.0.0" @@ -7035,7 +7012,7 @@ merge-stream@^2.0.0: merge2@^1.3.0: version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== methods@~1.1.2: @@ -7045,12 +7022,12 @@ methods@~1.1.2: microevent.ts@~0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/microevent.ts/-/microevent.ts-0.1.1.tgz" + resolved "https://registry.yarnpkg.com/microevent.ts/-/microevent.ts-0.1.1.tgz#70b09b83f43df5172d0205a63025bce0f7357fa0" integrity sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g== micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== dependencies: arr-diff "^4.0.0" @@ -7069,7 +7046,7 @@ micromatch@^3.1.10, micromatch@^3.1.4: micromatch@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== dependencies: braces "^3.0.1" @@ -7142,14 +7119,14 @@ minimalistic-crypto-utils@^1.0.1: minimatch@3.0.4, minimatch@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== minipass-collect@^1.0.2: @@ -7206,7 +7183,7 @@ mississippi@^3.0.0: mixin-deep@^1.2.0: version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== dependencies: for-in "^1.0.2" @@ -7246,7 +7223,7 @@ move-concurrently@^1.0.1: ms@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= ms@2.1.1: @@ -7272,11 +7249,6 @@ multicast-dns@^6.0.1: dns-packet "^1.3.1" thunky "^1.0.2" -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - nan@^2.12.1: version "2.14.2" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz" @@ -7289,7 +7261,7 @@ nanoid@^3.1.16: nanomatch@^1.2.9: version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== dependencies: arr-diff "^4.0.0" @@ -7400,7 +7372,12 @@ node-notifier@^8.0.0: uuid "^8.3.0" which "^2.0.2" -node-releases@^1.1.61, node-releases@^1.1.66: +node-releases@^1.1.61: + version "1.1.71" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" + integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== + +node-releases@^1.1.66: version "1.1.66" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.66.tgz" integrity sha512-JHEQ1iWPGK+38VLB2H9ef2otU4l8s3yAMt9Xf934r6+ojCYDMHPMqvCc9TnzfeFSP1QEOeU6YZEd3+De0LTCgg== @@ -7490,7 +7467,7 @@ object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: object-copy@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= dependencies: copy-descriptor "^0.1.0" @@ -7517,7 +7494,7 @@ object-keys@^1.0.12, object-keys@^1.1.1: object-visit@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= dependencies: isobject "^3.0.0" @@ -7561,7 +7538,7 @@ object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0 object.pick@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= dependencies: isobject "^3.0.1" @@ -7608,9 +7585,9 @@ onetime@^5.1.0: mimic-fn "^2.1.0" open@^7.0.2: - version "7.3.0" - resolved "https://registry.yarnpkg.com/open/-/open-7.3.0.tgz" - integrity sha512-mgLwQIx2F/ye9SmbrUkurZCnkoXyXyu9EbHtJZrICjVAJfyMArdHp3KkixGdZx1ZHFPNIwl0DDM1dFFqXbTLZw== + version "7.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" + integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== dependencies: is-docker "^2.0.0" is-wsl "^2.1.1" @@ -7666,11 +7643,6 @@ os-browserify@^0.3.0: resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz" integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - p-each-series@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.1.0.tgz" @@ -7690,7 +7662,7 @@ p-limit@^1.1.0: p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" @@ -7711,14 +7683,14 @@ p-locate@^2.0.0: p-locate@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== dependencies: p-limit "^2.0.0" p-locate@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== dependencies: p-limit "^2.2.0" @@ -7749,7 +7721,7 @@ p-try@^1.0.0: p-try@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== pako@~1.0.5: @@ -7837,7 +7809,7 @@ pascal-case@^3.1.1: pascalcase@^0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= path-browserify@0.0.1: @@ -7852,12 +7824,12 @@ path-dirname@^1.0.0: path-exists@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0: @@ -7877,7 +7849,7 @@ path-key@^2.0.0, path-key@^2.0.1: path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.6: @@ -7899,7 +7871,7 @@ path-type@^2.0.0: path-type@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== pbkdf2@^3.0.3: @@ -7920,7 +7892,7 @@ performance-now@^2.1.0: picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1, picomatch@^2.2.2: version "2.2.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== pify@^2.0.0: @@ -7930,7 +7902,7 @@ pify@^2.0.0: pify@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== pinkie-promise@^2.0.0: @@ -7975,7 +7947,7 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0: pkg-up@3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== dependencies: find-up "^3.0.0" @@ -7998,7 +7970,7 @@ portfinder@^1.0.26: posix-character-classes@^0.1.0: version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= postcss-attribute-case-insensitive@^4.0.1: @@ -8738,9 +8710,9 @@ promise@^8.1.0: dependencies: asap "~2.0.6" -prompts@^2.0.1: +prompts@2.4.0, prompts@^2.0.1: version "2.4.0" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.0.tgz" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.0.tgz#4aa5de0723a231d1ee9121c40fdf663df73f61d7" integrity sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ== dependencies: kleur "^3.0.3" @@ -8863,6 +8835,11 @@ querystringify@^2.1.1: resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz" integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + raf@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz" @@ -8913,9 +8890,9 @@ react-app-polyfill@^2.0.0: whatwg-fetch "^3.4.1" react-dev-utils@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-11.0.0.tgz" - integrity sha512-uIZTUZXB5tbiM/0auUkLVjWhZGM7DSI304iGunyhA9m985iIDVXd9I4z6MkNa9jeLzeUJbU9A7TUNrcbXAahxw== + version "11.0.4" + resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-11.0.4.tgz#a7ccb60257a1ca2e0efe7a83e38e6700d17aa37a" + integrity sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A== dependencies: "@babel/code-frame" "7.10.4" address "1.1.2" @@ -8930,13 +8907,13 @@ react-dev-utils@^11.0.0: global-modules "2.0.0" globby "11.0.1" gzip-size "5.1.1" - immer "7.0.9" - inquirer "7.3.3" + immer "8.0.1" is-root "2.1.0" loader-utils "2.0.0" open "^7.0.2" pkg-up "3.1.0" - react-error-overlay "^6.0.8" + prompts "2.4.0" + react-error-overlay "^6.0.9" recursive-readdir "2.2.2" shell-quote "1.7.2" strip-ansi "6.0.0" @@ -8951,10 +8928,10 @@ react-dom@^17.0.1: object-assign "^4.1.1" scheduler "^0.20.1" -react-error-overlay@^6.0.8: - version "6.0.8" - resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.8.tgz" - integrity sha512-HvPuUQnLp5H7TouGq3kzBeioJmXms1wHy9EGjz2OURWBp4qZO6AfGEcnxts1D/CbwPLRAgTMPCEgYhA3sEM4vw== +react-error-overlay@^6.0.9: + version "6.0.9" + resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.9.tgz#3c743010c9359608c375ecd6bc76f35d93995b0a" + integrity sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew== react-is@^16.8.1: version "16.13.1" @@ -9120,7 +9097,7 @@ readdirp@~3.5.0: recursive-readdir@2.2.2: version "2.2.2" - resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg== dependencies: minimatch "3.0.4" @@ -9164,7 +9141,7 @@ regenerator-transform@^0.14.2: regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== dependencies: extend-shallow "^3.0.2" @@ -9235,12 +9212,12 @@ renderkid@^2.0.4: repeat-element@^1.1.2: version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== repeat-string@^1.6.1: version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= request-promise-core@1.1.4: @@ -9347,7 +9324,7 @@ resolve-url-loader@^3.1.2: resolve-url@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= resolve@1.18.1: @@ -9366,17 +9343,9 @@ resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.1 is-core-module "^2.1.0" path-parse "^1.0.6" -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - ret@~0.1.10: version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== retry@^0.12.0: @@ -9386,7 +9355,7 @@ retry@^0.12.0: reusify@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== rework-visit@1.0.0: @@ -9481,15 +9450,12 @@ rsvp@^4.8.4: resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz" integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== -run-async@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== - run-parallel@^1.1.9: - version "1.1.10" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.10.tgz" - integrity sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw== + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" @@ -9498,13 +9464,6 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -rxjs@^6.6.0: - version "6.6.3" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz" - integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== - dependencies: - tslib "^1.9.0" - safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz" @@ -9517,7 +9476,7 @@ safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-regex@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= dependencies: ret "~0.1.10" @@ -9707,7 +9666,7 @@ set-blocking@^2.0.0: set-value@^2.0.0, set-value@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== dependencies: extend-shallow "^2.0.1" @@ -9764,7 +9723,7 @@ shebang-command@^1.2.0: shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" @@ -9776,12 +9735,12 @@ shebang-regex@^1.0.0: shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== shell-quote@1.7.2: version "1.7.2" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== shellwords@^0.1.1: @@ -9811,12 +9770,12 @@ simple-swizzle@^0.2.2: sisteransi@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== slash@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== slice-ansi@^2.1.0: @@ -9830,7 +9789,7 @@ slice-ansi@^2.1.0: snapdragon-node@^2.0.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== dependencies: define-property "^1.0.0" @@ -9839,14 +9798,14 @@ snapdragon-node@^2.0.1: snapdragon-util@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== dependencies: kind-of "^3.2.0" snapdragon@^0.8.1: version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== dependencies: base "^0.11.1" @@ -9919,9 +9878,9 @@ source-map-support@^0.5.6, source-map-support@~0.5.12, source-map-support@~0.5.1 source-map "^0.6.0" source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz" - integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + version "0.4.1" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" @@ -9994,7 +9953,7 @@ spdy@^4.0.2: split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== dependencies: extend-shallow "^3.0.0" @@ -10052,7 +10011,7 @@ stackframe@^1.1.1: static-extend@^0.1.1: version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= dependencies: define-property "^0.2.5" @@ -10267,7 +10226,7 @@ stylehacks@^4.0.0: supports-color@^5.3.0: version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" @@ -10447,11 +10406,6 @@ through2@^2.0.0: readable-stream "~2.3.6" xtend "~4.0.1" -through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - thunky@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz" @@ -10469,13 +10423,6 @@ timsort@^0.3.0: resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz" integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - tmpl@1.0.x: version "1.0.4" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz" @@ -10493,14 +10440,14 @@ to-fast-properties@^2.0.0: to-object-path@^0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= dependencies: kind-of "^3.0.2" to-regex-range@^2.1.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= dependencies: is-number "^3.0.0" @@ -10508,14 +10455,14 @@ to-regex-range@^2.1.0: to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" to-regex@^3.0.1, to-regex@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== dependencies: define-property "^2.0.2" @@ -10695,7 +10642,7 @@ unicode-property-aliases-ecmascript@^1.0.4: union-value@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== dependencies: arr-union "^3.1.0" @@ -10761,7 +10708,7 @@ unquote@~1.1.1: unset-value@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= dependencies: has-value "^0.3.1" @@ -10781,7 +10728,7 @@ uri-js@^4.2.2: urix@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= url-loader@4.1.1: @@ -10811,7 +10758,7 @@ url@^0.11.0: use@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: @@ -11137,14 +11084,14 @@ which-module@^2.0.0: which@^1.2.9, which@^1.3.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" which@^2.0.1, which@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" @@ -11316,7 +11263,7 @@ worker-farm@^1.7.0: worker-rpc@^0.1.0: version "0.1.1" - resolved "https://registry.yarnpkg.com/worker-rpc/-/worker-rpc-0.1.1.tgz" + resolved "https://registry.yarnpkg.com/worker-rpc/-/worker-rpc-0.1.1.tgz#cb565bd6d7071a8f16660686051e969ad32f54d5" integrity sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg== dependencies: microevent.ts "~0.1.1" From 990066ca3169ae6fe36e152b17f9e8a7fd049f89 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 May 2021 13:37:12 -0700 Subject: [PATCH 07/20] build(deps): bump url-parse from 1.4.7 to 1.5.1 in /examples/counter (#96) Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.4.7 to 1.5.1. - [Release notes](https://github.com/unshiftio/url-parse/releases) - [Commits](https://github.com/unshiftio/url-parse/compare/1.4.7...1.5.1) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Chris Smothers --- examples/counter/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/counter/yarn.lock b/examples/counter/yarn.lock index 230d933e..09964b27 100644 --- a/examples/counter/yarn.lock +++ b/examples/counter/yarn.lock @@ -10741,9 +10741,9 @@ url-loader@4.1.1: schema-utils "^3.0.0" url-parse@^1.4.3: - version "1.4.7" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278" - integrity sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg== + version "1.5.1" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.1.tgz#d5fa9890af8a5e1f274a2c98376510f6425f6e3b" + integrity sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q== dependencies: querystringify "^2.1.1" requires-port "^1.0.0" From 1fa44bf2dfbf82f734742ef2e4b4c8e82873781a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 May 2021 13:55:58 -0700 Subject: [PATCH 08/20] build(deps): bump url-parse from 1.4.7 to 1.5.1 in /examples/todo (#95) Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.4.7 to 1.5.1. - [Release notes](https://github.com/unshiftio/url-parse/releases) - [Commits](https://github.com/unshiftio/url-parse/compare/1.4.7...1.5.1) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Chris Smothers --- examples/todo/yarn.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/todo/yarn.lock b/examples/todo/yarn.lock index c84067f0..db1b508e 100644 --- a/examples/todo/yarn.lock +++ b/examples/todo/yarn.lock @@ -8832,7 +8832,7 @@ querystring@0.2.0, querystring@^0.2.0: querystringify@^2.1.1: version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== queue-microtask@^1.2.2: @@ -9274,7 +9274,7 @@ require-main-filename@^2.0.0: requires-port@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= resolve-cwd@^2.0.0: @@ -10741,9 +10741,9 @@ url-loader@4.1.1: schema-utils "^3.0.0" url-parse@^1.4.3: - version "1.4.7" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz" - integrity sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg== + version "1.5.1" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.1.tgz#d5fa9890af8a5e1f274a2c98376510f6425f6e3b" + integrity sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q== dependencies: querystringify "^2.1.1" requires-port "^1.0.0" From e4cd8d8fb036504a820d40a1b53bd6d0a4dbc53c Mon Sep 17 00:00:00 2001 From: rubinovitz Date: Mon, 14 Jun 2021 11:29:34 -0700 Subject: [PATCH 09/20] docs(recipes): remove extraneous import (#111) Co-authored-by: Chris Smothers --- docs/0900|Recipes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/0900|Recipes.md b/docs/0900|Recipes.md index a5f1e71f..52745e4c 100644 --- a/docs/0900|Recipes.md +++ b/docs/0900|Recipes.md @@ -3,7 +3,7 @@ The example below shows a recipe for keeping Homebase React in sync with Firebase. `client.addTransactListener(callback)` lets you listen to every local transaction and send those updates to Firebase. We also need a way to sync Firebase with Homebase React. In this example we create a namespace on Firebase for each user based on their firebase uid and listen to all changes in that namespace. client.` transactSilently(tx)` allows us save changes received from Firebase without triggering our transactListener function and sending those changes back to Firebase endlessly. ```js -import { HomebaseProvider, useClient, useEntity, useTransact } from 'homebase-react'; +import { useClient, useEntity } from 'homebase-react'; import firebase from 'firebase/app'; import debounce from 'lodash/debounce'; import React from 'react'; From b09b9fca7d9c36431a0c9a47c4bbe094b8ac8bf2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 22 Jun 2021 18:40:32 -0400 Subject: [PATCH 10/20] build(deps): bump ssri from 6.0.1 to 6.0.2 in /examples/todo (#88) Bumps [ssri](https://github.com/npm/ssri) from 6.0.1 to 6.0.2. - [Release notes](https://github.com/npm/ssri/releases) - [Changelog](https://github.com/npm/ssri/blob/v6.0.2/CHANGELOG.md) - [Commits](https://github.com/npm/ssri/compare/v6.0.1...v6.0.2) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Chris Smothers --- examples/todo/yarn.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/todo/yarn.lock b/examples/todo/yarn.lock index db1b508e..dc3d7797 100644 --- a/examples/todo/yarn.lock +++ b/examples/todo/yarn.lock @@ -4797,7 +4797,7 @@ fb-watchman@^2.0.0: figgy-pudding@^3.5.1: version "3.5.2" - resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== file-entry-cache@^5.0.1: @@ -9979,9 +9979,9 @@ sshpk@^1.7.0: tweetnacl "~0.14.0" ssri@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz" - integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + version "6.0.2" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" + integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q== dependencies: figgy-pudding "^3.5.1" From 00bc018601ae245f6609dae43fb86f4e67f450c9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 24 Jun 2021 18:49:30 -0400 Subject: [PATCH 11/20] build(deps): bump ssri from 6.0.1 to 6.0.2 in /examples/counter (#89) Bumps [ssri](https://github.com/npm/ssri) from 6.0.1 to 6.0.2. - [Release notes](https://github.com/npm/ssri/releases) - [Changelog](https://github.com/npm/ssri/blob/v6.0.2/CHANGELOG.md) - [Commits](https://github.com/npm/ssri/compare/v6.0.1...v6.0.2) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Chris Smothers --- examples/counter/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/counter/yarn.lock b/examples/counter/yarn.lock index 09964b27..f7ba170b 100644 --- a/examples/counter/yarn.lock +++ b/examples/counter/yarn.lock @@ -9979,9 +9979,9 @@ sshpk@^1.7.0: tweetnacl "~0.14.0" ssri@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" - integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + version "6.0.2" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" + integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q== dependencies: figgy-pudding "^3.5.1" From 35cf71a996c98eebaa2933246bbf0681d5a891ce Mon Sep 17 00:00:00 2001 From: Chris Smothers Date: Fri, 25 Jun 2021 23:04:06 -0400 Subject: [PATCH 12/20] refactor(cache): improve cache and integrate reagent (#107) --- .gitignore | 1 - README.md | 268 +++++------------- deps.edn | 19 +- doc/README.md | 71 +++++ doc/cljdoc.edn | 7 + doc/examples.md | 3 + doc/performance.md | 47 +++ doc/tooling_debugging.md | 39 +++ docs/0100|Overview.md | 61 +++- docs/0200|Quick_Start.md | 4 +- docs/0675|Debugging.md | 4 +- .../roam/scripts/convert_roam_edn/convert.clj | 1 + package.json | 9 +- pom.xml | 88 ++++++ shadow-cljs.edn | 2 +- src/dev/{ => homebase/dev}/example/core.cljs | 12 +- .../{ => homebase/dev}/example/js/array.jsx | 0 .../{ => homebase/dev}/example/js/counter.jsx | 0 .../dev}/example/js/todo-firebase.jsx | 0 .../{ => homebase/dev}/example/js/todo.jsx | 5 +- .../dev}/example/js_compiled/array.js | 0 .../dev}/example/js_compiled/counter.js | 0 .../dev}/example/js_compiled/todo-firebase.js | 0 .../dev}/example/js_compiled/todo.js | 2 +- .../dev/example/react}/array.cljs | 11 +- .../dev/example/react}/counter.cljs | 11 +- .../dev/example/react}/todo.cljs | 11 +- .../dev/example/react}/todo_firebase.cljs | 11 +- src/dev/homebase/dev/example/reagent.cljs | 33 +++ .../homebase/dev/example/reagent/counter.cljs | 23 ++ .../homebase/dev/example/reagent/todo.cljs | 176 ++++++++++++ src/dev/{ => homebase/dev}/macros.clj | 3 +- src/homebase/datalog_console.cljs | 18 -- src/main/homebase/cache.cljs | 124 ++++++++ src/{ => main}/homebase/js.cljs | 35 +-- src/{ => main}/homebase/react.cljs | 19 +- src/main/homebase/reagent.cljs | 156 ++++++++++ src/{ => main}/homebase/util.cljs | 3 +- src/{ => test}/homebase/benchmarks.test.js | 5 +- src/{ => test}/homebase/js_test.cljs | 1 + src/{ => test}/homebase/react.test.js | 5 +- src/test/homebase/reagent_test.cljs | 82 ++++++ src/test/homebase/test_polyfills.cljs | 13 + yarn.lock | 132 ++++++++- 44 files changed, 1220 insertions(+), 295 deletions(-) create mode 100644 doc/README.md create mode 100644 doc/cljdoc.edn create mode 100644 doc/examples.md create mode 100644 doc/performance.md create mode 100644 doc/tooling_debugging.md create mode 100644 pom.xml rename src/dev/{ => homebase/dev}/example/core.cljs (61%) rename src/dev/{ => homebase/dev}/example/js/array.jsx (100%) rename src/dev/{ => homebase/dev}/example/js/counter.jsx (100%) rename src/dev/{ => homebase/dev}/example/js/todo-firebase.jsx (100%) rename src/dev/{ => homebase/dev}/example/js/todo.jsx (98%) rename src/dev/{ => homebase/dev}/example/js_compiled/array.js (100%) rename src/dev/{ => homebase/dev}/example/js_compiled/counter.js (100%) rename src/dev/{ => homebase/dev}/example/js_compiled/todo-firebase.js (100%) rename src/dev/{ => homebase/dev}/example/js_compiled/todo.js (99%) rename src/dev/{example => homebase/dev/example/react}/array.cljs (65%) rename src/dev/{example => homebase/dev/example/react}/counter.cljs (65%) rename src/dev/{example => homebase/dev/example/react}/todo.cljs (72%) rename src/dev/{example => homebase/dev/example/react}/todo_firebase.cljs (65%) create mode 100644 src/dev/homebase/dev/example/reagent.cljs create mode 100644 src/dev/homebase/dev/example/reagent/counter.cljs create mode 100644 src/dev/homebase/dev/example/reagent/todo.cljs rename src/dev/{ => homebase/dev}/macros.clj (62%) delete mode 100644 src/homebase/datalog_console.cljs create mode 100644 src/main/homebase/cache.cljs rename src/{ => main}/homebase/js.cljs (93%) rename src/{ => main}/homebase/react.cljs (96%) create mode 100644 src/main/homebase/reagent.cljs rename src/{ => main}/homebase/util.cljs (78%) rename src/{ => test}/homebase/benchmarks.test.js (97%) rename src/{ => test}/homebase/js_test.cljs (99%) rename src/{ => test}/homebase/react.test.js (99%) create mode 100644 src/test/homebase/reagent_test.cljs create mode 100644 src/test/homebase/test_polyfills.cljs diff --git a/.gitignore b/.gitignore index 301af3c8..c7ce6f7f 100644 --- a/.gitignore +++ b/.gitignore @@ -13,7 +13,6 @@ dist/ package-lock.json report.html -pom.xml pom.xml.asc *.iml *.jar diff --git a/README.md b/README.md index 2c657c08..35cfd5d8 100644 --- a/README.md +++ b/README.md @@ -4,12 +4,17 @@ [![CI](https://github.com/homebaseio/homebase-react/workflows/CI/badge.svg)](https://github.com/homebaseio/homebase-react/actions?query=workflow%3ACI) [![CD](https://github.com/homebaseio/homebase-react/workflows/CD/badge.svg)](https://github.com/homebaseio/homebase-react/actions?query=workflow%3ACD) -[![NPM Version](https://img.shields.io/npm/v/homebase-react)](https://www.npmjs.com/package/homebase-react) -[![Bundle Size](https://img.shields.io/bundlephobia/minzip/homebase-react)](https://www.npmjs.com/package/homebase-react) [![License](https://img.shields.io/github/license/homebaseio/homebase-react.svg)](LICENSE) +[![Twitter Follow](https://img.shields.io/twitter/follow/homebase__io?label=Follow&style=social)](https://twitter.com/homebase__io) *The React state management library for write-heavy applications* +Supported languages, frameworks and DBs: + +- JS + React + Datascript ([jump](#javascript--react)) +- CLJS + Reagent + Datascript ([jump](#clojurescript--reagent)) +- *Datahike support coming soon* + ## What and Why As data and our need to annotate and organize it grows, so does our need for supporting state in *write-heavy* applications. @@ -28,7 +33,12 @@ Homebase-react enables developers to access the same embedded datalog database a > > —Chet Corcos, Founding Engineer of Notion -## Install +# Javascript + React + +Start by installing `homebase-react`. + +[![NPM Version](https://img.shields.io/npm/v/homebase-react)](https://www.npmjs.com/package/homebase-react) +[![Bundle Size](https://img.shields.io/bundlephobia/minzip/homebase-react)](https://www.npmjs.com/package/homebase-react) ```bash # NPM @@ -38,223 +48,84 @@ npm install homebase-react --save yarn add homebase-react ``` -## Docs -https://homebase.io/docs/homebase-react +Optionally install the `datalog-console` [chrome extension](https://chrome.google.com/webstore/detail/datalog-console/cfgbajnnabfanfdkhpdhndegpmepnlmb?hl=en) to inspect the `homebase-react` DB in your browser. - -## Examples -### Live Demos -You can see our hosted live demos [here](https://homebaseio.github.io/homebase-react) - -### Code Examples -You can clone and run our React code examples [here](examples/). - -## API Overview - -### `HomebaseProvider` - -The HomebaseProvider wraps your React app and makes a relational database accessible to all of your components. Configure it with `lookupHelpers` and `initialData`. +⭐️ 📖 **[Read the JS docs](https://homebase.io/docs/homebase-react)** ⚛️ ⭐️ ```js -import { HomebaseProvider, useEntity, useTransact, useQuery } from 'homebase-react' - -const config = { - // Lookup helpers simplify relational queries at query time. - // The helpers currently supported are: - // `type: 'ref'` which is a relationship and - // `unique: 'identity` which enforces a uniqueness constraint - // and lets you lookup entities by their unique attributes. - lookupHelpers: { - todo: { - project: { type: 'ref', cardinality: 'one' }, - name: { unique: 'identity' } - } - }, - - // Initial data is what it sounds like. - // It's a transaction that runs on component mount. - // Use it to hydrate your app. - initialData: [ - { project: { id: -1, name: 'Do it', user: -2 } }, - { todo: { project: -1, name: 'Make it' } }, - { user: { id: -2, name: 'Arpegius' } } - ] - - // Or relationships can be specified implicitly with nested JSON - initialData: [ - { - todo: { - name: 'Make it', - project: { - name: 'Do it', - user: { - name: 'Arpegius' - } - } - } - } - ] -} +import { useCallback } from 'react' +import { HomebaseProvider, useEntity, useTransact } from 'homebase-react' const RootComponent = () => ( - + // Create a DB and set some starting data + ) -``` - -### `useEntity` and `entity.get` -Entities are the building blocks of the Homebase data model. They are like JSON objects with bonus features. In particular **you can traverse arbitrarily deep relationships without actually denormalizing and nesting your data**. - -```js -// You can get an entity by its id and get attributes off of it. -const [todo] = useEntity(2) -todo.get('id') // => 2 -todo.get('name') // => 'Make it' - -// Entities with unique attributes can also be retrieved by those attributes. -const [sameTodo] = useEntity({ todo: { name: 'Make it' } }) -sameTodo.get('id') // => 2 - -// And most importantly you can traverse arbitrarily deep relationships. -sameTodo.get('project', 'user', 'name') // => 'Arpegius' +const App = () => { + // Get entity id = 1 + const [counter] = useEntity(1) + const [transact] = useTransact() + + return ( + + ) +} ``` -### `useTransact` - -Transactions let you create, update and delete multiple entities simultaneously. All changes will reactively update any components that depend on the changed data. +[Live demo](https://homebaseio.github.io/homebase-react/#!/homebase.dev.example.counter) -```js -const [transact] = useTransact() +# ClojureScript + Reagent -// A transaction is an array of nested objects and or arrays. -// Leaving the id blank will create a new entity. -transact([{ todo: { name: 'New Todo', project: 1 } }]) +Start by adding `homebase-react`. -// Setting the id to a negative number is a temp id which -// allows multiple entities to be related to each other on creation. -transact([ - { project: { id: -123, name: 'New Project' } }, - { todo: { project: -123, name: 'New Todo' } }, -]) +[![Clojars Project](https://img.shields.io/clojars/v/io.homebase/homebase-react.svg)](https://clojars.org/io.homebase/homebase-react) -// Update an entity by including its id. -// NOTE: that only the included attributes will be updated. -transact([{ project: { id: 1, name: 'Changed Project Title' } }]) +Optionally add `datalog-console` and its corresponding [chrome extension](https://chrome.google.com/webstore/detail/datalog-console/cfgbajnnabfanfdkhpdhndegpmepnlmb?hl=en) to inspect the DB in your browser. -// To remove an attribute you have to explicitly set it to null. -transact([{ project: { id: 1, name: null } }]) +[![Clojars Project](https://img.shields.io/clojars/v/io.homebase/datalog-console.svg)](https://clojars.org/io.homebase/datalog-console) -// To delete an entire entity use retractEntity and its id -transact([['retractEntity', 1]]) -``` +⭐️ 📖 **[Read the CLJS docs](https://cljdoc.org/d/io.homebase/homebase-react/CURRENT)** ƛ ⭐️ -### `useQuery` +```clojure +(ns homebase.dev.example.reagent.counter + (:require + [datascript.core :as d] + [homebase.reagent :as hbr] + [datalog-console.integrations.datascript :as datalog-console])) -Use queries to return an array of entities that meet a given criteria. Our query API is powered by Datalog, but exposed as JSON similar to a JS SQL driver or MongoDB. Datalog is similar to SQL and is incredibly powerful. However, only a subset of features are currently available in JSON. +(def db-conn (d/create-conn {})) +(d/transact! db-conn [[:db/add 1 :count 0]]) ; Transact some starting data. +(hbr/connect! db-conn) ; Connect homebase.reagent to the database. +(datalog-console/enable! {:conn db-conn}) ; Also connect the datalog-console extension for better debugging. -We will prioritize features based on community feedback so please open an issue if there's something you need. In the meantime you can further filter results with JS `filter()` and `sort()`. - -```js -// Finds all todos with a name -const [todos] = useQuery({ - $find: 'todo', - $where: { todo: { name: '$any' } } -}) - -// Returns an array of todo entities -todos -.sort((todo1, todo2) => todo1.get('name') > todo2.get('name') ? 1 : -1) -.map(todo => todo.get('name')) +(defn counter [] + (let [[entity] (hbr/entity db-conn 1)] ; Get a homebase.reagent/Entity. Note the use of db-conn and not @db-conn, this makes it reactive. + (fn [] + [:div + "Count: " (:count @entity) ; Deref the entity just like a reagent/atom. + [:div + [:button {:on-click #(d/transact! db-conn [[:db/add 1 :count (inc (:count @entity))]])} ; Use d/transact! just like normal. + "Increment"]]]))) ``` -### `useClient` - -This hook returns the current database client with some helpful functions for syncing data with a backend. - -- `client.dbToString()` serializes the whole db including the lookupHelpers to a string. -- `client.dbFromString('a serialized db string')` replaces the current db. -- `client.dbToDatoms()` returns an array of all the facts aka datoms saved in the db. - - Datoms are the smallest unit of data in the database, like a key value pair but better. - - Datoms are arrays of `[entityId, attribute, value, transactionId, isAddedBoolean]`. -- `client.addTransactListener((changedDatoms) => ...)` adds a listener function to all transactions. - - Use this to save data to your backend. -- `client.removeTransactListener()` removes the transaction listener. - - Please note that only 1 listener can be added per useClient scope. -- `client.transactSilently([{item: {name: ...}}])` like `transact()` only it will not trigger any listeners. - - Use this to sync data from your backend into the client. -- `client.entity(id or { thing: { attr: 'unique value' } })` like `useEntity`, but **returns a promise**. Get an entity in a callback or other places where a React hook does not make sense. - - The entity returned by this function **will NOT live update the parent React component** when its data changes. If you want reactive updates we recommend using `useEntity`. -- `client.query({ $find: 'thing', $where: { thing: { name: '$any' } } })` like `useQuery`, but **returns a promise**. Perform a query in a callback or other places where a React hook does not make sense. - - The entities returned by this function **will NOT live update the parent React component** when their data changes. If you want reactive updates we recommend using `useQuery`. - -Check out the [Firebase example](https://homebaseio.github.io/homebase-react/#!/example.todo_firebase) for a demonstration of how you might integrate a backend. - -## Debugging -Homebase React uses ClojureScript and its corresponding data format EDN internally. We then compile all of that to Javascript using the Google Closure Compiler (closure not clojure, I know right) to get as small a bundle as possible. Then we provide APIs (react hooks) that accept JSON and do all the conversion to EDN and back again behind the scenes. - -EDN and Clojure provide far more safety and extensibility than JSON and Javascript. Clojure being immutable by default and EDN being extensible. This lets us build and support features that would be unwieldy in JSON and JS. - -However, the tradeoffs are: - -1. A larger bundle size. Some of the Clojure runtime cannot be compiled away even though the closure compiler is really aggressive. -2. Clojure error messages sometimes leak into JS land. We try to annotate the ones we know about so they make sense to JS devs, but it's far from perfect and if you see something weird please create an issue. -3. Our code is released already minified. We do this because most people do not develop with the google closure compiler and other build tools are not nearly as effective at optimizing this code. This makes debugging homebase-react while developing a bit harder since the code is not very readable, but we think the tradeoff is worth it to provide a smaller bundle size. And to compensate we try to build enough supporting dev tooling so you never need to read the compiled source. -4. Confusing console logs. EDN data looks different from JSON and to add to that, homebase-react mostly outputs entities, which are lazy data types and not very helpful when logged out with the default console formatting. See custom chrome formatters below for a vastly improved logging experience. - -### Custom chrome console log formatters -If you develop with [Chrome](https://www.google.com/chrome/) or a Chromium browser like Brave or Edge you'll get significantly more meaningful logs for entities `console.log(anEntity)` due to our use of custom chrome :formatters. These custom formatters allow us to perform lazy database queries to fetch all of an entity's attributes, including references to other entities and all reverse references to the current entity. They let you access your entire data graph from the console, with any logged out entity as an entry point. - -**To enable custom chrome formatters** - -**1.** Open the preferences panel in chrome devtools by clicking the cog. - -image of chrome devtools preferences button - -**2.** Toggle `Enabled custom formatters` on. - -image of chrome devtools custom formatters toggle - -**3.** Keep the chrome console open and refresh the page. Any logged out entities should now have the custom formatting. - -image of custom entity chrome console logs - -**Live demo:** open the console while on the [todo example](https://homebaseio.github.io/homebase-react/#!/dev.example.todo) page. - -**Remember**: for custom formatters to work `console.log(anEntity)` must be called *after* you open the chrome console. Anything logged out before you open the console will not have custom formatting applied because chrome processes those logs in the background. - -### Datalog Console Extension - -We also integrate with the [Datalog Console](https://github.com/homebaseio/datalog-console) extension. - -image of datalog console extension - -It's still in an early stage of development, but we seek to expose all common DB administration capabilities here and let you connect to any Datalog database that implements the console's interface. - -#### Using the Datalog Console - -1. [Add the extension to Chrome](https://chrome.google.com/webstore/detail/datalog-console/cfgbajnnabfanfdkhpdhndegpmepnlmb) -2. Vist a page built with homebase-react [like this one](https://homebaseio.github.io/homebase-react/#!/dev.example.todo), open the inspector, click the `Datalog DB` tab, and click `Load database` to try it out - -### *DEPRECATED* `_recentlyTouchedAttributes` - -*Use [custom chrome formatters](#custom-chrome-formatters) instead.* - -If you set `debug` to `true` in your configuration, you will be able to access the `_recentlyTouchedAttributes` attribute on entities. `_recentlyTouchedAttributes` will show any cached attributes for a given entity. This is helpful for approximating that entity's schema and values. - -```js - - - -``` +[Live demo](https://homebaseio.github.io/homebase-react/index.html#!/homebase.dev.example.reagent) ## Roadmap -1. Improve developer tools: custom chrome formatters, DB admin console extension -2. Rewrite React ↔ Homebase cache - 1. Support async DB access (for Datahike) - 2. Reactive query planning (better perf on pages with lots of live reads) +1. ~~Improve developer tools: custom chrome formatters, DB admin console extension~~ +2. ~~Rewrite React ↔ Homebase cache~~ + 1. ~~Support async DB access (for Datahike)~~ + 2. ~~Reactive query planning (better perf on pages with lots of live reads)~~ 3. Swap [Datascript](https://github.com/tonsky/datascript) out for [Datahike](https://github.com/replikativ/datahike) 1. Immutability 2. History / Change Tracking @@ -262,8 +133,15 @@ If you set `debug` to `true` in your configuration, you will be able to access t 5. [Local-first](https://www.inkandswitch.com/local-first.html) conflict resolution for offline caching and sync between multiple devices ## Limitations + Homebase React is currently not a good choice for read-heavy applications (e.g. Twitter, ecommerce). We plan to support these query patterns with our [platform](http://homebase.io) eventually. +## Alternatives + +There isn't much in the way of React friendly datalog DB based state management for Javascript, but there's at least one alternative if you're a Clojure dev. + +- If your prefer `d/pull` over `d/entity` take a look at [Posh](https://github.com/denistakeda/posh). It supports less of the `d/q` API, but provides more tools for tuning performance. + ## Development ```bash diff --git a/deps.edn b/deps.edn index 7fcb3c8b..9d2a5cdc 100644 --- a/deps.edn +++ b/deps.edn @@ -1,10 +1,21 @@ -{:paths ["src"] +{:paths ["src/dev" + "src/main" + "src/test"] :deps {thheller/shadow-cljs {:mvn/version "2.11.25"} devcards/devcards {:mvn/version "0.2.7"} datascript/datascript {:mvn/version "1.0.7"} reagent/reagent {:mvn/version "1.0.0-alpha2"} inflections/inflections {:mvn/version "0.13.2"} binaryage/devtools {:mvn/version "1.0.2"} - homebaseio/datalog-console {:git/url "https://github.com/homebaseio/datalog-console" :sha "97d5e5eb8994124ec8dc0029b33f2e88257b39b2"} - ;; homebaseio/datalog-console {:local/root "../datalog-console"} - camel-snake-kebab/camel-snake-kebab {:mvn/version "0.4.2"}}} + io.homebase/datalog-console {:mvn/version "0.2.2"} + nano-id/nano-id {:mvn/version "1.0.0"} + camel-snake-kebab/camel-snake-kebab {:mvn/version "0.4.2"}} + :aliases {:jar {:replace-deps {com.github.seancorfield/depstar {:mvn/version "2.0.216"}} + :exec-fn hf.depstar/jar + :exec-args {:jar "homebase-react.jar" :sync-pom true}} + :install {:replace-deps {slipset/deps-deploy {:mvn/version "0.1.5"}} + :exec-fn deps-deploy.deps-deploy/deploy + :exec-args {:installer :local :artifact "homebase-react.jar"}} + :deploy {:replace-deps {slipset/deps-deploy {:mvn/version "0.1.5"}} + :exec-fn deps-deploy.deps-deploy/deploy + :exec-args {:installer :remote :artifact "homebase-react.jar"}}}} diff --git a/doc/README.md b/doc/README.md new file mode 100644 index 00000000..23a6d353 --- /dev/null +++ b/doc/README.md @@ -0,0 +1,71 @@ +# Homebase React + +[![CI](https://github.com/homebaseio/homebase-react/workflows/CI/badge.svg)](https://github.com/homebaseio/homebase-react/actions?query=workflow%3ACI) +[![CD](https://github.com/homebaseio/homebase-react/workflows/CD/badge.svg)](https://github.com/homebaseio/homebase-react/actions?query=workflow%3ACD) +[![License](https://img.shields.io/github/license/homebaseio/homebase-react.svg)](LICENSE) +[![GitHub Repo stars](https://img.shields.io/github/stars/homebaseio/homebase-react?style=social)](https://github.com/homebaseio/homebase-react) +[![Twitter Follow](https://img.shields.io/twitter/follow/homebase__io?label=Follow&style=social)](https://twitter.com/homebase__io) + +> Use a datalog DB to manage react application state. + +Supported languages, frameworks and DBs: + +- JS + React + Datascript +- CLJS + Reagent + Datascript +- *Datahike support coming soon* + +# Javascript + React + +This is the Clojure docs site. Go here for [JS + React docs](https://homebase.io/docs/homebase-react). + +# ClojureScript + Reagent + +Start by adding `homebase-react`. + +[![Clojars Project](https://img.shields.io/clojars/v/io.homebase/homebase-react.svg)](https://clojars.org/io.homebase/homebase-react) + +Optionally add `datalog-console` and its corresponding [chrome extension](https://chrome.google.com/webstore/detail/datalog-console/cfgbajnnabfanfdkhpdhndegpmepnlmb?hl=en) to inspect the DB in your browser. + +[![Clojars Project](https://img.shields.io/clojars/v/io.homebase/datalog-console.svg)](https://clojars.org/io.homebase/datalog-console) + +## Quick Start + +```clojure +(ns homebase.dev.example.reagent.counter + (:require + [datascript.core :as d] + [homebase.reagent :as hbr] + [datalog-console.integrations.datascript :as datalog-console])) + +(def db-conn (d/create-conn {})) +(d/transact! db-conn [[:db/add 1 :count 0]]) ; Transact some starting data. +(hbr/connect! db-conn) ; Connect homebase.reagent to the database. +(datalog-console/enable! {:conn db-conn}) ; Also connect the datalog-console extension for better debugging. + +(defn counter [] + (let [[entity] (hbr/entity db-conn 1)] ; Get a homebase.reagent/Entity. Note the use of db-conn and not @db-conn, this makes it reactive. + (fn [] + [:div + "Count: " (:count @entity) ; Deref the entity just like a reagent/atom. + [:div + [:button {:on-click #(d/transact! db-conn [[:db/add 1 :count (inc (:count @entity))]])} ; Use d/transact! just like normal. + "Increment"]]]))) +``` + +[Live demo](https://homebaseio.github.io/homebase-react/index.html#!/homebase.dev.example.reagent) + +## API + +- [homebase.reagent](https://cljdoc.org/d/io.homebase/homebase-react/CURRENT/api/homebase.reagent) + +## Performance + +Our reactive query functions like `hbr/entity` and `hbr/q` will only trigger re-renders when their results change. + +In the case of `hbr/entity` we track which attributes get consumed `(:attr @entity)` and only dispatch updates when those attributes are transacted. + +`hbr/q` queries rerun on every transaction. If the result is different we re-render. We're looking into differential datalog and incremental view maintenance, but for typical datasets of tens of thousands of datoms the current performance is great. DOM updates tend to be much more costly, so just rerunning the queries still performs well as long as we don't repaint the DOM. + +## Alternatives + +- If your prefer `d/pull` over `d/entity` take a look at [Posh](https://github.com/denistakeda/posh). It supports less of the `d/q` API, but provides more tools for tuning performance. \ No newline at end of file diff --git a/doc/cljdoc.edn b/doc/cljdoc.edn new file mode 100644 index 00000000..79f1cabb --- /dev/null +++ b/doc/cljdoc.edn @@ -0,0 +1,7 @@ +{:cljdoc.doc/tree + [["Introduction" {:file "doc/README.md"}] + ["Examples" {:file "doc/examples.md"}] + ["Misc" {} + ["Tooling & Debugging" {:file "doc/tooling_debugging.md"}] + ["Performance" {:file "doc/performance.md"}] + ["Contribution" {:file "CONTRIBUTING.md"}]]]} \ No newline at end of file diff --git a/doc/examples.md b/doc/examples.md new file mode 100644 index 00000000..199ad2db --- /dev/null +++ b/doc/examples.md @@ -0,0 +1,3 @@ +# Examples + +Visit the [live demos](https://homebaseio.github.io/homebase-react/index.html#!/homebase.dev.example.reagent) devcards site to see some examples. \ No newline at end of file diff --git a/doc/performance.md b/doc/performance.md new file mode 100644 index 00000000..ae118af2 --- /dev/null +++ b/doc/performance.md @@ -0,0 +1,47 @@ +# Performance + +Homebase React tracks the attributes consumed in each component via `homebase.reagent/Entity` and scopes those attributes to their respective `hbr/entity` reagent atom. Re-renders are only triggered when an attribute changes. + +The default caching reduces unnecessary re-renders and virtual DOM thrashing a lot. That said, it is still possible to trigger more re-renders than you might want. + +## Smart Prop Drilling + +One top level `hbr/entity` + prop drilling the entity it returns will cause all children to re-render on any change to the parent or their siblings. + +To fix this we recommend passing ids to children, not whole entities. Instead get the entity in the child with `(hbr/entity db-conn id)`. This creates a new scope for each child so they are not affected by changes in the state of the parent or sibling components. + +### Good Prop Drilling + +```clojure +(defn friend [id] + (let [[user] (hbr/entity db-conn id)] + (fn [] + [:div (:user/name @user)]))) + +(defn friends [user-id] + (let [[user] (hbr/entity db-conn user-id)] + (fn [user-id] + [:div + (for [u (:user/friends @user)] + [friend (:db/id u)])]))) +``` + +### Bad Prop Drilling + +```clojure +(defn friend [user] + [:div (:user/name @user)]) + +(defn friends [user-id] + (let [[user] (hbr/entity db-conn user-id)] + (fn [user-id] + [:div + (for [u (:user/friends @user)] + [friend u])]))) +``` + +## Query performance + +`hbr/q` queries rerun on every transaction. If the result is different we re-render. We're looking into differential datalog and incremental view maintenance, but for typical datasets of tens of thousands of datoms the current performance is great. DOM updates tend to be much more costly, so rerunning the queries still performs well as long as we don't repaint the DOM. + +If you are seeing UI slowdowns consider virtualizing large lists and only rendering DOM nodes that fit on the screen. \ No newline at end of file diff --git a/doc/tooling_debugging.md b/doc/tooling_debugging.md new file mode 100644 index 00000000..273708e7 --- /dev/null +++ b/doc/tooling_debugging.md @@ -0,0 +1,39 @@ +# Tooling & Debugging + +We've built a few tools to make debugging a bit more convenient. + +## Custom chrome formatters +If you develop with [Chrome](https://www.google.com/chrome/) or a Chromium browser like Brave or Edge you'll get significantly more meaningful logs for entities `(js/console.log an-entity)` due to our use of custom chrome :formatters. These custom formatters allow us to perform lazy database queries to fetch all of an entity's attributes, including references to other entities and all reverse references to the current entity. They let you access your entire data graph from the console, with any logged out entity as an entry point. + +**To enable custom chrome formatters** + +**1.** Add **[binaryage/cljs-devtools](https://github.com/binaryage/cljs-devtools)** to your app. Our entity formatters implement protocols defined in cljs-devtools and need cljs-devtools to work. Plus, if you've never used cljs-devtools you're in for a treat. + +**2.** Open the preferences panel in chrome devtools by clicking the cog. + +![image of chrome devtools preferences button](https://github.com/homebaseio/homebase-react/blob/master/public/images/enable_chrome_formatters_1.png?raw=true) + +**3.** Toggle `Enabled custom formatters` on. + +![image of chrome devtools custom formatters toggle](https://github.com/homebaseio/homebase-react/blob/master/public/images/enable_chrome_formatters_2.png?raw=true) + +**4.** Keep the chrome console open and refresh the page. Any logged out entities should now have the custom formatting. + +![image of custom entity chrome console logs](https://github.com/homebaseio/homebase-react/blob/master/public/images/enable_chrome_formatters_3.png?raw=true) + +**Live demo:** open the console while on the [todo example](https://homebaseio.github.io/homebase-react/#!/homebase.dev.example.todo) page. + +**Remember**: for custom formatters to work `(js/console.log an-entity)` must be called *after* you open the chrome console. Anything logged out before you open the console will not have custom formatting applied because chrome processes those logs in the background. + +## Datalog Console Extension + +We also integrate with the [Datalog Console](https://github.com/homebaseio/datalog-console) extension. + +![image of datalog console extension](https://github.com/homebaseio/homebase-react/blob/master/public/images/datalog_console.png?raw=true) + +It's still in an early stage of development, but we seek to expose all common DB administration capabilities here and let you connect to any Datalog database that implements the console's interface. + +### Using the Datalog Console + +1. [Add the extension to Chrome](https://chrome.google.com/webstore/detail/datalog-console/cfgbajnnabfanfdkhpdhndegpmepnlmb) +2. Vist a page built with homebase-react [like this one](https://cljdoc.org/d/io.homebase/homebase-react/CURRENT/api/homebase.reagent), open the inspector, click the `Datalog DB` tab, and click `Load database` to try it out diff --git a/docs/0100|Overview.md b/docs/0100|Overview.md index 05cb2db0..7a10f0a5 100644 --- a/docs/0100|Overview.md +++ b/docs/0100|Overview.md @@ -2,21 +2,24 @@ [![CI](https://github.com/homebaseio/homebase-react/workflows/CI/badge.svg)](https://github.com/homebaseio/homebase-react/actions?query=workflow%3ACI) [![CD](https://github.com/homebaseio/homebase-react/workflows/CD/badge.svg)](https://github.com/homebaseio/homebase-react/actions?query=workflow%3ACD) -[![NPM Version](https://img.shields.io/npm/v/homebase-react)](https://www.npmjs.com/package/homebase-react) -[![Bundle Size](https://img.shields.io/bundlephobia/minzip/homebase-react)](https://www.npmjs.com/package/homebase-react) [![License](https://img.shields.io/github/license/homebaseio/homebase-react.svg)](LICENSE) [![GitHub Repo stars](https://img.shields.io/github/stars/homebaseio/homebase-react?style=social)](https://github.com/homebaseio/homebase-react) [![Twitter Follow](https://img.shields.io/twitter/follow/homebase__io?label=Follow&style=social)](https://twitter.com/homebase__io) -## What and Why +Supported languages, frameworks and DBs: -As data and our need to annotate and organize it grows, so does our need for supporting state in *write-heavy* applications. +- JS + React + Datascript +- CLJS + Reagent + Datascript +- *Datahike support coming soon* -To solve this problem, modern write-heavy applications such as Superhuman, Roam Research, and Facebook Messenger built their own embedded data layers to enable these more sophisticated user experiences. +# ClojureScript + Reagent -Homebase React enables developers to access the same embedded datalog database as Roam Research through React hooks. You no longer have to build out a team or learn specialized tools like Clojure in order to build a delightful write-heavy application. +This is the Javascript docs site. Go here for [CLJS + Reagent docs](https://cljdoc.org/d/io.homebase/homebase-react/CURRENT). + +# Javascript + React -## Install +Start by installing `homebase-react` [![NPM Version](https://img.shields.io/npm/v/homebase-react)](https://www.npmjs.com/package/homebase-react) +[![Bundle Size](https://img.shields.io/bundlephobia/minzip/homebase-react)](https://www.npmjs.com/package/homebase-react) ```bash # NPM @@ -26,6 +29,50 @@ npm install homebase-react --save yarn add homebase-react ``` +Optionally install the `datalog-console` [chrome extension](https://chrome.google.com/webstore/detail/datalog-console/cfgbajnnabfanfdkhpdhndegpmepnlmb?hl=en) to inspect the `homebase-react` DB in your browser. + +## Quick Start + +```js +import { useCallback } from 'react' +import { HomebaseProvider, useEntity, useTransact } from 'homebase-react' + +const RootComponent = () => ( + // Create a DB and set some starting data + + + +) + +const App = () => { + // Get entity id = 1 + const [counter] = useEntity(1) + const [transact] = useTransact() + + return ( + + ) +} +``` + +[Live demo](https://homebaseio.github.io/homebase-react/#!/homebase.dev.example.counter) + +## What and Why + +As data and our need to annotate and organize it grows, so does our need for supporting state in *write-heavy* applications. + +To solve this problem, modern write-heavy applications such as Superhuman, Roam Research, and Facebook Messenger built their own embedded data layers to enable these more sophisticated user experiences. + +Homebase React enables developers to access the same embedded datalog database as Roam Research through React hooks. You no longer have to build out a team or learn specialized tools like Clojure in order to build a delightful write-heavy application. + ## Testimonials > Homebase is executing on the vision of data usage, portability, and management we had when building Firebase. We never got there. I'm excited! > diff --git a/docs/0200|Quick_Start.md b/docs/0200|Quick_Start.md index 9cc7e4a1..cecf1104 100644 --- a/docs/0200|Quick_Start.md +++ b/docs/0200|Quick_Start.md @@ -11,8 +11,10 @@ Adding `HomebaseProvider` automatically creates the database. ```js import { HomebaseProvider } from 'homebase-react' +const config = { initialData: [{ counter: { id: 1, count: 0 }}] } + const RootComponent = () => ( - + ) diff --git a/docs/0675|Debugging.md b/docs/0675|Debugging.md index ad3219dd..97abbfa1 100644 --- a/docs/0675|Debugging.md +++ b/docs/0675|Debugging.md @@ -26,7 +26,7 @@ If you develop with [Chrome](https://www.google.com/chrome/) or a Chromium brows ![image of custom entity chrome console logs](https://github.com/homebaseio/homebase-react/blob/master/public/images/enable_chrome_formatters_3.png?raw=true) -**Live demo:** open the console while on the [todo example](https://homebaseio.github.io/homebase-react/#!/dev.example.todo) page. +**Live demo:** open the console while on the [todo example](https://homebaseio.github.io/homebase-react/#!/homebase.dev.example.todo) page. **Remember**: for custom formatters to work `console.log(anEntity)` must be called *after* you open the chrome console. Anything logged out before you open the console will not have custom formatting applied because chrome processes those logs in the background. @@ -41,7 +41,7 @@ It's still in an early stage of development, but we seek to expose all common DB #### Using the Datalog Console 1. [Add the extension to Chrome](https://chrome.google.com/webstore/detail/datalog-console/cfgbajnnabfanfdkhpdhndegpmepnlmb) -2. Vist a page built with homebase-react [like this one](https://homebaseio.github.io/homebase-react/#!/dev.example.todo), open the inspector, click the `Datalog DB` tab, and click `Load database` to try it out +2. Visit a page built with homebase-react [like this one](https://homebaseio.github.io/homebase-react/#!/homebase.dev.example.todo), open the inspector, click the `Datalog DB` tab, and click `Load database` to try it out ### DEPRECATED `_recentlyTouchedAttributes` diff --git a/examples/roam/scripts/convert_roam_edn/convert.clj b/examples/roam/scripts/convert_roam_edn/convert.clj index 7dd93030..3728f5a4 100644 --- a/examples/roam/scripts/convert_roam_edn/convert.clj +++ b/examples/roam/scripts/convert_roam_edn/convert.clj @@ -6,6 +6,7 @@ to make Datalog feel more like SQL and tabular data. This script normalizes all attributes to the 'block' namespace." + {:no-doc true} (:require [clojure.pprint])) ;; (def input (read-string (slurp "scripts/convert_roam_edn/datasets/hn.edn"))) diff --git a/package.json b/package.json index 07c16dfa..9804dc4e 100644 --- a/package.json +++ b/package.json @@ -7,11 +7,11 @@ "main": "./dist/js/homebase.react.js", "private": false, "scripts": { - "dev": "shadow-cljs watch dev & babel src/dev/example/js --out-dir src/dev/example/js_compiled --watch && kill $!", + "dev": "shadow-cljs watch dev & babel src/dev/homebase/dev/example/js --out-dir src/dev/homebase/dev/example/js_compiled --watch && kill $!", "build": "rm -rf dist && shadow-cljs release npm && yarn bundle-ts", "build:dev": "rm -rf dist && shadow-cljs compile npm && yarn bundle-ts", - "test:js": "yarn build && jest src/* && yarn tsd", - "test:js:dev": "yarn build:dev && jest src/* && yarn tsd", + "test:js": "yarn build && jest src/test/* && yarn tsd", + "test:js:dev": "yarn build:dev && jest src/test/* && yarn tsd", "test:ts": "yarn bundle-ts && yarn tsd", "test:cljs": "shadow-cljs compile test && node out/node-tests.js", "test:cljs:watch": "shadow-cljs watch test-autorun", @@ -40,6 +40,7 @@ "@babel/preset-react": "^7.12.13", "@commitlint/cli": "^11.0.0", "@commitlint/config-conventional": "^11.0.0", + "@peculiar/webcrypto": "^1.1.7", "@semantic-release/changelog": "5.0.1", "@semantic-release/commit-analyzer": "8.0.1", "@semantic-release/git": "9.0.0", @@ -67,11 +68,13 @@ "eslint-plugin-react-hooks": "^4.2.0", "firebase": "^8.0.2", "firebaseui": "^4.7.1", + "global-jsdom": "^8.1.0", "highlight.js": "10.4.1", "hoist-non-react-statics": "^3.3.0", "husky": "5.0.0-beta.0", "jest": "26.6.0", "jest-performance-testing": "^1.0.0", + "jsdom": "^16.6.0", "marked": "2.0.0", "pinst": "2.0.0", "prettier": "^2.2.1", diff --git a/pom.xml b/pom.xml new file mode 100644 index 00000000..91685637 --- /dev/null +++ b/pom.xml @@ -0,0 +1,88 @@ + + + 4.0.0 + jar + io.homebase + homebase-react + 0.1.0 + homebase-react + Use a datalog DB to manage react application state + https://github.com/homebaseio/homebase-react + + Homebase + https://homebase.io + + + + MIT + https://opensource.org/licenses/MIT + + + + https://github.com/homebaseio/homebase-react.git + scm:git:git://github.com/homebaseio/homebase-react.git + scm:git:ssh://git@github.com:homebaseio/homebase-react.git + HEAD + + + + org.clojure + clojure + 1.10.3 + + + io.homebase + datalog-console + 0.2.2 + + + thheller + shadow-cljs + 2.11.25 + + + inflections + inflections + 0.13.2 + + + binaryage + devtools + 1.0.2 + + + devcards + devcards + 0.2.7 + + + reagent + reagent + 1.0.0-alpha2 + + + nano-id + nano-id + 1.0.0 + + + datascript + datascript + 1.0.7 + + + camel-snake-kebab + camel-snake-kebab + 0.4.2 + + + + src/dev + + + + clojars + https://repo.clojars.org/ + + + diff --git a/shadow-cljs.edn b/shadow-cljs.edn index 7c0920ea..9de4f7e8 100644 --- a/shadow-cljs.edn +++ b/shadow-cljs.edn @@ -9,7 +9,7 @@ :compiler-options {:devcards :true :externs ["datascript/externs.js"] :output-feature-set :es6} - :modules {:main {:init-fn dev.example.core/init}} + :modules {:main {:init-fn homebase.dev.example.core/init}} :js-options {:resolve {"devcards-marked" {:target :npm :require "marked"} "devcards-syntax-highlighter" {:target :npm :require "highlight.js"}}}} :test {:target :node-test diff --git a/src/dev/example/core.cljs b/src/dev/homebase/dev/example/core.cljs similarity index 61% rename from src/dev/example/core.cljs rename to src/dev/homebase/dev/example/core.cljs index 11e834d9..e2c95649 100644 --- a/src/dev/example/core.cljs +++ b/src/dev/homebase/dev/example/core.cljs @@ -1,4 +1,5 @@ -(ns dev.example.core +(ns homebase.dev.example.core + {:no-doc true} (:require ["highlight.js" :as highlight] ["marked" :as marked] @@ -6,10 +7,11 @@ [cljsjs.react.dom] [reagent.core] [devcards.core :as dc] - [dev.example.array] - [dev.example.counter] - [dev.example.todo] - [dev.example.todo-firebase])) + [homebase.dev.example.react.array] + [homebase.dev.example.react.counter] + [homebase.dev.example.react.todo] + [homebase.dev.example.react.todo-firebase] + [homebase.dev.example.reagent])) (js/goog.exportSymbol "marked" marked) (js/goog.exportSymbol "DevcardsMarked" marked) diff --git a/src/dev/example/js/array.jsx b/src/dev/homebase/dev/example/js/array.jsx similarity index 100% rename from src/dev/example/js/array.jsx rename to src/dev/homebase/dev/example/js/array.jsx diff --git a/src/dev/example/js/counter.jsx b/src/dev/homebase/dev/example/js/counter.jsx similarity index 100% rename from src/dev/example/js/counter.jsx rename to src/dev/homebase/dev/example/js/counter.jsx diff --git a/src/dev/example/js/todo-firebase.jsx b/src/dev/homebase/dev/example/js/todo-firebase.jsx similarity index 100% rename from src/dev/example/js/todo-firebase.jsx rename to src/dev/homebase/dev/example/js/todo-firebase.jsx diff --git a/src/dev/example/js/todo.jsx b/src/dev/homebase/dev/example/js/todo.jsx similarity index 98% rename from src/dev/example/js/todo.jsx rename to src/dev/homebase/dev/example/js/todo.jsx index 6c89c9eb..09585d6e 100644 --- a/src/dev/example/js/todo.jsx +++ b/src/dev/homebase/dev/example/js/todo.jsx @@ -163,7 +163,7 @@ const Todo = React.memo(({ id }) => {  ·  - {todo.get('createdAt').toLocaleString()} + {todo.get('createdAt')?.toLocaleString()} ) }) @@ -237,7 +237,8 @@ const TodoFilters = () => { type="checkbox" checked={filters.get('showCompleted')} onChange={(e) => - transact([{ todoFilter: { id: filters.get('id'), showCompleted: e.target.checked } }])} + transact([{ todoFilter: { id: filters.get('id'), showCompleted: e.target.checked } }]) + } />  ·  diff --git a/src/dev/example/js_compiled/array.js b/src/dev/homebase/dev/example/js_compiled/array.js similarity index 100% rename from src/dev/example/js_compiled/array.js rename to src/dev/homebase/dev/example/js_compiled/array.js diff --git a/src/dev/example/js_compiled/counter.js b/src/dev/homebase/dev/example/js_compiled/counter.js similarity index 100% rename from src/dev/example/js_compiled/counter.js rename to src/dev/homebase/dev/example/js_compiled/counter.js diff --git a/src/dev/example/js_compiled/todo-firebase.js b/src/dev/homebase/dev/example/js_compiled/todo-firebase.js similarity index 100% rename from src/dev/example/js_compiled/todo-firebase.js rename to src/dev/homebase/dev/example/js_compiled/todo-firebase.js diff --git a/src/dev/example/js_compiled/todo.js b/src/dev/homebase/dev/example/js_compiled/todo.js similarity index 99% rename from src/dev/example/js_compiled/todo.js rename to src/dev/homebase/dev/example/js_compiled/todo.js index 9f615b82..b68adaf3 100644 --- a/src/dev/example/js_compiled/todo.js +++ b/src/dev/homebase/dev/example/js_compiled/todo.js @@ -171,7 +171,7 @@ const Todo = /*#__PURE__*/_react.default.memo(({ style: { color: 'grey' } - }, todo.get('createdAt').toLocaleString())); + }, todo.get('createdAt')?.toLocaleString())); }); const TodoCheck = ({ diff --git a/src/dev/example/array.cljs b/src/dev/homebase/dev/example/react/array.cljs similarity index 65% rename from src/dev/example/array.cljs rename to src/dev/homebase/dev/example/react/array.cljs index 13de02e3..8d279ccc 100644 --- a/src/dev/example/array.cljs +++ b/src/dev/homebase/dev/example/react/array.cljs @@ -1,21 +1,22 @@ -(ns dev.example.array +(ns homebase.dev.example.react.array + {:no-doc true} (:require [devcards.core :as dc] [homebase.react] - ["./js_compiled/array" :as react-example]) + ["../js_compiled/array" :as react-example]) (:require-macros [devcards.core :refer [defcard-rg defcard-doc]] - [dev.macros :refer [inline-resource]])) + [homebase.dev.macros :refer [inline-resource]])) (defcard-rg array-example [react-example/App]) (def code-snippet (clojure.string/replace-first - (inline-resource "src/dev/example/js/array.jsx") + (inline-resource "src/dev/homebase/dev/example/js/array.jsx") "const { HomebaseProvider, useTransact, useEntity } = window.homebase.react" "import { HomebaseProvider, useTransact, useEntity } from 'homebase-react'")) (defcard-doc - "[🔗GitHub](https://github.com/homebaseio/homebase-react/blob/master/src/dev/example/js/array.jsx)" + "[🔗GitHub](https://github.com/homebaseio/homebase-react/blob/master/src/dev/homebase/dev/example/js/array.jsx)" (str "```javascript\n" code-snippet "\n```")) diff --git a/src/dev/example/counter.cljs b/src/dev/homebase/dev/example/react/counter.cljs similarity index 65% rename from src/dev/example/counter.cljs rename to src/dev/homebase/dev/example/react/counter.cljs index c4617d9c..5b1c865b 100644 --- a/src/dev/example/counter.cljs +++ b/src/dev/homebase/dev/example/react/counter.cljs @@ -1,21 +1,22 @@ -(ns dev.example.counter +(ns homebase.dev.example.react.counter + {:no-doc true} (:require [devcards.core :as dc] [homebase.react] - ["./js_compiled/counter" :as react-example]) + ["../js_compiled/counter" :as react-example]) (:require-macros [devcards.core :refer [defcard-rg defcard-doc]] - [dev.macros :refer [inline-resource]])) + [homebase.dev.macros :refer [inline-resource]])) (defcard-rg counter-example [react-example/App]) (def code-snippet (clojure.string/replace-first - (inline-resource "src/dev/example/js/counter.jsx") + (inline-resource "src/dev/homebase/dev/example/js/counter.jsx") "const { HomebaseProvider, useTransact, useEntity } = window.homebase.react" "import { HomebaseProvider, useTransact, useEntity } from 'homebase-react'")) (defcard-doc - "[🔗GitHub](https://github.com/homebaseio/homebase-react/blob/master/src/dev/example/js/counter.jsx)" + "[🔗GitHub](https://github.com/homebaseio/homebase-react/blob/master/src/dev/homebase/dev/example/js/counter.jsx)" (str "```javascript\n" code-snippet "\n```")) diff --git a/src/dev/example/todo.cljs b/src/dev/homebase/dev/example/react/todo.cljs similarity index 72% rename from src/dev/example/todo.cljs rename to src/dev/homebase/dev/example/react/todo.cljs index 81f6ace6..db603adb 100644 --- a/src/dev/example/todo.cljs +++ b/src/dev/homebase/dev/example/react/todo.cljs @@ -1,22 +1,23 @@ -(ns dev.example.todo +(ns homebase.dev.example.react.todo + {:no-doc true} (:require [devcards.core :as dc] [homebase.react] - ["./js_compiled/todo" :as react-example]) + ["../js_compiled/todo" :as react-example]) (:require-macros [devcards.core :refer [defcard-rg defcard-doc]] - [dev.macros :refer [inline-resource]])) + [homebase.dev.macros :refer [inline-resource]])) (defcard-rg todo-example [react-example/App]) (def code-snippet (clojure.string/replace-first - (inline-resource "src/dev/example/js/todo.jsx") + (inline-resource "src/dev/homebase/dev/example/js/todo.jsx") "const { HomebaseProvider, useTransact, useQuery, useEntity } = window.homebase.react" "import { HomebaseProvider, useTransact, useQuery, useEntity } from 'homebase-react'")) (defcard-doc - "[🔗GitHub](https://github.com/homebaseio/homebase-react/blob/master/src/dev/example/js/todo.jsx)" + "[🔗GitHub](https://github.com/homebaseio/homebase-react/blob/master/src/dev/homebase/dev/example/js/todo.jsx)" "For an annotated walkthrough of this code [check out the tutorial 📖](https://www.notion.so/Homebase-Alpha-Docs-0f0e22f3adcd4e9d87a13440ab0c7a0b)." (str "```javascript\n" code-snippet "\n```")) diff --git a/src/dev/example/todo_firebase.cljs b/src/dev/homebase/dev/example/react/todo_firebase.cljs similarity index 65% rename from src/dev/example/todo_firebase.cljs rename to src/dev/homebase/dev/example/react/todo_firebase.cljs index 6ad72fac..db49da15 100644 --- a/src/dev/example/todo_firebase.cljs +++ b/src/dev/homebase/dev/example/react/todo_firebase.cljs @@ -1,21 +1,22 @@ -(ns dev.example.todo-firebase +(ns homebase.dev.example.react.todo-firebase + {:no-doc true} (:require [devcards.core :as dc] [homebase.react] - ["./js_compiled/todo-firebase" :as react-example]) + ["../js_compiled/todo-firebase" :as react-example]) (:require-macros [devcards.core :refer [defcard-rg defcard-doc]] - [dev.macros :refer [inline-resource]])) + [homebase.dev.macros :refer [inline-resource]])) (defcard-rg todo-firebase-example [react-example/App]) (def code-snippet (clojure.string/replace-first - (inline-resource "src/dev/example/js/todo-firebase.jsx") + (inline-resource "src/dev/homebase/dev/example/js/todo-firebase.jsx") "const { HomebaseProvider, useClient, useTransact, useQuery, useEntity } = window.homebase.react" "import { HomebaseProvider, useClient, useTransact, useQuery, useEntity } from 'homebase-react'")) (defcard-doc - "[🔗GitHub](https://github.com/homebaseio/homebase-react/blob/master/src/dev/example/js/todo-firebase.jsx)" + "[🔗GitHub](https://github.com/homebaseio/homebase-react/blob/master/src/dev/homebase/dev/example/js/todo-firebase.jsx)" (str "```javascript\n" code-snippet "\n```")) diff --git a/src/dev/homebase/dev/example/reagent.cljs b/src/dev/homebase/dev/example/reagent.cljs new file mode 100644 index 00000000..9232a768 --- /dev/null +++ b/src/dev/homebase/dev/example/reagent.cljs @@ -0,0 +1,33 @@ +(ns homebase.dev.example.reagent + (:require + [devcards.core :as dc] + [homebase.dev.example.reagent.counter :as counter] + [homebase.dev.example.reagent.todo :as todo]) + (:require-macros + [devcards.core :refer [defcard-rg defcard-doc]] + [homebase.dev.macros :refer [inline-resource]])) + +(defcard-doc + "# [Homebase React](https://github.com/homebaseio/homebase-react) | Reagent Examples + + [![cljdoc badge](https://cljdoc.org/badge/io.homebase/homebase-react)](https://cljdoc.org/d/io.homebase/homebase-react/CURRENT) + + Examples + + - counter + - todo") + +(defcard-doc "---") + +(defcard-doc "## Counter Example") +(defcard-rg counter + counter/counter) +(defcard-doc + (str "```clojure\n" (inline-resource "src/dev/homebase/dev/example/reagent/counter.cljs") "\n```")) +(defcard-doc "---") + +(defcard-doc "## Todo Example") +(defcard-rg todo + todo/todo-app) +(defcard-doc + (str "```clojure\n" (inline-resource "src/dev/homebase/dev/example/reagent/todo.cljs") "\n```")) \ No newline at end of file diff --git a/src/dev/homebase/dev/example/reagent/counter.cljs b/src/dev/homebase/dev/example/reagent/counter.cljs new file mode 100644 index 00000000..0088b04b --- /dev/null +++ b/src/dev/homebase/dev/example/reagent/counter.cljs @@ -0,0 +1,23 @@ +(ns homebase.dev.example.reagent.counter + (:require + [datascript.core :as d] + [homebase.reagent :as hbr] + [datalog-console.integrations.datascript :as datalog-console])) + +(def db-conn (d/create-conn {})) + +(d/transact! db-conn [[:db/add 1 :count 0]]) ; Transact some starting data. + +(hbr/connect! db-conn) ; Connect homebase.reagent to the database. + +(datalog-console/enable! {:conn db-conn}) ; Also connect the datalog-console extension for better debugging. + +(defn counter [] + (let [[entity] (hbr/entity db-conn 1)] ; Get a homebase.reagent/Entity. Note the use of db-conn and not @db-conn, this makes it reactive. + (fn [] + [:div + "Count: " (:count @entity) ; Deref the entity just like a reagent/atom. + [:div + [:button {:on-click #(d/transact! db-conn [[:db/add 1 :count (inc (:count @entity))]])} ; Use d/transact! just like normal. + "Increment"]]]))) + diff --git a/src/dev/homebase/dev/example/reagent/todo.cljs b/src/dev/homebase/dev/example/reagent/todo.cljs new file mode 100644 index 00000000..473f1e31 --- /dev/null +++ b/src/dev/homebase/dev/example/reagent/todo.cljs @@ -0,0 +1,176 @@ +(ns homebase.dev.example.reagent.todo + (:require + [datascript.core :as d] + [reagent.core :as r] + [homebase.reagent :as hbr] + [datalog-console.integrations.datascript :as datalog-console])) + +(def schema {:db/ident {:db/unique :db.unique/identity} + :todo/project {:db/type :db.type/ref + :db/cardinality :db.cardinality/one} + :todo/owner {:db/type :db.type/ref + :db/cardinality :db.cardinality/one}}) + +(def db-conn (d/create-conn schema)) + +(def initial-tx [{:db/ident :todo.filters + :todo.filter/show-completed? true + :todo.filter/owner 0 + :todo.filter/project 0} + {:todo/name "Go home" + :todo/created-at (js/Date.now) + :todo/owner -2 + :todo/project -3} + {:todo/name "Fix ship" + :todo/completed? true + :todo/created-at (js/Date.now) + :todo/owner -1 + :todo/project -4} + {:db/id -1 + :user/name "Stella"} + {:db/id -2 + :user/name "Arpegius"} + {:db/id -3 + :project/name "Do it"} + {:db/id -4 + :project/name "Make it"}]) + +(d/transact! db-conn initial-tx) + +(hbr/connect! db-conn) + +(datalog-console/enable! {:conn db-conn}) + +(defn select [{:keys [attr]}] + (let [[options] (hbr/q '[:find ?e ?v + :in $ ?attr + :where [?e ?attr ?v]] + db-conn attr)] + (fn [{:keys [label attr value on-change]}] + [:label label " " + [:select + {:name (str attr) + :value (or value "") + :on-change (fn [e] (when on-change (on-change (js/Number (goog.object/getValueByKeys e #js ["target" "value"])))))} + [:option {:value ""} ""] + (for [[id value] @options] + ^{:key id} [:option + {:value id} + value])]]))) + +(defn todo [id] + (let [[todo] (hbr/entity db-conn id)] + (fn [id] + [:div {:style {:padding-bottom 20}} + [:div + [:input + {:type "checkbox" + :style {:width "18px" :height "18px" :margin-left "0"} + :checked (true? (:todo/completed? @todo)) + :on-change #(d/transact! db-conn [[:db/add (:db/id @todo) :todo/completed? (goog.object/getValueByKeys % #js ["target" "checked"])]])}] + [:input + {:type "text" + :style {:text-decoration (when (:todo/completed? @todo) "line-through") :border "none" :width "auto" :font-weight "bold" :font-size "20px"} + :value (:todo/name @todo) + :on-change #(d/transact! db-conn [[:db/add (:db/id @todo) :todo/name (goog.object/getValueByKeys % #js ["target" "value"])]])}]] + [:div + [select + {:label "Owner:" + :attr :user/name + :value (get-in @todo [:todo/owner :db/id]) + :on-change (fn [owner-id] (d/transact! db-conn [[(if (= 0 owner-id) :db/retract :db/add) (:db/id @todo) :todo/owner (when (not= 0 owner-id) owner-id)]]))}] + " · " + [select + {:label "Project:" + :attr :project/name + :value (get-in @todo [:todo/project :db/id]) + :on-change (fn [project-id] (d/transact! db-conn [[(if (= 0 project-id) :db/retract :db/add) (:db/id @todo) :todo/project (when (not= 0 project-id) project-id)]]))}] + " · " + [:button + {:on-click #(d/transact! db-conn [[:db/retractEntity (:db/id @todo)]])} + "Delete"]] + [:div + [:small {:style {:color "grey"}} + (.toLocaleString (js/Date. (:todo/created-at @todo)))]]]))) + +(defn todo-filters [] + (let [[filters] (hbr/entity db-conn [:db/ident :todo.filters])] + (fn [] + [:div {:style {:padding "20px 0"}} + [:strong "Filters · "] + [:label + "Show completed " + [:input + {:type "checkbox" + :checked (:todo.filter/show-completed? @filters) + :on-change #(d/transact! db-conn [[:db/add (:db/id @filters) :todo.filter/show-completed? (goog.object/getValueByKeys % #js ["target" "checked"])]])}]] + " · " + [select + {:label "Owner" + :attr :user/name + :value (:todo.filter/owner @filters) + :on-change (fn [owner-id] (d/transact! db-conn [[:db/add (:db/id @filters) :todo.filter/owner (or owner-id 0)]]))}] + " · " + [select + {:label "Project" + :attr :project/name + :value (:todo.filter/project @filters) + :on-change (fn [project-id] (d/transact! db-conn [[:db/add (:db/id @filters) :todo.filter/project (or project-id 0)]]))}]]))) + +(defn todos [] + (let [[todos] (hbr/q '[:find [(pull ?todo [:db/id :todo/created-at]) ...] + :where + ; Get all todos with names + [?todo :todo/name] + + ; Get the id for :todo.filters + [?filters :db/ident :todo.filters] + + ; Filter completed todos if not :todo.filter/show-completed? + (or [?filters :todo.filter/show-completed? true] + (not [?todo :todo/completed? true])) + + ; Filter by owner if :todo.filter/owner is not 0 + [?filter :todo.filter/owner ?owner] + (or [(= 0 ?owner)] + [?todo :todo/owner ?owner]) + + ; Filter by project if :todo.filter/project is not 0 + [?filter :todo.filter/project ?project] + (or [(= 0 ?project)] + [?todo :todo/project ?project])] + db-conn)] + (fn [] + [:div + [todo-filters] + [:div + (for [{:keys [db/id]} + (->> @todos + (sort-by :todo/created-at) + (reverse))] + ^{:key id} [todo id])]]))) + +(defn new-todo [] + (let [name (r/atom "") + [filters] (hbr/entity db-conn [:db/ident :todo.filters])] + (fn [] + [:form {:on-submit (fn [e] + (.preventDefault e) + (d/transact! db-conn [{:todo/name @name + :todo/created-at (js/Date.now)} + ; Also reset the filters to make sure the new todo shows up in the UI immediately + {:db/id (:db/id @filters) + :todo.filter/show-completed? true + :todo.filter/owner 0 + :todo.filter/project 0}]) + (reset! name ""))} + [:input {:type "text" + :on-change #(reset! name (goog.object/getValueByKeys % #js ["target" "value"])) + :value @name + :placeholder "Write a todo..."}] + [:button {:type "submit"} "Create todo"]]))) + +(defn todo-app [] + [:div + [new-todo] + [todos]]) \ No newline at end of file diff --git a/src/dev/macros.clj b/src/dev/homebase/dev/macros.clj similarity index 62% rename from src/dev/macros.clj rename to src/dev/homebase/dev/macros.clj index c1bb749f..657380bc 100644 --- a/src/dev/macros.clj +++ b/src/dev/homebase/dev/macros.clj @@ -1,4 +1,5 @@ -(ns dev.macros) +(ns homebase.dev.macros + {:no-doc true}) (defmacro inline-resource [resource-path] (slurp resource-path)) diff --git a/src/homebase/datalog_console.cljs b/src/homebase/datalog_console.cljs deleted file mode 100644 index e2b64701..00000000 --- a/src/homebase/datalog_console.cljs +++ /dev/null @@ -1,18 +0,0 @@ -(ns homebase.datalog-console - (:require [goog.object :as gobj] - [cljs.reader])) - -(js/document.documentElement.setAttribute "__datalog-console-remote-installed__" true) - -(defn init! - [{:keys [conn]}] - (.addEventListener js/window "message" - (fn [event] - (when-let [devtool-message (gobj/getValueByKeys event "data" ":datalog-console.client/devtool-message")] - (let [msg-type (:type (cljs.reader/read-string devtool-message))] - (case msg-type - - :datalog-console.client/request-whole-database-as-string - (.postMessage js/window #js {":datalog-console.remote/remote-message" (pr-str @conn)} "*") - - nil)))))) \ No newline at end of file diff --git a/src/main/homebase/cache.cljs b/src/main/homebase/cache.cljs new file mode 100644 index 00000000..0e33b062 --- /dev/null +++ b/src/main/homebase/cache.cljs @@ -0,0 +1,124 @@ +(ns homebase.cache + "A homebase cache intermediates between a view layer like React or Reagent and a data layer like Datascript or Datahike. + + It ensures that as data changes the view is incremently updated to reflect the most recent state while maintaining consistency/transactionality, performing all updates for a transaction simultaneously. + + The cache takes the form of a map where components (identified by site-ids) can subscribe to updates of specific data by associng change-handlers into the cache. + + E.g. + + ```clojure + {:ea + {[\"EntityId\" :attribute] + {\"uuid-for-a-component-or-'hook'\" ; multiple components may subscribe to changes in the same datom so each gets their own change-handler + (fn on-entity-attr-change-handler-fn + [{:db-after ; the db value that corresponds with this update. Should be used by the consuming component to update the view so it stays in sync because all change-handlers use the same DB snapshot for the same TX. + :datom ; the updated datom + :site-id \"uuid-for-a-component-or-'hook'\"}] + ; INSERT code to update the view in this component with the newest state of this datom + )}} + :q + {['[:find ?e ?a ?v + :where [?e ?a ?v]] + other-inputs] + {\"uuid-for-a-component-or-'hook'\" ; multiple components may subscribe to changes in the same query so each gets their own change-handler + (fn on-query-change-handler-fn + [{:db-after ; the db value that corresponds with this update. Should be used by the consuming component to update the view so it stays in sync because all change-handlers use the same DB snapshot for the same TX. + :site-id \"uuid-for-a-component-or-'hook'\"}] + ; INSERT code to update the view with the latest results of the query + )}}} + ``` + + The cache takes care of appropriately invoking change-handlers after every transaction." + (:refer-clojure :exclude [assoc dissoc]) + (:require + [datascript.core] + [datascript.db])) + +(defn create-conn + "Returns a homebase.cache in an atom." + [] + (atom + {:ea {} + :q {}})) + +(defn assoc + "Helper to assoc a change-handler into the cache. + + Usage: + ```clojure + ; assoc to the Entity cache + (homebase.cache/assoc cache :ea [1 :attr] \"a uid for the call site\" (fn change-handler [...] ...)) + + ; assoc to the Query cache + (homebase.cache/assoc cache :q '[:find ... :where ...] \"a uid for the call site\" (fn change-handler [...] ...)) + ```" + [cache cache-type lookup site-id change-handler] + (assoc-in cache [cache-type lookup site-id] change-handler)) + +(defn dissoc + [cache cache-type lookup site-id] + (let [cache (update-in cache [cache-type lookup] clojure.core/dissoc site-id)] + (if (empty? (get-in cache [cache-type lookup])) + (update cache cache-type clojure.core/dissoc lookup) + cache))) + +(defn create-listener + "Returns a db listener function that invokes all subscribed change-handlers in the cache when a datom is transacted. + + Entity Attribute cache updates are mostly complete and dispatch on the smallest possible set of change-handlers. + + Query cache updates are NOT complete and all of them dispatch on every transaction regardless of whether the transaction can be infered to change the results of a query or not. This is tends to be fine for datasets with thousands of datoms, but could be expensive for applications with lots of datoms and lots of complex queries. Improvements via differential datalog need to be investigated." + [cache-conn] + (fn [{:keys [tx-data db-after]}] + (let [cache @cache-conn + ;; The EA change-handler only needs to be triggered once for each site-id. + ;; NOTE: this is complected with knowledge of how homebase.reagent currently handles updates and a clearer seperation of concerns should probably be drawn. But for now it's easier to just do this check here. + triggered-ea-handlers (atom #{})] + ;; EA handlers + (doseq [[e a :as datom] tx-data] + (let [subscriptions (get-in cache [:ea [e a]])] + (doseq [[site-id change-handler] subscriptions] + (when (not (get @triggered-ea-handlers site-id)) + (swap! triggered-ea-handlers conj site-id) + (change-handler {:db-after db-after + :datom datom + :site-id site-id}))))) + ;; Query handlers + ;; TODO: dispatch on change-handlers more judiciously instead of on every transaction. + ;; See work on incremental view manintinence e.g. https://github.com/sixthnormal/clj-3df + (let [subscriptions (mapcat seq (vals (:q cache)))] + (doseq [[site-id change-handler] subscriptions] + (change-handler {:db-after db-after + :site-id site-id})))))) + +(defn db-conn-type [db-conn] + (if (instance? cljs.core/Atom db-conn) + (type @db-conn) + (type db-conn))) + +(defmulti connect! + "Connect the cache to a database connection and listen to changes in the transaction log." + (fn [cache-conn db-conn] (db-conn-type db-conn))) +(defmethod connect! datascript.db/DB [cache-conn db-conn] + (swap! db-conn with-meta (merge (meta @db-conn) {::conn cache-conn})) + (datascript.core/listen! db-conn ::connection (create-listener cache-conn))) + +(defmulti disconnect! + "Disconnect the transaction log listener." + (fn [db-conn] (db-conn-type db-conn))) +(defmethod disconnect! datascript.db/DB [db-conn] + (swap! db-conn with-meta (clojure.core/dissoc (meta @db-conn) ::conn)) + (datascript.core/unlisten! db-conn ::connection)) + +(comment + (do + (def cache-conn (create-conn)) + (def db-conn (datascript.core/create-conn {})) + (connect! cache-conn db-conn) + (swap! cache-conn assoc-ea [1 :a] "abc123" #(print "yolo" %))) + (datascript.core/transact! db-conn [{:a "a" :b "b" :c "c"}]) + (datascript.core/transact! db-conn [[:db/retract 1 :a]]) + (datascript.core/transact! db-conn [[:db/retractEntity 1]]) + (swap! cache-conn dissoc-ea [1 :a] "abc123") + (disconnect! db-conn)) \ No newline at end of file diff --git a/src/homebase/js.cljs b/src/main/homebase/js.cljs similarity index 93% rename from src/homebase/js.cljs rename to src/main/homebase/js.cljs index e83f6fb8..3e90648b 100644 --- a/src/homebase/js.cljs +++ b/src/main/homebase/js.cljs @@ -1,4 +1,5 @@ (ns homebase.js + {:no-doc true} (:require [homebase.util :as u] [clojure.walk :as walk] @@ -97,22 +98,22 @@ (throw (js/Error. (str "The '" nmspc "." attr "' attribute should be a ref type of many." "\n\nAdd this to your config: lookupHelpers: { " nmspc ": { " attr ": { type: 'ref', cardinality: 'many' }}}\n")))) (reduce into - (map-indexed - (fn [i v] - (when (vector? v) - (throw (js/Error. (str "Unsupported JSON in transaction: nested array of arrays `" attr ": [" v "]`. If you need to transact unnamed JSON (tuples, lists) consider serializing it to a string first via `JSON.stringify(yourData)`. If you think homebase-react should have a first class JSON datatype let us know https://github.com/homebaseio/homebase-react/discussions")))) - (let [id (swap! temp-ids-atom dec)] - (into - [[:db/add parent-id (js->key nmspc attr) id] - [:db/add id :homebase.array/order (+ 1 i)]] - (if (scalar? v) - [[:db/add id :homebase.array/value v]] - (let [child-id (or (get v "id") - (get (second (first v)) "id") - (swap! temp-ids-atom dec))] - (into [[:db/add id :homebase.array/ref child-id]] - (js->tx-part schema temp-ids-atom (cons [attr child-id true] key-path) v))))))) - tx-part))) + (map-indexed + (fn [i v] + (when (vector? v) + (throw (js/Error. (str "Unsupported JSON in transaction: nested array of arrays `" attr ": [" v "]`. If you need to transact unnamed JSON (tuples, lists) consider serializing it to a string first via `JSON.stringify(yourData)`. If you think homebase-react should have a first class JSON datatype let us know https://github.com/homebaseio/homebase-react/discussions")))) + (let [id (swap! temp-ids-atom dec)] + (into + [[:db/add parent-id (js->key nmspc attr) id] + [:db/add id :homebase.array/order (+ 1 i)]] + (if (scalar? v) + [[:db/add id :homebase.array/value v]] + (let [child-id (or (get v "id") + (get (second (first v)) "id") + (swap! temp-ids-atom dec))] + (into [[:db/add id :homebase.array/ref child-id]] + (js->tx-part schema temp-ids-atom (cons [attr child-id true] key-path) v))))))) + tx-part))) (defmethod js->tx-part :default [_ _ [[attr id] [nmspc]] tx-part] [[(if (nil? tx-part) :db/retract :db/add) id @@ -440,4 +441,4 @@ For example: query({ :>> (fn [[_ v]] (str "Expected $where clause to be a nested object, not " v "." (example-js-query))) - (goog.object/get error "message"))) + (goog.object/get error "message"))) \ No newline at end of file diff --git a/src/homebase/react.cljs b/src/main/homebase/react.cljs similarity index 96% rename from src/homebase/react.cljs rename to src/main/homebase/react.cljs index 70dd95b7..365a775b 100644 --- a/src/homebase/react.cljs +++ b/src/main/homebase/react.cljs @@ -1,4 +1,5 @@ (ns homebase.react + {:no-doc true} (:require ["react" :as react] [clojure.string] @@ -8,9 +9,7 @@ [homebase.js :as hbjs] [datascript.core :as d] [datascript.impl.entity :as de] - [homebase.datalog-console :as datalog-console])) - - + [datalog-console.integrations.datascript :as datalog-console])) (defn try-hook [hook-name f] (if hbjs/*debug* @@ -29,13 +28,13 @@ (clojure.string/trim)))))))))) (defn debug-msg [return-value & msgs] - (when (and (number? hbjs/*debug*) (>= hbjs/*debug* 2)) + (when (and (number? hbjs/*debug*) (>= hbjs/*debug* 2)) (apply js/console.log "%c homebase-react " "background: yellow" msgs)) return-value) (defn changed? [entities cached-entities track-count?] (cond - (and track-count? + (and track-count? (not= (count entities) (count cached-entities))) (debug-msg true "cache:miss" "count of entities != cache" #js {:entities (clj->js entities) @@ -137,10 +136,10 @@ conn (d/create-conn (if schema (merge (hbjs/js->schema schema) base-schema) base-schema))] - (datalog-console/init! {:conn conn}) + (datalog-console/enable! {:conn conn}) (when initial-tx (hbjs/transact! conn initial-tx)) (react/createElement - (goog.object/get homebase-context "Provider") + (goog.object/get homebase-context "Provider") #js {:value conn} (goog.object/get props "children")))) @@ -162,7 +161,7 @@ "removeTransactListener" #(d/unlisten! conn key)}) #js [])] [client])) - + (defn ^:export useEntity [lookup] (let [conn (react/useContext homebase-context) cached-entities (react/useMemo #(atom {}) #js []) @@ -190,7 +189,7 @@ (defn ^:export useQuery [query & args] (let [conn (react/useContext homebase-context) cached-entities (react/useMemo #(atom {}) #js []) - run-query (react/useCallback + run-query (react/useCallback (fn run-query [] (let [result (try-hook "useQuery" #(apply hbjs/q query conn args))] (when (and (not= (count result) (count @cached-entities)) @@ -215,7 +214,7 @@ (defn ^:export useTransact [] (let [conn (react/useContext homebase-context) - transact (react/useCallback + transact (react/useCallback (fn transact [tx] (try-hook "useTransact" #(hbjs/transact! conn tx))) #js [])] [transact])) \ No newline at end of file diff --git a/src/main/homebase/reagent.cljs b/src/main/homebase/reagent.cljs new file mode 100644 index 00000000..0d34f6a4 --- /dev/null +++ b/src/main/homebase/reagent.cljs @@ -0,0 +1,156 @@ +(ns homebase.reagent + (:require + [homebase.cache :as hbc] + [datalog-console.chrome.formatters] ; Load the formatters ns to extend cljs-devtools to better render db entities in the chrome console if cljs-devtools is enabled. + [devtools.protocols :as dtp :refer [IFormat]] + [datascript.impl.entity :as de] + [reagent.core :as r] + [nano-id.core :refer [nano-id]] + [datascript.core :as d])) + +(declare lookup-entity) + +(deftype Entity [^de/Entity entity meta] + IFormat + (-header [_] (dtp/-header entity)) + (-has-body [_] (dtp/-has-body entity)) + (-body [_] (dtp/-body entity)) + IMeta + (-meta [_] meta) + IWithMeta + (-with-meta [_ new-meta] (Entity. entity new-meta)) + ILookup + (-lookup [this attr] (lookup-entity this attr nil)) + (-lookup [this attr not-found] (lookup-entity this attr not-found)) + IAssociative + (-contains-key? [this k] (not= ::nf (lookup-entity this k ::nf))) + IFn + (-invoke [this k] (lookup-entity this k nil)) + (-invoke [this k not-found] (lookup-entity this k not-found))) + +(defn ^:no-doc lookup-entity [^Entity entity attr not-found] + (let [result (de/lookup-entity ^de/Entity (.-entity entity) attr not-found) + after-lookup (::after-lookup (meta entity))] + (when after-lookup (after-lookup {:entity (.-entity entity) :attr attr :result result})) + (cond + (instance? de/Entity result) + (Entity. result {::after-lookup after-lookup}) + + (and (set? result) (instance? de/Entity (first result))) + (set (map #(Entity. % {::after-lookup after-lookup}) result)) + + :else result))) + +(defn connect! + "Connects a db-conn to a homebase.cache. This is a prerequisite for any of the db read functions in this namespace to be reactive. Returns a homebase.cache connection. + + ```clojure + (def db-conn (datascript/create-conn)) + (hbr/connect! db-conn) + ```" + [db-conn] + (let [cache-conn (hbc/create-conn)] + (hbc/connect! cache-conn db-conn) + {:cache-conn cache-conn})) + +(defn disconnect! [db-conn] + (hbc/disconnect! db-conn)) + +(defn ^:no-doc get-cache-conn-from-db [db] + (let [cache-conn (:homebase.cache/conn (meta db)) + _ (when (not cache-conn) + (throw (ex-info "Cache not connected. Connect your db to the cache with (homebase.reagent/connect! db-conn) first." + {})))] + cache-conn)) + +(defn ^:no-doc make-reactive-entity [{:keys [^de/Entity entity r-entity tracked-ea-pairs db-conn cache-conn site-id] :as args}] + (let [top-level-entity-id (:db/id entity) + e (Entity. entity {::after-lookup + (fn after-lookup [{:keys [^de/Entity entity attr]}] + (swap! tracked-ea-pairs conj [(:db/id entity) attr]) + (swap! cache-conn hbc/assoc :ea [(:db/id entity) attr] site-id + (fn change-handler [{:keys [db-after]}] + (reset! r-entity + (make-reactive-entity + (merge args {:entity (d/entity db-after top-level-entity-id)}))))) + #_(js/console.log top-level-entity-id (:db/id entity) attr @cache-conn))})] + e)) + +(defn entity + "Returns a reactive `homebase.reagent/Entity` wrapped in a vector. + + It offers a normalized subset of other entity APIs with the + primary addition being that implemented protocols are reactive + and trigger re-renders when related datoms change. + + Usage: + + ```clojure + (defn your-component [] + (let [[entity-1] (hbr/entity db-conn 1) + [entity-2] (hbr/entity db-conn [:uniq-attr :value])] + (fn [] + [:div + (:attr @entity-1) + (get-in @entity-2 [:ref-attr :attr])]))) + ``` + + Gotchas: + + - **This takes a conn, not a db.** + - `homebase.reagent/Entity` only implements the `ILookup` and `IFn` protocols, i.e. only attribute lookups like `(:attr hbr-entity)`. + - Use non-reactive entities from your DB if you need to use other protocols. + - E.g. `(datascript/entity @db-conn 1)`" + [db-conn lookup] + (let [cache-conn (get-cache-conn-from-db @db-conn) + entity (d/entity @db-conn lookup) + site-id (nano-id) + tracked-ea-pairs (atom #{}) + r-entity (r/atom nil) + hbr-entity (make-reactive-entity {:entity entity :r-entity r-entity :tracked-ea-pairs tracked-ea-pairs :db-conn db-conn :cache-conn cache-conn :site-id site-id}) + _ (reset! r-entity hbr-entity) + f (fn [] + (r/with-let [] + @r-entity + (finally ; handle unmounting this component + (doseq [ea @tracked-ea-pairs] + (swap! cache-conn hbc/dissoc :ea ea site-id) + #_(js/console.log ea @cache-conn)))))] + [(r/track f)])) + +(defn q + "Returns a reactive query result wrapped in a vector. + + It will trigger a re-render when its result changes. + + Usage: + + ```clojure + (defn your-component [] + (let [[query-result] (hbr/q db-conn [:find [?e ...] + :where [?e :attr]])] + (fn [] + [:div + (for [eid @query-result] + ^{:key eid}[another-component eid])]))) + ``` + + Gotchas: + + - **This takes a conn, not a db.** + - At the moment it's only possible to [[connect!]] to one DB at a time, so reactive query results are only supported on one DB. If you pass more DBs as args the query will only be rerun if the first DB changes." + [query db-conn & inputs] + (let [cache-conn (get-cache-conn-from-db @db-conn) + result (apply d/q query @db-conn inputs) + r-result (r/atom result) + site-id (nano-id) + _ (swap! cache-conn hbc/assoc :q [query inputs] site-id + (fn [{:keys [db-after]}] + (reset! r-result (apply d/q query db-after inputs)))) + f (fn [] + (r/with-let [] + @r-result + (finally ; handle unmounting this component + (swap! cache-conn hbc/dissoc :q [query inputs] site-id) + #_(js/console.log query @cache-conn))))] + [(r/track f)])) \ No newline at end of file diff --git a/src/homebase/util.cljs b/src/main/homebase/util.cljs similarity index 78% rename from src/homebase/util.cljs rename to src/main/homebase/util.cljs index c1a944eb..bac990f2 100644 --- a/src/homebase/util.cljs +++ b/src/main/homebase/util.cljs @@ -1,4 +1,5 @@ -(ns homebase.util) +(ns homebase.util + {:no-doc true}) (defn paths [m] (if (or (not (map? m)) (empty? m)) diff --git a/src/homebase/benchmarks.test.js b/src/test/homebase/benchmarks.test.js similarity index 97% rename from src/homebase/benchmarks.test.js rename to src/test/homebase/benchmarks.test.js index effee940..8ccc8da9 100644 --- a/src/homebase/benchmarks.test.js +++ b/src/test/homebase/benchmarks.test.js @@ -7,7 +7,7 @@ import Enzyme, { mount } from 'enzyme' import Adapter from 'enzyme-adapter-react-16' import React from 'react' import Benchmark from 'react-component-benchmark' -import { HomebaseProvider, useEntity, useTransact } from '../../dist/js/homebase.react' +import { HomebaseProvider, useEntity, useTransact } from '../../../dist/js/homebase.react' const config = { initialData: [ @@ -36,7 +36,8 @@ const Counter = () => { count: counter.get('count') + 1, }, }, - ])} + ]) + } > Increment diff --git a/src/homebase/js_test.cljs b/src/test/homebase/js_test.cljs similarity index 99% rename from src/homebase/js_test.cljs rename to src/test/homebase/js_test.cljs index fdd98df9..352a0961 100644 --- a/src/homebase/js_test.cljs +++ b/src/test/homebase/js_test.cljs @@ -1,4 +1,5 @@ (ns homebase.js-test + {:no-doc true} (:require [clojure.test :refer [deftest testing is]] [datascript.core :as d] diff --git a/src/homebase/react.test.js b/src/test/homebase/react.test.js similarity index 99% rename from src/homebase/react.test.js rename to src/test/homebase/react.test.js index 11d14e3e..facd7a3c 100644 --- a/src/homebase/react.test.js +++ b/src/test/homebase/react.test.js @@ -11,7 +11,7 @@ import { useEntity, useQuery, useTransact -} from '../../dist/js/homebase.react' +} from '../../../dist/js/homebase.react' const config = { lookupHelpers: { @@ -337,8 +337,7 @@ describe('client', () => {

diff --git a/src/test/homebase/reagent_test.cljs b/src/test/homebase/reagent_test.cljs new file mode 100644 index 00000000..7ad38eab --- /dev/null +++ b/src/test/homebase/reagent_test.cljs @@ -0,0 +1,82 @@ +(ns homebase.reagent-test + {:no-doc true} + (:require + [homebase.test-polyfills] + [reagent.core :as r] + [datascript.core :as d] + [homebase.reagent :as hbr] + [clojure.test :refer [deftest testing is use-fixtures]] + [homebase.dev.example.reagent.counter :as counter] + [homebase.dev.example.reagent.todo :as todo] + ["@testing-library/react" :as rt])) + +(set! *warn-on-infer* false) + +(use-fixtures :each + {:after rt/cleanup}) + +;; Idea from https://github.com/reagent-project/reagent/blob/master/test/reagenttest/utils.cljs +(defn with-mounted-component [comp f] + (let [mounted-component (rt/render (r/as-element comp))] + (try + (f mounted-component) + (finally + (.unmount mounted-component) + (r/flush))))) + +(defn click-element [el] + (.click rt/fireEvent el) + (r/flush)) + +(deftest test-counter + (do + (reset! counter/db-conn @(d/create-conn)) + (d/transact! counter/db-conn [[:db/add 1 :count 0]]) + (hbr/connect! counter/db-conn) + (with-mounted-component + [counter/counter] + (fn [^js/React component] + (testing "The count should start at 0" + (is (not (nil? (.getByText component "Count: 0"))))) + (testing "The count should inc by 1" + (click-element (.getByText component "Increment")) + (is (not (nil? (.getByText component "Count: 1"))))) + (testing "The count should inc by 2 more" + (click-element (.getByText component "Increment")) + (click-element (.getByText component "Increment")) + (is (not (nil? (.getByText component "Count: 3"))))))))) + +(deftest test-todo + (do + (reset! todo/db-conn @(d/create-conn todo/schema)) + (d/transact! todo/db-conn todo/initial-tx) + (hbr/connect! todo/db-conn) + (with-mounted-component + [todo/todo-app] + (fn [component] + (testing "render list" + (is (not (nil? (.getByDisplayValue component "Go home")))) + (is (not (nil? (.getByDisplayValue component "Fix ship"))))) + (testing "query updates list on filter change" + (d/transact! todo/db-conn [{:db/id (:db/id (d/entity @todo/db-conn [:db/ident :todo.filters])) + :todo.filter/show-completed? false}]) + (r/flush) + (is (not (nil? (.getByDisplayValue component "Go home")))) + (is (thrown-with-msg? + js/Error + #"Unable to find an element with the display value: Fix ship" + (.getByDisplayValue component "Fix ship"))) + (d/transact! todo/db-conn [{:db/id (:db/id (d/entity @todo/db-conn [:db/ident :todo.filters])) + :todo.filter/show-completed? true}]) + (r/flush)) + (testing "deletion" + (click-element (nth (.getAllByText component "Delete") 0)) + (is (thrown-with-msg? + js/Error + #"Unable to find an element with the display value: Fix ship." + (.getByDisplayValue component "Fix ship"))) + (is (not (nil? (.getByDisplayValue component "Go home"))))) + (testing "insertion" + (d/transact! todo/db-conn [{:todo/name "A new test todo" :todo/created-at (js/Date.now)}]) + (r/flush) + (is (not (nil? (.getByDisplayValue component "A new test todo"))))))))) \ No newline at end of file diff --git a/src/test/homebase/test_polyfills.cljs b/src/test/homebase/test_polyfills.cljs new file mode 100644 index 00000000..a83dc24b --- /dev/null +++ b/src/test/homebase/test_polyfills.cljs @@ -0,0 +1,13 @@ +(ns homebase.test-polyfills + (:require + ["@peculiar/webcrypto" :refer [Crypto]] + ["jsdom" :refer [JSDOM]])) + +; nano-id node.js polyfill +(set! js/crypto (Crypto.)) + +; jsdom polyfill +(def dom (JSDOM. "" #js {:pretendToBeVisual true})) +(set! js/window dom.window) +(set! js/document dom.window.document) +(set! js/navigator #js {:userAgent "node.js"}) \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index eec4bdda..e879e376 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1828,6 +1828,34 @@ dependencies: "@octokit/openapi-types" "^6.0.0" +"@peculiar/asn1-schema@^2.0.27", "@peculiar/asn1-schema@^2.0.32": + version "2.0.36" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-schema/-/asn1-schema-2.0.36.tgz#ca7978f43ffa4f35fbb74436c3f983c10a69ac27" + integrity sha512-x7fdMR6bzOBct2a0PLukrmVrrehHX5uisKRDWN2Bs1HojXd5nCi7MAQeV+umRxPK1oSJDstTBhGq3sLzDbL8Vw== + dependencies: + "@types/asn1js" "^2.0.0" + asn1js "^2.1.1" + pvtsutils "^1.1.7" + tslib "^2.2.0" + +"@peculiar/json-schema@^1.1.12": + version "1.1.12" + resolved "https://registry.yarnpkg.com/@peculiar/json-schema/-/json-schema-1.1.12.tgz#fe61e85259e3b5ba5ad566cb62ca75b3d3cd5339" + integrity sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w== + dependencies: + tslib "^2.0.0" + +"@peculiar/webcrypto@^1.1.7": + version "1.1.7" + resolved "https://registry.yarnpkg.com/@peculiar/webcrypto/-/webcrypto-1.1.7.tgz#ff02008612e67ab7cc2a92fce04a7f0e2a04b71c" + integrity sha512-aCNLYdHZkvGH+T8/YBOY33jrVGVuLIa3bpizeHXqwN+P4ZtixhA+kxEEWM1amZwUY2nY/iuj+5jdZn/zB7EPPQ== + dependencies: + "@peculiar/asn1-schema" "^2.0.32" + "@peculiar/json-schema" "^1.1.12" + pvtsutils "^1.1.6" + tslib "^2.2.0" + webcrypto-core "^1.2.0" + "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" @@ -2229,6 +2257,11 @@ resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.1.tgz#78b5433344e2f92e8b306c06a5622c50c245bf6b" integrity sha512-S6oPal772qJZHoRZLFc/XoZW2gFvwXusYUmXPXkgxJLuEk2vOt7jc4Yo6z/vtI0EBkbPBVrJJ0B+prLIKiWqHg== +"@types/asn1js@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/asn1js/-/asn1js-2.0.0.tgz#10ca75692575744d0117098148a8dc84cbee6682" + integrity sha512-Jjzp5EqU0hNpADctc/UqhiFbY1y2MqIxBVa2S4dBlbnZHTLPMuggoL5q43X63LpsOIINRDirBjP56DUUKIUWIA== + "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7": version "7.1.14" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.14.tgz#faaeefc4185ec71c389f4501ee5ec84b170cc402" @@ -2545,6 +2578,11 @@ acorn@^8.1.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.1.0.tgz#52311fd7037ae119cbb134309e901aa46295b3fe" integrity sha512-LWCF/Wn0nfHOmJ9rzQApGnxnvgfROzGilS8936rqN/lfcYkY9MYZzdMqN+2NJ4SlTc+m5HiSa+kNfDtI64dwUA== +acorn@^8.2.4: + version "8.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.4.1.tgz#56c36251fc7cabc7096adc18f05afe814321a28c" + integrity sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA== + agent-base@4, agent-base@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" @@ -2959,6 +2997,13 @@ asn1@~0.2.3: dependencies: safer-buffer "~2.1.0" +asn1js@^2.0.26, asn1js@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/asn1js/-/asn1js-2.1.1.tgz#bb3896191ebb5fb1caeda73436a6c6e20a2eedff" + integrity sha512-t9u0dU0rJN4ML+uxgN6VM2Z4H5jWIYm0w8LsZLzMJaQsgL3IJNbxHgmbWDvJAwspyHpDFuzUaUFh4c05UB4+6g== + dependencies: + pvutils latest + assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" @@ -4656,7 +4701,7 @@ columnify@~1.5.4: strip-ansi "^3.0.0" wcwidth "^1.0.0" -combined-stream@^1.0.6, combined-stream@~1.0.6: +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -6684,6 +6729,15 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= +form-data@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" @@ -7046,6 +7100,11 @@ global-dirs@^2.0.1: dependencies: ini "1.3.7" +global-jsdom@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/global-jsdom/-/global-jsdom-8.1.0.tgz#7e96f86629054e1a27437eda1b0c1b7809782740" + integrity sha512-FBi84GT/MrzP+H3aReBSWXGVz2kdPaDrK/DByKrOq16mRexWrcJNpV6SONCKXWQuzxRjA7UXMfIvxmGyQZS+2Q== + global-modules@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" @@ -8099,6 +8158,11 @@ is-potential-custom-element-name@^1.0.0: resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz#0c52e54bcca391bb2c494b21e8626d7336c6e397" integrity sha1-DFLlS8yjkbssSUsh6GJtczbG45c= +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + is-redirect@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" @@ -8818,6 +8882,39 @@ jsdom@^16.4.0: ws "^7.4.4" xml-name-validator "^3.0.0" +jsdom@^16.6.0: + version "16.6.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.6.0.tgz#f79b3786682065492a3da6a60a4695da983805ac" + integrity sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg== + dependencies: + abab "^2.0.5" + acorn "^8.2.4" + acorn-globals "^6.0.0" + cssom "^0.4.4" + cssstyle "^2.3.0" + data-urls "^2.0.0" + decimal.js "^10.2.1" + domexception "^2.0.1" + escodegen "^2.0.0" + form-data "^3.0.0" + html-encoding-sniffer "^2.0.1" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.0" + parse5 "6.0.1" + saxes "^5.0.1" + symbol-tree "^3.2.4" + tough-cookie "^4.0.0" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^2.0.0" + webidl-conversions "^6.1.0" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.5.0" + ws "^7.4.5" + xml-name-validator "^3.0.0" + jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" @@ -12077,6 +12174,18 @@ pupa@^2.0.1: dependencies: escape-goat "^2.0.0" +pvtsutils@^1.1.2, pvtsutils@^1.1.6, pvtsutils@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.1.7.tgz#39a65ccb3b7448c974f6a6141ce2aad037b3f13c" + integrity sha512-faOiD/XpB/cIebRzYwzYjCmYgiDd53YEBni+Mt1+8/HlrARHYBpsU2OHOt3EZ1ZhfRNxPL0dH3K/vKaMgNWVGA== + dependencies: + tslib "^2.2.0" + +pvutils@latest: + version "1.0.17" + resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.0.17.tgz#ade3c74dfe7178944fe44806626bd2e249d996bf" + integrity sha512-wLHYUQxWaXVQvKnwIDWFVKDJku9XDCvyhhxoq8dc5MFdIlRenyPI9eSfEtcvgHgD7FlvCyGAlWgOzRnZD99GZQ== + q@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" @@ -14330,6 +14439,11 @@ tslib@^1.8.1, tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== +tslib@^2.0.0, tslib@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" + integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== + tslib@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c" @@ -14865,6 +14979,17 @@ wcwidth@^1.0.0, wcwidth@^1.0.1: dependencies: defaults "^1.0.3" +webcrypto-core@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/webcrypto-core/-/webcrypto-core-1.2.0.tgz#44fda3f9315ed6effe9a1e47466e0935327733b5" + integrity sha512-p76Z/YLuE4CHCRdc49FB/ETaM4bzM3roqWNJeGs+QNY1fOTzKTOVnhmudW1fuO+5EZg6/4LG9NJ6gaAyxTk9XQ== + dependencies: + "@peculiar/asn1-schema" "^2.0.27" + "@peculiar/json-schema" "^1.1.12" + asn1js "^2.0.26" + pvtsutils "^1.1.2" + tslib "^2.1.0" + webidl-conversions@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" @@ -15084,6 +15209,11 @@ ws@^7, ws@^7.4.4: resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.4.tgz#383bc9742cb202292c9077ceab6f6047b17f2d59" integrity sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw== +ws@^7.4.5: + version "7.5.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.0.tgz#0033bafea031fb9df041b2026fc72a571ca44691" + integrity sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw== + xcode@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/xcode/-/xcode-2.1.0.tgz#bab64a7e954bb50ca8d19da7e09531c65a43ecfe" From 9792cbf5fa4446200f594af625e66d37fce1a0a1 Mon Sep 17 00:00:00 2001 From: Chris Smothers Date: Fri, 25 Jun 2021 20:18:44 -0700 Subject: [PATCH 13/20] build: add no-doc --- src/dev/homebase/dev/example/reagent.cljs | 1 + src/dev/homebase/dev/example/reagent/counter.cljs | 1 + src/dev/homebase/dev/example/reagent/todo.cljs | 5 +++-- src/test/homebase/test_polyfills.cljs | 1 + 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/dev/homebase/dev/example/reagent.cljs b/src/dev/homebase/dev/example/reagent.cljs index 9232a768..1d532e50 100644 --- a/src/dev/homebase/dev/example/reagent.cljs +++ b/src/dev/homebase/dev/example/reagent.cljs @@ -1,4 +1,5 @@ (ns homebase.dev.example.reagent + {:no-doc true} (:require [devcards.core :as dc] [homebase.dev.example.reagent.counter :as counter] diff --git a/src/dev/homebase/dev/example/reagent/counter.cljs b/src/dev/homebase/dev/example/reagent/counter.cljs index 0088b04b..0038dee1 100644 --- a/src/dev/homebase/dev/example/reagent/counter.cljs +++ b/src/dev/homebase/dev/example/reagent/counter.cljs @@ -1,4 +1,5 @@ (ns homebase.dev.example.reagent.counter + {:no-doc true} (:require [datascript.core :as d] [homebase.reagent :as hbr] diff --git a/src/dev/homebase/dev/example/reagent/todo.cljs b/src/dev/homebase/dev/example/reagent/todo.cljs index 473f1e31..19035538 100644 --- a/src/dev/homebase/dev/example/reagent/todo.cljs +++ b/src/dev/homebase/dev/example/reagent/todo.cljs @@ -1,7 +1,8 @@ -(ns homebase.dev.example.reagent.todo +(ns homebase.dev.example.reagent.todo + {:no-doc true} (:require [datascript.core :as d] - [reagent.core :as r] + [reagent.core :as r] [homebase.reagent :as hbr] [datalog-console.integrations.datascript :as datalog-console])) diff --git a/src/test/homebase/test_polyfills.cljs b/src/test/homebase/test_polyfills.cljs index a83dc24b..ca94a420 100644 --- a/src/test/homebase/test_polyfills.cljs +++ b/src/test/homebase/test_polyfills.cljs @@ -1,4 +1,5 @@ (ns homebase.test-polyfills + {:no-doc true} (:require ["@peculiar/webcrypto" :refer [Crypto]] ["jsdom" :refer [JSDOM]])) From 28486daa0b9fc9666822e26e4b5b22d2260bac3c Mon Sep 17 00:00:00 2001 From: Chris Smothers Date: Fri, 25 Jun 2021 21:01:32 -0700 Subject: [PATCH 14/20] build: cljdoc --- pom.xml | 2 +- src/dev/homebase/dev/example/reagent.cljs | 2 +- src/dev/homebase/dev/macros.clj | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 91685637..f0fe8aeb 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ jar io.homebase homebase-react - 0.1.0 + 0.1.1-SNAPSHOT homebase-react Use a datalog DB to manage react application state https://github.com/homebaseio/homebase-react diff --git a/src/dev/homebase/dev/example/reagent.cljs b/src/dev/homebase/dev/example/reagent.cljs index 1d532e50..90522f70 100644 --- a/src/dev/homebase/dev/example/reagent.cljs +++ b/src/dev/homebase/dev/example/reagent.cljs @@ -11,7 +11,7 @@ (defcard-doc "# [Homebase React](https://github.com/homebaseio/homebase-react) | Reagent Examples - [![cljdoc badge](https://cljdoc.org/badge/io.homebase/homebase-react)](https://cljdoc.org/d/io.homebase/homebase-react/CURRENT) + **[cljdoc](https://cljdoc.org/d/io.homebase/homebase-react/CURRENT)** Examples diff --git a/src/dev/homebase/dev/macros.clj b/src/dev/homebase/dev/macros.clj index 657380bc..9ac65594 100644 --- a/src/dev/homebase/dev/macros.clj +++ b/src/dev/homebase/dev/macros.clj @@ -2,5 +2,7 @@ {:no-doc true}) (defmacro inline-resource [resource-path] - (slurp resource-path)) + (try + (slurp resource-path) + (catch Error e (print e)))) From 8c499ade4ce258e0e6ee1d4d9f1aa82aea3ed627 Mon Sep 17 00:00:00 2001 From: Chris Smothers Date: Sat, 26 Jun 2021 12:44:31 -0700 Subject: [PATCH 15/20] build: move dev and test to alias --- deps.edn | 15 ++++++------ pom.xml | 41 +++++++++++---------------------- shadow-cljs.edn | 2 +- src/dev/homebase/dev/macros.clj | 4 +--- 4 files changed, 22 insertions(+), 40 deletions(-) diff --git a/deps.edn b/deps.edn index 9d2a5cdc..e4ac9382 100644 --- a/deps.edn +++ b/deps.edn @@ -1,16 +1,15 @@ -{:paths ["src/dev" - "src/main" - "src/test"] - :deps {thheller/shadow-cljs {:mvn/version "2.11.25"} - devcards/devcards {:mvn/version "0.2.7"} - datascript/datascript {:mvn/version "1.0.7"} +{:paths ["src/main"] + :deps {datascript/datascript {:mvn/version "1.0.7"} reagent/reagent {:mvn/version "1.0.0-alpha2"} inflections/inflections {:mvn/version "0.13.2"} - binaryage/devtools {:mvn/version "1.0.2"} io.homebase/datalog-console {:mvn/version "0.2.2"} nano-id/nano-id {:mvn/version "1.0.0"} camel-snake-kebab/camel-snake-kebab {:mvn/version "0.4.2"}} - :aliases {:jar {:replace-deps {com.github.seancorfield/depstar {:mvn/version "2.0.216"}} + :aliases {:dev {:extra-paths ["src/dev" "src/test"] + :extra-deps {thheller/shadow-cljs {:mvn/version "2.11.25"} + devcards/devcards {:mvn/version "0.2.7"} + binaryage/devtools {:mvn/version "1.0.2"}}} + :jar {:replace-deps {com.github.seancorfield/depstar {:mvn/version "2.0.216"}} :exec-fn hf.depstar/jar :exec-args {:jar "homebase-react.jar" :sync-pom true}} :install {:replace-deps {slipset/deps-deploy {:mvn/version "0.1.5"}} diff --git a/pom.xml b/pom.xml index f0fe8aeb..f4d2824b 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ jar io.homebase homebase-react - 0.1.1-SNAPSHOT + 0.1.3-SNAPSHOT homebase-react Use a datalog DB to manage react application state https://github.com/homebaseio/homebase-react @@ -24,6 +24,9 @@ scm:git:ssh://git@github.com:homebaseio/homebase-react.git HEAD + + src/main + org.clojure @@ -31,14 +34,14 @@ 1.10.3 - io.homebase - datalog-console - 0.2.2 + datascript + datascript + 1.0.7 - thheller - shadow-cljs - 2.11.25 + reagent + reagent + 1.0.0-alpha2 inflections @@ -46,39 +49,21 @@ 0.13.2 - binaryage - devtools - 1.0.2 - - - devcards - devcards - 0.2.7 - - - reagent - reagent - 1.0.0-alpha2 + io.homebase + datalog-console + 0.2.2 nano-id nano-id 1.0.0 - - datascript - datascript - 1.0.7 - camel-snake-kebab camel-snake-kebab 0.4.2 - - src/dev - clojars diff --git a/shadow-cljs.edn b/shadow-cljs.edn index 9de4f7e8..c54b080c 100644 --- a/shadow-cljs.edn +++ b/shadow-cljs.edn @@ -1,5 +1,5 @@ ;; shadow-cljs configuration -{:deps true +{:deps {:aliases [:dev]} :dev-http {3000 "public"} :nrepl {:port 3333} :builds diff --git a/src/dev/homebase/dev/macros.clj b/src/dev/homebase/dev/macros.clj index 9ac65594..657380bc 100644 --- a/src/dev/homebase/dev/macros.clj +++ b/src/dev/homebase/dev/macros.clj @@ -2,7 +2,5 @@ {:no-doc true}) (defmacro inline-resource [resource-path] - (try - (slurp resource-path) - (catch Error e (print e)))) + (slurp resource-path)) From 42e41f1865954a87b9ce65e777ed6dc0f3bad5e8 Mon Sep 17 00:00:00 2001 From: Chris Smothers Date: Sat, 26 Jun 2021 12:50:51 -0700 Subject: [PATCH 16/20] docs(reagent): improve doc string --- src/main/homebase/reagent.cljs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/homebase/reagent.cljs b/src/main/homebase/reagent.cljs index 0d34f6a4..1e598df4 100644 --- a/src/main/homebase/reagent.cljs +++ b/src/main/homebase/reagent.cljs @@ -42,7 +42,7 @@ :else result))) (defn connect! - "Connects a db-conn to a homebase.cache. This is a prerequisite for any of the db read functions in this namespace to be reactive. Returns a homebase.cache connection. + "Connects a db-conn to a homebase.cache. This is a prerequisite for any of the db read functions in this namespace ([[entity]], [[q]]) to be reactive. Returns a homebase.cache connection. ```clojure (def db-conn (datascript/create-conn)) From 4ae8b6bb1a6f3a5073a98cdf5cc415bf2e272779 Mon Sep 17 00:00:00 2001 From: Chris Smothers Date: Sat, 26 Jun 2021 12:52:11 -0700 Subject: [PATCH 17/20] build: bump version to update cljdoc --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f4d2824b..f339dda7 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ jar io.homebase homebase-react - 0.1.3-SNAPSHOT + 0.1.1 homebase-react Use a datalog DB to manage react application state https://github.com/homebaseio/homebase-react From ce29d41472e2a99cf6a39e4efb1717260bec6445 Mon Sep 17 00:00:00 2001 From: Chris Smothers Date: Sun, 27 Jun 2021 12:03:09 -0700 Subject: [PATCH 18/20] docs: add e2e reagent examples --- examples/reagent/counter/.gitignore | 20 + examples/reagent/counter/package.json | 19 + examples/reagent/counter/public/index.html | 15 + examples/reagent/counter/shadow-cljs.edn | 12 + .../reagent/counter/src/main/counter.cljs | 24 + examples/reagent/counter/yarn.lock | 951 ++++++++++++++++++ examples/reagent/todo/.gitignore | 20 + examples/reagent/todo/package.json | 19 + examples/reagent/todo/public/index.html | 15 + examples/reagent/todo/shadow-cljs.edn | 12 + examples/reagent/todo/src/main/todo.cljs | 181 ++++ examples/reagent/todo/yarn.lock | 951 ++++++++++++++++++ .../homebase/dev/example/reagent/counter.cljs | 1 + .../homebase/dev/example/reagent/todo.cljs | 9 +- 14 files changed, 2245 insertions(+), 4 deletions(-) create mode 100644 examples/reagent/counter/.gitignore create mode 100644 examples/reagent/counter/package.json create mode 100644 examples/reagent/counter/public/index.html create mode 100644 examples/reagent/counter/shadow-cljs.edn create mode 100644 examples/reagent/counter/src/main/counter.cljs create mode 100644 examples/reagent/counter/yarn.lock create mode 100644 examples/reagent/todo/.gitignore create mode 100644 examples/reagent/todo/package.json create mode 100644 examples/reagent/todo/public/index.html create mode 100644 examples/reagent/todo/shadow-cljs.edn create mode 100644 examples/reagent/todo/src/main/todo.cljs create mode 100644 examples/reagent/todo/yarn.lock diff --git a/examples/reagent/counter/.gitignore b/examples/reagent/counter/.gitignore new file mode 100644 index 00000000..295a9c87 --- /dev/null +++ b/examples/reagent/counter/.gitignore @@ -0,0 +1,20 @@ +node_modules/ +public/js + +/target +/checkouts +/src/gen + +pom.xml +pom.xml.asc +*.iml +*.jar +*.log +.shadow-cljs +.idea +.lein-* +.nrepl-* +.DS_Store + +.hgignore +.hg/ diff --git a/examples/reagent/counter/package.json b/examples/reagent/counter/package.json new file mode 100644 index 00000000..1317e2a3 --- /dev/null +++ b/examples/reagent/counter/package.json @@ -0,0 +1,19 @@ +{ + "name": "counter", + "version": "0.0.1", + "private": true, + "scripts": { + "dev": "shadow-cljs watch dev" + }, + "devDependencies": { + "shadow-cljs": "2.14.5" + }, + "dependencies": { + "highlight.js": "^9.12.0", + "react": "16.13.0", + "react-dom": "16.13.0", + "react-grid-layout": "^0.16.6", + "react-icons": "^2.2.7", + "reakit": "^0.11.1" + } +} diff --git a/examples/reagent/counter/public/index.html b/examples/reagent/counter/public/index.html new file mode 100644 index 00000000..7af86eb1 --- /dev/null +++ b/examples/reagent/counter/public/index.html @@ -0,0 +1,15 @@ + + + + + homebase examples + + + + + + + + + + \ No newline at end of file diff --git a/examples/reagent/counter/shadow-cljs.edn b/examples/reagent/counter/shadow-cljs.edn new file mode 100644 index 00000000..0774f25f --- /dev/null +++ b/examples/reagent/counter/shadow-cljs.edn @@ -0,0 +1,12 @@ +;; shadow-cljs configuration +{:source-paths ["src/main"] + :dev-http {3000 "public"} + :dependencies [[datascript "1.0.7"] + [reagent "1.0.0-alpha2"] + [io.homebase/homebase-react "0.1.1"] + [io.homebase/datalog-console "0.2.2"]] + :builds {:dev {:target :browser + :output-dir "public/js" + :asset-path "/js" + :compiler-options {:externs ["datascript/externs.js"]} + :modules {:main {:init-fn counter/init!}}}}} diff --git a/examples/reagent/counter/src/main/counter.cljs b/examples/reagent/counter/src/main/counter.cljs new file mode 100644 index 00000000..8ac407ee --- /dev/null +++ b/examples/reagent/counter/src/main/counter.cljs @@ -0,0 +1,24 @@ +(ns counter + (:require + [reagent.dom :as rdom] + [datascript.core :as d] + [homebase.reagent :as hbr] + [datalog-console.integrations.datascript :as datalog-console])) + +(def db-conn (d/create-conn {})) +(d/transact! db-conn [[:db/add 1 :count 0]]) ; Transact some starting data. +(hbr/connect! db-conn) ; Connect homebase.reagent to the database. +(datalog-console/enable! {:conn db-conn}) ; Also connect the datalog-console extension for better debugging. + +(defn counter [] + (let [[entity] (hbr/entity db-conn 1)] ; Get a homebase.reagent/Entity. Note the use of db-conn and not @db-conn, this makes it reactive. + (js/console.log @entity) + (fn [] + [:div + "Count: " (:count @entity) ; Deref the entity just like a reagent/atom. + [:div + [:button {:on-click #(d/transact! db-conn [[:db/add 1 :count (inc (:count @entity))]])} ; Use d/transact! just like normal. + "Increment"]]]))) + +(defn init! [] + (rdom/render [counter] (.-body js/document))) diff --git a/examples/reagent/counter/yarn.lock b/examples/reagent/counter/yarn.lock new file mode 100644 index 00000000..2c690018 --- /dev/null +++ b/examples/reagent/counter/yarn.lock @@ -0,0 +1,951 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= + +asn1.js@^5.2.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +base64-js@^1.0.2, base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.0.0, bn.js@^5.1.1: + version "5.2.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" + integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== + +brorand@^1.0.1, brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== + dependencies: + bn.js "^5.0.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" + integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== + dependencies: + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.3" + 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" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +buffer@^5.0.3: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +camelize@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" + integrity sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs= + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +classnames@2.x, classnames@^2.2.5: + version "2.3.1" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" + integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +constate@^0.7.0: + version "0.7.2" + resolved "https://registry.yarnpkg.com/constate/-/constate-0.7.2.tgz#752fbf28ff9ed743a651a1b0138a049cf1d1e81f" + integrity sha512-7J/xUmvqd8eTnauCJDxgJ9Z0e7MsYa3Ua/zc0zM5/fgZF5KvSeN5VZ88T7RE/FcOkJ1/YHr9/+2jhoM+kX3Z+Q== + +core-js@^1.0.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" + integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +create-ecdh@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + +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== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +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== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +css-color-keywords@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" + integrity sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU= + +css-to-react-native@^2.0.3: + version "2.3.2" + resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-2.3.2.tgz#e75e2f8f7aa385b4c3611c52b074b70a002f2e7d" + integrity sha512-VOFaeZA053BqvvvqIA8c9n0+9vFppVBAHCp6JgFTtTMU3Mzi+XnelJ9XC9ul3BqFzZyQ5N+H0SnwsWT2Ebchxw== + dependencies: + camelize "^1.0.0" + css-color-keywords "^1.0.0" + postcss-value-parser "^3.3.0" + +des.js@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +elliptic@^6.5.3: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +encoding@^0.1.11: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +events@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +fbjs@^0.8.16: + version "0.8.17" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" + integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90= + dependencies: + core-js "^1.0.0" + isomorphic-fetch "^2.1.1" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.18" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= + +hash-base@^3.0.0: + 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.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" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +highlight.js@^9.12.0: + version "9.18.5" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.18.5.tgz#d18a359867f378c138d6819edfc2a8acd5f29825" + integrity sha512-a5bFyofd/BHCX52/8i8uJkjr9DYwXIPnM/plwI6W7ezItLGqzt7X2G2nXuYSfsIJdkwwj/g9DG1LkcGJI/dDoA== + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hoist-non-react-statics@^2.5.0, hoist-non-react-statics@^2.5.5: + version "2.5.5" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" + integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw== + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +ieee754@^1.1.13, ieee754@^1.1.4: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +inherits@2.0.3: + version "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.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== + +is-stream@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isomorphic-fetch@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk= + dependencies: + node-fetch "^1.0.1" + whatwg-fetch ">=0.10.0" + +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +lodash-es@^4.17.5: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== + +lodash.isequal@^4.0.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= + +lodash@^4.17.10, lodash@^4.17.5: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +node-fetch@^1.0.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "^1.0.1" + +object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +pako@~1.0.5: + 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.1.5: + version "5.1.6" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== + dependencies: + asn1.js "^5.2.0" + browserify-aes "^1.0.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +pbkdf2@^3.0.3: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +postcss-value-parser@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== + dependencies: + asap "~2.0.3" + +prop-types@15.x, prop-types@^15.5.4, prop-types@^15.6.0, prop-types@^15.6.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.2.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +react-dom@16.13.0: + version "16.13.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.13.0.tgz#cdde54b48eb9e8a0ca1b3dc9943d9bb409b81866" + integrity sha512-y09d2c4cG220DzdlFkPTnVvGTszVvNpC73v+AaLGLHbkpy3SSgvYq8x0rNwPJ/Rk/CicTNgk0hbHNw1gMEZAXg== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.19.0" + +react-draggable@3.x: + version "3.3.2" + resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-3.3.2.tgz#966ef1d90f2387af3c2d8bd3516f601ea42ca359" + integrity sha512-oaz8a6enjbPtx5qb0oDWxtDNuybOylvto1QLydsXgKmwT7e3GXC2eMVDwEMIUYJIFqVG72XpOv673UuuAq6LhA== + dependencies: + classnames "^2.2.5" + prop-types "^15.6.0" + +react-draggable@^4.0.3: + version "4.4.3" + resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-4.4.3.tgz#0727f2cae5813e36b0e4962bf11b2f9ef2b406f3" + integrity sha512-jV4TE59MBuWm7gb6Ns3Q1mxX8Azffb7oTtDtBgFkxRvhDp38YAARmRplrj0+XGkhOJB5XziArX+4HUUABtyZ0w== + dependencies: + classnames "^2.2.5" + prop-types "^15.6.0" + +react-grid-layout@^0.16.6: + version "0.16.6" + resolved "https://registry.yarnpkg.com/react-grid-layout/-/react-grid-layout-0.16.6.tgz#9b2407a2b946c2260ebaf66f13b556e1da4efeb2" + integrity sha512-h2EsYgsqcESLJeevQSJsEKp8hhh+phOlXDJoMhlV2e7T3VWQL+S6iCF3iD/LK19r4oyRyOMDEir0KV+eLXrAyw== + dependencies: + classnames "2.x" + lodash.isequal "^4.0.0" + prop-types "15.x" + react-draggable "3.x" + react-resizable "1.x" + +react-icon-base@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/react-icon-base/-/react-icon-base-2.1.0.tgz#a196e33fdf1e7aaa1fda3aefbb68bdad9e82a79d" + integrity sha1-oZbjP98eeqof2jrvu2i9rZ6Cp50= + +react-icons@^2.2.7: + version "2.2.7" + resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-2.2.7.tgz#d7860826b258557510dac10680abea5ca23cf650" + integrity sha512-0n4lcGqzJFcIQLoQytLdJCE0DKSA9dkwEZRYoGrIDJZFvIT6Hbajx5mv9geqhqFiNjUgtxg8kPyDfjlhymbGFg== + dependencies: + react-icon-base "2.1.0" + +react-is@^16.3.1, react-is@^16.8.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-known-props@^2.3.1: + version "2.4.5" + resolved "https://registry.yarnpkg.com/react-known-props/-/react-known-props-2.4.5.tgz#07560e76369ae38b00dc065f9a640fdc5491595f" + integrity sha512-0pKeQFx9Gf8xschH4nUMB9YwnXhicud+60whpUMwVnaoGETcozkR4PjgYDhKVY6V59K2+JYFIPocoC6My851sg== + +react-resizable@1.x: + version "1.11.1" + resolved "https://registry.yarnpkg.com/react-resizable/-/react-resizable-1.11.1.tgz#02ca6850afa7a22c1b3e623e64aef71ee252af69" + integrity sha512-S70gbLaAYqjuAd49utRHibtHLrHXInh7GuOR+6OO6RO6uleQfuBnWmZjRABfqNEx3C3Z6VPLg0/0uOYFrkfu9Q== + dependencies: + prop-types "15.x" + react-draggable "^4.0.3" + +react@16.13.0: + version "16.13.0" + resolved "https://registry.yarnpkg.com/react/-/react-16.13.0.tgz#d046eabcdf64e457bbeed1e792e235e1b9934cf7" + integrity sha512-TSavZz2iSLkq5/oiE7gnFzmURKZMltmi193rm5HEoUDAXpzT9Kzw6oNZnGoai/4+fUnm7FqS5dwgUL34TujcWQ== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + +readable-stream@^2.0.2, readable-stream@^2.3.3, readable-stream@^2.3.6: + 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" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + 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" + integrity sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw== + +reakit@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/reakit/-/reakit-0.11.2.tgz#d577b517543e6125f9d6e41718446c3b8923a131" + integrity sha512-SA94wdXvTfdeF9+n03Ai0XT0hwK24ZFx4ETxdmWEaYt2YNNbMfZ0jsoAjOQzmxazNoaqcFPUQrbNDPfs5/Gcgg== + dependencies: + constate "^0.7.0" + hoist-non-react-statics "^2.5.5" + lodash "^4.17.5" + lodash-es "^4.17.5" + react-known-props "^2.3.1" + styled-components "^3.3.3" + styled-tools "^0.6.0" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + 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, 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" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +"safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +scheduler@^0.19.0: + version "0.19.1" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" + integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +setimmediate@^1.0.4, setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +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.14.5: + version "2.14.5" + resolved "https://registry.yarnpkg.com/shadow-cljs/-/shadow-cljs-2.14.5.tgz#f71d9bf1e292d452ecc76ec0a061fdc895af36b5" + integrity sha512-+tn4f8bSD2P006bsuVAmQeBRSzNM55o2oPT2SfDYDcUYVuqevxnxuDc2xza+c2UsA55bnYezP71CSkFDC56Osw== + dependencies: + node-libs-browser "^2.2.1" + readline-sync "^1.4.7" + shadow-cljs-jar "1.3.2" + source-map-support "^0.4.15" + which "^1.3.1" + ws "^7.4.6" + +source-map-support@^0.4.15: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== + dependencies: + source-map "^0.5.6" + +source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.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== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +styled-components@^3.3.3: + version "3.4.10" + resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-3.4.10.tgz#9a654c50ea2b516c36ade57ddcfa296bf85c96e1" + integrity sha512-TA8ip8LoILgmSAFd3r326pKtXytUUGu5YWuqZcOQVwVVwB6XqUMn4MHW2IuYJ/HAD81jLrdQed8YWfLSG1LX4Q== + dependencies: + buffer "^5.0.3" + css-to-react-native "^2.0.3" + fbjs "^0.8.16" + hoist-non-react-statics "^2.5.0" + prop-types "^15.5.4" + react-is "^16.3.1" + stylis "^3.5.0" + stylis-rule-sheet "^0.0.10" + supports-color "^3.2.3" + +styled-tools@^0.6.0: + version "0.6.2" + resolved "https://registry.yarnpkg.com/styled-tools/-/styled-tools-0.6.2.tgz#e9328ebc42e7b14d99d75e5abcffe5e8c2260e09" + integrity sha512-OYoVSOP5eZeDt9nltj3Te3sHFvtQTQo7QZUSyyZ0isDtTCvJrRBu89ByhRLytJnuvDFPvfrPCPgtg5dO5VGHbQ== + dependencies: + lodash "^4.17.10" + +stylis-rule-sheet@^0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz#44e64a2b076643f4b52e5ff71efc04d8c3c4a430" + integrity sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw== + +stylis@^3.5.0: + version "3.5.4" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-3.5.4.tgz#f665f25f5e299cf3d64654ab949a57c768b73fbe" + integrity sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q== + +supports-color@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= + dependencies: + has-flag "^1.0.0" + +timers-browserify@^2.0.4: + version "2.0.12" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" + integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== + dependencies: + setimmediate "^1.0.4" + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + +ua-parser-js@^0.7.18: + version "0.7.28" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.28.tgz#8ba04e653f35ce210239c64661685bf9121dec31" + integrity sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g== + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +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= + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +whatwg-fetch@>=0.10.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" + integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== + +which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +ws@^7.4.6: + version "7.5.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.0.tgz#0033bafea031fb9df041b2026fc72a571ca44691" + integrity sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw== + +xtend@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== diff --git a/examples/reagent/todo/.gitignore b/examples/reagent/todo/.gitignore new file mode 100644 index 00000000..295a9c87 --- /dev/null +++ b/examples/reagent/todo/.gitignore @@ -0,0 +1,20 @@ +node_modules/ +public/js + +/target +/checkouts +/src/gen + +pom.xml +pom.xml.asc +*.iml +*.jar +*.log +.shadow-cljs +.idea +.lein-* +.nrepl-* +.DS_Store + +.hgignore +.hg/ diff --git a/examples/reagent/todo/package.json b/examples/reagent/todo/package.json new file mode 100644 index 00000000..1317e2a3 --- /dev/null +++ b/examples/reagent/todo/package.json @@ -0,0 +1,19 @@ +{ + "name": "counter", + "version": "0.0.1", + "private": true, + "scripts": { + "dev": "shadow-cljs watch dev" + }, + "devDependencies": { + "shadow-cljs": "2.14.5" + }, + "dependencies": { + "highlight.js": "^9.12.0", + "react": "16.13.0", + "react-dom": "16.13.0", + "react-grid-layout": "^0.16.6", + "react-icons": "^2.2.7", + "reakit": "^0.11.1" + } +} diff --git a/examples/reagent/todo/public/index.html b/examples/reagent/todo/public/index.html new file mode 100644 index 00000000..7af86eb1 --- /dev/null +++ b/examples/reagent/todo/public/index.html @@ -0,0 +1,15 @@ + + + + + homebase examples + + + + + + + + + + \ No newline at end of file diff --git a/examples/reagent/todo/shadow-cljs.edn b/examples/reagent/todo/shadow-cljs.edn new file mode 100644 index 00000000..19dd143f --- /dev/null +++ b/examples/reagent/todo/shadow-cljs.edn @@ -0,0 +1,12 @@ +;; shadow-cljs configuration +{:source-paths ["src/main"] + :dev-http {3000 "public"} + :dependencies [[datascript "1.0.7"] + [reagent "1.0.0-alpha2"] + [io.homebase/homebase-react "0.1.1"] + [io.homebase/datalog-console "0.2.2"]] + :builds {:dev {:target :browser + :output-dir "public/js" + :asset-path "/js" + :compiler-options {:externs ["datascript/externs.js"]} + :modules {:main {:init-fn todo/init!}}}}} diff --git a/examples/reagent/todo/src/main/todo.cljs b/examples/reagent/todo/src/main/todo.cljs new file mode 100644 index 00000000..15c50a36 --- /dev/null +++ b/examples/reagent/todo/src/main/todo.cljs @@ -0,0 +1,181 @@ +(ns todo + (:require + [reagent.core :as r] + [reagent.dom :as rdom] + [datascript.core :as d] + [homebase.reagent :as hbr] + [datalog-console.integrations.datascript :as datalog-console])) + +(def schema {:db/ident {:db/unique :db.unique/identity} + :todo/project {:db/type :db.type/ref + :db/cardinality :db.cardinality/one} + :todo/owner {:db/type :db.type/ref + :db/cardinality :db.cardinality/one}}) + +(def db-conn (d/create-conn schema)) + +(def initial-tx [{:db/ident :todo.filters + :todo.filter/show-completed? true + :todo.filter/owner 0 + :todo.filter/project 0} + {:todo/name "Go home" + :todo/created-at (js/Date.now) + :todo/owner -2 + :todo/project -3} + {:todo/name "Fix ship" + :todo/completed? true + :todo/created-at (js/Date.now) + :todo/owner -1 + :todo/project -4} + {:db/id -1 + :user/name "Stella"} + {:db/id -2 + :user/name "Arpegius"} + {:db/id -3 + :project/name "Do it"} + {:db/id -4 + :project/name "Make it"}]) + +(d/transact! db-conn initial-tx) + +(hbr/connect! db-conn) + +(datalog-console/enable! {:conn db-conn}) + +(defn select [{:keys [attr]}] + (let [[options] (hbr/q '[:find ?e ?v + :in $ ?attr + :where [?e ?attr ?v]] + db-conn attr)] + (fn [{:keys [label attr value on-change]}] + [:label label " " + [:select + {:name (str attr) + :value (or value "") + :on-change (fn [e] (when on-change (on-change (js/Number (goog.object/getValueByKeys e #js ["target" "value"])))))} + [:option {:value ""} ""] + (for [[id value] @options] + ^{:key id} [:option + {:value id} + value])]]))) + +(defn todo [id] + (let [[todo] (hbr/entity db-conn id)] + (js/console.log @todo) + (fn [id] + [:div {:style {:padding-bottom 20}} + [:div + [:input + {:type "checkbox" + :style {:width "18px" :height "18px" :margin-left "0"} + :checked (true? (:todo/completed? @todo)) + :on-change #(d/transact! db-conn [[:db/add (:db/id @todo) :todo/completed? (goog.object/getValueByKeys % #js ["target" "checked"])]])}] + [:input + {:type "text" + :style {:text-decoration (when (:todo/completed? @todo) "line-through") :border "none" :width "auto" :font-weight "bold" :font-size "20px"} + :value (:todo/name @todo) + :on-change #(d/transact! db-conn [[:db/add (:db/id @todo) :todo/name (goog.object/getValueByKeys % #js ["target" "value"])]])}]] + [:div + [select + {:label "Owner:" + :attr :user/name + :value (get-in @todo [:todo/owner :db/id]) + :on-change (fn [owner-id] (d/transact! db-conn [[(if (= 0 owner-id) :db/retract :db/add) (:db/id @todo) :todo/owner (when (not= 0 owner-id) owner-id)]]))}] + " · " + [select + {:label "Project:" + :attr :project/name + :value (get-in @todo [:todo/project :db/id]) + :on-change (fn [project-id] (d/transact! db-conn [[(if (= 0 project-id) :db/retract :db/add) (:db/id @todo) :todo/project (when (not= 0 project-id) project-id)]]))}] + " · " + [:button + {:on-click #(d/transact! db-conn [[:db/retractEntity (:db/id @todo)]])} + "Delete"]] + [:div + [:small {:style {:color "grey"}} + (.toLocaleString (js/Date. (:todo/created-at @todo)))]]]))) + +(defn todo-filters [] + (let [[filters] (hbr/entity db-conn [:db/ident :todo.filters])] + (fn [] + [:div {:style {:padding "20px 0"}} + [:strong "Filters · "] + [:label + "Show completed " + [:input + {:type "checkbox" + :checked (:todo.filter/show-completed? @filters) + :on-change #(d/transact! db-conn [[:db/add (:db/id @filters) :todo.filter/show-completed? (goog.object/getValueByKeys % #js ["target" "checked"])]])}]] + " · " + [select + {:label "Owner" + :attr :user/name + :value (:todo.filter/owner @filters) + :on-change (fn [owner-id] (d/transact! db-conn [[:db/add (:db/id @filters) :todo.filter/owner (or owner-id 0)]]))}] + " · " + [select + {:label "Project" + :attr :project/name + :value (:todo.filter/project @filters) + :on-change (fn [project-id] (d/transact! db-conn [[:db/add (:db/id @filters) :todo.filter/project (or project-id 0)]]))}]]))) + +(defn todos [] + (let [[todos] (hbr/q '[:find [(pull ?todo [:db/id :todo/created-at]) ...] + :where + ; Get all todos with names + [?todo :todo/name] + + ; Get the id for :todo.filters + [?filters :db/ident :todo.filters] + + ; Filter completed todos if not :todo.filter/show-completed? + (or [?filters :todo.filter/show-completed? true] + (not [?todo :todo/completed? true])) + + ; Filter by owner if :todo.filter/owner is not 0 + [?filter :todo.filter/owner ?owner] + (or [(= 0 ?owner)] + [?todo :todo/owner ?owner]) + + ; Filter by project if :todo.filter/project is not 0 + [?filter :todo.filter/project ?project] + (or [(= 0 ?project)] + [?todo :todo/project ?project])] + db-conn)] + (fn [] + [:div + [todo-filters] + [:div + (for [{:keys [db/id]} + (->> @todos + (sort-by :todo/created-at) + (reverse))] + ^{:key id} [todo id])]]))) + +(defn new-todo [] + (let [name (r/atom "") + [filters] (hbr/entity db-conn [:db/ident :todo.filters])] + (fn [] + [:form {:on-submit (fn [e] + (.preventDefault e) + (d/transact! db-conn [{:todo/name @name + :todo/created-at (js/Date.now)} + ; Also reset the filters to make sure the new todo shows up in the UI immediately + {:db/id (:db/id @filters) + :todo.filter/show-completed? true + :todo.filter/owner 0 + :todo.filter/project 0}]) + (reset! name ""))} + [:input {:type "text" + :on-change #(reset! name (goog.object/getValueByKeys % #js ["target" "value"])) + :value @name + :placeholder "Write a todo..."}] + [:button {:type "submit"} "Create todo"]]))) + +(defn todo-app [] + [:div + [new-todo] + [todos]]) + +(defn init! [] + (rdom/render [todo-app] (.-body js/document))) diff --git a/examples/reagent/todo/yarn.lock b/examples/reagent/todo/yarn.lock new file mode 100644 index 00000000..2c690018 --- /dev/null +++ b/examples/reagent/todo/yarn.lock @@ -0,0 +1,951 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= + +asn1.js@^5.2.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +base64-js@^1.0.2, base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.0.0, bn.js@^5.1.1: + version "5.2.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" + integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== + +brorand@^1.0.1, brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== + dependencies: + bn.js "^5.0.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" + integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== + dependencies: + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.3" + 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" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +buffer@^5.0.3: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +camelize@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" + integrity sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs= + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +classnames@2.x, classnames@^2.2.5: + version "2.3.1" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" + integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +constate@^0.7.0: + version "0.7.2" + resolved "https://registry.yarnpkg.com/constate/-/constate-0.7.2.tgz#752fbf28ff9ed743a651a1b0138a049cf1d1e81f" + integrity sha512-7J/xUmvqd8eTnauCJDxgJ9Z0e7MsYa3Ua/zc0zM5/fgZF5KvSeN5VZ88T7RE/FcOkJ1/YHr9/+2jhoM+kX3Z+Q== + +core-js@^1.0.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" + integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +create-ecdh@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + +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== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +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== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +css-color-keywords@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" + integrity sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU= + +css-to-react-native@^2.0.3: + version "2.3.2" + resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-2.3.2.tgz#e75e2f8f7aa385b4c3611c52b074b70a002f2e7d" + integrity sha512-VOFaeZA053BqvvvqIA8c9n0+9vFppVBAHCp6JgFTtTMU3Mzi+XnelJ9XC9ul3BqFzZyQ5N+H0SnwsWT2Ebchxw== + dependencies: + camelize "^1.0.0" + css-color-keywords "^1.0.0" + postcss-value-parser "^3.3.0" + +des.js@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +elliptic@^6.5.3: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +encoding@^0.1.11: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +events@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +fbjs@^0.8.16: + version "0.8.17" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" + integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90= + dependencies: + core-js "^1.0.0" + isomorphic-fetch "^2.1.1" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.18" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= + +hash-base@^3.0.0: + 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.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" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +highlight.js@^9.12.0: + version "9.18.5" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.18.5.tgz#d18a359867f378c138d6819edfc2a8acd5f29825" + integrity sha512-a5bFyofd/BHCX52/8i8uJkjr9DYwXIPnM/plwI6W7ezItLGqzt7X2G2nXuYSfsIJdkwwj/g9DG1LkcGJI/dDoA== + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hoist-non-react-statics@^2.5.0, hoist-non-react-statics@^2.5.5: + version "2.5.5" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" + integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw== + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +ieee754@^1.1.13, ieee754@^1.1.4: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +inherits@2.0.3: + version "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.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== + +is-stream@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isomorphic-fetch@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk= + dependencies: + node-fetch "^1.0.1" + whatwg-fetch ">=0.10.0" + +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +lodash-es@^4.17.5: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== + +lodash.isequal@^4.0.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= + +lodash@^4.17.10, lodash@^4.17.5: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +node-fetch@^1.0.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "^1.0.1" + +object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +pako@~1.0.5: + 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.1.5: + version "5.1.6" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== + dependencies: + asn1.js "^5.2.0" + browserify-aes "^1.0.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +pbkdf2@^3.0.3: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +postcss-value-parser@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== + dependencies: + asap "~2.0.3" + +prop-types@15.x, prop-types@^15.5.4, prop-types@^15.6.0, prop-types@^15.6.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.2.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +react-dom@16.13.0: + version "16.13.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.13.0.tgz#cdde54b48eb9e8a0ca1b3dc9943d9bb409b81866" + integrity sha512-y09d2c4cG220DzdlFkPTnVvGTszVvNpC73v+AaLGLHbkpy3SSgvYq8x0rNwPJ/Rk/CicTNgk0hbHNw1gMEZAXg== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.19.0" + +react-draggable@3.x: + version "3.3.2" + resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-3.3.2.tgz#966ef1d90f2387af3c2d8bd3516f601ea42ca359" + integrity sha512-oaz8a6enjbPtx5qb0oDWxtDNuybOylvto1QLydsXgKmwT7e3GXC2eMVDwEMIUYJIFqVG72XpOv673UuuAq6LhA== + dependencies: + classnames "^2.2.5" + prop-types "^15.6.0" + +react-draggable@^4.0.3: + version "4.4.3" + resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-4.4.3.tgz#0727f2cae5813e36b0e4962bf11b2f9ef2b406f3" + integrity sha512-jV4TE59MBuWm7gb6Ns3Q1mxX8Azffb7oTtDtBgFkxRvhDp38YAARmRplrj0+XGkhOJB5XziArX+4HUUABtyZ0w== + dependencies: + classnames "^2.2.5" + prop-types "^15.6.0" + +react-grid-layout@^0.16.6: + version "0.16.6" + resolved "https://registry.yarnpkg.com/react-grid-layout/-/react-grid-layout-0.16.6.tgz#9b2407a2b946c2260ebaf66f13b556e1da4efeb2" + integrity sha512-h2EsYgsqcESLJeevQSJsEKp8hhh+phOlXDJoMhlV2e7T3VWQL+S6iCF3iD/LK19r4oyRyOMDEir0KV+eLXrAyw== + dependencies: + classnames "2.x" + lodash.isequal "^4.0.0" + prop-types "15.x" + react-draggable "3.x" + react-resizable "1.x" + +react-icon-base@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/react-icon-base/-/react-icon-base-2.1.0.tgz#a196e33fdf1e7aaa1fda3aefbb68bdad9e82a79d" + integrity sha1-oZbjP98eeqof2jrvu2i9rZ6Cp50= + +react-icons@^2.2.7: + version "2.2.7" + resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-2.2.7.tgz#d7860826b258557510dac10680abea5ca23cf650" + integrity sha512-0n4lcGqzJFcIQLoQytLdJCE0DKSA9dkwEZRYoGrIDJZFvIT6Hbajx5mv9geqhqFiNjUgtxg8kPyDfjlhymbGFg== + dependencies: + react-icon-base "2.1.0" + +react-is@^16.3.1, react-is@^16.8.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-known-props@^2.3.1: + version "2.4.5" + resolved "https://registry.yarnpkg.com/react-known-props/-/react-known-props-2.4.5.tgz#07560e76369ae38b00dc065f9a640fdc5491595f" + integrity sha512-0pKeQFx9Gf8xschH4nUMB9YwnXhicud+60whpUMwVnaoGETcozkR4PjgYDhKVY6V59K2+JYFIPocoC6My851sg== + +react-resizable@1.x: + version "1.11.1" + resolved "https://registry.yarnpkg.com/react-resizable/-/react-resizable-1.11.1.tgz#02ca6850afa7a22c1b3e623e64aef71ee252af69" + integrity sha512-S70gbLaAYqjuAd49utRHibtHLrHXInh7GuOR+6OO6RO6uleQfuBnWmZjRABfqNEx3C3Z6VPLg0/0uOYFrkfu9Q== + dependencies: + prop-types "15.x" + react-draggable "^4.0.3" + +react@16.13.0: + version "16.13.0" + resolved "https://registry.yarnpkg.com/react/-/react-16.13.0.tgz#d046eabcdf64e457bbeed1e792e235e1b9934cf7" + integrity sha512-TSavZz2iSLkq5/oiE7gnFzmURKZMltmi193rm5HEoUDAXpzT9Kzw6oNZnGoai/4+fUnm7FqS5dwgUL34TujcWQ== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + +readable-stream@^2.0.2, readable-stream@^2.3.3, readable-stream@^2.3.6: + 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" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + 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" + integrity sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw== + +reakit@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/reakit/-/reakit-0.11.2.tgz#d577b517543e6125f9d6e41718446c3b8923a131" + integrity sha512-SA94wdXvTfdeF9+n03Ai0XT0hwK24ZFx4ETxdmWEaYt2YNNbMfZ0jsoAjOQzmxazNoaqcFPUQrbNDPfs5/Gcgg== + dependencies: + constate "^0.7.0" + hoist-non-react-statics "^2.5.5" + lodash "^4.17.5" + lodash-es "^4.17.5" + react-known-props "^2.3.1" + styled-components "^3.3.3" + styled-tools "^0.6.0" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + 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, 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" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +"safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +scheduler@^0.19.0: + version "0.19.1" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" + integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +setimmediate@^1.0.4, setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +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.14.5: + version "2.14.5" + resolved "https://registry.yarnpkg.com/shadow-cljs/-/shadow-cljs-2.14.5.tgz#f71d9bf1e292d452ecc76ec0a061fdc895af36b5" + integrity sha512-+tn4f8bSD2P006bsuVAmQeBRSzNM55o2oPT2SfDYDcUYVuqevxnxuDc2xza+c2UsA55bnYezP71CSkFDC56Osw== + dependencies: + node-libs-browser "^2.2.1" + readline-sync "^1.4.7" + shadow-cljs-jar "1.3.2" + source-map-support "^0.4.15" + which "^1.3.1" + ws "^7.4.6" + +source-map-support@^0.4.15: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== + dependencies: + source-map "^0.5.6" + +source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.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== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +styled-components@^3.3.3: + version "3.4.10" + resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-3.4.10.tgz#9a654c50ea2b516c36ade57ddcfa296bf85c96e1" + integrity sha512-TA8ip8LoILgmSAFd3r326pKtXytUUGu5YWuqZcOQVwVVwB6XqUMn4MHW2IuYJ/HAD81jLrdQed8YWfLSG1LX4Q== + dependencies: + buffer "^5.0.3" + css-to-react-native "^2.0.3" + fbjs "^0.8.16" + hoist-non-react-statics "^2.5.0" + prop-types "^15.5.4" + react-is "^16.3.1" + stylis "^3.5.0" + stylis-rule-sheet "^0.0.10" + supports-color "^3.2.3" + +styled-tools@^0.6.0: + version "0.6.2" + resolved "https://registry.yarnpkg.com/styled-tools/-/styled-tools-0.6.2.tgz#e9328ebc42e7b14d99d75e5abcffe5e8c2260e09" + integrity sha512-OYoVSOP5eZeDt9nltj3Te3sHFvtQTQo7QZUSyyZ0isDtTCvJrRBu89ByhRLytJnuvDFPvfrPCPgtg5dO5VGHbQ== + dependencies: + lodash "^4.17.10" + +stylis-rule-sheet@^0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz#44e64a2b076643f4b52e5ff71efc04d8c3c4a430" + integrity sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw== + +stylis@^3.5.0: + version "3.5.4" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-3.5.4.tgz#f665f25f5e299cf3d64654ab949a57c768b73fbe" + integrity sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q== + +supports-color@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= + dependencies: + has-flag "^1.0.0" + +timers-browserify@^2.0.4: + version "2.0.12" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" + integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== + dependencies: + setimmediate "^1.0.4" + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + +ua-parser-js@^0.7.18: + version "0.7.28" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.28.tgz#8ba04e653f35ce210239c64661685bf9121dec31" + integrity sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g== + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +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= + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +whatwg-fetch@>=0.10.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" + integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== + +which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +ws@^7.4.6: + version "7.5.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.0.tgz#0033bafea031fb9df041b2026fc72a571ca44691" + integrity sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw== + +xtend@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== diff --git a/src/dev/homebase/dev/example/reagent/counter.cljs b/src/dev/homebase/dev/example/reagent/counter.cljs index 0038dee1..5512ccca 100644 --- a/src/dev/homebase/dev/example/reagent/counter.cljs +++ b/src/dev/homebase/dev/example/reagent/counter.cljs @@ -15,6 +15,7 @@ (defn counter [] (let [[entity] (hbr/entity db-conn 1)] ; Get a homebase.reagent/Entity. Note the use of db-conn and not @db-conn, this makes it reactive. + (js/console.log @entity) ; Demo custom entity formatters https://cljdoc.org/d/io.homebase/homebase-react/CURRENT/doc/misc/tooling-debugging#custom-chrome-formatters (fn [] [:div "Count: " (:count @entity) ; Deref the entity just like a reagent/atom. diff --git a/src/dev/homebase/dev/example/reagent/todo.cljs b/src/dev/homebase/dev/example/reagent/todo.cljs index 19035538..252f7062 100644 --- a/src/dev/homebase/dev/example/reagent/todo.cljs +++ b/src/dev/homebase/dev/example/reagent/todo.cljs @@ -61,9 +61,10 @@ (defn todo [id] (let [[todo] (hbr/entity db-conn id)] + (js/console.log @todo) (fn [id] [:div {:style {:padding-bottom 20}} - [:div + [:div [:input {:type "checkbox" :style {:width "18px" :height "18px" :margin-left "0"} @@ -90,9 +91,9 @@ [:button {:on-click #(d/transact! db-conn [[:db/retractEntity (:db/id @todo)]])} "Delete"]] - [:div - [:small {:style {:color "grey"}} - (.toLocaleString (js/Date. (:todo/created-at @todo)))]]]))) + [:div + [:small {:style {:color "grey"}} + (.toLocaleString (js/Date. (:todo/created-at @todo)))]]]))) (defn todo-filters [] (let [[filters] (hbr/entity db-conn [:db/ident :todo.filters])] From f0646a1dd98c557e9b93fbf90b37088fec6c062a Mon Sep 17 00:00:00 2001 From: Chris Smothers Date: Sun, 27 Jun 2021 12:07:49 -0700 Subject: [PATCH 19/20] docs: add readme to reagent examples --- examples/reagent/counter/README.md | 8 ++++++++ examples/reagent/todo/README.md | 8 ++++++++ 2 files changed, 16 insertions(+) create mode 100644 examples/reagent/counter/README.md create mode 100644 examples/reagent/todo/README.md diff --git a/examples/reagent/counter/README.md b/examples/reagent/counter/README.md new file mode 100644 index 00000000..e3ee1904 --- /dev/null +++ b/examples/reagent/counter/README.md @@ -0,0 +1,8 @@ +# Reagent Counter Example + +``` +yarn install +yarn dev +``` + +open http://localhost:3000 \ No newline at end of file diff --git a/examples/reagent/todo/README.md b/examples/reagent/todo/README.md new file mode 100644 index 00000000..19f59b3f --- /dev/null +++ b/examples/reagent/todo/README.md @@ -0,0 +1,8 @@ +# Reagent Todo Example + +``` +yarn install +yarn dev +``` + +open http://localhost:3000 \ No newline at end of file From 15f018d6410ba88233d7e784ea2393a540129844 Mon Sep 17 00:00:00 2001 From: Chris Smothers Date: Mon, 28 Jun 2021 10:56:41 -0700 Subject: [PATCH 20/20] docs: typo --- README.md | 2 +- doc/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 35cfd5d8..781fc764 100644 --- a/README.md +++ b/README.md @@ -140,7 +140,7 @@ Homebase React is currently not a good choice for read-heavy applications (e.g. There isn't much in the way of React friendly datalog DB based state management for Javascript, but there's at least one alternative if you're a Clojure dev. -- If your prefer `d/pull` over `d/entity` take a look at [Posh](https://github.com/denistakeda/posh). It supports less of the `d/q` API, but provides more tools for tuning performance. +- If you prefer `d/pull` over `d/entity` take a look at [Posh](https://github.com/denistakeda/posh). It supports less of the `d/q` API, but provides more tools for tuning performance. ## Development diff --git a/doc/README.md b/doc/README.md index 23a6d353..bd462470 100644 --- a/doc/README.md +++ b/doc/README.md @@ -68,4 +68,4 @@ In the case of `hbr/entity` we track which attributes get consumed `(:attr @enti ## Alternatives -- If your prefer `d/pull` over `d/entity` take a look at [Posh](https://github.com/denistakeda/posh). It supports less of the `d/q` API, but provides more tools for tuning performance. \ No newline at end of file +- If you prefer `d/pull` over `d/entity` take a look at [Posh](https://github.com/denistakeda/posh). It supports less of the `d/q` API, but provides more tools for tuning performance. \ No newline at end of file