From a908e4ee184458114fcb8a8c13e2b0c1ab3294ca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Jun 2022 18:37:25 +0000 Subject: [PATCH 001/309] Bump ejs from 3.1.6 to 3.1.8 Bumps [ejs](https://github.com/mde/ejs) from 3.1.6 to 3.1.8. - [Release notes](https://github.com/mde/ejs/releases) - [Changelog](https://github.com/mde/ejs/blob/main/CHANGELOG.md) - [Commits](https://github.com/mde/ejs/compare/v3.1.6...v3.1.8) --- updated-dependencies: - dependency-name: ejs dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 46 ++++++++++++---------------------------------- 1 file changed, 12 insertions(+), 34 deletions(-) diff --git a/yarn.lock b/yarn.lock index b6d9a423..1cc2b576 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4676,11 +4676,6 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -async@0.9.x: - version "0.9.2" - resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" - integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= - async@^2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" @@ -4689,9 +4684,9 @@ async@^2.6.2: lodash "^4.17.14" async@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.3.tgz#ac53dafd3f4720ee9e8a160628f18ea91df196c9" - integrity sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g== + version "3.2.4" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== asynckit@^0.4.0: version "0.4.0" @@ -5439,7 +5434,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#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== concat-stream@~1.6.0: version "1.6.2" @@ -6215,20 +6210,13 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -ejs@^3.1.5: - version "3.1.7" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.7.tgz#c544d9c7f715783dd92f0bddcf73a59e6962d006" - integrity sha512-BIar7R6abbUxDA3bfXrO4DSgwo8I+fB5/1zgujl3HLLjwd6+9iOnrT+t3grn2qbk9vOgBubXOFwX2m9axoFaGw== +ejs@^3.1.5, ejs@^3.1.6: + version "3.1.8" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.8.tgz#758d32910c78047585c7ef1f92f9ee041c1c190b" + integrity sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ== dependencies: jake "^10.8.5" -ejs@^3.1.6: - version "3.1.6" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.6.tgz#5bfd0a0689743bb5268b3550cceeebbc1702822a" - integrity sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw== - dependencies: - jake "^10.6.1" - electron-to-chromium@^1.3.649: version "1.3.671" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.671.tgz#8feaed6eae42d279fa4611f58c42a5a1eb81b2a0" @@ -6935,11 +6923,11 @@ file-selector@^0.1.12: tslib "^2.0.1" filelist@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.2.tgz#80202f21462d4d1c2e214119b1807c1bc0380e5b" - integrity sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ== + version "1.0.4" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== dependencies: - minimatch "^3.0.4" + minimatch "^5.0.1" filesize@^8.0.6: version "8.0.7" @@ -8133,16 +8121,6 @@ istanbul-reports@^3.1.3: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -jake@^10.6.1: - version "10.8.4" - resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.4.tgz#f6a8b7bf90c6306f768aa82bb7b98bf4ca15e84a" - integrity sha512-MtWeTkl1qGsWUtbl/Jsca/8xSoK3x0UmS82sNbjqxxG/de/M/3b1DntdjHgPMC50enlTNwXOCRqPXLLt5cCfZA== - dependencies: - async "0.9.x" - chalk "^4.0.2" - filelist "^1.0.1" - minimatch "^3.0.4" - jake@^10.8.5: version "10.8.5" resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46" From 5c2400551e784cbe0017676133cbe872ebfcb087 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Jun 2022 18:37:26 +0000 Subject: [PATCH 002/309] Bump minimist from 1.2.5 to 1.2.6 Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6. - [Release notes](https://github.com/substack/minimist/releases) - [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6) --- updated-dependencies: - dependency-name: minimist dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/yarn.lock b/yarn.lock index b6d9a423..b081bcba 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9754,12 +9754,7 @@ minimatch@^5.0.1, minimatch@^5.1.0: dependencies: brace-expansion "^2.0.1" -minimist@^1.1.1, minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.6: +minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: version "1.2.6" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== From 070e1889db20edf93c3680381c5b52479a343aee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Jun 2022 18:37:27 +0000 Subject: [PATCH 003/309] Bump tmpl from 1.0.4 to 1.0.5 Bumps [tmpl](https://github.com/daaku/nodejs-tmpl) from 1.0.4 to 1.0.5. - [Release notes](https://github.com/daaku/nodejs-tmpl/releases) - [Commits](https://github.com/daaku/nodejs-tmpl/commits/v1.0.5) --- updated-dependencies: - dependency-name: tmpl dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index b6d9a423..902b215b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12964,9 +12964,9 @@ tmp@^0.2.1: rimraf "^3.0.0" tmpl@1.0.x: - version "1.0.4" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" - integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== to-fast-properties@^2.0.0: version "2.0.0" From ce614cd317c0d1882dabc5b71fac3a34ca041097 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Jun 2022 18:37:28 +0000 Subject: [PATCH 004/309] Bump protobufjs from 6.11.2 to 6.11.3 Bumps [protobufjs](https://github.com/protobufjs/protobuf.js) from 6.11.2 to 6.11.3. - [Release notes](https://github.com/protobufjs/protobuf.js/releases) - [Changelog](https://github.com/protobufjs/protobuf.js/blob/v6.11.3/CHANGELOG.md) - [Commits](https://github.com/protobufjs/protobuf.js/compare/v6.11.2...v6.11.3) --- updated-dependencies: - dependency-name: protobufjs dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 45 ++++++++++++++++++++------------------------- 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/yarn.lock b/yarn.lock index b6d9a423..a58a9eed 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3100,7 +3100,7 @@ "@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" - integrity sha1-m4sMxmPWaafY9vXQiToU00jzD78= + integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== "@protobufjs/base64@^1.1.2": version "1.1.2" @@ -3115,12 +3115,12 @@ "@protobufjs/eventemitter@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" - integrity sha1-NVy8mLr61ZePntCV85diHx0Ga3A= + integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== "@protobufjs/fetch@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" - integrity sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU= + integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== dependencies: "@protobufjs/aspromise" "^1.1.1" "@protobufjs/inquire" "^1.1.0" @@ -3128,27 +3128,27 @@ "@protobufjs/float@^1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" - integrity sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E= + integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== "@protobufjs/inquire@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" - integrity sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik= + integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== "@protobufjs/path@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" - integrity sha1-bMKyDFya1q0NzP0hynZz2Nf79o0= + integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== "@protobufjs/pool@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" - integrity sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q= + integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== "@protobufjs/utf8@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" - integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= + integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== "@react-dnd/asap@^4.0.0": version "4.0.1" @@ -3836,9 +3836,9 @@ integrity sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q== "@types/long@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9" - integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w== + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" + integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== "@types/mdast@^3.0.0": version "3.0.10" @@ -3862,21 +3862,16 @@ resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== -"@types/node@*": +"@types/node@*", "@types/node@>=12.12.47", "@types/node@>=13.7.0": + version "18.0.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.0.tgz#67c7b724e1bcdd7a8821ce0d5ee184d3b4dd525a" + integrity sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA== + +"@types/node@^17.0.23": version "17.0.26" resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.26.tgz#1bbff9b23ee5a64f87b4f30c0c854b112ee2e635" integrity sha512-z/FG/6DUO7pnze3AE3TBGIjGGKkvCcGcWINe1C7cADY8hKLJPDYpzsNE37uExQ4md5RFtTCvg+M8Mu1Enyeg2A== -"@types/node@>=12.12.47", "@types/node@>=13.7.0": - version "16.4.13" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.4.13.tgz#7dfd9c14661edc65cccd43a29eb454174642370d" - integrity sha512-bLL69sKtd25w7p1nvg9pigE4gtKVpGTPojBFLMkGHXuUgap2sLqQt2qUnqmVCDfzGUL0DRNZP+1prIZJbMeAXg== - -"@types/node@^17.0.23": - version "17.0.23" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.23.tgz#3b41a6e643589ac6442bdbd7a4a3ded62f33f7da" - integrity sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw== - "@types/parse-json@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" @@ -11047,9 +11042,9 @@ property-information@^6.0.0: integrity sha512-hrzC564QIl0r0vy4l6MvRLhafmUowhO/O3KgVSoXIbbA2Sz4j8HGpJc6T2cubRVwMwpdiG/vKGfhT4IixmKN9w== protobufjs@^6.10.0: - version "6.11.2" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.2.tgz#de39fabd4ed32beaa08e9bb1e30d08544c1edf8b" - integrity sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw== + version "6.11.3" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.3.tgz#637a527205a35caa4f3e2a9a4a13ddffe0e7af74" + integrity sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg== dependencies: "@protobufjs/aspromise" "^1.1.2" "@protobufjs/base64" "^1.1.2" From 28c1d678f29ce29a94ee40a71b515e24103993a2 Mon Sep 17 00:00:00 2001 From: Han Tuerker <46192266+htuerker@users.noreply.github.com> Date: Wed, 29 Jun 2022 05:35:01 +0300 Subject: [PATCH 005/309] fix(rich-text-editor): fix dark mode ui appearance (#696) * fix(rich-text-editor): fix dark mode ui appearance * Update src/components/RichTextEditor.tsx Co-authored-by: Sidney Alcantara * Update src/components/RichTextEditor.tsx Co-authored-by: Sidney Alcantara * Update src/components/RichTextEditor.tsx Co-authored-by: Sidney Alcantara * Update src/components/RichTextEditor.tsx Co-authored-by: Sidney Alcantara * Update src/components/RichTextEditor.tsx Co-authored-by: Sidney Alcantara * Update src/components/RichTextEditor.tsx Co-authored-by: Sidney Alcantara * Update src/components/RichTextEditor.tsx Co-authored-by: Sidney Alcantara * Update src/theme/RichTextEditorDarkCSS.tsx Co-authored-by: Sidney Alcantara * Update src/theme/RichTextEditorLightCSS.tsx Co-authored-by: Sidney Alcantara * fix(rich-text-editor): add stylings to dropdown * fix(rich-text-editor): add toolbar stylings * fix(rich-text-editor): reset hover&focus bg Co-authored-by: Sidney Alcantara --- src/components/RichTextEditor.tsx | 102 ++++++++++++++++++++++++++++-- 1 file changed, 98 insertions(+), 4 deletions(-) diff --git a/src/components/RichTextEditor.tsx b/src/components/RichTextEditor.tsx index 8a518620..a8e9179a 100644 --- a/src/components/RichTextEditor.tsx +++ b/src/components/RichTextEditor.tsx @@ -1,6 +1,6 @@ import { useState } from "react"; - -import { styled, useTheme } from "@mui/material"; +import { GlobalStyles } from "tss-react"; +import { alpha, styled, useTheme } from "@mui/material"; import { Editor } from "@tinymce/tinymce-react"; // TinyMCE so the global var exists @@ -10,7 +10,9 @@ import "tinymce/themes/silver"; // Toolbar icons import "tinymce/icons/default"; // Editor styles -import "tinymce/skins/ui/oxide/skin.min.css"; +/* eslint import/no-webpack-loader-syntax: off */ +import skinCss from "!!raw-loader!tinymce/skins/ui/oxide/skin.min.css"; +import skinDarkCss from "!!raw-loader!tinymce/skins/ui/oxide-dark/skin.min.css"; // Content styles, including inline UI like fake cursors /* eslint import/no-webpack-loader-syntax: off */ import contentCss from "!!raw-loader!tinymce/skins/content/default/content.min.css"; @@ -55,7 +57,32 @@ const Styles = styled("div", { }, "& .tox-edit-area__iframe": { colorScheme: "auto" }, - "& .tox-toolbar__group": { border: "none !important" }, + "& .tox-toolbar__group": { + border: "none !important", + "& .tox-tbtn": { + "&:hover:": { + backgroundColor: "inherit", + }, + "&:focus": { + backgroundColor: "inherit", + }, + }, + "& .tox-tbtn__select-chevron": { + transition: theme.transitions.create("transform", { + duration: theme.transitions.duration.short, + }), + }, + "& .tox-tbtn--select": { + "& .tox-tbtn__select-chevron": { + transform: "none", + }, + }, + "& .tox-tbtn--active": { + "& .tox-tbtn__select-chevron": { + transform: "rotate(180deg)", + }, + }, + }, "& .tox-tbtn": { borderRadius: theme.shape.borderRadius, @@ -118,7 +145,74 @@ export default function RichTextEditor({ return ( + + + Date: Wed, 29 Jun 2022 15:03:30 +1000 Subject: [PATCH 006/309] update date & time filter operators for clarity --- .../TableToolbar/Filters/FilterInputs.tsx | 69 +++++++++++++------ .../TableToolbar/Filters/FiltersPopover.tsx | 2 +- .../fields/DateTime/FilterCustomInput.tsx | 14 ++++ .../fields/DateTime/SideDrawerField.tsx | 2 +- src/components/fields/DateTime/filters.ts | 13 +++- src/components/fields/DateTime/index.tsx | 12 +++- src/components/fields/types.ts | 9 ++- 7 files changed, 96 insertions(+), 25 deletions(-) create mode 100644 src/components/fields/DateTime/FilterCustomInput.tsx diff --git a/src/components/TableToolbar/Filters/FilterInputs.tsx b/src/components/TableToolbar/Filters/FilterInputs.tsx index 29ebe014..24fa1b55 100644 --- a/src/components/TableToolbar/Filters/FilterInputs.tsx +++ b/src/components/TableToolbar/Filters/FilterInputs.tsx @@ -1,16 +1,21 @@ import { Suspense, createElement } from "react"; +import { ErrorBoundary } from "react-error-boundary"; import { Grid, MenuItem, ListItemText, + Divider, + ListSubheader, Typography, TextField, InputLabel, } from "@mui/material"; + import ColumnSelect from "@src/components/Table/ColumnSelect"; import FieldSkeleton from "@src/components/SideDrawer/FieldSkeleton"; import IdFilterInput from "./IdFilterInput"; +import { InlineErrorFallback } from "@src/components/ErrorFallback"; import type { useFilterInputs } from "./useFilterInputs"; import { getFieldType, getFieldProp } from "@src/components/fields"; @@ -30,6 +35,45 @@ export default function FilterInputs({ }: IFilterInputsProps) { const columnType = selectedColumn ? getFieldType(selectedColumn) : null; + const operators = availableFilters?.operators ?? []; + const renderedOperatorItems = operators.map((operator) => ( + + {operator.label} + + {operator.secondaryLabel && ( + +  {operator.secondaryLabel} + + )} + + )); + + // Insert ListSubheader components in between groups of operators + for (let i = 0; i < operators.length; i++) { + if (!operators[i].group) continue; + + if (i === 0 || operators[i - 1].group !== operators[i].group) { + renderedOperatorItems.splice( + i === 0 ? 0 : i + 1, + 0, + + {operators[i].group} + + ); + + if (i > 0) + renderedOperatorItems.splice( + i + 1, + 0, + + ); + } + } + return ( @@ -65,29 +109,13 @@ export default function FilterInputs({ Select operator - {availableFilters?.operators.map((operator) => ( - - - {operator.label} - - - {operator.secondaryLabel && ( - -  {operator.secondaryLabel} - - )} - - ))} + {renderedOperatorItems} - + {query.key && query.operator && ( - <> + ({ ...query, value })); }, disabled, + operator: query.operator, } )} - + )} diff --git a/src/components/TableToolbar/Filters/FiltersPopover.tsx b/src/components/TableToolbar/Filters/FiltersPopover.tsx index 5abf6c48..1346f158 100644 --- a/src/components/TableToolbar/Filters/FiltersPopover.tsx +++ b/src/components/TableToolbar/Filters/FiltersPopover.tsx @@ -76,7 +76,7 @@ export default function FiltersPopover({ const formattedValue = availableFilters?.valueFormatter ? availableFilters.valueFormatter(filter.value) - : filter.value; + : filter.value.toString(); return ( ; + + return ; +} diff --git a/src/components/fields/DateTime/SideDrawerField.tsx b/src/components/fields/DateTime/SideDrawerField.tsx index 48b87229..55a892ba 100644 --- a/src/components/fields/DateTime/SideDrawerField.tsx +++ b/src/components/fields/DateTime/SideDrawerField.tsx @@ -14,7 +14,7 @@ import { getFieldId } from "@src/components/SideDrawer/utils"; export interface IDateProps extends ISideDrawerFieldProps {} -export default function Date_({ +export default function DateTime({ column, value, onChange, diff --git a/src/components/fields/DateTime/filters.ts b/src/components/fields/DateTime/filters.ts index 19455484..90f818e3 100644 --- a/src/components/fields/DateTime/filters.ts +++ b/src/components/fields/DateTime/filters.ts @@ -7,56 +7,67 @@ export const filterOperators: IFilterOperator[] = [ label: "equals", secondaryLabel: "==", value: "time-minute-equal", + group: "Date & Time", }, { label: "not equal to", secondaryLabel: "!=", value: "!=", + group: "Date & Time", }, { label: "before", secondaryLabel: "<", value: "<", + group: "Date & Time", }, { label: "after", secondaryLabel: ">", value: ">", + group: "Date & Time", }, { label: "before or at", secondaryLabel: "<=", value: "<=", + group: "Date & Time", }, { label: "at or after", secondaryLabel: ">=", value: ">=", + group: "Date & Time", }, { - label: "where date is is", + label: "where date is", secondaryLabel: "date ==", value: "date-equal", + group: "Date", }, { label: "where date is before", secondaryLabel: "date <", value: "date-before", + group: "Date", }, { label: "where date is after", secondaryLabel: "date >", value: "date-after", + group: "Date", }, { label: "where date is before or on", secondaryLabel: "date <=", value: "date-before-equal", + group: "Date", }, { label: "where date is on or after", secondaryLabel: "date >=", value: "date-after-equal", + group: "Date", }, ]; diff --git a/src/components/fields/DateTime/index.tsx b/src/components/fields/DateTime/index.tsx index 4f3a134b..880557a0 100644 --- a/src/components/fields/DateTime/index.tsx +++ b/src/components/fields/DateTime/index.tsx @@ -21,6 +21,12 @@ const SideDrawerField = lazy( const Settings = lazy( () => import("./Settings" /* webpackChunkName: "Settings-DateTime" */) ); +const FilterCustomInput = lazy( + () => + import( + "./FilterCustomInput" /* webpackChunkName: "FilterCustomInput-DateTime" */ + ) +); export const config: IFieldConfig = { type: FieldType.dateTime, @@ -34,7 +40,11 @@ export const config: IFieldConfig = { TableCell: withHeavyCell(BasicCell, TableCell), TableEditor: NullEditor as any, SideDrawerField, - filter: { operators: filterOperators, valueFormatter }, + filter: { + operators: filterOperators, + valueFormatter, + customInput: FilterCustomInput, + }, settings: Settings, csvImportParser: (value) => parseJSON(value).getTime(), csvExportFormatter: (value: any, config?: any) => diff --git a/src/components/fields/types.ts b/src/components/fields/types.ts index a35c039d..1cd791ea 100644 --- a/src/components/fields/types.ts +++ b/src/components/fields/types.ts @@ -35,7 +35,7 @@ export interface IFieldConfig { settingsValidator?: (config: Record) => Record; filter?: { operators: IFilterOperator[]; - customInput?: React.ComponentType<{ onChange: (value: any) => void }>; + customInput?: React.ComponentType; defaultValue?: any; valueFormatter?: (value: any) => string; }; @@ -104,4 +104,11 @@ export interface IFilterOperator { value: TableFilter["operator"]; label: string; secondaryLabel?: React.ReactNode; + group?: string; +} + +export interface IFilterCustomInputProps { + onChange: (value: any) => void; + operator: TableFilter["operator"]; + [key: string]: any; } From 2f7f5693039aae28d6a71d4230718936bdc944b9 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Thu, 30 Jun 2022 15:44:22 +1000 Subject: [PATCH 007/309] Action field: prevent selecting self as required field (fixes ROWY-551) --- src/components/fields/Action/Settings.tsx | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/components/fields/Action/Settings.tsx b/src/components/fields/Action/Settings.tsx index 7acb3879..1ecf60e1 100644 --- a/src/components/fields/Action/Settings.tsx +++ b/src/components/fields/Action/Settings.tsx @@ -58,7 +58,7 @@ const CodeEditor = lazy( import("@src/components/CodeEditor" /* webpackChunkName: "CodeEditor" */) ); -const Settings = ({ config, onChange }: ISettingsProps) => { +const Settings = ({ config, onChange, fieldName }: ISettingsProps) => { const [projectId] = useAtom(projectIdAtom, globalScope); const [roles] = useAtom(projectRolesAtom, globalScope); const [settings] = useAtom(projectSettingsAtom, globalScope); @@ -77,10 +77,12 @@ const Settings = ({ config, onChange }: ISettingsProps) => { // ? ["requirements", "friction", "action", "undo", "customization"] // : ["requirements", "friction", "action", "customization"]; - const columnOptions = tableColumnsOrdered.map((c) => ({ - label: c.name, - value: c.key, - })); + const columnOptions = tableColumnsOrdered + .map((c) => ({ + label: c.name, + value: c.key, + })) + .filter((c) => c.value !== fieldName); const formattedParamsJson = stringify( Array.isArray(config.params) ? config.params : [], @@ -145,6 +147,7 @@ const Settings = ({ config, onChange }: ISettingsProps) => { { Date: Thu, 30 Jun 2022 19:19:25 +1000 Subject: [PATCH 008/309] Date & Time: only show date for date filters --- src/components/TableToolbar/Filters/FiltersPopover.tsx | 2 +- src/components/fields/DateTime/filters.ts | 10 +++++++--- src/components/fields/types.ts | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/components/TableToolbar/Filters/FiltersPopover.tsx b/src/components/TableToolbar/Filters/FiltersPopover.tsx index 1346f158..52d6408e 100644 --- a/src/components/TableToolbar/Filters/FiltersPopover.tsx +++ b/src/components/TableToolbar/Filters/FiltersPopover.tsx @@ -75,7 +75,7 @@ export default function FiltersPopover({ ); const formattedValue = availableFilters?.valueFormatter - ? availableFilters.valueFormatter(filter.value) + ? availableFilters.valueFormatter(filter.value, filter.operator) : filter.value.toString(); return ( diff --git a/src/components/fields/DateTime/filters.ts b/src/components/fields/DateTime/filters.ts index 90f818e3..e3c2b73b 100644 --- a/src/components/fields/DateTime/filters.ts +++ b/src/components/fields/DateTime/filters.ts @@ -1,5 +1,5 @@ import { format } from "date-fns"; -import { DATE_TIME_FORMAT } from "@src/constants/dates"; +import { DATE_TIME_FORMAT, DATE_FORMAT } from "@src/constants/dates"; import { IFilterOperator } from "@src/components/fields/types"; export const filterOperators: IFilterOperator[] = [ @@ -71,7 +71,11 @@ export const filterOperators: IFilterOperator[] = [ }, ]; -export const valueFormatter = (value: any) => { - if (value && value.toDate) return format(value.toDate(), DATE_TIME_FORMAT); +export const valueFormatter = (value: any, operator: string) => { + if (value && value.toDate) + return format( + value.toDate(), + operator.startsWith("date") ? DATE_FORMAT : DATE_TIME_FORMAT + ); return ""; }; diff --git a/src/components/fields/types.ts b/src/components/fields/types.ts index 1cd791ea..66890472 100644 --- a/src/components/fields/types.ts +++ b/src/components/fields/types.ts @@ -37,7 +37,7 @@ export interface IFieldConfig { operators: IFilterOperator[]; customInput?: React.ComponentType; defaultValue?: any; - valueFormatter?: (value: any) => string; + valueFormatter?: (value: any, operator: TableFilter["operator"]) => string; }; sortKey?: string; csvExportFormatter?: (value: any, config?: any) => string; From a943cbb8c8cfabd282f6efa9d347efe419f22507 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Fri, 1 Jul 2022 15:19:34 +1000 Subject: [PATCH 009/309] update AuthLayout --- src/assets/Logo.tsx | 43 +++++++++++++++++++++++--- src/assets/bg-table-dark.webp | Bin 0 -> 10144 bytes src/assets/bg-table-light.webp | Bin 0 -> 8582 bytes src/layouts/AuthLayout.tsx | 53 ++++++++++++++++++++++----------- src/layouts/MarketingPanel.tsx | 6 ++-- 5 files changed, 76 insertions(+), 26 deletions(-) create mode 100644 src/assets/bg-table-dark.webp create mode 100644 src/assets/bg-table-light.webp diff --git a/src/assets/Logo.tsx b/src/assets/Logo.tsx index 5c12bb1e..acd8151f 100644 --- a/src/assets/Logo.tsx +++ b/src/assets/Logo.tsx @@ -20,14 +20,49 @@ export default function Logo({ size = 1.5, ...props }: ILogoProps) { > Rowy + + + + + + + + + + + + + + + + + + + + + + + + + - ); } diff --git a/src/assets/bg-table-dark.webp b/src/assets/bg-table-dark.webp new file mode 100644 index 0000000000000000000000000000000000000000..2d1d7b0d79d97310cfcd649df3a45c90004d8aff GIT binary patch literal 10144 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 M?+)t7q}l)g0Fx`Tng9R* literal 0 HcmV?d00001 diff --git a/src/layouts/AuthLayout.tsx b/src/layouts/AuthLayout.tsx index c5551d1b..08e5ad6a 100644 --- a/src/layouts/AuthLayout.tsx +++ b/src/layouts/AuthLayout.tsx @@ -1,6 +1,8 @@ -import { useAtom } from "jotai"; +import { use100vh } from "react-div-100vh"; import { + alpha, + Box, Paper, Typography, LinearProgress, @@ -8,12 +10,11 @@ import { Link, LinkProps, } from "@mui/material"; -import { alpha, Theme } from "@mui/material/styles"; -import BrandedBackground, { Wrapper } from "@src/assets/BrandedBackground"; import Logo from "@src/assets/Logo"; +import bgTableLight from "@src/assets/bg-table-light.webp"; +import bgTableDark from "@src/assets/bg-table-dark.webp"; import { EXTERNAL_LINKS } from "@src/constants/externalLinks"; -import { globalScope, projectIdAtom } from "@src/atoms/globalScope"; export interface IAuthLayoutProps { hideLogo?: boolean; @@ -34,7 +35,7 @@ export default function AuthLayout({ children, loading, }: IAuthLayoutProps) { - const [projectId] = useAtom(projectIdAtom, globalScope); + const fullScreenHeight = use100vh() ?? 0; const linkProps: LinkProps = { variant: "caption", @@ -45,9 +46,30 @@ export default function AuthLayout({ }; return ( - theme.spacing(2) } : {}}> - + + `linear-gradient(to bottom, + ${alpha(theme.palette.background.default, 0.6)}, + ${alpha(theme.palette.background.default, 0.6)}), + url(${theme.palette.mode === "dark" ? bgTableDark : bgTableLight})`, + backgroundSize: { xs: "1920px 1080px", md: "cover" }, + backgroundRepeat: "no-repeat", + backgroundPosition: "top left", + display: "grid", + placeItems: "center", + alignContent: "center", + gap: 2, + gridAutoRows: "max-content", + minHeight: fullScreenHeight > 0 ? `${fullScreenHeight}px` : "100vh", + + pt: (theme) => `max(env(safe-area-inset-top), ${theme.spacing(1)})`, + pb: (theme) => `max(env(safe-area-inset-bottom), ${theme.spacing(1)})`, + pl: (theme) => `max(env(safe-area-inset-left), ${theme.spacing(1)})`, + pr: (theme) => `max(env(safe-area-inset-right), ${theme.spacing(1)})`, + }} + >
- alpha(theme.palette.background.paper, 0.5), - backdropFilter: "blur(20px) saturate(150%)", - display: "flex", flexDirection: "column", textAlign: "center", - "& > :not(style) + :not(style)": { mt: 6 }, + "& > :not(style) + :not(style)": { mt: 4 }, } as any } > {title && ( - + {title} )} @@ -123,13 +140,13 @@ export default function AuthLayout({ /> )} - Project: {projectId} - + */} - + ); } diff --git a/src/layouts/MarketingPanel.tsx b/src/layouts/MarketingPanel.tsx index e47ebd0b..ad443f85 100644 --- a/src/layouts/MarketingPanel.tsx +++ b/src/layouts/MarketingPanel.tsx @@ -1,5 +1,4 @@ import { Stack, Paper, Typography, Button } from "@mui/material"; -import { alpha } from "@mui/material/styles"; import { Discord as DiscordIcon } from "@src/assets/icons"; import TwitterIcon from "@mui/icons-material/Twitter"; @@ -9,7 +8,7 @@ import { EXTERNAL_LINKS } from "@src/constants/externalLinks"; export default function Marketing() { return ( alpha(theme.palette.background.paper, 0.5), - backdropFilter: "blur(20px) saturate(150%)", + bgcolor: "background.default", pt: (theme) => `max(env(safe-area-inset-top), ${theme.spacing(8)})`, pb: (theme) => `max(env(safe-area-inset-bottom), ${theme.spacing(8)})`, From 82ecbadedea03faaeeae70d630da7fc2c0991dfa Mon Sep 17 00:00:00 2001 From: shamsmosowi Date: Sat, 2 Jul 2022 21:07:33 +0200 Subject: [PATCH 010/309] move fullScreenButton to be shared, remove md settings --- src/components/CodeEditor/CodeEditor.tsx | 3 +- src/components/CodeEditor/DiffEditor.tsx | 3 +- .../{CodeEditor => }/FullScreenButton.tsx | 0 src/components/fields/Markdown/Settings.tsx | 41 ------------------- src/components/fields/Markdown/index.tsx | 5 --- 5 files changed, 4 insertions(+), 48 deletions(-) rename src/components/{CodeEditor => }/FullScreenButton.tsx (100%) delete mode 100644 src/components/fields/Markdown/Settings.tsx diff --git a/src/components/CodeEditor/CodeEditor.tsx b/src/components/CodeEditor/CodeEditor.tsx index f3deeb2b..6c969203 100644 --- a/src/components/CodeEditor/CodeEditor.tsx +++ b/src/components/CodeEditor/CodeEditor.tsx @@ -10,7 +10,7 @@ import { ResizeBottomRight } from "@src/assets/icons"; import useMonacoCustomizations, { IUseMonacoCustomizationsProps, } from "./useMonacoCustomizations"; -import FullScreenButton from "./FullScreenButton"; +import FullScreenButton from "@src/components/FullScreenButton"; import { spreadSx } from "@src/utils/ui"; export interface ICodeEditorProps @@ -73,6 +73,7 @@ export default function CodeEditor({ return ( diff --git a/src/components/CodeEditor/DiffEditor.tsx b/src/components/CodeEditor/DiffEditor.tsx index 834f7a68..64a9a55f 100644 --- a/src/components/CodeEditor/DiffEditor.tsx +++ b/src/components/CodeEditor/DiffEditor.tsx @@ -13,7 +13,7 @@ import { ResizeBottomRight } from "@src/assets/icons"; import useMonacoCustomizations, { IUseMonacoCustomizationsProps, } from "./useMonacoCustomizations"; -import FullScreenButton from "./FullScreenButton"; +import FullScreenButton from "@src/components/FullScreenButton"; import { spreadSx } from "@src/utils/ui"; export interface IDiffEditorProps @@ -64,6 +64,7 @@ export default function DiffEditor({ return ( diff --git a/src/components/CodeEditor/FullScreenButton.tsx b/src/components/FullScreenButton.tsx similarity index 100% rename from src/components/CodeEditor/FullScreenButton.tsx rename to src/components/FullScreenButton.tsx diff --git a/src/components/fields/Markdown/Settings.tsx b/src/components/fields/Markdown/Settings.tsx deleted file mode 100644 index 4a2bef71..00000000 --- a/src/components/fields/Markdown/Settings.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { ISettingsProps } from "@src/components/fields/types"; -import MultiSelect from "@rowy/multiselect"; - -const languages = [ - "javascript", - "typescript", - "json", - "html", - "css", - "scss", - "shell", - "yaml", - "xml", - "ruby", - "python", - "php", - "markdown", - "rust", - "csharp", - "cpp", - "c", - "java", - "go", - "plaintext", -]; - -export default function Settings({ config, onChange }: ISettingsProps) { - return ( - { - onChange("language")(value); - }} - label="Language" - labelPlural="languages" - /> - ); -} diff --git a/src/components/fields/Markdown/index.tsx b/src/components/fields/Markdown/index.tsx index 4ce88144..6053f093 100644 --- a/src/components/fields/Markdown/index.tsx +++ b/src/components/fields/Markdown/index.tsx @@ -6,10 +6,6 @@ import { Markdown as MarkdownIcon } from "@src/assets/icons"; import BasicCell from "./BasicCell"; import withSideDrawerEditor from "@src/components/Table/editors/withSideDrawerEditor"; -const Settings = lazy( - () => import("./Settings" /* webpackChunkName: "Settings-markdown" */) -); - const SideDrawerField = lazy( () => import( @@ -29,6 +25,5 @@ export const config: IFieldConfig = { TableCell: withBasicCell(BasicCell), TableEditor: withSideDrawerEditor(BasicCell), SideDrawerField, - settings: Settings, }; export default config; From dd214b96e49cb3e14e3b167e94cd174d67e8bb5f Mon Sep 17 00:00:00 2001 From: shamsmosowi Date: Sun, 3 Jul 2022 15:24:25 +0200 Subject: [PATCH 011/309] bundle-analyzer --- craco.config.js | 4 +++- package.json | 3 ++- yarn.lock | 56 ++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 60 insertions(+), 3 deletions(-) diff --git a/craco.config.js b/craco.config.js index 8e921d31..1a175a2d 100644 --- a/craco.config.js +++ b/craco.config.js @@ -1,7 +1,8 @@ const { whenDev } = require("@craco/craco"); const CracoAlias = require("craco-alias"); const CracoSwcPlugin = require("craco-swc"); - +const BundleAnalyzerPlugin = + require("webpack-bundle-analyzer").BundleAnalyzerPlugin; module.exports = { plugins: [ { @@ -65,6 +66,7 @@ module.exports = { }, }, webpack: { + plugins: [new BundleAnalyzerPlugin({ analyzerMode: "server" })], configure: { resolve: { // Polyfill for monaco-editor-auto-typings diff --git a/package.json b/package.json index ff663d09..0297f513 100644 --- a/package.json +++ b/package.json @@ -176,7 +176,8 @@ "raw-loader": "^4.0.2", "source-map-explorer": "^2.5.2", "ts-jest": "^28.0.2", - "typedoc": "^0.22.17" + "typedoc": "^0.22.17", + "webpack-bundle-analyzer": "^4.5.0" }, "resolutions": { "@types/react": "^18" diff --git a/yarn.lock b/yarn.lock index da7f9913..b095480f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3092,6 +3092,11 @@ schema-utils "^3.0.0" source-map "^0.7.3" +"@polka/url@^1.0.0-next.20": + version "1.0.0-next.21" + resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1" + integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== + "@popperjs/core@^2.11.4": version "2.11.5" resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.5.tgz#db5a11bf66bdab39569719555b0f76e138d7bd64" @@ -4388,7 +4393,7 @@ acorn-walk@^7.0.0, acorn-walk@^7.1.1: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== -acorn-walk@^8.1.1: +acorn-walk@^8.0.0, acorn-walk@^8.1.1: version "8.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== @@ -4398,6 +4403,11 @@ acorn@^7.0.0, acorn@^7.1.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== +acorn@^8.0.4: + version "8.7.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" + integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== + acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.0: version "8.7.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" @@ -9761,6 +9771,11 @@ mri@^1.1.0: resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== +mrmime@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.1.tgz#5f90c825fad4bdd41dc914eff5d1a8cfdaf24f27" + integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -10060,6 +10075,11 @@ open@^8.0.9, open@^8.4.0: is-docker "^2.1.1" is-wsl "^2.2.0" +opener@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== + optionator@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" @@ -12246,6 +12266,15 @@ signal-exit@^3.0.2, signal-exit@^3.0.3: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== +sirv@^1.0.7: + version "1.0.19" + resolved "https://registry.yarnpkg.com/sirv/-/sirv-1.0.19.tgz#1d73979b38c7fe91fcba49c85280daa9c2363b49" + integrity sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ== + dependencies: + "@polka/url" "^1.0.0-next.20" + mrmime "^1.0.0" + totalist "^1.0.0" + sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -12958,6 +12987,11 @@ toposort@^2.0.2: resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" integrity sha1-riF2gXXRVZ1IvvNUILL0li8JwzA= +totalist@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/totalist/-/totalist-1.1.0.tgz#a4d65a3e546517701e3e5c37a47a70ac97fe56df" + integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== + tough-cookie@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" @@ -13554,6 +13588,21 @@ webidl-conversions@^6.1.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== +webpack-bundle-analyzer@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz#1b0eea2947e73528754a6f9af3e91b2b6e0f79d5" + integrity sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ== + dependencies: + acorn "^8.0.4" + acorn-walk "^8.0.0" + chalk "^4.1.0" + commander "^7.2.0" + gzip-size "^6.0.0" + lodash "^4.17.20" + opener "^1.5.2" + sirv "^1.0.7" + ws "^7.3.1" + webpack-dev-middleware@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz#aa079a8dedd7e58bfeab358a9af7dab304cee57f" @@ -13979,6 +14028,11 @@ ws@>=7.4.6: resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.0.tgz#0b738cd484bfc9303421914b11bb4011e07615bb" integrity sha512-uYhVJ/m9oXwEI04iIVmgLmugh2qrZihkywG9y5FfZV2ATeLIzHf93qs+tUNqlttbQK957/VX3mtwAS+UfIwA4g== +ws@^7.3.1: + version "7.5.8" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.8.tgz#ac2729881ab9e7cbaf8787fe3469a48c5c7f636a" + integrity sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw== + ws@^7.4.6: version "7.5.7" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" From ea0da547f990209b89ad28d87a87659d9d5f79e7 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Mon, 4 Jul 2022 11:57:22 +1000 Subject: [PATCH 012/309] Leaf icon: use mdi-material-ui --- src/assets/icons/Leaf.tsx | 10 ---------- src/assets/icons/index.ts | 6 ++++++ src/components/Settings/RegionSelect.tsx | 2 +- 3 files changed, 7 insertions(+), 11 deletions(-) delete mode 100644 src/assets/icons/Leaf.tsx diff --git a/src/assets/icons/Leaf.tsx b/src/assets/icons/Leaf.tsx deleted file mode 100644 index dc092b28..00000000 --- a/src/assets/icons/Leaf.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import SvgIcon, { SvgIconProps } from "@mui/material/SvgIcon"; -import { mdiLeaf } from "@mdi/js"; - -export default function Leaf(props: SvgIconProps) { - return ( - - - - ); -} diff --git a/src/assets/icons/index.ts b/src/assets/icons/index.ts index 2721ea47..ad903f41 100644 --- a/src/assets/icons/index.ts +++ b/src/assets/icons/index.ts @@ -88,6 +88,12 @@ export { LanguageMarkdownOutline as Markdown }; import { TableRow } from "mdi-material-ui"; export { TableRow as Row }; +import { Table } from "mdi-material-ui"; +export { Table }; + +import { Leaf } from "mdi-material-ui"; +export { Leaf }; + export * from "./AddRow"; export * from "./AddRowTop"; export * from "./ChevronDown"; diff --git a/src/components/Settings/RegionSelect.tsx b/src/components/Settings/RegionSelect.tsx index 08dccaf4..d1f7892a 100644 --- a/src/components/Settings/RegionSelect.tsx +++ b/src/components/Settings/RegionSelect.tsx @@ -2,7 +2,7 @@ import { sortBy } from "lodash-es"; import MultiSelect from "@rowy/multiselect"; import { Grid } from "@mui/material"; -import LeafIcon from "@src/assets/icons/Leaf"; +import { Leaf as LeafIcon } from "@src/assets/icons"; import { CLOUD_RUN_REGIONS } from "@src/constants/regions"; From 4f230871e1701e6df9b1038190ad7ac5a934ef33 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Mon, 4 Jul 2022 19:13:30 +1000 Subject: [PATCH 013/309] replace desktop pinned nav with collapsible nav --- src/atoms/globalScope/ui.ts | 2 - src/components/FloatingSearch.tsx | 4 +- src/components/SectionHeading.tsx | 4 +- src/components/SideDrawer/StyledDrawer.ts | 10 +- src/components/Table/EmptyTable.tsx | 4 +- src/components/Table/Table.tsx | 7 +- src/components/Table/TableContainer.tsx | 4 +- src/constants/externalLinks.ts | 1 + src/constants/routes.tsx | 21 +- src/layouts/Navigation/HelpMenu.tsx | 3 +- src/layouts/Navigation/NavDrawer.tsx | 431 +++++++++++++-------- src/layouts/Navigation/NavItem.tsx | 38 +- src/layouts/Navigation/NavTableSection.tsx | 38 +- src/layouts/Navigation/Navigation.tsx | 200 ++-------- src/layouts/Navigation/TopBar.tsx | 177 +++++++++ src/layouts/Navigation/UserMenu.tsx | 1 - src/pages/FunctionsPage.tsx | 4 +- src/pages/NotFoundPage.tsx | 5 +- src/pages/Table/ProvidedSubTablePage.tsx | 10 +- src/pages/TablesPage.tsx | 9 +- 20 files changed, 561 insertions(+), 412 deletions(-) create mode 100644 src/layouts/Navigation/TopBar.tsx diff --git a/src/atoms/globalScope/ui.ts b/src/atoms/globalScope/ui.ts index 245beee3..616fc8f0 100644 --- a/src/atoms/globalScope/ui.ts +++ b/src/atoms/globalScope/ui.ts @@ -13,8 +13,6 @@ export const altPressAtom = atom(false); /** Nav open state stored in local storage. */ export const navOpenAtom = atomWithStorage("__ROWY__NAV_OPEN", false); -/** Nav pinned state stored in local storage. */ -export const navPinnedAtom = atomWithStorage("__ROWY__NAV_PINNED", false); /** View for tables page */ export const tablesViewAtom = atomWithStorage<"grid" | "list">( diff --git a/src/components/FloatingSearch.tsx b/src/components/FloatingSearch.tsx index 3068323f..a6dd3d40 100644 --- a/src/components/FloatingSearch.tsx +++ b/src/components/FloatingSearch.tsx @@ -8,7 +8,7 @@ import { import SearchIcon from "@mui/icons-material/Search"; import SlideTransition from "@src/components/Modal/SlideTransition"; -import { APP_BAR_HEIGHT } from "@src/layouts/Navigation"; +import { TOP_BAR_HEIGHT } from "@src/layouts/Navigation/TopBar"; export interface IFloatingSearchProps extends Partial { label: string; @@ -26,7 +26,7 @@ export default function FloatingSearch({ }); const docked = useScrollTrigger({ disableHysteresis: true, - threshold: APP_BAR_HEIGHT, + threshold: TOP_BAR_HEIGHT, }); return ( diff --git a/src/components/SectionHeading.tsx b/src/components/SectionHeading.tsx index 99eeeb48..6a29c25d 100644 --- a/src/components/SectionHeading.tsx +++ b/src/components/SectionHeading.tsx @@ -5,7 +5,7 @@ import { HashLink } from "react-router-hash-link"; import { Stack, StackProps, Typography, IconButton } from "@mui/material"; import LinkIcon from "@mui/icons-material/Link"; -import { APP_BAR_HEIGHT } from "@src/layouts/Navigation"; +import { TOP_BAR_HEIGHT } from "@src/layouts/Navigation/TopBar"; export interface ISectionHeadingProps extends Omit { children: string; @@ -35,7 +35,7 @@ export const SectionHeading = forwardRef(function SectionHeading_( opacity: 1, }, - scrollMarginTop: (theme) => theme.spacing(APP_BAR_HEIGHT / 8 + 3.5), + scrollMarginTop: (theme) => theme.spacing(TOP_BAR_HEIGHT / 8 + 3.5), scrollBehavior: "smooth", }} > diff --git a/src/components/SideDrawer/StyledDrawer.ts b/src/components/SideDrawer/StyledDrawer.ts index e1ff7579..14802665 100644 --- a/src/components/SideDrawer/StyledDrawer.ts +++ b/src/components/SideDrawer/StyledDrawer.ts @@ -1,6 +1,6 @@ import { styled, Drawer, drawerClasses } from "@mui/material"; import { DRAWER_WIDTH, DRAWER_COLLAPSED_WIDTH } from "./index"; -import { APP_BAR_HEIGHT } from "@src/layouts/Navigation"; +import { TOP_BAR_HEIGHT } from "@src/layouts/Navigation/TopBar"; import { TABLE_TOOLBAR_HEIGHT } from "@src/components/TableToolbar"; export const StyledDrawer = styled(Drawer)(({ theme }) => ({ @@ -32,15 +32,15 @@ export const StyledDrawer = styled(Drawer)(({ theme }) => ({ boxSizing: "content-box", - top: APP_BAR_HEIGHT + TABLE_TOOLBAR_HEIGHT, - height: `calc(100% - ${APP_BAR_HEIGHT + TABLE_TOOLBAR_HEIGHT}px)`, + top: TOP_BAR_HEIGHT + TABLE_TOOLBAR_HEIGHT, + height: `calc(100% - ${TOP_BAR_HEIGHT + TABLE_TOOLBAR_HEIGHT}px)`, ".MuiDialog-paperFullScreen &": { top: - APP_BAR_HEIGHT + + TOP_BAR_HEIGHT + TABLE_TOOLBAR_HEIGHT + Number(theme.spacing(2).replace("px", "")), height: `calc(100% - ${ - APP_BAR_HEIGHT + TABLE_TOOLBAR_HEIGHT + TOP_BAR_HEIGHT + TABLE_TOOLBAR_HEIGHT }px - ${theme.spacing(2)})`, }, diff --git a/src/components/Table/EmptyTable.tsx b/src/components/Table/EmptyTable.tsx index 96c5e2d0..fd9794fb 100644 --- a/src/components/Table/EmptyTable.tsx +++ b/src/components/Table/EmptyTable.tsx @@ -13,7 +13,7 @@ import { columnModalAtom, tableModalAtom, } from "@src/atoms/tableScope"; -import { APP_BAR_HEIGHT } from "@src/layouts/Navigation"; +import { TOP_BAR_HEIGHT } from "@src/layouts/Navigation/TopBar"; export default function EmptyTable() { const openColumnModal = useSetAtom(columnModalAtom, tableScope); @@ -130,7 +130,7 @@ export default function EmptyTable() { justifyContent="center" alignItems="center" sx={{ - height: `calc(100vh - ${APP_BAR_HEIGHT}px)`, + height: `calc(100vh - ${TOP_BAR_HEIGHT}px)`, width: "100%", p: 2, maxWidth: 480, diff --git a/src/components/Table/Table.tsx b/src/components/Table/Table.tsx index 467a9a14..4c77f850 100644 --- a/src/components/Table/Table.tsx +++ b/src/components/Table/Table.tsx @@ -29,7 +29,6 @@ import { globalScope, userRolesAtom, userSettingsAtom, - navPinnedAtom, } from "@src/atoms/globalScope"; import { tableScope, @@ -66,7 +65,6 @@ export default function Table({ }) { const [userRoles] = useAtom(userRolesAtom, globalScope); const [userSettings] = useAtom(userSettingsAtom, globalScope); - const [navPinned] = useAtom(navPinnedAtom, globalScope); const [tableId] = useAtom(tableIdAtom, tableScope); const [tableSettings] = useAtom(tableSettingsAtom, tableScope); @@ -188,8 +186,9 @@ export default function Table({ const target = event.target as HTMLDivElement; - if (navPinned && !columns[0].fixed) - setShowLeftScrollDivider(target.scrollLeft > 16); + // TODO: + // if (navPinned && !columns[0].fixed) + // setShowLeftScrollDivider(target.scrollLeft > 16); const offset = 800; const isAtBottom = diff --git a/src/components/Table/TableContainer.tsx b/src/components/Table/TableContainer.tsx index 4a6d900d..eb372f3e 100644 --- a/src/components/Table/TableContainer.tsx +++ b/src/components/Table/TableContainer.tsx @@ -1,6 +1,6 @@ import { colord } from "colord"; import { styled, alpha, darken, lighten } from "@mui/material"; -import { APP_BAR_HEIGHT } from "@src/layouts/Navigation"; +import { TOP_BAR_HEIGHT } from "@src/layouts/Navigation/TopBar"; import { TABLE_TOOLBAR_HEIGHT } from "@src/components/TableToolbar"; import { DRAWER_COLLAPSED_WIDTH, @@ -15,7 +15,7 @@ export const TableContainer = styled("div", { display: "flex", position: "relative", flexDirection: "column", - height: `calc(100vh - ${APP_BAR_HEIGHT}px - ${TABLE_TOOLBAR_HEIGHT}px)`, + height: `calc(100vh - ${TOP_BAR_HEIGHT}px - ${TABLE_TOOLBAR_HEIGHT}px)`, "& .left-scroll-divider": { position: "absolute", diff --git a/src/constants/externalLinks.ts b/src/constants/externalLinks.ts index e1f0ebba..9ea89451 100644 --- a/src/constants/externalLinks.ts +++ b/src/constants/externalLinks.ts @@ -27,6 +27,7 @@ const WIKI_PATHS = { setupRoles: "/setup/roles", setupUpdate: "/setup/update", + howTo: "/category/quickstart-guide", howToCreateTable: "/how-to/create-table", howToCreateColumn: "/how-to/create-column", howToAddRow: "/how-to/add-row", diff --git a/src/constants/routes.tsx b/src/constants/routes.tsx index f890f937..5c65d586 100644 --- a/src/constants/routes.tsx +++ b/src/constants/routes.tsx @@ -1,6 +1,6 @@ import Logo from "@src/assets/Logo"; import BreadcrumbsTableRoot from "@src/components/Table/BreadcrumbsTableRoot"; -import { GrowProps } from "@mui/material"; +import { FadeProps } from "@mui/material"; export enum ROUTES { home = "/", @@ -46,22 +46,15 @@ export enum ROUTES { export const ROUTE_TITLES = { [ROUTES.tables]: { title: "Tables", - titleComponent: (open, pinned) => - !(open && pinned) && ( - + titleComponent: (open, isPermanent) => + !(open && isPermanent) && ( + ), }, [ROUTES.table]: { title: "Table", - titleComponent: (open, pinned) => ( - - ), + titleComponent: (_open, _isPermanent) => , titleTransitionProps: { style: { transformOrigin: "0 50%" } }, leftAligned: true, }, @@ -80,8 +73,8 @@ export const ROUTE_TITLES = { | string | { title: string; - titleComponent: (open: boolean, pinned: boolean) => React.ReactNode; - titleTransitionProps?: Partial; + titleComponent: (open: boolean, isPermanent: boolean) => React.ReactNode; + titleTransitionProps?: Partial; leftAligned?: boolean; } >; diff --git a/src/layouts/Navigation/HelpMenu.tsx b/src/layouts/Navigation/HelpMenu.tsx index c6a9bb49..c97bf4e8 100644 --- a/src/layouts/Navigation/HelpMenu.tsx +++ b/src/layouts/Navigation/HelpMenu.tsx @@ -11,7 +11,7 @@ import { Grow, } from "@mui/material"; import HelpIcon from "@mui/icons-material/HelpOutline"; -import DocsIcon from "@mui/icons-material/DescriptionOutlined"; +import DocsIcon from "@mui/icons-material/LibraryBooksOutlined"; import { Discord as DiscordIcon } from "@src/assets/icons"; import GitHubIcon from "@mui/icons-material/GitHub"; import TwitterIcon from "@mui/icons-material/Twitter"; @@ -44,7 +44,6 @@ export default function UserMenu(props: IconButtonProps) { setOpen(true); analytics.logEvent("open_help_menu"); }} - sx={{ ml: 1.5 }} > diff --git a/src/layouts/Navigation/NavDrawer.tsx b/src/layouts/Navigation/NavDrawer.tsx index cabc1c66..0f1097b9 100644 --- a/src/layouts/Navigation/NavDrawer.tsx +++ b/src/layouts/Navigation/NavDrawer.tsx @@ -1,5 +1,7 @@ +import { useState } from "react"; import { useAtom, useSetAtom } from "jotai"; import { find, groupBy } from "lodash-es"; +import { colord } from "colord"; import { Drawer, @@ -9,19 +11,25 @@ import { List, ListItemIcon, ListItemText, - // ListSubheader, + Avatar, Divider, + ListItemSecondaryAction, + Box, + Fade, } from "@mui/material"; import CloseIcon from "@mui/icons-material/MenuOpen"; -import PinIcon from "@mui/icons-material/PushPinOutlined"; -import UnpinIcon from "@mui/icons-material/PushPin"; +import ArrowBackIcon from "@mui/icons-material/WorkspacesOutlined"; import HomeIcon from "@mui/icons-material/HomeOutlined"; import SettingsIcon from "@mui/icons-material/SettingsOutlined"; import ProjectSettingsIcon from "@mui/icons-material/BuildCircleOutlined"; import UserManagementIcon from "@mui/icons-material/AccountCircleOutlined"; import AddIcon from "@mui/icons-material/Add"; +import { Table as TableIcon } from "@src/assets/icons"; +import DocsIcon from "@mui/icons-material/LibraryBooksOutlined"; +import LearningIcon from "@mui/icons-material/LocalLibraryOutlined"; +import HelpIcon from "@mui/icons-material/HelpOutline"; +import InlineOpenInNewIcon from "@src/components/InlineOpenInNewIcon"; -import { APP_BAR_HEIGHT } from "."; import Logo from "@src/assets/Logo"; import NavItem from "./NavItem"; import NavTableSection from "./NavTableSection"; @@ -36,24 +44,22 @@ import { } from "@src/atoms/globalScope"; import { TableSettings } from "@src/types/table"; import { ROUTES } from "@src/constants/routes"; +import { EXTERNAL_LINKS, WIKI_LINKS } from "@src/constants/externalLinks"; +import { TOP_BAR_HEIGHT } from "./TopBar"; export const NAV_DRAWER_WIDTH = 256; +export const NAV_DRAWER_COLLAPSED_WIDTH = 56; export interface INavDrawerProps extends DrawerProps { + open: boolean; + isPermanent: boolean; onClose: NonNullable; - pinned: boolean; - setPinned: React.Dispatch>; - canPin: boolean; - scrollTrigger: boolean; } export default function NavDrawer({ open, - pinned, - setPinned, - canPin, - scrollTrigger, - ...props + isPermanent, + onClose, }: INavDrawerProps) { const [tables] = useAtom(tablesAtom, globalScope); const [userSettings] = useAtom(userSettingsAtom, globalScope); @@ -63,6 +69,8 @@ export default function NavDrawer({ globalScope ); + const [hover, setHover] = useState(false); + const favorites = Array.isArray(userSettings.favoriteTables) ? userSettings.favoriteTables : []; @@ -73,146 +81,145 @@ export default function NavDrawer({ ...groupBy(tables, "section"), }; - const closeDrawer = pinned + const collapsed = !open && isPermanent; + const tempExpanded = hover && collapsed; + const width = + collapsed && !tempExpanded ? NAV_DRAWER_COLLAPSED_WIDTH : NAV_DRAWER_WIDTH; + const closeDrawer = isPermanent ? undefined - : (e: {}) => props.onClose(e, "escapeKeyDown"); + : (e: {}) => onClose(e, "escapeKeyDown"); + + const externalLinkIcon = !collapsed && ( + + + + ); return ( - - theme.transitions.create("width", { - easing: pinned - ? theme.transitions.easing.easeOut - : theme.transitions.easing.sharp, - duration: pinned - ? theme.transitions.duration.enteringScreen - : theme.transitions.duration.leavingScreen, - }), - - flexShrink: 0, - - "& .MuiDrawer-paper": { - minWidth: NAV_DRAWER_WIDTH, - borderRight: "none", - bgcolor: pinned ? "background.default" : "background.paper", - }, - }} - > - - theme.transitions.create("opacity", { - easing: - canPin && pinned - ? theme.transitions.easing.easeOut - : theme.transitions.easing.sharp, - duration: - canPin && pinned - ? theme.transitions.duration.enteringScreen - : theme.transitions.duration.leavingScreen, - }), + <> + - theme.transitions.create(["background-color", "box-shadow"], { - easing: - canPin && pinned - ? theme.transitions.easing.easeOut - : theme.transitions.easing.sharp, - duration: - canPin && pinned - ? theme.transitions.duration.enteringScreen - : theme.transitions.duration.leavingScreen, - }), - }} + isPermanent && { + position: "fixed", + zIndex: (theme) => theme.zIndex.appBar - 1, + + "& .MuiDrawer-paper": { + mt: `${TOP_BAR_HEIGHT - 4}px`, + height: `calc(100% - ${TOP_BAR_HEIGHT - 4}px)`, + pt: 0.5, + borderRadius: 2, + borderTopLeftRadius: 0, + borderBottomLeftRadius: 0, + + width, + transitionProperty: + "width, transform, background-color, box-shadow", + transitionTimingFunction: "var(--nav-transition-timing-function)", + transitionDuration: "var(--nav-transition-duration)", + overflowX: "hidden", + + borderRight: "none", + bgcolor: "background.default", + }, + + "& .MuiListItemSecondaryAction-root": { + transitionProperty: "opacity", + transitionTimingFunction: "var(--nav-transition-timing-function)", + transitionDuration: "var(--nav-transition-duration)", + }, + }, + collapsed && + !tempExpanded && { + "& .MuiMenuItem-root": {}, + "& .MuiListItemSecondaryAction-root": { + opacity: 0, + transitionDelay: "0ms", + }, + }, + tempExpanded && { + zIndex: "drawer", + "& .MuiDrawer-paper": { + bgcolor: (theme) => + colord(theme.palette.background.paper) + .mix("#fff", 0.09) + .alpha(1) + .toHslString(), + boxShadow: (theme) => + theme.shadows[4].replace(/, 0 (\d+px)/g, ", $1 0"), + }, + }, + ]} + onMouseEnter={() => setHover(true)} + onMouseLeave={() => setHover(false)} > - - - - - - - {canPin && ( - setPinned((p) => !p)} - aria-pressed={pinned} - size="large" - style={{ marginLeft: "auto" }} + {!isPermanent && ( + - {pinned ? : } - + + + + + + )} - - + + + {isPermanent && ( + + )} + ); } diff --git a/src/layouts/Navigation/NavItem.tsx b/src/layouts/Navigation/NavItem.tsx index c33bf6f3..efe92f66 100644 --- a/src/layouts/Navigation/NavItem.tsx +++ b/src/layouts/Navigation/NavItem.tsx @@ -1,29 +1,35 @@ import { Link, useLocation } from "react-router-dom"; import { MenuItem, MenuItemProps } from "@mui/material"; +import { spreadSx } from "@src/utils/ui"; -export default function NavItem(props: MenuItemProps) { +const linkProps = { target: "_blank", rel: "noopener noreferrer" }; + +export default function NavItem(props: MenuItemProps) { const { pathname } = useLocation(); return ( ); } diff --git a/src/layouts/Navigation/NavTableSection.tsx b/src/layouts/Navigation/NavTableSection.tsx index 4a328151..296a3a2c 100644 --- a/src/layouts/Navigation/NavTableSection.tsx +++ b/src/layouts/Navigation/NavTableSection.tsx @@ -1,7 +1,13 @@ import { useState } from "react"; import { useLocation } from "react-router-dom"; -import { List, ListItemIcon, ListItemText, Collapse } from "@mui/material"; +import { + List, + ListItemIcon, + ListItemText, + ListItemSecondaryAction, + Collapse, +} from "@mui/material"; import FolderIcon from "@mui/icons-material/FolderOutlined"; import FavoriteIcon from "@mui/icons-material/FavoriteBorder"; import { ChevronDown } from "@src/assets/icons"; @@ -17,12 +23,14 @@ export interface INavTableSectionProps { section: string; tables: TableSettings[]; closeDrawer?: (e: {}) => void; + hidden?: boolean; } export default function NavTableSection({ section, tables, closeDrawer, + hidden, }: INavTableSectionProps) { const { pathname } = useLocation(); const hasMatch = tables.map(getTableRoute).includes(pathname); @@ -31,7 +39,14 @@ export default function NavTableSection({ const isFavorites = section === "Favorites"; return ( -
  • +
  • - - - - - - -
  • - -
  • - - - - P - - - - -
  • - - {/* {userRoles.includes("ADMIN") && ( -
  • - - - - - - -
  • - )} */} - - -
  • @@ -251,30 +209,30 @@ export default function NavDrawer({ + {userRoles.includes("ADMIN") && ( + + )}
  • {userRoles.includes("ADMIN") && (
  • - + - + - - +
  • )} - {/* Your tables */} -
  • { + onClick={(e: any) => { if (closeDrawer) closeDrawer(e); openTableSettingsDialog({}); }} @@ -286,15 +244,6 @@ export default function NavDrawer({
  • - {/*
  • - - - - - - -
  • */} - {sections && Object.entries(sections) .filter(([, tables]) => tables.length > 0) @@ -329,13 +278,36 @@ export default function NavDrawer({
  • - + setHelpMenuAnchorEl(e.currentTarget)} + > + + + + + + + + +
  • +
  • + setHelpMenuAnchorEl(e.currentTarget)} + > + + +
  • + + setHelpMenuAnchorEl(null)} + /> diff --git a/src/layouts/Navigation/NavItem.tsx b/src/layouts/Navigation/NavItem.tsx index efe92f66..cc6cf903 100644 --- a/src/layouts/Navigation/NavItem.tsx +++ b/src/layouts/Navigation/NavItem.tsx @@ -4,24 +4,29 @@ import { spreadSx } from "@src/utils/ui"; const linkProps = { target: "_blank", rel: "noopener noreferrer" }; -export default function NavItem(props: MenuItemProps) { +export default function NavItem( + props: MenuItemProps +) { const { pathname } = useLocation(); return ( + colord(theme.palette.background.paper) + .mix("#fff", 0.09) // Elevation 8 + .alpha(1) + .toHslString() + : "transparent", + transitionProperty: "box-shadow, background-color", }} > - + + diff --git a/src/layouts/Navigation/UpdateCheckBadge.tsx b/src/layouts/Navigation/UpdateCheckBadge.tsx index e41ade67..7c142d55 100644 --- a/src/layouts/Navigation/UpdateCheckBadge.tsx +++ b/src/layouts/Navigation/UpdateCheckBadge.tsx @@ -1,10 +1,19 @@ +import { useAtom } from "jotai"; + import { Badge, BadgeProps } from "@mui/material"; + +import { globalScope, userRolesAtom } from "@src/atoms/globalScope"; import useUpdateCheck from "@src/hooks/useUpdateCheck"; export default function UpdateCheckBadge(props: Partial) { + const [userRoles] = useAtom(userRolesAtom, globalScope); const [latestUpdate] = useUpdateCheck(); - if (!latestUpdate.rowy && !latestUpdate.rowyRun) return <>{props.children}; + if ( + !userRoles.includes("ADMIN") || + (!latestUpdate.rowy && !latestUpdate.rowyRun) + ) + return <>{props.children}; return ( theme.breakpoints.down("md")); - return ( - - - -
    - + Welcome! To join this project, sign up with the email address + {searchParams.get("email") ? ( <> - Welcome! To join this project, sign in with the email address - {searchParams.get("email") ? ( - <> - :{" "} - - {searchParams.get("email")} - - - ) : ( - " used to invite you." - )} + : {searchParams.get("email")} - } + ) : ( + " used to invite you." + )} + + } + > + + + By signing up, you agree to our{" "} + - - - By signing up, you agree to our{" "} - - Terms and Conditions - {" "} - and{" "} - - Privacy Policy - - . - - -
    -
    + Terms and Conditions + {" "} + and{" "} + + Privacy Policy + + . + + ); } diff --git a/src/pages/Settings/DebugSettingsPage.tsx b/src/pages/Settings/DebugSettingsPage.tsx index ebd10f1d..d6ad22fa 100644 --- a/src/pages/Settings/DebugSettingsPage.tsx +++ b/src/pages/Settings/DebugSettingsPage.tsx @@ -17,7 +17,7 @@ import { allUsersAtom, updateUserAtom, } from "@src/atoms/globalScope"; -import UserManagementSourceFirebase from "@src/sources/UserManagementSourceFirebase"; +import UserManagementSourceFirebase from "@src/sources/MembersSourceFirebase"; import { firebaseDbAtom } from "@src/sources/ProjectSourceFirebase"; import { USERS } from "@src/config/dbPaths"; import { getTableSchemaPath } from "@src/utils/table"; diff --git a/src/pages/Settings/UserManagementPage.tsx b/src/pages/Settings/MembersPage.tsx similarity index 92% rename from src/pages/Settings/UserManagementPage.tsx rename to src/pages/Settings/MembersPage.tsx index 045ae49b..2431e608 100644 --- a/src/pages/Settings/UserManagementPage.tsx +++ b/src/pages/Settings/MembersPage.tsx @@ -19,18 +19,18 @@ import UserSkeleton from "@src/components/Settings/UserManagement/UserSkeleton"; import InviteUser from "@src/components/Settings/UserManagement/InviteUser"; import { globalScope, allUsersAtom } from "@src/atoms/globalScope"; -import UserManagementSourceFirebase from "@src/sources/UserManagementSourceFirebase"; +import MembersSourceFirebase from "@src/sources/MembersSourceFirebase"; import useBasicSearch from "@src/hooks/useBasicSearch"; const SEARCH_KEYS = ["id", "user.displayName", "user.email"]; -function UserManagementPage() { +function MembersPage() { const [users] = useAtom(allUsersAtom, globalScope); const [results, query, handleQuery] = useBasicSearch(users, SEARCH_KEYS); return ( - + } > - + ); } diff --git a/src/sources/UserManagementSourceFirebase.tsx b/src/sources/MembersSourceFirebase.tsx similarity index 54% rename from src/sources/UserManagementSourceFirebase.tsx rename to src/sources/MembersSourceFirebase.tsx index 9b64ea1f..aa4acde5 100644 --- a/src/sources/UserManagementSourceFirebase.tsx +++ b/src/sources/MembersSourceFirebase.tsx @@ -11,14 +11,12 @@ import { USERS } from "@src/config/dbPaths"; /** * When rendered, provides atom values for top-level tables */ -const UserManagementSourceFirebase = memo( - function UserManagementSourceFirebase() { - useFirestoreCollectionWithAtom(allUsersAtom, globalScope, USERS, { - updateDocAtom: updateUserAtom, - }); +const MembersSourceFirebase = memo(function MembersSourceFirebase() { + useFirestoreCollectionWithAtom(allUsersAtom, globalScope, USERS, { + updateDocAtom: updateUserAtom, + }); - return null; - } -); + return null; +}); -export default UserManagementSourceFirebase; +export default MembersSourceFirebase; From 5123b1c1ca93ee8fcc556302687d240ec770eb0e Mon Sep 17 00:00:00 2001 From: shamsmosowi Date: Wed, 6 Jul 2022 13:38:14 +0200 Subject: [PATCH 018/309] extend callable timeout to over 9minutes --- src/components/fields/Action/ActionFab.tsx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/components/fields/Action/ActionFab.tsx b/src/components/fields/Action/ActionFab.tsx index 26a32187..db8eee99 100644 --- a/src/components/fields/Action/ActionFab.tsx +++ b/src/components/fields/Action/ActionFab.tsx @@ -93,10 +93,9 @@ export default function ActionFab({ return resp; }; const handleCallableAction = async (data: any) => { - const resp: any = await httpsCallable( - firebaseFunctions, - callableName - )(data); + const resp: any = await httpsCallable(firebaseFunctions, callableName, { + timeout: 550, + })(data); return resp.data; }; From 9a168544b47a1cb3293c516fbba3dbfa401f40f1 Mon Sep 17 00:00:00 2001 From: shamsmosowi Date: Wed, 6 Jul 2022 13:44:34 +0200 Subject: [PATCH 019/309] fix timeout value --- src/components/fields/Action/ActionFab.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/fields/Action/ActionFab.tsx b/src/components/fields/Action/ActionFab.tsx index db8eee99..67f00847 100644 --- a/src/components/fields/Action/ActionFab.tsx +++ b/src/components/fields/Action/ActionFab.tsx @@ -94,7 +94,7 @@ export default function ActionFab({ }; const handleCallableAction = async (data: any) => { const resp: any = await httpsCallable(firebaseFunctions, callableName, { - timeout: 550, + timeout: 550000, })(data); return resp.data; }; From 0ece76c3efb3daf258c93c1ed80e8b9efd7c870c Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Thu, 7 Jul 2022 19:16:59 +1000 Subject: [PATCH 020/309] add GetStartedChecklist --- src/assets/icons/index.ts | 6 + src/atoms/globalScope/ui.ts | 3 + src/components/SocialLogo.tsx | 52 ++++ src/components/SteppedAccordion.tsx | 20 +- src/constants/externalLinks.ts | 1 + src/layouts/Navigation/CommunityMenu.tsx | 116 ++++++++ .../GetStartedChecklist.tsx | 174 +++++++++++ .../GetStartedChecklist/Progress.tsx | 23 ++ .../Navigation/GetStartedChecklist/index.ts | 2 + src/layouts/Navigation/HelpMenu.tsx | 85 +++--- src/layouts/Navigation/NavDrawer.tsx | 277 ++++++++++++------ src/layouts/Navigation/NavTableSection.tsx | 16 +- src/layouts/Navigation/Navigation.tsx | 2 + src/layouts/Navigation/SettingsNav.tsx | 115 ++++++++ src/layouts/Navigation/TopBar.tsx | 9 +- 15 files changed, 748 insertions(+), 153 deletions(-) create mode 100644 src/components/SocialLogo.tsx create mode 100644 src/layouts/Navigation/CommunityMenu.tsx create mode 100644 src/layouts/Navigation/GetStartedChecklist/GetStartedChecklist.tsx create mode 100644 src/layouts/Navigation/GetStartedChecklist/Progress.tsx create mode 100644 src/layouts/Navigation/GetStartedChecklist/index.ts create mode 100644 src/layouts/Navigation/SettingsNav.tsx diff --git a/src/assets/icons/index.ts b/src/assets/icons/index.ts index ad903f41..d969d6d8 100644 --- a/src/assets/icons/index.ts +++ b/src/assets/icons/index.ts @@ -94,6 +94,12 @@ export { Table }; import { Leaf } from "mdi-material-ui"; export { Leaf }; +import { FormatListChecks } from "mdi-material-ui"; +export { FormatListChecks as Checklist }; + +import { FileTableBoxOutline } from "mdi-material-ui"; +export { FileTableBoxOutline as Project }; + export * from "./AddRow"; export * from "./AddRowTop"; export * from "./ChevronDown"; diff --git a/src/atoms/globalScope/ui.ts b/src/atoms/globalScope/ui.ts index 616fc8f0..bf48d3a5 100644 --- a/src/atoms/globalScope/ui.ts +++ b/src/atoms/globalScope/ui.ts @@ -143,6 +143,9 @@ export const tableSettingsDialogSchemaAtom = atom(async (get) => { return getTableSchema(tableId); }); +/** Open the Get Started checklist from anywhere */ +export const getStartedChecklistAtom = atom(false); + /** Persist the state of the add row ID type */ export const tableAddRowIdTypeAtom = atomWithStorage< "decrement" | "random" | "custom" diff --git a/src/components/SocialLogo.tsx b/src/components/SocialLogo.tsx new file mode 100644 index 00000000..decbdae5 --- /dev/null +++ b/src/components/SocialLogo.tsx @@ -0,0 +1,52 @@ +import { Box, BoxProps, SvgIcon } from "@mui/material"; +import { Discord as DiscordIcon } from "@src/assets/icons"; +import GitHubIcon from "@mui/icons-material/GitHub"; +import TwitterIcon from "@mui/icons-material/Twitter"; + +import { spreadSx } from "@src/utils/ui"; + +const SOCIAL_PLATFORMS = Object.freeze({ + discord: { bg: "#5865F2", fg: "#fff", icon: }, + gitHub: { bg: "#24292E", fg: "#fff", icon: }, + twitter: { bg: "#1d9bf0", fg: "#fff", icon: }, + productHunt: { + bg: "#fff", + fg: "#DA552F", + icon: ( + + + + ), + }, +}); + +export interface ISocialLogoProps extends Partial { + platform: keyof typeof SOCIAL_PLATFORMS; +} + +export default function SocialLogo({ platform, ...props }: ISocialLogoProps) { + return ( + `0 0 0 1px ${ + theme.palette.action.inputOutline + } inset, + 0 ${theme.palette.mode === "dark" ? "" : "-"}1px 0 0 ${ + theme.palette.action.inputOutline + } inset`, + + "& svg": { display: "block" }, + }, + ...spreadSx(props.sx), + ]} + > + {SOCIAL_PLATFORMS[platform].icon} + + ); +} diff --git a/src/components/SteppedAccordion.tsx b/src/components/SteppedAccordion.tsx index 8e691790..97a62f8d 100644 --- a/src/components/SteppedAccordion.tsx +++ b/src/components/SteppedAccordion.tsx @@ -94,18 +94,20 @@ export default function SteppedAccordion({ > {title} - + {content && } - - {content} - + {content && ( + + {content} + + )} ) )} diff --git a/src/constants/externalLinks.ts b/src/constants/externalLinks.ts index 9ea89451..b0c73736 100644 --- a/src/constants/externalLinks.ts +++ b/src/constants/externalLinks.ts @@ -10,6 +10,7 @@ export const EXTERNAL_LINKS = { gitHub: meta.repository.url.replace(".git", ""), discord: "https://discord.gg/B8yAD5PDX4", twitter: "https://twitter.com/rowyio", + productHunt: "https://www.producthunt.com/products/rowy-2", rowyRun: meta.repository.url.replace(".git", "Run"), rowyRunGitHub: meta.repository.url.replace(".git", "Run"), diff --git a/src/layouts/Navigation/CommunityMenu.tsx b/src/layouts/Navigation/CommunityMenu.tsx new file mode 100644 index 00000000..b1b37b10 --- /dev/null +++ b/src/layouts/Navigation/CommunityMenu.tsx @@ -0,0 +1,116 @@ +import { useEffect } from "react"; + +import { + Menu, + MenuProps, + ListSubheader, + MenuItem, + ListItemIcon, + ListItemSecondaryAction, +} from "@mui/material"; +import InlineOpenInNewIcon from "@src/components/InlineOpenInNewIcon"; +import SocialLogo from "@src/components/SocialLogo"; + +import { EXTERNAL_LINKS } from "@src/constants/externalLinks"; +import { logEvent, analytics } from "analytics"; + +export default function HelpMenu({ + anchorEl, + onClose, +}: Pick) { + const open = Boolean(anchorEl); + useEffect(() => { + if (open) logEvent(analytics, "open_community_menu"); + }, [open]); + + const externalLinkIcon = ( + + + + ); + + return ( + + + Join our community + + + Reach out for help, engage with our community, or shout us out! + + + + + + + Discord + {externalLinkIcon} + + + + + + GitHub + {externalLinkIcon} + + + + + + Twitter + {externalLinkIcon} + + + + + + Product Hunt + {externalLinkIcon} + + + ); +} diff --git a/src/layouts/Navigation/GetStartedChecklist/GetStartedChecklist.tsx b/src/layouts/Navigation/GetStartedChecklist/GetStartedChecklist.tsx new file mode 100644 index 00000000..48a9cd4d --- /dev/null +++ b/src/layouts/Navigation/GetStartedChecklist/GetStartedChecklist.tsx @@ -0,0 +1,174 @@ +import { useAtom, useSetAtom } from "jotai"; + +import { Typography, Button } from "@mui/material"; +import UncheckedIcon from "@mui/icons-material/RadioButtonUnchecked"; +import CheckedIcon from "@mui/icons-material/CheckCircleOutline"; +import AddIcon from "@mui/icons-material/Add"; +import MembersIcon from "@mui/icons-material/AccountCircleOutlined"; +import { Project as ProjectIcon } from "@src/assets/icons"; + +import Modal, { IModalProps } from "@src/components/Modal"; +import SteppedAccordion from "@src/components/SteppedAccordion"; +import Progress from "./Progress"; + +import { + globalScope, + getStartedChecklistAtom, + tableSettingsDialogAtom, +} from "@src/atoms/globalScope"; +import { + NAV_DRAWER_WIDTH, + NAV_DRAWER_COLLAPSED_WIDTH, +} from "@src/layouts/Navigation/NavDrawer"; + +export interface IGetStartedChecklistProps extends Partial { + navOpen: boolean; + navPermanent: boolean; +} + +export default function GetStartedChecklist({ + navOpen, + navPermanent, + ...props +}: IGetStartedChecklistProps) { + const [open, setOpen] = useAtom(getStartedChecklistAtom, globalScope); + const openTableSettingsDialog = useSetAtom( + tableSettingsDialogAtom, + globalScope + ); + + if (!open) return null; + + return ( + setOpen(false)} + title="Get started" + hideBackdrop + maxWidth="xs" + PaperProps={{ elevation: 8 }} + fullScreen={false} + sx={[ + { + "& .MuiDialog-container": { + justifyContent: "flex-start", + alignItems: "flex-end", + }, + + "& .MuiDialog-paper": { + marginLeft: { + xs: `max(env(safe-area-inset-left), 8px)`, + sm: `max(env(safe-area-inset-left), ${ + (navPermanent + ? navOpen + ? NAV_DRAWER_WIDTH + : NAV_DRAWER_COLLAPSED_WIDTH + : 0) + 8 + }px)`, + }, + marginBottom: `max(env(safe-area-inset-bottom), 8px)`, + marginRight: `max(env(safe-area-inset-right), 8px)`, + width: 360, + }, + }, + ]} + > + + + }, + content: null, + }, + { + id: "tutorial", + title: "Complete the table tutorial", + labelButtonProps: { icon: }, + content: ( + <> + This is why you should + + + ), + }, + { + id: "project", + title: "Create a project", + labelButtonProps: { icon: }, + content: ( + <> + + You’re ready to create a project and connect to a data source + + + + ), + }, + { + id: "table", + title: "Create a table", + labelButtonProps: { icon: }, + content: ( + <> + This is why you should + + + ), + }, + { + id: "members", + title: "Invite team members", + labelButtonProps: { icon: }, + content: ( + <> + + Go to the members page to invite someone + + + + ), + }, + ]} + sx={{ + "& .MuiStepConnector-root": { + my: -10 / 8, + }, + "& .Mui-active + .MuiStep-root:not(:last-of-type) .MuiStepContent-root": + { + mt: -10 / 8, + pt: 10 / 8, + mb: 10 / 8, + pb: 2, + }, + "& .MuiStepContent-root .MuiCollapse-wrapperInner > * + *": { + mt: 1, + }, + }} + /> + + ); +} diff --git a/src/layouts/Navigation/GetStartedChecklist/Progress.tsx b/src/layouts/Navigation/GetStartedChecklist/Progress.tsx new file mode 100644 index 00000000..6c824d65 --- /dev/null +++ b/src/layouts/Navigation/GetStartedChecklist/Progress.tsx @@ -0,0 +1,23 @@ +import { Box, BoxProps, Typography } from "@mui/material"; +import { spreadSx } from "@src/utils/ui"; + +export default function Progress({ sx }: Partial) { + return ( + + 1/5 + + + + + + + + ); +} diff --git a/src/layouts/Navigation/GetStartedChecklist/index.ts b/src/layouts/Navigation/GetStartedChecklist/index.ts new file mode 100644 index 00000000..d9dc14e5 --- /dev/null +++ b/src/layouts/Navigation/GetStartedChecklist/index.ts @@ -0,0 +1,2 @@ +export * from "./GetStartedChecklist"; +export { default } from "./GetStartedChecklist"; diff --git a/src/layouts/Navigation/HelpMenu.tsx b/src/layouts/Navigation/HelpMenu.tsx index 0a3b4567..e96fbc4b 100644 --- a/src/layouts/Navigation/HelpMenu.tsx +++ b/src/layouts/Navigation/HelpMenu.tsx @@ -1,30 +1,39 @@ +import { useEffect } from "react"; + import { Menu, MenuProps, + ListSubheader, MenuItem, ListItemIcon, ListItemSecondaryAction, Divider, } from "@mui/material"; -import DocsIcon from "@mui/icons-material/LibraryBooksOutlined"; -import { Discord as DiscordIcon } from "@src/assets/icons"; -import GitHubIcon from "@mui/icons-material/GitHub"; -import TwitterIcon from "@mui/icons-material/Twitter"; +import InlineOpenInNewIcon from "@src/components/InlineOpenInNewIcon"; +import SocialLogo from "@src/components/SocialLogo"; import { EXTERNAL_LINKS } from "@src/constants/externalLinks"; -import InlineOpenInNewIcon from "@src/components/InlineOpenInNewIcon"; -import { analytics } from "analytics"; +import { logEvent, analytics } from "analytics"; export default function HelpMenu({ anchorEl, onClose, }: Pick) { - // useEffect(() => { - // analytics.logEvent("open_help_menu"); - // }, []); + const open = Boolean(anchorEl); + useEffect(() => { + if (open) logEvent(analytics, "open_help_menu"); + }, [open]); const externalLinkIcon = ( - + ); @@ -32,50 +41,60 @@ export default function HelpMenu({ return ( + + Get support + + + Reach out for help and find FAQs on GitHub Discussions + + - - + + - Discord + GitHub Discussions {externalLinkIcon} + + + - - + + - GitHub - {externalLinkIcon} - - - - - - Twitter + Feature request {externalLinkIcon} diff --git a/src/layouts/Navigation/NavDrawer.tsx b/src/layouts/Navigation/NavDrawer.tsx index 6ae58bac..d3cb5568 100644 --- a/src/layouts/Navigation/NavDrawer.tsx +++ b/src/layouts/Navigation/NavDrawer.tsx @@ -4,6 +4,7 @@ import { find, groupBy } from "lodash-es"; import { colord } from "colord"; import { + alpha, Drawer, DrawerProps, Stack, @@ -17,28 +18,31 @@ import { } from "@mui/material"; import CloseIcon from "@mui/icons-material/MenuOpen"; import HomeIcon from "@mui/icons-material/HomeOutlined"; -import SettingsIcon from "@mui/icons-material/SettingsOutlined"; -import UserManagementIcon from "@mui/icons-material/AccountCircleOutlined"; import AddIcon from "@mui/icons-material/Add"; import DocsIcon from "@mui/icons-material/LibraryBooksOutlined"; import LearningIcon from "@mui/icons-material/LocalLibraryOutlined"; import HelpIcon from "@mui/icons-material/HelpOutline"; import CommunityIcon from "@mui/icons-material/SentimentSatisfiedAltOutlined"; import InlineOpenInNewIcon from "@src/components/InlineOpenInNewIcon"; -import { ChevronRight as ChevronRightIcon } from "@src/assets/icons"; +import { + ChevronRight as ChevronRightIcon, + Checklist as ChecklistIcon, +} from "@src/assets/icons"; import Logo from "@src/assets/Logo"; import NavItem from "./NavItem"; +import SettingsNav from "./SettingsNav"; import NavTableSection from "./NavTableSection"; -import UpdateCheckBadge from "./UpdateCheckBadge"; +import Progress from "./GetStartedChecklist/Progress"; +import CommunityMenu from "./CommunityMenu"; import HelpMenu from "./HelpMenu"; import { globalScope, - userRolesAtom, userSettingsAtom, tablesAtom, tableSettingsDialogAtom, + getStartedChecklistAtom, } from "@src/atoms/globalScope"; import { TableSettings } from "@src/types/table"; import { ROUTES } from "@src/constants/routes"; @@ -61,16 +65,23 @@ export default function NavDrawer({ }: INavDrawerProps) { const [tables] = useAtom(tablesAtom, globalScope); const [userSettings] = useAtom(userSettingsAtom, globalScope); - const [userRoles] = useAtom(userRolesAtom, globalScope); const openTableSettingsDialog = useSetAtom( tableSettingsDialogAtom, globalScope ); + const openGetStartedChecklist = useSetAtom( + getStartedChecklistAtom, + globalScope + ); const [hover, setHover] = useState(false); + const [communityMenuAnchorEl, setCommunityMenuAnchorEl] = + useState(null); const [helpMenuAnchorEl, setHelpMenuAnchorEl] = useState(null); + const menuOpen = communityMenuAnchorEl || helpMenuAnchorEl; + const favorites = Array.isArray(userSettings.favoriteTables) ? userSettings.favoriteTables : []; @@ -82,7 +93,7 @@ export default function NavDrawer({ }; const collapsed = !open && isPermanent; - const tempExpanded = hover && collapsed; + const tempExpanded = (hover || menuOpen) && collapsed; const width = collapsed && !tempExpanded ? NAV_DRAWER_COLLAPSED_WIDTH : NAV_DRAWER_WIDTH; const closeDrawer = isPermanent @@ -111,8 +122,15 @@ export default function NavDrawer({ "& .MuiDrawer-paper": { width, pt: 0, - pb: 1, scrollbarWidth: "thin", + + "--nav-bg": (theme) => + colord(theme.palette.background.paper) + .mix("#fff", 0.09) // elevation 8 + .alpha(1) + .toHslString(), + bgcolor: "var(--nav-bg)", + backgroundImage: "none", }, }, isPermanent && { @@ -135,7 +153,7 @@ export default function NavDrawer({ overflowX: "hidden", borderRight: "none", - bgcolor: "background.default", + "--nav-bg": (theme) => theme.palette.background.default, }, "& .MuiListItemSecondaryAction-root": { @@ -158,9 +176,9 @@ export default function NavDrawer({ tempExpanded && { zIndex: "drawer", "& .MuiDrawer-paper": { - bgcolor: (theme) => + "--nav-bg": (theme) => colord(theme.palette.background.paper) - .mix("#fff", 0.09) + .mix("#fff", 0.09) // elevation 8 .alpha(1) .toHslString(), boxShadow: (theme) => @@ -168,14 +186,25 @@ export default function NavDrawer({ }, }, ]} - onMouseEnter={() => setHover(true)} - onMouseLeave={() => setHover(false)} + PaperProps={{ + elevation: isPermanent ? 0 : 8, + onMouseEnter: () => setHover(true), + onMouseLeave: () => setHover(false), + }} > {!isPermanent && (
  • @@ -203,47 +239,13 @@ export default function NavDrawer({
  • -
  • - - - - - - {userRoles.includes("ADMIN") && ( - - )} - -
  • - - {userRoles.includes("ADMIN") && ( -
  • - - - - - - -
  • - )} + -
  • - { - if (closeDrawer) closeDrawer(e); - openTableSettingsDialog({}); - }} - > - - - - - -
  • - {sections && Object.entries(sections) .filter(([, tables]) => tables.length > 0) @@ -253,61 +255,142 @@ export default function NavDrawer({ section={section} tables={tables} closeDrawer={closeDrawer} - hidden={isPermanent && !open && !tempExpanded} + collapsed={isPermanent && !open && !tempExpanded} /> ))} - - -
  • - - - - - - {externalLinkIcon} - -
  • -
  • - - - - - - {externalLinkIcon} - -
  • setHelpMenuAnchorEl(e.currentTarget)} + {...({ component: "button" } as any)} + onClick={(e: any) => { + if (closeDrawer) closeDrawer(e); + openTableSettingsDialog({}); + }} + sx={{ mb: 1 }} > - + - - - - - -
  • -
  • - setHelpMenuAnchorEl(e.currentTarget)} - > - - - - - - - +
  • - setHelpMenuAnchorEl(null)} - /> + +
      + + +
    1. + { + openGetStartedChecklist(true); + setHover(false); + }} + sx={{ + mb: 1, + py: 0.5, + bgcolor: (theme) => + alpha( + theme.palette.primary.main, + theme.palette.action.selectedOpacity + ), + "&:hover": { + bgcolor: (theme) => + alpha( + theme.palette.primary.main, + theme.palette.action.selectedOpacity + + theme.palette.action.hoverOpacity + ), + }, + "& *, &&:hover *": { + color: (theme) => + theme.palette.primary[ + theme.palette.mode === "dark" ? "light" : "dark" + ], + }, + }} + > + + + + } + /> + + + + +
    2. + +
    3. + + + + + + {externalLinkIcon} + +
    4. + +
    5. + + + + + + {externalLinkIcon} + +
    6. + +
    7. + + setCommunityMenuAnchorEl(e.currentTarget) + } + > + + + + + + + + + setCommunityMenuAnchorEl(null)} + /> +
    8. + +
    9. + setHelpMenuAnchorEl(e.currentTarget)} + > + + + + + + + + + setHelpMenuAnchorEl(null)} + /> +
    10. +
    +
    diff --git a/src/layouts/Navigation/NavTableSection.tsx b/src/layouts/Navigation/NavTableSection.tsx index 296a3a2c..6867fae6 100644 --- a/src/layouts/Navigation/NavTableSection.tsx +++ b/src/layouts/Navigation/NavTableSection.tsx @@ -23,14 +23,14 @@ export interface INavTableSectionProps { section: string; tables: TableSettings[]; closeDrawer?: (e: {}) => void; - hidden?: boolean; + collapsed?: boolean; } export default function NavTableSection({ section, tables, closeDrawer, - hidden, + collapsed, }: INavTableSectionProps) { const { pathname } = useLocation(); const hasMatch = tables.map(getTableRoute).includes(pathname); @@ -39,16 +39,8 @@ export default function NavTableSection({ const isFavorites = section === "Favorites"; return ( -
  • setOpen((o) => !o)} > @@ -71,7 +63,7 @@ export default function NavTableSection({ - + {tables.map((table) => { const route = getTableRoute(table); diff --git a/src/layouts/Navigation/Navigation.tsx b/src/layouts/Navigation/Navigation.tsx index 11566a86..dc15bbac 100644 --- a/src/layouts/Navigation/Navigation.tsx +++ b/src/layouts/Navigation/Navigation.tsx @@ -11,6 +11,7 @@ import ErrorFallback, { IErrorFallbackProps, } from "@src/components/ErrorFallback"; import Loading from "@src/components/Loading"; +import GetStartedChecklist from "./GetStartedChecklist"; import { globalScope, @@ -51,6 +52,7 @@ export default function Navigation({ children }: React.PropsWithChildren<{}>) { isPermanent={isPermanent} onClose={() => setOpen(false)} /> + void; + collapsed: boolean; +} + +export default function SettingsNav({ + closeDrawer, + collapsed, +}: ISettingsNavProps) { + const [userRoles] = useAtom(userRolesAtom, globalScope); + const { pathname } = useLocation(); + const [open, setOpen] = useState(pathname.includes(ROUTES.settings)); + + if (!userRoles.includes("ADMIN")) + return ( +
  • + + + + + + +
  • + ); + + return ( + <> +
  • + + + + + + +
  • + +
  • + setOpen((o) => !o)}> + + + + + + + theme.transitions.create("transform"), + }} + /> + + {userRoles.includes("ADMIN") && } + + + + +
  • + + + + +
  • + +
  • + + + + +
  • + + + + + ); +} diff --git a/src/layouts/Navigation/TopBar.tsx b/src/layouts/Navigation/TopBar.tsx index ba6d59b5..7ac9c80e 100644 --- a/src/layouts/Navigation/TopBar.tsx +++ b/src/layouts/Navigation/TopBar.tsx @@ -134,7 +134,7 @@ export default function TopBar({ ml: 1, }, !(routeTitle as any)?.leftAligned && { - ml: { xs: 1, sm: 208 / 8 + 1 }, + ml: { xs: 1, sm: 40 / 8 + 1, md: 208 / 8 + 1 }, }, isPermanent && (routeTitle as any)?.leftAligned && { @@ -167,11 +167,16 @@ export default function TopBar({ to={ROUTES.members} startIcon={} sx={{ + minWidth: 40, + "&&": { px: { xs: 1, md: 2 } }, mr: 1, "&.active": { visibility: "hidden" }, + + "& .text": { display: { xs: "none", md: "inline" } }, + "& .MuiButton-startIcon": { mr: { xs: 0, md: 1 } }, }} > - Invite team members + Invite team members From b23eb499a60d48ffe877ce4379c21bf7af8648df Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Fri, 8 Jul 2022 14:40:27 +1000 Subject: [PATCH 021/309] update community, help menu spacing --- src/layouts/Navigation/CommunityMenu.tsx | 2 +- src/layouts/Navigation/HelpMenu.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/layouts/Navigation/CommunityMenu.tsx b/src/layouts/Navigation/CommunityMenu.tsx index b1b37b10..ec68e76a 100644 --- a/src/layouts/Navigation/CommunityMenu.tsx +++ b/src/layouts/Navigation/CommunityMenu.tsx @@ -37,7 +37,7 @@ export default function HelpMenu({ id="community-menu" anchorOrigin={{ vertical: "bottom", horizontal: "right" }} transformOrigin={{ vertical: "bottom", horizontal: "left" }} - sx={{ "& .MuiPaper-root": { mt: 0.5, py: 1 } }} + sx={{ "& .MuiPaper-root": { mt: 1.5, py: 1 } }} PaperProps={{ elevation: 10 }} > Date: Mon, 11 Jul 2022 14:42:07 +1000 Subject: [PATCH 022/309] update auth styles --- src/components/FirebaseUi.tsx | 18 +++++++++++--- src/config/firebaseui.ts | 4 ++-- src/layouts/AuthLayout.tsx | 7 +++--- src/pages/Auth/AuthPage.tsx | 24 +++++++++++++++++-- src/pages/Auth/SignUpPage.tsx | 44 +++++++++++++---------------------- 5 files changed, 58 insertions(+), 39 deletions(-) diff --git a/src/components/FirebaseUi.tsx b/src/components/FirebaseUi.tsx index ceda7035..08c26f92 100644 --- a/src/components/FirebaseUi.tsx +++ b/src/components/FirebaseUi.tsx @@ -29,9 +29,20 @@ const useStyles = makeStyles()((theme) => ({ color: theme.palette.text.secondary, fontFamily: theme.typography.fontFamily, }, - "& .firebaseui-tos": { + "& .firebaseui-provider-sign-in-footer > .firebaseui-tos": { ...(theme.typography.caption as any), color: theme.palette.text.disabled, + textAlign: "left", + marginTop: theme.spacing(1), + marginBottom: 0, + "& .firebaseui-link": { + textDecorationColor: theme.palette.divider, + "&:hover": { textDecorationColor: "currentcolor" }, + }, + }, + "& .firebaseui-link": { + color: "inherit", + textDecoration: "underline", }, "& .firebaseui-country-selector": { color: theme.palette.text.primary, @@ -259,9 +270,10 @@ export default function FirebaseUi(props: IFirebaseUiProps) { Continue with diff --git a/src/config/firebaseui.ts b/src/config/firebaseui.ts index e015e190..e2a28f22 100644 --- a/src/config/firebaseui.ts +++ b/src/config/firebaseui.ts @@ -65,8 +65,8 @@ export const defaultUiConfig: firebaseui.auth.Config = { signInFlow: "popup", signInSuccessUrl: "/", signInOptions: [authOptions.google], - // tosUrl: EXTERNAL_LINKS.terms, - // privacyPolicyUrl: EXTERNAL_LINKS.privacy, + tosUrl: EXTERNAL_LINKS.terms, + privacyPolicyUrl: EXTERNAL_LINKS.privacy, }; export const getSignInOptions = ( diff --git a/src/layouts/AuthLayout.tsx b/src/layouts/AuthLayout.tsx index 22a11d6e..9406e83d 100644 --- a/src/layouts/AuthLayout.tsx +++ b/src/layouts/AuthLayout.tsx @@ -105,7 +105,6 @@ export default function AuthLayout({ display: "flex", flexDirection: "column", - // textAlign: "center", "& > :not(style) + :not(style)": { mt: 4 }, } as any @@ -125,8 +124,8 @@ export default function AuthLayout({ {children} @@ -145,7 +144,7 @@ export default function AuthLayout({ Project: {projectId} diff --git a/src/pages/Auth/AuthPage.tsx b/src/pages/Auth/AuthPage.tsx index 8e2b2ca7..2ae2ec64 100644 --- a/src/pages/Auth/AuthPage.tsx +++ b/src/pages/Auth/AuthPage.tsx @@ -1,8 +1,12 @@ -import { useSearchParams } from "react-router-dom"; +import { useSearchParams, Link } from "react-router-dom"; + +import { Typography, Link as MuiLink } from "@mui/material"; import AuthLayout from "@src/layouts/AuthLayout"; import FirebaseUi from "@src/components/FirebaseUi"; +import { ROUTES } from "@src/constants/routes"; + export default function AuthPage() { const [searchParams] = useSearchParams(); @@ -13,7 +17,23 @@ export default function AuthPage() { } return ( - + + or{" "} + + sign up + + + } + > ); diff --git a/src/pages/Auth/SignUpPage.tsx b/src/pages/Auth/SignUpPage.tsx index b31f89e1..007e07a0 100644 --- a/src/pages/Auth/SignUpPage.tsx +++ b/src/pages/Auth/SignUpPage.tsx @@ -1,10 +1,11 @@ -import { useSearchParams } from "react-router-dom"; +import { useSearchParams, Link } from "react-router-dom"; -import { Typography, Link } from "@mui/material"; +import { Typography, Link as MuiLink } from "@mui/material"; import AuthLayout from "@src/layouts/AuthLayout"; import FirebaseUi from "@src/components/FirebaseUi"; -import { EXTERNAL_LINKS } from "@src/constants/externalLinks"; + +import { ROUTES } from "@src/constants/routes"; export default function SignUpPage() { const [searchParams] = useSearchParams(); @@ -20,6 +21,18 @@ export default function SignUpPage() { title="Sign up" description={ <> + + or{" "} + + sign in + + Welcome! To join this project, sign up with the email address {searchParams.get("email") ? ( <> @@ -32,31 +45,6 @@ export default function SignUpPage() { } > - - By signing up, you agree to our{" "} - - Terms and Conditions - {" "} - and{" "} - - Privacy Policy - - . - ); } From c92a0d19bf71c6da5ea49a3cb56095d24762268b Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Wed, 13 Jul 2022 20:02:03 +1000 Subject: [PATCH 023/309] update button design --- package.json | 2 +- src/theme/colors.ts | 4 ++-- src/theme/components.tsx | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index ff663d09..d646de6f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rowy", - "version": "2.6.1", + "version": "2.7.0-alpha", "homepage": "https://rowy.io", "repository": { "type": "git", diff --git a/src/theme/colors.ts b/src/theme/colors.ts index 5514b3d7..2cf5e12d 100644 --- a/src/theme/colors.ts +++ b/src/theme/colors.ts @@ -49,7 +49,7 @@ export const colorsLight = ( disabled: textBase.alpha(0.26).toHslString(), disabledBackground: textBase.alpha(0.12).toHslString(), input: "#fff", - inputOutline: shadowBase.alpha(0.12).toRgbString(), + inputOutline: shadowBase.alpha(0.1).toRgbString(), }, divider: shadowBase.alpha(0.12).toRgbString(), // Using hsl string breaks table borders }, @@ -154,7 +154,7 @@ export const colorsDark = ( hover: "rgba(255, 255, 255, 0.08)", hoverOpacity: 0.08, input: "rgba(255, 255, 255, 0.06)", - inputOutline: "rgba(255, 255, 255, 0.08)", + inputOutline: "rgba(255, 255, 255, 0.06)", }, // success: { light: "#34c759" }, }, diff --git a/src/theme/components.tsx b/src/theme/components.tsx index 48d4b446..342a92ea 100644 --- a/src/theme/components.tsx +++ b/src/theme/components.tsx @@ -725,12 +725,12 @@ export const components = (theme: Theme): ThemeOptions => { }, contained: { - boxShadow: `0 -1px 0 0 rgba(0, 0, 0, 0.12) inset, ${theme.shadows[2]}`, + boxShadow: `0 -1px 0 0 rgba(0, 0, 0, 0.4) inset, 0 0 0 1px rgba(255, 255, 255, 0.08) inset, ${theme.shadows[2]}`, "&:hover": { - boxShadow: `0 -1px 0 0 rgba(0, 0, 0, 0.12) inset, ${theme.shadows[4]}`, + boxShadow: `0 -1px 0 0 rgba(0, 0, 0, 0.4) inset, 0 0 0 1px rgba(255, 255, 255, 0.08) inset, ${theme.shadows[4]}`, }, "&:active": { - boxShadow: `0 -1px 0 0 rgba(0, 0, 0, 0.12) inset, ${theme.shadows[8]}`, + boxShadow: `0 -1px 0 0 rgba(0, 0, 0, 0.4) inset, 0 0 0 1px rgba(255, 255, 255, 0.08) inset, ${theme.shadows[8]}`, }, }, containedPrimary: { From ff29f6b16e546ac39b9863c44e75194e0dd6ca0d Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Wed, 13 Jul 2022 20:02:35 +1000 Subject: [PATCH 024/309] ConfirmDialog: add buttonLayout prop --- src/atoms/globalScope/ui.ts | 2 ++ src/components/ConfirmDialog.tsx | 11 ++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/atoms/globalScope/ui.ts b/src/atoms/globalScope/ui.ts index bf48d3a5..ba6275fb 100644 --- a/src/atoms/globalScope/ui.ts +++ b/src/atoms/globalScope/ui.ts @@ -45,6 +45,8 @@ export type ConfirmDialogProps = { /** Optionally set dialog max width */ maxWidth?: DialogProps["maxWidth"]; + /** Optionally set button layout */ + buttonLayout?: "horizontal" | "vertical"; }; /** * Open a confirm dialog diff --git a/src/components/ConfirmDialog.tsx b/src/components/ConfirmDialog.tsx index 2025bc94..9fb9b846 100644 --- a/src/components/ConfirmDialog.tsx +++ b/src/components/ConfirmDialog.tsx @@ -36,6 +36,7 @@ export default function ConfirmDialog() { hideCancel, maxWidth = "xs", + buttonLayout = "horizontal", }, setState, ] = useAtom(confirmDialogAtom, globalScope); @@ -76,7 +77,15 @@ export default function ConfirmDialog() { )} - + :not(:first-of-type)": { ml: 0, mt: 1 }, + }, + ]} + > {!hideCancel && ( + +
    + + + ); +} diff --git a/src/components/TableTutorial/TutorialCheckbox.tsx b/src/components/TableTutorial/TutorialCheckbox.tsx new file mode 100644 index 00000000..caf25c9d --- /dev/null +++ b/src/components/TableTutorial/TutorialCheckbox.tsx @@ -0,0 +1,69 @@ +import { + FormControlLabel, + FormControlLabelProps, + Checkbox, + CheckboxProps, +} from "@mui/material"; + +export interface ITutorialCheckboxProps { + label: FormControlLabelProps["label"]; + checked: CheckboxProps["checked"]; + onChange: CheckboxProps["onChange"]; +} + +export default function TutorialCheckbox({ + checked, + onChange, + label, +}: ITutorialCheckboxProps) { + return ( + + } + /> + ); +} diff --git a/src/components/TableTutorial/data.ts b/src/components/TableTutorial/data.ts new file mode 100644 index 00000000..3de054d1 --- /dev/null +++ b/src/components/TableTutorial/data.ts @@ -0,0 +1,9 @@ +export const columns = ["Name", "Price"]; + +export const rows = [ + { Name: "Wine - Vouvray Cuvee Domaine", Price: 22.73 }, + { Name: "Hold Up Tool Storage Rack", Price: 55.52 }, + { Name: "Squid - Tubes / Tenticles 10/20", Price: 91.34 }, + { Name: "Squeeze Bottle", Price: 3.11 }, + { Name: "Flour - Semolina", Price: 97.01 }, +]; diff --git a/src/components/TableTutorial/index.ts b/src/components/TableTutorial/index.ts new file mode 100644 index 00000000..a515986c --- /dev/null +++ b/src/components/TableTutorial/index.ts @@ -0,0 +1,2 @@ +export * from "./TableTutorial"; +export { default } from "./TableTutorial"; diff --git a/src/constants/routes.tsx b/src/constants/routes.tsx index 498204a8..8e4ef19b 100644 --- a/src/constants/routes.tsx +++ b/src/constants/routes.tsx @@ -1,6 +1,6 @@ import Logo from "@src/assets/Logo"; import BreadcrumbsTableRoot from "@src/components/Table/BreadcrumbsTableRoot"; -import { FadeProps } from "@mui/material"; +import { FadeProps, Typography } from "@mui/material"; export enum ROUTES { home = "/", @@ -38,6 +38,9 @@ export enum ROUTES { members = "/members", debugSettings = "/settings/debug", + tutorial = "/tutorial", + tableTutorial = "/tutorial/table", + test = "/test", themeTest = "/test/theme", rowyRunTest = "/test/rowyRunTest", @@ -65,6 +68,18 @@ export const ROUTE_TITLES = { [ROUTES.members]: "Members", [ROUTES.debugSettings]: "Debug", + [ROUTES.tutorial]: "Tutorial", + [ROUTES.tableTutorial]: { + title: "Tutorial", + titleComponent: (_o, _i) => ( + + Tutorial + + ), + titleTransitionProps: { style: { transformOrigin: "0 50%" } }, + leftAligned: true, + }, + [ROUTES.test]: "Test", [ROUTES.themeTest]: "Theme Test", [ROUTES.rowyRunTest]: "Rowy Run Test", diff --git a/src/layouts/Navigation/GetStartedChecklist/Progress.tsx b/src/layouts/Navigation/GetStartedChecklist/Progress.tsx deleted file mode 100644 index 6c824d65..00000000 --- a/src/layouts/Navigation/GetStartedChecklist/Progress.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { Box, BoxProps, Typography } from "@mui/material"; -import { spreadSx } from "@src/utils/ui"; - -export default function Progress({ sx }: Partial) { - return ( - - 1/5 - - - - - - - - ); -} diff --git a/src/layouts/Navigation/NavDrawer.tsx b/src/layouts/Navigation/NavDrawer.tsx index d3cb5568..bb9b5e53 100644 --- a/src/layouts/Navigation/NavDrawer.tsx +++ b/src/layouts/Navigation/NavDrawer.tsx @@ -33,7 +33,7 @@ import Logo from "@src/assets/Logo"; import NavItem from "./NavItem"; import SettingsNav from "./SettingsNav"; import NavTableSection from "./NavTableSection"; -import Progress from "./GetStartedChecklist/Progress"; +import StepsProgress from "@src/components/StepsProgress"; import CommunityMenu from "./CommunityMenu"; import HelpMenu from "./HelpMenu"; @@ -324,7 +324,9 @@ export default function NavDrawer({ } + secondary={ + + } /> diff --git a/src/layouts/Navigation/Navigation.tsx b/src/layouts/Navigation/Navigation.tsx index dc15bbac..f996dc53 100644 --- a/src/layouts/Navigation/Navigation.tsx +++ b/src/layouts/Navigation/Navigation.tsx @@ -11,7 +11,7 @@ import ErrorFallback, { IErrorFallbackProps, } from "@src/components/ErrorFallback"; import Loading from "@src/components/Loading"; -import GetStartedChecklist from "./GetStartedChecklist"; +import GetStartedChecklist from "@src/components/GetStartedChecklist"; import { globalScope, diff --git a/src/pages/Table/TablePage.tsx b/src/pages/Table/TablePage.tsx index a4336803..4d682fc3 100644 --- a/src/pages/Table/TablePage.tsx +++ b/src/pages/Table/TablePage.tsx @@ -34,13 +34,18 @@ const BuildLogsSnack = lazy(() => import("@src/components/TableModals/CloudLogsM export interface ITablePageProps { /** Disable modals on this table when a sub-table is open and it’s listening to URL state */ disableModals?: boolean; + /** Disable side drawer */ + disableSideDrawer?: boolean; } /** * TablePage renders all the UI for the table. * Must be wrapped by either `ProvidedTablePage` or `ProvidedSubTablePage`. */ -export default function TablePage({ disableModals }: ITablePageProps) { +export default function TablePage({ + disableModals, + disableSideDrawer, +}: ITablePageProps) { const [tableSchema] = useAtom(tableSchemaAtom, tableScope); const snackLogContext = useSnackLogContext(); @@ -63,7 +68,7 @@ export default function TablePage({ disableModals }: ITablePageProps) { return ( -
    +
    @@ -94,7 +99,7 @@ export default function TablePage({ disableModals }: ITablePageProps) { - + {!disableSideDrawer && } diff --git a/src/pages/Table/TableTutorialPage.tsx b/src/pages/Table/TableTutorialPage.tsx new file mode 100644 index 00000000..8a0a7425 --- /dev/null +++ b/src/pages/Table/TableTutorialPage.tsx @@ -0,0 +1,138 @@ +import { Suspense } from "react"; +import { useAtom, useSetAtom, Provider } from "jotai"; +import { DebugAtoms } from "@src/atoms/utils"; +import { ErrorBoundary } from "react-error-boundary"; + +import { Box, Typography, Button } from "@mui/material"; +import { Import as ImportIcon } from "@src/assets/icons"; + +import ErrorFallback from "@src/components/ErrorFallback"; +import TablePage from "./TablePage"; +import TableToolbarSkeleton from "@src/components/TableToolbar/TableToolbarSkeleton"; +import TableSkeleton from "@src/components/Table/TableSkeleton"; +import TableTutorial from "@src/components/TableTutorial"; +import EmptyState from "@src/components/EmptyState"; +import TableModals from "@src/components/TableModals"; + +import { globalScope, currentUserAtom } from "@src/atoms/globalScope"; +import { + tableScope, + tableIdAtom, + tableSettingsAtom, + tableSchemaAtom, + tableColumnsOrderedAtom, + tableRowsAtom, + tableModalAtom, + importCsvAtom, +} from "@src/atoms/tableScope"; + +import { + TUTORIAL_COLLECTION, + TUTORIAL_TABLE_SETTINGS, + TUTORIAL_TABLE_SCHEMA, + TableSourceTutorial, +} from "@src/components/TableTutorial/TableSourceTutorial"; +import { TOP_BAR_HEIGHT } from "@src/layouts/Navigation/TopBar"; +import * as csvData from "@src/components/TableTutorial/data"; + +/** + * Wraps `TablePage` with the data for a top-level table. + */ +export default function TableTutorialPage() { + const [currentUser] = useAtom(currentUserAtom, globalScope); + + return ( + + + + + + } + > + + + + + + + + } + > + .rdg": { + paddingBottom: + "max(env(safe-area-inset-bottom), min(50vh, 440px))", + width: "100%", + + ".rdg-row, .rdg-header-row": { + marginRight: `env(safe-area-inset-right)`, + }, + }, + }} + > + + + + + + + + ); +} + +function Content() { + const [tableColumnsOrdered] = useAtom(tableColumnsOrderedAtom, tableScope); + const [tableRows] = useAtom(tableRowsAtom, tableScope); + const openTableModal = useSetAtom(tableModalAtom, tableScope); + const setImportCsv = useSetAtom(importCsvAtom, tableScope); + + if (tableColumnsOrdered.length === 0 || tableRows.length === 0) { + return ( + null) as any} + message="Get started" + description={ + <> + There is no data in this table. + + You can import our sample CSV file: + + + + + + } + /> + ); + } + + return ; +} diff --git a/src/theme/CheckboxIcon.tsx b/src/theme/CheckboxIcon.tsx index d72728ff..68d8960c 100644 --- a/src/theme/CheckboxIcon.tsx +++ b/src/theme/CheckboxIcon.tsx @@ -68,6 +68,7 @@ export default function CheckboxIcon() { }, }, }} + className="checkbox-icon" > ); } diff --git a/src/types/files.d.ts b/src/types/files.d.ts index 63f9f2d0..40ca1c54 100644 --- a/src/types/files.d.ts +++ b/src/types/files.d.ts @@ -10,3 +10,7 @@ declare module "!!raw-loader!*" { const content: string; export default content; } +declare module "*.csv" { + const content: string; + export default content; +} From 4786d059c621f83b3f1d8979976cec3814bcad2e Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Thu, 14 Jul 2022 22:26:18 +1000 Subject: [PATCH 027/309] fix page loading with white screen while system is in dark mode --- public/index.html | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/public/index.html b/public/index.html index a9153101..84198f78 100644 --- a/public/index.html +++ b/public/index.html @@ -75,6 +75,12 @@ href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,400;0,700;1,400;1,700&display=swap" /> + + Rowy From 7604768ec58d1cdf8d4e225e34013247c533252a Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Fri, 15 Jul 2022 12:19:58 +1000 Subject: [PATCH 028/309] AuthLayout: hide projectId if not available --- src/layouts/AuthLayout.tsx | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/layouts/AuthLayout.tsx b/src/layouts/AuthLayout.tsx index 9406e83d..437fc667 100644 --- a/src/layouts/AuthLayout.tsx +++ b/src/layouts/AuthLayout.tsx @@ -142,13 +142,15 @@ export default function AuthLayout({ /> )} - - Project: {projectId} - + {projectId && ( + + Project: {projectId} + + )} Date: Mon, 18 Jul 2022 13:56:54 +1000 Subject: [PATCH 029/309] update Providers --- src/Providers.tsx | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/Providers.tsx b/src/Providers.tsx index c71630fa..3f591251 100644 --- a/src/Providers.tsx +++ b/src/Providers.tsx @@ -3,7 +3,7 @@ import ErrorFallback from "@src/components/ErrorFallback"; // import SwrProvider from "@src/contexts/SwrContext"; import { BrowserRouter } from "react-router-dom"; import { HelmetProvider } from "react-helmet-async"; -import { Provider, Atom } from "jotai"; +import { Provider as JotaiProvider, Atom } from "jotai"; import { globalScope } from "@src/atoms/globalScope"; import { DebugAtoms } from "@src/atoms/utils"; import LocalizationProvider from "@mui/lab/LocalizationProvider"; @@ -29,10 +29,21 @@ export default function Providers({ initialAtomValues, }: IProvidersProps) { return ( - + here because it uses useLocation, + // which needs to be inside a + ({ error }) => ( +
    +

    Something went wrong

    +

    {error.message}

    +
    + ) + } + > - - +
    From a96b23f38d8c3ca504d09639be3e73584340d5a1 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Mon, 18 Jul 2022 13:57:31 +1000 Subject: [PATCH 030/309] Revert "bundle-analyzer" This reverts commit dd214b96e49cb3e14e3b167e94cd174d67e8bb5f. --- craco.config.js | 4 +--- package.json | 3 +-- yarn.lock | 56 +------------------------------------------------ 3 files changed, 3 insertions(+), 60 deletions(-) diff --git a/craco.config.js b/craco.config.js index 1a175a2d..8e921d31 100644 --- a/craco.config.js +++ b/craco.config.js @@ -1,8 +1,7 @@ const { whenDev } = require("@craco/craco"); const CracoAlias = require("craco-alias"); const CracoSwcPlugin = require("craco-swc"); -const BundleAnalyzerPlugin = - require("webpack-bundle-analyzer").BundleAnalyzerPlugin; + module.exports = { plugins: [ { @@ -66,7 +65,6 @@ module.exports = { }, }, webpack: { - plugins: [new BundleAnalyzerPlugin({ analyzerMode: "server" })], configure: { resolve: { // Polyfill for monaco-editor-auto-typings diff --git a/package.json b/package.json index 0297f513..ff663d09 100644 --- a/package.json +++ b/package.json @@ -176,8 +176,7 @@ "raw-loader": "^4.0.2", "source-map-explorer": "^2.5.2", "ts-jest": "^28.0.2", - "typedoc": "^0.22.17", - "webpack-bundle-analyzer": "^4.5.0" + "typedoc": "^0.22.17" }, "resolutions": { "@types/react": "^18" diff --git a/yarn.lock b/yarn.lock index b095480f..da7f9913 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3092,11 +3092,6 @@ schema-utils "^3.0.0" source-map "^0.7.3" -"@polka/url@^1.0.0-next.20": - version "1.0.0-next.21" - resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1" - integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== - "@popperjs/core@^2.11.4": version "2.11.5" resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.5.tgz#db5a11bf66bdab39569719555b0f76e138d7bd64" @@ -4393,7 +4388,7 @@ acorn-walk@^7.0.0, acorn-walk@^7.1.1: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== -acorn-walk@^8.0.0, acorn-walk@^8.1.1: +acorn-walk@^8.1.1: version "8.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== @@ -4403,11 +4398,6 @@ acorn@^7.0.0, acorn@^7.1.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.0.4: - version "8.7.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" - integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== - acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.0: version "8.7.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" @@ -9771,11 +9761,6 @@ mri@^1.1.0: resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== -mrmime@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.1.tgz#5f90c825fad4bdd41dc914eff5d1a8cfdaf24f27" - integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== - ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -10075,11 +10060,6 @@ open@^8.0.9, open@^8.4.0: is-docker "^2.1.1" is-wsl "^2.2.0" -opener@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" - integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== - optionator@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" @@ -12266,15 +12246,6 @@ signal-exit@^3.0.2, signal-exit@^3.0.3: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== -sirv@^1.0.7: - version "1.0.19" - resolved "https://registry.yarnpkg.com/sirv/-/sirv-1.0.19.tgz#1d73979b38c7fe91fcba49c85280daa9c2363b49" - integrity sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ== - dependencies: - "@polka/url" "^1.0.0-next.20" - mrmime "^1.0.0" - totalist "^1.0.0" - sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -12987,11 +12958,6 @@ toposort@^2.0.2: resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" integrity sha1-riF2gXXRVZ1IvvNUILL0li8JwzA= -totalist@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/totalist/-/totalist-1.1.0.tgz#a4d65a3e546517701e3e5c37a47a70ac97fe56df" - integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== - tough-cookie@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" @@ -13588,21 +13554,6 @@ webidl-conversions@^6.1.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== -webpack-bundle-analyzer@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz#1b0eea2947e73528754a6f9af3e91b2b6e0f79d5" - integrity sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ== - dependencies: - acorn "^8.0.4" - acorn-walk "^8.0.0" - chalk "^4.1.0" - commander "^7.2.0" - gzip-size "^6.0.0" - lodash "^4.17.20" - opener "^1.5.2" - sirv "^1.0.7" - ws "^7.3.1" - webpack-dev-middleware@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz#aa079a8dedd7e58bfeab358a9af7dab304cee57f" @@ -14028,11 +13979,6 @@ ws@>=7.4.6: resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.0.tgz#0b738cd484bfc9303421914b11bb4011e07615bb" integrity sha512-uYhVJ/m9oXwEI04iIVmgLmugh2qrZihkywG9y5FfZV2ATeLIzHf93qs+tUNqlttbQK957/VX3mtwAS+UfIwA4g== -ws@^7.3.1: - version "7.5.8" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.8.tgz#ac2729881ab9e7cbaf8787fe3469a48c5c7f636a" - integrity sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw== - ws@^7.4.6: version "7.5.7" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" From 00bc81a4d89e3e1ac4f295588d622625a2d9658a Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Mon, 18 Jul 2022 14:01:29 +1000 Subject: [PATCH 031/309] RowyThemeProvider: add Outlet --- src/theme/RowyThemeProvider.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/theme/RowyThemeProvider.tsx b/src/theme/RowyThemeProvider.tsx index 3ca5bf83..5aa69623 100644 --- a/src/theme/RowyThemeProvider.tsx +++ b/src/theme/RowyThemeProvider.tsx @@ -1,6 +1,7 @@ import { useEffect } from "react"; import { useAtom } from "jotai"; import { Helmet } from "react-helmet-async"; +import { Outlet } from "react-router-dom"; import { useMediaQuery, ThemeProvider, CssBaseline } from "@mui/material"; import Favicon from "@src/assets/Favicon"; @@ -55,6 +56,7 @@ export default function RowyThemeProvider({ {children} + ); From 264a838a21fa2efe9cb1c7b0e4def60cefa8969e Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Mon, 18 Jul 2022 14:22:56 +1000 Subject: [PATCH 032/309] favicon.svg: add viewBox --- src/assets/favicon.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/assets/favicon.svg b/src/assets/favicon.svg index 91ab2bc1..81a0586d 100644 --- a/src/assets/favicon.svg +++ b/src/assets/favicon.svg @@ -1,4 +1,4 @@ - + From 802499708a4ec94a42f427b745e68e6f0b51feab Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Mon, 18 Jul 2022 14:40:46 +1000 Subject: [PATCH 033/309] =?UTF-8?q?globalScope=20=E2=86=92=20projectScope?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.tsx | 8 +++---- src/Providers.tsx | 8 +++---- .../{globalScope => projectScope}/auth.ts | 0 .../{globalScope => projectScope}/index.ts | 2 +- .../{globalScope => projectScope}/project.ts | 2 +- .../{globalScope => projectScope}/rowyRun.ts | 2 +- src/atoms/{globalScope => projectScope}/ui.ts | 6 ++--- .../{globalScope => projectScope}/user.ts | 0 src/atoms/tableScope/rowActions.test.ts | 2 +- src/atoms/tableScope/rowActions.ts | 2 +- src/atoms/tableScope/ui.ts | 8 +++---- src/components/AccessDenied.tsx | 8 +++---- .../CodeEditor/CodeEditorHelper.tsx | 4 ++-- .../CodeEditor/useMonacoCustomizations.ts | 4 ++-- src/components/ColumnMenu/ColumnMenu.tsx | 16 +++++++------- .../ColumnConfigModal/ColumnConfig.tsx | 8 +++---- .../ColumnConfigModal/DefaultValueInput.tsx | 8 +++---- .../ColumnModals/NewColumnModal.tsx | 4 ++-- src/components/ConfirmDialog.tsx | 4 ++-- src/components/FirebaseUi.tsx | 6 ++--- .../GetStartedChecklist.tsx | 8 +++---- src/components/RowyRunModal.tsx | 10 ++++----- .../Settings/ProjectSettings/About.tsx | 4 ++-- .../Settings/UserManagement/InviteUser.tsx | 12 +++++----- .../Settings/UserManagement/UserItem.tsx | 16 +++++++------- .../Settings/UserSettings/Theme.tsx | 8 +++---- src/components/Setup/SignInWithGoogle.tsx | 4 ++-- src/components/Setup/Steps/StepFinish.tsx | 4 ++-- src/components/Setup/Steps/StepRules.tsx | 4 ++-- .../Setup/Steps/StepStorageRules.tsx | 4 ++-- src/components/Setup/Steps/StepWelcome.tsx | 4 ++-- src/components/SideDrawer/FieldWrapper.tsx | 8 +++---- src/components/SideDrawer/SideDrawer.tsx | 4 ++-- .../SideDrawer/SideDrawerFields.tsx | 8 +++---- src/components/Table/BreadcrumbsSubTable.tsx | 4 ++-- src/components/Table/BreadcrumbsTableRoot.tsx | 10 ++++----- .../Table/ColumnHeader/ColumnHeader.tsx | 8 +++---- src/components/Table/ColumnSelect.tsx | 4 ++-- .../Table/ContextMenu/MenuContents.tsx | 14 ++++++------ src/components/Table/FinalColumnHeader.tsx | 4 ++-- src/components/Table/OutOfOrderIndicator.tsx | 6 ++--- src/components/Table/Table.tsx | 8 +++---- src/components/Table/TableSkeleton.tsx | 4 ++-- .../Table/formatters/FinalColumn.tsx | 12 +++++----- .../CloudLogsModal/BuildLogs/useBuildLogs.ts | 4 ++-- .../CloudLogsModal/CloudLogsModal.tsx | 10 ++++----- .../TableModals/CloudLogsModal/utils.ts | 2 +- .../TableModals/ExportModal/ExportModal.tsx | 4 ++-- .../ExtensionsModal/ExtensionMigration.tsx | 4 ++-- .../ExtensionsModal/ExtensionModal.tsx | 4 ++-- .../ExtensionsModal/ExtensionsModal.tsx | 10 ++++----- .../ExtensionsModal/Step1Triggers.tsx | 6 ++--- .../TableModals/WebhooksModal/WebhookList.tsx | 4 ++-- .../WebhooksModal/WebhookModal.tsx | 8 +++---- .../WebhooksModal/WebhooksModal.tsx | 14 ++++++------ .../ActionsMenu/ActionsMenu.tsx | 6 ++--- .../ActionsMenu/ExportSettings.tsx | 6 ++--- .../ActionsMenu/ImportSettings.tsx | 10 ++++----- .../TableSettingsDialog/DeleteMenu.tsx | 10 ++++----- .../TableSettingsDialog/SuggestedRules.tsx | 4 ++-- .../TableSettingsDialog.tsx | 18 +++++++-------- src/components/TableSettingsDialog/form.tsx | 2 +- src/components/TableToolbar/AddRow.tsx | 8 +++---- .../TableToolbar/Filters/Filters.tsx | 10 ++++----- src/components/TableToolbar/HiddenFields.tsx | 8 +++---- src/components/TableToolbar/ImportCsv.tsx | 4 ++-- src/components/TableToolbar/ReExecute.tsx | 10 ++++----- src/components/TableToolbar/TableSettings.tsx | 4 ++-- src/components/TableToolbar/TableToolbar.tsx | 12 +++++----- .../TableTutorial/TableTutorial.tsx | 4 ++-- src/components/fields/Action/ActionFab.tsx | 10 ++++----- src/components/fields/Action/Settings.tsx | 12 +++++----- src/components/fields/Checkbox/TableCell.tsx | 4 ++-- .../ConnectTable/ConnectTableSelect.tsx | 4 ++-- .../fields/ConnectTable/Settings.tsx | 12 +++++----- .../fields/Connector/Select/PopupContents.tsx | 4 ++-- .../fields/Derivative/ContextMenuActions.tsx | 4 ++-- src/components/fields/Derivative/Settings.tsx | 10 ++++----- .../fields/File/SideDrawerField.tsx | 4 ++-- src/components/fields/File/TableCell.tsx | 4 ++-- .../fields/Image/SideDrawerField.tsx | 4 ++-- src/components/fields/Image/TableCell.tsx | 4 ++-- .../fields/Json/SideDrawerField.tsx | 4 ++-- src/components/fields/Reference/BasicCell.tsx | 4 ++-- .../fields/Reference/EditorCell.tsx | 4 ++-- .../fields/Reference/SideDrawerField.tsx | 6 ++--- src/hooks/useFirebaseStorageUploader.tsx | 4 ++-- src/hooks/useFirestoreCollectionWithAtom.ts | 6 ++--- src/hooks/useFirestoreDocWithAtom.ts | 6 ++--- src/hooks/useUpdateCheck.ts | 8 +++---- src/layouts/AuthLayout.tsx | 4 ++-- src/layouts/Navigation/NavDrawer.tsx | 12 +++++----- src/layouts/Navigation/Navigation.tsx | 8 +++---- src/layouts/Navigation/SettingsNav.tsx | 4 ++-- src/layouts/Navigation/TopBar.tsx | 4 ++-- src/layouts/Navigation/UpdateCheckBadge.tsx | 4 ++-- src/layouts/Navigation/UserMenu.tsx | 12 +++++----- src/layouts/RequireAuth.tsx | 4 ++-- src/pages/Auth/ImpersonatorAuthPage.tsx | 6 ++--- src/pages/Auth/JwtAuthPage.tsx | 4 ++-- src/pages/Auth/SignOutPage.tsx | 4 ++-- src/pages/FunctionPage.tsx | 4 ++-- src/pages/FunctionsPage.tsx | 16 +++++++------- src/pages/NotFoundPage.tsx | 4 ++-- src/pages/Settings/DebugSettingsPage.tsx | 12 +++++----- src/pages/Settings/MembersPage.tsx | 4 ++-- src/pages/Settings/ProjectSettingsPage.tsx | 12 +++++----- src/pages/Settings/UserSettingsPage.tsx | 10 ++++----- src/pages/Table/ProvidedSubTablePage.tsx | 4 ++-- src/pages/Table/ProvidedTablePage.tsx | 8 +++---- src/pages/Table/TableTutorialPage.tsx | 4 ++-- src/pages/TablesPage.tsx | 16 +++++++------- src/pages/Test/JotaiTestPage.tsx | 22 +++++++++---------- src/pages/Test/TableTestPage.tsx | 6 ++--- src/sources/FunctionsSourceFirestore.tsx | 6 ++--- src/sources/MembersSourceFirebase.tsx | 6 ++--- .../ProjectSourceFirebase.tsx | 8 +++---- .../ProjectSourceFirebase/useAuthUser.ts | 12 +++++----- .../ProjectSourceFirebase/useSettingsDocs.ts | 12 +++++----- .../useTableFunctions.ts | 16 +++++++------- .../TableSourceFirestore.tsx | 2 +- .../TableSourceFirestore/useAuditChange.ts | 10 ++++----- .../TableSourceFirestore/useBulkWriteDb.ts | 4 ++-- src/test/testUtils.tsx | 4 ++-- src/theme/RowyThemeProvider.tsx | 10 ++++----- 125 files changed, 428 insertions(+), 428 deletions(-) rename src/atoms/{globalScope => projectScope}/auth.ts (100%) rename src/atoms/{globalScope => projectScope}/index.ts (77%) rename src/atoms/{globalScope => projectScope}/project.ts (99%) rename src/atoms/{globalScope => projectScope}/rowyRun.ts (98%) rename src/atoms/{globalScope => projectScope}/ui.ts (96%) rename src/atoms/{globalScope => projectScope}/user.ts (100%) diff --git a/src/App.tsx b/src/App.tsx index a4aeaf12..4ce92835 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -10,10 +10,10 @@ import NotFound from "@src/pages/NotFoundPage"; import RequireAuth from "@src/layouts/RequireAuth"; import { - globalScope, + projectScope, currentUserAtom, altPressAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { ROUTES } from "@src/constants/routes"; import useKeyPressWithAtom from "@src/hooks/useKeyPressWithAtom"; @@ -63,8 +63,8 @@ const ThemeTestPage = lazy(() => import("@src/pages/Test/ThemeTestPage" /* webpa // const RowyRunTestPage = lazy(() => import("@src/pages/RowyRunTestPage" /* webpackChunkName: "RowyRunTestPage" */)); export default function App() { - const [currentUser] = useAtom(currentUserAtom, globalScope); - useKeyPressWithAtom("Alt", altPressAtom, globalScope); + const [currentUser] = useAtom(currentUserAtom, projectScope); + useKeyPressWithAtom("Alt", altPressAtom, projectScope); return ( }> diff --git a/src/Providers.tsx b/src/Providers.tsx index 3f591251..4bb24f48 100644 --- a/src/Providers.tsx +++ b/src/Providers.tsx @@ -4,7 +4,7 @@ import ErrorFallback from "@src/components/ErrorFallback"; import { BrowserRouter } from "react-router-dom"; import { HelmetProvider } from "react-helmet-async"; import { Provider as JotaiProvider, Atom } from "jotai"; -import { globalScope } from "@src/atoms/globalScope"; +import { projectScope } from "@src/atoms/projectScope"; import { DebugAtoms } from "@src/atoms/utils"; import LocalizationProvider from "@mui/lab/LocalizationProvider"; import AdapterDateFns from "@mui/lab/AdapterDateFns"; @@ -44,11 +44,11 @@ export default function Providers({ - + diff --git a/src/atoms/globalScope/auth.ts b/src/atoms/projectScope/auth.ts similarity index 100% rename from src/atoms/globalScope/auth.ts rename to src/atoms/projectScope/auth.ts diff --git a/src/atoms/globalScope/index.ts b/src/atoms/projectScope/index.ts similarity index 77% rename from src/atoms/globalScope/index.ts rename to src/atoms/projectScope/index.ts index aed968a4..0385906c 100644 --- a/src/atoms/globalScope/index.ts +++ b/src/atoms/projectScope/index.ts @@ -1,5 +1,5 @@ /** Scope for atoms stored at the root of the app */ -export const globalScope = Symbol("globalScope"); +export const projectScope = Symbol("projectScope"); export * from "./auth"; export * from "./project"; diff --git a/src/atoms/globalScope/project.ts b/src/atoms/projectScope/project.ts similarity index 99% rename from src/atoms/globalScope/project.ts rename to src/atoms/projectScope/project.ts index 82b9c0d2..4295a897 100644 --- a/src/atoms/globalScope/project.ts +++ b/src/atoms/projectScope/project.ts @@ -60,7 +60,7 @@ export const projectSettingsAtom = atom({}); * * @example Basic usage: * ``` - * const [updateProjectSettings] = useAtom(updateProjectSettingsAtom, globalScope); + * const [updateProjectSettings] = useAtom(updateProjectSettingsAtom, projectScope); * if (updateProjectSettings) updateProjectSettings({ ... }); * ``` */ diff --git a/src/atoms/globalScope/rowyRun.ts b/src/atoms/projectScope/rowyRun.ts similarity index 98% rename from src/atoms/globalScope/rowyRun.ts rename to src/atoms/projectScope/rowyRun.ts index 7ca9cf94..1699be63 100644 --- a/src/atoms/globalScope/rowyRun.ts +++ b/src/atoms/projectScope/rowyRun.ts @@ -51,7 +51,7 @@ export interface IRowyRunRequestProps { * * @example Basic usage: * ``` - * const [rowyRun] = useAtom(rowyRunAtom, globalScope); + * const [rowyRun] = useAtom(rowyRunAtom, projectScope); * ... * await rowyRun(...); * ``` diff --git a/src/atoms/globalScope/ui.ts b/src/atoms/projectScope/ui.ts similarity index 96% rename from src/atoms/globalScope/ui.ts rename to src/atoms/projectScope/ui.ts index ba6275fb..9d7c8281 100644 --- a/src/atoms/globalScope/ui.ts +++ b/src/atoms/projectScope/ui.ts @@ -53,7 +53,7 @@ export type ConfirmDialogProps = { * * @example Basic usage: * ``` - * const confirm = useSetAtom(confirmDialogAtom, globalScope); + * const confirm = useSetAtom(confirmDialogAtom, projectScope); * confirm({ handleConfirm: () => ... }); * ``` */ @@ -79,7 +79,7 @@ export type RowyRunModalState = { * * @example Basic usage: * ``` - * const openRowyRunModal = useSetAtom(rowyRunModalAtom, globalScope); + * const openRowyRunModal = useSetAtom(rowyRunModalAtom, projectScope); * openRowyRunModal({ feature: ... , version: ... }); * ``` * @@ -111,7 +111,7 @@ export type TableSettingsDialogState = { * * @example Basic usage: * ``` - * const openTableSettingsDialog = useSetAtom(tableSettingsDialogAtom, globalScope); + * const openTableSettingsDialog = useSetAtom(tableSettingsDialogAtom, projectScope); * openTableSettingsDialog({ data: ... }); * ``` * diff --git a/src/atoms/globalScope/user.ts b/src/atoms/projectScope/user.ts similarity index 100% rename from src/atoms/globalScope/user.ts rename to src/atoms/projectScope/user.ts diff --git a/src/atoms/tableScope/rowActions.test.ts b/src/atoms/tableScope/rowActions.test.ts index 9d6d1eeb..fe35d654 100644 --- a/src/atoms/tableScope/rowActions.test.ts +++ b/src/atoms/tableScope/rowActions.test.ts @@ -4,7 +4,7 @@ import { useAtomValue, useSetAtom } from "jotai"; import { useAtomCallback } from "jotai/utils"; import { find, findIndex, sortBy } from "lodash-es"; -import { currentUserAtom } from "@src/atoms/globalScope"; +import { currentUserAtom } from "@src/atoms/projectScope"; import { tableScope, tableSettingsAtom, diff --git a/src/atoms/tableScope/rowActions.ts b/src/atoms/tableScope/rowActions.ts index 3abbf516..f5225ca4 100644 --- a/src/atoms/tableScope/rowActions.ts +++ b/src/atoms/tableScope/rowActions.ts @@ -8,7 +8,7 @@ import { unset, } from "lodash-es"; -import { currentUserAtom } from "@src/atoms/globalScope"; +import { currentUserAtom } from "@src/atoms/projectScope"; import { auditChangeAtom, tableSettingsAtom, diff --git a/src/atoms/tableScope/ui.ts b/src/atoms/tableScope/ui.ts index 0b03051f..287aa5b0 100644 --- a/src/atoms/tableScope/ui.ts +++ b/src/atoms/tableScope/ui.ts @@ -10,7 +10,7 @@ import { SEVERITY_LEVELS } from "@src/components/TableModals/CloudLogsModal/Clou * * @example Basic usage: * ``` - * const openColumnMenu = useSetAtom(columnMenuAtom, globalScope); + * const openColumnMenu = useSetAtom(columnMenuAtom, projectScope); * openColumnMenu({ column, anchorEl: ... }); * ``` * @@ -30,7 +30,7 @@ export const columnMenuAtom = atom<{ * * @example Basic usage: * ``` - * const openColumnModal = useSetAtom(columnModalAtom, globalScope); + * const openColumnModal = useSetAtom(columnModalAtom, projectScope); * openColumnModal({ type: "...", column }); * ``` * @@ -56,7 +56,7 @@ export type TableFiltersPopoverState = { * * @example Basic usage: * ``` - * const openTableFiltersPopover = useSetAtom(tableFiltersPopoverAtom, globalScope); + * const openTableFiltersPopover = useSetAtom(tableFiltersPopoverAtom, projectScope); * openTableFiltersPopover({ query: ... }); * ``` * @@ -84,7 +84,7 @@ export const sideDrawerShowHiddenFieldsAtom = atomWithStorage( * * @example Basic usage: * ``` - * const openTableModal = useSetAtom(tableModalAtom, globalScope); + * const openTableModal = useSetAtom(tableModalAtom, projectScope); * openTableModal("..."); * ``` * diff --git a/src/components/AccessDenied.tsx b/src/components/AccessDenied.tsx index 5577e0e5..fbc0b81f 100644 --- a/src/components/AccessDenied.tsx +++ b/src/components/AccessDenied.tsx @@ -16,16 +16,16 @@ import SecurityIcon from "@mui/icons-material/SecurityOutlined"; import EmptyState from "@src/components/EmptyState"; import { - globalScope, + projectScope, currentUserAtom, userRolesAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { WIKI_LINKS } from "@src/constants/externalLinks"; import { ROUTES } from "@src/constants/routes"; export default function AccessDenied({ resetErrorBoundary }: FallbackProps) { - const [currentUser] = useAtom(currentUserAtom, globalScope); - const [userRoles] = useAtom(userRolesAtom, globalScope); + const [currentUser] = useAtom(currentUserAtom, projectScope); + const [userRoles] = useAtom(userRolesAtom, projectScope); if (!currentUser) window.location.reload(); diff --git a/src/components/CodeEditor/CodeEditorHelper.tsx b/src/components/CodeEditor/CodeEditorHelper.tsx index 5360f336..0b816c36 100644 --- a/src/components/CodeEditor/CodeEditorHelper.tsx +++ b/src/components/CodeEditor/CodeEditorHelper.tsx @@ -5,7 +5,7 @@ import SecretsIcon from "@mui/icons-material/VpnKeyOutlined"; import FunctionsIcon from "@mui/icons-material/CloudOutlined"; import DocsIcon from "@mui/icons-material/DescriptionOutlined"; -import { globalScope, projectIdAtom } from "@src/atoms/globalScope"; +import { projectScope, projectIdAtom } from "@src/atoms/projectScope"; export interface ICodeEditorHelperProps { docLink: string; @@ -19,7 +19,7 @@ export default function CodeEditorHelper({ docLink, additionalVariables, }: ICodeEditorHelperProps) { - const [projectId] = useAtom(projectIdAtom, globalScope); + const [projectId] = useAtom(projectIdAtom, projectScope); const availableVariables = [ { diff --git a/src/components/CodeEditor/useMonacoCustomizations.ts b/src/components/CodeEditor/useMonacoCustomizations.ts index 3b023fcc..73b2bd53 100644 --- a/src/components/CodeEditor/useMonacoCustomizations.ts +++ b/src/components/CodeEditor/useMonacoCustomizations.ts @@ -30,7 +30,7 @@ import utilsDefs from "!!raw-loader!./utils.d.ts"; import rowyUtilsDefs from "!!raw-loader!./rowy.d.ts"; import extensionsDefs from "!!raw-loader!./extensions.d.ts"; import { runRoutes } from "@src/constants/runRoutes"; -import { rowyRunAtom, globalScope } from "@src/atoms/globalScope"; +import { rowyRunAtom, projectScope } from "@src/atoms/projectScope"; import { getFieldProp } from "@src/components/fields"; export interface IUseMonacoCustomizationsProps { @@ -63,7 +63,7 @@ export default function useMonacoCustomizations({ const theme = useTheme(); const monaco = useMonaco(); const [tableRows] = useAtom(tableRowsAtom, tableScope); - const [rowyRun] = useAtom(rowyRunAtom, globalScope); + const [rowyRun] = useAtom(rowyRunAtom, projectScope); const [tableColumnsOrdered] = useAtom(tableColumnsOrderedAtom, tableScope); useEffect(() => { return () => { diff --git a/src/components/ColumnMenu/ColumnMenu.tsx b/src/components/ColumnMenu/ColumnMenu.tsx index 1bfde791..ea394bba 100644 --- a/src/components/ColumnMenu/ColumnMenu.tsx +++ b/src/components/ColumnMenu/ColumnMenu.tsx @@ -31,14 +31,14 @@ import MenuContents, { IMenuContentsProps } from "./MenuContents"; import ColumnHeader from "@src/components/Table/Column"; import { - globalScope, + projectScope, userRolesAtom, userSettingsAtom, updateUserSettingsAtom, confirmDialogAtom, rowyRunAtom, altPressAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { tableScope, tableIdAtom, @@ -74,11 +74,11 @@ export interface IMenuModalProps { } export default function ColumnMenu() { - const [userRoles] = useAtom(userRolesAtom, globalScope); - const [userSettings] = useAtom(userSettingsAtom, globalScope); - const [updateUserSettings] = useAtom(updateUserSettingsAtom, globalScope); - const confirm = useSetAtom(confirmDialogAtom, globalScope); - const [rowyRun] = useAtom(rowyRunAtom, globalScope); + const [userRoles] = useAtom(userRolesAtom, projectScope); + const [userSettings] = useAtom(userSettingsAtom, projectScope); + const [updateUserSettings] = useAtom(updateUserSettingsAtom, projectScope); + const confirm = useSetAtom(confirmDialogAtom, projectScope); + const [rowyRun] = useAtom(rowyRunAtom, projectScope); const [tableId] = useAtom(tableIdAtom, tableScope); const [tableSettings] = useAtom(tableSettingsAtom, tableScope); const updateColumn = useSetAtom(updateColumnAtom, tableScope); @@ -92,7 +92,7 @@ export default function ColumnMenu() { ); const [tableNextPage] = useAtom(tableNextPageAtom, tableScope); - const [altPress] = useAtom(altPressAtom, globalScope); + const [altPress] = useAtom(altPressAtom, projectScope); const { enqueueSnackbar, closeSnackbar } = useSnackbar(); if (!columnMenu) return null; diff --git a/src/components/ColumnModals/ColumnConfigModal/ColumnConfig.tsx b/src/components/ColumnModals/ColumnConfigModal/ColumnConfig.tsx index f0f43a12..072c22e9 100644 --- a/src/components/ColumnModals/ColumnConfigModal/ColumnConfig.tsx +++ b/src/components/ColumnModals/ColumnConfigModal/ColumnConfig.tsx @@ -13,10 +13,10 @@ import { InlineErrorFallback } from "@src/components/ErrorFallback"; import Loading from "@src/components/Loading"; import { - globalScope, + projectScope, rowyRunAtom, confirmDialogAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { tableScope, tableSettingsAtom, @@ -35,10 +35,10 @@ export default function ColumnConfigModal({ onClose, column, }: IColumnModalProps) { - const [rowyRun] = useAtom(rowyRunAtom, globalScope); + const [rowyRun] = useAtom(rowyRunAtom, projectScope); const [tableSettings] = useAtom(tableSettingsAtom, tableScope); const updateColumn = useSetAtom(updateColumnAtom, tableScope); - const confirm = useSetAtom(confirmDialogAtom, globalScope); + const confirm = useSetAtom(confirmDialogAtom, projectScope); const { enqueueSnackbar, closeSnackbar } = useSnackbar(); const snackLogContext = useSnackLogContext(); diff --git a/src/components/ColumnModals/ColumnConfigModal/DefaultValueInput.tsx b/src/components/ColumnModals/ColumnConfigModal/DefaultValueInput.tsx index 8ca2925b..52ff712a 100644 --- a/src/components/ColumnModals/ColumnConfigModal/DefaultValueInput.tsx +++ b/src/components/ColumnModals/ColumnConfigModal/DefaultValueInput.tsx @@ -14,10 +14,10 @@ import { WIKI_LINKS } from "@src/constants/externalLinks"; /* eslint-disable import/no-webpack-loader-syntax */ import defaultValueDefs from "!!raw-loader!./defaultValue.d.ts"; import { - globalScope, + projectScope, compatibleRowyRunVersionAtom, projectSettingsAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { ColumnConfig } from "@src/types/table"; const CodeEditorComponent = lazy( @@ -40,7 +40,7 @@ interface ICodeEditorProps { function CodeEditor({ type, column, handleChange }: ICodeEditorProps) { const [compatibleRowyRunVersion] = useAtom( compatibleRowyRunVersionAtom, - globalScope + projectScope ); const functionBodyOnly = compatibleRowyRunVersion!({ maxVersion: "1.3.10" }); @@ -92,7 +92,7 @@ export default function DefaultValueInput({ handleChange, column, }: IDefaultValueInputProps) { - const [projectSettings] = useAtom(projectSettingsAtom, globalScope); + const [projectSettings] = useAtom(projectSettingsAtom, projectScope); const _type = column.type !== FieldType.derivative diff --git a/src/components/ColumnModals/NewColumnModal.tsx b/src/components/ColumnModals/NewColumnModal.tsx index c77d8850..7bbe8003 100644 --- a/src/components/ColumnModals/NewColumnModal.tsx +++ b/src/components/ColumnModals/NewColumnModal.tsx @@ -8,7 +8,7 @@ import { TextField, Typography, Button } from "@mui/material"; import Modal from "@src/components/Modal"; import FieldsDropdown from "./FieldsDropdown"; -import { globalScope, updateTableAtom } from "@src/atoms/globalScope"; +import { projectScope, updateTableAtom } from "@src/atoms/projectScope"; import { tableScope, tableSettingsAtom, @@ -29,7 +29,7 @@ const AUDIT_FIELD_TYPES = [ export default function NewColumnModal({ onClose, }: Pick) { - const [updateTable] = useAtom(updateTableAtom, globalScope); + const [updateTable] = useAtom(updateTableAtom, projectScope); const [tableSettings] = useAtom(tableSettingsAtom, tableScope); const addColumn = useSetAtom(addColumnAtom, tableScope); const [columnModal, setColumnModal] = useAtom(columnModalAtom, tableScope); diff --git a/src/components/ConfirmDialog.tsx b/src/components/ConfirmDialog.tsx index 9fb9b846..dd37b76d 100644 --- a/src/components/ConfirmDialog.tsx +++ b/src/components/ConfirmDialog.tsx @@ -12,7 +12,7 @@ import { } from "@mui/material"; import { SlideTransitionMui } from "@src/components/Modal/SlideTransition"; -import { globalScope, confirmDialogAtom } from "@src/atoms/globalScope"; +import { projectScope, confirmDialogAtom } from "@src/atoms/projectScope"; /** * Display a confirm dialog using `confirmDialogAtom` in `globalState` @@ -39,7 +39,7 @@ export default function ConfirmDialog() { buttonLayout = "horizontal", }, setState, - ] = useAtom(confirmDialogAtom, globalScope); + ] = useAtom(confirmDialogAtom, projectScope); const handleClose = () => setState({ open: false }); const [dryText, setDryText] = useState(""); diff --git a/src/components/FirebaseUi.tsx b/src/components/FirebaseUi.tsx index 08c26f92..e9e7744e 100644 --- a/src/components/FirebaseUi.tsx +++ b/src/components/FirebaseUi.tsx @@ -9,7 +9,7 @@ import { makeStyles } from "tss-react/mui"; import { Typography } from "@mui/material"; import { alpha } from "@mui/material/styles"; -import { globalScope, publicSettingsAtom } from "@src/atoms/globalScope"; +import { projectScope, publicSettingsAtom } from "@src/atoms/projectScope"; import { firebaseAuthAtom } from "@src/sources/ProjectSourceFirebase"; import { defaultUiConfig, getSignInOptions } from "@src/config/firebaseui"; @@ -217,8 +217,8 @@ export interface IFirebaseUiProps { export default function FirebaseUi(props: IFirebaseUiProps) { const { classes, cx } = useStyles(); - const [firebaseAuth] = useAtom(firebaseAuthAtom, globalScope); - const [publicSettings] = useAtom(publicSettingsAtom, globalScope); + const [firebaseAuth] = useAtom(firebaseAuthAtom, projectScope); + const [publicSettings] = useAtom(publicSettingsAtom, projectScope); const signInOptions: typeof publicSettings.signInOptions = useMemo( () => diff --git a/src/components/GetStartedChecklist/GetStartedChecklist.tsx b/src/components/GetStartedChecklist/GetStartedChecklist.tsx index 9ae90fa2..f68c60f0 100644 --- a/src/components/GetStartedChecklist/GetStartedChecklist.tsx +++ b/src/components/GetStartedChecklist/GetStartedChecklist.tsx @@ -12,10 +12,10 @@ import SteppedAccordion from "@src/components/SteppedAccordion"; import StepsProgress from "@src/components/StepsProgress"; import { - globalScope, + projectScope, getStartedChecklistAtom, tableSettingsDialogAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { NAV_DRAWER_WIDTH, NAV_DRAWER_COLLAPSED_WIDTH, @@ -31,10 +31,10 @@ export default function GetStartedChecklist({ navPermanent, ...props }: IGetStartedChecklistProps) { - const [open, setOpen] = useAtom(getStartedChecklistAtom, globalScope); + const [open, setOpen] = useAtom(getStartedChecklistAtom, projectScope); const openTableSettingsDialog = useSetAtom( tableSettingsDialogAtom, - globalScope + projectScope ); if (!open) return null; diff --git a/src/components/RowyRunModal.tsx b/src/components/RowyRunModal.tsx index f801eb9c..290fa931 100644 --- a/src/components/RowyRunModal.tsx +++ b/src/components/RowyRunModal.tsx @@ -13,11 +13,11 @@ import Logo from "@src/assets/LogoRowyRun"; import InlineOpenInNewIcon from "@src/components/InlineOpenInNewIcon"; import { - globalScope, + projectScope, userRolesAtom, projectSettingsAtom, rowyRunModalAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { ROUTES } from "@src/constants/routes"; import { WIKI_LINKS } from "@src/constants/externalLinks"; @@ -27,11 +27,11 @@ import { WIKI_LINKS } from "@src/constants/externalLinks"; * @see {@link rowyRunModalAtom | Usage example} */ export default function RowyRunModal() { - const [userRoles] = useAtom(userRolesAtom, globalScope); - const [projectSettings] = useAtom(projectSettingsAtom, globalScope); + const [userRoles] = useAtom(userRolesAtom, projectScope); + const [projectSettings] = useAtom(projectSettingsAtom, projectScope); const [rowyRunModal, setRowyRunModal] = useAtom( rowyRunModalAtom, - globalScope + projectScope ); const handleClose = () => setRowyRunModal({ ...rowyRunModal, open: false }); diff --git a/src/components/Settings/ProjectSettings/About.tsx b/src/components/Settings/ProjectSettings/About.tsx index a2bedd65..28fd206f 100644 --- a/src/components/Settings/ProjectSettings/About.tsx +++ b/src/components/Settings/ProjectSettings/About.tsx @@ -10,12 +10,12 @@ import Logo from "@src/assets/Logo"; import InlineOpenInNewIcon from "@src/components/InlineOpenInNewIcon"; import meta from "@root/package.json"; -import { globalScope, projectIdAtom } from "@src/atoms/globalScope"; +import { projectScope, projectIdAtom } from "@src/atoms/projectScope"; import useUpdateCheck from "@src/hooks/useUpdateCheck"; import { EXTERNAL_LINKS, WIKI_LINKS } from "@src/constants/externalLinks"; export default function About() { - const [projectId] = useAtom(projectIdAtom, globalScope); + const [projectId] = useAtom(projectIdAtom, projectScope); const [latestUpdate, checkForUpdates, loading] = useUpdateCheck(); diff --git a/src/components/Settings/UserManagement/InviteUser.tsx b/src/components/Settings/UserManagement/InviteUser.tsx index dc6e1414..a0062324 100644 --- a/src/components/Settings/UserManagement/InviteUser.tsx +++ b/src/components/Settings/UserManagement/InviteUser.tsx @@ -16,20 +16,20 @@ import MultiSelect from "@rowy/multiselect"; import Modal from "@src/components/Modal"; import { - globalScope, + projectScope, projectRolesAtom, projectSettingsAtom, rowyRunAtom, rowyRunModalAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { ROUTES } from "@src/constants/routes"; import { runRoutes } from "@src/constants/runRoutes"; export default function InviteUser() { - const [projectRoles] = useAtom(projectRolesAtom, globalScope); - const [projectSettings] = useAtom(projectSettingsAtom, globalScope); - const [rowyRun] = useAtom(rowyRunAtom, globalScope); - const openRowyRunModal = useSetAtom(rowyRunModalAtom, globalScope); + const [projectRoles] = useAtom(projectRolesAtom, projectScope); + const [projectSettings] = useAtom(projectSettingsAtom, projectScope); + const [rowyRun] = useAtom(rowyRunAtom, projectScope); + const openRowyRunModal = useSetAtom(rowyRunModalAtom, projectScope); const { enqueueSnackbar } = useSnackbar(); const [open, setOpen] = useState(false); diff --git a/src/components/Settings/UserManagement/UserItem.tsx b/src/components/Settings/UserManagement/UserItem.tsx index 2c87108b..5415088c 100644 --- a/src/components/Settings/UserManagement/UserItem.tsx +++ b/src/components/Settings/UserManagement/UserItem.tsx @@ -17,7 +17,7 @@ import DeleteIcon from "@mui/icons-material/DeleteOutlined"; import MultiSelect from "@rowy/multiselect"; import { - globalScope, + projectScope, projectRolesAtom, projectSettingsAtom, rowyRunAtom, @@ -25,7 +25,7 @@ import { UserSettings, updateUserAtom, confirmDialogAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { runRoutes } from "@src/constants/runRoutes"; import { USERS } from "@src/config/dbPaths"; @@ -35,13 +35,13 @@ export default function UserItem({ roles: rolesProp, }: UserSettings) { const { enqueueSnackbar, closeSnackbar } = useSnackbar(); - const confirm = useSetAtom(confirmDialogAtom, globalScope); - const openRowyRunModal = useSetAtom(rowyRunModalAtom, globalScope); + const confirm = useSetAtom(confirmDialogAtom, projectScope); + const openRowyRunModal = useSetAtom(rowyRunModalAtom, projectScope); - const [projectRoles] = useAtom(projectRolesAtom, globalScope); - const [projectSettings] = useAtom(projectSettingsAtom, globalScope); - const [rowyRun] = useAtom(rowyRunAtom, globalScope); - const [updateUser] = useAtom(updateUserAtom, globalScope); + const [projectRoles] = useAtom(projectRolesAtom, projectScope); + const [projectSettings] = useAtom(projectSettingsAtom, projectScope); + const [rowyRun] = useAtom(rowyRunAtom, projectScope); + const [updateUser] = useAtom(updateUserAtom, projectScope); const [value, setValue] = useState(Array.isArray(rolesProp) ? rolesProp : []); const allRoles = new Set(["ADMIN", ...(projectRoles ?? []), ...value]); diff --git a/src/components/Settings/UserSettings/Theme.tsx b/src/components/Settings/UserSettings/Theme.tsx index 6cb8ce9a..6f6f1c83 100644 --- a/src/components/Settings/UserSettings/Theme.tsx +++ b/src/components/Settings/UserSettings/Theme.tsx @@ -12,19 +12,19 @@ import { } from "@mui/material"; import { - globalScope, + projectScope, themeAtom, themeOverriddenAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; export default function Theme({ settings, updateSettings, }: IUserSettingsChildProps) { - const [theme, setTheme] = useAtom(themeAtom, globalScope); + const [theme, setTheme] = useAtom(themeAtom, projectScope); const [themeOverridden, setThemeOverridden] = useAtom( themeOverriddenAtom, - globalScope + projectScope ); return ( diff --git a/src/components/Setup/SignInWithGoogle.tsx b/src/components/Setup/SignInWithGoogle.tsx index e9dfe87f..cb851af3 100644 --- a/src/components/Setup/SignInWithGoogle.tsx +++ b/src/components/Setup/SignInWithGoogle.tsx @@ -5,7 +5,7 @@ import { signInWithPopup, GoogleAuthProvider, signOut } from "firebase/auth"; import { Typography } from "@mui/material"; import LoadingButton, { LoadingButtonProps } from "@mui/lab/LoadingButton"; -import { globalScope } from "@src/atoms/globalScope"; +import { projectScope } from "@src/atoms/projectScope"; import { firebaseAuthAtom } from "@src/sources/ProjectSourceFirebase"; const googleProvider = new GoogleAuthProvider(); @@ -19,7 +19,7 @@ export default function SignInWithGoogle({ matchEmail, ...props }: ISignInWithGoogleProps) { - const [firebaseAuth] = useAtom(firebaseAuthAtom, globalScope); + const [firebaseAuth] = useAtom(firebaseAuthAtom, projectScope); const [status, setStatus] = useState<"IDLE" | "LOADING" | string>("IDLE"); const handleSignIn = async () => { diff --git a/src/components/Setup/Steps/StepFinish.tsx b/src/components/Setup/Steps/StepFinish.tsx index b5ee5c10..a540da7c 100644 --- a/src/components/Setup/Steps/StepFinish.tsx +++ b/src/components/Setup/Steps/StepFinish.tsx @@ -19,7 +19,7 @@ import ThumbDownIcon from "@mui/icons-material/ThumbDownAlt"; import ThumbDownOffIcon from "@mui/icons-material/ThumbDownOffAlt"; import { analytics, logEvent } from "@src/analytics"; -import { globalScope } from "@src/atoms/globalScope"; +import { projectScope } from "@src/atoms/projectScope"; import { firebaseDbAtom } from "@src/sources/ProjectSourceFirebase"; import { ROUTES } from "@src/constants/routes"; import { SETTINGS } from "config/dbPaths"; @@ -35,7 +35,7 @@ export default { } as ISetupStep; function StepFinish() { - const [firebaseDb] = useAtom(firebaseDbAtom, globalScope); + const [firebaseDb] = useAtom(firebaseDbAtom, projectScope); const { enqueueSnackbar } = useSnackbar(); useEffect(() => { diff --git a/src/components/Setup/Steps/StepRules.tsx b/src/components/Setup/Steps/StepRules.tsx index 41d91969..6215dea1 100644 --- a/src/components/Setup/Steps/StepRules.tsx +++ b/src/components/Setup/Steps/StepRules.tsx @@ -19,7 +19,7 @@ import DoneIcon from "@mui/icons-material/Done"; import SetupItem from "@src/components/Setup/SetupItem"; -import { globalScope, projectIdAtom } from "@src/atoms/globalScope"; +import { projectScope, projectIdAtom } from "@src/atoms/projectScope"; import { CONFIG } from "@src/config/dbPaths"; import { RULES_START, @@ -44,7 +44,7 @@ export default { } as ISetupStep; function StepRules({ isComplete, setComplete }: ISetupStepBodyProps) { - const [projectId] = useAtom(projectIdAtom, globalScope); + const [projectId] = useAtom(projectIdAtom, projectScope); const { enqueueSnackbar } = useSnackbar(); const [adminRule, setAdminRule] = useState(true); diff --git a/src/components/Setup/Steps/StepStorageRules.tsx b/src/components/Setup/Steps/StepStorageRules.tsx index d2aea134..65f89f17 100644 --- a/src/components/Setup/Steps/StepStorageRules.tsx +++ b/src/components/Setup/Steps/StepStorageRules.tsx @@ -12,7 +12,7 @@ import DoneIcon from "@mui/icons-material/Done"; import SetupItem from "@src/components/Setup/SetupItem"; -import { globalScope, projectIdAtom } from "@src/atoms/globalScope"; +import { projectScope, projectIdAtom } from "@src/atoms/projectScope"; import { RULES_START, RULES_END, @@ -31,7 +31,7 @@ export default { const rules = RULES_START + REQUIRED_RULES + RULES_END; function StepStorageRules({ isComplete, setComplete }: ISetupStepBodyProps) { - const [projectId] = useAtom(projectIdAtom, globalScope); + const [projectId] = useAtom(projectIdAtom, projectScope); const { enqueueSnackbar } = useSnackbar(); return ( diff --git a/src/components/Setup/Steps/StepWelcome.tsx b/src/components/Setup/Steps/StepWelcome.tsx index dfabf8e8..99e20352 100644 --- a/src/components/Setup/Steps/StepWelcome.tsx +++ b/src/components/Setup/Steps/StepWelcome.tsx @@ -13,7 +13,7 @@ import { } from "@mui/material"; import { EXTERNAL_LINKS } from "@src/constants/externalLinks"; -import { globalScope, projectIdAtom } from "@src/atoms/globalScope"; +import { projectScope, projectIdAtom } from "@src/atoms/projectScope"; export default { id: "welcome", @@ -33,7 +33,7 @@ export default { } as ISetupStep; function StepWelcome({ isComplete, setComplete }: ISetupStepBodyProps) { - const [projectId] = useAtom(projectIdAtom, globalScope); + const [projectId] = useAtom(projectIdAtom, projectScope); return ( <> diff --git a/src/components/SideDrawer/FieldWrapper.tsx b/src/components/SideDrawer/FieldWrapper.tsx index c47e8de2..620cf60d 100644 --- a/src/components/SideDrawer/FieldWrapper.tsx +++ b/src/components/SideDrawer/FieldWrapper.tsx @@ -18,10 +18,10 @@ import { InlineErrorFallback } from "@src/components/ErrorFallback"; import FieldSkeleton from "./FieldSkeleton"; import { - globalScope, + projectScope, projectIdAtom, altPressAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { FieldType } from "@src/constants/fields"; import { getFieldProp } from "@src/components/fields"; import { getLabelId, getFieldId } from "./utils"; @@ -47,8 +47,8 @@ export default function FieldWrapper({ hidden, index, }: IFieldWrapperProps) { - const [projectId] = useAtom(projectIdAtom, globalScope); - const [altPress] = useAtom(altPressAtom, globalScope); + const [projectId] = useAtom(projectIdAtom, projectScope); + const [altPress] = useAtom(altPressAtom, projectScope); return (
    diff --git a/src/components/SideDrawer/SideDrawer.tsx b/src/components/SideDrawer/SideDrawer.tsx index 3b48f046..eafdcdfa 100644 --- a/src/components/SideDrawer/SideDrawer.tsx +++ b/src/components/SideDrawer/SideDrawer.tsx @@ -16,7 +16,7 @@ import ErrorFallback from "@src/components/ErrorFallback"; import StyledDrawer from "./StyledDrawer"; import SideDrawerFields from "./SideDrawerFields"; -import { globalScope, userSettingsAtom } from "@src/atoms/globalScope"; +import { projectScope, userSettingsAtom } from "@src/atoms/projectScope"; import { tableScope, tableIdAtom, @@ -36,7 +36,7 @@ export default function SideDrawer({ }: { dataGridRef?: React.MutableRefObject; }) { - const [userSettings] = useAtom(userSettingsAtom, globalScope); + const [userSettings] = useAtom(userSettingsAtom, projectScope); const [tableId] = useAtom(tableIdAtom, tableScope); const [tableColumnsOrdered] = useAtom(tableColumnsOrderedAtom, tableScope); const [tableRows] = useAtom(tableRowsAtom, tableScope); diff --git a/src/components/SideDrawer/SideDrawerFields.tsx b/src/components/SideDrawer/SideDrawerFields.tsx index 2e7addd2..7b6a6578 100644 --- a/src/components/SideDrawer/SideDrawerFields.tsx +++ b/src/components/SideDrawer/SideDrawerFields.tsx @@ -9,10 +9,10 @@ import MemoizedField from "./MemoizedField"; import SaveState from "./SaveState"; import { - globalScope, + projectScope, userRolesAtom, userSettingsAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { tableScope, tableIdAtom, @@ -30,8 +30,8 @@ export interface ISideDrawerFieldsProps { } export default function SideDrawerFields({ row }: ISideDrawerFieldsProps) { - const [userRoles] = useAtom(userRolesAtom, globalScope); - const [userSettings] = useAtom(userSettingsAtom, globalScope); + const [userRoles] = useAtom(userRolesAtom, projectScope); + const [userSettings] = useAtom(userSettingsAtom, projectScope); const [tableId] = useAtom(tableIdAtom, tableScope); const [tableSettings] = useAtom(tableSettingsAtom, tableScope); const [tableColumnsOrdered] = useAtom(tableColumnsOrderedAtom, tableScope); diff --git a/src/components/Table/BreadcrumbsSubTable.tsx b/src/components/Table/BreadcrumbsSubTable.tsx index b7e0dbcb..78b38281 100644 --- a/src/components/Table/BreadcrumbsSubTable.tsx +++ b/src/components/Table/BreadcrumbsSubTable.tsx @@ -6,7 +6,7 @@ import { Stack, Breadcrumbs, Link, Typography, Tooltip } from "@mui/material"; import MoreHorizIcon from "@mui/icons-material/MoreHoriz"; import ReadOnlyIcon from "@mui/icons-material/EditOffOutlined"; -import { globalScope, userRolesAtom } from "@src/atoms/globalScope"; +import { projectScope, userRolesAtom } from "@src/atoms/projectScope"; import { ROUTES } from "@src/constants/routes"; import { TableSettings } from "@src/types/table"; @@ -23,7 +23,7 @@ export default function BreadcrumbsSubTable({ rootTableLink, parentLabel, }: IBreadcrumbsSubTableProps) { - const [userRoles] = useAtom(userRolesAtom, globalScope); + const [userRoles] = useAtom(userRolesAtom, projectScope); const [searchParams] = useSearchParams(); const splitSubTableId = subTableSettings.id.split("/"); diff --git a/src/components/Table/BreadcrumbsTableRoot.tsx b/src/components/Table/BreadcrumbsTableRoot.tsx index bf6dabc9..dd15526d 100644 --- a/src/components/Table/BreadcrumbsTableRoot.tsx +++ b/src/components/Table/BreadcrumbsTableRoot.tsx @@ -16,11 +16,11 @@ import InfoTooltip from "@src/components/InfoTooltip"; import RenderedMarkdown from "@src/components/RenderedMarkdown"; import { - globalScope, + projectScope, userRolesAtom, tableDescriptionDismissedAtom, tablesAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { ROUTES } from "@src/constants/routes"; /** @@ -30,12 +30,12 @@ import { ROUTES } from "@src/constants/routes"; export default function BreadcrumbsTableRoot(props: StackProps) { const { id } = useParams(); - const [userRoles] = useAtom(userRolesAtom, globalScope); + const [userRoles] = useAtom(userRolesAtom, projectScope); const [dismissed, setDismissed] = useAtom( tableDescriptionDismissedAtom, - globalScope + projectScope ); - const [tables] = useAtom(tablesAtom, globalScope); + const [tables] = useAtom(tablesAtom, projectScope); const tableSettings = find(tables, ["id", id]); if (!tableSettings) return null; diff --git a/src/components/Table/ColumnHeader/ColumnHeader.tsx b/src/components/Table/ColumnHeader/ColumnHeader.tsx index 511d0714..37e8f6ad 100644 --- a/src/components/Table/ColumnHeader/ColumnHeader.tsx +++ b/src/components/Table/ColumnHeader/ColumnHeader.tsx @@ -19,10 +19,10 @@ import LockIcon from "@mui/icons-material/LockOutlined"; import ColumnHeaderSort from "./ColumnHeaderSort"; import { - globalScope, + projectScope, userRolesAtom, altPressAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { tableScope, updateColumnAtom, @@ -54,10 +54,10 @@ export interface IDraggableHeaderRendererProps { export default function DraggableHeaderRenderer({ column, }: IDraggableHeaderRendererProps) { - const [userRoles] = useAtom(userRolesAtom, globalScope); + const [userRoles] = useAtom(userRolesAtom, projectScope); const updateColumn = useSetAtom(updateColumnAtom, tableScope); const openColumnMenu = useSetAtom(columnMenuAtom, tableScope); - const [altPress] = useAtom(altPressAtom, globalScope); + const [altPress] = useAtom(altPressAtom, projectScope); const [{ isDragging }, dragRef] = useDrag({ type: "COLUMN_DRAG", diff --git a/src/components/Table/ColumnSelect.tsx b/src/components/Table/ColumnSelect.tsx index 99a651c2..d5b3fa15 100644 --- a/src/components/Table/ColumnSelect.tsx +++ b/src/components/Table/ColumnSelect.tsx @@ -4,7 +4,7 @@ import MultiSelect, { MultiSelectProps } from "@rowy/multiselect"; import { Stack, StackProps, Typography, Chip } from "@mui/material"; import { TableColumn as TableColumnIcon } from "@src/assets/icons"; -import { globalScope, altPressAtom } from "@src/atoms/globalScope"; +import { projectScope, altPressAtom } from "@src/atoms/projectScope"; import { tableScope, tableColumnsOrderedAtom } from "@src/atoms/tableScope"; import { ColumnConfig } from "@src/types/table"; import { FieldType } from "@src/constants/fields"; @@ -91,7 +91,7 @@ export function ColumnItem({ children, ...props }: IColumnItemProps) { - const [altPress] = useAtom(altPressAtom, globalScope); + const [altPress] = useAtom(altPressAtom, projectScope); const isNew = option.index === undefined && !option.type; diff --git a/src/components/Table/ContextMenu/MenuContents.tsx b/src/components/Table/ContextMenu/MenuContents.tsx index 10c617c0..ae53a4a0 100644 --- a/src/components/Table/ContextMenu/MenuContents.tsx +++ b/src/components/Table/ContextMenu/MenuContents.tsx @@ -17,13 +17,13 @@ import FilterIcon from "@mui/icons-material/FilterList"; import ContextMenuItem, { IContextMenuItem } from "./ContextMenuItem"; import { - globalScope, + projectScope, projectIdAtom, userRolesAtom, altPressAtom, tableAddRowIdTypeAtom, confirmDialogAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { tableScope, tableSettingsAtom, @@ -42,11 +42,11 @@ interface IMenuContentsProps { } export default function MenuContents({ onClose }: IMenuContentsProps) { - const [projectId] = useAtom(projectIdAtom, globalScope); - const [userRoles] = useAtom(userRolesAtom, globalScope); - const [altPress] = useAtom(altPressAtom, globalScope); - const [addRowIdType] = useAtom(tableAddRowIdTypeAtom, globalScope); - const confirm = useSetAtom(confirmDialogAtom, globalScope); + const [projectId] = useAtom(projectIdAtom, projectScope); + const [userRoles] = useAtom(userRolesAtom, projectScope); + const [altPress] = useAtom(altPressAtom, projectScope); + const [addRowIdType] = useAtom(tableAddRowIdTypeAtom, projectScope); + const confirm = useSetAtom(confirmDialogAtom, projectScope); const [tableSettings] = useAtom(tableSettingsAtom, tableScope); const [tableSchema] = useAtom(tableSchemaAtom, tableScope); const [tableRows] = useAtom(tableRowsAtom, tableScope); diff --git a/src/components/Table/FinalColumnHeader.tsx b/src/components/Table/FinalColumnHeader.tsx index b360af0a..b425d1b1 100644 --- a/src/components/Table/FinalColumnHeader.tsx +++ b/src/components/Table/FinalColumnHeader.tsx @@ -4,11 +4,11 @@ import { Column } from "react-data-grid"; import { Button } from "@mui/material"; import { AddColumn as AddColumnIcon } from "@src/assets/icons"; -import { globalScope, userRolesAtom } from "@src/atoms/globalScope"; +import { projectScope, userRolesAtom } from "@src/atoms/projectScope"; import { tableScope, columnModalAtom } from "@src/atoms/tableScope"; const FinalColumnHeader: Column["headerRenderer"] = ({ column }) => { - const [userRoles] = useAtom(userRolesAtom, globalScope); + const [userRoles] = useAtom(userRolesAtom, projectScope); const openColumnModal = useSetAtom(columnModalAtom, tableScope); if (!userRoles.includes("ADMIN")) return null; diff --git a/src/components/Table/OutOfOrderIndicator.tsx b/src/components/Table/OutOfOrderIndicator.tsx index 3b9367b6..337b3d50 100644 --- a/src/components/Table/OutOfOrderIndicator.tsx +++ b/src/components/Table/OutOfOrderIndicator.tsx @@ -6,9 +6,9 @@ import WarningIcon from "@mui/icons-material/WarningAmber"; import { OUT_OF_ORDER_MARGIN } from "./TableContainer"; import { - globalScope, + projectScope, tableOutOfOrderDismissedAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; const Dot = styled("div")(({ theme }) => ({ position: "absolute", @@ -35,7 +35,7 @@ export default function OutOfOrderIndicator({ }: IOutOfOrderIndicatorProps) { const [dismissed, setDismissed] = useAtom( tableOutOfOrderDismissedAtom, - globalScope + projectScope ); return ( diff --git a/src/components/Table/Table.tsx b/src/components/Table/Table.tsx index 4c77f850..cf3a3dff 100644 --- a/src/components/Table/Table.tsx +++ b/src/components/Table/Table.tsx @@ -26,10 +26,10 @@ import Loading from "@src/components/Loading"; import ContextMenu from "./ContextMenu"; import { - globalScope, + projectScope, userRolesAtom, userSettingsAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { tableScope, tableIdAtom, @@ -63,8 +63,8 @@ export default function Table({ }: { dataGridRef?: React.MutableRefObject; }) { - const [userRoles] = useAtom(userRolesAtom, globalScope); - const [userSettings] = useAtom(userSettingsAtom, globalScope); + const [userRoles] = useAtom(userRolesAtom, projectScope); + const [userSettings] = useAtom(userSettingsAtom, projectScope); const [tableId] = useAtom(tableIdAtom, tableScope); const [tableSettings] = useAtom(tableSettingsAtom, tableScope); diff --git a/src/components/Table/TableSkeleton.tsx b/src/components/Table/TableSkeleton.tsx index 7f9b1905..e264fde7 100644 --- a/src/components/Table/TableSkeleton.tsx +++ b/src/components/Table/TableSkeleton.tsx @@ -6,7 +6,7 @@ import { Fade, Stack, Skeleton, Button } from "@mui/material"; import { AddColumn as AddColumnIcon } from "@src/assets/icons"; import Column from "./Column"; -import { globalScope, userSettingsAtom } from "@src/atoms/globalScope"; +import { projectScope, userSettingsAtom } from "@src/atoms/projectScope"; import { tableScope, tableIdAtom, @@ -65,7 +65,7 @@ export function HeaderRowSkeleton() { } const useDisplayedColumns = () => { - const [userSettings] = useAtom(userSettingsAtom, globalScope); + const [userSettings] = useAtom(userSettingsAtom, projectScope); const [tableId] = useAtom(tableIdAtom, tableScope); const [tableColumnsOrdered] = useAtom(tableColumnsOrderedAtom, tableScope); const userDocHiddenFields = diff --git a/src/components/Table/formatters/FinalColumn.tsx b/src/components/Table/formatters/FinalColumn.tsx index b2724889..d5d57934 100644 --- a/src/components/Table/formatters/FinalColumn.tsx +++ b/src/components/Table/formatters/FinalColumn.tsx @@ -6,12 +6,12 @@ import { CopyCells as CopyCellsIcon } from "@src/assets/icons"; import DeleteIcon from "@mui/icons-material/DeleteOutlined"; import { - globalScope, + projectScope, userRolesAtom, tableAddRowIdTypeAtom, altPressAtom, confirmDialogAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { tableScope, tableSettingsAtom, @@ -21,15 +21,15 @@ import { import { TableRow } from "@src/types/table"; export default function FinalColumn({ row }: FormatterProps) { - const [userRoles] = useAtom(userRolesAtom, globalScope); - const [addRowIdType] = useAtom(tableAddRowIdTypeAtom, globalScope); - const confirm = useSetAtom(confirmDialogAtom, globalScope); + const [userRoles] = useAtom(userRolesAtom, projectScope); + const [addRowIdType] = useAtom(tableAddRowIdTypeAtom, projectScope); + const confirm = useSetAtom(confirmDialogAtom, projectScope); const [tableSettings] = useAtom(tableSettingsAtom, tableScope); const addRow = useSetAtom(addRowAtom, tableScope); const deleteRow = useSetAtom(deleteRowAtom, tableScope); - const [altPress] = useAtom(altPressAtom, globalScope); + const [altPress] = useAtom(altPressAtom, projectScope); const handleDelete = () => deleteRow(row._rowy_ref.path); if (!userRoles.includes("ADMIN") && tableSettings.readOnly === true) diff --git a/src/components/TableModals/CloudLogsModal/BuildLogs/useBuildLogs.ts b/src/components/TableModals/CloudLogsModal/BuildLogs/useBuildLogs.ts index 63ab0561..9b3ec4ad 100644 --- a/src/components/TableModals/CloudLogsModal/BuildLogs/useBuildLogs.ts +++ b/src/components/TableModals/CloudLogsModal/BuildLogs/useBuildLogs.ts @@ -11,12 +11,12 @@ import { DocumentData, } from "firebase/firestore"; -import { globalScope } from "@src/atoms/globalScope"; +import { projectScope } from "@src/atoms/projectScope"; import { firebaseDbAtom } from "@src/sources/ProjectSourceFirebase"; import { tableScope, tableSchemaAtom } from "@src/atoms/tableScope"; export default function useBuildLogs() { - const [firebaseDb] = useAtom(firebaseDbAtom, globalScope); + const [firebaseDb] = useAtom(firebaseDbAtom, projectScope); const [tableSchema] = useAtom(tableSchemaAtom, tableScope); const functionConfigPath = tableSchema.functionConfigPath; diff --git a/src/components/TableModals/CloudLogsModal/CloudLogsModal.tsx b/src/components/TableModals/CloudLogsModal/CloudLogsModal.tsx index 4b7f690a..e69acc44 100644 --- a/src/components/TableModals/CloudLogsModal/CloudLogsModal.tsx +++ b/src/components/TableModals/CloudLogsModal/CloudLogsModal.tsx @@ -26,11 +26,11 @@ import EmptyState from "@src/components/EmptyState"; import CloudLogSeverityIcon, { SEVERITY_LEVELS } from "./CloudLogSeverityIcon"; import { - globalScope, + projectScope, projectIdAtom, rowyRunAtom, compatibleRowyRunVersionAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { tableScope, tableSettingsAtom, @@ -40,11 +40,11 @@ import { import { cloudLogFetcher } from "./utils"; export default function CloudLogsModal({ onClose }: ITableModalProps) { - const [projectId] = useAtom(projectIdAtom, globalScope); - const [rowyRun] = useAtom(rowyRunAtom, globalScope); + const [projectId] = useAtom(projectIdAtom, projectScope); + const [rowyRun] = useAtom(rowyRunAtom, projectScope); const [compatibleRowyRunVersion] = useAtom( compatibleRowyRunVersionAtom, - globalScope + projectScope ); const [tableSettings] = useAtom(tableSettingsAtom, tableScope); const [tableSchema] = useAtom(tableSchemaAtom, tableScope); diff --git a/src/components/TableModals/CloudLogsModal/utils.ts b/src/components/TableModals/CloudLogsModal/utils.ts index 895a7295..e8b33f7e 100644 --- a/src/components/TableModals/CloudLogsModal/utils.ts +++ b/src/components/TableModals/CloudLogsModal/utils.ts @@ -1,5 +1,5 @@ import { sub } from "date-fns"; -import { rowyRunAtom } from "@src/atoms/globalScope"; +import { rowyRunAtom } from "@src/atoms/projectScope"; import { CloudLogFilters } from "@src/atoms/tableScope"; export const cloudLogFetcher = ( diff --git a/src/components/TableModals/ExportModal/ExportModal.tsx b/src/components/TableModals/ExportModal/ExportModal.tsx index 49db08ad..6b12dd9f 100644 --- a/src/components/TableModals/ExportModal/ExportModal.tsx +++ b/src/components/TableModals/ExportModal/ExportModal.tsx @@ -20,7 +20,7 @@ import Modal from "@src/components/Modal"; import ExportDetails from "./ModalContentsExport"; import DownloadDetails from "./ModalContentsDownload"; -import { globalScope } from "@src/atoms/globalScope"; +import { projectScope } from "@src/atoms/projectScope"; import { tableScope, tableSettingsAtom, @@ -40,7 +40,7 @@ export interface IExportModalContentsProps { export default function Export({ onClose }: ITableModalProps) { const [mode, setMode] = useState<"Export" | "Download">("Export"); - const [firebaseDb] = useAtom(firebaseDbAtom, globalScope); + const [firebaseDb] = useAtom(firebaseDbAtom, projectScope); const [tableSettings] = useAtom(tableSettingsAtom, tableScope); const [tableFilters] = useAtom(tableFiltersAtom, tableScope); const [tableSorts] = useAtom(tableSortsAtom, tableScope); diff --git a/src/components/TableModals/ExtensionsModal/ExtensionMigration.tsx b/src/components/TableModals/ExtensionsModal/ExtensionMigration.tsx index cca4b01f..6133f34d 100644 --- a/src/components/TableModals/ExtensionsModal/ExtensionMigration.tsx +++ b/src/components/TableModals/ExtensionsModal/ExtensionMigration.tsx @@ -10,7 +10,7 @@ import GoIcon from "@mui/icons-material/ChevronRight"; import Modal from "@src/components/Modal"; -import { globalScope, currentUserAtom } from "@src/atoms/globalScope"; +import { projectScope, currentUserAtom } from "@src/atoms/projectScope"; import { tableScope, tableSettingsAtom, @@ -29,7 +29,7 @@ export default function ExtensionMigration({ handleClose, handleUpgradeComplete, }: IExtensionMigrationProps) { - const [currentUser] = useAtom(currentUserAtom, globalScope); + const [currentUser] = useAtom(currentUserAtom, projectScope); const [tableSettings] = useAtom(tableSettingsAtom, tableScope); const [tableSchema] = useAtom(tableSchemaAtom, tableScope); const [updateTableSchema] = useAtom(updateTableSchemaAtom, tableScope); diff --git a/src/components/TableModals/ExtensionsModal/ExtensionModal.tsx b/src/components/TableModals/ExtensionsModal/ExtensionModal.tsx index dc0d0df2..493df6a4 100644 --- a/src/components/TableModals/ExtensionsModal/ExtensionModal.tsx +++ b/src/components/TableModals/ExtensionsModal/ExtensionModal.tsx @@ -12,7 +12,7 @@ import Step2RequiredFields from "./Step2RequiredFields"; import Step3Conditions from "./Step3Conditions"; import Step4Body from "./Step4Body"; -import { globalScope, confirmDialogAtom } from "@src/atoms/globalScope"; +import { projectScope, confirmDialogAtom } from "@src/atoms/projectScope"; import { extensionNames, IExtension } from "./utils"; type StepValidation = Record<"condition" | "extensionBody", boolean>; @@ -39,7 +39,7 @@ export default function ExtensionModal({ mode, extensionObject: initialObject, }: IExtensionModalProps) { - const confirm = useSetAtom(confirmDialogAtom, globalScope); + const confirm = useSetAtom(confirmDialogAtom, projectScope); const [extensionObject, setExtensionObject] = useState(initialObject); diff --git a/src/components/TableModals/ExtensionsModal/ExtensionsModal.tsx b/src/components/TableModals/ExtensionsModal/ExtensionsModal.tsx index c6154bb1..57f6fbee 100644 --- a/src/components/TableModals/ExtensionsModal/ExtensionsModal.tsx +++ b/src/components/TableModals/ExtensionsModal/ExtensionsModal.tsx @@ -10,11 +10,11 @@ import ExtensionModal from "./ExtensionModal"; import ExtensionMigration from "./ExtensionMigration"; import { - globalScope, + projectScope, currentUserAtom, rowyRunAtom, confirmDialogAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { tableScope, tableSettingsAtom, @@ -32,9 +32,9 @@ import { } from "@src/utils/table"; export default function ExtensionsModal({ onClose }: ITableModalProps) { - const [currentUser] = useAtom(currentUserAtom, globalScope); - const [rowyRun] = useAtom(rowyRunAtom, globalScope); - const confirm = useSetAtom(confirmDialogAtom, globalScope); + const [currentUser] = useAtom(currentUserAtom, projectScope); + const [rowyRun] = useAtom(rowyRunAtom, projectScope); + const confirm = useSetAtom(confirmDialogAtom, projectScope); const [tableSettings] = useAtom(tableSettingsAtom, tableScope); const [tableSchema] = useAtom(tableSchemaAtom, tableScope); const [updateTableSchema] = useAtom(updateTableSchemaAtom, tableScope); diff --git a/src/components/TableModals/ExtensionsModal/Step1Triggers.tsx b/src/components/TableModals/ExtensionsModal/Step1Triggers.tsx index 5fc0a1fc..4bb293b2 100644 --- a/src/components/TableModals/ExtensionsModal/Step1Triggers.tsx +++ b/src/components/TableModals/ExtensionsModal/Step1Triggers.tsx @@ -14,9 +14,9 @@ import MultiSelect from "@rowy/multiselect"; import ColumnSelect from "@src/components/Table/ColumnSelect"; import { - globalScope, + projectScope, compatibleRowyRunVersionAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { FieldType } from "@src/constants/fields"; import { triggerTypes } from "./utils"; @@ -26,7 +26,7 @@ export default function Step1Triggers({ }: IExtensionModalStepProps) { const [compatibleRowyRunVersion] = useAtom( compatibleRowyRunVersionAtom, - globalScope + projectScope ); return ( diff --git a/src/components/TableModals/WebhooksModal/WebhookList.tsx b/src/components/TableModals/WebhooksModal/WebhookList.tsx index 95d5671d..d2f6b670 100644 --- a/src/components/TableModals/WebhooksModal/WebhookList.tsx +++ b/src/components/TableModals/WebhooksModal/WebhookList.tsx @@ -22,7 +22,7 @@ import EmptyState from "@src/components/EmptyState"; import { webhookNames, IWebhook } from "./utils"; import { DATE_TIME_FORMAT } from "@src/constants/dates"; -import { globalScope, projectSettingsAtom } from "@src/atoms/globalScope"; +import { projectScope, projectSettingsAtom } from "@src/atoms/projectScope"; import { tableScope, tableSettingsAtom, @@ -43,7 +43,7 @@ export default function WebhookList({ handleEdit, handleDelete, }: IWebhookListProps) { - const [projectSettings] = useAtom(projectSettingsAtom, globalScope); + const [projectSettings] = useAtom(projectSettingsAtom, projectScope); const [tableSettings] = useAtom(tableSettingsAtom, tableScope); const setModal = useSetAtom(tableModalAtom, tableScope); const setCloudLogFilters = useSetAtom(cloudLogFiltersAtom, tableScope); diff --git a/src/components/TableModals/WebhooksModal/WebhookModal.tsx b/src/components/TableModals/WebhooksModal/WebhookModal.tsx index e749b2be..8575c0b5 100644 --- a/src/components/TableModals/WebhooksModal/WebhookModal.tsx +++ b/src/components/TableModals/WebhooksModal/WebhookModal.tsx @@ -22,10 +22,10 @@ import Step2Conditions from "./Step2Conditions"; import Step3Body from "./Step3Parser"; import { - globalScope, + projectScope, projectSettingsAtom, confirmDialogAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { tableScope, tableSettingsAtom } from "@src/atoms/tableScope"; import { webhookNames, IWebhook } from "./utils"; @@ -54,8 +54,8 @@ export default function WebhookModal({ mode, webhookObject: initialObject, }: IWebhookModalProps) { - const [projectSettings] = useAtom(projectSettingsAtom, globalScope); - const confirm = useSetAtom(confirmDialogAtom, globalScope); + const [projectSettings] = useAtom(projectSettingsAtom, projectScope); + const confirm = useSetAtom(confirmDialogAtom, projectScope); const [tableSettings] = useAtom(tableSettingsAtom, tableScope); const [webhookObject, setWebhookObject] = useState(initialObject); diff --git a/src/components/TableModals/WebhooksModal/WebhooksModal.tsx b/src/components/TableModals/WebhooksModal/WebhooksModal.tsx index 7dc8bfe4..c7d4e30f 100644 --- a/src/components/TableModals/WebhooksModal/WebhooksModal.tsx +++ b/src/components/TableModals/WebhooksModal/WebhooksModal.tsx @@ -12,13 +12,13 @@ import WebhookList from "./WebhookList"; import WebhookModal from "./WebhookModal"; import { - globalScope, + projectScope, currentUserAtom, rowyRunAtom, compatibleRowyRunVersionAtom, rowyRunModalAtom, confirmDialogAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { tableScope, tableSettingsAtom, @@ -32,14 +32,14 @@ import { analytics, logEvent } from "@src/analytics"; import { getTableSchemaPath } from "@src/utils/table"; export default function WebhooksModal({ onClose }: ITableModalProps) { - const [currentUser] = useAtom(currentUserAtom, globalScope); - const [rowyRun] = useAtom(rowyRunAtom, globalScope); + const [currentUser] = useAtom(currentUserAtom, projectScope); + const [rowyRun] = useAtom(rowyRunAtom, projectScope); const [compatibleRowyRunVersion] = useAtom( compatibleRowyRunVersionAtom, - globalScope + projectScope ); - const openRowyRunModal = useSetAtom(rowyRunModalAtom, globalScope); - const confirm = useSetAtom(confirmDialogAtom, globalScope); + const openRowyRunModal = useSetAtom(rowyRunModalAtom, projectScope); + const confirm = useSetAtom(confirmDialogAtom, projectScope); const [tableSettings] = useAtom(tableSettingsAtom, tableScope); const [tableSchema] = useAtom(tableSchemaAtom, tableScope); const [updateTableSchema] = useAtom(updateTableSchemaAtom, tableScope); diff --git a/src/components/TableSettingsDialog/ActionsMenu/ActionsMenu.tsx b/src/components/TableSettingsDialog/ActionsMenu/ActionsMenu.tsx index c566b8a0..3dc853a4 100644 --- a/src/components/TableSettingsDialog/ActionsMenu/ActionsMenu.tsx +++ b/src/components/TableSettingsDialog/ActionsMenu/ActionsMenu.tsx @@ -10,10 +10,10 @@ import ImportSettings from "./ImportSettings"; import ExportSettings from "./ExportSettings"; import { - globalScope, + projectScope, tableSettingsDialogIdAtom, TableSettingsDialogState, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; export interface IActionsMenuProps { mode: TableSettingsDialogState["mode"]; @@ -31,7 +31,7 @@ export default function ActionsMenu({ const setTableSettingsDialogId = useSetAtom( tableSettingsDialogIdAtom, - globalScope + projectScope ); // On open, set tableSettingsDialogIdAtom so the derived diff --git a/src/components/TableSettingsDialog/ActionsMenu/ExportSettings.tsx b/src/components/TableSettingsDialog/ActionsMenu/ExportSettings.tsx index 225d3f78..5b1518d6 100644 --- a/src/components/TableSettingsDialog/ActionsMenu/ExportSettings.tsx +++ b/src/components/TableSettingsDialog/ActionsMenu/ExportSettings.tsx @@ -11,9 +11,9 @@ import Modal from "@src/components/Modal"; import CodeEditor from "@src/components/CodeEditor"; import { - globalScope, + projectScope, tableSettingsDialogSchemaAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { analytics, logEvent } from "@src/analytics"; export interface IExportSettingsProps { @@ -28,7 +28,7 @@ export default function ExportSettings({ const [open, setOpen] = useState(false); const { _suggestedRules, ...values } = useWatch({ control }); - const [tableSchema] = useAtom(tableSettingsDialogSchemaAtom, globalScope); + const [tableSchema] = useAtom(tableSettingsDialogSchemaAtom, projectScope); const formattedJson = stringify( { ...values, _schema: merge(tableSchema, values._schema) }, diff --git a/src/components/TableSettingsDialog/ActionsMenu/ImportSettings.tsx b/src/components/TableSettingsDialog/ActionsMenu/ImportSettings.tsx index eb40cf3c..7b37f0ca 100644 --- a/src/components/TableSettingsDialog/ActionsMenu/ImportSettings.tsx +++ b/src/components/TableSettingsDialog/ActionsMenu/ImportSettings.tsx @@ -12,11 +12,11 @@ import Modal from "@src/components/Modal"; import DiffEditor from "@src/components/CodeEditor/DiffEditor"; import { - globalScope, + projectScope, confirmDialogAtom, tableSettingsDialogSchemaAtom, tableSettingsDialogAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { analytics, logEvent } from "@src/analytics"; export interface IImportSettingsProps { @@ -36,7 +36,7 @@ export default function ImportSettings({ const [valid, setValid] = useState(true); const { _suggestedRules, ...values } = useWatch({ control }); - const [tableSchema] = useAtom(tableSettingsDialogSchemaAtom, globalScope); + const [tableSchema] = useAtom(tableSettingsDialogSchemaAtom, projectScope); const formattedJson = stringify( { ...values, _schema: merge(tableSchema, values._schema) }, @@ -58,10 +58,10 @@ export default function ImportSettings({ closeMenu(); }; - const confirm = useSetAtom(confirmDialogAtom, globalScope); + const confirm = useSetAtom(confirmDialogAtom, projectScope); const { enqueueSnackbar } = useSnackbar(); const { setValue } = useFormMethods; - const [tableSettingsDialog] = useAtom(tableSettingsDialogAtom, globalScope); + const [tableSettingsDialog] = useAtom(tableSettingsDialogAtom, projectScope); const handleImport = () => { logEvent(analytics, "import_tableSettings"); diff --git a/src/components/TableSettingsDialog/DeleteMenu.tsx b/src/components/TableSettingsDialog/DeleteMenu.tsx index b1d90c04..538679f8 100644 --- a/src/components/TableSettingsDialog/DeleteMenu.tsx +++ b/src/components/TableSettingsDialog/DeleteMenu.tsx @@ -7,11 +7,11 @@ import { IconButton, Menu, MenuItem, DialogContentText } from "@mui/material"; import DeleteIcon from "@mui/icons-material/DeleteOutlined"; import { - globalScope, + projectScope, confirmDialogAtom, updateTableAtom, deleteTableAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { TableSettings } from "@src/types/table"; import { ROUTES } from "@src/constants/routes"; import { analytics, logEvent } from "@src/analytics"; @@ -27,10 +27,10 @@ export default function DeleteMenu({ clearDialog, data }: IDeleteMenuProps) { const handleClose = () => setAnchorEl(null); const navigate = useNavigate(); - const confirm = useSetAtom(confirmDialogAtom, globalScope); + const confirm = useSetAtom(confirmDialogAtom, projectScope); const { enqueueSnackbar, closeSnackbar } = useSnackbar(); - const [updateTable] = useAtom(updateTableAtom, globalScope); + const [updateTable] = useAtom(updateTableAtom, projectScope); const handleResetStructure = async () => { const snack = enqueueSnackbar("Resetting columns…", { persist: true }); await updateTable!( @@ -42,7 +42,7 @@ export default function DeleteMenu({ clearDialog, data }: IDeleteMenuProps) { enqueueSnackbar("Columns reset"); }; - const [deleteTable] = useAtom(deleteTableAtom, globalScope); + const [deleteTable] = useAtom(deleteTableAtom, projectScope); const handleDelete = async () => { const snack = enqueueSnackbar("Deleting table…", { persist: true }); await deleteTable!(data!.id); diff --git a/src/components/TableSettingsDialog/SuggestedRules.tsx b/src/components/TableSettingsDialog/SuggestedRules.tsx index 205357f3..0a1ef55a 100644 --- a/src/components/TableSettingsDialog/SuggestedRules.tsx +++ b/src/components/TableSettingsDialog/SuggestedRules.tsx @@ -13,7 +13,7 @@ import { import InlineOpenInNewIcon from "@src/components/InlineOpenInNewIcon"; import { IFieldComponentProps } from "@rowy/form-builder"; -import { globalScope, projectIdAtom } from "@src/atoms/globalScope"; +import { projectScope, projectIdAtom } from "@src/atoms/projectScope"; type customizationOptions = "allRead" | "authRead" | "subcollections" | "user"; @@ -23,7 +23,7 @@ export default function SuggestedRules({ useFormMethods: { control }, label, }: ISuggestedRulesProps) { - const [projectId] = useAtom(projectIdAtom, globalScope); + const [projectId] = useAtom(projectIdAtom, projectScope); const watched = useWatch({ control, diff --git a/src/components/TableSettingsDialog/TableSettingsDialog.tsx b/src/components/TableSettingsDialog/TableSettingsDialog.tsx index 3850e30e..52e15fca 100644 --- a/src/components/TableSettingsDialog/TableSettingsDialog.tsx +++ b/src/components/TableSettingsDialog/TableSettingsDialog.tsx @@ -17,7 +17,7 @@ import ActionsMenu from "./ActionsMenu"; import DeleteMenu from "./DeleteMenu"; import { - globalScope, + projectScope, tableSettingsDialogAtom, tablesAtom, projectRolesAtom, @@ -26,7 +26,7 @@ import { createTableAtom, updateTableAtom, AdditionalTableSettings, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { TableSettings } from "@src/types/table"; import { analytics, logEvent } from "@src/analytics"; @@ -60,16 +60,16 @@ const customComponents = { export default function TableSettingsDialog() { const [{ open, mode, data }, setTableSettingsDialog] = useAtom( tableSettingsDialogAtom, - globalScope + projectScope ); const clearDialog = () => setTableSettingsDialog({ open: false }); - const [projectRoles] = useAtom(projectRolesAtom, globalScope); - const [tables] = useAtom(tablesAtom, globalScope); - const [rowyRun] = useAtom(rowyRunAtom, globalScope); + const [projectRoles] = useAtom(projectRolesAtom, projectScope); + const [tables] = useAtom(tablesAtom, projectScope); + const [rowyRun] = useAtom(rowyRunAtom, projectScope); const navigate = useNavigate(); - const confirm = useSetAtom(confirmDialogAtom, globalScope); + const confirm = useSetAtom(confirmDialogAtom, projectScope); const snackLogContext = useSnackLogContext(); const { enqueueSnackbar, closeSnackbar } = useSnackbar(); @@ -91,8 +91,8 @@ export default function TableSettingsDialog() { } ); - const [createTable] = useAtom(createTableAtom, globalScope); - const [updateTable] = useAtom(updateTableAtom, globalScope); + const [createTable] = useAtom(createTableAtom, projectScope); + const [updateTable] = useAtom(updateTableAtom, projectScope); if (!open) return null; diff --git a/src/components/TableSettingsDialog/form.tsx b/src/components/TableSettingsDialog/form.tsx index 7a8ac27c..11942034 100644 --- a/src/components/TableSettingsDialog/form.tsx +++ b/src/components/TableSettingsDialog/form.tsx @@ -1,6 +1,6 @@ import { find } from "lodash-es"; import { Field, FieldType } from "@rowy/form-builder"; -import { TableSettingsDialogState } from "@src/atoms/globalScope"; +import { TableSettingsDialogState } from "@src/atoms/projectScope"; import { Link, ListItemText, Typography } from "@mui/material"; import OpenInNewIcon from "@src/components/InlineOpenInNewIcon"; diff --git a/src/components/TableToolbar/AddRow.tsx b/src/components/TableToolbar/AddRow.tsx index 4c2aae58..c6372865 100644 --- a/src/components/TableToolbar/AddRow.tsx +++ b/src/components/TableToolbar/AddRow.tsx @@ -17,10 +17,10 @@ import { } from "@src/assets/icons"; import { - globalScope, + projectScope, userRolesAtom, tableAddRowIdTypeAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { tableScope, tableSettingsAtom, @@ -30,12 +30,12 @@ import { } from "@src/atoms/tableScope"; export default function AddRow() { - const [userRoles] = useAtom(userRolesAtom, globalScope); + const [userRoles] = useAtom(userRolesAtom, projectScope); const [tableSettings] = useAtom(tableSettingsAtom, tableScope); const [tableFilters] = useAtom(tableFiltersAtom, tableScope); const [tableSorts] = useAtom(tableSortsAtom, tableScope); const addRow = useSetAtom(addRowAtom, tableScope); - const [idType, setIdType] = useAtom(tableAddRowIdTypeAtom, globalScope); + const [idType, setIdType] = useAtom(tableAddRowIdTypeAtom, projectScope); const anchorEl = useRef(null); const [open, setOpen] = useState(false); diff --git a/src/components/TableToolbar/Filters/Filters.tsx b/src/components/TableToolbar/Filters/Filters.tsx index aa9d509c..b1c6b77e 100644 --- a/src/components/TableToolbar/Filters/Filters.tsx +++ b/src/components/TableToolbar/Filters/Filters.tsx @@ -21,11 +21,11 @@ import FiltersPopover from "./FiltersPopover"; import FilterInputs from "./FilterInputs"; import { - globalScope, + projectScope, userSettingsAtom, updateUserSettingsAtom, userRolesAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { tableScope, tableIdAtom, @@ -52,9 +52,9 @@ enum FilterType { } export default function Filters() { - const [userSettings] = useAtom(userSettingsAtom, globalScope); - const [updateUserSettings] = useAtom(updateUserSettingsAtom, globalScope); - const [userRoles] = useAtom(userRolesAtom, globalScope); + const [userSettings] = useAtom(userSettingsAtom, projectScope); + const [updateUserSettings] = useAtom(updateUserSettingsAtom, projectScope); + const [userRoles] = useAtom(userRolesAtom, projectScope); const [tableId] = useAtom(tableIdAtom, tableScope); const [tableSchema] = useAtom(tableSchemaAtom, tableScope); const [tableColumnsOrdered] = useAtom(tableColumnsOrderedAtom, tableScope); diff --git a/src/components/TableToolbar/HiddenFields.tsx b/src/components/TableToolbar/HiddenFields.tsx index 22b5b497..8015f6f5 100644 --- a/src/components/TableToolbar/HiddenFields.tsx +++ b/src/components/TableToolbar/HiddenFields.tsx @@ -12,17 +12,17 @@ import ColumnSelect, { ColumnItem } from "@src/components/Table/ColumnSelect"; import ButtonWithStatus from "@src/components/ButtonWithStatus"; import { - globalScope, + projectScope, userSettingsAtom, updateUserSettingsAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { tableScope, tableIdAtom } from "@src/atoms/tableScope"; import { formatSubTableName } from "@src/utils/table"; export default function HiddenFields() { const buttonRef = useRef(null); - const [userSettings] = useAtom(userSettingsAtom, globalScope); + const [userSettings] = useAtom(userSettingsAtom, projectScope); const [tableId] = useAtom(tableIdAtom, tableScope); const [open, setOpen] = useState(false); @@ -47,7 +47,7 @@ export default function HiddenFields() { // })); // Save when MultiSelect closes - const [updateUserSettings] = useAtom(updateUserSettingsAtom, globalScope); + const [updateUserSettings] = useAtom(updateUserSettingsAtom, projectScope); const handleSave = () => { // Only update if there were any changes because it’s slow to update if (!isEqual(hiddenFields, userDocHiddenFields) && updateUserSettings) { diff --git a/src/components/TableToolbar/ImportCsv.tsx b/src/components/TableToolbar/ImportCsv.tsx index 316e239b..dbd93c8e 100644 --- a/src/components/TableToolbar/ImportCsv.tsx +++ b/src/components/TableToolbar/ImportCsv.tsx @@ -25,7 +25,7 @@ import { Import as ImportIcon } from "@src/assets/icons"; import { Upload as FileUploadIcon } from "@src/assets/icons"; import CheckIcon from "@mui/icons-material/CheckCircle"; -import { globalScope, userRolesAtom } from "@src/atoms/globalScope"; +import { projectScope, userRolesAtom } from "@src/atoms/projectScope"; import { tableScope, tableSettingsAtom, @@ -48,7 +48,7 @@ export interface IImportCsvProps { } export default function ImportCsv({ render, PopoverProps }: IImportCsvProps) { - const [userRoles] = useAtom(userRolesAtom, globalScope); + const [userRoles] = useAtom(userRolesAtom, projectScope); const [tableSettings] = useAtom(tableSettingsAtom, tableScope); const [{ importType, csvData }, setImportCsv] = useAtom( importCsvAtom, diff --git a/src/components/TableToolbar/ReExecute.tsx b/src/components/TableToolbar/ReExecute.tsx index 93457454..11a8fec0 100644 --- a/src/components/TableToolbar/ReExecute.tsx +++ b/src/components/TableToolbar/ReExecute.tsx @@ -13,10 +13,10 @@ import Modal from "@src/components/Modal"; import CircularProgressOptical from "@src/components/CircularProgressOptical"; import { - globalScope, + projectScope, projectSettingsAtom, rowyRunModalAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { firebaseDbAtom } from "@src/sources/ProjectSourceFirebase"; import { tableScope, tableSettingsAtom } from "@src/atoms/tableScope"; @@ -28,10 +28,10 @@ export default function ReExecute() { const [updating, setUpdating] = useState(false); const handleClose = () => setOpen(false); - const [projectSettings] = useAtom(projectSettingsAtom, globalScope); - const openRowyRunModal = useSetAtom(rowyRunModalAtom, globalScope); + const [projectSettings] = useAtom(projectSettingsAtom, projectScope); + const openRowyRunModal = useSetAtom(rowyRunModalAtom, projectScope); const [tableSettings] = useAtom(tableSettingsAtom, tableScope); - const [firebaseDb] = useAtom(firebaseDbAtom, globalScope); + const [firebaseDb] = useAtom(firebaseDbAtom, projectScope); if (!firebaseDb) return null; diff --git a/src/components/TableToolbar/TableSettings.tsx b/src/components/TableToolbar/TableSettings.tsx index 06fd6899..3b3d0ef8 100644 --- a/src/components/TableToolbar/TableSettings.tsx +++ b/src/components/TableToolbar/TableSettings.tsx @@ -3,14 +3,14 @@ import { useAtom, useSetAtom } from "jotai"; import TableToolbarButton from "./TableToolbarButton"; import SettingsIcon from "@mui/icons-material/SettingsOutlined"; -import { globalScope, tableSettingsDialogAtom } from "@src/atoms/globalScope"; +import { projectScope, tableSettingsDialogAtom } from "@src/atoms/projectScope"; import { tableScope, tableSettingsAtom } from "@src/atoms/tableScope"; export default function TableSettings() { const [tableSettings] = useAtom(tableSettingsAtom, tableScope); const openTableSettingsDialog = useSetAtom( tableSettingsDialogAtom, - globalScope + projectScope ); return ( diff --git a/src/components/TableToolbar/TableToolbar.tsx b/src/components/TableToolbar/TableToolbar.tsx index 5f555b13..31587bbd 100644 --- a/src/components/TableToolbar/TableToolbar.tsx +++ b/src/components/TableToolbar/TableToolbar.tsx @@ -18,12 +18,12 @@ import HiddenFields from "./HiddenFields"; import RowHeight from "./RowHeight"; import { - globalScope, + projectScope, projectSettingsAtom, userRolesAtom, compatibleRowyRunVersionAtom, rowyRunModalAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { tableScope, tableSettingsAtom, @@ -42,13 +42,13 @@ const ReExecute = lazy(() => import("./ReExecute" /* webpackChunkName: "ReExecut export const TABLE_TOOLBAR_HEIGHT = 44; export default function TableToolbar() { - const [projectSettings] = useAtom(projectSettingsAtom, globalScope); - const [userRoles] = useAtom(userRolesAtom, globalScope); + const [projectSettings] = useAtom(projectSettingsAtom, projectScope); + const [userRoles] = useAtom(userRolesAtom, projectScope); const [compatibleRowyRunVersion] = useAtom( compatibleRowyRunVersionAtom, - globalScope + projectScope ); - const openRowyRunModal = useSetAtom(rowyRunModalAtom, globalScope); + const openRowyRunModal = useSetAtom(rowyRunModalAtom, projectScope); const [tableSettings] = useAtom(tableSettingsAtom, tableScope); const [tableSchema] = useAtom(tableSchemaAtom, tableScope); const openTableModal = useSetAtom(tableModalAtom, tableScope); diff --git a/src/components/TableTutorial/TableTutorial.tsx b/src/components/TableTutorial/TableTutorial.tsx index 7d61d521..0df79ef7 100644 --- a/src/components/TableTutorial/TableTutorial.tsx +++ b/src/components/TableTutorial/TableTutorial.tsx @@ -17,12 +17,12 @@ import ArrowForwardIcon from "@mui/icons-material/ArrowForward"; import StepsProgress from "@src/components/StepsProgress"; import { TUTORIAL_STEPS } from "./Steps"; -import { globalScope, confirmDialogAtom } from "@src/atoms/globalScope"; +import { projectScope, confirmDialogAtom } from "@src/atoms/projectScope"; import { ROUTES } from "@src/constants/routes"; import { NAV_DRAWER_COLLAPSED_WIDTH } from "@src/layouts/Navigation/NavDrawer"; export default function TableTutorial() { - const confirm = useSetAtom(confirmDialogAtom, globalScope); + const confirm = useSetAtom(confirmDialogAtom, projectScope); const navigate = useNavigate(); const [completed, setCompleted] = useState( diff --git a/src/components/fields/Action/ActionFab.tsx b/src/components/fields/Action/ActionFab.tsx index 67f00847..2a122f2b 100644 --- a/src/components/fields/Action/ActionFab.tsx +++ b/src/components/fields/Action/ActionFab.tsx @@ -12,10 +12,10 @@ import CircularProgressOptical from "@src/components/CircularProgressOptical"; import { firebaseFunctionsAtom } from "@src/sources/ProjectSourceFirebase"; import { - globalScope, + projectScope, confirmDialogAtom, rowyRunAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { tableScope, tableSettingsAtom } from "@src/atoms/tableScope"; import { useActionParams } from "./FormDialog/Context"; import { runRoutes } from "@src/constants/runRoutes"; @@ -54,10 +54,10 @@ export default function ActionFab({ disabled, ...props }: IActionFabProps) { - const confirm = useSetAtom(confirmDialogAtom, globalScope); - const [rowyRun] = useAtom(rowyRunAtom, globalScope); + const confirm = useSetAtom(confirmDialogAtom, projectScope); + const [rowyRun] = useAtom(rowyRunAtom, projectScope); const [tableSettings] = useAtom(tableSettingsAtom, tableScope); - const [firebaseFunctions] = useAtom(firebaseFunctionsAtom, globalScope); + const [firebaseFunctions] = useAtom(firebaseFunctionsAtom, projectScope); const { enqueueSnackbar } = useSnackbar(); const { requestParams } = useActionParams(); diff --git a/src/components/fields/Action/Settings.tsx b/src/components/fields/Action/Settings.tsx index 1ecf60e1..bf5fce43 100644 --- a/src/components/fields/Action/Settings.tsx +++ b/src/components/fields/Action/Settings.tsx @@ -32,12 +32,12 @@ import InlineOpenInNewIcon from "@src/components/InlineOpenInNewIcon"; import FormFieldSnippets from "./FormFieldSnippets"; import { - globalScope, + projectScope, projectIdAtom, projectRolesAtom, projectSettingsAtom, compatibleRowyRunVersionAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { tableScope, tableColumnsOrderedAtom } from "@src/atoms/tableScope"; import { WIKI_LINKS } from "@src/constants/externalLinks"; @@ -59,12 +59,12 @@ const CodeEditor = lazy( ); const Settings = ({ config, onChange, fieldName }: ISettingsProps) => { - const [projectId] = useAtom(projectIdAtom, globalScope); - const [roles] = useAtom(projectRolesAtom, globalScope); - const [settings] = useAtom(projectSettingsAtom, globalScope); + const [projectId] = useAtom(projectIdAtom, projectScope); + const [roles] = useAtom(projectRolesAtom, projectScope); + const [settings] = useAtom(projectSettingsAtom, projectScope); const [compatibleRowyRunVersion] = useAtom( compatibleRowyRunVersionAtom, - globalScope + projectScope ); const [tableColumnsOrdered] = useAtom(tableColumnsOrderedAtom, tableScope); diff --git a/src/components/fields/Checkbox/TableCell.tsx b/src/components/fields/Checkbox/TableCell.tsx index 54f67f08..5cef0a3b 100644 --- a/src/components/fields/Checkbox/TableCell.tsx +++ b/src/components/fields/Checkbox/TableCell.tsx @@ -3,7 +3,7 @@ import { useSetAtom } from "jotai"; import { get } from "lodash-es"; import { FormControlLabel, Switch } from "@mui/material"; -import { globalScope, confirmDialogAtom } from "@src/atoms/globalScope"; +import { projectScope, confirmDialogAtom } from "@src/atoms/projectScope"; const replacer = (data: any) => (m: string, key: string) => { const objKey = key.split(":")[0]; @@ -18,7 +18,7 @@ export default function Checkbox({ onSubmit, disabled, }: IHeavyCellProps) { - const confirm = useSetAtom(confirmDialogAtom, globalScope); + const confirm = useSetAtom(confirmDialogAtom, projectScope); const handleChange = () => { if (column?.config?.confirmation) { diff --git a/src/components/fields/ConnectTable/ConnectTableSelect.tsx b/src/components/fields/ConnectTable/ConnectTableSelect.tsx index 5b78f4d7..3b4086ac 100644 --- a/src/components/fields/ConnectTable/ConnectTableSelect.tsx +++ b/src/components/fields/ConnectTable/ConnectTableSelect.tsx @@ -11,7 +11,7 @@ import MultiSelect, { MultiSelectProps } from "@rowy/multiselect"; import Loading from "@src/components/Loading"; import InlineOpenInNewIcon from "@src/components/InlineOpenInNewIcon"; -import { globalScope, rowyRunAtom } from "@src/atoms/globalScope"; +import { projectScope, rowyRunAtom } from "@src/atoms/projectScope"; import { tableScope } from "@src/atoms/tableScope"; import { runRoutes } from "@src/constants/runRoutes"; import { WIKI_LINKS } from "@src/constants/externalLinks"; @@ -76,7 +76,7 @@ export default function ConnectTableSelect({ }: IConnectTableSelectProps) { const { enqueueSnackbar } = useSnackbar(); - const [rowyRun] = useAtom(rowyRunAtom, globalScope); + const [rowyRun] = useAtom(rowyRunAtom, projectScope); const [algoliaAppId, setAlgoliaAppId] = useAtom(algoliaAppIdAtom, tableScope); useEffect(() => { diff --git a/src/components/fields/ConnectTable/Settings.tsx b/src/components/fields/ConnectTable/Settings.tsx index 6135e175..d763a559 100644 --- a/src/components/fields/ConnectTable/Settings.tsx +++ b/src/components/fields/ConnectTable/Settings.tsx @@ -17,20 +17,20 @@ import InlineOpenInNewIcon from "@src/components/InlineOpenInNewIcon"; import WarningIcon from "@mui/icons-material/WarningAmberOutlined"; import { - globalScope, + projectScope, getTableSchemaAtom, tablesAtom, projectSettingsAtom, rowyRunModalAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { FieldType } from "@src/constants/fields"; import { WIKI_LINKS } from "@src/constants/externalLinks"; export default function Settings({ onChange, config }: ISettingsProps) { - const [tables] = useAtom(tablesAtom, globalScope); - const [projectSettings] = useAtom(projectSettingsAtom, globalScope); - const openRowyRunModal = useSetAtom(rowyRunModalAtom, globalScope); - const [getTableSchema] = useAtom(getTableSchemaAtom, globalScope); + const [tables] = useAtom(tablesAtom, projectScope); + const [projectSettings] = useAtom(projectSettingsAtom, projectScope); + const openRowyRunModal = useSetAtom(rowyRunModalAtom, projectScope); + const [getTableSchema] = useAtom(getTableSchemaAtom, projectScope); useEffect(() => { if (!projectSettings.rowyRunUrl) diff --git a/src/components/fields/Connector/Select/PopupContents.tsx b/src/components/fields/Connector/Select/PopupContents.tsx index c101123d..29453471 100644 --- a/src/components/fields/Connector/Select/PopupContents.tsx +++ b/src/components/fields/Connector/Select/PopupContents.tsx @@ -25,7 +25,7 @@ import useStyles from "./styles"; import Loading from "@src/components/Loading"; import { getLabel } from "@src/components/fields/Connector/utils"; import { useSnackbar } from "notistack"; -import { globalScope, rowyRunAtom } from "@src/atoms/globalScope"; +import { projectScope, rowyRunAtom } from "@src/atoms/projectScope"; import { tableScope, tableSettingsAtom } from "@src/atoms/tableScope"; import { getTableSchemaPath } from "@src/utils/table"; @@ -39,7 +39,7 @@ export default function PopupContents({ column, docRef, }: IPopupContentsProps) { - const [rowyRun] = useAtom(rowyRunAtom, globalScope); + const [rowyRun] = useAtom(rowyRunAtom, projectScope); const [tableSettings] = useAtom(tableSettingsAtom, tableScope); const { enqueueSnackbar } = useSnackbar(); diff --git a/src/components/fields/Derivative/ContextMenuActions.tsx b/src/components/fields/Derivative/ContextMenuActions.tsx index 4596d927..f877301f 100644 --- a/src/components/fields/Derivative/ContextMenuActions.tsx +++ b/src/components/fields/Derivative/ContextMenuActions.tsx @@ -5,7 +5,7 @@ import { useSnackbar } from "notistack"; import ReEvalIcon from "@mui/icons-material/ReplayOutlined"; import EvalIcon from "@mui/icons-material/PlayCircleOutline"; -import { globalScope, rowyRunAtom } from "@src/atoms/globalScope"; +import { projectScope, rowyRunAtom } from "@src/atoms/projectScope"; import { tableScope, tableSettingsAtom, @@ -26,7 +26,7 @@ export const ContextMenuActions: IFieldConfig["contextMenuActions"] = ( selectedCell, reset ) => { - const [rowyRun] = useAtom(rowyRunAtom, globalScope); + const [rowyRun] = useAtom(rowyRunAtom, projectScope); const [tableSettings] = useAtom(tableSettingsAtom, tableScope); const [tableSchema] = useAtom(tableSchemaAtom, tableScope); const [tableRows] = useAtom(tableRowsAtom, tableScope); diff --git a/src/components/fields/Derivative/Settings.tsx b/src/components/fields/Derivative/Settings.tsx index 57c25d72..e084bc32 100644 --- a/src/components/fields/Derivative/Settings.tsx +++ b/src/components/fields/Derivative/Settings.tsx @@ -9,11 +9,11 @@ import FieldsDropdown from "@src/components/ColumnModals/FieldsDropdown"; import CodeEditorHelper from "@src/components/CodeEditor/CodeEditorHelper"; import { - globalScope, + projectScope, compatibleRowyRunVersionAtom, projectSettingsAtom, rowyRunModalAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { tableScope, tableColumnsOrderedAtom } from "@src/atoms/tableScope"; import { FieldType } from "@src/constants/fields"; import { WIKI_LINKS } from "@src/constants/externalLinks"; @@ -40,12 +40,12 @@ export default function Settings({ onBlur, errors, }: ISettingsProps) { - const [projectSettings] = useAtom(projectSettingsAtom, globalScope); + const [projectSettings] = useAtom(projectSettingsAtom, projectScope); const [compatibleRowyRunVersion] = useAtom( compatibleRowyRunVersionAtom, - globalScope + projectScope ); - const openRowyRunModal = useSetAtom(rowyRunModalAtom, globalScope); + const openRowyRunModal = useSetAtom(rowyRunModalAtom, projectScope); const [tableColumnsOrdered] = useAtom(tableColumnsOrderedAtom, tableScope); useEffect(() => { diff --git a/src/components/fields/File/SideDrawerField.tsx b/src/components/fields/File/SideDrawerField.tsx index 0bc14268..c28e0866 100644 --- a/src/components/fields/File/SideDrawerField.tsx +++ b/src/components/fields/File/SideDrawerField.tsx @@ -21,7 +21,7 @@ import CircularProgressOptical from "@src/components/CircularProgressOptical"; import { DATE_TIME_FORMAT } from "@src/constants/dates"; import { fieldSx, getFieldId } from "@src/components/SideDrawer/utils"; -import { globalScope, confirmDialogAtom } from "@src/atoms/globalScope"; +import { projectScope, confirmDialogAtom } from "@src/atoms/projectScope"; import { FileValue } from "@src/types/table"; export default function File_({ @@ -32,7 +32,7 @@ export default function File_({ onSubmit, disabled, }: ISideDrawerFieldProps) { - const confirm = useSetAtom(confirmDialogAtom, globalScope); + const confirm = useSetAtom(confirmDialogAtom, projectScope); const { uploaderState, upload, deleteUpload } = useUploader(); diff --git a/src/components/fields/File/TableCell.tsx b/src/components/fields/File/TableCell.tsx index 407553b2..685cf62e 100644 --- a/src/components/fields/File/TableCell.tsx +++ b/src/components/fields/File/TableCell.tsx @@ -11,7 +11,7 @@ import { Upload as UploadIcon } from "@src/assets/icons"; import ChipList from "@src/components/Table/formatters/ChipList"; import CircularProgressOptical from "@src/components/CircularProgressOptical"; -import { globalScope, confirmDialogAtom } from "@src/atoms/globalScope"; +import { projectScope, confirmDialogAtom } from "@src/atoms/projectScope"; import { tableScope, updateFieldAtom } from "@src/atoms/tableScope"; import useUploader from "@src/hooks/useFirebaseStorageUploader"; import { FileIcon } from "."; @@ -26,7 +26,7 @@ export default function File_({ disabled, docRef, }: IHeavyCellProps) { - const confirm = useSetAtom(confirmDialogAtom, globalScope); + const confirm = useSetAtom(confirmDialogAtom, projectScope); const updateField = useSetAtom(updateFieldAtom, tableScope); const { uploaderState, upload, deleteUpload } = useUploader(); diff --git a/src/components/fields/Image/SideDrawerField.tsx b/src/components/fields/Image/SideDrawerField.tsx index 2436a2dd..9780b831 100644 --- a/src/components/fields/Image/SideDrawerField.tsx +++ b/src/components/fields/Image/SideDrawerField.tsx @@ -23,7 +23,7 @@ import OpenIcon from "@mui/icons-material/OpenInNewOutlined"; import Thumbnail from "@src/components/Thumbnail"; import CircularProgressOptical from "@src/components/CircularProgressOptical"; -import { globalScope, confirmDialogAtom } from "@src/atoms/globalScope"; +import { projectScope, confirmDialogAtom } from "@src/atoms/projectScope"; import { IMAGE_MIME_TYPES } from "."; import { fieldSx, getFieldId } from "@src/components/SideDrawer/utils"; @@ -88,7 +88,7 @@ export default function Image_({ onSubmit, disabled, }: ISideDrawerFieldProps) { - const confirm = useSetAtom(confirmDialogAtom, globalScope); + const confirm = useSetAtom(confirmDialogAtom, projectScope); const { uploaderState, upload, deleteUpload } = useUploader(); const { progress } = uploaderState; diff --git a/src/components/fields/Image/TableCell.tsx b/src/components/fields/Image/TableCell.tsx index c846be9e..84a44904 100644 --- a/src/components/fields/Image/TableCell.tsx +++ b/src/components/fields/Image/TableCell.tsx @@ -22,7 +22,7 @@ import OpenIcon from "@mui/icons-material/OpenInNewOutlined"; import Thumbnail from "@src/components/Thumbnail"; import CircularProgressOptical from "@src/components/CircularProgressOptical"; -import { globalScope, confirmDialogAtom } from "@src/atoms/globalScope"; +import { projectScope, confirmDialogAtom } from "@src/atoms/projectScope"; import { tableSchemaAtom, tableScope, @@ -92,7 +92,7 @@ export default function Image_({ disabled, docRef, }: IHeavyCellProps) { - const confirm = useSetAtom(confirmDialogAtom, globalScope); + const confirm = useSetAtom(confirmDialogAtom, projectScope); const updateField = useSetAtom(updateFieldAtom, tableScope); const [tableSchema] = useAtom(tableSchemaAtom, tableScope); const { uploaderState, upload, deleteUpload } = useUploader(); diff --git a/src/components/fields/Json/SideDrawerField.tsx b/src/components/fields/Json/SideDrawerField.tsx index 52efa335..d6b15595 100644 --- a/src/components/fields/Json/SideDrawerField.tsx +++ b/src/components/fields/Json/SideDrawerField.tsx @@ -15,7 +15,7 @@ import TabList from "@mui/lab/TabList"; import TabPanel from "@mui/lab/TabPanel"; import { fieldSx, getFieldId } from "@src/components/SideDrawer/utils"; -import { globalScope, jsonEditorAtom } from "@src/atoms/globalScope"; +import { projectScope, jsonEditorAtom } from "@src/atoms/projectScope"; import config from "."; const isValidJson = (val: any) => { @@ -37,7 +37,7 @@ export default function Json({ }: ISideDrawerFieldProps) { const theme = useTheme(); - const [editor, setEditor] = useAtom(jsonEditorAtom, globalScope); + const [editor, setEditor] = useAtom(jsonEditorAtom, projectScope); const [codeValid, setCodeValid] = useState(true); const sanitizedValue = diff --git a/src/components/fields/Reference/BasicCell.tsx b/src/components/fields/Reference/BasicCell.tsx index 5ccab9b0..b75b62d2 100644 --- a/src/components/fields/Reference/BasicCell.tsx +++ b/src/components/fields/Reference/BasicCell.tsx @@ -4,10 +4,10 @@ import { IBasicCellProps } from "@src/components/fields/types"; import { Stack, IconButton } from "@mui/material"; import LaunchIcon from "@mui/icons-material/Launch"; -import { globalScope, projectIdAtom } from "@src/atoms/globalScope"; +import { projectScope, projectIdAtom } from "@src/atoms/projectScope"; export default function Reference({ value }: IBasicCellProps) { - const [projectId] = useAtom(projectIdAtom, globalScope); + const [projectId] = useAtom(projectIdAtom, projectScope); const path = value?.path ?? ""; if (!path) return null; diff --git a/src/components/fields/Reference/EditorCell.tsx b/src/components/fields/Reference/EditorCell.tsx index d68ceb9b..824a8585 100644 --- a/src/components/fields/Reference/EditorCell.tsx +++ b/src/components/fields/Reference/EditorCell.tsx @@ -5,14 +5,14 @@ import { get } from "lodash-es"; import { TextField } from "@mui/material"; -import { globalScope } from "@src/atoms/globalScope"; +import { projectScope } from "@src/atoms/projectScope"; import { firebaseDbAtom } from "@src/sources/ProjectSourceFirebase"; import { tableScope, updateFieldAtom } from "@src/atoms/tableScope"; import { doc, deleteField } from "firebase/firestore"; /** WARNING: THIS DOES NOT WORK IN REACT 18 STRICT MODE */ export default function TextEditor({ row, column }: EditorProps) { - const [firebaseDb] = useAtom(firebaseDbAtom, globalScope); + const [firebaseDb] = useAtom(firebaseDbAtom, projectScope); const updateField = useSetAtom(updateFieldAtom, tableScope); const inputRef = useRef(null); diff --git a/src/components/fields/Reference/SideDrawerField.tsx b/src/components/fields/Reference/SideDrawerField.tsx index b8f09e81..2c13b345 100644 --- a/src/components/fields/Reference/SideDrawerField.tsx +++ b/src/components/fields/Reference/SideDrawerField.tsx @@ -5,7 +5,7 @@ import { ISideDrawerFieldProps } from "@src/components/fields/types"; import { Stack, TextField, IconButton } from "@mui/material"; import LaunchIcon from "@mui/icons-material/Launch"; -import { globalScope, projectIdAtom } from "@src/atoms/globalScope"; +import { projectScope, projectIdAtom } from "@src/atoms/projectScope"; import { firebaseDbAtom } from "@src/sources/ProjectSourceFirebase"; import { getFieldId } from "@src/components/SideDrawer/utils"; @@ -16,8 +16,8 @@ export default function Reference({ onSubmit, disabled, }: ISideDrawerFieldProps) { - const [projectId] = useAtom(projectIdAtom, globalScope); - const [firebaseDb] = useAtom(firebaseDbAtom, globalScope); + const [projectId] = useAtom(projectIdAtom, projectScope); + const [firebaseDb] = useAtom(firebaseDbAtom, projectScope); const transformedValue = Boolean(value) && "path" in value && typeof value.path === "string" diff --git a/src/hooks/useFirebaseStorageUploader.tsx b/src/hooks/useFirebaseStorageUploader.tsx index b4dd0d5b..16fbd521 100644 --- a/src/hooks/useFirebaseStorageUploader.tsx +++ b/src/hooks/useFirebaseStorageUploader.tsx @@ -12,7 +12,7 @@ import { import { Paper, Button } from "@mui/material"; import InlineOpenInNewIcon from "@src/components/InlineOpenInNewIcon"; -import { globalScope } from "@src/atoms/globalScope"; +import { projectScope } from "@src/atoms/projectScope"; import { firebaseStorageAtom } from "@src/sources/ProjectSourceFirebase"; import { WIKI_LINKS } from "@src/constants/externalLinks"; import { FileValue } from "@src/types/table"; @@ -39,7 +39,7 @@ export type UploadProps = { // TODO: GENERALIZE INTO ATOM const useFirebaseStorageUploader = () => { - const [firebaseStorage] = useAtom(firebaseStorageAtom, globalScope); + const [firebaseStorage] = useAtom(firebaseStorageAtom, projectScope); const { enqueueSnackbar } = useSnackbar(); const [uploaderState, uploaderDispatch] = useReducer(uploadReducer, { diff --git a/src/hooks/useFirestoreCollectionWithAtom.ts b/src/hooks/useFirestoreCollectionWithAtom.ts index e1578f78..23bc2ce5 100644 --- a/src/hooks/useFirestoreCollectionWithAtom.ts +++ b/src/hooks/useFirestoreCollectionWithAtom.ts @@ -26,7 +26,7 @@ import { } from "firebase/firestore"; import { useErrorHandler } from "react-error-boundary"; -import { globalScope } from "@src/atoms/globalScope"; +import { projectScope } from "@src/atoms/projectScope"; import { UpdateCollectionDocFunction, DeleteCollectionDocFunction, @@ -67,7 +67,7 @@ interface IUseFirestoreCollectionWithAtomOptions { /** * Attaches a listener for a Firestore collection and unsubscribes on unmount. - * Gets the Firestore instance initiated in globalScope. + * Gets the Firestore instance initiated in projectScope. * Updates an atom and Suspends that atom until the first snapshot is received. * * @param dataAtom - Atom to store data in @@ -96,7 +96,7 @@ export function useFirestoreCollectionWithAtom( nextPageAtom, } = options || {}; - const [firebaseDb] = useAtom(firebaseDbAtom, globalScope); + const [firebaseDb] = useAtom(firebaseDbAtom, projectScope); const setDataAtom = useSetAtom(dataAtom, dataScope); const handleError = useErrorHandler(); diff --git a/src/hooks/useFirestoreDocWithAtom.ts b/src/hooks/useFirestoreDocWithAtom.ts index 8e63ce76..e7691155 100644 --- a/src/hooks/useFirestoreDocWithAtom.ts +++ b/src/hooks/useFirestoreDocWithAtom.ts @@ -15,7 +15,7 @@ import { } from "firebase/firestore"; import { useErrorHandler } from "react-error-boundary"; -import { globalScope } from "@src/atoms/globalScope"; +import { projectScope } from "@src/atoms/projectScope"; import { UpdateDocFunction, TableRow } from "@src/types/table"; import { firebaseDbAtom } from "@src/sources/ProjectSourceFirebase"; @@ -35,7 +35,7 @@ interface IUseFirestoreDocWithAtomOptions { /** * Attaches a listener for a Firestore document and unsubscribes on unmount. - * Gets the Firestore instance initiated in globalScope. + * Gets the Firestore instance initiated in projectScope. * Updates an atom and Suspends that atom until the first snapshot is received. * * @param dataAtom - Atom to store data in @@ -58,7 +58,7 @@ export function useFirestoreDocWithAtom( updateDataAtom, } = options || {}; - const [firebaseDb] = useAtom(firebaseDbAtom, globalScope); + const [firebaseDb] = useAtom(firebaseDbAtom, projectScope); const setDataAtom = useSetAtom(dataAtom, dataScope); const setUpdateDataAtom = useSetAtom( options?.updateDataAtom || (dataAtom as any), diff --git a/src/hooks/useUpdateCheck.ts b/src/hooks/useUpdateCheck.ts index e4468403..d84e20d0 100644 --- a/src/hooks/useUpdateCheck.ts +++ b/src/hooks/useUpdateCheck.ts @@ -4,10 +4,10 @@ import { differenceInDays } from "date-fns"; import { compare } from "compare-versions"; import { - globalScope, + projectScope, rowyRunAtom, rowyRunLatestUpdateAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import meta from "@root/package.json"; import { EXTERNAL_LINKS } from "@src/constants/externalLinks"; import { runRoutes } from "@src/constants/runRoutes"; @@ -29,11 +29,11 @@ const UPDATE_ENDPOINTS = { * @returns [latestUpdate, checkForUpdates, loading] */ export default function useUpdateCheck() { - const [rowyRun] = useAtom(rowyRunAtom, globalScope); + const [rowyRun] = useAtom(rowyRunAtom, projectScope); // Store latest release from GitHub const [latestUpdate, setLatestUpdate] = useAtom( rowyRunLatestUpdateAtom, - globalScope + projectScope ); const [loading, setLoading] = useState(false); diff --git a/src/layouts/AuthLayout.tsx b/src/layouts/AuthLayout.tsx index 437fc667..031056c1 100644 --- a/src/layouts/AuthLayout.tsx +++ b/src/layouts/AuthLayout.tsx @@ -15,7 +15,7 @@ import Logo from "@src/assets/Logo"; import bgTableLight from "@src/assets/bg-table-light.webp"; import bgTableDark from "@src/assets/bg-table-dark.webp"; -import { globalScope, projectIdAtom } from "@src/atoms/globalScope"; +import { projectScope, projectIdAtom } from "@src/atoms/projectScope"; import { EXTERNAL_LINKS } from "@src/constants/externalLinks"; export interface IAuthLayoutProps { @@ -37,7 +37,7 @@ export default function AuthLayout({ children, loading, }: IAuthLayoutProps) { - const [projectId] = useAtom(projectIdAtom, globalScope); + const [projectId] = useAtom(projectIdAtom, projectScope); const fullScreenHeight = use100vh() ?? 0; const linkProps: LinkProps = { diff --git a/src/layouts/Navigation/NavDrawer.tsx b/src/layouts/Navigation/NavDrawer.tsx index bb9b5e53..a15014f0 100644 --- a/src/layouts/Navigation/NavDrawer.tsx +++ b/src/layouts/Navigation/NavDrawer.tsx @@ -38,12 +38,12 @@ import CommunityMenu from "./CommunityMenu"; import HelpMenu from "./HelpMenu"; import { - globalScope, + projectScope, userSettingsAtom, tablesAtom, tableSettingsDialogAtom, getStartedChecklistAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { TableSettings } from "@src/types/table"; import { ROUTES } from "@src/constants/routes"; import { EXTERNAL_LINKS, WIKI_LINKS } from "@src/constants/externalLinks"; @@ -63,15 +63,15 @@ export default function NavDrawer({ isPermanent, onClose, }: INavDrawerProps) { - const [tables] = useAtom(tablesAtom, globalScope); - const [userSettings] = useAtom(userSettingsAtom, globalScope); + const [tables] = useAtom(tablesAtom, projectScope); + const [userSettings] = useAtom(userSettingsAtom, projectScope); const openTableSettingsDialog = useSetAtom( tableSettingsDialogAtom, - globalScope + projectScope ); const openGetStartedChecklist = useSetAtom( getStartedChecklistAtom, - globalScope + projectScope ); const [hover, setHover] = useState(false); diff --git a/src/layouts/Navigation/Navigation.tsx b/src/layouts/Navigation/Navigation.tsx index f996dc53..332313bd 100644 --- a/src/layouts/Navigation/Navigation.tsx +++ b/src/layouts/Navigation/Navigation.tsx @@ -14,17 +14,17 @@ import Loading from "@src/components/Loading"; import GetStartedChecklist from "@src/components/GetStartedChecklist"; import { - globalScope, + projectScope, projectIdAtom, navOpenAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { ROUTE_TITLES } from "@src/constants/routes"; import { useDocumentTitle } from "@src/hooks/useDocumentTitle"; export default function Navigation({ children }: React.PropsWithChildren<{}>) { - const [projectId] = useAtom(projectIdAtom, globalScope); + const [projectId] = useAtom(projectIdAtom, projectScope); - const [open, setOpen] = useAtom(navOpenAtom, globalScope); + const [open, setOpen] = useAtom(navOpenAtom, projectScope); const isPermanent = useMediaQuery((theme: any) => theme.breakpoints.up("md")); const { pathname } = useLocation(); diff --git a/src/layouts/Navigation/SettingsNav.tsx b/src/layouts/Navigation/SettingsNav.tsx index 750bccd1..e54076c6 100644 --- a/src/layouts/Navigation/SettingsNav.tsx +++ b/src/layouts/Navigation/SettingsNav.tsx @@ -16,7 +16,7 @@ import { ChevronDown } from "@src/assets/icons"; import NavItem from "./NavItem"; import UpdateCheckBadge from "./UpdateCheckBadge"; -import { globalScope, userRolesAtom } from "@src/atoms/globalScope"; +import { projectScope, userRolesAtom } from "@src/atoms/projectScope"; import { ROUTES } from "@src/constants/routes"; export interface ISettingsNavProps { @@ -28,7 +28,7 @@ export default function SettingsNav({ closeDrawer, collapsed, }: ISettingsNavProps) { - const [userRoles] = useAtom(userRolesAtom, globalScope); + const [userRoles] = useAtom(userRolesAtom, projectScope); const { pathname } = useLocation(); const [open, setOpen] = useState(pathname.includes(ROUTES.settings)); diff --git a/src/layouts/Navigation/TopBar.tsx b/src/layouts/Navigation/TopBar.tsx index 7ac9c80e..3ea8db8d 100644 --- a/src/layouts/Navigation/TopBar.tsx +++ b/src/layouts/Navigation/TopBar.tsx @@ -22,7 +22,7 @@ import { NAV_DRAWER_WIDTH, NAV_DRAWER_COLLAPSED_WIDTH } from "./NavDrawer"; import UserMenu from "./UserMenu"; import UpdateCheckBadge from "./UpdateCheckBadge"; -import { globalScope, userRolesAtom } from "@src/atoms/globalScope"; +import { projectScope, userRolesAtom } from "@src/atoms/projectScope"; import { ROUTES, ROUTE_TITLES } from "@src/constants/routes"; export const TOP_BAR_HEIGHT = 56; @@ -42,7 +42,7 @@ export default function TopBar({ routeTitle, title, }: ITopBarProps) { - const [userRoles] = useAtom(userRolesAtom, globalScope); + const [userRoles] = useAtom(userRolesAtom, projectScope); const trigger = useScrollTrigger({ disableHysteresis: true, threshold: 0 }); const menuIcon = open ? : ; diff --git a/src/layouts/Navigation/UpdateCheckBadge.tsx b/src/layouts/Navigation/UpdateCheckBadge.tsx index 7c142d55..314eb413 100644 --- a/src/layouts/Navigation/UpdateCheckBadge.tsx +++ b/src/layouts/Navigation/UpdateCheckBadge.tsx @@ -2,11 +2,11 @@ import { useAtom } from "jotai"; import { Badge, BadgeProps } from "@mui/material"; -import { globalScope, userRolesAtom } from "@src/atoms/globalScope"; +import { projectScope, userRolesAtom } from "@src/atoms/projectScope"; import useUpdateCheck from "@src/hooks/useUpdateCheck"; export default function UpdateCheckBadge(props: Partial) { - const [userRoles] = useAtom(userRolesAtom, globalScope); + const [userRoles] = useAtom(userRolesAtom, projectScope); const [latestUpdate] = useUpdateCheck(); if ( diff --git a/src/layouts/Navigation/UserMenu.tsx b/src/layouts/Navigation/UserMenu.tsx index 75cf8d18..6d72cbc8 100644 --- a/src/layouts/Navigation/UserMenu.tsx +++ b/src/layouts/Navigation/UserMenu.tsx @@ -20,12 +20,12 @@ import AccountCircleIcon from "@mui/icons-material/AccountCircleOutlined"; import { ChevronRight as ChevronRightIcon } from "@src/assets/icons"; import { - globalScope, + projectScope, projectIdAtom, userSettingsAtom, themeAtom, themeOverriddenAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { ROUTES } from "@src/constants/routes"; export default function UserMenu(props: IconButtonProps) { @@ -33,12 +33,12 @@ export default function UserMenu(props: IconButtonProps) { const [open, setOpen] = useState(false); const [themeSubMenu, setThemeSubMenu] = useState(null); - const [projectId] = useAtom(projectIdAtom, globalScope); - const [userSettings] = useAtom(userSettingsAtom, globalScope); - const [theme, setTheme] = useAtom(themeAtom, globalScope); + const [projectId] = useAtom(projectIdAtom, projectScope); + const [userSettings] = useAtom(userSettingsAtom, projectScope); + const [theme, setTheme] = useAtom(themeAtom, projectScope); const [themeOverridden, setThemeOverridden] = useAtom( themeOverriddenAtom, - globalScope + projectScope ); const displayName = userSettings.user?.displayName; diff --git a/src/layouts/RequireAuth.tsx b/src/layouts/RequireAuth.tsx index 07d56e8b..f568b23a 100644 --- a/src/layouts/RequireAuth.tsx +++ b/src/layouts/RequireAuth.tsx @@ -3,7 +3,7 @@ import { useLocation, Navigate } from "react-router-dom"; import Loading from "@src/components/Loading"; -import { globalScope, currentUserAtom } from "@src/atoms/globalScope"; +import { projectScope, currentUserAtom } from "@src/atoms/projectScope"; import { ROUTES } from "@src/constants/routes"; export interface IRequireAuthProps { @@ -11,7 +11,7 @@ export interface IRequireAuthProps { } export default function RequireAuth({ children }: IRequireAuthProps) { - const [currentUser] = useAtom(currentUserAtom, globalScope); + const [currentUser] = useAtom(currentUserAtom, projectScope); const location = useLocation(); if (currentUser === undefined) diff --git a/src/pages/Auth/ImpersonatorAuthPage.tsx b/src/pages/Auth/ImpersonatorAuthPage.tsx index 8e7b71c3..44874226 100644 --- a/src/pages/Auth/ImpersonatorAuthPage.tsx +++ b/src/pages/Auth/ImpersonatorAuthPage.tsx @@ -12,13 +12,13 @@ import { Typography, Button, TextField } from "@mui/material"; import AuthLayout from "@src/layouts/AuthLayout"; import FirebaseUi from "@src/components/FirebaseUi"; -import { globalScope, rowyRunAtom } from "@src/atoms/globalScope"; +import { projectScope, rowyRunAtom } from "@src/atoms/projectScope"; import { firebaseAuthAtom } from "@src/sources/ProjectSourceFirebase"; import { runRoutes } from "@src/constants/runRoutes"; export default function ImpersonatorAuthPage() { - const [firebaseAuth] = useAtom(firebaseAuthAtom, globalScope); - const [rowyRun] = useAtom(rowyRunAtom, globalScope); + const [firebaseAuth] = useAtom(firebaseAuthAtom, projectScope); + const [rowyRun] = useAtom(rowyRunAtom, projectScope); const { enqueueSnackbar } = useSnackbar(); diff --git a/src/pages/Auth/JwtAuthPage.tsx b/src/pages/Auth/JwtAuthPage.tsx index aec88ec7..9f89d485 100644 --- a/src/pages/Auth/JwtAuthPage.tsx +++ b/src/pages/Auth/JwtAuthPage.tsx @@ -7,11 +7,11 @@ import { TextField, Button } from "@mui/material"; import AuthLayout from "@src/layouts/AuthLayout"; -import { globalScope } from "@src/atoms/globalScope"; +import { projectScope } from "@src/atoms/projectScope"; import { firebaseAuthAtom } from "@src/sources/ProjectSourceFirebase"; export default function JwtAuthPage() { - const [firebaseAuth] = useAtom(firebaseAuthAtom, globalScope); + const [firebaseAuth] = useAtom(firebaseAuthAtom, projectScope); const { enqueueSnackbar } = useSnackbar(); const [jwt, setJWT] = useState(""); diff --git a/src/pages/Auth/SignOutPage.tsx b/src/pages/Auth/SignOutPage.tsx index f45ecf07..80e4a4b8 100644 --- a/src/pages/Auth/SignOutPage.tsx +++ b/src/pages/Auth/SignOutPage.tsx @@ -7,11 +7,11 @@ import { Button } from "@mui/material"; import AuthLayout from "@src/layouts/AuthLayout"; -import { globalScope } from "@src/atoms/globalScope"; +import { projectScope } from "@src/atoms/projectScope"; import { firebaseAuthAtom } from "@src/sources/ProjectSourceFirebase"; export default function SignOutPage() { - const [firebaseAuth] = useAtom(firebaseAuthAtom, globalScope); + const [firebaseAuth] = useAtom(firebaseAuthAtom, projectScope); useEffect(() => { signOut(firebaseAuth); diff --git a/src/pages/FunctionPage.tsx b/src/pages/FunctionPage.tsx index 3810ba4d..721eefb1 100644 --- a/src/pages/FunctionPage.tsx +++ b/src/pages/FunctionPage.tsx @@ -10,7 +10,7 @@ import { Fade } from "@mui/material"; //import EmptyTable from "@src/components/Table/EmptyTable"; import Function from "@src/components/Function"; -import { currentUserAtom, globalScope } from "@src/atoms/globalScope"; +import { currentUserAtom, projectScope } from "@src/atoms/projectScope"; // import TableSourceFirestore from "@src/sources/TableSourceFirestore"; // import { // tableScope, @@ -40,7 +40,7 @@ export default function FunctionPage() { function ProvidedFunctionPage() { const { id } = useParams(); - const [currentUser] = useAtom(currentUserAtom, globalScope); + const [currentUser] = useAtom(currentUserAtom, projectScope); return ( ; @@ -27,14 +27,14 @@ export interface IProjectSettingsChildProps { } export default function ProjectSettingsPage() { - const [projectSettings] = useAtom(projectSettingsAtom, globalScope); - const [publicSettings] = useAtom(publicSettingsAtom, globalScope); + const [projectSettings] = useAtom(projectSettingsAtom, projectScope); + const [publicSettings] = useAtom(publicSettingsAtom, projectScope); const { enqueueSnackbar } = useSnackbar(); const [_updateProjectSettingsDoc] = useAtom( updateProjectSettingsAtom, - globalScope + projectScope ); const updateProjectSettings = useDebouncedCallback((data) => { if (_updateProjectSettingsDoc) { @@ -55,7 +55,7 @@ export default function ProjectSettingsPage() { const [_updatePublicSettingsDoc] = useAtom( updatePublicSettingsAtom, - globalScope + projectScope ); const updatePublicSettings = useDebouncedCallback( (data: Record) => { diff --git a/src/pages/Settings/UserSettingsPage.tsx b/src/pages/Settings/UserSettingsPage.tsx index b9c26ef0..53536a2b 100644 --- a/src/pages/Settings/UserSettingsPage.tsx +++ b/src/pages/Settings/UserSettingsPage.tsx @@ -12,11 +12,11 @@ import Theme from "@src/components/Settings/UserSettings/Theme"; import Personalization from "@src/components/Settings/UserSettings/Personalization"; import { - globalScope, + projectScope, currentUserAtom, userSettingsAtom, updateUserSettingsAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; export interface IUserSettingsChildProps { settings: Record; @@ -24,11 +24,11 @@ export interface IUserSettingsChildProps { } export default function UserSettingsPage() { - const [currentUser] = useAtom(currentUserAtom, globalScope); - const [userSettings] = useAtom(userSettingsAtom, globalScope); + const [currentUser] = useAtom(currentUserAtom, projectScope); + const [userSettings] = useAtom(userSettingsAtom, projectScope); const { enqueueSnackbar } = useSnackbar(); - const [_updateUserSettings] = useAtom(updateUserSettingsAtom, globalScope); + const [_updateUserSettings] = useAtom(updateUserSettingsAtom, projectScope); const updateSettings = useDebouncedCallback((data) => { if (_updateUserSettings) { _updateUserSettings(data).then(() => enqueueSnackbar("Saved")); diff --git a/src/pages/Table/ProvidedSubTablePage.tsx b/src/pages/Table/ProvidedSubTablePage.tsx index 1f7b41fb..2b3e090b 100644 --- a/src/pages/Table/ProvidedSubTablePage.tsx +++ b/src/pages/Table/ProvidedSubTablePage.tsx @@ -14,7 +14,7 @@ import TablePage from "./TablePage"; import TableToolbarSkeleton from "@src/components/TableToolbar/TableToolbarSkeleton"; import TableSkeleton from "@src/components/Table/TableSkeleton"; -import { globalScope, currentUserAtom } from "@src/atoms/globalScope"; +import { projectScope, currentUserAtom } from "@src/atoms/projectScope"; import { tableScope, tableIdAtom, @@ -34,7 +34,7 @@ export default function ProvidedSubTablePage() { // Get params from URL: /subTable/:docPath/:subTableKey const { docPath, subTableKey } = useParams(); - const [currentUser] = useAtom(currentUserAtom, globalScope); + const [currentUser] = useAtom(currentUserAtom, projectScope); // Get table settings and the source column from root table const [rootTableSettings] = useAtom(tableSettingsAtom, tableScope); diff --git a/src/pages/Table/ProvidedTablePage.tsx b/src/pages/Table/ProvidedTablePage.tsx index 3f3aa0b7..777b59e5 100644 --- a/src/pages/Table/ProvidedTablePage.tsx +++ b/src/pages/Table/ProvidedTablePage.tsx @@ -14,10 +14,10 @@ import TableToolbarSkeleton from "@src/components/TableToolbar/TableToolbarSkele import TableSkeleton from "@src/components/Table/TableSkeleton"; import { - globalScope, + projectScope, currentUserAtom, tablesAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { tableScope, tableIdAtom, @@ -31,8 +31,8 @@ import { export default function ProvidedTablePage() { const { id } = useParams(); const outlet = useOutlet(); - const [currentUser] = useAtom(currentUserAtom, globalScope); - const [tables] = useAtom(tablesAtom, globalScope); + const [currentUser] = useAtom(currentUserAtom, projectScope); + const [tables] = useAtom(tablesAtom, projectScope); const tableSettings = useMemo(() => find(tables, ["id", id]), [tables, id]); if (!tableSettings) throw new Error(ERROR_TABLE_NOT_FOUND + ": " + id); diff --git a/src/pages/Table/TableTutorialPage.tsx b/src/pages/Table/TableTutorialPage.tsx index 8a0a7425..356ad446 100644 --- a/src/pages/Table/TableTutorialPage.tsx +++ b/src/pages/Table/TableTutorialPage.tsx @@ -14,7 +14,7 @@ import TableTutorial from "@src/components/TableTutorial"; import EmptyState from "@src/components/EmptyState"; import TableModals from "@src/components/TableModals"; -import { globalScope, currentUserAtom } from "@src/atoms/globalScope"; +import { projectScope, currentUserAtom } from "@src/atoms/projectScope"; import { tableScope, tableIdAtom, @@ -39,7 +39,7 @@ import * as csvData from "@src/components/TableTutorial/data"; * Wraps `TablePage` with the data for a top-level table. */ export default function TableTutorialPage() { - const [currentUser] = useAtom(currentUserAtom, globalScope); + const [currentUser] = useAtom(currentUserAtom, projectScope); return ( diff --git a/src/pages/TablesPage.tsx b/src/pages/TablesPage.tsx index cfa03d5a..ea133c07 100644 --- a/src/pages/TablesPage.tsx +++ b/src/pages/TablesPage.tsx @@ -28,14 +28,14 @@ import HomeWelcomePrompt from "@src/components/Tables/HomeWelcomePrompt"; import EmptyState from "@src/components/EmptyState"; import { - globalScope, + projectScope, userRolesAtom, userSettingsAtom, updateUserSettingsAtom, tablesAtom, tablesViewAtom, tableSettingsDialogAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { TableSettings } from "@src/types/table"; import { ROUTES } from "@src/constants/routes"; import useBasicSearch from "@src/hooks/useBasicSearch"; @@ -44,14 +44,14 @@ import { TOP_BAR_HEIGHT } from "@src/layouts/Navigation/TopBar"; const SEARCH_KEYS = ["id", "name", "section", "description"]; export default function HomePage() { - const [userRoles] = useAtom(userRolesAtom, globalScope); - const [userSettings] = useAtom(userSettingsAtom, globalScope); - const [updateUserSettings] = useAtom(updateUserSettingsAtom, globalScope); - const [tables] = useAtom(tablesAtom, globalScope); - const [view, setView] = useAtom(tablesViewAtom, globalScope); + const [userRoles] = useAtom(userRolesAtom, projectScope); + const [userSettings] = useAtom(userSettingsAtom, projectScope); + const [updateUserSettings] = useAtom(updateUserSettingsAtom, projectScope); + const [tables] = useAtom(tablesAtom, projectScope); + const [view, setView] = useAtom(tablesViewAtom, projectScope); const openTableSettingsDialog = useSetAtom( tableSettingsDialogAtom, - globalScope + projectScope ); const [results, query, handleQuery] = useBasicSearch( diff --git a/src/pages/Test/JotaiTestPage.tsx b/src/pages/Test/JotaiTestPage.tsx index 3f932733..4a3e92df 100644 --- a/src/pages/Test/JotaiTestPage.tsx +++ b/src/pages/Test/JotaiTestPage.tsx @@ -1,7 +1,7 @@ import { useState } from "react"; import { useAtom } from "jotai"; import { - globalScope, + projectScope, projectIdAtom, currentUserAtom, userRolesAtom, @@ -9,7 +9,7 @@ import { publicSettingsAtom, projectSettingsAtom, rowyRunAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { firebaseAuthAtom } from "@src/sources/ProjectSourceFirebase"; import { Button } from "@mui/material"; import MultiSelect from "@rowy/multiselect"; @@ -33,21 +33,21 @@ function CurrentUser({ currentUser }: { currentUser: User }) { } function JotaiTest() { - const [firebaseAuth] = useAtom(firebaseAuthAtom, globalScope); - const [projectId] = useAtom(projectIdAtom, globalScope); - const [currentUser] = useAtom(currentUserAtom, globalScope); - const [userRoles] = useAtom(userRolesAtom, globalScope); - const [publicSettings] = useAtom(publicSettingsAtom, globalScope); - const [projectSettings] = useAtom(projectSettingsAtom, globalScope); - const [userSettings] = useAtom(userSettingsAtom, globalScope); - const [rowyRun] = useAtom(rowyRunAtom, globalScope); + const [firebaseAuth] = useAtom(firebaseAuthAtom, projectScope); + const [projectId] = useAtom(projectIdAtom, projectScope); + const [currentUser] = useAtom(currentUserAtom, projectScope); + const [userRoles] = useAtom(userRolesAtom, projectScope); + const [publicSettings] = useAtom(publicSettingsAtom, projectScope); + const [projectSettings] = useAtom(projectSettingsAtom, projectScope); + const [userSettings] = useAtom(userSettingsAtom, projectScope); + const [rowyRun] = useAtom(rowyRunAtom, projectScope); const [count, setCount] = useState(0); const { enqueueSnackbar } = useSnackbar(); useFirestoreDocWithAtom( publicSettingsAtom, - globalScope, + projectScope, "_rowy_/publicSettings" ); diff --git a/src/pages/Test/TableTestPage.tsx b/src/pages/Test/TableTestPage.tsx index f7e635a5..da89a31d 100644 --- a/src/pages/Test/TableTestPage.tsx +++ b/src/pages/Test/TableTestPage.tsx @@ -18,7 +18,7 @@ import TableToolbarSkeleton from "@src/components/TableToolbar/TableToolbarSkele import TableSkeleton from "@src/components/Table/TableSkeleton"; import { firebaseDbAtom } from "@src/sources/ProjectSourceFirebase"; -import { currentUserAtom, globalScope } from "@src/atoms/globalScope"; +import { currentUserAtom, projectScope } from "@src/atoms/projectScope"; import { doc, setDoc, updateDoc } from "firebase/firestore"; import { TABLE_SCHEMAS } from "@src/config/dbPaths"; @@ -35,7 +35,7 @@ function TableTestPage() { console.log(tableId, tableSettings, tableSchema); - const [firebaseDb] = useAtom(firebaseDbAtom, globalScope); + const [firebaseDb] = useAtom(firebaseDbAtom, projectScope); return (
    @@ -105,7 +105,7 @@ function TableTestPage() { export default function ProvidedTableTestPage() { const { id } = useParams(); - const [currentUser] = useAtom(currentUserAtom, globalScope); + const [currentUser] = useAtom(currentUserAtom, projectScope); return ( { setProjectId(firebaseConfig.projectId || ""); }, [firebaseConfig.projectId, setProjectId]); diff --git a/src/sources/ProjectSourceFirebase/useAuthUser.ts b/src/sources/ProjectSourceFirebase/useAuthUser.ts index 8928710f..5adbd337 100644 --- a/src/sources/ProjectSourceFirebase/useAuthUser.ts +++ b/src/sources/ProjectSourceFirebase/useAuthUser.ts @@ -5,11 +5,11 @@ import { useErrorHandler } from "react-error-boundary"; import { getIdTokenResult } from "firebase/auth"; import { - globalScope, + projectScope, currentUserAtom, userRolesAtom, updateUserSettingsAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { firebaseAuthAtom } from "./init"; /** @@ -18,14 +18,14 @@ import { firebaseAuthAtom } from "./init"; export function useAuthUser() { const elevateError = useErrorHandler(); // Get current user and store in atoms - const [firebaseAuth] = useAtom(firebaseAuthAtom, globalScope); - const setCurrentUser = useSetAtom(currentUserAtom, globalScope); - const setUserRoles = useSetAtom(userRolesAtom, globalScope); + const [firebaseAuth] = useAtom(firebaseAuthAtom, projectScope); + const setCurrentUser = useSetAtom(currentUserAtom, projectScope); + const setUserRoles = useSetAtom(userRolesAtom, projectScope); // Must use `useAtomCallback`, otherwise `useAtom(updateUserSettingsAtom)` // will cause infinite re-render const updateUserSettings = useAtomCallback( useCallback((get) => get(updateUserSettingsAtom), []), - globalScope + projectScope ); useEffect(() => { diff --git a/src/sources/ProjectSourceFirebase/useSettingsDocs.ts b/src/sources/ProjectSourceFirebase/useSettingsDocs.ts index 274c3617..97a4861a 100644 --- a/src/sources/ProjectSourceFirebase/useSettingsDocs.ts +++ b/src/sources/ProjectSourceFirebase/useSettingsDocs.ts @@ -1,7 +1,7 @@ import { useAtom } from "jotai"; import { - globalScope, + projectScope, projectSettingsAtom, updateProjectSettingsAtom, publicSettingsAtom, @@ -9,7 +9,7 @@ import { currentUserAtom, userSettingsAtom, updateUserSettingsAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import useFirestoreDocWithAtom from "@src/hooks/useFirestoreDocWithAtom"; import { SETTINGS, PUBLIC_SETTINGS, USERS } from "@src/config/dbPaths"; @@ -19,10 +19,10 @@ import { SETTINGS, PUBLIC_SETTINGS, USERS } from "@src/config/dbPaths"; * Also sets functions to update those documents. */ export function useSettingsDocs() { - const [currentUser] = useAtom(currentUserAtom, globalScope); + const [currentUser] = useAtom(currentUserAtom, projectScope); // Store public settings in atom - useFirestoreDocWithAtom(publicSettingsAtom, globalScope, PUBLIC_SETTINGS, { + useFirestoreDocWithAtom(publicSettingsAtom, projectScope, PUBLIC_SETTINGS, { updateDataAtom: updatePublicSettingsAtom, }); @@ -30,7 +30,7 @@ export function useSettingsDocs() { // If they have no access, display AccessDenied screen via ErrorBoundary. useFirestoreDocWithAtom( projectSettingsAtom, - globalScope, + projectScope, currentUser ? SETTINGS : undefined, { updateDataAtom: updateProjectSettingsAtom } ); @@ -39,7 +39,7 @@ export function useSettingsDocs() { JSON.parse((currentUser as any)?.reloadUserInfo?.customAttributes ?? "{}") ?.roles ?? []; // Store user settings in atom when a user is signed in - useFirestoreDocWithAtom(userSettingsAtom, globalScope, USERS, { + useFirestoreDocWithAtom(userSettingsAtom, projectScope, USERS, { pathSegments: [currentUser?.uid], createIfNonExistent: currentUser ? { diff --git a/src/sources/ProjectSourceFirebase/useTableFunctions.ts b/src/sources/ProjectSourceFirebase/useTableFunctions.ts index fdc33119..379f55d2 100644 --- a/src/sources/ProjectSourceFirebase/useTableFunctions.ts +++ b/src/sources/ProjectSourceFirebase/useTableFunctions.ts @@ -5,7 +5,7 @@ import { doc, getDoc, setDoc, deleteDoc } from "firebase/firestore"; import { camelCase, find, findIndex, isEmpty } from "lodash-es"; import { - globalScope, + projectScope, projectSettingsAtom, createTableAtom, updateTableAtom, @@ -13,7 +13,7 @@ import { getTableSchemaAtom, AdditionalTableSettings, MinimumTableSettings, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { firebaseDbAtom } from "./init"; import { @@ -26,17 +26,17 @@ import { FieldType } from "@src/constants/fields"; import { getFieldProp } from "@src/components/fields"; export function useTableFunctions() { - const [firebaseDb] = useAtom(firebaseDbAtom, globalScope); + const [firebaseDb] = useAtom(firebaseDbAtom, projectScope); // Create a function to get the latest tables from project settings, // so we don’t create new functions when tables change const readTables = useAtomCallback( useCallback((get) => get(projectSettingsAtom).tables, []), - globalScope + projectScope ); // Set the createTable function - const setCreateTable = useSetAtom(createTableAtom, globalScope); + const setCreateTable = useSetAtom(createTableAtom, projectScope); useEffect(() => { setCreateTable( () => @@ -123,7 +123,7 @@ export function useTableFunctions() { }, [firebaseDb, readTables, setCreateTable]); // Set the createTable function - const setUpdateTable = useSetAtom(updateTableAtom, globalScope); + const setUpdateTable = useSetAtom(updateTableAtom, projectScope); useEffect(() => { setUpdateTable( () => @@ -169,7 +169,7 @@ export function useTableFunctions() { }, [firebaseDb, readTables, setUpdateTable]); // Set the deleteTable function - const setDeleteTable = useSetAtom(deleteTableAtom, globalScope); + const setDeleteTable = useSetAtom(deleteTableAtom, projectScope); useEffect(() => { setDeleteTable(() => async (id: string) => { // Get latest tables @@ -199,7 +199,7 @@ export function useTableFunctions() { }, [firebaseDb, readTables, setDeleteTable]); // Set the getTableSchema function - const setGetTableSchema = useSetAtom(getTableSchemaAtom, globalScope); + const setGetTableSchema = useSetAtom(getTableSchemaAtom, projectScope); useEffect(() => { setGetTableSchema(() => async (id: string) => { // Get latest tables diff --git a/src/sources/TableSourceFirestore/TableSourceFirestore.tsx b/src/sources/TableSourceFirestore/TableSourceFirestore.tsx index 652d9eee..7d8a5470 100644 --- a/src/sources/TableSourceFirestore/TableSourceFirestore.tsx +++ b/src/sources/TableSourceFirestore/TableSourceFirestore.tsx @@ -30,7 +30,7 @@ import { getTableSchemaPath } from "@src/utils/table"; * When rendered, provides atom values for top-level tables and sub-tables */ export const TableSourceFirestore = memo(function TableSourceFirestore() { - // Get tableSettings from tableId and tables in globalScope + // Get tableSettings from tableId and tables in projectScope const [tableSettings] = useAtom(tableSettingsAtom, tableScope); const isCollectionGroup = tableSettings?.tableType === "collectionGroup"; diff --git a/src/sources/TableSourceFirestore/useAuditChange.ts b/src/sources/TableSourceFirestore/useAuditChange.ts index 362af735..64bf97ab 100644 --- a/src/sources/TableSourceFirestore/useAuditChange.ts +++ b/src/sources/TableSourceFirestore/useAuditChange.ts @@ -2,11 +2,11 @@ import { useEffect } from "react"; import { useAtom, useSetAtom } from "jotai"; import { - globalScope, + projectScope, rowyRunAtom, compatibleRowyRunVersionAtom, currentUserAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; import { tableScope, tableSettingsAtom, @@ -20,12 +20,12 @@ import { rowyUser } from "@src/utils/table"; */ export default function useAuditChange() { const setAuditChange = useSetAtom(auditChangeAtom, tableScope); - const [rowyRun] = useAtom(rowyRunAtom, globalScope); - const [currentUser] = useAtom(currentUserAtom, globalScope); + const [rowyRun] = useAtom(rowyRunAtom, projectScope); + const [currentUser] = useAtom(currentUserAtom, projectScope); const [compatibleRowyRunVersion] = useAtom( compatibleRowyRunVersionAtom, - globalScope + projectScope ); const [tableSettings] = useAtom(tableSettingsAtom, tableScope); diff --git a/src/sources/TableSourceFirestore/useBulkWriteDb.ts b/src/sources/TableSourceFirestore/useBulkWriteDb.ts index 4993f456..03726d96 100644 --- a/src/sources/TableSourceFirestore/useBulkWriteDb.ts +++ b/src/sources/TableSourceFirestore/useBulkWriteDb.ts @@ -3,7 +3,7 @@ import { useAtom, useSetAtom } from "jotai"; import { chunk, set } from "lodash-es"; import { doc, writeBatch, deleteField } from "firebase/firestore"; -import { globalScope } from "@src/atoms/globalScope"; +import { projectScope } from "@src/atoms/projectScope"; import { tableScope, _bulkWriteDbAtom } from "@src/atoms/tableScope"; import { BulkWriteFunction } from "@src/types/table"; import { firebaseDbAtom } from "@src/sources/ProjectSourceFirebase"; @@ -13,7 +13,7 @@ import { firebaseDbAtom } from "@src/sources/ProjectSourceFirebase"; */ export default function useBulkWriteDb() { // Set _bulkWriteDb function - const [firebaseDb] = useAtom(firebaseDbAtom, globalScope); + const [firebaseDb] = useAtom(firebaseDbAtom, projectScope); const setBulkWriteDb = useSetAtom(_bulkWriteDbAtom, tableScope); useEffect(() => { setBulkWriteDb( diff --git a/src/test/testUtils.tsx b/src/test/testUtils.tsx index a01286d1..97409536 100644 --- a/src/test/testUtils.tsx +++ b/src/test/testUtils.tsx @@ -20,7 +20,7 @@ import { firebaseAuthAtom, firebaseDbAtom, } from "@src/sources/ProjectSourceFirebase"; -import { currentUserAtom } from "@src/atoms/globalScope"; +import { currentUserAtom } from "@src/atoms/projectScope"; /** Initialize Firebase */ console.log("Initializing Firebase..."); @@ -31,7 +31,7 @@ const db = initializeFirestore(app, { ignoreUndefinedProperties: true }); connectFirestoreEmulator(db, "localhost", 9299); /** - * Render with Jotai `globalScope` providers + * Render with Jotai `projectScope` providers * & `ProjectSourceFirebase` component */ export const customRender = ( diff --git a/src/theme/RowyThemeProvider.tsx b/src/theme/RowyThemeProvider.tsx index 5aa69623..2b6faa52 100644 --- a/src/theme/RowyThemeProvider.tsx +++ b/src/theme/RowyThemeProvider.tsx @@ -7,11 +7,11 @@ import { useMediaQuery, ThemeProvider, CssBaseline } from "@mui/material"; import Favicon from "@src/assets/Favicon"; import { - globalScope, + projectScope, themeAtom, themeOverriddenAtom, customizedThemesAtom, -} from "@src/atoms/globalScope"; +} from "@src/atoms/projectScope"; /** * Injects the MUI theme with customizations from project and user settings. @@ -20,9 +20,9 @@ import { export default function RowyThemeProvider({ children, }: React.PropsWithChildren<{}>) { - const [theme, setTheme] = useAtom(themeAtom, globalScope); - const [themeOverridden] = useAtom(themeOverriddenAtom, globalScope); - const [customizedThemes] = useAtom(customizedThemesAtom, globalScope); + const [theme, setTheme] = useAtom(themeAtom, projectScope); + const [themeOverridden] = useAtom(themeOverriddenAtom, projectScope); + const [customizedThemes] = useAtom(customizedThemesAtom, projectScope); // Infer theme based on system settings const prefersDarkTheme = useMediaQuery("(prefers-color-scheme: dark)", { From 65fd440ec28c345d0ed390b4d6102008c0f74637 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Mon, 18 Jul 2022 20:46:36 +1000 Subject: [PATCH 034/309] restructure NavDrawer --- .../{ => NavDrawer}/CommunityMenu.tsx | 0 .../Navigation/{ => NavDrawer}/HelpMenu.tsx | 0 .../Navigation/{ => NavDrawer}/NavDrawer.tsx | 146 ++++++------------ .../NavDrawer/NavDrawerContents.tsx | 100 ++++++++++++ .../Navigation/{ => NavDrawer}/NavItem.tsx | 0 .../{ => NavDrawer}/NavTableSection.tsx | 0 .../{ => NavDrawer}/SettingsNav.tsx | 2 +- src/layouts/Navigation/NavDrawer/index.ts | 2 + src/layouts/Navigation/Navigation.tsx | 2 + 9 files changed, 151 insertions(+), 101 deletions(-) rename src/layouts/Navigation/{ => NavDrawer}/CommunityMenu.tsx (100%) rename src/layouts/Navigation/{ => NavDrawer}/HelpMenu.tsx (100%) rename src/layouts/Navigation/{ => NavDrawer}/NavDrawer.tsx (76%) create mode 100644 src/layouts/Navigation/NavDrawer/NavDrawerContents.tsx rename src/layouts/Navigation/{ => NavDrawer}/NavItem.tsx (100%) rename src/layouts/Navigation/{ => NavDrawer}/NavTableSection.tsx (100%) rename src/layouts/Navigation/{ => NavDrawer}/SettingsNav.tsx (97%) create mode 100644 src/layouts/Navigation/NavDrawer/index.ts diff --git a/src/layouts/Navigation/CommunityMenu.tsx b/src/layouts/Navigation/NavDrawer/CommunityMenu.tsx similarity index 100% rename from src/layouts/Navigation/CommunityMenu.tsx rename to src/layouts/Navigation/NavDrawer/CommunityMenu.tsx diff --git a/src/layouts/Navigation/HelpMenu.tsx b/src/layouts/Navigation/NavDrawer/HelpMenu.tsx similarity index 100% rename from src/layouts/Navigation/HelpMenu.tsx rename to src/layouts/Navigation/NavDrawer/HelpMenu.tsx diff --git a/src/layouts/Navigation/NavDrawer.tsx b/src/layouts/Navigation/NavDrawer/NavDrawer.tsx similarity index 76% rename from src/layouts/Navigation/NavDrawer.tsx rename to src/layouts/Navigation/NavDrawer/NavDrawer.tsx index a15014f0..499c9c6f 100644 --- a/src/layouts/Navigation/NavDrawer.tsx +++ b/src/layouts/Navigation/NavDrawer/NavDrawer.tsx @@ -1,6 +1,5 @@ import { useState } from "react"; -import { useAtom, useSetAtom } from "jotai"; -import { find, groupBy } from "lodash-es"; +import { useSetAtom } from "jotai"; import { colord } from "colord"; import { @@ -10,15 +9,13 @@ import { Stack, IconButton, List, + Box, ListItemIcon, ListItemText, - Divider, ListItemSecondaryAction, - Box, + Divider, } from "@mui/material"; import CloseIcon from "@mui/icons-material/MenuOpen"; -import HomeIcon from "@mui/icons-material/HomeOutlined"; -import AddIcon from "@mui/icons-material/Add"; import DocsIcon from "@mui/icons-material/LibraryBooksOutlined"; import LearningIcon from "@mui/icons-material/LocalLibraryOutlined"; import HelpIcon from "@mui/icons-material/HelpOutline"; @@ -31,24 +28,14 @@ import { import Logo from "@src/assets/Logo"; import NavItem from "./NavItem"; -import SettingsNav from "./SettingsNav"; -import NavTableSection from "./NavTableSection"; import StepsProgress from "@src/components/StepsProgress"; import CommunityMenu from "./CommunityMenu"; import HelpMenu from "./HelpMenu"; +import { INavDrawerContentsProps } from "./NavDrawerContents"; -import { - projectScope, - userSettingsAtom, - tablesAtom, - tableSettingsDialogAtom, - getStartedChecklistAtom, -} from "@src/atoms/projectScope"; -import { TableSettings } from "@src/types/table"; -import { ROUTES } from "@src/constants/routes"; +import { projectScope, getStartedChecklistAtom } from "@src/atoms/projectScope"; import { EXTERNAL_LINKS, WIKI_LINKS } from "@src/constants/externalLinks"; -import { TOP_BAR_HEIGHT } from "./TopBar"; - +import { TOP_BAR_HEIGHT } from "@src/layouts/Navigation/TopBar"; export const NAV_DRAWER_WIDTH = 256; export const NAV_DRAWER_COLLAPSED_WIDTH = 56; @@ -56,50 +43,34 @@ export interface INavDrawerProps extends DrawerProps { open: boolean; isPermanent: boolean; onClose: NonNullable; + Contents: React.ComponentType; } export default function NavDrawer({ open, isPermanent, onClose, + Contents, }: INavDrawerProps) { - const [tables] = useAtom(tablesAtom, projectScope); - const [userSettings] = useAtom(userSettingsAtom, projectScope); - const openTableSettingsDialog = useSetAtom( - tableSettingsDialogAtom, - projectScope - ); - const openGetStartedChecklist = useSetAtom( - getStartedChecklistAtom, - projectScope - ); - - const [hover, setHover] = useState(false); - const [communityMenuAnchorEl, setCommunityMenuAnchorEl] = - useState(null); - const [helpMenuAnchorEl, setHelpMenuAnchorEl] = - useState(null); - - const menuOpen = communityMenuAnchorEl || helpMenuAnchorEl; - - const favorites = Array.isArray(userSettings.favoriteTables) - ? userSettings.favoriteTables - : []; - const sections = { - Favorites: favorites - .map((id) => find(tables, { id })) - .filter((x) => x !== undefined) as TableSettings[], - ...groupBy(tables, "section"), - }; - + const [hover, setHover] = useState(false); const collapsed = !open && isPermanent; - const tempExpanded = (hover || menuOpen) && collapsed; + const tempExpanded = hover && collapsed; const width = collapsed && !tempExpanded ? NAV_DRAWER_COLLAPSED_WIDTH : NAV_DRAWER_WIDTH; const closeDrawer = isPermanent ? undefined : (e: {}) => onClose(e, "escapeKeyDown"); + const openGetStartedChecklist = useSetAtom( + getStartedChecklistAtom, + projectScope + ); + + const [communityMenuAnchorEl, setCommunityMenuAnchorEl] = + useState(null); + const [helpMenuAnchorEl, setHelpMenuAnchorEl] = + useState(null); + const externalLinkIcon = ( @@ -188,8 +159,10 @@ export default function NavDrawer({ ]} PaperProps={{ elevation: isPermanent ? 0 : 8, - onMouseEnter: () => setHover(true), - onMouseLeave: () => setHover(false), + onMouseEnter: () => + setHover((h) => (h === "persist" ? "persist" : true)), + onMouseLeave: () => + setHover((h) => (h === "persist" ? "persist" : false)), }} > {!isPermanent && ( @@ -230,51 +203,14 @@ export default function NavDrawer({ backgroundColor: "var(--nav-bg)", }} > -
  • - - - - - - -
  • - - - - - {sections && - Object.entries(sections) - .filter(([, tables]) => tables.length > 0) - .map(([section, tables]) => ( - - ))} - -
  • - { - if (closeDrawer) closeDrawer(e); - openTableSettingsDialog({}); - }} - sx={{ mb: 1 }} - > - - - - - -
  • - - setCommunityMenuAnchorEl(e.currentTarget) - } + onClick={(e: any) => { + setCommunityMenuAnchorEl(e.currentTarget); + setHover("persist"); + }} > @@ -370,13 +307,19 @@ export default function NavDrawer({ setCommunityMenuAnchorEl(null)} + onClose={() => { + setCommunityMenuAnchorEl(null); + setHover(false); + }} />
  • setHelpMenuAnchorEl(e.currentTarget)} + onClick={(e: any) => { + setHelpMenuAnchorEl(e.currentTarget); + setHover("persist"); + }} > @@ -388,7 +331,10 @@ export default function NavDrawer({ setHelpMenuAnchorEl(null)} + onClose={() => { + setHelpMenuAnchorEl(null); + setHover(false); + }} />
  • diff --git a/src/layouts/Navigation/NavDrawer/NavDrawerContents.tsx b/src/layouts/Navigation/NavDrawer/NavDrawerContents.tsx new file mode 100644 index 00000000..75214827 --- /dev/null +++ b/src/layouts/Navigation/NavDrawer/NavDrawerContents.tsx @@ -0,0 +1,100 @@ +import { useAtom, useSetAtom } from "jotai"; +import { find, groupBy } from "lodash-es"; + +import { ListItemIcon, ListItemText, Divider } from "@mui/material"; +import HomeIcon from "@mui/icons-material/HomeOutlined"; +import AddIcon from "@mui/icons-material/Add"; + +import NavItem from "./NavItem"; +import SettingsNav from "./SettingsNav"; +import NavTableSection from "./NavTableSection"; + +import { + projectScope, + userSettingsAtom, + tablesAtom, + tableSettingsDialogAtom, +} from "@src/atoms/projectScope"; +import { TableSettings } from "@src/types/table"; +import { ROUTES } from "@src/constants/routes"; + +export interface INavDrawerContentsProps { + closeDrawer: ((e: {}) => void) | undefined; + open: boolean; + isPermanent: boolean; + tempExpanded: boolean; + setHover: React.Dispatch>; +} + +export default function NavDrawerContents({ + closeDrawer, + open, + isPermanent, + tempExpanded, +}: INavDrawerContentsProps) { + const [tables] = useAtom(tablesAtom, projectScope); + const [userSettings] = useAtom(userSettingsAtom, projectScope); + const openTableSettingsDialog = useSetAtom( + tableSettingsDialogAtom, + projectScope + ); + + const favorites = Array.isArray(userSettings.favoriteTables) + ? userSettings.favoriteTables + : []; + const sections = { + Favorites: favorites + .map((id) => find(tables, { id })) + .filter((x) => x !== undefined) as TableSettings[], + ...groupBy(tables, "section"), + }; + + return ( + <> +
  • + + + + + + +
  • + + + + + + {sections && + Object.entries(sections) + .filter(([, tables]) => tables.length > 0) + .map(([section, tables]) => ( + + ))} + +
  • + { + if (closeDrawer) closeDrawer(e); + openTableSettingsDialog({}); + }} + sx={{ mb: 1 }} + > + + + + + +
  • + + ); +} diff --git a/src/layouts/Navigation/NavItem.tsx b/src/layouts/Navigation/NavDrawer/NavItem.tsx similarity index 100% rename from src/layouts/Navigation/NavItem.tsx rename to src/layouts/Navigation/NavDrawer/NavItem.tsx diff --git a/src/layouts/Navigation/NavTableSection.tsx b/src/layouts/Navigation/NavDrawer/NavTableSection.tsx similarity index 100% rename from src/layouts/Navigation/NavTableSection.tsx rename to src/layouts/Navigation/NavDrawer/NavTableSection.tsx diff --git a/src/layouts/Navigation/SettingsNav.tsx b/src/layouts/Navigation/NavDrawer/SettingsNav.tsx similarity index 97% rename from src/layouts/Navigation/SettingsNav.tsx rename to src/layouts/Navigation/NavDrawer/SettingsNav.tsx index e54076c6..dc1dc0f1 100644 --- a/src/layouts/Navigation/SettingsNav.tsx +++ b/src/layouts/Navigation/NavDrawer/SettingsNav.tsx @@ -14,7 +14,7 @@ import SettingsIcon from "@mui/icons-material/SettingsOutlined"; import { ChevronDown } from "@src/assets/icons"; import NavItem from "./NavItem"; -import UpdateCheckBadge from "./UpdateCheckBadge"; +import UpdateCheckBadge from "@src/layouts/Navigation/UpdateCheckBadge"; import { projectScope, userRolesAtom } from "@src/atoms/projectScope"; import { ROUTES } from "@src/constants/routes"; diff --git a/src/layouts/Navigation/NavDrawer/index.ts b/src/layouts/Navigation/NavDrawer/index.ts new file mode 100644 index 00000000..9e0fc9f1 --- /dev/null +++ b/src/layouts/Navigation/NavDrawer/index.ts @@ -0,0 +1,2 @@ +export * from "./NavDrawer"; +export { default } from "./NavDrawer"; diff --git a/src/layouts/Navigation/Navigation.tsx b/src/layouts/Navigation/Navigation.tsx index 332313bd..f17053a1 100644 --- a/src/layouts/Navigation/Navigation.tsx +++ b/src/layouts/Navigation/Navigation.tsx @@ -7,6 +7,7 @@ import { useMediaQuery, Stack, GlobalStyles } from "@mui/material"; import TopBar, { TOP_BAR_HEIGHT } from "./TopBar"; import NavDrawer from "./NavDrawer"; +import NavDrawerContents from "./NavDrawer/NavDrawerContents"; import ErrorFallback, { IErrorFallbackProps, } from "@src/components/ErrorFallback"; @@ -51,6 +52,7 @@ export default function Navigation({ children }: React.PropsWithChildren<{}>) { open={open} isPermanent={isPermanent} onClose={() => setOpen(false)} + Contents={NavDrawerContents} /> From d54115c9960205b13e5019175dca2417a4694d0d Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Wed, 20 Jul 2022 14:50:23 +1000 Subject: [PATCH 035/309] sync changes with rowy.app --- src/components/AccessDenied.tsx | 1 + src/components/ErrorFallback.tsx | 48 ++++++++++++------- .../NavDrawer/NavDrawerContents.tsx | 6 +-- .../Navigation/NavDrawer/NavTableSection.tsx | 2 +- src/pages/NotFoundPage.tsx | 7 ++- src/theme/components.tsx | 6 +++ 6 files changed, 45 insertions(+), 25 deletions(-) diff --git a/src/components/AccessDenied.tsx b/src/components/AccessDenied.tsx index fbc0b81f..792e9af3 100644 --- a/src/components/AccessDenied.tsx +++ b/src/components/AccessDenied.tsx @@ -31,6 +31,7 @@ export default function AccessDenied({ resetErrorBoundary }: FallbackProps) { return ( { - if (errorPathname !== location.pathname) resetErrorBoundary(); - }, [errorPathname, location.pathname, resetErrorBoundary]); - if ((error as any).code === "permission-denied") return ( @@ -38,13 +31,17 @@ export default function ErrorFallback({ message: "Something went wrong", description: ( <> - + {(error as any).code && {(error as any).code}: } {error.message} - + } style={{ marginTop: -TOP_BAR_HEIGHT }} diff --git a/src/theme/components.tsx b/src/theme/components.tsx index 342a92ea..6cf7c4ca 100644 --- a/src/theme/components.tsx +++ b/src/theme/components.tsx @@ -1339,6 +1339,12 @@ export const components = (theme: Theme): ThemeOptions => { }, }, + MuiSkeleton: { + styleOverrides: { + rectangular: { borderRadius: theme.shape.borderRadius }, + }, + }, + MuiRating: { styleOverrides: { iconFilled: { color: theme.palette.text.secondary }, From b641af8c8fd5750f805d7daf6241190d8c889d30 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Wed, 20 Jul 2022 14:51:17 +1000 Subject: [PATCH 036/309] fix nav items not accessible with Tab --- src/layouts/Navigation/NavItem.tsx | 46 ++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 15 deletions(-) diff --git a/src/layouts/Navigation/NavItem.tsx b/src/layouts/Navigation/NavItem.tsx index c33bf6f3..23f53138 100644 --- a/src/layouts/Navigation/NavItem.tsx +++ b/src/layouts/Navigation/NavItem.tsx @@ -1,29 +1,45 @@ import { Link, useLocation } from "react-router-dom"; import { MenuItem, MenuItemProps } from "@mui/material"; +import { spreadSx } from "@src/utils/ui"; -export default function NavItem(props: MenuItemProps) { +const linkProps = { target: "_blank", rel: "noopener noreferrer" }; + +export default function NavItem( + props: MenuItemProps +) { const { pathname } = useLocation(); return ( ); } From d6395dffffb7472dc70e5b527e379bde5432424d Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Wed, 20 Jul 2022 15:08:33 +1000 Subject: [PATCH 037/309] =?UTF-8?q?Percentage:=20don=E2=80=99t=20display?= =?UTF-8?q?=20if=20value=20null=20or=20undefined?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fields/Percentage/BasicCell.tsx | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/components/fields/Percentage/BasicCell.tsx b/src/components/fields/Percentage/BasicCell.tsx index c2dbef58..5f6228aa 100644 --- a/src/components/fields/Percentage/BasicCell.tsx +++ b/src/components/fields/Percentage/BasicCell.tsx @@ -5,17 +5,19 @@ import { useTheme } from "@mui/material"; export default function Percentage({ value }: IBasicCellProps) { const theme = useTheme(); + if (value === null || value === undefined) return null; + const percentage = typeof value === "number" ? value : 0; return ( -
    - {Math.round(percentage * 100)}% -
    +
    + {Math.round(percentage * 100)}% +
    ); } From 91b110dcb26ab53eb942eece030a24020b111cc5 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Wed, 20 Jul 2022 15:19:00 +1000 Subject: [PATCH 038/309] fix NavDrawer causing compile to fail --- src/layouts/Navigation/NavDrawer.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layouts/Navigation/NavDrawer.tsx b/src/layouts/Navigation/NavDrawer.tsx index cabc1c66..f68cdfdf 100644 --- a/src/layouts/Navigation/NavDrawer.tsx +++ b/src/layouts/Navigation/NavDrawer.tsx @@ -232,7 +232,7 @@ export default function NavDrawer({ {...({ component: "button" } as any)} style={{ textAlign: "left" }} sx={{ mb: 1 }} - onClick={(e) => { + onClick={(e: any) => { if (closeDrawer) closeDrawer(e); openTableSettingsDialog({}); }} From 38d422c0cb57e1eb990b34f7ab2dfa79ecb46f30 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Wed, 20 Jul 2022 15:19:24 +1000 Subject: [PATCH 039/309] bump workspaces to v3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d646de6f..a6bc52bf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rowy", - "version": "2.7.0-alpha", + "version": "3.0.0-alpha", "homepage": "https://rowy.io", "repository": { "type": "git", From f4b50f31befb9c5f85c38a46fce0664fcf614931 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Wed, 20 Jul 2022 16:12:57 +1000 Subject: [PATCH 040/309] fix NavDrawer hover state being updated when unused --- src/layouts/Navigation/NavDrawer/NavDrawer.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/layouts/Navigation/NavDrawer/NavDrawer.tsx b/src/layouts/Navigation/NavDrawer/NavDrawer.tsx index 499c9c6f..ef95c7ee 100644 --- a/src/layouts/Navigation/NavDrawer/NavDrawer.tsx +++ b/src/layouts/Navigation/NavDrawer/NavDrawer.tsx @@ -52,9 +52,11 @@ export default function NavDrawer({ onClose, Contents, }: INavDrawerProps) { - const [hover, setHover] = useState(false); + const [hover, _setHover] = useState(false); const collapsed = !open && isPermanent; + const setHover = collapsed ? _setHover : () => {}; const tempExpanded = hover && collapsed; + const width = collapsed && !tempExpanded ? NAV_DRAWER_COLLAPSED_WIDTH : NAV_DRAWER_WIDTH; const closeDrawer = isPermanent From d8c7b15ccc054fff6990824c9f9d41b3185fbf13 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Jul 2022 06:17:13 +0000 Subject: [PATCH 041/309] Bump terser from 5.12.1 to 5.14.2 Bumps [terser](https://github.com/terser/terser) from 5.12.1 to 5.14.2. - [Release notes](https://github.com/terser/terser/releases) - [Changelog](https://github.com/terser/terser/blob/master/CHANGELOG.md) - [Commits](https://github.com/terser/terser/commits) --- updated-dependencies: - dependency-name: terser dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 74 ++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 48 insertions(+), 26 deletions(-) diff --git a/yarn.lock b/yarn.lock index b6d9a423..fa729f4e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2822,15 +2822,37 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" +"@jridgewell/gen-mapping@^0.3.0": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/resolve-uri@^3.0.3": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz#68eb521368db76d040a6315cdb24bf2483037b9c" - integrity sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew== + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/source-map@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" + integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" "@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.11" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz#771a1d8d744eeb71b6adb35808e1a6c7b9b8c8ec" - integrity sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg== + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== "@jridgewell/trace-mapping@^0.3.0": version "0.3.4" @@ -2840,6 +2862,14 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" +"@jridgewell/trace-mapping@^0.3.9": + version "0.3.14" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed" + integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@leichtgewicht/ip-codec@^2.0.1": version "2.0.3" resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.3.tgz#0300943770e04231041a51bd39f0439b5c7ab4f0" @@ -4404,9 +4434,9 @@ acorn@^7.0.0, acorn@^7.1.1: integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.0: - version "8.7.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" - integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== + version "8.7.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" + integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== address@^1.0.1, address@^1.1.2: version "1.1.2" @@ -5062,9 +5092,9 @@ buffer-equal@0.0.1: integrity sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs= buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== buffer@^6.0.3: version "6.0.3" @@ -12373,15 +12403,7 @@ source-map-resolve@^0.6.0: atob "^2.1.2" decode-uri-component "^0.2.0" -source-map-support@^0.5.6: - version "0.5.19" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" - integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-support@~0.5.20: +source-map-support@^0.5.6, source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -12399,7 +12421,7 @@ source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= -source-map@^0.7.3, source-map@~0.7.2: +source-map@^0.7.3: version "0.7.3" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== @@ -12890,13 +12912,13 @@ terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.2.5: terser "^5.7.2" terser@^5.0.0, terser@^5.10.0, terser@^5.7.2: - version "5.12.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.12.1.tgz#4cf2ebed1f5bceef5c83b9f60104ac4a78b49e9c" - integrity sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ== + version "5.14.2" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.14.2.tgz#9ac9f22b06994d736174f4091aa368db896f1c10" + integrity sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA== dependencies: + "@jridgewell/source-map" "^0.3.2" acorn "^8.5.0" commander "^2.20.0" - source-map "~0.7.2" source-map-support "~0.5.20" test-exclude@^6.0.0: From 52e408ce8c2c14a4e12f103855499c1afc6fa793 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Thu, 21 Jul 2022 16:39:53 +1000 Subject: [PATCH 042/309] nav updates --- package.json | 3 + src/components/EmojiAvatar.tsx | 66 ++++++++ .../Settings/UserManagement/UserItem.tsx | 8 +- src/hooks/useScrollToHash.ts | 51 ++++++ .../Navigation/NavDrawer/CommunityMenu.tsx | 2 +- src/layouts/Navigation/NavDrawer/HelpMenu.tsx | 2 +- .../Navigation/NavDrawer/NavDrawer.tsx | 4 +- src/layouts/Navigation/NavDrawer/NavItem.tsx | 22 ++- src/pages/Settings/DebugSettingsPage.tsx | 2 + src/pages/Settings/ProjectSettingsPage.tsx | 2 + src/pages/Settings/UserSettingsPage.tsx | 2 + src/pages/TablesPage.tsx | 3 + yarn.lock | 152 +++++++++++++++++- 13 files changed, 308 insertions(+), 11 deletions(-) create mode 100644 src/components/EmojiAvatar.tsx create mode 100644 src/hooks/useScrollToHash.ts diff --git a/package.json b/package.json index a6bc52bf..b224e159 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "jszip": "^3.10.0", "lodash-es": "^4.17.21", "match-sorter": "^6.3.1", + "material-ui-popup-state": "^4.0.1", "mdi-material-ui": "^7.3.0", "monaco-editor-auto-typings": "^0.4.0", "notistack": "^2.0.4", @@ -64,6 +65,7 @@ "react-scripts": "^5.0.0", "react-usestateref": "^1.0.8", "remark-gfm": "^3.0.1", + "seedrandom": "^3.0.5", "stream-browserify": "^3.0.0", "swr": "^1.3.0", "tinymce": "^5", @@ -159,6 +161,7 @@ "@types/react-dom": "^18.0.0", "@types/react-router-dom": "^5.3.3", "@types/react-router-hash-link": "^2.4.5", + "@types/seedrandom": "^3.0.2", "@typescript-eslint/parser": "^5.18.0", "craco-alias": "^3.0.1", "craco-swc": "^0.5.1", diff --git a/src/components/EmojiAvatar.tsx b/src/components/EmojiAvatar.tsx new file mode 100644 index 00000000..ea11a4b2 --- /dev/null +++ b/src/components/EmojiAvatar.tsx @@ -0,0 +1,66 @@ +import seedrandom from "seedrandom"; +import { colord } from "colord"; + +import { useTheme, Avatar, AvatarProps } from "@mui/material"; +import { spreadSx } from "@src/utils/ui"; + +export interface IEmojiAvatarProps extends Partial { + bgColor?: string; + emoji?: string; + fallback: string; + size?: number; +} + +export default function EmojiAvatar({ + bgColor, + emoji, + fallback, + children, + size = 40, + ...props +}: IEmojiAvatarProps) { + const theme = useTheme(); + const darkMode = theme.palette.mode === "dark"; + + const bgcolor = bgColor || generateRandomColor(fallback, darkMode); + const bgcolorLch = colord(bgcolor).toLch(); + const textColor = colord({ + l: + bgcolorLch.l > 50 + ? Math.max(bgcolorLch.l - 50, 0) + : Math.min(bgcolorLch.l + 50, 100), + c: 30, + h: bgcolorLch.h, + }).toHslString(); + + return ( + + {children || + emoji || + fallback + .split(" ") + .slice(0, 2) + .map((s) => s.slice(0, 1)) + .join("")} + + ); +} + +const generateRandomColor = (seed: string, darkMode: boolean) => { + const rng = seedrandom(seed); + const color = colord({ l: darkMode ? 30 : 90, c: 15, h: rng() * 360 }); + return color.toHslString(); +}; diff --git a/src/components/Settings/UserManagement/UserItem.tsx b/src/components/Settings/UserManagement/UserItem.tsx index 5415088c..53e0b26b 100644 --- a/src/components/Settings/UserManagement/UserItem.tsx +++ b/src/components/Settings/UserManagement/UserItem.tsx @@ -15,6 +15,7 @@ import { Copy as CopyIcon } from "@src/assets/icons"; import DeleteIcon from "@mui/icons-material/DeleteOutlined"; import MultiSelect from "@rowy/multiselect"; +import EmojiAvatar from "@src/components/EmojiAvatar"; import { projectScope, @@ -72,9 +73,10 @@ export default function UserItem({ const listItemChildren = ( <> - - {user?.displayName ? user.displayName[0] : undefined} - + { + if (hash) { + const id = hash.replace("#", ""); + const element = document.getElementById(id); + + if (element) { + element.scrollIntoView(); + + /** + * From rafgraph/react-router-hash-link + * https://github.com/rafgraph/react-router-hash-link/blob/2084a987b2f34479005ffbcb16ab7b9dc1fd6c93/src/HashLink.jsx + * + * Copyright (c) 2017 Rafael Pedicini, MIT License + */ + + let originalTabIndex = element.getAttribute("tabindex"); + if (originalTabIndex === null && !isInteractiveElement(element)) { + element.setAttribute("tabindex", "-1"); + } + element.focus({ preventScroll: true }); + if (originalTabIndex === null && !isInteractiveElement(element)) { + element.removeAttribute("tabindex"); + } + } + } + }, [pathname, hash]); +} + +export default useScrollToHash; + +/** + * From rafgraph/react-router-hash-link + * https://github.com/rafgraph/react-router-hash-link/blob/2084a987b2f34479005ffbcb16ab7b9dc1fd6c93/src/HashLink.jsx + * + * Copyright (c) 2017 Rafael Pedicini, MIT License + */ +function isInteractiveElement(element: HTMLElement) { + const formTags = ["BUTTON", "INPUT", "SELECT", "TEXTAREA"]; + const linkTags = ["A", "AREA"]; + return ( + (formTags.includes(element.tagName) && !element.hasAttribute("disabled")) || + (linkTags.includes(element.tagName) && element.hasAttribute("href")) + ); +} diff --git a/src/layouts/Navigation/NavDrawer/CommunityMenu.tsx b/src/layouts/Navigation/NavDrawer/CommunityMenu.tsx index ec68e76a..5d027992 100644 --- a/src/layouts/Navigation/NavDrawer/CommunityMenu.tsx +++ b/src/layouts/Navigation/NavDrawer/CommunityMenu.tsx @@ -38,7 +38,7 @@ export default function HelpMenu({ anchorOrigin={{ vertical: "bottom", horizontal: "right" }} transformOrigin={{ vertical: "bottom", horizontal: "left" }} sx={{ "& .MuiPaper-root": { mt: 1.5, py: 1 } }} - PaperProps={{ elevation: 10 }} + PaperProps={{ elevation: 12 }} > (false); + const [hover, _setHover] = useState(false); const collapsed = !open && isPermanent; + const setHover = collapsed ? _setHover : () => {}; const tempExpanded = hover && collapsed; + const width = collapsed && !tempExpanded ? NAV_DRAWER_COLLAPSED_WIDTH : NAV_DRAWER_WIDTH; const closeDrawer = isPermanent diff --git a/src/layouts/Navigation/NavDrawer/NavItem.tsx b/src/layouts/Navigation/NavDrawer/NavItem.tsx index 23f53138..5174f11c 100644 --- a/src/layouts/Navigation/NavDrawer/NavItem.tsx +++ b/src/layouts/Navigation/NavDrawer/NavItem.tsx @@ -1,19 +1,33 @@ import { Link, useLocation } from "react-router-dom"; +import { HashLink } from "react-router-hash-link"; + import { MenuItem, MenuItemProps } from "@mui/material"; import { spreadSx } from "@src/utils/ui"; const linkProps = { target: "_blank", rel: "noopener noreferrer" }; -export default function NavItem( - props: MenuItemProps -) { +type NavItemComponent = typeof HashLink | typeof Link | "a" | "button"; + +export default function NavItem(props: MenuItemProps) { const { pathname } = useLocation(); + let component: NavItemComponent = "button"; + if ("to" in props) { + component = Link; + if ( + typeof props.to === "string" ? props.to.includes("#") : !!props.to.hash + ) { + component = HashLink; + } + } else if ("href" in props) { + component = "a"; + } + return ( ; @@ -35,6 +36,7 @@ export default function DebugSettingsPage() { const [users] = useAtom(allUsersAtom, projectScope); const [updateUser] = useAtom(updateUserAtom, projectScope); const { enqueueSnackbar, closeSnackbar } = useSnackbar(); + useScrollToHash(); return ( diff --git a/src/pages/Settings/ProjectSettingsPage.tsx b/src/pages/Settings/ProjectSettingsPage.tsx index a8454954..96f0e93c 100644 --- a/src/pages/Settings/ProjectSettingsPage.tsx +++ b/src/pages/Settings/ProjectSettingsPage.tsx @@ -18,6 +18,7 @@ import { publicSettingsAtom, updatePublicSettingsAtom, } from "@src/atoms/projectScope"; +import { useScrollToHash } from "@src/hooks/useScrollToHash"; export interface IProjectSettingsChildProps { settings: Record; @@ -31,6 +32,7 @@ export default function ProjectSettingsPage() { const [publicSettings] = useAtom(publicSettingsAtom, projectScope); const { enqueueSnackbar } = useSnackbar(); + useScrollToHash(); const [_updateProjectSettingsDoc] = useAtom( updateProjectSettingsAtom, diff --git a/src/pages/Settings/UserSettingsPage.tsx b/src/pages/Settings/UserSettingsPage.tsx index 53536a2b..be4d43ec 100644 --- a/src/pages/Settings/UserSettingsPage.tsx +++ b/src/pages/Settings/UserSettingsPage.tsx @@ -17,6 +17,7 @@ import { userSettingsAtom, updateUserSettingsAtom, } from "@src/atoms/projectScope"; +import { useScrollToHash } from "@src/hooks/useScrollToHash"; export interface IUserSettingsChildProps { settings: Record; @@ -27,6 +28,7 @@ export default function UserSettingsPage() { const [currentUser] = useAtom(currentUserAtom, projectScope); const [userSettings] = useAtom(userSettingsAtom, projectScope); const { enqueueSnackbar } = useSnackbar(); + useScrollToHash(); const [_updateUserSettings] = useAtom(updateUserSettingsAtom, projectScope); const updateSettings = useDebouncedCallback((data) => { diff --git a/src/pages/TablesPage.tsx b/src/pages/TablesPage.tsx index ea133c07..4c914754 100644 --- a/src/pages/TablesPage.tsx +++ b/src/pages/TablesPage.tsx @@ -40,6 +40,7 @@ import { TableSettings } from "@src/types/table"; import { ROUTES } from "@src/constants/routes"; import useBasicSearch from "@src/hooks/useBasicSearch"; import { TOP_BAR_HEIGHT } from "@src/layouts/Navigation/TopBar"; +import { useScrollToHash } from "@src/hooks/useScrollToHash"; const SEARCH_KEYS = ["id", "name", "section", "description"]; @@ -54,6 +55,8 @@ export default function HomePage() { projectScope ); + useScrollToHash(); + const [results, query, handleQuery] = useBasicSearch( tables ?? [], SEARCH_KEYS diff --git a/yarn.lock b/yarn.lock index da7f9913..b6edf05b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2096,6 +2096,17 @@ "@emotion/weak-memoize" "^0.2.5" stylis "4.0.13" +"@emotion/cache@^11.9.3": + version "11.9.3" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.9.3.tgz#96638449f6929fd18062cfe04d79b29b44c0d6cb" + integrity sha512-0dgkI/JKlCXa+lEXviaMtGBL0ynpx4osh7rjOXE71q9bIF8G+XhJgvi+wDu0B0IdCVx37BffiwXlN9I3UuzFvg== + dependencies: + "@emotion/memoize" "^0.7.4" + "@emotion/sheet" "^1.1.1" + "@emotion/utils" "^1.0.0" + "@emotion/weak-memoize" "^0.2.5" + stylis "4.0.13" + "@emotion/hash@^0.8.0": version "0.8.0" resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" @@ -2108,6 +2119,13 @@ dependencies: "@emotion/memoize" "^0.7.4" +"@emotion/is-prop-valid@^1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.1.3.tgz#f0907a416368cf8df9e410117068e20fe87c0a3a" + integrity sha512-RFg04p6C+1uO19uG8N+vqanzKqiM9eeV1LDOG3bmkYmuOj7NbKNlFC/4EZq5gnwAIlcC/jOT24f8Td0iax2SXA== + dependencies: + "@emotion/memoize" "^0.7.4" + "@emotion/memoize@^0.7.4", "@emotion/memoize@^0.7.5": version "0.7.5" resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.5.tgz#2c40f81449a4e554e9fc6396910ed4843ec2be50" @@ -2153,6 +2171,11 @@ resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.1.0.tgz#56d99c41f0a1cda2726a05aa6a20afd4c63e58d2" integrity sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g== +"@emotion/sheet@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.1.1.tgz#015756e2a9a3c7c5f11d8ec22966a8dbfbfac787" + integrity sha512-J3YPccVRMiTZxYAY0IOq3kd+hUP8idY8Kz6B/Cyo+JuXq52Ek+zbPbSQUrVQp95aJ+lsAW7DPL1P2Z+U1jGkKA== + "@emotion/styled@^11.8.1": version "11.8.1" resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.8.1.tgz#856f6f63aceef0eb783985fa2322e2bf66d04e17" @@ -2902,6 +2925,20 @@ prop-types "^15.7.2" react-is "^17.0.2" +"@mui/base@5.0.0-alpha.90": + version "5.0.0-alpha.90" + resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-alpha.90.tgz#73700ba74e5c75096ee5d0bfe3ba4a3b3b81beef" + integrity sha512-hNKwzr+RkiuGsGrakz8Q2i5ezr4Dz4b4Qsdipt9SiMrhuFAra/i501VSaEIzwec9LC4G+vtW4fE7yJBB0XaAYw== + dependencies: + "@babel/runtime" "^7.17.2" + "@emotion/is-prop-valid" "^1.1.3" + "@mui/types" "^7.1.4" + "@mui/utils" "^5.9.1" + "@popperjs/core" "^2.11.5" + clsx "^1.2.1" + prop-types "^15.8.1" + react-is "^18.2.0" + "@mui/icons-material@5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-5.6.0.tgz#bce757f7c7a8eb31b238311a15fa0a0bcdf9ec39" @@ -2943,6 +2980,23 @@ react-is "^17.0.2" react-transition-group "^4.4.2" +"@mui/material@^5.0.0": + version "5.9.1" + resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.9.1.tgz#92990e6d4035792430dcf548b91db6f335aebdd3" + integrity sha512-c09SbaMm7Rl7Df9JRkXwPWNbnfrutmHERTJC46OJ9OMAM9+HGQihIbGln1k2Xj65jb3E+G498FZFAoSrrBDvwQ== + dependencies: + "@babel/runtime" "^7.17.2" + "@mui/base" "5.0.0-alpha.90" + "@mui/system" "^5.9.1" + "@mui/types" "^7.1.4" + "@mui/utils" "^5.9.1" + "@types/react-transition-group" "^4.4.5" + clsx "^1.2.1" + csstype "^3.1.0" + prop-types "^15.8.1" + react-is "^18.2.0" + react-transition-group "^4.4.2" + "@mui/private-theming@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.6.0.tgz#b907e055a0a19caf554d5b43209a143edaa9b398" @@ -2952,6 +3006,15 @@ "@mui/utils" "^5.6.0" prop-types "^15.7.2" +"@mui/private-theming@^5.9.1": + version "5.9.1" + resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.9.1.tgz#4f714ed9ebd587373dc77b3fc69e9f3e720f0190" + integrity sha512-eIh2IZJInNTdgPLMo9cruzm8UDX5amBBxxsSoNre7lRj3wcsu3TG5OKjIbzkf4VxHHEhdPeNNQyt92k7L78u2A== + dependencies: + "@babel/runtime" "^7.17.2" + "@mui/utils" "^5.9.1" + prop-types "^15.8.1" + "@mui/styled-engine@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-5.6.0.tgz#c7c34d2e319158559cef49b796457a4e6a4c58f7" @@ -2961,6 +3024,16 @@ "@emotion/cache" "^11.7.1" prop-types "^15.7.2" +"@mui/styled-engine@^5.8.7": + version "5.8.7" + resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-5.8.7.tgz#63d0779c07677fe76d4705a02c7ae99f89b50780" + integrity sha512-tVqtowjbYmiRq+qcqXK731L9eWoL9H8xTRhuTgaDGKdch1zlt4I2UwInUe1w2N9N/u3/jHsFbLcl1Un3uOwpQg== + dependencies: + "@babel/runtime" "^7.17.2" + "@emotion/cache" "^11.9.3" + csstype "^3.1.0" + prop-types "^15.8.1" + "@mui/styles@5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@mui/styles/-/styles-5.6.0.tgz#c57b80974ca31c980acdd58d13b21d46fbcd81cf" @@ -2998,11 +3071,30 @@ csstype "^3.0.11" prop-types "^15.7.2" +"@mui/system@^5.9.1": + version "5.9.1" + resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.9.1.tgz#dadd1094b1582781cc524b112a0a126f60b23c25" + integrity sha512-ZixTmc2+sYp++avoYJ38eM70nfwwudN06vYCU4kfwa4nQPiH+bhLYZnfYkcXRKiDR/hfT0dptbOOfQGZqBYczQ== + dependencies: + "@babel/runtime" "^7.17.2" + "@mui/private-theming" "^5.9.1" + "@mui/styled-engine" "^5.8.7" + "@mui/types" "^7.1.4" + "@mui/utils" "^5.9.1" + clsx "^1.2.1" + csstype "^3.1.0" + prop-types "^15.8.1" + "@mui/types@^7.1.3": version "7.1.3" resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.1.3.tgz#d7636f3046110bcccc63e6acfd100e2ad9ca712a" integrity sha512-DDF0UhMBo4Uezlk+6QxrlDbchF79XG6Zs0zIewlR4c0Dt6GKVFfUtzPtHCH1tTbcSlq/L2bGEdiaoHBJ9Y1gSA== +"@mui/types@^7.1.4": + version "7.1.4" + resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.1.4.tgz#4185c05d6df63ec673cda15feab80440abadc764" + integrity sha512-uveM3byMbthO+6tXZ1n2zm0W3uJCQYtwt/v5zV5I77v2v18u0ITkb8xwhsDD2i3V2Kye7SaNR6FFJ6lMuY/WqQ== + "@mui/utils@^5.2.3", "@mui/utils@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.6.0.tgz#0ec741f5ac7c89ac76054832bed2d6e17ab1c011" @@ -3025,6 +3117,17 @@ prop-types "^15.8.1" react-is "^17.0.2" +"@mui/utils@^5.9.1": + version "5.9.1" + resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.9.1.tgz#2b2c9dadbf8ba6561e145b5688fb7df5ef15a934" + integrity sha512-8+4adOR3xusyJwvbnZxcjqcmbWvl7Og+260ZKIrSvwnFs0aLubL+8MhiceeDDGcmb0bTKxfUgRJ96j32Jb7P+A== + dependencies: + "@babel/runtime" "^7.17.2" + "@types/prop-types" "^15.7.5" + "@types/react-is" "^16.7.1 || ^17.0.0" + prop-types "^15.8.1" + react-is "^18.2.0" + "@mui/x-date-pickers@5.0.0-alpha.0": version "5.0.0-alpha.0" resolved "https://registry.yarnpkg.com/@mui/x-date-pickers/-/x-date-pickers-5.0.0-alpha.0.tgz#a62ffbab453d3c2dcd4ec20bd4f3f6338ad2ed3f" @@ -3092,7 +3195,7 @@ schema-utils "^3.0.0" source-map "^0.7.3" -"@popperjs/core@^2.11.4": +"@popperjs/core@^2.11.4", "@popperjs/core@^2.11.5": version "2.11.5" resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.5.tgz#db5a11bf66bdab39569719555b0f76e138d7bd64" integrity sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw== @@ -3983,6 +4086,13 @@ dependencies: "@types/react" "*" +"@types/react-transition-group@^4.4.5": + version "4.4.5" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.5.tgz#aae20dcf773c5aa275d5b9f7cdbca638abc5e416" + integrity sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA== + dependencies: + "@types/react" "*" + "@types/react@*", "@types/react@^18", "@types/react@^18.0.5": version "18.0.5" resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.5.tgz#1a4d4b705ae6af5aed369dec22800b20f89f5301" @@ -4009,6 +4119,11 @@ resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== +"@types/seedrandom@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/seedrandom/-/seedrandom-3.0.2.tgz#7f30db28221067a90b02e73ffd46b6685b18df1a" + integrity sha512-YPLqEOo0/X8JU3rdiq+RgUKtQhQtrppE766y7vMTu8dGML7TVtZNiiiaC/hhU9Zqw9UYopXxhuWWENclMVBwKQ== + "@types/serve-index@^1.9.1": version "1.9.1" resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278" @@ -5242,6 +5357,11 @@ cjs-module-lexer@^1.0.0: resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== +classnames@^2.2.6: + version "2.3.1" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" + integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== + clean-css@^5.2.2: version "5.3.0" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.0.tgz#ad3d8238d5f3549e83d5f87205189494bc7cbb59" @@ -5291,6 +5411,11 @@ clsx@^1.1.0, clsx@^1.1.1: resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== +clsx@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" + integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -5833,6 +5958,11 @@ csstype@^3.0.11, csstype@^3.0.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.11.tgz#d66700c5eacfac1940deb4e3ee5642792d85cd33" integrity sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw== +csstype@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.0.tgz#4ddcac3718d787cf9df0d1b7d15033925c8f29f2" + integrity sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA== + csv-parse@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-5.1.0.tgz#e587e969bf0385ecf4f36f584ed5ddebba0237ab" @@ -9168,6 +9298,16 @@ material-design-lite@^1.2.0: resolved "https://registry.yarnpkg.com/material-design-lite/-/material-design-lite-1.3.0.tgz#d004ce3fee99a1eeb74a78b8a325134a5f1171d3" integrity sha1-0ATOP+6Zoe63Sni4oyUTSl8RcdM= +material-ui-popup-state@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/material-ui-popup-state/-/material-ui-popup-state-4.0.1.tgz#356258aa5d6be40d22512c1e9bb4c58f303d0e3f" + integrity sha512-4Ywj2QFOaS4mirRRtX4xps1waJQPa+IIEnVj/nnA4+aglinEcPkALPq+akAlvzKAjkjkmIjiku8SbdmTl0hTCQ== + dependencies: + "@babel/runtime" "^7.12.5" + "@mui/material" "^5.0.0" + classnames "^2.2.6" + prop-types "^15.7.2" + mdast-util-definitions@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-5.1.0.tgz#b6d10ef00a3c4cf191e8d9a5fa58d7f4a366f817" @@ -11338,6 +11478,11 @@ react-is@^18.0.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.1.0.tgz#61aaed3096d30eacf2a2127118b5b41387d32a67" integrity sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg== +react-is@^18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + react-json-view@^1.21.3: version "1.21.3" resolved "https://registry.yarnpkg.com/react-json-view/-/react-json-view-1.21.3.tgz#f184209ee8f1bf374fb0c41b0813cff54549c475" @@ -12052,6 +12197,11 @@ schema-utils@^4.0.0: ajv-formats "^2.1.1" ajv-keywords "^5.0.0" +seedrandom@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.5.tgz#54edc85c95222525b0c7a6f6b3543d8e0b3aa0a7" + integrity sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg== + select-hose@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" From 4f4db19b48d75056ff69fd1cc8a3fed7fa7c5d81 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Mon, 25 Jul 2022 13:25:11 +1000 Subject: [PATCH 043/309] global theme updates --- public/index.html | 11 +- public/site.webmanifest | 2 - src/assets/Logo.tsx | 16 +-- src/assets/logo-sticker.svg | 4 +- src/components/CircularProgressOptical.tsx | 6 +- src/components/CircularProgressTimed.tsx | 114 ++++++++++++++++++ src/components/Modal/FadeTransition.tsx | 76 ++++++++++++ src/components/Modal/Modal.tsx | 2 +- .../Navigation/NavDrawer/NavDrawer.tsx | 28 +++-- src/theme/components.tsx | 29 +++-- 10 files changed, 247 insertions(+), 41 deletions(-) create mode 100644 src/components/CircularProgressTimed.tsx create mode 100644 src/components/Modal/FadeTransition.tsx diff --git a/public/index.html b/public/index.html index 84198f78..4e7116ce 100644 --- a/public/index.html +++ b/public/index.html @@ -6,16 +6,7 @@ name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" /> - - + diff --git a/public/site.webmanifest b/public/site.webmanifest index 291e3eee..27987815 100644 --- a/public/site.webmanifest +++ b/public/site.webmanifest @@ -13,7 +13,5 @@ "type": "image/png" } ], - "theme_color": "#4200ff", - "background_color": "#4200ff", "display": "standalone" } diff --git a/src/assets/Logo.tsx b/src/assets/Logo.tsx index c4037f30..35692bcc 100644 --- a/src/assets/Logo.tsx +++ b/src/assets/Logo.tsx @@ -21,19 +21,19 @@ export default function Logo({ size = 1.5, ...props }: ILogoProps) { Rowy - + - + - + - + @@ -41,22 +41,22 @@ export default function Logo({ size = 1.5, ...props }: ILogoProps) { - + - + @@ -28,7 +28,7 @@ - + diff --git a/src/components/CircularProgressOptical.tsx b/src/components/CircularProgressOptical.tsx index be71800d..b4c60236 100644 --- a/src/components/CircularProgressOptical.tsx +++ b/src/components/CircularProgressOptical.tsx @@ -1,9 +1,13 @@ import { CircularProgress, CircularProgressProps } from "@mui/material"; +export interface ICircularProgressOpticalProps extends CircularProgressProps { + size?: number; +} + export default function CircularProgressOptical({ size = 40, ...props -}: CircularProgressProps & { size?: number }) { +}: ICircularProgressOpticalProps) { const DEFAULT_SIZE = 40; const DEFAULT_THICKNESS = 3.6; const linearThickness = (DEFAULT_SIZE / size) * DEFAULT_THICKNESS; diff --git a/src/components/CircularProgressTimed.tsx b/src/components/CircularProgressTimed.tsx new file mode 100644 index 00000000..12c62862 --- /dev/null +++ b/src/components/CircularProgressTimed.tsx @@ -0,0 +1,114 @@ +import { useState, useEffect } from "react"; + +import CircularProgressOptical, { + ICircularProgressOpticalProps, +} from "@src/components/CircularProgressOptical"; +import { Box } from "@mui/material"; + +export interface ICircularProgressTimedProps + extends ICircularProgressOpticalProps { + duration: number; + complete: boolean; +} + +export default function CircularProgressTimed({ + duration, + complete, + size = 64, + ...props +}: ICircularProgressTimedProps) { + const [count, setCount] = useState(0); + + useEffect(() => { + if (complete) { + setCount(0); + return; + } + + const interval = setInterval(() => { + setCount((c) => { + if (c >= duration) { + clearInterval(interval); + return c; + } + return c + 1; + }); + }, 1000); + + return () => clearInterval(interval); + }, [duration, complete]); + + const DEFAULT_SIZE = 24; + const DEFAULT_THICKNESS = 2.6; + const linearThickness = (DEFAULT_SIZE / size) * DEFAULT_THICKNESS; + const opticalRatio = 1 - (1 - size / DEFAULT_SIZE) / 2; + + return ( + + + theme.transitions.create(["color"], { + easing: theme.transitions.easing.easeOut, + duration: theme.transitions.duration.standard, + }), + }} + color={complete ? "success" : "primary"} + /> + {complete ? ( + theme.palette.success.main, + strokeDasharray: 18, + + animationName: "draw-tick", + animationTimingFunction: (theme) => + theme.transitions.easing.easeOut, + animationDuration: (theme) => + theme.transitions.duration.standard + "ms", + animationDelay: (theme) => + theme.transitions.duration.standard + "ms", + animationFillMode: "both", + + "@keyframes draw-tick": { + from: { strokeDashoffset: 18 }, + to: { strokeDashoffset: 0 }, + }, + }, + }} + > + + + ) : ( + + )} + + ); +} diff --git a/src/components/Modal/FadeTransition.tsx b/src/components/Modal/FadeTransition.tsx new file mode 100644 index 00000000..48e4441d --- /dev/null +++ b/src/components/Modal/FadeTransition.tsx @@ -0,0 +1,76 @@ +import { forwardRef, cloneElement } from "react"; +import { useTheme } from "@mui/material"; +import { Transition } from "react-transition-group"; +import { TransitionProps } from "react-transition-group/Transition"; +import { TransitionProps as MuiTransitionProps } from "@mui/material/transitions"; + +export const FadeTransition: React.ForwardRefExoticComponent< + Pick & React.RefAttributes +> = forwardRef( + ({ children, ...props }: TransitionProps, ref: React.Ref) => { + const theme = useTheme(); + + if (!children) return null; + + const defaultStyle = { + opacity: 0, + transform: "scale(0.8)", + + transition: theme.transitions.create(["transform", "opacity"], { + duration: "300ms", + easing: theme.transitions.easing.strong, + }), + }; + + const transitionStyles = { + entering: { + willChange: "transform, opacity", + }, + + entered: { + opacity: 1, + transform: "none", + }, + + exiting: { + opacity: 0, + transform: "scale(0.8)", + + transitionDuration: theme.transitions.duration.leavingScreen, + }, + + exited: { + opacity: 0, + transform: "none", + transition: "none", + }, + + unmounted: {}, + }; + + return ( + + {(state) => + cloneElement(children as any, { + style: { ...defaultStyle, ...transitionStyles[state] }, + tabIndex: -1, + ref, + }) + } + + ); + } +); + +export default FadeTransition; + +export const FadeTransitionMui = forwardRef(function Transition( + props: MuiTransitionProps & { children?: React.ReactElement }, + ref: React.Ref +) { + return ; +}); diff --git a/src/components/Modal/Modal.tsx b/src/components/Modal/Modal.tsx index 9a991f3f..475ae796 100644 --- a/src/components/Modal/Modal.tsx +++ b/src/components/Modal/Modal.tsx @@ -76,7 +76,7 @@ export default function Modal({ setOpen(false); setEmphasizeCloseButton(false); - setTimeout(() => onClose(setOpen), 300); + setTimeout(() => onClose(setOpen), 195 * 2); }; return ( diff --git a/src/layouts/Navigation/NavDrawer/NavDrawer.tsx b/src/layouts/Navigation/NavDrawer/NavDrawer.tsx index ef95c7ee..30c895d4 100644 --- a/src/layouts/Navigation/NavDrawer/NavDrawer.tsx +++ b/src/layouts/Navigation/NavDrawer/NavDrawer.tsx @@ -1,4 +1,4 @@ -import { useState } from "react"; +import { useState, Suspense } from "react"; import { useSetAtom } from "jotai"; import { colord } from "colord"; @@ -14,6 +14,7 @@ import { ListItemText, ListItemSecondaryAction, Divider, + Skeleton, } from "@mui/material"; import CloseIcon from "@mui/icons-material/MenuOpen"; import DocsIcon from "@mui/icons-material/LibraryBooksOutlined"; @@ -205,13 +206,24 @@ export default function NavDrawer({ backgroundColor: "var(--nav-bg)", }} > - + ( + + ))} + > + + { }, "#root": { - transformOrigin: `50% ${theme.spacing(1)}`, + transformOrigin: `50% 0%`, transition: theme.transitions.create([ "transform", "border-radius", @@ -257,7 +257,7 @@ export const components = (theme: Theme): ThemeOptions => { }, paper: { - borderRadius: (theme.shape.borderRadius as number) * 2, + borderRadius: (theme.shape.borderRadius as number) * 3, "--dialog-spacing": theme.spacing(3), [theme.breakpoints.down("sm")]: { @@ -271,10 +271,8 @@ export const components = (theme: Theme): ThemeOptions => { paperFullScreen: { borderBottomLeftRadius: 0, borderBottomRightRadius: 0, - marginTop: `calc(env(safe-area-inset-top) + ${theme.spacing(2)})`, - maxHeight: `calc(100% - env(safe-area-inset-top) - ${theme.spacing( - 2 - )})`, + marginTop: `calc(env(safe-area-inset-top) + 10px)`, + maxHeight: `calc(100% - env(safe-area-inset-top) - 10px)`, maxWidth: "100% !important", paddingLeft: "env(safe-area-inset-left)", @@ -292,7 +290,7 @@ export const components = (theme: Theme): ThemeOptions => { theme.palette.mode === "dark" ? "80" : "75" }%)`, - transform: `scale(0.9) translateY(${theme.spacing(1)})`, + transform: `scale(0.9)`, transition: theme.transitions.create( ["transform", "border-radius"], { @@ -395,7 +393,17 @@ export const components = (theme: Theme): ThemeOptions => { caretColor: theme.palette.primary.main, ".Mui-error &": { caretColor: theme.palette.error.main }, }, - inputSizeSmall: theme.typography.body2 as any, + inputSizeSmall: { + ...(theme.typography.body2 as any), + [theme.breakpoints.only("xs")]: { + ...(theme.typography.body1 as any), + "&, &.MuiSelect-select": { + minHeight: `${theme.typography.body1.lineHeight}em`, + }, + paddingTop: theme.spacing(0.5), + paddingBottom: theme.spacing(0.5), + }, + }, }, }, MuiFilledInput: { @@ -535,7 +543,10 @@ export const components = (theme: Theme): ThemeOptions => { ".MuiMenu-list &": { whiteSpace: "normal" }, }, primary: { - ".MuiSelect-select &": theme.typography.body2, + ".MuiSelect-select &": { + ...(theme.typography.body2 as any), + [theme.breakpoints.only("xs")]: theme.typography.body1, + }, }, secondary: { ".MuiSelect-select &": { display: "none" }, From a50360214f4fa797e5fa736011247ee103e6acb7 Mon Sep 17 00:00:00 2001 From: shamsmosowi Date: Mon, 25 Jul 2022 20:51:15 +0200 Subject: [PATCH 044/309] show text field if collections array is empy --- src/components/TableSettingsDialog/TableSettingsDialog.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/TableSettingsDialog/TableSettingsDialog.tsx b/src/components/TableSettingsDialog/TableSettingsDialog.tsx index 3850e30e..7d48121c 100644 --- a/src/components/TableSettingsDialog/TableSettingsDialog.tsx +++ b/src/components/TableSettingsDialog/TableSettingsDialog.tsx @@ -232,7 +232,9 @@ export default function TableSettingsDialog() { })), ["section", "label"] ), - Array.isArray(collections) ? collections.filter((x) => x !== CONFIG) : null + Array.isArray(collections) && collections.length !== 0 + ? collections.filter((x) => x !== CONFIG) + : null ); return ( From b64c6c49098e52cf34ed08b81284ba25a01fcc16 Mon Sep 17 00:00:00 2001 From: shamsmosowi Date: Tue, 26 Jul 2022 16:24:23 +0200 Subject: [PATCH 045/309] column ids --- src/components/ColumnMenu/ColumnMenu.tsx | 22 +++++++++++++++---- src/components/ColumnMenu/MenuContents.tsx | 2 ++ .../Table/ColumnHeader/ColumnHeader.tsx | 2 ++ 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/components/ColumnMenu/ColumnMenu.tsx b/src/components/ColumnMenu/ColumnMenu.tsx index 1bfde791..2408acd6 100644 --- a/src/components/ColumnMenu/ColumnMenu.tsx +++ b/src/components/ColumnMenu/ColumnMenu.tsx @@ -124,8 +124,9 @@ export default function ColumnMenu() { }; const localViewActions: IMenuContentsProps["menuItems"] = [ - { type: "subheader" }, + { type: "subheader", key: "subLocalView" }, { + key: "sortDesc", label: "Sort: descending", activeLabel: "Remove sort: descending", icon: , @@ -139,6 +140,7 @@ export default function ColumnMenu() { disabled: column.type === FieldType.id, }, { + key: "sortAsc", label: "Sort: ascending", activeLabel: "Remove sort: ascending", icon: , @@ -152,6 +154,7 @@ export default function ColumnMenu() { disabled: column.type === FieldType.id, }, { + key: "hide", label: "Hide", icon: , onClick: () => { @@ -168,6 +171,7 @@ export default function ColumnMenu() { disabled: !updateUserSettings, }, { + key: "filter", label: "Filter…", icon: , onClick: () => { @@ -187,9 +191,10 @@ export default function ColumnMenu() { ]; const configActions: IMenuContentsProps["menuItems"] = [ - { type: "subheader" }, + { type: "subheader", key: "subActionsConfig" }, { label: "Lock", + key: "lock", activeLabel: "Unlock", icon: , activeIcon: , @@ -204,6 +209,7 @@ export default function ColumnMenu() { }, { label: "Disable resize", + key: "disableResize", activeLabel: "Enable resize", icon: , onClick: () => { @@ -217,6 +223,7 @@ export default function ColumnMenu() { }, { label: "Freeze", + key: "freeze", activeLabel: "Unfreeze", icon: , activeIcon: , @@ -229,6 +236,7 @@ export default function ColumnMenu() { // { type: "subheader" }, { label: "Rename…", + key: "rename", icon: , onClick: () => { openColumnModal({ type: "name", columnKey: column.key }); @@ -237,6 +245,7 @@ export default function ColumnMenu() { }, { label: `Edit type: ${getFieldProp("name", column.type)}…`, + key: "editType", // This is based on the cell type icon: getFieldProp("icon", column.type), onClick: () => { @@ -246,6 +255,7 @@ export default function ColumnMenu() { }, { label: `Column config…`, + key: "columConfig", icon: , onClick: () => { openColumnModal({ type: "config", columnKey: column.key }); @@ -299,8 +309,9 @@ export default function ColumnMenu() { } }; const derivativeActions: IMenuContentsProps["menuItems"] = [ - { type: "subheader" }, + { type: "subheader", key: "sub-derivative" }, { + key: "evaluateAll", label: altPress ? "Evaluate all" : "Evaluate all…", icon: , onClick: altPress @@ -323,9 +334,10 @@ export default function ColumnMenu() { ]; const columnActions: IMenuContentsProps["menuItems"] = [ - { type: "subheader" }, + { type: "subheader", key: "subActions" }, { label: "Insert to the left…", + key: "insertLeft", icon: , onClick: () => { openColumnModal({ type: "new", index: column.index - 1 }); @@ -334,6 +346,7 @@ export default function ColumnMenu() { }, { label: "Insert to the right…", + key: "insertRight", icon: , onClick: () => { openColumnModal({ type: "new", index: column.index + 1 }); @@ -342,6 +355,7 @@ export default function ColumnMenu() { }, { label: `Delete column${altPress ? "" : "…"}`, + key: "delete", icon: , onClick: altPress ? handleDeleteColumn diff --git a/src/components/ColumnMenu/MenuContents.tsx b/src/components/ColumnMenu/MenuContents.tsx index d442b77d..c14754f0 100644 --- a/src/components/ColumnMenu/MenuContents.tsx +++ b/src/components/ColumnMenu/MenuContents.tsx @@ -4,6 +4,7 @@ import { MenuItem, ListItemIcon, ListSubheader, Divider } from "@mui/material"; export interface IMenuContentsProps { menuItems: { + key: string; type?: string; label?: string; activeLabel?: string; @@ -36,6 +37,7 @@ export default function MenuContents({ menuItems }: IMenuContentsProps) { return ( { dragRef(ref); dropRef(ref); @@ -213,6 +214,7 @@ export default function DraggableHeaderRenderer({ Date: Fri, 29 Jul 2022 00:44:37 +0200 Subject: [PATCH 046/309] row ID --- src/components/Table/TableRow.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/Table/TableRow.tsx b/src/components/Table/TableRow.tsx index 0ecd229a..ca19ee77 100644 --- a/src/components/Table/TableRow.tsx +++ b/src/components/Table/TableRow.tsx @@ -24,6 +24,7 @@ export default function TableRow(props: RowRendererProps) { return ( From 7d5b7387c8a264c8dc9667af589999d516661bbb Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Tue, 2 Aug 2022 23:36:51 +0200 Subject: [PATCH 047/309] update nav community, help menus --- src/layouts/Navigation/NavDrawer/CommunityMenu.tsx | 2 +- src/layouts/Navigation/NavDrawer/HelpMenu.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/layouts/Navigation/NavDrawer/CommunityMenu.tsx b/src/layouts/Navigation/NavDrawer/CommunityMenu.tsx index ec68e76a..5d027992 100644 --- a/src/layouts/Navigation/NavDrawer/CommunityMenu.tsx +++ b/src/layouts/Navigation/NavDrawer/CommunityMenu.tsx @@ -38,7 +38,7 @@ export default function HelpMenu({ anchorOrigin={{ vertical: "bottom", horizontal: "right" }} transformOrigin={{ vertical: "bottom", horizontal: "left" }} sx={{ "& .MuiPaper-root": { mt: 1.5, py: 1 } }} - PaperProps={{ elevation: 10 }} + PaperProps={{ elevation: 12 }} > Date: Tue, 2 Aug 2022 23:43:58 +0200 Subject: [PATCH 048/309] fix create table showing empty dropdown for collections --- src/components/TableSettingsDialog/TableSettingsDialog.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/TableSettingsDialog/TableSettingsDialog.tsx b/src/components/TableSettingsDialog/TableSettingsDialog.tsx index 73ca5bc5..79ea3971 100644 --- a/src/components/TableSettingsDialog/TableSettingsDialog.tsx +++ b/src/components/TableSettingsDialog/TableSettingsDialog.tsx @@ -232,7 +232,8 @@ export default function TableSettingsDialog() { })), ["section", "label"] ), - Array.isArray(collections) && collections.length !== 0 + Array.isArray(collections) && + collections.filter((x) => x !== CONFIG).length > 0 ? collections.filter((x) => x !== CONFIG) : null ); From 52b5d755dc5b98c1c0c090b8a7c5a82f53a3cdd4 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Tue, 2 Aug 2022 23:43:58 +0200 Subject: [PATCH 049/309] fix create table showing empty dropdown for collections --- src/components/TableSettingsDialog/TableSettingsDialog.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/TableSettingsDialog/TableSettingsDialog.tsx b/src/components/TableSettingsDialog/TableSettingsDialog.tsx index 7d48121c..dc979a80 100644 --- a/src/components/TableSettingsDialog/TableSettingsDialog.tsx +++ b/src/components/TableSettingsDialog/TableSettingsDialog.tsx @@ -232,7 +232,8 @@ export default function TableSettingsDialog() { })), ["section", "label"] ), - Array.isArray(collections) && collections.length !== 0 + Array.isArray(collections) && + collections.filter((x) => x !== CONFIG).length > 0 ? collections.filter((x) => x !== CONFIG) : null ); From 489c478ecdfef27278fe981be087858712f1bc0e Mon Sep 17 00:00:00 2001 From: Han Tuerker Date: Fri, 5 Aug 2022 04:46:41 +0300 Subject: [PATCH 050/309] feat(airtable-migration): add tab panel --- src/components/TableToolbar/ImportCsv.tsx | 134 ++++++++++++++++++++-- 1 file changed, 127 insertions(+), 7 deletions(-) diff --git a/src/components/TableToolbar/ImportCsv.tsx b/src/components/TableToolbar/ImportCsv.tsx index 316e239b..d9284f37 100644 --- a/src/components/TableToolbar/ImportCsv.tsx +++ b/src/components/TableToolbar/ImportCsv.tsx @@ -38,6 +38,7 @@ export enum ImportMethod { paste = "paste", upload = "upload", url = "url", + airtable = "airtable", } export interface IImportCsvProps { @@ -62,7 +63,7 @@ export default function ImportCsv({ render, PopoverProps }: IImportCsvProps) { const [open, setOpen] = useState(null); const [tab, setTab] = useState("upload"); - const [error, setError] = useState(""); + const [error, setError] = useState(""); const validCsv = csvData !== null && csvData?.columns.length > 0 && csvData?.rows.length > 0; @@ -170,6 +171,45 @@ export default function ImportCsv({ render, PopoverProps }: IImportCsvProps) { }); }, 1000); + const [airtable, setAirtable] = useState({ + apiKey: "", + baseID: "", + tableID: "", + }); + const [data, setData] = useState(null); + const [validConnection, setValidConnection] = useState(false); + const handleAirtableConnection = () => { + if (!airtable.apiKey) { + setError({ apiKey: { message: "API Key is missing!" } }); + return; + } + if (!airtable.baseID) { + setError({ baseID: { message: "Base ID is missing!" } }); + return; + } + if (!airtable.tableID) { + setError({ tableID: { message: "Table ID is missing!" } }); + return; + } + setLoading(true); + fetch( + `https://api.airtable.com/v0/${airtable.baseID}/${airtable.tableID}?maxRecords=1`, + { + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${airtable.apiKey}`, + }, + } + ) + .then((response) => response.json()) + .then((body) => setData(body.records)) + .then(() => { + setValidConnection(true); + setLoading(false); + setError(""); + }); + }; + if (tableSettings.readOnly && !userRoles.includes("ADMIN")) return null; return ( @@ -233,6 +273,11 @@ export default function ImportCsv({ render, PopoverProps }: IImportCsvProps) { value="url" onClick={() => (importMethodRef.current = ImportMethod.url)} /> + (importMethodRef.current = ImportMethod.airtable)} + /> @@ -345,12 +390,74 @@ export default function ImportCsv({ render, PopoverProps }: IImportCsvProps) { error={!!error} /> + + + + Forget the storage limitations of Airtable. + + { + setAirtable((airtable: any) => ({ + ...airtable, + apiKey: e.currentTarget.value, + })); + }} + helperText={error?.apiKey?.message} + error={!!error?.apiKey?.message} + /> + { + setAirtable((airtable: any) => ({ + ...airtable, + baseID: e.currentTarget.value, + })); + }} + helperText={error?.baseID?.message} + error={!!error?.baseID?.message} + /> + { + setAirtable((prev: any) => ({ + ...airtable, + tableID: e.currentTarget.value, + })); + }} + helperText={error?.tableID?.message} + error={!!error?.tableID?.message} + /> + {data && + data.map((record: any) => ( +
    Airtable record: {record.id}
    + ))} +
    From 62d371e9d4009eec55eb43419e4ec7d66147fc37 Mon Sep 17 00:00:00 2001 From: Han Tuerker Date: Sun, 7 Aug 2022 03:56:49 +0300 Subject: [PATCH 051/309] feat(airtable-migration): initiate import wizard --- .../ImportAirtableWizard.tsx | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 src/components/TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx diff --git a/src/components/TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx b/src/components/TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx new file mode 100644 index 00000000..cb8121ae --- /dev/null +++ b/src/components/TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx @@ -0,0 +1,83 @@ +import { useState, useCallback } from "react"; +import { useAtom, useSetAtom } from "jotai"; +import { RESET } from "jotai/utils"; +import { uniqBy } from "lodash-es"; +import { ITableModalProps } from "@src/components/TableModals"; + +import { useTheme, useMediaQuery } from "@mui/material"; + +import WizardDialog from "@src/components/TableModals/WizardDialog"; +import Step1Columns from "./Step1Columns"; + +import { + tableScope, + tableModalAtom, + importAirtableAtom, + ImportAirtableData, +} from "@src/atoms/tableScope"; +import { ColumnConfig } from "@src/types/table"; + +export type AirtableConfig = { + pairs: { fieldKey: string; columnKey: string }[]; + newColumns: ColumnConfig[]; +}; + +export interface IStepProps { + airtableData: NonNullable; + config: AirtableConfig; + setConfig: React.Dispatch>; + updateConfig: (value: Partial) => void; + isXs: boolean; +} + +export default function ImportAirtableWizard({ onClose }: ITableModalProps) { + const [{ airtableData }] = useAtom(importAirtableAtom, tableScope); + const setTableModal = useSetAtom(tableModalAtom, tableScope); + const theme = useTheme(); + const isXs = useMediaQuery(theme.breakpoints.down("sm")); + + const [config, setConfig] = useState({ + pairs: [], + newColumns: [], + }); + + const updateConfig: IStepProps["updateConfig"] = useCallback((value) => { + setConfig((prev) => { + const pairs = uniqBy([...prev.pairs, ...(value.pairs ?? [])], "fieldKey"); + const newColumns = uniqBy( + [...prev.newColumns, ...(value.newColumns ?? [])], + "key" + ).filter((col) => pairs.some((pair) => pair.columnKey === col.key)); + return { pairs, newColumns }; + }); + }, []); + + if (!airtableData) { + setTableModal(RESET); + return null; + } + + return ( + Description, + content: ( + + ), + }, + ]} + onFinish={() => {}} + /> + ); +} From 9e978c6f7cc3a9f8c5e4b9fc14cb71e7499dc2d6 Mon Sep 17 00:00:00 2001 From: Han Tuerker Date: Sun, 7 Aug 2022 04:10:29 +0300 Subject: [PATCH 052/309] feature(airtable-migration): add columns step --- .../ImportAirtableWizard/Step1Columns.tsx | 273 ++++++++++++++++++ 1 file changed, 273 insertions(+) create mode 100644 src/components/TableModals/ImportAirtableWizard/Step1Columns.tsx diff --git a/src/components/TableModals/ImportAirtableWizard/Step1Columns.tsx b/src/components/TableModals/ImportAirtableWizard/Step1Columns.tsx new file mode 100644 index 00000000..dea5d586 --- /dev/null +++ b/src/components/TableModals/ImportAirtableWizard/Step1Columns.tsx @@ -0,0 +1,273 @@ +import { useState } from "react"; +import { useAtom } from "jotai"; +import useMemoValue from "use-memo-value"; +import { find, findIndex, camelCase, isEqual } from "lodash-es"; + +import { + Grid, + Typography, + Divider, + FormControlLabel, + Checkbox, + Chip, +} from "@mui/material"; +import ArrowIcon from "@mui/icons-material/ArrowForward"; + +import { IStepProps } from "."; +import FadeList from "@src/components/TableModals/ScrollableList"; +import Column, { COLUMN_HEADER_HEIGHT } from "@src/components/Table/Column"; +import MultiSelect from "@rowy/multiselect"; + +import { + tableScope, + tableSchemaAtom, + tableColumnsOrderedAtom, +} from "@src/atoms/tableScope"; +import { FieldType } from "@src/constants/fields"; + +export default function Step1Columns({ + airtableData, + config, + updateConfig, + setConfig, + isXs, +}: IStepProps) { + const [tableSchema] = useAtom(tableSchemaAtom, tableScope); + const [tableColumnsOrdered] = useAtom(tableColumnsOrderedAtom, tableScope); + + const tableColumns = useMemoValue( + tableColumnsOrdered + .filter((column) => column.type !== FieldType.id) + .map((column) => ({ label: column.name, value: column.fieldName })), + isEqual + ); + + const [selectedFields, setSelectedFields] = useState( + config.pairs.map((pair) => pair.fieldKey) + ); + + const handleSelect = + (field: string) => (e: React.ChangeEvent) => { + const checked = e.target.checked; + + if (checked) { + setSelectedFields((x) => [...x, field]); + + // Try to match the field to a column in the table + const match = + find(tableColumns, (column) => + column.label.toLowerCase().includes(field.toLowerCase()) + )?.value ?? null; + if (match) { + setConfig((config) => ({ + ...config, + pairs: [...config.pairs, { fieldKey: field, columnKey: match }], + })); + } + } else { + const newValue = [...selectedFields]; + newValue.splice(newValue.indexOf(field), 1); + setSelectedFields(newValue); + + // Check if this pair was already pushed to main config + const configPair = find(config.pairs, { fieldKey: field }); + const configIndex = findIndex(config.pairs, { fieldKey: field }); + console.log(configPair); + console.log(configIndex); + // Delete matching newColumn if it was created + if (configPair) { + const newColumnIndex = findIndex(config.newColumns, { + key: configPair.fieldKey, + }); + if (newColumnIndex > -1) { + const newColumns = [...config.newColumns]; + newColumns.splice(newColumnIndex, 1); + setConfig((config) => ({ ...config, newColumns })); + } + } + + // Delete pair from main config + if (configIndex > -1) { + const newConfig = [...config.pairs]; + newConfig.splice(configIndex, 1); + setConfig((config) => ({ ...config, pairs: newConfig })); + } + } + }; + + const handleChange = (fieldKey: string) => (value: string) => { + const columnKey = !!tableSchema.columns?.[value] ? value : camelCase(value); + console.log(config); + // Check if this pair already exists in config + const configIndex = findIndex(config.pairs, { fieldKey }); + if (configIndex > -1) { + const pairs = [...config.pairs]; + pairs[configIndex].fieldKey = columnKey; + setConfig((config) => ({ ...config, pairs })); + } else { + updateConfig({ + pairs: [{ fieldKey, columnKey }], + }); + } + + if (!tableSchema.columns?.[value]) { + updateConfig({ + newColumns: [ + { + name: value, + fieldName: columnKey, + key: columnKey, + type: FieldType.shortText, + index: -1, + config: {}, + }, + ], + }); + } + }; + + const fieldKeys = Object.keys(airtableData.records[0].fields); + return ( +
    + + {!isXs && ( + + + Select columns ({config.pairs.length} of {fieldKeys.length}) + + + )} + + + Table columns + + + + + + + + {fieldKeys.map((field) => { + const selected = selectedFields.indexOf(field) > -1; + const columnKey = + find(config.pairs, { fieldKey: field })?.columnKey ?? null; + const matchingColumn = columnKey + ? tableSchema.columns?.[columnKey] ?? + find(config.newColumns, { key: columnKey }) ?? + null + : null; + const isNewColumn = !!find(config.newColumns, { key: columnKey }); + return ( + + + + } + label={} + sx={{ + marginRight: 0, + flex: 1, + alignItems: "center", + "& .MuiFormControlLabel-label": { mt: 0, flex: 1 }, + }} + /> + + + theme.spacing(7), + display: "flex", + alignItems: "center", + justifyContent: "center", + }} + > + + + + + {selected && ( + { + if (!columnKey) return "Select or add column"; + else + return ( + <> + {matchingColumn?.name} + {isNewColumn && ( + + theme.spacing(1) + " !important", + backgroundColor: "action.focus", + pointerEvents: "none", + }} + /> + )} + + ); + }, + sx: [ + { + backgroundColor: "background.default", + border: (theme) => + `1px solid ${theme.palette.divider}`, + borderRadius: 0, + boxShadow: "none", + "& .MuiSelect-select": { + boxSizing: "border-box", + height: COLUMN_HEADER_HEIGHT - 2, + typography: "caption", + fontWeight: "medium", + lineHeight: "28px", + }, + + color: "text.secondary", + "&:hover": { + backgroundColor: "background.default", + color: "text.primary", + boxShadow: "none", + }, + + "&::before": { content: "none" }, + "&::after": { pointerEvents: "none" }, + }, + !columnKey && { color: "text.disabled" }, + ], + }, + }} + clearable={false} + displayEmpty + labelPlural="columns" + freeText + AddButtonProps={{ children: "Add new column…" }} + AddDialogProps={{ + title: "Add new column", + textFieldLabel: "Column name", + }} + /> + )} + + + ); + })} + +
    + ); +} From 628b027b6a84326b034fccba62feaf69ae6393a4 Mon Sep 17 00:00:00 2001 From: Han Tuerker Date: Sun, 7 Aug 2022 05:13:35 +0300 Subject: [PATCH 053/309] feat(airtable-migration): add select col type step --- .../ImportAirtableWizard/Step2NewColumns.tsx | 139 ++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 src/components/TableModals/ImportAirtableWizard/Step2NewColumns.tsx diff --git a/src/components/TableModals/ImportAirtableWizard/Step2NewColumns.tsx b/src/components/TableModals/ImportAirtableWizard/Step2NewColumns.tsx new file mode 100644 index 00000000..5790f57b --- /dev/null +++ b/src/components/TableModals/ImportAirtableWizard/Step2NewColumns.tsx @@ -0,0 +1,139 @@ +import { useState } from "react"; +import { find } from "lodash-es"; +import { parseJSON } from "date-fns"; + +import { Grid, Typography, Divider, ButtonBase } from "@mui/material"; +import ChevronRightIcon from "@mui/icons-material/ChevronRight"; + +import { IStepProps } from "."; +import ScrollableList from "@src/components/TableModals/ScrollableList"; +import Column from "@src/components/Table/Column"; +import Cell from "@src/components/Table/Cell"; +import FieldsDropdown from "@src/components/ColumnModals/FieldsDropdown"; + +import { FieldType } from "@src/constants/fields"; +import { SELECTABLE_TYPES } from "@src/components/TableModals/ImportExistingWizard/utils"; + +export default function Step2NewColumns({ + airtableData, + config, + setConfig, + isXs, +}: IStepProps) { + const [fieldToEdit, setFieldToEdit] = useState(0); + + const handleChange = (v: FieldType) => { + const newColumns = [...config.newColumns]; + newColumns[fieldToEdit].type = v; + + setConfig((config) => ({ ...config, newColumns })); + }; + + const fieldData = + airtableData.records[0].fields[config.pairs[fieldToEdit]?.fieldKey]; + + return ( + <> +
    + + + + New table columns + + + + + {config.newColumns.map(({ key, name, type }, i) => ( +
  • + setFieldToEdit(i)} + aria-label={`Edit column ${key}`} + focusRipple + > + } + /> + +
  • + ))} +
    +
    + + + +
    +
    + +
    + + {!isXs && ( + + + Raw data + + + )} + + + Column preview + + + + + + + {!isXs && ( + + + + )} + + + + + + {!isXs && ( + + + + )} + + {!isXs && theme.spacing(3) }} />} + + + + + + +
    + + ); +} From 173e3b8cf432eeaa6c0825004aaa8b45ac7a6f10 Mon Sep 17 00:00:00 2001 From: Han Tuerker Date: Mon, 8 Aug 2022 04:26:29 +0300 Subject: [PATCH 054/309] feat(airtable-migration): add finish handler --- .../ImportAirtableWizard.tsx | 228 ++++++++++++++++-- .../ImportAirtableWizard/Step1Columns.tsx | 3 +- 2 files changed, 208 insertions(+), 23 deletions(-) diff --git a/src/components/TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx b/src/components/TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx index cb8121ae..492b1911 100644 --- a/src/components/TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx +++ b/src/components/TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx @@ -1,21 +1,41 @@ -import { useState, useCallback } from "react"; +import { useState, useCallback, useRef, useMemo } from "react"; +import useMemoValue from "use-memo-value"; import { useAtom, useSetAtom } from "jotai"; import { RESET } from "jotai/utils"; -import { uniqBy } from "lodash-es"; +import { useSnackbar } from "notistack"; +import { uniqBy, isEqual, find } from "lodash-es"; import { ITableModalProps } from "@src/components/TableModals"; -import { useTheme, useMediaQuery } from "@mui/material"; +import { + useTheme, + useMediaQuery, + Typography, + Link, + Alert, + AlertTitle, + Button, +} from "@mui/material"; import WizardDialog from "@src/components/TableModals/WizardDialog"; import Step1Columns from "./Step1Columns"; import { tableScope, - tableModalAtom, + tableSettingsAtom, + tableSchemaAtom, + addColumnAtom, + bulkAddRowsAtom, importAirtableAtom, ImportAirtableData, + tableModalAtom, } from "@src/atoms/tableScope"; import { ColumnConfig } from "@src/types/table"; +import { getFieldProp } from "@src/components/fields"; +import Step2NewColumns from "./Step2NewColumns"; +import SnackbarProgress, { + ISnackbarProgressRef, +} from "@src/components/SnackbarProgress"; +import { FieldType } from "@src/constants/fields"; export type AirtableConfig = { pairs: { fieldKey: string; columnKey: string }[]; @@ -31,10 +51,21 @@ export interface IStepProps { } export default function ImportAirtableWizard({ onClose }: ITableModalProps) { - const [{ airtableData }] = useAtom(importAirtableAtom, tableScope); + const [tableSettings] = useAtom(tableSettingsAtom, tableScope); + const [tableSchema] = useAtom(tableSchemaAtom, tableScope); + const addColumn = useSetAtom(addColumnAtom, tableScope); + const bulkAddRows = useSetAtom(bulkAddRowsAtom, tableScope); + const [{ airtableData, tableId, baseId, apiKey }] = useAtom( + importAirtableAtom, + tableScope + ); const setTableModal = useSetAtom(tableModalAtom, tableScope); + const { enqueueSnackbar, closeSnackbar } = useSnackbar(); const theme = useTheme(); const isXs = useMediaQuery(theme.breakpoints.down("sm")); + const snackbarProgressRef = useRef(); + + const columns = useMemoValue(tableSchema.columns ?? {}, isEqual); const [config, setConfig] = useState({ pairs: [], @@ -52,6 +83,133 @@ export default function ImportAirtableWizard({ onClose }: ITableModalProps) { }); }, []); + const fetchRecords = async (offset?: string) => { + const url = offset + ? `https://api.airtable.com/v0/${baseId}/${tableId}?offset=${offset}` + : `https://api.airtable.com/v0/${baseId}/${tableId}`; + const response = await fetch(url, { + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${apiKey}`, + }, + }).then((response) => response.json()); + return response; + }; + + const airtableFieldParser = (fieldType: FieldType): any => { + switch (fieldType) { + case FieldType.multiSelect: + return (v: string[]) => v; + default: + return getFieldProp("csvImportParser", fieldType); + } + }; + + const parsedRows = (currentBatch: any[]): any[] => + currentBatch.map((record) => + config.pairs.reduce((a, pair) => { + const matchingColumn = + columns[pair.columnKey] ?? + find(config.newColumns, { key: pair.columnKey }); + const parser = airtableFieldParser(matchingColumn.type); + const value = parser + ? parser(record.fields[pair.fieldKey], matchingColumn.config) + : record.fields[pair.fieldKey]; + return { ...a, [pair.columnKey]: value }; + }, {}) + ); + + const handleFinish = async () => { + console.time("importAirtable"); + snackbarProgressRef.current?.setProgress(0); + const loadingSnackbar = enqueueSnackbar( + `Importing rows. This might take a while.`, + { + persist: true, + action: ( + + ), + } + ); + + const warningSnackbar = enqueueSnackbar( + "Do not close this page until the import is complete", + { + variant: "warning", + persist: true, + action: ( + + ), + } + ); + + try { + let currentBatch: any[] = []; + const fetcher = async (i: number, offset: string) => { + // Airtable Rate Limits: 5 req/sec , 100rows/req + if (!offset) return; + const { records, offset: currentOffset } = await fetchRecords(offset); + currentBatch = [...currentBatch, ...records]; + snackbarProgressRef.current?.setTarget((prev) => prev + records.length); + if (i < 5) { + fetcher(++i, currentOffset); + } else { + setTimeout(() => { + bulkAddRows({ + rows: parsedRows(currentBatch), + collection: tableSettings.collection, + onBatchCommit: () => + snackbarProgressRef.current?.setProgress( + (prev) => prev + currentBatch.length + ), + }); + currentBatch = []; + fetcher(0, currentOffset); + }, 1050); + } + }; + + onClose(); + + const promises: Promise[] = []; + for (const col of config.newColumns) + promises.push(addColumn({ config: col })); + + await Promise.all(promises); + + const { records, offset } = await fetchRecords(); + currentBatch = records; + snackbarProgressRef.current?.setTarget(currentBatch.length); + await fetcher(1, offset); + if (currentBatch.length > 0) { + await bulkAddRows({ + rows: parsedRows(currentBatch), + collection: tableSettings.collection, + onBatchCommit: () => + snackbarProgressRef.current?.setProgress( + (prev) => prev + currentBatch.length + ), + }); + } + } catch (e) { + enqueueSnackbar((e as Error).message, { variant: "error" }); + } finally { + closeSnackbar(loadingSnackbar); + closeSnackbar(warningSnackbar); + } + console.timeEnd("importAirtable"); + }; + if (!airtableData) { setTableModal(RESET); return null; @@ -62,22 +220,50 @@ export default function ImportAirtableWizard({ onClose }: ITableModalProps) { open onClose={onClose} title={`Import from Airtable`} - steps={[ - { - title: "Hello, World!", - description: Description, - content: ( - - ), - }, - ]} - onFinish={() => {}} + steps={ + [ + { + title: "Choose columns", + description: ( + <> + Base ID: {baseId} + Table ID: {tableId} + + Select or add the columns to be imported to your table. + + + ), + content: ( + + ), + }, + config.newColumns.length > 0 && { + title: "Set column types", + description: + "Set the type of each column to display your data correctly. Some column types have been suggested based on your data.", + content: ( + + ), + disableNext: config.newColumns.reduce( + (a, c) => a || (c.type as any) === "", + false + ), + }, + ].filter((x) => x) as any + } + onFinish={handleFinish} /> ); } diff --git a/src/components/TableModals/ImportAirtableWizard/Step1Columns.tsx b/src/components/TableModals/ImportAirtableWizard/Step1Columns.tsx index dea5d586..d7d07c06 100644 --- a/src/components/TableModals/ImportAirtableWizard/Step1Columns.tsx +++ b/src/components/TableModals/ImportAirtableWizard/Step1Columns.tsx @@ -72,8 +72,7 @@ export default function Step1Columns({ // Check if this pair was already pushed to main config const configPair = find(config.pairs, { fieldKey: field }); const configIndex = findIndex(config.pairs, { fieldKey: field }); - console.log(configPair); - console.log(configIndex); + // Delete matching newColumn if it was created if (configPair) { const newColumnIndex = findIndex(config.newColumns, { From 9adf1c257243fa1dcedf09b2c1137138784dd077 Mon Sep 17 00:00:00 2001 From: Han Tuerker Date: Tue, 9 Aug 2022 03:07:39 +0300 Subject: [PATCH 055/309] feat(airtable-migration: improve fetcher logic --- .../ImportAirtableWizard.tsx | 98 +++++++++++-------- 1 file changed, 55 insertions(+), 43 deletions(-) diff --git a/src/components/TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx b/src/components/TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx index 492b1911..9c5a0dc7 100644 --- a/src/components/TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx +++ b/src/components/TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx @@ -1,4 +1,4 @@ -import { useState, useCallback, useRef, useMemo } from "react"; +import { useState, useCallback, useRef } from "react"; import useMemoValue from "use-memo-value"; import { useAtom, useSetAtom } from "jotai"; import { RESET } from "jotai/utils"; @@ -30,7 +30,6 @@ import { tableModalAtom, } from "@src/atoms/tableScope"; import { ColumnConfig } from "@src/types/table"; -import { getFieldProp } from "@src/components/fields"; import Step2NewColumns from "./Step2NewColumns"; import SnackbarProgress, { ISnackbarProgressRef, @@ -64,7 +63,7 @@ export default function ImportAirtableWizard({ onClose }: ITableModalProps) { const theme = useTheme(); const isXs = useMediaQuery(theme.breakpoints.down("sm")); const snackbarProgressRef = useRef(); - + const countRef = useRef(0); const columns = useMemoValue(tableSchema.columns ?? {}, isEqual); const [config, setConfig] = useState({ @@ -87,12 +86,14 @@ export default function ImportAirtableWizard({ onClose }: ITableModalProps) { const url = offset ? `https://api.airtable.com/v0/${baseId}/${tableId}?offset=${offset}` : `https://api.airtable.com/v0/${baseId}/${tableId}`; + const response = await fetch(url, { headers: { "Content-Type": "application/json", Authorization: `Bearer ${apiKey}`, }, }).then((response) => response.json()); + return response; }; @@ -101,12 +102,12 @@ export default function ImportAirtableWizard({ onClose }: ITableModalProps) { case FieldType.multiSelect: return (v: string[]) => v; default: - return getFieldProp("csvImportParser", fieldType); + return null; } }; - const parsedRows = (currentBatch: any[]): any[] => - currentBatch.map((record) => + const parsedRecords = (records: any[]): any[] => + records.map((record) => config.pairs.reduce((a, pair) => { const matchingColumn = columns[pair.columnKey] ?? @@ -123,14 +124,14 @@ export default function ImportAirtableWizard({ onClose }: ITableModalProps) { console.time("importAirtable"); snackbarProgressRef.current?.setProgress(0); const loadingSnackbar = enqueueSnackbar( - `Importing rows. This might take a while.`, + `Importing records. This might take a while.`, { persist: true, action: ( ), } @@ -154,53 +155,64 @@ export default function ImportAirtableWizard({ onClose }: ITableModalProps) { ); try { - let currentBatch: any[] = []; - const fetcher = async (i: number, offset: string) => { - // Airtable Rate Limits: 5 req/sec , 100rows/req - if (!offset) return; - const { records, offset: currentOffset } = await fetchRecords(offset); - currentBatch = [...currentBatch, ...records]; - snackbarProgressRef.current?.setTarget((prev) => prev + records.length); - if (i < 5) { - fetcher(++i, currentOffset); - } else { - setTimeout(() => { + const promises: Promise[] = []; + const timeout = (ms: number): Promise => + new Promise((resolve) => setTimeout(() => resolve(), ms)); + + // Airtable Rate Limits: 5 req/sec + const RATE_LIMIT = { REQ_PER_SECOND: 5 }; + const fetcher = async (i: number, offset?: string): Promise => { + console.log(i, offset, promises); + if (offset) { + const { records, offset: nextPage } = await fetchRecords(offset); + snackbarProgressRef.current?.setTarget( + (prev) => prev + records.length + ); + promises.push( bulkAddRows({ - rows: parsedRows(currentBatch), + rows: parsedRecords(records), collection: tableSettings.collection, - onBatchCommit: () => - snackbarProgressRef.current?.setProgress( - (prev) => prev + currentBatch.length - ), - }); - currentBatch = []; - fetcher(0, currentOffset); - }, 1050); + }).then(() => { + countRef.current += records.length; + snackbarProgressRef.current?.setProgress( + (prev) => prev + records.length + ); + }) + ); + if (i < RATE_LIMIT.REQ_PER_SECOND - 1) { + promises.push(fetcher(++i, nextPage)); + } else { + promises.push(timeout(1050).then(() => fetcher(0, nextPage))); + } } }; + const recursiveAll = async (): Promise => { + return Promise.all(promises).then((result) => { + if (result.length === promises.length) { + return result; + } + return recursiveAll(); + }); + }; onClose(); - const promises: Promise[] = []; for (const col of config.newColumns) promises.push(addColumn({ config: col })); await Promise.all(promises); - const { records, offset } = await fetchRecords(); - currentBatch = records; - snackbarProgressRef.current?.setTarget(currentBatch.length); - await fetcher(1, offset); - if (currentBatch.length > 0) { - await bulkAddRows({ - rows: parsedRows(currentBatch), - collection: tableSettings.collection, - onBatchCommit: () => - snackbarProgressRef.current?.setProgress( - (prev) => prev + currentBatch.length - ), - }); - } + const { records, offset: nextPage } = await fetchRecords(); + snackbarProgressRef.current?.setTarget(records.length); + countRef.current += records.length; + console.log("before fetcher"); + await fetcher(1, nextPage); + await recursiveAll(); + enqueueSnackbar( + `Imported ${Number(countRef.current).toLocaleString()} rows`, + { variant: "success" } + ); + console.log("after fetcher"); } catch (e) { enqueueSnackbar((e as Error).message, { variant: "error" }); } finally { From e8151ad3ffce9622486f7b9908ad09ebcb901372 Mon Sep 17 00:00:00 2001 From: Han Tuerker Date: Tue, 9 Aug 2022 04:23:15 +0300 Subject: [PATCH 056/309] feat(airtable-migration): fix new columns misorder --- .../ImportAirtableWizard/Step2NewColumns.tsx | 49 +++++++++++-------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/src/components/TableModals/ImportAirtableWizard/Step2NewColumns.tsx b/src/components/TableModals/ImportAirtableWizard/Step2NewColumns.tsx index 5790f57b..dfade0bc 100644 --- a/src/components/TableModals/ImportAirtableWizard/Step2NewColumns.tsx +++ b/src/components/TableModals/ImportAirtableWizard/Step2NewColumns.tsx @@ -29,8 +29,13 @@ export default function Step2NewColumns({ setConfig((config) => ({ ...config, newColumns })); }; - const fieldData = - airtableData.records[0].fields[config.pairs[fieldToEdit]?.fieldKey]; + const currentPair = find(config.pairs, { + columnKey: config.newColumns[fieldToEdit]?.key, + }); + + const rowData = airtableData.records.map( + (record) => record.fields[currentPair?.fieldKey ?? ""] + ); return ( <> @@ -108,30 +113,34 @@ export default function Step2NewColumns({ /> - - {!isXs && ( + {rowData.slice(0, 20).map((cell, i) => ( + + {!isXs && ( + + + + )} + + {!isXs && ( + theme.spacing(3) }} /> + )} + - )} - - {!isXs && theme.spacing(3) }} />} - - - - + ))}
    From 499a76ab86d4676f70534839f19e2343522950f5 Mon Sep 17 00:00:00 2001 From: Han Tuerker Date: Tue, 9 Aug 2022 04:27:22 +0300 Subject: [PATCH 057/309] feat(airtable-migration): add preview step --- .../ImportAirtableWizard/Step3Preview.tsx | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 src/components/TableModals/ImportAirtableWizard/Step3Preview.tsx diff --git a/src/components/TableModals/ImportAirtableWizard/Step3Preview.tsx b/src/components/TableModals/ImportAirtableWizard/Step3Preview.tsx new file mode 100644 index 00000000..eb83b4c6 --- /dev/null +++ b/src/components/TableModals/ImportAirtableWizard/Step3Preview.tsx @@ -0,0 +1,80 @@ +import { useAtom } from "jotai"; +import { find } from "lodash-es"; +import { parseJSON } from "date-fns"; + +import { styled, Grid } from "@mui/material"; +import Column from "@src/components/Table/Column"; +import Cell from "@src/components/Table/Cell"; + +import { IStepProps } from "."; +import { tableScope, tableSchemaAtom } from "@src/atoms/tableScope"; +import { FieldType } from "@src/constants/fields"; + +const Spacer = styled(Grid)(({ theme }) => ({ + width: theme.spacing(3), + height: theme.spacing(3), + flexShrink: 0, +})); + +const ColumnWrapper = styled(Grid)(() => ({ + width: 200, + flexShrink: 0, + marginLeft: -1, + "&:first-of-type": { marginLeft: 0 }, +})); + +export default function Step3Preview({ airtableData, config }: IStepProps) { + const [tableSchema] = useAtom(tableSchemaAtom, tableScope); + + const columns = config.pairs.map(({ fieldKey, columnKey }) => ({ + fieldKey, + columnKey, + ...(tableSchema.columns?.[columnKey] ?? + find(config.newColumns, { key: columnKey }) ?? + {}), + })); + + return ( +
    +
    + + {columns.map(({ key, name, type }) => ( + + + + ))} + + + + + {columns.map(({ fieldKey, name, columnKey, type }) => ( + + {airtableData.records.map((record, i) => ( + + ))} + + + ))} + + +
    +
    + ); +} From cbc783bd87348a3788b46fbc2ae05e9576ff8f6a Mon Sep 17 00:00:00 2001 From: Han Tuerker Date: Wed, 10 Aug 2022 03:53:58 +0300 Subject: [PATCH 058/309] feat(airtable-migration): add date field parser --- .../TableModals/ImportAirtableWizard/Step2NewColumns.tsx | 9 +++++++-- .../TableModals/ImportAirtableWizard/Step3Preview.tsx | 8 ++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/components/TableModals/ImportAirtableWizard/Step2NewColumns.tsx b/src/components/TableModals/ImportAirtableWizard/Step2NewColumns.tsx index dfade0bc..28e9630f 100644 --- a/src/components/TableModals/ImportAirtableWizard/Step2NewColumns.tsx +++ b/src/components/TableModals/ImportAirtableWizard/Step2NewColumns.tsx @@ -1,6 +1,6 @@ import { useState } from "react"; import { find } from "lodash-es"; -import { parseJSON } from "date-fns"; +import { parseISO } from "date-fns"; import { Grid, Typography, Divider, ButtonBase } from "@mui/material"; import ChevronRightIcon from "@mui/icons-material/ChevronRight"; @@ -134,7 +134,12 @@ export default function Step2NewColumns({ diff --git a/src/components/TableModals/ImportAirtableWizard/Step3Preview.tsx b/src/components/TableModals/ImportAirtableWizard/Step3Preview.tsx index eb83b4c6..ae658891 100644 --- a/src/components/TableModals/ImportAirtableWizard/Step3Preview.tsx +++ b/src/components/TableModals/ImportAirtableWizard/Step3Preview.tsx @@ -1,6 +1,6 @@ import { useAtom } from "jotai"; import { find } from "lodash-es"; -import { parseJSON } from "date-fns"; +import { parseISO } from "date-fns"; import { styled, Grid } from "@mui/material"; import Column from "@src/components/Table/Column"; @@ -64,7 +64,11 @@ export default function Step3Preview({ airtableData, config }: IStepProps) { From 7a765993e102d4d7b4e84ebdc81c3bd713d0a01b Mon Sep 17 00:00:00 2001 From: Han Tuerker Date: Wed, 10 Aug 2022 04:15:46 +0300 Subject: [PATCH 059/309] feat(airtable-migration): fix date parser --- .../ImportAirtableWizard.tsx | 53 +++++++++++++------ 1 file changed, 37 insertions(+), 16 deletions(-) diff --git a/src/components/TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx b/src/components/TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx index 9c5a0dc7..b65c3c43 100644 --- a/src/components/TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx +++ b/src/components/TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx @@ -5,6 +5,7 @@ import { RESET } from "jotai/utils"; import { useSnackbar } from "notistack"; import { uniqBy, isEqual, find } from "lodash-es"; import { ITableModalProps } from "@src/components/TableModals"; +import WizardDialog from "@src/components/TableModals/WizardDialog"; import { useTheme, @@ -16,9 +17,6 @@ import { Button, } from "@mui/material"; -import WizardDialog from "@src/components/TableModals/WizardDialog"; -import Step1Columns from "./Step1Columns"; - import { tableScope, tableSettingsAtom, @@ -30,11 +28,15 @@ import { tableModalAtom, } from "@src/atoms/tableScope"; import { ColumnConfig } from "@src/types/table"; -import Step2NewColumns from "./Step2NewColumns"; + import SnackbarProgress, { ISnackbarProgressRef, } from "@src/components/SnackbarProgress"; import { FieldType } from "@src/constants/fields"; +import Step1Columns from "./Step1Columns"; +import Step2NewColumns from "./Step2NewColumns"; +import Step3Preview from "./Step3Preview"; +import { parseISO, isValid as isValidDate } from "date-fns"; export type AirtableConfig = { pairs: { fieldKey: string; columnKey: string }[]; @@ -101,13 +103,20 @@ export default function ImportAirtableWizard({ onClose }: ITableModalProps) { switch (fieldType) { case FieldType.multiSelect: return (v: string[]) => v; + case FieldType.date: + case FieldType.dateTime: + return (v: string) => { + const date = parseISO(v); + return isValidDate(date) ? date.getTime() : null; + }; default: return null; } }; - const parsedRecords = (records: any[]): any[] => - records.map((record) => + const parseRecords = (records: any[]): any[] => { + if (!columns || !airtableData) return []; + return records.map((record) => config.pairs.reduce((a, pair) => { const matchingColumn = columns[pair.columnKey] ?? @@ -116,9 +125,10 @@ export default function ImportAirtableWizard({ onClose }: ITableModalProps) { const value = parser ? parser(record.fields[pair.fieldKey], matchingColumn.config) : record.fields[pair.fieldKey]; - return { ...a, [pair.columnKey]: value }; + return { ...a, [pair.columnKey]: value, id: record.id }; }, {}) ); + }; const handleFinish = async () => { console.time("importAirtable"); @@ -170,7 +180,7 @@ export default function ImportAirtableWizard({ onClose }: ITableModalProps) { ); promises.push( bulkAddRows({ - rows: parsedRecords(records), + rows: parseRecords(records), collection: tableSettings.collection, }).then(() => { countRef.current += records.length; @@ -186,12 +196,12 @@ export default function ImportAirtableWizard({ onClose }: ITableModalProps) { } } }; - const recursiveAll = async (): Promise => { + const resolveAll = async (): Promise => { return Promise.all(promises).then((result) => { if (result.length === promises.length) { return result; } - return recursiveAll(); + return resolveAll(); }); }; @@ -200,19 +210,16 @@ export default function ImportAirtableWizard({ onClose }: ITableModalProps) { for (const col of config.newColumns) promises.push(addColumn({ config: col })); - await Promise.all(promises); - const { records, offset: nextPage } = await fetchRecords(); snackbarProgressRef.current?.setTarget(records.length); - countRef.current += records.length; - console.log("before fetcher"); + await fetcher(1, nextPage); - await recursiveAll(); + await resolveAll(); + enqueueSnackbar( `Imported ${Number(countRef.current).toLocaleString()} rows`, { variant: "success" } ); - console.log("after fetcher"); } catch (e) { enqueueSnackbar((e as Error).message, { variant: "error" }); } finally { @@ -273,6 +280,20 @@ export default function ImportAirtableWizard({ onClose }: ITableModalProps) { false ), }, + { + title: "Preview", + description: + "Preview your data with your configured columns. You can change column types by clicking “Edit type” from the column menu at any time.", + content: ( + + ), + }, ].filter((x) => x) as any } onFinish={handleFinish} From d0654cfd7dd88b35042311229fcb78652e6759ef Mon Sep 17 00:00:00 2001 From: Han Tuerker Date: Wed, 10 Aug 2022 04:25:41 +0300 Subject: [PATCH 060/309] feat(airtable-migration): add update by id --- src/atoms/tableScope/rowActions.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/atoms/tableScope/rowActions.ts b/src/atoms/tableScope/rowActions.ts index 3abbf516..cbb9cb3d 100644 --- a/src/atoms/tableScope/rowActions.ts +++ b/src/atoms/tableScope/rowActions.ts @@ -265,8 +265,8 @@ export const bulkAddRowsAtom = atom( // Assign a random ID to each row const operations = rows.map((row) => ({ - type: "add" as "add", - path: `${collection}/${generateId()}`, + type: row?.id ? ("update" as "update") : ("add" as "add"), + path: `${collection}/${row?.id ?? generateId()}`, data: { ...initialValues, ...omitRowyFields(row) }, })); From 768424913fbe8603b395f3d62f319f88901ec807 Mon Sep 17 00:00:00 2001 From: Han Tuerker Date: Wed, 10 Aug 2022 05:03:11 +0300 Subject: [PATCH 061/309] feat(airtable-migration): refactor value preview --- .../ImportAirtableWizard.tsx | 37 +++++++++++-------- .../ImportAirtableWizard/Step2NewColumns.tsx | 11 +++--- .../ImportAirtableWizard/Step3Preview.tsx | 8 ++-- src/components/fields/Date/TableCell.tsx | 2 +- 4 files changed, 31 insertions(+), 27 deletions(-) diff --git a/src/components/TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx b/src/components/TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx index b65c3c43..5cc05c12 100644 --- a/src/components/TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx +++ b/src/components/TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx @@ -51,6 +51,26 @@ export interface IStepProps { isXs: boolean; } +export const airtableFieldParser = (fieldType: FieldType) => { + switch (fieldType) { + case FieldType.percentage: + return (v: string) => { + const numValue = parseFloat(v && v.includes("%") ? v.slice(0, -1) : v); + return isNaN(numValue) ? null : numValue / 100; + }; + case FieldType.multiSelect: + return (v: string[]) => v; + case FieldType.date: + case FieldType.dateTime: + return (v: string) => { + const date = parseISO(v); + return isValidDate(date) ? date.getTime() : null; + }; + default: + return null; + } +}; + export default function ImportAirtableWizard({ onClose }: ITableModalProps) { const [tableSettings] = useAtom(tableSettingsAtom, tableScope); const [tableSchema] = useAtom(tableSchemaAtom, tableScope); @@ -99,21 +119,6 @@ export default function ImportAirtableWizard({ onClose }: ITableModalProps) { return response; }; - const airtableFieldParser = (fieldType: FieldType): any => { - switch (fieldType) { - case FieldType.multiSelect: - return (v: string[]) => v; - case FieldType.date: - case FieldType.dateTime: - return (v: string) => { - const date = parseISO(v); - return isValidDate(date) ? date.getTime() : null; - }; - default: - return null; - } - }; - const parseRecords = (records: any[]): any[] => { if (!columns || !airtableData) return []; return records.map((record) => @@ -123,7 +128,7 @@ export default function ImportAirtableWizard({ onClose }: ITableModalProps) { find(config.newColumns, { key: pair.columnKey }); const parser = airtableFieldParser(matchingColumn.type); const value = parser - ? parser(record.fields[pair.fieldKey], matchingColumn.config) + ? parser(record.fields[pair.fieldKey]) : record.fields[pair.fieldKey]; return { ...a, [pair.columnKey]: value, id: record.id }; }, {}) diff --git a/src/components/TableModals/ImportAirtableWizard/Step2NewColumns.tsx b/src/components/TableModals/ImportAirtableWizard/Step2NewColumns.tsx index 28e9630f..0a73fb92 100644 --- a/src/components/TableModals/ImportAirtableWizard/Step2NewColumns.tsx +++ b/src/components/TableModals/ImportAirtableWizard/Step2NewColumns.tsx @@ -1,6 +1,5 @@ import { useState } from "react"; import { find } from "lodash-es"; -import { parseISO } from "date-fns"; import { Grid, Typography, Divider, ButtonBase } from "@mui/material"; import ChevronRightIcon from "@mui/icons-material/ChevronRight"; @@ -14,6 +13,8 @@ import FieldsDropdown from "@src/components/ColumnModals/FieldsDropdown"; import { FieldType } from "@src/constants/fields"; import { SELECTABLE_TYPES } from "@src/components/TableModals/ImportExistingWizard/utils"; +import { airtableFieldParser } from "./ImportAirtableWizard"; + export default function Step2NewColumns({ airtableData, config, @@ -36,6 +37,7 @@ export default function Step2NewColumns({ const rowData = airtableData.records.map( (record) => record.fields[currentPair?.fieldKey ?? ""] ); + console.log(airtableFieldParser(config.newColumns[fieldToEdit].type)); return ( <> @@ -135,10 +137,9 @@ export default function Step2NewColumns({ ({ width: theme.spacing(3), @@ -65,9 +64,8 @@ export default function Step3Preview({ airtableData, config }: IStepProps) { key={fieldKey + i} field={columnKey} value={ - type === FieldType.date || type === FieldType.dateTime - ? parseISO(record.fields[fieldKey]) - : record.fields[fieldKey] + airtableFieldParser(type)?.(record.fields[fieldKey]) ?? + record.fields[fieldKey] } type={type} name={name} diff --git a/src/components/fields/Date/TableCell.tsx b/src/components/fields/Date/TableCell.tsx index e8f84685..08295168 100644 --- a/src/components/fields/Date/TableCell.tsx +++ b/src/components/fields/Date/TableCell.tsx @@ -27,7 +27,7 @@ export default function Date_({ if (disabled) return ( Date: Wed, 10 Aug 2022 06:10:21 +0300 Subject: [PATCH 062/309] feat(airtable-migration): fix datetime basic cell --- src/components/fields/DateTime/TableCell.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/fields/DateTime/TableCell.tsx b/src/components/fields/DateTime/TableCell.tsx index 6c8b2ad5..53439ff0 100644 --- a/src/components/fields/DateTime/TableCell.tsx +++ b/src/components/fields/DateTime/TableCell.tsx @@ -32,7 +32,7 @@ export default function DateTime({ if (disabled) return ( Date: Wed, 10 Aug 2022 06:13:41 +0300 Subject: [PATCH 063/309] feat(airtable-migration): clean up for pr --- src/atoms/tableScope/ui.ts | 11 ++ .../ImportAirtableWizard.tsx | 58 ++++---- .../ImportAirtableWizard/Step1Columns.tsx | 2 +- .../ImportAirtableWizard/Step2NewColumns.tsx | 8 +- .../ImportAirtableWizard/Step3Preview.tsx | 5 +- .../TableModals/ImportAirtableWizard/index.ts | 2 + src/components/TableModals/TableModals.tsx | 4 + src/components/TableToolbar/ImportCsv.tsx | 128 ++++++++---------- 8 files changed, 106 insertions(+), 112 deletions(-) create mode 100644 src/components/TableModals/ImportAirtableWizard/index.ts diff --git a/src/atoms/tableScope/ui.ts b/src/atoms/tableScope/ui.ts index 0b03051f..3a486fec 100644 --- a/src/atoms/tableScope/ui.ts +++ b/src/atoms/tableScope/ui.ts @@ -100,16 +100,27 @@ export const tableModalAtom = atomWithHash< | "export" | "importExisting" | "importCsv" + | "importAirtable" | null >("tableModal", null, { replaceState: true }); export type ImportCsvData = { columns: string[]; rows: Record[] }; +export type ImportAirtableData = { records: Record[] }; + /** Store import CSV popover and wizard state */ export const importCsvAtom = atom<{ importType: "csv" | "tsv"; csvData: ImportCsvData | null; }>({ importType: "csv", csvData: null }); +/** Store import Airtable popover and wizard state */ +export const importAirtableAtom = atom<{ + airtableData: ImportAirtableData | null; + apiKey: string; + baseId: string; + tableId: string; +}>({ airtableData: null, apiKey: "", baseId: "", tableId: "" }); + /** Store side drawer open state */ export const sideDrawerOpenAtom = atom(false); diff --git a/src/components/TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx b/src/components/TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx index 5cc05c12..595a4002 100644 --- a/src/components/TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx +++ b/src/components/TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx @@ -53,13 +53,6 @@ export interface IStepProps { export const airtableFieldParser = (fieldType: FieldType) => { switch (fieldType) { - case FieldType.percentage: - return (v: string) => { - const numValue = parseFloat(v && v.includes("%") ? v.slice(0, -1) : v); - return isNaN(numValue) ? null : numValue / 100; - }; - case FieldType.multiSelect: - return (v: string[]) => v; case FieldType.date: case FieldType.dateTime: return (v: string) => { @@ -67,7 +60,7 @@ export const airtableFieldParser = (fieldType: FieldType) => { return isValidDate(date) ? date.getTime() : null; }; default: - return null; + return (v: string) => v; } }; @@ -176,31 +169,31 @@ export default function ImportAirtableWizard({ onClose }: ITableModalProps) { // Airtable Rate Limits: 5 req/sec const RATE_LIMIT = { REQ_PER_SECOND: 5 }; - const fetcher = async (i: number, offset?: string): Promise => { + const fetcher = async (i: number = 0, offset?: string): Promise => { console.log(i, offset, promises); - if (offset) { - const { records, offset: nextPage } = await fetchRecords(offset); - snackbarProgressRef.current?.setTarget( - (prev) => prev + records.length - ); - promises.push( - bulkAddRows({ - rows: parseRecords(records), - collection: tableSettings.collection, - }).then(() => { - countRef.current += records.length; - snackbarProgressRef.current?.setProgress( - (prev) => prev + records.length - ); - }) - ); - if (i < RATE_LIMIT.REQ_PER_SECOND - 1) { - promises.push(fetcher(++i, nextPage)); - } else { - promises.push(timeout(1050).then(() => fetcher(0, nextPage))); - } + const { records, offset: nextPage } = await fetchRecords(offset); + snackbarProgressRef.current?.setTarget((prev) => prev + records.length); + promises.push( + bulkAddRows({ + rows: parseRecords(records), + collection: tableSettings.collection, + }).then(() => { + countRef.current += records.length; + snackbarProgressRef.current?.setProgress( + (prev) => prev + records.length + ); + }) + ); + if (!nextPage) { + return; + } + if (i < RATE_LIMIT.REQ_PER_SECOND - 1) { + promises.push(fetcher(++i, nextPage)); + } else { + promises.push(timeout(1050).then(() => fetcher(0, nextPage))); } }; + const resolveAll = async (): Promise => { return Promise.all(promises).then((result) => { if (result.length === promises.length) { @@ -215,10 +208,7 @@ export default function ImportAirtableWizard({ onClose }: ITableModalProps) { for (const col of config.newColumns) promises.push(addColumn({ config: col })); - const { records, offset: nextPage } = await fetchRecords(); - snackbarProgressRef.current?.setTarget(records.length); - - await fetcher(1, nextPage); + await fetcher(); await resolveAll(); enqueueSnackbar( diff --git a/src/components/TableModals/ImportAirtableWizard/Step1Columns.tsx b/src/components/TableModals/ImportAirtableWizard/Step1Columns.tsx index d7d07c06..4b5f8035 100644 --- a/src/components/TableModals/ImportAirtableWizard/Step1Columns.tsx +++ b/src/components/TableModals/ImportAirtableWizard/Step1Columns.tsx @@ -95,8 +95,8 @@ export default function Step1Columns({ }; const handleChange = (fieldKey: string) => (value: string) => { + if (!value) return; const columnKey = !!tableSchema.columns?.[value] ? value : camelCase(value); - console.log(config); // Check if this pair already exists in config const configIndex = findIndex(config.pairs, { fieldKey }); if (configIndex > -1) { diff --git a/src/components/TableModals/ImportAirtableWizard/Step2NewColumns.tsx b/src/components/TableModals/ImportAirtableWizard/Step2NewColumns.tsx index 0a73fb92..3c9a7628 100644 --- a/src/components/TableModals/ImportAirtableWizard/Step2NewColumns.tsx +++ b/src/components/TableModals/ImportAirtableWizard/Step2NewColumns.tsx @@ -136,11 +136,9 @@ export default function Step2NewColumns({ diff --git a/src/components/TableModals/ImportAirtableWizard/Step3Preview.tsx b/src/components/TableModals/ImportAirtableWizard/Step3Preview.tsx index 403bd48a..0a0a4426 100644 --- a/src/components/TableModals/ImportAirtableWizard/Step3Preview.tsx +++ b/src/components/TableModals/ImportAirtableWizard/Step3Preview.tsx @@ -63,10 +63,7 @@ export default function Step3Preview({ airtableData, config }: IStepProps) { diff --git a/src/components/TableModals/ImportAirtableWizard/index.ts b/src/components/TableModals/ImportAirtableWizard/index.ts new file mode 100644 index 00000000..85ca010f --- /dev/null +++ b/src/components/TableModals/ImportAirtableWizard/index.ts @@ -0,0 +1,2 @@ +export * from "./ImportAirtableWizard"; +export { default } from "./ImportAirtableWizard"; diff --git a/src/components/TableModals/TableModals.tsx b/src/components/TableModals/TableModals.tsx index 906967f3..072ea52c 100644 --- a/src/components/TableModals/TableModals.tsx +++ b/src/components/TableModals/TableModals.tsx @@ -15,6 +15,8 @@ const WebhooksModal = lazy(() => import("./WebhooksModal" /* webpackChunkName: " const ImportExistingWizard = lazy(() => import("./ImportExistingWizard" /* webpackChunkName: "TableModals-ImportExistingWizard" */)); // prettier-ignore const ImportCsvWizard = lazy(() => import("./ImportCsvWizard" /* webpackChunkName: "TableModals-ImportCsvWizard" */)); +// prettier-ignore +const ImportAirtableWizard = lazy(() => import("./ImportAirtableWizard" /* webpackChunkName: "TableModals-ImportAirtableWizard" */)); export interface ITableModalProps { onClose: () => void; @@ -34,6 +36,8 @@ export default function TableModals() { if (tableModal === "importExisting") return ; if (tableModal === "importCsv") return ; + if (tableModal === "importAirtable") + return ; return null; } diff --git a/src/components/TableToolbar/ImportCsv.tsx b/src/components/TableToolbar/ImportCsv.tsx index d9284f37..181b9cc7 100644 --- a/src/components/TableToolbar/ImportCsv.tsx +++ b/src/components/TableToolbar/ImportCsv.tsx @@ -31,6 +31,7 @@ import { tableSettingsAtom, tableModalAtom, importCsvAtom, + importAirtableAtom, } from "@src/atoms/tableScope"; import { analytics, logEvent } from "@src/analytics"; @@ -51,19 +52,23 @@ export interface IImportCsvProps { export default function ImportCsv({ render, PopoverProps }: IImportCsvProps) { const [userRoles] = useAtom(userRolesAtom, globalScope); const [tableSettings] = useAtom(tableSettingsAtom, tableScope); - const [{ importType, csvData }, setImportCsv] = useAtom( + const [{ importType: importTypeCsv, csvData }, setImportCsv] = useAtom( importCsvAtom, tableScope ); + const [{ airtableData, baseId, tableId, apiKey }, setImportAirtable] = + useAtom(importAirtableAtom, tableScope); + const openTableModal = useSetAtom(tableModalAtom, tableScope); const { enqueueSnackbar } = useSnackbar(); - const importTypeRef = useRef(importType); + const importTypeRef = useRef(importTypeCsv); const importMethodRef = useRef(ImportMethod.upload); const [open, setOpen] = useState(null); const [tab, setTab] = useState("upload"); const [error, setError] = useState(""); + const [airtableError, setAirtableError] = useState({}); const validCsv = csvData !== null && csvData?.columns.length > 0 && csvData?.rows.length > 0; @@ -171,42 +176,44 @@ export default function ImportCsv({ render, PopoverProps }: IImportCsvProps) { }); }, 1000); - const [airtable, setAirtable] = useState({ - apiKey: "", - baseID: "", - tableID: "", - }); - const [data, setData] = useState(null); - const [validConnection, setValidConnection] = useState(false); const handleAirtableConnection = () => { - if (!airtable.apiKey) { - setError({ apiKey: { message: "API Key is missing!" } }); + if (!apiKey) { + setAirtableError({ apiKey: { message: "API Key is missing!" } }); return; } - if (!airtable.baseID) { - setError({ baseID: { message: "Base ID is missing!" } }); + if (!baseId) { + setAirtableError({ baseId: { message: "Base ID is missing!" } }); return; } - if (!airtable.tableID) { - setError({ tableID: { message: "Table ID is missing!" } }); + if (!tableId) { + setAirtableError({ tableId: { message: "Table ID is missing!" } }); return; } setLoading(true); - fetch( - `https://api.airtable.com/v0/${airtable.baseID}/${airtable.tableID}?maxRecords=1`, - { - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${airtable.apiKey}`, - }, - } - ) + fetch(`https://api.airtable.com/v0/${baseId}/${tableId}?maxRecords=20`, { + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${apiKey}`, + }, + }) .then((response) => response.json()) - .then((body) => setData(body.records)) + .then((body) => { + const { error } = body; + + if (error) { + throw new Error(error); + } + console.log(body); + setImportAirtable((prev) => ({ ...prev, airtableData: body })); + openTableModal("importAirtable"); + }) .then(() => { - setValidConnection(true); setLoading(false); - setError(""); + setAirtableError(null); + }) + .catch((error) => { + console.error(error); + setLoading(false); }); }; @@ -401,15 +408,15 @@ export default function ImportCsv({ render, PopoverProps }: IImportCsvProps) { fullWidth label="Airtable API Key" placeholder="Insert your API key here" - value={airtable.apiKey} - onChange={(e) => { - setAirtable((airtable: any) => ({ - ...airtable, + value={apiKey} + onChange={(e) => + setImportAirtable((prev) => ({ + ...prev, apiKey: e.currentTarget.value, - })); - }} - helperText={error?.apiKey?.message} - error={!!error?.apiKey?.message} + })) + } + helperText={airtableError?.apiKey?.message} + error={!!airtableError?.apiKey?.message} /> { - setAirtable((airtable: any) => ({ - ...airtable, - baseID: e.currentTarget.value, + setImportAirtable((prev) => ({ + ...prev, + baseId: e.currentTarget.value, })); }} - helperText={error?.baseID?.message} - error={!!error?.baseID?.message} + helperText={airtableError?.baseId?.message} + error={!!airtableError?.baseId?.message} /> { - setAirtable((prev: any) => ({ - ...airtable, - tableID: e.currentTarget.value, + setImportAirtable((prev) => ({ + ...prev, + tableId: e.currentTarget.value, })); }} - helperText={error?.tableID?.message} - error={!!error?.tableID?.message} + helperText={airtableError?.tableId?.message} + error={!!airtableError?.tableId?.message} /> - {data && - data.map((record: any) => ( -
    Airtable record: {record.id}
    - ))} @@ -454,9 +457,7 @@ export default function ImportCsv({ render, PopoverProps }: IImportCsvProps) { variant="contained" color="primary" disabled={ - importMethodRef.current === "airtable" - ? loading && validConnection - : !validCsv + importMethodRef.current === "airtable" ? loading : !validCsv } sx={{ mt: -4, @@ -467,25 +468,16 @@ export default function ImportCsv({ render, PopoverProps }: IImportCsvProps) { }} onClick={() => { if (importMethodRef.current === "airtable") { - if (!data) { - handleAirtableConnection(); - } else { - console.log("hello"); - openTableModal("importCsv"); - } + handleAirtableConnection(); } else { openTableModal("importCsv"); - logEvent(analytics, `import_${importMethodRef.current}`, { - type: importTypeRef.current, - }); } + logEvent(analytics, `import_${importMethodRef.current}`, { + type: importTypeRef.current, + }); }} > - {importMethodRef.current === "airtable" - ? data - ? "Continue" - : "Test Connection" - : "Continue"} + Continue From 819cc0ff66e12d6d9d5ff332c94d289571ae0843 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Wed, 10 Aug 2022 11:10:48 +0200 Subject: [PATCH 064/309] fix BuildLogsSnack position with new nav --- .../BuildLogs/BuildLogsSnack.tsx | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/components/TableModals/CloudLogsModal/BuildLogs/BuildLogsSnack.tsx b/src/components/TableModals/CloudLogsModal/BuildLogs/BuildLogsSnack.tsx index 9cc98650..7d98cf18 100644 --- a/src/components/TableModals/CloudLogsModal/BuildLogs/BuildLogsSnack.tsx +++ b/src/components/TableModals/CloudLogsModal/BuildLogs/BuildLogsSnack.tsx @@ -1,6 +1,6 @@ import { useEffect, useRef, useState } from "react"; import { throttle } from "lodash-es"; -import { useSetAtom } from "jotai"; +import { useAtom, useSetAtom } from "jotai"; import { Typography, Box, Tooltip, IconButton } from "@mui/material"; import ExpandIcon from "@mui/icons-material/ExpandLess"; @@ -14,11 +14,16 @@ import CircularProgressOptical from "@src/components/CircularProgressOptical"; import { isTargetInsideBox } from "@src/utils/ui"; import { useSnackLogContext } from "@src/contexts/SnackLogContext"; import useBuildLogs from "./useBuildLogs"; +import { projectScope, navOpenAtom } from "@src/atoms/projectScope"; import { tableScope, tableModalAtom, cloudLogFiltersAtom, } from "@src/atoms/tableScope"; +import { + NAV_DRAWER_WIDTH, + NAV_DRAWER_COLLAPSED_WIDTH, +} from "@src/layouts/Navigation/NavDrawer"; export interface IBuildLogsSnackProps { onClose: () => void; @@ -33,6 +38,8 @@ export default function BuildLogsSnack({ const { latestLog } = useBuildLogs(); const setModal = useSetAtom(tableModalAtom, tableScope); const setCloudLogFilters = useSetAtom(cloudLogFiltersAtom, tableScope); + const [navOpen] = useAtom(navOpenAtom, projectScope); + const latestActiveLog = latestLog?.startTimeStamp > snackLogContext.latestBuildTimestamp - 5000 || latestLog?.startTimeStamp > snackLogContext.latestBuildTimestamp + 5000 @@ -83,9 +90,15 @@ export default function BuildLogsSnack({ theme.spacing(2), - bottom: (theme) => theme.spacing(2), + left: { + xs: `max(env(safe-area-inset-left), 8px)`, + md: `max(env(safe-area-inset-left), ${ + (navOpen ? NAV_DRAWER_WIDTH : NAV_DRAWER_COLLAPSED_WIDTH) + 8 + }px)`, + }, + bottom: `max(env(safe-area-inset-left), 8px)`, backgroundColor: "#282829", + colorScheme: "dark", boxShadow: 6, color: "#fff", width: 650, From 4f25cca68a53fac24636bbbc15f35a4cd60a5ae2 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Wed, 10 Aug 2022 12:10:51 +0200 Subject: [PATCH 065/309] fix row not writing to db once all required fields are written --- src/atoms/tableScope/rowActions.ts | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/atoms/tableScope/rowActions.ts b/src/atoms/tableScope/rowActions.ts index 3abbf516..6ddbb76d 100644 --- a/src/atoms/tableScope/rowActions.ts +++ b/src/atoms/tableScope/rowActions.ts @@ -346,16 +346,6 @@ export const updateFieldAtom = atom( update[tableSettings.auditFieldUpdatedBy || "_updatedBy"] = auditValue; } - // Check for required fields - const requiredFields = ignoreRequiredFields - ? [] - : tableColumnsOrdered - .filter((column) => column.config?.required) - .map((column) => column.key); - const missingRequiredFields = ignoreRequiredFields - ? [] - : requiredFields.filter((field) => row[field] === undefined); - // Apply field update if (!deleteField) { // Check for equality. If updated value is same as current, skip update @@ -367,6 +357,17 @@ export const updateFieldAtom = atom( _set(update, fieldName, value); } + // Check for required fields + const newRowValues = updateRowData(cloneDeep(row), update); + const requiredFields = ignoreRequiredFields + ? [] + : tableColumnsOrdered + .filter((column) => column.config?.required) + .map((column) => column.key); + const missingRequiredFields = ignoreRequiredFields + ? [] + : requiredFields.filter((field) => newRowValues[field] === undefined); + // If it’s a local row, update the row in rowsLocal if (isLocalRow) { set(tableRowsLocalAtom, { @@ -379,12 +380,11 @@ export const updateFieldAtom = atom( // If it has no missingRequiredFields, also write to db // And write entire row to handle the case where it doesn’t exist in db yet if (missingRequiredFields.length === 0) { - const rowValues = updateRowData(cloneDeep(row), update); - if (deleteField) unset(rowValues, fieldName); + if (deleteField) unset(newRowValues, fieldName); await updateRowDb( row._rowy_ref.path, - omitRowyFields(rowValues), + omitRowyFields(newRowValues), deleteField ? [fieldName] : [] ); } From 688052dcc134f6b76f6ef40d84afe234bacb6cec Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Aug 2022 10:19:36 +0000 Subject: [PATCH 066/309] Bump async from 2.6.3 to 2.6.4 Bumps [async](https://github.com/caolan/async) from 2.6.3 to 2.6.4. - [Release notes](https://github.com/caolan/async/releases) - [Changelog](https://github.com/caolan/async/blob/v2.6.4/CHANGELOG.md) - [Commits](https://github.com/caolan/async/compare/v2.6.3...v2.6.4) --- updated-dependencies: - dependency-name: async dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index da7f9913..503d0c59 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4672,9 +4672,9 @@ astral-regex@^2.0.0: integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== async@^2.6.2: - version "2.6.3" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" - integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + version "2.6.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== dependencies: lodash "^4.17.14" From 98c56f8d61fbdcb0e55b1c6ff76c214ec57b7533 Mon Sep 17 00:00:00 2001 From: Han Tuerker Date: Thu, 11 Aug 2022 03:13:23 +0300 Subject: [PATCH 067/309] feat(airtable-migration): add document id picker --- .../ImportAirtableWizard/Step1Columns.tsx | 36 ++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/src/components/TableModals/ImportAirtableWizard/Step1Columns.tsx b/src/components/TableModals/ImportAirtableWizard/Step1Columns.tsx index 4b5f8035..ac005aa3 100644 --- a/src/components/TableModals/ImportAirtableWizard/Step1Columns.tsx +++ b/src/components/TableModals/ImportAirtableWizard/Step1Columns.tsx @@ -10,10 +10,14 @@ import { FormControlLabel, Checkbox, Chip, + FormControl, + RadioGroup, + Radio, } from "@mui/material"; import ArrowIcon from "@mui/icons-material/ArrowForward"; import { IStepProps } from "."; +import { AirtableConfig, fieldRecommendation } from "./ImportAirtableWizard"; import FadeList from "@src/components/TableModals/ScrollableList"; import Column, { COLUMN_HEADER_HEIGHT } from "@src/components/Table/Column"; import MultiSelect from "@rowy/multiselect"; @@ -116,7 +120,7 @@ export default function Step1Columns({ name: value, fieldName: columnKey, key: columnKey, - type: FieldType.shortText, + type: fieldRecommendation(value), index: -1, config: {}, }, @@ -267,6 +271,36 @@ export default function Step1Columns({ ); })} + + + Document Ids (Optional) + + + + + { + const documentId = e.currentTarget.value as "auto" | "recordId"; + setConfig((prev: AirtableConfig) => ({ ...prev, documentId })); + }} + > + } + label="Use Airtable Record ID" + /> + } + label="Auto-Generated" + /> + + + +
    ); } From 58209bb00685446ef7964bef407155ad1408306c Mon Sep 17 00:00:00 2001 From: Han Tuerker Date: Thu, 11 Aug 2022 03:39:42 +0300 Subject: [PATCH 068/309] feat(airtable-migration): add field suggestion --- .../ImportAirtableWizard/Step1Columns.tsx | 7 +- .../TableModals/ImportAirtableWizard/utils.ts | 65 +++++++++++++++++++ 2 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 src/components/TableModals/ImportAirtableWizard/utils.ts diff --git a/src/components/TableModals/ImportAirtableWizard/Step1Columns.tsx b/src/components/TableModals/ImportAirtableWizard/Step1Columns.tsx index ac005aa3..12cde08a 100644 --- a/src/components/TableModals/ImportAirtableWizard/Step1Columns.tsx +++ b/src/components/TableModals/ImportAirtableWizard/Step1Columns.tsx @@ -17,7 +17,7 @@ import { import ArrowIcon from "@mui/icons-material/ArrowForward"; import { IStepProps } from "."; -import { AirtableConfig, fieldRecommendation } from "./ImportAirtableWizard"; +import { AirtableConfig } from "./ImportAirtableWizard"; import FadeList from "@src/components/TableModals/ScrollableList"; import Column, { COLUMN_HEADER_HEIGHT } from "@src/components/Table/Column"; import MultiSelect from "@rowy/multiselect"; @@ -28,6 +28,7 @@ import { tableColumnsOrderedAtom, } from "@src/atoms/tableScope"; import { FieldType } from "@src/constants/fields"; +import { suggestType } from "./utils"; export default function Step1Columns({ airtableData, @@ -120,7 +121,9 @@ export default function Step1Columns({ name: value, fieldName: columnKey, key: columnKey, - type: fieldRecommendation(value), + type: + suggestType(airtableData.records, fieldKey) || + FieldType.shortText, index: -1, config: {}, }, diff --git a/src/components/TableModals/ImportAirtableWizard/utils.ts b/src/components/TableModals/ImportAirtableWizard/utils.ts new file mode 100644 index 00000000..3c1697cb --- /dev/null +++ b/src/components/TableModals/ImportAirtableWizard/utils.ts @@ -0,0 +1,65 @@ +import { sortBy } from "lodash-es"; +import { FieldType } from "@src/constants/fields"; +import { + REGEX_EMAIL, + REGEX_PHONE, + REGEX_URL, + REGEX_HTML, +} from "@src/components/TableModals/ImportExistingWizard/utils"; +import { isValid as isValidDate, parseISO } from "date-fns"; + +export const inferTypeFromValue = (value: any) => { + if (!value || typeof value === "function") return; + + if (Array.isArray(value) && typeof value[0] === "string") + return FieldType.multiSelect; + if (typeof value === "boolean") return FieldType.checkbox; + + if (typeof value === "object") { + if ("hex" in value && "rgb" in value) return FieldType.color; + if ("toDate" in value) return FieldType.dateTime; + return FieldType.json; + } + + if (typeof value === "number") { + if (Math.abs(value) > 0 && Math.abs(value) < 1) return FieldType.percentage; + return FieldType.number; + } + + if (typeof value === "string") { + if (isValidDate(parseISO(value))) return FieldType.dateTime; + if (REGEX_EMAIL.test(value)) return FieldType.email; + if (REGEX_PHONE.test(value)) return FieldType.phone; + if (REGEX_URL.test(value)) return FieldType.url; + if (REGEX_HTML.test(value)) return FieldType.richText; + if (value.length >= 50) return FieldType.longText; + return FieldType.shortText; + } + + return; +}; +export const suggestType = (data: { [key: string]: any }[], field: string) => { + const results: Record = {}; + + data.forEach((record) => { + const result = inferTypeFromValue(record.fields[field]); + if (!result) return; + if (results[result] === undefined) results[result] = 1; + else results[result] += 1; + }); + + console.log(results); + const sortedResults = sortBy(Object.entries(results), 1).reverse(); + if (!sortedResults || !sortedResults[0]) return FieldType.json; + const bestMatch = sortedResults[0][0]; + + if (bestMatch === FieldType.shortText) { + const values = data.map((record) => record.fields[field]); + const uniqueValues = new Set(values); + const hasDuplicates = values.length !== uniqueValues.size; + + if (hasDuplicates && uniqueValues.size < 30) return FieldType.singleSelect; + } + + return bestMatch; +}; From 80eb1d0c34fcfe5f35a2f0d84f4e5a6132284b7f Mon Sep 17 00:00:00 2001 From: Han Tuerker Date: Thu, 11 Aug 2022 06:23:57 +0300 Subject: [PATCH 069/309] feat(airtable-migration): refactorings - extract import methods - move fieldParser into utils - add documentID radio buttons --- src/components/Table/EmptyTable.tsx | 8 +- .../ImportAirtableWizard.tsx | 36 +- .../ImportAirtableWizard/Step2NewColumns.tsx | 11 +- .../ImportAirtableWizard/Step3Preview.tsx | 4 +- .../TableModals/ImportAirtableWizard/utils.ts | 13 + src/components/TableToolbar/ImportCsv.tsx | 485 ------------------ .../TableToolbar/ImportData/ImportData.tsx | 117 +++++ .../ImportData/ImportFromAirtable.tsx | 147 ++++++ .../TableToolbar/ImportData/ImportFromCsv.tsx | 318 ++++++++++++ src/components/TableToolbar/TableToolbar.tsx | 4 +- 10 files changed, 616 insertions(+), 527 deletions(-) delete mode 100644 src/components/TableToolbar/ImportCsv.tsx create mode 100644 src/components/TableToolbar/ImportData/ImportData.tsx create mode 100644 src/components/TableToolbar/ImportData/ImportFromAirtable.tsx create mode 100644 src/components/TableToolbar/ImportData/ImportFromCsv.tsx diff --git a/src/components/Table/EmptyTable.tsx b/src/components/Table/EmptyTable.tsx index 96c5e2d0..c5739718 100644 --- a/src/components/Table/EmptyTable.tsx +++ b/src/components/Table/EmptyTable.tsx @@ -4,7 +4,7 @@ import { Grid, Stack, Typography, Button, Divider } from "@mui/material"; import { Import as ImportIcon } from "@src/assets/icons"; import { AddColumn as AddColumnIcon } from "@src/assets/icons"; -import ImportCsv from "@src/components/TableToolbar/ImportCsv"; +import ImportData from "@src/components/TableToolbar/ImportData/ImportData"; import { tableScope, @@ -72,10 +72,10 @@ export default function EmptyTable() { - You can import data from an external CSV file: + You can import data from an external source: - ( )} PopoverProps={{ diff --git a/src/components/TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx b/src/components/TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx index 595a4002..2de2bc7a 100644 --- a/src/components/TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx +++ b/src/components/TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx @@ -7,15 +7,7 @@ import { uniqBy, isEqual, find } from "lodash-es"; import { ITableModalProps } from "@src/components/TableModals"; import WizardDialog from "@src/components/TableModals/WizardDialog"; -import { - useTheme, - useMediaQuery, - Typography, - Link, - Alert, - AlertTitle, - Button, -} from "@mui/material"; +import { useTheme, useMediaQuery, Typography, Button } from "@mui/material"; import { tableScope, @@ -32,15 +24,15 @@ import { ColumnConfig } from "@src/types/table"; import SnackbarProgress, { ISnackbarProgressRef, } from "@src/components/SnackbarProgress"; -import { FieldType } from "@src/constants/fields"; +import { fieldParser } from "@src/components/TableModals/ImportAirtableWizard/utils"; import Step1Columns from "./Step1Columns"; import Step2NewColumns from "./Step2NewColumns"; import Step3Preview from "./Step3Preview"; -import { parseISO, isValid as isValidDate } from "date-fns"; export type AirtableConfig = { pairs: { fieldKey: string; columnKey: string }[]; newColumns: ColumnConfig[]; + documentId: "auto" | "recordId"; }; export interface IStepProps { @@ -51,19 +43,6 @@ export interface IStepProps { isXs: boolean; } -export const airtableFieldParser = (fieldType: FieldType) => { - switch (fieldType) { - case FieldType.date: - case FieldType.dateTime: - return (v: string) => { - const date = parseISO(v); - return isValidDate(date) ? date.getTime() : null; - }; - default: - return (v: string) => v; - } -}; - export default function ImportAirtableWizard({ onClose }: ITableModalProps) { const [tableSettings] = useAtom(tableSettingsAtom, tableScope); const [tableSchema] = useAtom(tableSchemaAtom, tableScope); @@ -84,6 +63,7 @@ export default function ImportAirtableWizard({ onClose }: ITableModalProps) { const [config, setConfig] = useState({ pairs: [], newColumns: [], + documentId: "recordId", }); const updateConfig: IStepProps["updateConfig"] = useCallback((value) => { @@ -93,7 +73,7 @@ export default function ImportAirtableWizard({ onClose }: ITableModalProps) { [...prev.newColumns, ...(value.newColumns ?? [])], "key" ).filter((col) => pairs.some((pair) => pair.columnKey === col.key)); - return { pairs, newColumns }; + return { ...prev, pairs, newColumns }; }); }, []); @@ -119,11 +99,13 @@ export default function ImportAirtableWizard({ onClose }: ITableModalProps) { const matchingColumn = columns[pair.columnKey] ?? find(config.newColumns, { key: pair.columnKey }); - const parser = airtableFieldParser(matchingColumn.type); + const parser = fieldParser(matchingColumn.type); const value = parser ? parser(record.fields[pair.fieldKey]) : record.fields[pair.fieldKey]; - return { ...a, [pair.columnKey]: value, id: record.id }; + return config.documentId === "recordId" + ? { ...a, [pair.columnKey]: value, id: record.id } + : { ...a, [pair.columnKey]: value }; }, {}) ); }; diff --git a/src/components/TableModals/ImportAirtableWizard/Step2NewColumns.tsx b/src/components/TableModals/ImportAirtableWizard/Step2NewColumns.tsx index 3c9a7628..e3b81ece 100644 --- a/src/components/TableModals/ImportAirtableWizard/Step2NewColumns.tsx +++ b/src/components/TableModals/ImportAirtableWizard/Step2NewColumns.tsx @@ -9,11 +9,9 @@ import ScrollableList from "@src/components/TableModals/ScrollableList"; import Column from "@src/components/Table/Column"; import Cell from "@src/components/Table/Cell"; import FieldsDropdown from "@src/components/ColumnModals/FieldsDropdown"; - import { FieldType } from "@src/constants/fields"; import { SELECTABLE_TYPES } from "@src/components/TableModals/ImportExistingWizard/utils"; - -import { airtableFieldParser } from "./ImportAirtableWizard"; +import { fieldParser } from "@src/components/TableModals/ImportAirtableWizard/utils"; export default function Step2NewColumns({ airtableData, @@ -37,7 +35,6 @@ export default function Step2NewColumns({ const rowData = airtableData.records.map( (record) => record.fields[currentPair?.fieldKey ?? ""] ); - console.log(airtableFieldParser(config.newColumns[fieldToEdit].type)); return ( <> @@ -136,9 +133,9 @@ export default function Step2NewColumns({ diff --git a/src/components/TableModals/ImportAirtableWizard/Step3Preview.tsx b/src/components/TableModals/ImportAirtableWizard/Step3Preview.tsx index 0a0a4426..ae5c0ee8 100644 --- a/src/components/TableModals/ImportAirtableWizard/Step3Preview.tsx +++ b/src/components/TableModals/ImportAirtableWizard/Step3Preview.tsx @@ -7,7 +7,7 @@ import Cell from "@src/components/Table/Cell"; import { IStepProps } from "."; import { tableScope, tableSchemaAtom } from "@src/atoms/tableScope"; -import { airtableFieldParser } from "./ImportAirtableWizard"; +import { fieldParser } from "@src/components/TableModals/ImportAirtableWizard/utils"; const Spacer = styled(Grid)(({ theme }) => ({ width: theme.spacing(3), @@ -63,7 +63,7 @@ export default function Step3Preview({ airtableData, config }: IStepProps) { diff --git a/src/components/TableModals/ImportAirtableWizard/utils.ts b/src/components/TableModals/ImportAirtableWizard/utils.ts index 3c1697cb..ab8d4490 100644 --- a/src/components/TableModals/ImportAirtableWizard/utils.ts +++ b/src/components/TableModals/ImportAirtableWizard/utils.ts @@ -63,3 +63,16 @@ export const suggestType = (data: { [key: string]: any }[], field: string) => { return bestMatch; }; + +export const fieldParser = (fieldType: FieldType) => { + switch (fieldType) { + case FieldType.date: + case FieldType.dateTime: + return (v: string) => { + const date = parseISO(v); + return isValidDate(date) ? date.getTime() : null; + }; + default: + return (v: any) => v; + } +}; diff --git a/src/components/TableToolbar/ImportCsv.tsx b/src/components/TableToolbar/ImportCsv.tsx deleted file mode 100644 index 181b9cc7..00000000 --- a/src/components/TableToolbar/ImportCsv.tsx +++ /dev/null @@ -1,485 +0,0 @@ -import { useState, useCallback, useRef } from "react"; -import { useAtom, useSetAtom } from "jotai"; -import { parse } from "csv-parse/browser/esm"; -import { useDropzone } from "react-dropzone"; -import { useDebouncedCallback } from "use-debounce"; -import { useSnackbar } from "notistack"; - -import { - Button, - Popover, - PopoverProps as MuiPopoverProps, - Grid, - Typography, - TextField, - FormHelperText, - Divider, -} from "@mui/material"; -import Tab from "@mui/material/Tab"; -import TabContext from "@mui/lab/TabContext"; -import TabList from "@mui/lab/TabList"; -import TabPanel from "@mui/lab/TabPanel"; - -import TableToolbarButton from "./TableToolbarButton"; -import { Import as ImportIcon } from "@src/assets/icons"; -import { Upload as FileUploadIcon } from "@src/assets/icons"; -import CheckIcon from "@mui/icons-material/CheckCircle"; - -import { globalScope, userRolesAtom } from "@src/atoms/globalScope"; -import { - tableScope, - tableSettingsAtom, - tableModalAtom, - importCsvAtom, - importAirtableAtom, -} from "@src/atoms/tableScope"; -import { analytics, logEvent } from "@src/analytics"; - -export enum ImportMethod { - paste = "paste", - upload = "upload", - url = "url", - airtable = "airtable", -} - -export interface IImportCsvProps { - render?: ( - onClick: (event: React.MouseEvent) => void - ) => React.ReactNode; - PopoverProps?: Partial; -} - -export default function ImportCsv({ render, PopoverProps }: IImportCsvProps) { - const [userRoles] = useAtom(userRolesAtom, globalScope); - const [tableSettings] = useAtom(tableSettingsAtom, tableScope); - const [{ importType: importTypeCsv, csvData }, setImportCsv] = useAtom( - importCsvAtom, - tableScope - ); - const [{ airtableData, baseId, tableId, apiKey }, setImportAirtable] = - useAtom(importAirtableAtom, tableScope); - - const openTableModal = useSetAtom(tableModalAtom, tableScope); - const { enqueueSnackbar } = useSnackbar(); - - const importTypeRef = useRef(importTypeCsv); - const importMethodRef = useRef(ImportMethod.upload); - const [open, setOpen] = useState(null); - const [tab, setTab] = useState("upload"); - - const [error, setError] = useState(""); - const [airtableError, setAirtableError] = useState({}); - const validCsv = - csvData !== null && csvData?.columns.length > 0 && csvData?.rows.length > 0; - - const handleOpen = (event: React.MouseEvent) => - setOpen(event.currentTarget); - const handleClose = () => { - setOpen(null); - setImportCsv({ importType: "csv", csvData: null }); - setTab("upload"); - setError(""); - }; - const popoverId = open ? "csv-popover" : undefined; - - const parseCsv = useCallback( - (csvString: string) => - parse(csvString, { delimiter: [",", "\t"] }, (err, rows) => { - if (err) { - setError(err.message); - } else { - const columns = rows.shift() ?? []; - if (columns.length === 0) { - setError("No columns detected"); - } else { - const mappedRows = rows.map((row: any) => - row.reduce( - (a: any, c: any, i: number) => ({ ...a, [columns[i]]: c }), - {} - ) - ); - setImportCsv({ - importType: importTypeRef.current, - csvData: { columns, rows: mappedRows }, - }); - setError(""); - } - } - }), - [setImportCsv] - ); - - const onDrop = useCallback( - async (acceptedFiles: File[]) => { - try { - const file = acceptedFiles[0]; - const reader = new FileReader(); - reader.onload = (event: any) => parseCsv(event.target.result); - reader.readAsText(file); - importTypeRef.current = - file.type === "text/tab-separated-values" ? "tsv" : "csv"; - } catch (error) { - enqueueSnackbar(`Please import a .tsv or .csv file`, { - variant: "error", - anchorOrigin: { - vertical: "top", - horizontal: "center", - }, - }); - } - }, - [enqueueSnackbar, parseCsv] - ); - - const { getRootProps, getInputProps, isDragActive } = useDropzone({ - onDrop, - multiple: false, - accept: ["text/csv", "text/tab-separated-values"], - }); - - function setDataTypeRef(data: string) { - const getFirstLine = data?.match(/^(.*)/)?.[0]; - /* - * Catching edge case with regex - * EG: "hello\tworld"\tFirst - * - find \t between quotes, and replace with '\s' - * - w/ the \t pattern test it against the formatted string - */ - const strInQuotes = /"(.*?)"/; - const tabsWithSpace = (str: string) => str.replace("\t", "s"); - const formatString = - getFirstLine?.replace(strInQuotes, tabsWithSpace) ?? ""; - const tabPattern = /\t/; - return tabPattern.test(formatString) - ? (importTypeRef.current = "tsv") - : (importTypeRef.current = "csv"); - } - const handlePaste = useDebouncedCallback((value: string) => { - parseCsv(value); - setDataTypeRef(value); - }, 1000); - - const [loading, setLoading] = useState(false); - const handleUrl = useDebouncedCallback((value: string) => { - setLoading(true); - setError(""); - fetch(value, { mode: "no-cors" }) - .then((res) => res.text()) - .then((data) => { - parseCsv(data); - setDataTypeRef(data); - setLoading(false); - }) - .catch((e) => { - setError(e.message); - setLoading(false); - }); - }, 1000); - - const handleAirtableConnection = () => { - if (!apiKey) { - setAirtableError({ apiKey: { message: "API Key is missing!" } }); - return; - } - if (!baseId) { - setAirtableError({ baseId: { message: "Base ID is missing!" } }); - return; - } - if (!tableId) { - setAirtableError({ tableId: { message: "Table ID is missing!" } }); - return; - } - setLoading(true); - fetch(`https://api.airtable.com/v0/${baseId}/${tableId}?maxRecords=20`, { - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${apiKey}`, - }, - }) - .then((response) => response.json()) - .then((body) => { - const { error } = body; - - if (error) { - throw new Error(error); - } - console.log(body); - setImportAirtable((prev) => ({ ...prev, airtableData: body })); - openTableModal("importAirtable"); - }) - .then(() => { - setLoading(false); - setAirtableError(null); - }) - .catch((error) => { - console.error(error); - setLoading(false); - }); - }; - - if (tableSettings.readOnly && !userRoles.includes("ADMIN")) return null; - - return ( - <> - {render ? ( - render(handleOpen) - ) : ( - } - /> - )} - - - - { - setTab(v); - setImportCsv({ - importType: importTypeRef.current, - csvData: null, - }); - setError(""); - }} - aria-label="Import CSV method tabs" - action={(actions) => - setTimeout(() => actions?.updateIndicator(), 200) - } - variant="fullWidth" - > - (importMethodRef.current = ImportMethod.upload)} - /> - (importMethodRef.current = ImportMethod.paste)} - /> - (importMethodRef.current = ImportMethod.url)} - /> - (importMethodRef.current = ImportMethod.airtable)} - /> - - - - - theme.palette.action.activeOpacity, - }, - - "&:focus": { - borderColor: "primary.main", - color: "primary.main", - outline: "none", - }, - }, - error ? { borderColor: "error.main", color: "error.main" } : {}, - ]} - > - - {isDragActive ? ( - - Drop CSV or TSV file here… - - ) : ( - <> - - {validCsv ? : } - - - - {validCsv - ? "Valid CSV or TSV" - : "Click to upload or drop CSV or TSV file here"} - - - - )} - - - {error && ( - - {error} - - )} - - - - { - if (csvData !== null) - setImportCsv({ - importType: importTypeRef.current, - csvData: null, - }); - handlePaste(e.target.value); - }} - sx={{ - typography: "body2", - fontFamily: "fontFamilyMono", - - "& .MuiInputBase-input": { - whiteSpace: "nowrap", - overflow: "auto", - fontFamily: "mono", - }, - }} - helperText={error} - error={!!error} - /> - - - - { - if (csvData !== null) - setImportCsv({ - importType: importTypeRef.current, - csvData: null, - }); - handleUrl(e.target.value); - }} - helperText={loading ? "Fetching…" : error} - error={!!error} - /> - - - - - Forget the storage limitations of Airtable. - - - setImportAirtable((prev) => ({ - ...prev, - apiKey: e.currentTarget.value, - })) - } - helperText={airtableError?.apiKey?.message} - error={!!airtableError?.apiKey?.message} - /> - { - setImportAirtable((prev) => ({ - ...prev, - baseId: e.currentTarget.value, - })); - }} - helperText={airtableError?.baseId?.message} - error={!!airtableError?.baseId?.message} - /> - { - setImportAirtable((prev) => ({ - ...prev, - tableId: e.currentTarget.value, - })); - }} - helperText={airtableError?.tableId?.message} - error={!!airtableError?.tableId?.message} - /> - - - - - - - ); -} diff --git a/src/components/TableToolbar/ImportData/ImportData.tsx b/src/components/TableToolbar/ImportData/ImportData.tsx new file mode 100644 index 00000000..bbe83543 --- /dev/null +++ b/src/components/TableToolbar/ImportData/ImportData.tsx @@ -0,0 +1,117 @@ +import { useState, useRef } from "react"; +import { useAtom } from "jotai"; + +import { + Popover, + PopoverProps as MuiPopoverProps, + Divider, +} from "@mui/material"; +import Tab from "@mui/material/Tab"; +import TabContext from "@mui/lab/TabContext"; +import TabList from "@mui/lab/TabList"; +import TabPanel from "@mui/lab/TabPanel"; + +import { Import as ImportIcon } from "@src/assets/icons"; + +import { globalScope, userRolesAtom } from "@src/atoms/globalScope"; +import { tableScope, tableSettingsAtom } from "@src/atoms/tableScope"; +import TableToolbarButton from "@src/components/TableToolbar/TableToolbarButton"; +import ImportFromCsv from "@src/components/TableToolbar/ImportData/ImportFromCsv"; +import ImportFromAirtable from "@src/components/TableToolbar/ImportData/ImportFromAirtable"; + +export interface IImportDataProps { + render?: ( + onClick: (event: React.MouseEvent) => void + ) => React.ReactNode; + PopoverProps?: Partial; +} + +export enum ImportMethod { + csv = "csv", + airtable = "airtable", +} + +export default function ImportData({ render, PopoverProps }: IImportDataProps) { + const [userRoles] = useAtom(userRolesAtom, globalScope); + const [tableSettings] = useAtom(tableSettingsAtom, tableScope); + + const importMethodRef = useRef(ImportMethod.csv); + const [open, setOpen] = useState(null); + const [tab, setTab] = useState("csv"); + const handleOpen = (event: React.MouseEvent) => + setOpen(event.currentTarget); + + const handleClose = () => { + setOpen(null); + setTab("csv"); + }; + const popoverId = open ? "import-popover" : undefined; + + if (tableSettings.readOnly && !userRoles.includes("ADMIN")) return null; + + return ( + <> + {render ? ( + render(handleOpen) + ) : ( + } + /> + )} + + + + setTab(v)} + aria-label="Import Data method tabs" + action={(actions) => + setTimeout(() => actions?.updateIndicator(), 200) + } + variant="fullWidth" + > + (importMethodRef.current = ImportMethod.csv)} + /> + (importMethodRef.current = ImportMethod.airtable)} + /> + + + + + + + + + + + + + + ); +} diff --git a/src/components/TableToolbar/ImportData/ImportFromAirtable.tsx b/src/components/TableToolbar/ImportData/ImportFromAirtable.tsx new file mode 100644 index 00000000..e7988b6b --- /dev/null +++ b/src/components/TableToolbar/ImportData/ImportFromAirtable.tsx @@ -0,0 +1,147 @@ +import { useState, useEffect } from "react"; +import { useAtom, useSetAtom } from "jotai"; + +import { Button, Typography, TextField } from "@mui/material"; + +import { + tableModalAtom, + importAirtableAtom, + tableScope, +} from "@src/atoms/tableScope"; +import { analytics, logEvent } from "@src/analytics"; + +export default function ImportFromAirtable() { + const [{ baseId, tableId, apiKey }, setImportAirtable] = useAtom( + importAirtableAtom, + tableScope + ); + const openTableModal = useSetAtom(tableModalAtom, tableScope); + const [loading, setLoading] = useState(false); + const [error, setError] = useState({}); + + useEffect(() => { + return () => { + setImportAirtable({ + airtableData: null, + apiKey: "", + baseId: "", + tableId: "", + }); + }; + }, [setImportAirtable]); + + const handleAirtableConnection = () => { + if (!apiKey) { + setError({ apiKey: { message: "API Key is missing!" } }); + return; + } + if (!baseId) { + setError({ baseId: { message: "Base ID is missing!" } }); + return; + } + if (!tableId) { + setError({ tableId: { message: "Table ID is missing!" } }); + return; + } + setLoading(true); + fetch(`https://api.airtable.com/v0/${baseId}/${tableId}?maxRecords=20`, { + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${apiKey}`, + }, + }) + .then((response) => response.json()) + .then((body) => { + const { error } = body; + if (error) { + throw new Error(error); + } + + setImportAirtable((prev) => ({ ...prev, airtableData: body })); + openTableModal("importAirtable"); + }) + .then(() => { + setLoading(false); + setError(null); + }) + .catch((error) => { + console.error(error); + setLoading(false); + }); + }; + + return ( + <> + + Forget the storage limitations of Airtable. Migrate your app data from + Airtable to a more scalable Firestore database that you can easily + manage with Rowy. + + + setImportAirtable((prev) => ({ + ...prev, + apiKey: e.currentTarget.value, + })) + } + helperText={error?.apiKey?.message} + error={!!error?.apiKey?.message} + /> + { + setImportAirtable((prev) => ({ + ...prev, + baseId: e.currentTarget.value, + })); + }} + helperText={error?.baseId?.message} + error={!!error?.baseId?.message} + /> + { + setImportAirtable((prev) => ({ + ...prev, + tableId: e.currentTarget.value, + })); + }} + helperText={error?.tableId?.message} + error={!!error?.tableId?.message} + /> + + + ); +} diff --git a/src/components/TableToolbar/ImportData/ImportFromCsv.tsx b/src/components/TableToolbar/ImportData/ImportFromCsv.tsx new file mode 100644 index 00000000..40ec3f84 --- /dev/null +++ b/src/components/TableToolbar/ImportData/ImportFromCsv.tsx @@ -0,0 +1,318 @@ +import { useState, useCallback, useRef, useEffect } from "react"; +import { useAtom, useSetAtom } from "jotai"; +import { parse } from "csv-parse/browser/esm"; +import { useDropzone } from "react-dropzone"; +import { useDebouncedCallback } from "use-debounce"; +import { useSnackbar } from "notistack"; + +import { + Button, + Grid, + Typography, + TextField, + FormHelperText, + Divider, +} from "@mui/material"; +import Tab from "@mui/material/Tab"; +import TabContext from "@mui/lab/TabContext"; +import TabList from "@mui/lab/TabList"; +import TabPanel from "@mui/lab/TabPanel"; + +import { Upload as FileUploadIcon } from "@src/assets/icons"; +import CheckIcon from "@mui/icons-material/CheckCircle"; + +import { + tableModalAtom, + importCsvAtom, + tableScope, +} from "@src/atoms/tableScope"; +import { analytics, logEvent } from "@src/analytics"; + +export enum ImportMethod { + paste = "paste", + upload = "upload", + url = "url", +} + +export default function ImportFromCsv() { + const [{ importType: importTypeCsv, csvData }, setImportCsv] = useAtom( + importCsvAtom, + tableScope + ); + const [tab, setTab] = useState("upload"); + const openTableModal = useSetAtom(tableModalAtom, tableScope); + const importMethodRef = useRef(ImportMethod.upload); + const importTypeRef = useRef(importTypeCsv); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(""); + const { enqueueSnackbar } = useSnackbar(); + const validCsv = + csvData !== null && csvData?.columns.length > 0 && csvData?.rows.length > 0; + + useEffect(() => { + return () => { + setImportCsv({ importType: "csv", csvData: null }); + }; + }, [setImportCsv]); + + const parseCsv = useCallback( + (csvString: string) => + parse(csvString, { delimiter: [",", "\t"] }, (err, rows) => { + if (err) { + setError(err.message); + } else { + const columns = rows.shift() ?? []; + if (columns.length === 0) { + setError("No columns detected"); + } else { + const mappedRows = rows.map((row: any) => + row.reduce( + (a: any, c: any, i: number) => ({ ...a, [columns[i]]: c }), + {} + ) + ); + setImportCsv({ + importType: importTypeRef.current, + csvData: { columns, rows: mappedRows }, + }); + setError(""); + } + } + }), + [setImportCsv] + ); + + const onDrop = useCallback( + async (acceptedFiles: File[]) => { + try { + const file = acceptedFiles[0]; + const reader = new FileReader(); + reader.onload = (event: any) => parseCsv(event.target.result); + reader.readAsText(file); + importTypeRef.current = + file.type === "text/tab-separated-values" ? "tsv" : "csv"; + } catch (error) { + enqueueSnackbar(`Please import a .tsv or .csv file`, { + variant: "error", + anchorOrigin: { + vertical: "top", + horizontal: "center", + }, + }); + } + }, + [enqueueSnackbar, parseCsv] + ); + + const { getRootProps, getInputProps, isDragActive } = useDropzone({ + onDrop, + multiple: false, + accept: ["text/csv", "text/tab-separated-values"], + }); + + function setDataTypeRef(data: string) { + const getFirstLine = data?.match(/^(.*)/)?.[0]; + /* + * Catching edge case with regex + * EG: "hello\tworld"\tFirst + * - find \t between quotes, and replace with '\s' + * - w/ the \t pattern test it against the formatted string + */ + const strInQuotes = /"(.*?)"/; + const tabsWithSpace = (str: string) => str.replace("\t", "s"); + const formatString = + getFirstLine?.replace(strInQuotes, tabsWithSpace) ?? ""; + const tabPattern = /\t/; + return tabPattern.test(formatString) + ? (importTypeRef.current = "tsv") + : (importTypeRef.current = "csv"); + } + const handlePaste = useDebouncedCallback((value: string) => { + parseCsv(value); + setDataTypeRef(value); + }, 1000); + + const handleUrl = useDebouncedCallback((value: string) => { + setLoading(true); + setError(""); + fetch(value, { mode: "no-cors" }) + .then((res) => res.text()) + .then((data) => { + parseCsv(data); + setDataTypeRef(data); + setLoading(false); + }) + .catch((e) => { + setError(e.message); + setLoading(false); + }); + }, 1000); + + return ( + <> + + { + setTab(v); + setImportCsv({ + importType: importTypeRef.current, + csvData: null, + }); + setError(""); + }} + aria-label="Import CSV method tabs" + action={(actions) => + setTimeout(() => actions?.updateIndicator(), 200) + } + variant="fullWidth" + > + (importMethodRef.current = ImportMethod.upload)} + /> + (importMethodRef.current = ImportMethod.paste)} + /> + (importMethodRef.current = ImportMethod.url)} + /> + + + + + theme.palette.action.activeOpacity, + }, + + "&:focus": { + borderColor: "primary.main", + color: "primary.main", + outline: "none", + }, + }, + error ? { borderColor: "error.main", color: "error.main" } : {}, + ]} + > + + {isDragActive ? ( + + Drop CSV or TSV file here… + + ) : ( + <> + + {validCsv ? : } + + + + {validCsv + ? "Valid CSV or TSV" + : "Click to upload or drop CSV or TSV file here"} + + + + )} + + + {error && ( + + {error} + + )} + + + + { + if (csvData !== null) + setImportCsv({ + importType: importTypeRef.current, + csvData: null, + }); + handlePaste(e.target.value); + }} + sx={{ + typography: "body2", + fontFamily: "fontFamilyMono", + + "& .MuiInputBase-input": { + whiteSpace: "nowrap", + overflow: "auto", + fontFamily: "mono", + }, + }} + helperText={error} + error={!!error} + /> + + + + { + if (csvData !== null) + setImportCsv({ + importType: importTypeRef.current, + csvData: null, + }); + handleUrl(e.target.value); + }} + helperText={loading ? "Fetching…" : error} + error={!!error} + /> + + + + + ); +} diff --git a/src/components/TableToolbar/TableToolbar.tsx b/src/components/TableToolbar/TableToolbar.tsx index b7858176..374f7aa9 100644 --- a/src/components/TableToolbar/TableToolbar.tsx +++ b/src/components/TableToolbar/TableToolbar.tsx @@ -35,7 +35,7 @@ import { FieldType } from "@src/constants/fields"; // prettier-ignore const Filters = lazy(() => import("./Filters" /* webpackChunkName: "Filters" */)); // prettier-ignore -const ImportCsv = lazy(() => import("./ImportCsv" /* webpackChunkName: "ImportCsv" */)); +const ImportData = lazy(() => import("./ImportData/ImportData" /* webpackChunkName: "ImportData" */)); // prettier-ignore const ReExecute = lazy(() => import("./ReExecute" /* webpackChunkName: "ReExecute" */)); @@ -96,7 +96,7 @@ export default function TableToolbar() {
    {/* Spacer */} {tableSettings.tableType !== "collectionGroup" && ( }> - + )} }> From 7511027612c57f0243f0168c705c8f6861ad72e2 Mon Sep 17 00:00:00 2001 From: Han Tuerker Date: Thu, 11 Aug 2022 10:08:00 +0300 Subject: [PATCH 070/309] feat(airtable-migration): fix id - used __rowy_ref object to set document id - add document id validation --- src/atoms/tableScope/rowActions.ts | 4 +- .../ImportAirtableWizard.tsx | 2 +- .../ImportCsvWizard/ImportCsvWizard.tsx | 39 ++++++++++++++++--- .../ImportCsvWizard/Step1Columns.tsx | 38 ++++++++++++++++++ .../TableModals/ImportCsvWizard/utils.ts | 4 ++ 5 files changed, 78 insertions(+), 9 deletions(-) create mode 100644 src/components/TableModals/ImportCsvWizard/utils.ts diff --git a/src/atoms/tableScope/rowActions.ts b/src/atoms/tableScope/rowActions.ts index cbb9cb3d..1b91bd36 100644 --- a/src/atoms/tableScope/rowActions.ts +++ b/src/atoms/tableScope/rowActions.ts @@ -265,8 +265,8 @@ export const bulkAddRowsAtom = atom( // Assign a random ID to each row const operations = rows.map((row) => ({ - type: row?.id ? ("update" as "update") : ("add" as "add"), - path: `${collection}/${row?.id ?? generateId()}`, + type: row?._rowy_ref?.id ? ("update" as "update") : ("add" as "add"), + path: `${collection}/${row?._rowy_ref?.id ?? generateId()}`, data: { ...initialValues, ...omitRowyFields(row) }, })); diff --git a/src/components/TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx b/src/components/TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx index 2de2bc7a..35e9f334 100644 --- a/src/components/TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx +++ b/src/components/TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx @@ -104,7 +104,7 @@ export default function ImportAirtableWizard({ onClose }: ITableModalProps) { ? parser(record.fields[pair.fieldKey]) : record.fields[pair.fieldKey]; return config.documentId === "recordId" - ? { ...a, [pair.columnKey]: value, id: record.id } + ? { ...a, [pair.columnKey]: value, _rowy_ref: { id: record.id } } : { ...a, [pair.columnKey]: value }; }, {}) ); diff --git a/src/components/TableModals/ImportCsvWizard/ImportCsvWizard.tsx b/src/components/TableModals/ImportCsvWizard/ImportCsvWizard.tsx index c09ea77b..b35d7d24 100644 --- a/src/components/TableModals/ImportCsvWizard/ImportCsvWizard.tsx +++ b/src/components/TableModals/ImportCsvWizard/ImportCsvWizard.tsx @@ -37,10 +37,13 @@ import { import { ColumnConfig } from "@src/types/table"; import { getFieldProp } from "@src/components/fields"; import { analytics, logEvent } from "@src/analytics"; +import { isValidDocId } from "./utils"; export type CsvConfig = { pairs: { csvKey: string; columnKey: string }[]; newColumns: ColumnConfig[]; + documentId: "auto" | "column"; + documentIdCsvKey?: string; }; export interface IStepProps { @@ -68,6 +71,7 @@ export default function ImportCsvWizard({ onClose }: ITableModalProps) { const [config, setConfig] = useState({ pairs: [], newColumns: [], + documentId: "auto", }); const updateConfig: IStepProps["updateConfig"] = useCallback((value) => { setConfig((prev) => { @@ -77,7 +81,7 @@ export default function ImportCsvWizard({ onClose }: ITableModalProps) { "key" ).filter((col) => pairs.some((pair) => pair.columnKey === col.key)); - return { pairs, newColumns }; + return { ...prev, pairs, newColumns }; }); }, []); @@ -95,7 +99,18 @@ export default function ImportCsvWizard({ onClose }: ITableModalProps) { const value = csvFieldParser ? csvFieldParser(row[pair.csvKey], matchingColumn.config) : row[pair.csvKey]; - return { ...a, [pair.columnKey]: value }; + + return config.documentId === "column" + ? { + ...a, + [pair.columnKey]: value, + _rowy_ref: { + id: config.documentIdCsvKey + ? row[config.documentIdCsvKey] + : null, + }, + } + : { ...a, [pair.columnKey]: value }; }, {}) ); }, [csvData, columns, config]); @@ -103,17 +118,21 @@ export default function ImportCsvWizard({ onClose }: ITableModalProps) { const handleFinish = async () => { if (!parsedRows) return; console.time("importCsv"); + const validRows = + config.documentId === "column" + ? parsedRows.filter((row) => isValidDocId(row._rowy_ref.id)) + : parsedRows; snackbarProgressRef.current?.setProgress(0); const loadingSnackbar = enqueueSnackbar( `Importing ${Number( - parsedRows.length + validRows.length ).toLocaleString()} rows. This might take a while.`, { persist: true, action: ( ), @@ -145,9 +164,17 @@ export default function ImportCsvWizard({ onClose }: ITableModalProps) { for (const col of config.newColumns) promises.push(addColumn({ config: col })); + if (validRows.length < parsedRows.length) { + enqueueSnackbar( + `${Number( + parsedRows.length - validRows.length + ).toLocaleString()} invalid rows skipped!`, + { variant: "warning" } + ); + } promises.push( bulkAddRows({ - rows: parsedRows, + rows: validRows, collection: tableSettings.collection, onBatchCommit: (batchNumber: number) => snackbarProgressRef.current?.setProgress(batchNumber), @@ -158,7 +185,7 @@ export default function ImportCsvWizard({ onClose }: ITableModalProps) { await Promise.all(promises); logEvent(analytics, "import_success", { type: importType }); enqueueSnackbar( - `Imported ${Number(parsedRows.length).toLocaleString()} rows`, + `Imported ${Number(validRows.length).toLocaleString()} rows`, { variant: "success" } ); } catch (e) { diff --git a/src/components/TableModals/ImportCsvWizard/Step1Columns.tsx b/src/components/TableModals/ImportCsvWizard/Step1Columns.tsx index 8643c2c2..fecb82ec 100644 --- a/src/components/TableModals/ImportCsvWizard/Step1Columns.tsx +++ b/src/components/TableModals/ImportCsvWizard/Step1Columns.tsx @@ -10,10 +10,14 @@ import { FormControlLabel, Checkbox, Chip, + FormControl, + RadioGroup, + Radio, } from "@mui/material"; import ArrowIcon from "@mui/icons-material/ArrowForward"; import { IStepProps } from "."; +import { CsvConfig } from "@src/components/TableModals/ImportCsvWizard"; import FadeList from "@src/components/TableModals/ScrollableList"; import Column, { COLUMN_HEADER_HEIGHT } from "@src/components/Table/Column"; import MultiSelect from "@rowy/multiselect"; @@ -268,6 +272,40 @@ export default function Step1Columns({ ); })} + + + Document Ids (Optional) + + + + + { + const documentId = e.currentTarget.value as "auto" | "column"; + setConfig((prev: CsvConfig) => ({ + ...prev, + documentId, + documentIdCsvKey: "number", + })); + }} + > + } + label="Auto-Generated" + /> + } + label="Pick Column" + /> + + + +
    ); } diff --git a/src/components/TableModals/ImportCsvWizard/utils.ts b/src/components/TableModals/ImportCsvWizard/utils.ts new file mode 100644 index 00000000..0ad40df8 --- /dev/null +++ b/src/components/TableModals/ImportCsvWizard/utils.ts @@ -0,0 +1,4 @@ +export const REGEX_DOCUMENT_ID = /^(?!\.\.?$)(?!.*__.*__)([^/]{1,1500})$/; + +export const isValidDocId = (documentId: string) => + REGEX_DOCUMENT_ID.test(documentId); From 076a1a0fbd9645519ec3bb86ca26a4d6a6f44566 Mon Sep 17 00:00:00 2001 From: Han Tuerker Date: Thu, 11 Aug 2022 10:46:28 +0300 Subject: [PATCH 071/309] feat(airtable-migration): add id column select --- .../ImportCsvWizard/Step1Columns.tsx | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/components/TableModals/ImportCsvWizard/Step1Columns.tsx b/src/components/TableModals/ImportCsvWizard/Step1Columns.tsx index fecb82ec..05b05512 100644 --- a/src/components/TableModals/ImportCsvWizard/Step1Columns.tsx +++ b/src/components/TableModals/ImportCsvWizard/Step1Columns.tsx @@ -13,6 +13,8 @@ import { FormControl, RadioGroup, Radio, + TextField, + MenuItem, } from "@mui/material"; import ArrowIcon from "@mui/icons-material/ArrowForward"; @@ -288,7 +290,6 @@ export default function Step1Columns({ setConfig((prev: CsvConfig) => ({ ...prev, documentId, - documentIdCsvKey: "number", })); }} > @@ -302,6 +303,30 @@ export default function Step1Columns({ control={} label="Pick Column" /> + + setConfig((prev) => ({ + ...prev, + documentIdCsvKey: e.target.value, + })) + } + sx={{ width: 200 }} + SelectProps={{ + MenuProps: { + sx: { height: 200 }, + anchorOrigin: { vertical: "bottom", horizontal: "right" }, + transformOrigin: { vertical: "top", horizontal: "right" }, + }, + }} + > + {csvData.columns.map((column) => ( + + {column} + + ))} +
    From 3c020b23eb46f7c043f513a2ff12fe695cfbc932 Mon Sep 17 00:00:00 2001 From: Han Tuerker Date: Fri, 12 Aug 2022 05:29:46 +0300 Subject: [PATCH 072/309] feat(airtable-migration): add ui improvements - add step error messages - add invalid rows information --- .../ImportCsvWizard/ImportCsvWizard.tsx | 27 ++++++++----- .../ImportCsvWizard/Step1Columns.tsx | 40 ++++++++++++++++++- .../TableModals/ImportCsvWizard/utils.ts | 1 + 3 files changed, 56 insertions(+), 12 deletions(-) diff --git a/src/components/TableModals/ImportCsvWizard/ImportCsvWizard.tsx b/src/components/TableModals/ImportCsvWizard/ImportCsvWizard.tsx index b35d7d24..b046f9fb 100644 --- a/src/components/TableModals/ImportCsvWizard/ImportCsvWizard.tsx +++ b/src/components/TableModals/ImportCsvWizard/ImportCsvWizard.tsx @@ -3,7 +3,7 @@ import useMemoValue from "use-memo-value"; import { useAtom, useSetAtom } from "jotai"; import { RESET } from "jotai/utils"; import { useSnackbar } from "notistack"; -import { uniqBy, find, isEqual } from "lodash-es"; +import { uniqBy, find, isEqual, groupBy } from "lodash-es"; import { ITableModalProps } from "@src/components/TableModals"; import { @@ -43,7 +43,7 @@ export type CsvConfig = { pairs: { csvKey: string; columnKey: string }[]; newColumns: ColumnConfig[]; documentId: "auto" | "column"; - documentIdCsvKey?: string; + documentIdCsvKey: string | null; }; export interface IStepProps { @@ -72,6 +72,7 @@ export default function ImportCsvWizard({ onClose }: ITableModalProps) { pairs: [], newColumns: [], documentId: "auto", + documentIdCsvKey: null, }); const updateConfig: IStepProps["updateConfig"] = useCallback((value) => { setConfig((prev) => { @@ -115,13 +116,17 @@ export default function ImportCsvWizard({ onClose }: ITableModalProps) { ); }, [csvData, columns, config]); + const { validRows, invalidRows } = + config.documentId === "column" + ? groupBy(parsedRows, (row) => + isValidDocId(row._rowy_ref?.id) ? "validRows" : "invalidRows" + ) + : { validRows: parsedRows, invalidRows: [] }; + console.log({ validRows, invalidRows }); + const handleFinish = async () => { if (!parsedRows) return; console.time("importCsv"); - const validRows = - config.documentId === "column" - ? parsedRows.filter((row) => isValidDocId(row._rowy_ref.id)) - : parsedRows; snackbarProgressRef.current?.setProgress(0); const loadingSnackbar = enqueueSnackbar( `Importing ${Number( @@ -166,7 +171,7 @@ export default function ImportCsvWizard({ onClose }: ITableModalProps) { if (validRows.length < parsedRows.length) { enqueueSnackbar( - `${Number( + `Invalid document ID! ${Number( parsedRows.length - validRows.length ).toLocaleString()} invalid rows skipped!`, { variant: "warning" } @@ -234,14 +239,16 @@ export default function ImportCsvWizard({ onClose }: ITableModalProps) { ), content: ( ), - disableNext: config.pairs.length === 0, + disableNext: + config.pairs.length === 0 || + (config.documentId === "column" && !config.documentIdCsvKey), }, config.newColumns.length > 0 && { title: "Set column types", @@ -267,7 +274,7 @@ export default function ImportCsvWizard({ onClose }: ITableModalProps) { "Preview your data with your configured columns. You can change column types by clicking “Edit type” from the column menu at any time.", content: ( }>; +}) { const [tableSchema] = useAtom(tableSchemaAtom, tableScope); const [tableColumnsOrdered] = useAtom(tableColumnsOrderedAtom, tableScope); @@ -132,6 +137,19 @@ export default function Step1Columns({ } }; + const stepErrors = () => { + const errors = []; + if (config.pairs.length < 1) { + errors.push("You must select at least one column to import!"); + } + console.log(config.documentId); + console.log(config.documentIdCsvKey); + if (config.documentId === "column" && !config.documentIdCsvKey) { + errors.push("You must select a column for document ID!"); + } + return errors; + }; + return (
    @@ -290,6 +308,7 @@ export default function Step1Columns({ setConfig((prev: CsvConfig) => ({ ...prev, documentId, + documentIdCsvKey: null, })); }} > @@ -304,6 +323,7 @@ export default function Step1Columns({ label="Pick Column" /> @@ -312,14 +332,23 @@ export default function Step1Columns({ documentIdCsvKey: e.target.value, })) } - sx={{ width: 200 }} + sx={{ width: isXs ? "100%" : 200, margin: "auto" }} SelectProps={{ + displayEmpty: true, + renderValue: (value) => ( + <>{value ? value : "Select ID Column"} + ), MenuProps: { sx: { height: 200 }, anchorOrigin: { vertical: "bottom", horizontal: "right" }, transformOrigin: { vertical: "top", horizontal: "right" }, }, }} + helperText={ + config.documentId === "column" && + csvData.invalidRows && + `Invalid Rows: ${csvData.invalidRows.length}/${csvData.rows.length}` + } > {csvData.columns.map((column) => ( @@ -330,6 +359,13 @@ export default function Step1Columns({ + + {stepErrors().map((error) => ( + + {error} + + ))} +
    ); diff --git a/src/components/TableModals/ImportCsvWizard/utils.ts b/src/components/TableModals/ImportCsvWizard/utils.ts index 0ad40df8..f6a0992d 100644 --- a/src/components/TableModals/ImportCsvWizard/utils.ts +++ b/src/components/TableModals/ImportCsvWizard/utils.ts @@ -1,3 +1,4 @@ +// https://firebase.google.com/docs/firestore/quotas export const REGEX_DOCUMENT_ID = /^(?!\.\.?$)(?!.*__.*__)([^/]{1,1500})$/; export const isValidDocId = (documentId: string) => From 32bc5b4b30c2723f5396b2b741a78c4cfbe005b9 Mon Sep 17 00:00:00 2001 From: Han Tuerker Date: Fri, 12 Aug 2022 05:54:19 +0300 Subject: [PATCH 073/309] chore(airtable-migration): remove console logs --- .../TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx | 1 - src/components/TableModals/ImportAirtableWizard/utils.ts | 1 - src/components/TableModals/ImportCsvWizard/ImportCsvWizard.tsx | 1 - src/components/TableModals/ImportCsvWizard/Step1Columns.tsx | 2 -- 4 files changed, 5 deletions(-) diff --git a/src/components/TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx b/src/components/TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx index 35e9f334..e334077c 100644 --- a/src/components/TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx +++ b/src/components/TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx @@ -152,7 +152,6 @@ export default function ImportAirtableWizard({ onClose }: ITableModalProps) { // Airtable Rate Limits: 5 req/sec const RATE_LIMIT = { REQ_PER_SECOND: 5 }; const fetcher = async (i: number = 0, offset?: string): Promise => { - console.log(i, offset, promises); const { records, offset: nextPage } = await fetchRecords(offset); snackbarProgressRef.current?.setTarget((prev) => prev + records.length); promises.push( diff --git a/src/components/TableModals/ImportAirtableWizard/utils.ts b/src/components/TableModals/ImportAirtableWizard/utils.ts index ab8d4490..bc7ff765 100644 --- a/src/components/TableModals/ImportAirtableWizard/utils.ts +++ b/src/components/TableModals/ImportAirtableWizard/utils.ts @@ -48,7 +48,6 @@ export const suggestType = (data: { [key: string]: any }[], field: string) => { else results[result] += 1; }); - console.log(results); const sortedResults = sortBy(Object.entries(results), 1).reverse(); if (!sortedResults || !sortedResults[0]) return FieldType.json; const bestMatch = sortedResults[0][0]; diff --git a/src/components/TableModals/ImportCsvWizard/ImportCsvWizard.tsx b/src/components/TableModals/ImportCsvWizard/ImportCsvWizard.tsx index b046f9fb..f8929d31 100644 --- a/src/components/TableModals/ImportCsvWizard/ImportCsvWizard.tsx +++ b/src/components/TableModals/ImportCsvWizard/ImportCsvWizard.tsx @@ -122,7 +122,6 @@ export default function ImportCsvWizard({ onClose }: ITableModalProps) { isValidDocId(row._rowy_ref?.id) ? "validRows" : "invalidRows" ) : { validRows: parsedRows, invalidRows: [] }; - console.log({ validRows, invalidRows }); const handleFinish = async () => { if (!parsedRows) return; diff --git a/src/components/TableModals/ImportCsvWizard/Step1Columns.tsx b/src/components/TableModals/ImportCsvWizard/Step1Columns.tsx index 1dd0ce76..e90159bd 100644 --- a/src/components/TableModals/ImportCsvWizard/Step1Columns.tsx +++ b/src/components/TableModals/ImportCsvWizard/Step1Columns.tsx @@ -142,8 +142,6 @@ export default function Step1Columns({ if (config.pairs.length < 1) { errors.push("You must select at least one column to import!"); } - console.log(config.documentId); - console.log(config.documentIdCsvKey); if (config.documentId === "column" && !config.documentIdCsvKey) { errors.push("You must select a column for document ID!"); } From b26f57ceb5e2da9b44def9d87c28129ffe651569 Mon Sep 17 00:00:00 2001 From: Han Tuerker Date: Mon, 15 Aug 2022 08:57:20 +0300 Subject: [PATCH 074/309] feat(airtable-migration): improve form errors --- .../ImportData/ImportFromAirtable.tsx | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/src/components/TableToolbar/ImportData/ImportFromAirtable.tsx b/src/components/TableToolbar/ImportData/ImportFromAirtable.tsx index e7988b6b..53b226e0 100644 --- a/src/components/TableToolbar/ImportData/ImportFromAirtable.tsx +++ b/src/components/TableToolbar/ImportData/ImportFromAirtable.tsx @@ -27,20 +27,26 @@ export default function ImportFromAirtable() { baseId: "", tableId: "", }); + setError(null); + setLoading(false); }; }, [setImportAirtable]); const handleAirtableConnection = () => { + const errors = []; if (!apiKey) { - setError({ apiKey: { message: "API Key is missing!" } }); - return; + errors.push({ apiKey: { message: "API Key is missing!" } }); } if (!baseId) { - setError({ baseId: { message: "Base ID is missing!" } }); - return; + errors.push({ baseId: { message: "Base ID is missing!" } }); } if (!tableId) { - setError({ tableId: { message: "Table ID is missing!" } }); + errors.push({ tableId: { message: "Table ID is missing!" } }); + } + if (errors.length > 0) { + setError( + errors.reduce((obj, error) => ({ ...obj, ...error }), {} as any) + ); return; } setLoading(true); @@ -54,6 +60,18 @@ export default function ImportFromAirtable() { .then((body) => { const { error } = body; if (error) { + if (error.type === "AUTHENTICATION_REQUIRED") { + setError({ apiKey: { message: "Invalid API Key!" } }); + } + if (error === "NOT_FOUND") { + setError({ baseId: { message: "Could not find base!" } }); + } + if ( + error.type === "TABLE_NOT_FOUND" || + error.type === "MODEL_ID_NOT_FOUND" + ) { + setError({ tableId: { message: "Could not find table!" } }); + } throw new Error(error); } From 6afb1c023869ab9388774d43b0bcb5d9eaacc2a0 Mon Sep 17 00:00:00 2001 From: Han Tuerker Date: Mon, 15 Aug 2022 08:57:47 +0300 Subject: [PATCH 075/309] feat(airtable-migration): add next step disabler --- .../TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx b/src/components/TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx index e334077c..afe95479 100644 --- a/src/components/TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx +++ b/src/components/TableModals/ImportAirtableWizard/ImportAirtableWizard.tsx @@ -237,6 +237,7 @@ export default function ImportAirtableWizard({ onClose }: ITableModalProps) { isXs={isXs} /> ), + disableNext: config.pairs.length === 0, }, config.newColumns.length > 0 && { title: "Set column types", From 796067af40f6ff3e03fc24f5ddfbd30e5230ba6b Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Mon, 15 Aug 2022 12:05:54 +0200 Subject: [PATCH 076/309] fix TableTutorial positioning when nav open --- src/components/TableTutorial/TableTutorial.tsx | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/components/TableTutorial/TableTutorial.tsx b/src/components/TableTutorial/TableTutorial.tsx index 0df79ef7..e0190d7f 100644 --- a/src/components/TableTutorial/TableTutorial.tsx +++ b/src/components/TableTutorial/TableTutorial.tsx @@ -1,5 +1,5 @@ import { useState, Fragment } from "react"; -import { useSetAtom } from "jotai"; +import { useAtom, useSetAtom } from "jotai"; import { useNavigate } from "react-router-dom"; import { @@ -17,11 +17,19 @@ import ArrowForwardIcon from "@mui/icons-material/ArrowForward"; import StepsProgress from "@src/components/StepsProgress"; import { TUTORIAL_STEPS } from "./Steps"; -import { projectScope, confirmDialogAtom } from "@src/atoms/projectScope"; +import { + projectScope, + confirmDialogAtom, + navOpenAtom, +} from "@src/atoms/projectScope"; import { ROUTES } from "@src/constants/routes"; -import { NAV_DRAWER_COLLAPSED_WIDTH } from "@src/layouts/Navigation/NavDrawer"; +import { + NAV_DRAWER_COLLAPSED_WIDTH, + NAV_DRAWER_WIDTH, +} from "@src/layouts/Navigation/NavDrawer"; export default function TableTutorial() { + const [navOpen] = useAtom(navOpenAtom, projectScope); const confirm = useSetAtom(confirmDialogAtom, projectScope); const navigate = useNavigate(); @@ -56,7 +64,7 @@ export default function TableTutorial() { bottom: `env(safe-area-inset-bottom)`, left: { xs: `env(safe-area-inset-left)`, - md: NAV_DRAWER_COLLAPSED_WIDTH + 2, + md: (navOpen ? NAV_DRAWER_WIDTH : NAV_DRAWER_COLLAPSED_WIDTH) + 2, }, right: `env(safe-area-inset-right)`, height: "min(50vh, 440px)", From 50c26c16287fbafe9f91db97fe2611f8403a1d70 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Mon, 15 Aug 2022 12:06:01 +0200 Subject: [PATCH 077/309] bump version number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b224e159..f6e3055d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rowy", - "version": "3.0.0-alpha", + "version": "3.0.0", "homepage": "https://rowy.io", "repository": { "type": "git", From a39b7357967a8691969e98211b3747cf77e5a06d Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Mon, 15 Aug 2022 12:45:45 +0200 Subject: [PATCH 078/309] finish get started & tutorial logic --- src/App.tsx | 4 + src/atoms/projectScope/user.ts | 3 + .../GetStartedChecklist.tsx | 71 +++++++-------- .../GetStartedProgress.tsx | 18 ++++ .../useGetStartedCompletion.ts | 25 ++++++ .../TableTutorial/Steps/Step5Finish.tsx | 66 ++++++++++++++ src/components/TableTutorial/Steps/index.ts | 2 + .../TableTutorial/TableTutorial.tsx | 22 +++-- src/constants/externalLinks.ts | 3 + .../Navigation/NavDrawer/NavDrawer.tsx | 87 ++++++++++--------- src/pages/Settings/MembersPage.tsx | 3 - 11 files changed, 220 insertions(+), 84 deletions(-) create mode 100644 src/components/GetStartedChecklist/GetStartedProgress.tsx create mode 100644 src/components/GetStartedChecklist/useGetStartedCompletion.ts create mode 100644 src/components/TableTutorial/Steps/Step5Finish.tsx diff --git a/src/App.tsx b/src/App.tsx index 4ce92835..97209c9e 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -4,6 +4,7 @@ import { useAtom } from "jotai"; import Loading from "@src/components/Loading"; import ProjectSourceFirebase from "@src/sources/ProjectSourceFirebase"; +import MembersSourceFirebase from "@src/sources/MembersSourceFirebase"; import ConfirmDialog from "@src/components/ConfirmDialog"; import RowyRunModal from "@src/components/RowyRunModal"; import NotFound from "@src/pages/NotFoundPage"; @@ -12,6 +13,7 @@ import RequireAuth from "@src/layouts/RequireAuth"; import { projectScope, currentUserAtom, + userRolesAtom, altPressAtom, } from "@src/atoms/projectScope"; import { ROUTES } from "@src/constants/routes"; @@ -64,11 +66,13 @@ const ThemeTestPage = lazy(() => import("@src/pages/Test/ThemeTestPage" /* webpa export default function App() { const [currentUser] = useAtom(currentUserAtom, projectScope); + const [userRoles] = useAtom(userRolesAtom, projectScope); useKeyPressWithAtom("Alt", altPressAtom, projectScope); return ( }> + {userRoles.includes("ADMIN") && } diff --git a/src/atoms/projectScope/user.ts b/src/atoms/projectScope/user.ts index ee111ed8..4f8aad75 100644 --- a/src/atoms/projectScope/user.ts +++ b/src/atoms/projectScope/user.ts @@ -36,6 +36,9 @@ export type UserSettings = Partial<{ sorts: TableSort[]; }> >; + + /** Stores table tutorial completion */ + tableTutorialComplete?: boolean; }>; /** User info and settings */ export const userSettingsAtom = atom({}); diff --git a/src/components/GetStartedChecklist/GetStartedChecklist.tsx b/src/components/GetStartedChecklist/GetStartedChecklist.tsx index f68c60f0..259aee4a 100644 --- a/src/components/GetStartedChecklist/GetStartedChecklist.tsx +++ b/src/components/GetStartedChecklist/GetStartedChecklist.tsx @@ -5,11 +5,10 @@ import UncheckedIcon from "@mui/icons-material/RadioButtonUnchecked"; import CheckedIcon from "@mui/icons-material/CheckCircleOutline"; import AddIcon from "@mui/icons-material/Add"; import MembersIcon from "@mui/icons-material/AccountCircleOutlined"; -import { Project as ProjectIcon } from "@src/assets/icons"; import Modal, { IModalProps } from "@src/components/Modal"; import SteppedAccordion from "@src/components/SteppedAccordion"; -import StepsProgress from "@src/components/StepsProgress"; +import GetStartedProgress from "./GetStartedProgress"; import { projectScope, @@ -20,6 +19,7 @@ import { NAV_DRAWER_WIDTH, NAV_DRAWER_COLLAPSED_WIDTH, } from "@src/layouts/Navigation/NavDrawer"; +import useGetStartedCompletion from "./useGetStartedCompletion"; export interface IGetStartedChecklistProps extends Partial { navOpen: boolean; @@ -37,8 +37,15 @@ export default function GetStartedChecklist({ projectScope ); + const [completedSteps] = useGetStartedCompletion(); + if (!open) return null; + const incompleteIcon = ; + const completeIcon = ( + + ); + return ( - + - ), + icon: completedSteps.project ? completeIcon : incompleteIcon, }, - content: null, + content: ( + + You’ve created a project and connected it to a data source. + + ), }, { id: "tutorial", title: "Complete the table tutorial", - labelButtonProps: { icon: }, + labelButtonProps: { + icon: completedSteps.tutorial ? completeIcon : incompleteIcon, + }, content: ( <> - This is why you should + + Learn the basic features and functions of Rowy before creating + a table. + @@ -101,31 +115,17 @@ export default function GetStartedChecklist({ ), }, { - id: "project", - title: "Create a project", - labelButtonProps: { icon: }, + id: "table", + title: "Create a table", + labelButtonProps: { + icon: completedSteps.table ? completeIcon : incompleteIcon, + }, content: ( <> - You’re ready to create a project and connect to a data source + Use tables to manage the data from your database in a + spreadsheet UI. - - - ), - }, - { - id: "table", - title: "Create a table", - labelButtonProps: { icon: }, - content: ( - <> - This is why you should @@ -130,7 +138,10 @@ export default function GetStartedChecklist({ variant="contained" color="primary" startIcon={} - onClick={() => openTableSettingsDialog({ open: true })} + onClick={() => { + openTableSettingsDialog({ open: true }); + setOpen(false); + }} > Create table @@ -153,6 +164,9 @@ export default function GetStartedChecklist({ variant="contained" color="primary" startIcon={} + component={Link} + to={ROUTES.members} + onClick={() => setOpen(false)} > Members From 9e1b53a9d5cd3038553bbea64dc19ee11f95fb4d Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Tue, 16 Aug 2022 15:45:22 +0200 Subject: [PATCH 081/309] add imagery to table tutorial --- src/assets/tutorial/community-dark.svg | 37 +++++ src/assets/tutorial/community-light.svg | 37 +++++ src/assets/tutorial/derivative-dark.gif | Bin 0 -> 127069 bytes src/assets/tutorial/derivative-light.gif | Bin 0 -> 113893 bytes src/assets/tutorial/invite-users-dark.gif | Bin 0 -> 86394 bytes src/assets/tutorial/invite-users-light.gif | Bin 0 -> 81996 bytes src/assets/tutorial/playground-dark.svg | 12 ++ src/assets/tutorial/playground-light.svg | 12 ++ src/assets/tutorial/templates-dark.svg | 24 ++++ src/assets/tutorial/templates-light.svg | 24 ++++ .../TableTutorial/Steps/Step1Import.tsx | 2 +- .../TableTutorial/Steps/Step2Add.tsx | 2 +- .../TableTutorial/Steps/Step3Invite.tsx | 35 ++++- .../TableTutorial/Steps/Step4Code.tsx | 35 ++++- .../TableTutorial/Steps/Step5Finish.tsx | 132 +++++++++++------- .../TableTutorial/TableTutorial.tsx | 2 +- 16 files changed, 297 insertions(+), 57 deletions(-) create mode 100644 src/assets/tutorial/community-dark.svg create mode 100644 src/assets/tutorial/community-light.svg create mode 100644 src/assets/tutorial/derivative-dark.gif create mode 100644 src/assets/tutorial/derivative-light.gif create mode 100644 src/assets/tutorial/invite-users-dark.gif create mode 100644 src/assets/tutorial/invite-users-light.gif create mode 100644 src/assets/tutorial/playground-dark.svg create mode 100644 src/assets/tutorial/playground-light.svg create mode 100644 src/assets/tutorial/templates-dark.svg create mode 100644 src/assets/tutorial/templates-light.svg diff --git a/src/assets/tutorial/community-dark.svg b/src/assets/tutorial/community-dark.svg new file mode 100644 index 00000000..913fd0ae --- /dev/null +++ b/src/assets/tutorial/community-dark.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/tutorial/community-light.svg b/src/assets/tutorial/community-light.svg new file mode 100644 index 00000000..9e04b049 --- /dev/null +++ b/src/assets/tutorial/community-light.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/tutorial/derivative-dark.gif b/src/assets/tutorial/derivative-dark.gif new file mode 100644 index 0000000000000000000000000000000000000000..556ae882b47b79180033405f1caa1c8a5ffd8c8b GIT binary patch literal 127069 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

    q_QJE@v;cD&Vxfj)c1h8SPZ`O? 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 literal 0 HcmV?d00001 diff --git a/src/assets/tutorial/derivative-light.gif b/src/assets/tutorial/derivative-light.gif new file mode 100644 index 0000000000000000000000000000000000000000..7713447a2cb94513778f09d31502d7ab3517097c GIT binary patch literal 113893 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 literal 0 HcmV?d00001 diff --git a/src/assets/tutorial/invite-users-light.gif b/src/assets/tutorial/invite-users-light.gif new file mode 100644 index 0000000000000000000000000000000000000000..8127ff38c364cc72ff0b3aadb00736fc8b6141e9 GIT binary patch literal 81996 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

    _g{7iWXjP|(AGJ>}JVe%Q2o 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 N-sk=uSt1|+06TPq3CsWh literal 0 HcmV?d00001 diff --git a/src/assets/tutorial/playground-dark.svg b/src/assets/tutorial/playground-dark.svg new file mode 100644 index 00000000..d87a587b --- /dev/null +++ b/src/assets/tutorial/playground-dark.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/assets/tutorial/playground-light.svg b/src/assets/tutorial/playground-light.svg new file mode 100644 index 00000000..cc882c4d --- /dev/null +++ b/src/assets/tutorial/playground-light.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/assets/tutorial/templates-dark.svg b/src/assets/tutorial/templates-dark.svg new file mode 100644 index 00000000..5930cacb --- /dev/null +++ b/src/assets/tutorial/templates-dark.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/tutorial/templates-light.svg b/src/assets/tutorial/templates-light.svg new file mode 100644 index 00000000..b7ce3848 --- /dev/null +++ b/src/assets/tutorial/templates-light.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/components/TableTutorial/Steps/Step1Import.tsx b/src/components/TableTutorial/Steps/Step1Import.tsx index 005fcaab..682572fa 100644 --- a/src/components/TableTutorial/Steps/Step1Import.tsx +++ b/src/components/TableTutorial/Steps/Step1Import.tsx @@ -9,7 +9,7 @@ import { tableScope, tableRowsAtom } from "@src/atoms/tableScope"; export const Step1Import = { id: "import", - title: "Let’s create a simple product pricing table", + title: "Let’s create a simple product pricing table.", description: "Rowy connects to your database and displays it in a spreadsheet UI, making it easy to manage your data.", StepComponent, diff --git a/src/components/TableTutorial/Steps/Step2Add.tsx b/src/components/TableTutorial/Steps/Step2Add.tsx index 2c7f2e8f..5e6d9dbe 100644 --- a/src/components/TableTutorial/Steps/Step2Add.tsx +++ b/src/components/TableTutorial/Steps/Step2Add.tsx @@ -15,7 +15,7 @@ import { FieldType } from "@src/constants/fields"; export const Step2Add = { id: "add", - title: "Let’s add some columns and rows to your table", + title: "Let’s add some columns and rows to your table.", description: "When you make changes made to your data in Rowy, they’re reflected in your Firestore database in realtime.", StepComponent, diff --git a/src/components/TableTutorial/Steps/Step3Invite.tsx b/src/components/TableTutorial/Steps/Step3Invite.tsx index 139935cb..395def54 100644 --- a/src/components/TableTutorial/Steps/Step3Invite.tsx +++ b/src/components/TableTutorial/Steps/Step3Invite.tsx @@ -1,10 +1,29 @@ import { ITableTutorialStepComponentProps } from "."; +import { useTheme, Link } from "@mui/material"; +import InlineOpenInNewIcon from "@src/components/InlineOpenInNewIcon"; + +import { WIKI_LINKS } from "@src/constants/externalLinks"; +import inviteUsersLight from "@src/assets/tutorial/invite-users-light.gif"; +import inviteUsersDark from "@src/assets/tutorial/invite-users-dark.gif"; + export const Step3Invite = { id: "invite", - title: "Let’s create a simple product pricing table", - description: - "Rowy allows you to invite your team members with granular, role-based access controls.", + title: "Collaborate with your team to manage your data in realtime.", + description: ( + <> + Rowy allows you to invite your team members with granular, role-based + access controls.{" "} + + Read the docs + + + + ), StepComponent, }; @@ -12,6 +31,14 @@ export default Step3Invite; function StepComponent({ setComplete }: ITableTutorialStepComponentProps) { setComplete(true); + const theme = useTheme(); - return <>TODO:; + return ( + Animation of a Rowy table with three cursors: admin, editor, and viewer. + ); } diff --git a/src/components/TableTutorial/Steps/Step4Code.tsx b/src/components/TableTutorial/Steps/Step4Code.tsx index f462fd64..d7fde464 100644 --- a/src/components/TableTutorial/Steps/Step4Code.tsx +++ b/src/components/TableTutorial/Steps/Step4Code.tsx @@ -1,9 +1,30 @@ import { ITableTutorialStepComponentProps } from "."; +import { useTheme, Link } from "@mui/material"; +import InlineOpenInNewIcon from "@src/components/InlineOpenInNewIcon"; + +import { WIKI_LINKS } from "@src/constants/externalLinks"; +import derivativeLight from "@src/assets/tutorial/derivative-light.gif"; +import derivativeDark from "@src/assets/tutorial/derivative-dark.gif"; + export const Step4Code = { id: "code", - title: "Let’s learn how to unlock the true powers of Rowy", - description: "TODO:", + title: "Let’s learn how to unlock the true powers of Rowy.", + description: ( + <> + You can write code in JavaScript to build any data logic with Derivative + columns, or build CRUD tasks with Extensions. And you can use any API or + NPM package.{" "} + + Learn more + + + + ), StepComponent, }; @@ -11,6 +32,14 @@ export default Step4Code; function StepComponent({ setComplete }: ITableTutorialStepComponentProps) { setComplete(true); + const theme = useTheme(); - return <>TODO:; + return ( + Animation of a user entering two values, and the result of the executed Derivative code being displayed. + ); } diff --git a/src/components/TableTutorial/Steps/Step5Finish.tsx b/src/components/TableTutorial/Steps/Step5Finish.tsx index a851718c..ffa00abe 100644 --- a/src/components/TableTutorial/Steps/Step5Finish.tsx +++ b/src/components/TableTutorial/Steps/Step5Finish.tsx @@ -1,7 +1,14 @@ import { ITableTutorialStepComponentProps } from "."; -import { Typography, Link } from "@mui/material"; +import { useTheme, Grid, Typography, Link } from "@mui/material"; import { EXTERNAL_LINKS } from "@src/constants/externalLinks"; +import playgroundLight from "@src/assets/tutorial/playground-light.svg"; +import playgroundDark from "@src/assets/tutorial/playground-dark.svg"; +import templatesLight from "@src/assets/tutorial/templates-light.svg"; +import templatesDark from "@src/assets/tutorial/templates-dark.svg"; +import communityLight from "@src/assets/tutorial/community-light.svg"; +import communityDark from "@src/assets/tutorial/community-dark.svg"; + export const Step5Finish = { id: "finish", title: "Congrats, you’re ready to start building your own table! 🎉", @@ -13,54 +20,85 @@ export default Step5Finish; function StepComponent({ setComplete }: ITableTutorialStepComponentProps) { setComplete(true); + const theme = useTheme(); return ( - * + *": { mt: 1 } }} + -

  • - Play around with the demo tables in our live community{" "} - - playground - {" "} - to learn what you can do with Rowy -
  • -
  • - Check out and deploy our{" "} - - templates - {" "} - to explore how Rowy can improve your project -
  • -
  • - Connect with us on{" "} - - Discord - {" "} - and{" "} - - GitHub - {" "} - and ask us how Rowy can help with your specific use case -
  • - + + Puzzle pieces coming together + + + Play around with the demo tables in our live community{" "} + + playground + {" "} + to learn what you can do with Rowy. + + + + + Blocks coming together + + + Check out and deploy our{" "} + + templates + {" "} + to explore how Rowy can improve your project. + + + + + People coming together + + + Connect with us on{" "} + + Discord + {" "} + and{" "} + + GitHub + {" "} + and ask us how Rowy can help with your specific use case. + + +
    ); } diff --git a/src/components/TableTutorial/TableTutorial.tsx b/src/components/TableTutorial/TableTutorial.tsx index 2eb56f4c..a3d4cc3c 100644 --- a/src/components/TableTutorial/TableTutorial.tsx +++ b/src/components/TableTutorial/TableTutorial.tsx @@ -83,7 +83,7 @@ export default function TableTutorial() { position: "static", height: "100%", - borderRadius: 2, + borderRadius: 3, borderBottomLeftRadius: 0, borderBottomRightRadius: 0, border: "none", From 9ebd5b3aafbce1f887ad10c11669cbcc1c153d86 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Wed, 17 Aug 2022 10:49:52 +0200 Subject: [PATCH 082/309] update discord link --- src/constants/externalLinks.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/constants/externalLinks.ts b/src/constants/externalLinks.ts index b75be8f4..a8dae59d 100644 --- a/src/constants/externalLinks.ts +++ b/src/constants/externalLinks.ts @@ -11,7 +11,7 @@ export const EXTERNAL_LINKS = { playground: meta.homepage.replace("//", "//demo."), gitHub: meta.repository.url.replace(".git", ""), - discord: "https://discord.gg/B8yAD5PDX4", + discord: "https://rowy.io/discord", twitter: "https://twitter.com/rowyio", productHunt: "https://www.producthunt.com/products/rowy-2", From c665495be9f4a155c79074321305645abc99bef6 Mon Sep 17 00:00:00 2001 From: Han Tuerker Date: Wed, 17 Aug 2022 15:00:33 +0300 Subject: [PATCH 083/309] feat(airtable-migration): add checked value to radio inputs --- src/components/TableModals/ImportCsvWizard/Step1Columns.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/TableModals/ImportCsvWizard/Step1Columns.tsx b/src/components/TableModals/ImportCsvWizard/Step1Columns.tsx index e90159bd..54060430 100644 --- a/src/components/TableModals/ImportCsvWizard/Step1Columns.tsx +++ b/src/components/TableModals/ImportCsvWizard/Step1Columns.tsx @@ -312,12 +312,12 @@ export default function Step1Columns({ > } + control={} label="Auto-Generated" /> } + control={} label="Pick Column" /> Date: Wed, 17 Aug 2022 15:53:25 +0300 Subject: [PATCH 084/309] feat(airtable-migration): create new column as default --- .../ImportCsvWizard/Step1Columns.tsx | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/components/TableModals/ImportCsvWizard/Step1Columns.tsx b/src/components/TableModals/ImportCsvWizard/Step1Columns.tsx index 54060430..c0764a10 100644 --- a/src/components/TableModals/ImportCsvWizard/Step1Columns.tsx +++ b/src/components/TableModals/ImportCsvWizard/Step1Columns.tsx @@ -70,12 +70,23 @@ export default function Step1Columns({ find(tableColumns, (column) => column.label.toLowerCase().includes(field.toLowerCase()) )?.value ?? null; - if (match) { - setConfig((config) => ({ - ...config, - pairs: [...config.pairs, { csvKey: field, columnKey: match }], - })); + + const columnKey = camelCase(field); + const columnConfig: Partial = { pairs: [], newColumns: [] }; + columnConfig.pairs = [{ csvKey: field, columnKey: match ?? columnKey }]; + if (!match) { + columnConfig.newColumns = [ + { + name: field, + fieldName: columnKey, + key: columnKey, + type: suggestType(csvData.rows, field) || FieldType.shortText, + index: -1, + config: {}, + }, + ]; } + updateConfig(columnConfig); } else { const newValue = [...selectedFields]; newValue.splice(newValue.indexOf(field), 1); From 1c27b26c595d005ed8e7f4f42d3b54376c9c6ad0 Mon Sep 17 00:00:00 2001 From: Han Tuerker Date: Wed, 17 Aug 2022 16:17:16 +0300 Subject: [PATCH 085/309] feat(airtable-migration): add color csv import parser --- src/components/fields/Color/index.tsx | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/components/fields/Color/index.tsx b/src/components/fields/Color/index.tsx index c927e908..392094eb 100644 --- a/src/components/fields/Color/index.tsx +++ b/src/components/fields/Color/index.tsx @@ -1,6 +1,7 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; import withPopoverCell from "@src/components/fields/_withTableCell/withPopoverCell"; +import { toColor } from "react-color-palette"; import ColorIcon from "@mui/icons-material/Colorize"; import BasicCell from "@src/components/fields/_BasicCell/BasicCellNull"; @@ -30,5 +31,17 @@ export const config: IFieldConfig = { }), TableEditor: NullEditor as any, SideDrawerField, + csvImportParser: (value: string) => { + try { + const obj = JSON.parse(value); + if ("hex" in obj) { + return toColor("hex", obj.hex); + } + throw Error("Invalid color value"); + } catch (error) { + console.error(error); + return null; + } + }, }; export default config; From c56fdc0567ed955956c3b22bce19f8e3bb44e088 Mon Sep 17 00:00:00 2001 From: Han Tuerker Date: Wed, 17 Aug 2022 16:28:41 +0300 Subject: [PATCH 086/309] feat(csv-import): add import parsers to rating, slider --- src/components/fields/Color/index.tsx | 4 ++-- src/components/fields/Rating/index.tsx | 12 ++++++++++++ src/components/fields/Slider/index.tsx | 12 ++++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/components/fields/Color/index.tsx b/src/components/fields/Color/index.tsx index 392094eb..13cb9843 100644 --- a/src/components/fields/Color/index.tsx +++ b/src/components/fields/Color/index.tsx @@ -37,9 +37,9 @@ export const config: IFieldConfig = { if ("hex" in obj) { return toColor("hex", obj.hex); } - throw Error("Invalid color value"); + throw new Error(); } catch (error) { - console.error(error); + console.error("Invalid color value"); return null; } }, diff --git a/src/components/fields/Rating/index.tsx b/src/components/fields/Rating/index.tsx index 1492a4b4..3cbc5108 100644 --- a/src/components/fields/Rating/index.tsx +++ b/src/components/fields/Rating/index.tsx @@ -36,5 +36,17 @@ export const config: IFieldConfig = { filter: { operators: filterOperators, }, + csvImportParser: (value: string) => { + try { + const parsed = parseInt(value); + if (isNaN(parsed)) { + throw new Error("Invalid rating value!"); + } + return parsed; + } catch (error) { + console.error(error); + return null; + } + }, }; export default config; diff --git a/src/components/fields/Slider/index.tsx b/src/components/fields/Slider/index.tsx index 69363caa..80816fdf 100644 --- a/src/components/fields/Slider/index.tsx +++ b/src/components/fields/Slider/index.tsx @@ -35,5 +35,17 @@ export const config: IFieldConfig = { operators: filterOperators, }, SideDrawerField, + csvImportParser: (value: string) => { + try { + const parsed = parseInt(value); + if (isNaN(parsed)) { + throw new Error("Invalid slider value!"); + } + return parsed; + } catch (error) { + console.error(error); + return null; + } + }, }; export default config; From 67e6fc5e710a8084872e29deac54ea8737a6d732 Mon Sep 17 00:00:00 2001 From: Han Tuerker Date: Wed, 17 Aug 2022 16:53:10 +0300 Subject: [PATCH 087/309] feat(csv-import): add geopoint parser --- .../TableModals/ImportExistingWizard/utils.ts | 1 + src/components/fields/GeoPoint/TableCell.tsx | 2 +- src/components/fields/GeoPoint/index.tsx | 13 +++++++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/components/TableModals/ImportExistingWizard/utils.ts b/src/components/TableModals/ImportExistingWizard/utils.ts index 7b6d36e0..98ec10e0 100644 --- a/src/components/TableModals/ImportExistingWizard/utils.ts +++ b/src/components/TableModals/ImportExistingWizard/utils.ts @@ -46,6 +46,7 @@ const inferTypeFromValue = (value: any) => { if (typeof value === "object") { if ("hex" in value && "rgb" in value) return FieldType.color; + if ("latitude" in value && "longitude" in value) return FieldType.geoPoint; if ("toDate" in value) return FieldType.dateTime; return FieldType.json; } diff --git a/src/components/fields/GeoPoint/TableCell.tsx b/src/components/fields/GeoPoint/TableCell.tsx index de271abd..2e57a835 100644 --- a/src/components/fields/GeoPoint/TableCell.tsx +++ b/src/components/fields/GeoPoint/TableCell.tsx @@ -2,7 +2,7 @@ import { IBasicCellProps } from "@src/components/fields/types"; import { Typography } from "@mui/material"; export default function GeoPoint({ value }: IBasicCellProps) { - if (value === undefined) return null; + if (!value) return null; const { latitude, longitude } = value; if (latitude === undefined || longitude === undefined) diff --git a/src/components/fields/GeoPoint/index.tsx b/src/components/fields/GeoPoint/index.tsx index 3b3168ec..21b898b1 100644 --- a/src/components/fields/GeoPoint/index.tsx +++ b/src/components/fields/GeoPoint/index.tsx @@ -1,4 +1,5 @@ import { lazy } from "react"; +import { GeoPoint } from "firebase/firestore"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; import withBasicCell from "@src/components/fields/_withTableCell/withBasicCell"; @@ -26,5 +27,17 @@ export const config: IFieldConfig = { TableCell: withBasicCell(TableCell), TableEditor: withSideDrawerEditor(TableCell), SideDrawerField, + csvImportParser: (value: string) => { + try { + const { latitude, longitude } = JSON.parse(value); + if (latitude && longitude) { + return new GeoPoint(latitude, longitude); + } + throw new Error(); + } catch (e) { + console.error("Invalid Geopoint value"); + return null; + } + }, }; export default config; From 086fd66dad3f4a492e99f5bbf015ad1a5cf36bf1 Mon Sep 17 00:00:00 2001 From: Han Tuerker Date: Thu, 18 Aug 2022 09:55:09 +0300 Subject: [PATCH 088/309] feat(csv-import): fix invalid columnKey select --- .../TableModals/ImportCsvWizard/Step1Columns.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/TableModals/ImportCsvWizard/Step1Columns.tsx b/src/components/TableModals/ImportCsvWizard/Step1Columns.tsx index c0764a10..24ef65bd 100644 --- a/src/components/TableModals/ImportCsvWizard/Step1Columns.tsx +++ b/src/components/TableModals/ImportCsvWizard/Step1Columns.tsx @@ -119,7 +119,7 @@ export default function Step1Columns({ const handleChange = (csvKey: string) => (value: string) => { const columnKey = !!tableSchema.columns?.[value] ? value : camelCase(value); - + if (columnKey === "") return; // Check if this pair already exists in config const configIndex = findIndex(config.pairs, { csvKey }); if (configIndex > -1) { @@ -334,7 +334,7 @@ export default function Step1Columns({ setConfig((prev) => ({ ...prev, @@ -369,8 +369,8 @@ export default function Step1Columns({
    - {stepErrors().map((error) => ( - + {stepErrors().map((error, index) => ( + {error} ))} From 2034efaf3ba56d6f916a762833b1a2c40420d245 Mon Sep 17 00:00:00 2001 From: Han Tuerker Date: Thu, 18 Aug 2022 09:56:03 +0300 Subject: [PATCH 089/309] feat(airtable-import): remove redundant condition --- src/components/TableModals/ImportAirtableWizard/utils.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/components/TableModals/ImportAirtableWizard/utils.ts b/src/components/TableModals/ImportAirtableWizard/utils.ts index bc7ff765..89130dcb 100644 --- a/src/components/TableModals/ImportAirtableWizard/utils.ts +++ b/src/components/TableModals/ImportAirtableWizard/utils.ts @@ -9,8 +9,6 @@ import { import { isValid as isValidDate, parseISO } from "date-fns"; export const inferTypeFromValue = (value: any) => { - if (!value || typeof value === "function") return; - if (Array.isArray(value) && typeof value[0] === "string") return FieldType.multiSelect; if (typeof value === "boolean") return FieldType.checkbox; From f775fe611f0100da570cdd733995cad7c8a9dae6 Mon Sep 17 00:00:00 2001 From: Han Tuerker Date: Thu, 18 Aug 2022 11:18:11 +0300 Subject: [PATCH 090/309] feat(airtable-import): add new column as default --- .../ImportAirtableWizard/Step1Columns.tsx | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/src/components/TableModals/ImportAirtableWizard/Step1Columns.tsx b/src/components/TableModals/ImportAirtableWizard/Step1Columns.tsx index 12cde08a..d3500605 100644 --- a/src/components/TableModals/ImportAirtableWizard/Step1Columns.tsx +++ b/src/components/TableModals/ImportAirtableWizard/Step1Columns.tsx @@ -63,12 +63,29 @@ export default function Step1Columns({ find(tableColumns, (column) => column.label.toLowerCase().includes(field.toLowerCase()) )?.value ?? null; - if (match) { - setConfig((config) => ({ - ...config, - pairs: [...config.pairs, { fieldKey: field, columnKey: match }], - })); + + const columnKey = camelCase(field); + const columnConfig: Partial = { + pairs: [], + newColumns: [], + }; + columnConfig.pairs = [ + { fieldKey: field, columnKey: match ?? columnKey }, + ]; + if (!match) { + columnConfig.newColumns = [ + { + name: field, + fieldName: columnKey, + key: columnKey, + type: + suggestType(airtableData.records, field) || FieldType.shortText, + index: -1, + config: {}, + }, + ]; } + updateConfig(columnConfig); } else { const newValue = [...selectedFields]; newValue.splice(newValue.indexOf(field), 1); From d1fc7a009f4f46dbe9f17036edf418862a064e55 Mon Sep 17 00:00:00 2001 From: Han Tuerker Date: Thu, 18 Aug 2022 11:18:39 +0300 Subject: [PATCH 091/309] feat(data-import): disable audit logs --- src/atoms/tableScope/rowActions.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/atoms/tableScope/rowActions.ts b/src/atoms/tableScope/rowActions.ts index db94185d..75ec06c1 100644 --- a/src/atoms/tableScope/rowActions.ts +++ b/src/atoms/tableScope/rowActions.ts @@ -273,13 +273,13 @@ export const bulkAddRowsAtom = atom( // Write to db await bulkWriteDb(operations, onBatchCommit); - if (auditChange) { - const auditChangePromises: Promise[] = []; - for (const operation of operations) { - auditChangePromises.push(auditChange("ADD_ROW", operation.path)); - } - await Promise.all(auditChangePromises); - } + // if (auditChange) { + // const auditChangePromises: Promise[] = []; + // for (const operation of operations) { + // auditChangePromises.push(auditChange("ADD_ROW", operation.path)); + // } + // await Promise.all(auditChangePromises); + // } } ); From e4c49b11ecdcfd31ae6f40d3ee92dfa512d0bb34 Mon Sep 17 00:00:00 2001 From: Han Tuerker Date: Thu, 18 Aug 2022 11:40:34 +0300 Subject: [PATCH 092/309] feat(airtable-import): add url input instead base/table id --- .../ImportData/ImportFromAirtable.tsx | 43 ++++++++----------- 1 file changed, 18 insertions(+), 25 deletions(-) diff --git a/src/components/TableToolbar/ImportData/ImportFromAirtable.tsx b/src/components/TableToolbar/ImportData/ImportFromAirtable.tsx index 53b226e0..494ec5a9 100644 --- a/src/components/TableToolbar/ImportData/ImportFromAirtable.tsx +++ b/src/components/TableToolbar/ImportData/ImportFromAirtable.tsx @@ -9,6 +9,7 @@ import { tableScope, } from "@src/atoms/tableScope"; import { analytics, logEvent } from "@src/analytics"; +import { find } from "lodash-es"; export default function ImportFromAirtable() { const [{ baseId, tableId, apiKey }, setImportAirtable] = useAtom( @@ -18,6 +19,7 @@ export default function ImportFromAirtable() { const openTableModal = useSetAtom(tableModalAtom, tableScope); const [loading, setLoading] = useState(false); const [error, setError] = useState({}); + const [tableUrl, setTableUrl] = useState(""); useEffect(() => { return () => { @@ -32,6 +34,16 @@ export default function ImportFromAirtable() { }; }, [setImportAirtable]); + useEffect(() => { + try { + const url = new URL(tableUrl); + const pathNames = url.pathname.split("/"); + const baseId = find(pathNames, (path) => /^app[\w]+$/.test(path)) ?? ""; + const tableId = find(pathNames, (path) => /^tbl[\w]+$/.test(path)) ?? ""; + setImportAirtable((prev) => ({ ...prev, baseId, tableId })); + } catch (error) {} + }, [tableUrl, setImportAirtable]); + const handleAirtableConnection = () => { const errors = []; if (!apiKey) { @@ -115,33 +127,14 @@ export default function ImportFromAirtable() { variant="filled" autoFocus fullWidth - label="Airtable Base ID" - placeholder="Insert your Base ID here" - value={baseId} + label="Airtable Table URL" + placeholder="Insert your Table URL here" + value={tableUrl} onChange={(e) => { - setImportAirtable((prev) => ({ - ...prev, - baseId: e.currentTarget.value, - })); + setTableUrl(e.currentTarget.value); }} - helperText={error?.baseId?.message} - error={!!error?.baseId?.message} - /> - { - setImportAirtable((prev) => ({ - ...prev, - tableId: e.currentTarget.value, - })); - }} - helperText={error?.tableId?.message} - error={!!error?.tableId?.message} + helperText={error?.baseId?.message || error?.tableId?.message} + error={!!error?.baseId?.message || error?.tableId?.message} /> ), From bafc415a16a1c6f7dd50f89450ffb37f53fcddc5 Mon Sep 17 00:00:00 2001 From: Bhavya Verma Date: Fri, 16 Sep 2022 13:35:10 +0530 Subject: [PATCH 102/309] Added confirmation for Duplicate Row button --- .../Table/ContextMenu/MenuContents.tsx | 35 +++++++++++++++---- .../Table/formatters/FinalColumn.tsx | 33 ++++++++++++++--- 2 files changed, 56 insertions(+), 12 deletions(-) diff --git a/src/components/Table/ContextMenu/MenuContents.tsx b/src/components/Table/ContextMenu/MenuContents.tsx index ae53a4a0..52b2d3d3 100644 --- a/src/components/Table/ContextMenu/MenuContents.tsx +++ b/src/components/Table/ContextMenu/MenuContents.tsx @@ -137,6 +137,12 @@ export default function MenuContents({ onClose }: IMenuContentsProps) { // Row actions if (row) { + const handleDuplicate = () => { + addRow({ + row, + setId: addRowIdType === "custom" ? "decrement" : addRowIdType, + }); + }; const handleDelete = () => deleteRow(row._rowy_ref.path); const rowActions = [ { @@ -179,13 +185,28 @@ export default function MenuContents({ onClose }: IMenuContentsProps) { disabled: tableSettings.tableType === "collectionGroup" || (!userRoles.includes("ADMIN") && tableSettings.readOnly), - onClick: () => { - addRow({ - row, - setId: addRowIdType === "custom" ? "decrement" : addRowIdType, - }); - onClose(); - }, + onClick: altPress + ? handleDuplicate + : () => { + confirm({ + title: "Duplicate row?", + body: ( + <> + Row path: +
    + + {row._rowy_ref.path} + + + ), + confirm: "Duplicate", + confirmColor: "success", + handleConfirm: handleDuplicate, + }); + onClose(); + }, }, { label: altPress ? "Delete" : "Delete…", diff --git a/src/components/Table/formatters/FinalColumn.tsx b/src/components/Table/formatters/FinalColumn.tsx index d5d57934..73f1c7b1 100644 --- a/src/components/Table/formatters/FinalColumn.tsx +++ b/src/components/Table/formatters/FinalColumn.tsx @@ -31,6 +31,12 @@ export default function FinalColumn({ row }: FormatterProps) { const [altPress] = useAtom(altPressAtom, projectScope); const handleDelete = () => deleteRow(row._rowy_ref.path); + const handleDuplicate = () => { + addRow({ + row, + setId: addRowIdType === "custom" ? "decrement" : addRowIdType, + }); + }; if (!userRoles.includes("ADMIN") && tableSettings.readOnly === true) return null; @@ -42,11 +48,28 @@ export default function FinalColumn({ row }: FormatterProps) { size="small" color="inherit" disabled={tableSettings.tableType === "collectionGroup"} - onClick={() => - addRow({ - row, - setId: addRowIdType === "custom" ? "decrement" : addRowIdType, - }) + onClick={ + altPress + ? handleDuplicate + : () => { + confirm({ + title: "Duplicate row?", + body: ( + <> + Row path: +
    + + {row._rowy_ref.path} + + + ), + confirm: "Duplicate", + confirmColor: "success", + handleConfirm: handleDuplicate, + }); + } } aria-label="Duplicate row" className="row-hover-iconButton" From 40a3960916010cdae0fa131a7c31453be727e981 Mon Sep 17 00:00:00 2001 From: Bobby Wang Date: Fri, 16 Sep 2022 15:18:49 +0700 Subject: [PATCH 103/309] Fix: monoco editor dark theme issue --- src/components/CodeEditor/CodeEditor.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/CodeEditor/CodeEditor.tsx b/src/components/CodeEditor/CodeEditor.tsx index 20d835d9..2abfd45b 100644 --- a/src/components/CodeEditor/CodeEditor.tsx +++ b/src/components/CodeEditor/CodeEditor.tsx @@ -101,6 +101,7 @@ export default function CodeEditor({ }} {...props} onValidate={onValidate_} + theme={`github-${theme.palette.mode}`} options={{ readOnly: disabled, fontFamily: theme.typography.fontFamilyMono, @@ -111,7 +112,6 @@ export default function CodeEditor({ automaticLayout: true, fixedOverflowWidgets: true, tabSize: 2, - theme: `github-${theme.palette.mode}`, ...props.options, }} /> From 2fbd89a581964ece7943c6c943e523ab8d4d3fde Mon Sep 17 00:00:00 2001 From: Bobby Wang Date: Fri, 16 Sep 2022 16:05:24 +0700 Subject: [PATCH 104/309] Fix: monoco editor dynamic import editor error --- .../CodeEditor/useMonacoCustomizations.ts | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/components/CodeEditor/useMonacoCustomizations.ts b/src/components/CodeEditor/useMonacoCustomizations.ts index 13c05a20..f16f621b 100644 --- a/src/components/CodeEditor/useMonacoCustomizations.ts +++ b/src/components/CodeEditor/useMonacoCustomizations.ts @@ -65,6 +65,7 @@ export default function useMonacoCustomizations({ const [tableRows] = useAtom(tableRowsAtom, tableScope); const [rowyRun] = useAtom(rowyRunAtom, projectScope); const [tableColumnsOrdered] = useAtom(tableColumnsOrderedAtom, tableScope); + useEffect(() => { return () => { onUnmount?.(); @@ -76,6 +77,10 @@ export default function useMonacoCustomizations({ if (!monaco) return; try { + monaco.languages.typescript.javascriptDefaults.setCompilerOptions({ + target: monaco.languages.typescript.ScriptTarget.ES2020, + allowNonTsExtensions: true, + }); monaco.languages.typescript.javascriptDefaults.addExtraLib(firestoreDefs); monaco.languages.typescript.javascriptDefaults.addExtraLib( firebaseAuthDefs @@ -83,11 +88,6 @@ export default function useMonacoCustomizations({ monaco.languages.typescript.javascriptDefaults.addExtraLib( firebaseStorageDefs ); - // Compiler options - monaco.languages.typescript.javascriptDefaults.setCompilerOptions({ - target: monaco.languages.typescript.ScriptTarget.ES2020, - allowNonTsExtensions: true, - }); monaco.languages.typescript.javascriptDefaults.addExtraLib( utilsDefs, "ts:filename/utils.d.ts" @@ -121,9 +121,12 @@ export default function useMonacoCustomizations({ if (!monaco) return; try { - monaco.languages.typescript.javascriptDefaults.setDiagnosticsOptions( - JSON.parse(stringifiedDiagnosticsOptions) - ); + monaco.languages.typescript.javascriptDefaults.setDiagnosticsOptions({ + ...JSON.parse(stringifiedDiagnosticsOptions), + diagnosticCodesToIgnore: [ + 1323, // remove dynamic import error + ], + }); } catch (error) { console.error("Could not set diagnostics options: ", error); } From fccad0bc1be7cef60a1786a2f75b89b6eae043df Mon Sep 17 00:00:00 2001 From: Han Tuerker Date: Fri, 16 Sep 2022 18:17:43 +0300 Subject: [PATCH 105/309] fix(airtable-import): fix columns step issues, ui improvements exact same as csv import --- .../ImportAirtableWizard/Step1Columns.tsx | 52 +++++++++++++------ 1 file changed, 36 insertions(+), 16 deletions(-) diff --git a/src/components/TableModals/ImportAirtableWizard/Step1Columns.tsx b/src/components/TableModals/ImportAirtableWizard/Step1Columns.tsx index d3500605..ea86e2c4 100644 --- a/src/components/TableModals/ImportAirtableWizard/Step1Columns.tsx +++ b/src/components/TableModals/ImportAirtableWizard/Step1Columns.tsx @@ -13,14 +13,17 @@ import { FormControl, RadioGroup, Radio, + Stack, + Box, } from "@mui/material"; import ArrowIcon from "@mui/icons-material/ArrowForward"; +import { TableColumn as TableColumnIcon } from "@src/assets/icons"; import { IStepProps } from "."; -import { AirtableConfig } from "./ImportAirtableWizard"; +import { AirtableConfig } from "@src/components/TableModals/ImportAirtableWizard"; import FadeList from "@src/components/TableModals/ScrollableList"; import Column, { COLUMN_HEADER_HEIGHT } from "@src/components/Table/Column"; -import MultiSelect from "@rowy/multiselect"; +import ColumnSelect from "@src/components/Table/ColumnSelect"; import { tableScope, @@ -28,7 +31,8 @@ import { tableColumnsOrderedAtom, } from "@src/atoms/tableScope"; import { FieldType } from "@src/constants/fields"; -import { suggestType } from "./utils"; +import { getFieldProp } from "@src/components/fields"; +import { suggestType } from "@src/components/TableModals/ImportAirtableWizard/utils"; export default function Step1Columns({ airtableData, @@ -51,6 +55,7 @@ export default function Step1Columns({ config.pairs.map((pair) => pair.fieldKey) ); + // When a field is selected to be imported const handleSelect = (field: string) => (e: React.ChangeEvent) => { const checked = e.target.checked; @@ -98,7 +103,7 @@ export default function Step1Columns({ // Delete matching newColumn if it was created if (configPair) { const newColumnIndex = findIndex(config.newColumns, { - key: configPair.fieldKey, + key: configPair.columnKey, }); if (newColumnIndex > -1) { const newColumns = [...config.newColumns]; @@ -116,14 +121,17 @@ export default function Step1Columns({ } }; + // When a field is mapped to a new column const handleChange = (fieldKey: string) => (value: string) => { if (!value) return; const columnKey = !!tableSchema.columns?.[value] ? value : camelCase(value); + if (columnKey === "") return; // Check if this pair already exists in config const configIndex = findIndex(config.pairs, { fieldKey }); + console.log(columnKey, configIndex); if (configIndex > -1) { const pairs = [...config.pairs]; - pairs[configIndex].fieldKey = columnKey; + pairs[configIndex].columnKey = columnKey; setConfig((config) => ({ ...config, pairs })); } else { updateConfig({ @@ -217,9 +225,8 @@ export default function Step1Columns({ {selected && ( - + + + {!isNewColumn ? ( + getFieldProp("icon", matchingColumn?.type) + ) : ( + + )} + {matchingColumn?.name} {isNewColumn && ( - theme.spacing(1) + " !important", - backgroundColor: "action.focus", + variant="outlined" + style={{ + marginLeft: "auto", pointerEvents: "none", + height: 24, + fontWeight: "normal", }} /> )} - + ); }, sx: [ @@ -274,14 +294,14 @@ export default function Step1Columns({ !columnKey && { color: "text.disabled" }, ], }, + sx: { "& .MuiInputLabel-root": { display: "none" } }, }} clearable={false} displayEmpty - labelPlural="columns" freeText - AddButtonProps={{ children: "Add new column…" }} + AddButtonProps={{ children: "Create column…" }} AddDialogProps={{ - title: "Add new column", + title: "Create column", textFieldLabel: "Column name", }} /> From 4deae4866d9e8f2a9db53e1d050abb1916db07d7 Mon Sep 17 00:00:00 2001 From: Han Tuerker Date: Fri, 16 Sep 2022 19:22:03 +0300 Subject: [PATCH 106/309] feat(airtable-import): add doc links --- .../ImportData/ImportFromAirtable.tsx | 51 +++++++++++++++++-- src/constants/externalLinks.ts | 4 ++ 2 files changed, 52 insertions(+), 3 deletions(-) diff --git a/src/components/TableToolbar/ImportData/ImportFromAirtable.tsx b/src/components/TableToolbar/ImportData/ImportFromAirtable.tsx index 21bdb405..f5ed3aa9 100644 --- a/src/components/TableToolbar/ImportData/ImportFromAirtable.tsx +++ b/src/components/TableToolbar/ImportData/ImportFromAirtable.tsx @@ -1,7 +1,14 @@ import { useState, useEffect } from "react"; import { useAtom, useSetAtom } from "jotai"; -import { Button, Typography, TextField } from "@mui/material"; +import { + Button, + Typography, + TextField, + IconButton, + Stack, + InputLabel, +} from "@mui/material"; import { tableModalAtom, @@ -11,6 +18,9 @@ import { import { analytics, logEvent } from "@src/analytics"; import { find } from "lodash-es"; +import { WIKI_LINKS } from "@src/constants/externalLinks"; +import DocsIcon from "@mui/icons-material/ArrowUpward"; + export default function ImportFromAirtable() { const [{ baseId, tableId, apiKey }, setImportAirtable] = useAtom( importAirtableAtom, @@ -108,10 +118,28 @@ export default function ImportFromAirtable() { manage with Rowy. + Airtable API Key + + API Key + +
    + } placeholder="Insert your API key here" value={apiKey} onChange={(e) => @@ -126,7 +154,24 @@ export default function ImportFromAirtable() { + Airtable Table URL + + Table URL + + + } placeholder="Insert your Table URL here" value={tableUrl} onChange={(e) => { diff --git a/src/constants/externalLinks.ts b/src/constants/externalLinks.ts index 10538e14..84035a12 100644 --- a/src/constants/externalLinks.ts +++ b/src/constants/externalLinks.ts @@ -55,6 +55,10 @@ const WIKI_PATHS = { extensionsSendgridEmail: "/extensions/sendgrid-email", extensionsTwilioMessage: "/extensions/twilio-message", webhooks: "/webhooks", + + importAirtable: "/import-export-data/import-airtable", + importAirtableApiKey: "/import-export-data/import-airtable#api-key", + importAirtableTableUrl: "/import-export-data/import-airtable#table-url", }; export const WIKI_LINKS = mapValues( WIKI_PATHS, From 4cbc6fcbfaffc5aa2b2b364b0475c7123dd37ae6 Mon Sep 17 00:00:00 2001 From: Miriam Shams-Rainey Date: Fri, 16 Sep 2022 17:09:03 -0400 Subject: [PATCH 107/309] #513: Added Customizable Icons for Ratings Field --- src/components/fields/Rating/Settings.tsx | 113 +++++++++++++-------- src/components/fields/Rating/TableCell.tsx | 13 ++- 2 files changed, 84 insertions(+), 42 deletions(-) diff --git a/src/components/fields/Rating/Settings.tsx b/src/components/fields/Rating/Settings.tsx index 5504bd08..6b3cf710 100644 --- a/src/components/fields/Rating/Settings.tsx +++ b/src/components/fields/Rating/Settings.tsx @@ -1,48 +1,81 @@ import { ISettingsProps } from "@src/components/fields/types"; - -import { Slider, InputLabel, TextField, Grid } from "@mui/material"; +import RatingIcon from "@mui/icons-material/Star"; +import { Slider, InputLabel, TextField, Grid, FormControlLabel, Checkbox, Stack, Fab } from "@mui/material"; import ToggleButton from "@mui/material/ToggleButton"; import ToggleButtonGroup from "@mui/material/ToggleButtonGroup"; +import { get } from "lodash-es"; export default function Settings({ onChange, config }: ISettingsProps) { return ( - <> - - - { - onChange("max")(parseInt(e.target.value)); - }} - inputProps={{ min: 1, max: 20 }} - /> - - - Star fraction - { - onChange("precision")(value); - }} - aria-label="text alignment" - > - - 1/4 - - - 1/2 - - - 1 - - - + + + { + onChange("max")(parseInt(e.target.value)); + }} + inputProps={{ min: 1, max: 20 }} + /> - + + Star fraction + { + onChange("precision")(value); + }} + aria-label="text alignment" + > + + 1/4 + + + 1/2 + + + 1 + + + + + onChange("customIcons.enabled")(e.target.checked) + } + name="customIcons.enabled" + /> + } + label="Customize button icons with emoji" + style={{ marginLeft: -11 }} + /> + {config.customIcons?.enabled && ( + + + + + onChange("customIcons.rating")(e.target.value) + } + label="Rating:" + className="labelHorizontal" + inputProps={{ style: { width: "3ch" } }} + /> + + {get(config, "customIcons.rating") || } + + + + + )} + ); -} +} \ No newline at end of file diff --git a/src/components/fields/Rating/TableCell.tsx b/src/components/fields/Rating/TableCell.tsx index 34da84cf..bd4df1ca 100644 --- a/src/components/fields/Rating/TableCell.tsx +++ b/src/components/fields/Rating/TableCell.tsx @@ -1,7 +1,15 @@ import { IHeavyCellProps } from "@src/components/fields/types"; import MuiRating from "@mui/material/Rating"; -import StarBorderIcon from "@mui/icons-material/StarBorder"; +import RatingIcon from "@mui/icons-material/Star"; +import { get } from "lodash-es"; + + +const getStateIcon = (config: any) => { + // only use the config to get the custom rating icon if enabled via toggle + if (!get(config, "customIcons.enabled")) { return } + return get(config, "customIcons.rating") || ; +}; export default function Rating({ row, @@ -28,9 +36,10 @@ export default function Rating({ name={`${row.id}-${column.key}`} value={typeof value === "number" ? value : 0} onClick={(e) => e.stopPropagation()} + icon={getStateIcon(column.config)} disabled={disabled} onChange={(_, newValue) => onSubmit(newValue)} - emptyIcon={} + emptyIcon={getStateIcon(column.config)} max={max} precision={precision} sx={{ mx: -0.25 }} From 394a843637804137fbd87066f604c5f4109d264c Mon Sep 17 00:00:00 2001 From: Miriam Shams-Rainey Date: Fri, 16 Sep 2022 23:29:04 -0400 Subject: [PATCH 108/309] #513: Customizable Rating Icons Side Drawer Also updated formatting of custom rating icons to match default star sz --- src/components/fields/Rating/SideDrawerField.tsx | 9 +++++---- src/components/fields/Rating/TableCell.tsx | 4 +++- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/components/fields/Rating/SideDrawerField.tsx b/src/components/fields/Rating/SideDrawerField.tsx index d3e4ffcb..40e8a2bb 100644 --- a/src/components/fields/Rating/SideDrawerField.tsx +++ b/src/components/fields/Rating/SideDrawerField.tsx @@ -3,9 +3,8 @@ import { ISideDrawerFieldProps } from "@src/components/fields/types"; import { Grid } from "@mui/material"; import { Rating as MuiRating } from "@mui/material"; import "@mui/lab"; -import StarBorderIcon from "@mui/icons-material/StarBorder"; - -import { fieldSx, getFieldId } from "@src/components/SideDrawer/utils"; +import { getStateIcon } from "./TableCell"; +import { fieldSx } from "@src/components/SideDrawer/utils"; export default function Rating({ column, @@ -29,7 +28,9 @@ export default function Rating({ onChange(newValue); onSubmit(); }} - emptyIcon={} + icon={getStateIcon(column.config)} + emptyIcon={getStateIcon(column.config)} + size="small" max={max} precision={precision} sx={{ ml: -0.5 }} diff --git a/src/components/fields/Rating/TableCell.tsx b/src/components/fields/Rating/TableCell.tsx index bd4df1ca..f7640d59 100644 --- a/src/components/fields/Rating/TableCell.tsx +++ b/src/components/fields/Rating/TableCell.tsx @@ -3,9 +3,10 @@ import { IHeavyCellProps } from "@src/components/fields/types"; import MuiRating from "@mui/material/Rating"; import RatingIcon from "@mui/icons-material/Star"; import { get } from "lodash-es"; +import { MonitorSmall } from "mdi-material-ui"; -const getStateIcon = (config: any) => { +export const getStateIcon = (config: any) => { // only use the config to get the custom rating icon if enabled via toggle if (!get(config, "customIcons.enabled")) { return } return get(config, "customIcons.rating") || ; @@ -37,6 +38,7 @@ export default function Rating({ value={typeof value === "number" ? value : 0} onClick={(e) => e.stopPropagation()} icon={getStateIcon(column.config)} + size="small" disabled={disabled} onChange={(_, newValue) => onSubmit(newValue)} emptyIcon={getStateIcon(column.config)} From 33dd82ac6bdb21bb9f8c8b1ed0cbac3c350ab18e Mon Sep 17 00:00:00 2001 From: Miriam Shams-Rainey Date: Fri, 16 Sep 2022 23:44:49 -0400 Subject: [PATCH 109/309] #816: Fixed Logic for Custom Icons in Action Field --- src/components/fields/Action/ActionFab.tsx | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/components/fields/Action/ActionFab.tsx b/src/components/fields/Action/ActionFab.tsx index 67f00847..0e4db6cd 100644 --- a/src/components/fields/Action/ActionFab.tsx +++ b/src/components/fields/Action/ActionFab.tsx @@ -28,6 +28,16 @@ const replacer = (data: any) => (m: string, key: string) => { }; const getStateIcon = (actionState: "undo" | "redo" | string, config: any) => { + if (!get(config, "customIcons.enabled", false)) { + switch (actionState) { + case "undo": + return ; + case "redo": + return ; + default: + return ; + } + } switch (actionState) { case "undo": return get(config, "customIcons.undo") || ; From 37887b3826048d0874e75e565f2738a9c1becdfd Mon Sep 17 00:00:00 2001 From: shamsmosowi Date: Sat, 17 Sep 2022 16:33:20 +0200 Subject: [PATCH 110/309] implement cell copy/paste for json field --- .../fields/Json/ContextMenuActions.tsx | 75 +++++++++++++++++++ src/components/fields/Json/index.tsx | 2 + 2 files changed, 77 insertions(+) create mode 100644 src/components/fields/Json/ContextMenuActions.tsx diff --git a/src/components/fields/Json/ContextMenuActions.tsx b/src/components/fields/Json/ContextMenuActions.tsx new file mode 100644 index 00000000..de0555e3 --- /dev/null +++ b/src/components/fields/Json/ContextMenuActions.tsx @@ -0,0 +1,75 @@ +import { useAtom, useSetAtom } from "jotai"; +import { find, get } from "lodash-es"; +import { useSnackbar } from "notistack"; +import { Copy } from "@src/assets/icons"; +import Paste from "@mui/icons-material/ContentPaste"; + +import { + tableScope, + tableSchemaAtom, + tableRowsAtom, + updateFieldAtom, +} from "@src/atoms/tableScope"; +import { IFieldConfig } from "@src/components/fields/types"; + +export interface IContextMenuActions { + label: string; + icon: React.ReactNode; + onClick: () => void; +} + +export const ContextMenuActions: IFieldConfig["contextMenuActions"] = ( + selectedCell, + reset +) => { + const [tableSchema] = useAtom(tableSchemaAtom, tableScope); + const [tableRows] = useAtom(tableRowsAtom, tableScope); + const { enqueueSnackbar } = useSnackbar(); + const updateField = useSetAtom(updateFieldAtom, tableScope); + const selectedCol = tableSchema.columns?.[selectedCell.columnKey]; + if (!selectedCol) return []; + + const selectedRow = find(tableRows, ["_rowy_ref.path", selectedCell.path]); + const cellValue = get(selectedRow, selectedCol.fieldName) || []; + + const isEmpty = + cellValue === "" || + cellValue === null || + cellValue === undefined || + cellValue.length === 0; + + return [ + { + label: "Copy", + icon: , + onClick: () => { + try { + navigator.clipboard.writeText(JSON.stringify(cellValue)); + enqueueSnackbar("Copied"); + } catch (error) { + enqueueSnackbar(`Failed to copy: ${error}`, { variant: "error" }); + } + }, + disabled: isEmpty, + }, + { + label: "Paste", + icon: , + onClick: async () => { + try { + const text = await navigator.clipboard.readText(); + const parsed = JSON.parse(text); + updateField({ + path: selectedCell.path, + fieldName: selectedCol.fieldName, + value: parsed, + }); + } catch (error) { + enqueueSnackbar(`Failed to paste: ${error}`, { variant: "error" }); + } + }, + }, + ]; +}; + +export default ContextMenuActions; diff --git a/src/components/fields/Json/index.tsx b/src/components/fields/Json/index.tsx index e4587c17..8981d877 100644 --- a/src/components/fields/Json/index.tsx +++ b/src/components/fields/Json/index.tsx @@ -5,6 +5,7 @@ import withBasicCell from "@src/components/fields/_withTableCell/withBasicCell"; import { Json as JsonIcon } from "@src/assets/icons"; import BasicCell from "./BasicCell"; import withSideDrawerEditor from "@src/components/Table/editors/withSideDrawerEditor"; +import ContextMenuActions from "./ContextMenuActions"; const SideDrawerField = lazy( () => @@ -35,5 +36,6 @@ export const config: IFieldConfig = { }, SideDrawerField, settings: Settings, + contextMenuActions: ContextMenuActions, }; export default config; From 9105c167800426a81026fdad918cc2861523057d Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Mon, 19 Sep 2022 16:24:51 +1000 Subject: [PATCH 111/309] sync EmojiAvatar updates --- src/components/EmojiAvatar.tsx | 35 ++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/src/components/EmojiAvatar.tsx b/src/components/EmojiAvatar.tsx index ea11a4b2..0f089e6c 100644 --- a/src/components/EmojiAvatar.tsx +++ b/src/components/EmojiAvatar.tsx @@ -4,17 +4,28 @@ import { colord } from "colord"; import { useTheme, Avatar, AvatarProps } from "@mui/material"; import { spreadSx } from "@src/utils/ui"; +// https://www.stefanjudis.com/snippets/how-to-detect-emojis-in-javascript-strings/ +const emojiRegex = /\p{Emoji}/u; + +export const EMOJI_AVATAR_L_LIGHT = 90; +export const EMOJI_AVATAR_L_DARK = 30; +export const EMOJI_AVATAR_C_LIGHT = 15; +export const EMOJI_AVATAR_C_DARK = 20; + export interface IEmojiAvatarProps extends Partial { + /** CSS color string or a number (as a string). If number, used as hue */ bgColor?: string; emoji?: string; fallback: string; + uid?: string; size?: number; } export default function EmojiAvatar({ - bgColor, + bgColor: bgColorProp, emoji, fallback, + uid, children, size = 40, ...props @@ -22,7 +33,19 @@ export default function EmojiAvatar({ const theme = useTheme(); const darkMode = theme.palette.mode === "dark"; - const bgcolor = bgColor || generateRandomColor(fallback, darkMode); + let bgcolor: string; + if (bgColorProp && !Number.isNaN(Number(bgColorProp))) { + bgcolor = colord({ + l: darkMode ? EMOJI_AVATAR_L_DARK : EMOJI_AVATAR_L_LIGHT, + c: darkMode ? EMOJI_AVATAR_C_DARK : EMOJI_AVATAR_C_LIGHT, + h: Number(bgColorProp), + }).toHslString(); + } else if (bgColorProp) { + bgcolor = bgColorProp; + } else { + bgcolor = generateRandomColor(`${fallback}__${uid}`, darkMode); + } + const bgcolorLch = colord(bgcolor).toLch(); const textColor = colord({ l: @@ -42,7 +65,7 @@ export default function EmojiAvatar({ color: textColor, width: size, height: size, - fontSize: size * 0.45, + fontSize: size * (emojiRegex.test(emoji || "") ? 0.67 : 0.45), }, props.variant === "rounded" && { borderRadius: size / 40 }, ...spreadSx(props.sx), @@ -61,6 +84,10 @@ export default function EmojiAvatar({ const generateRandomColor = (seed: string, darkMode: boolean) => { const rng = seedrandom(seed); - const color = colord({ l: darkMode ? 30 : 90, c: 15, h: rng() * 360 }); + const color = colord({ + l: darkMode ? EMOJI_AVATAR_L_DARK : EMOJI_AVATAR_L_LIGHT, + c: darkMode ? EMOJI_AVATAR_C_DARK : EMOJI_AVATAR_C_LIGHT, + h: rng() * 360, + }); return color.toHslString(); }; From 067885b8dd51304b8ace9c9f8169154335d8d7c4 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Mon, 19 Sep 2022 19:48:20 +1000 Subject: [PATCH 112/309] ConfirmDialog: fix confirm command persisting after close --- src/components/ConfirmDialog.tsx | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/components/ConfirmDialog.tsx b/src/components/ConfirmDialog.tsx index dd37b76d..e867dec0 100644 --- a/src/components/ConfirmDialog.tsx +++ b/src/components/ConfirmDialog.tsx @@ -1,5 +1,6 @@ import { useState } from "react"; import { useAtom } from "jotai"; +import { Scope } from "jotai/core/atom"; import { Dialog, @@ -14,11 +15,17 @@ import { import { SlideTransitionMui } from "@src/components/Modal/SlideTransition"; import { projectScope, confirmDialogAtom } from "@src/atoms/projectScope"; +export interface IConfirmDialogProps { + scope?: Scope; +} + /** * Display a confirm dialog using `confirmDialogAtom` in `globalState` * @see {@link confirmDialogAtom | Usage example} */ -export default function ConfirmDialog() { +export default function ConfirmDialog({ + scope = projectScope, +}: IConfirmDialogProps) { const [ { open, @@ -39,8 +46,12 @@ export default function ConfirmDialog() { buttonLayout = "horizontal", }, setState, - ] = useAtom(confirmDialogAtom, projectScope); - const handleClose = () => setState({ open: false }); + ] = useAtom(confirmDialogAtom, scope); + + const handleClose = () => { + setState({ open: false }); + setDryText(""); + }; const [dryText, setDryText] = useState(""); @@ -68,7 +79,7 @@ export default function ConfirmDialog() { value={dryText} onChange={(e) => setDryText(e.target.value)} autoFocus - label={`Type ${confirmationCommand} below to continue:`} + label={`Type “${confirmationCommand}” below to continue:`} placeholder={confirmationCommand} fullWidth id="dryText" From e64b8ad7136c1a414b178b3b9f133940c47c7e91 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Tue, 20 Sep 2022 15:22:01 +1000 Subject: [PATCH 113/309] ref field: fix crashing when invalid path is typed --- .../fields/Reference/EditorCell.tsx | 18 +++++++--- .../fields/Reference/SideDrawerField.tsx | 34 ++++++++++++++----- 2 files changed, 39 insertions(+), 13 deletions(-) diff --git a/src/components/fields/Reference/EditorCell.tsx b/src/components/fields/Reference/EditorCell.tsx index 824a8585..12c5e6b2 100644 --- a/src/components/fields/Reference/EditorCell.tsx +++ b/src/components/fields/Reference/EditorCell.tsx @@ -2,6 +2,7 @@ import { useRef, useLayoutEffect } from "react"; import { useAtom, useSetAtom } from "jotai"; import { EditorProps } from "react-data-grid"; import { get } from "lodash-es"; +import { useSnackbar } from "notistack"; import { TextField } from "@mui/material"; @@ -14,6 +15,7 @@ import { doc, deleteField } from "firebase/firestore"; export default function TextEditor({ row, column }: EditorProps) { const [firebaseDb] = useAtom(firebaseDbAtom, projectScope); const updateField = useSetAtom(updateFieldAtom, tableScope); + const { enqueueSnackbar } = useSnackbar(); const inputRef = useRef(null); @@ -23,11 +25,17 @@ export default function TextEditor({ row, column }: EditorProps) { return () => { const newValue = inputElement?.value; if (newValue !== undefined && newValue !== "") { - updateField({ - path: row._rowy_ref.path, - fieldName: column.key, - value: doc(firebaseDb, newValue), - }); + try { + const refValue = doc(firebaseDb, newValue); + + updateField({ + path: row._rowy_ref.path, + fieldName: column.key, + value: refValue, + }); + } catch (e: any) { + enqueueSnackbar(`Invalid path: ${e.message}`, { variant: "error" }); + } } else { updateField({ path: row._rowy_ref.path, diff --git a/src/components/fields/Reference/SideDrawerField.tsx b/src/components/fields/Reference/SideDrawerField.tsx index 2c13b345..677de82e 100644 --- a/src/components/fields/Reference/SideDrawerField.tsx +++ b/src/components/fields/Reference/SideDrawerField.tsx @@ -1,3 +1,4 @@ +import { useState } from "react"; import { useAtom } from "jotai"; import { doc } from "firebase/firestore"; import { ISideDrawerFieldProps } from "@src/components/fields/types"; @@ -19,20 +20,37 @@ export default function Reference({ const [projectId] = useAtom(projectIdAtom, projectScope); const [firebaseDb] = useAtom(firebaseDbAtom, projectScope); - const transformedValue = + const [localValue, setLocalValue] = useState( Boolean(value) && "path" in value && typeof value.path === "string" ? value.path - : ""; + : "" + ); + const [error, setError] = useState(""); return ( - + onChange(doc(firebaseDb, e.target.value))} - onBlur={onSubmit} - value={transformedValue} + onChange={(e) => { + try { + doc(firebaseDb, e.target.value); + setError(""); + } catch (e: any) { + setError(e.message); + } + setLocalValue(e.target.value); + }} + onBlur={() => { + if (!error) { + onChange(doc(firebaseDb, localValue)); + onSubmit(); + } + }} + value={localValue} + error={Boolean(error)} + helperText={error} id={getFieldId(column.key)} label="" hiddenLabel @@ -41,14 +59,14 @@ export default function Reference({ From 422aebdfba8584e7029aeabf4ce9e2efffe597c2 Mon Sep 17 00:00:00 2001 From: Bobby Wang Date: Wed, 21 Sep 2022 02:34:52 +0800 Subject: [PATCH 114/309] Fix the crash issue when pasting into action field input form --- src/components/fields/Action/Settings.tsx | 38 ++++++++++++----------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/src/components/fields/Action/Settings.tsx b/src/components/fields/Action/Settings.tsx index bf5fce43..3c5c26b8 100644 --- a/src/components/fields/Action/Settings.tsx +++ b/src/components/fields/Action/Settings.tsx @@ -88,7 +88,7 @@ const Settings = ({ config, onChange, fieldName }: ISettingsProps) => { Array.isArray(config.params) ? config.params : [], { space: 2 } ); - const [codeValid, setCodeValid] = useState(true); + const [codeErrorMessage, setCodeErrorMessage] = useState(null); const scriptExtraLibs = [ [ @@ -96,14 +96,16 @@ const Settings = ({ config, onChange, fieldName }: ISettingsProps) => { " /**", " * actionParams are provided by dialog popup form", " */", - (config.params ?? []).filter(Boolean).map((param: any) => { - const validationKeys = Object.keys(param.validation ?? {}); - if (validationKeys.includes("string")) { - return `static ${param.name}: string`; - } else if (validationKeys.includes("array")) { - return `static ${param.name}: any[]`; - } else return `static ${param.name}: any`; - }), + (Array.isArray(config.params) ? config.params : []) + .filter(Boolean) + .map((param: any) => { + const validationKeys = Object.keys(param.validation ?? {}); + if (validationKeys.includes("string")) { + return `static ${param.name}: string`; + } else if (validationKeys.includes("array")) { + return `static ${param.name}: any[]`; + } else return `static ${param.name}: any`; + }), "}", ].join("\n"), actionDefs, @@ -256,25 +258,25 @@ const Settings = ({ config, onChange, fieldName }: ISettingsProps) => { value={formattedParamsJson} onChange={(v) => { try { - if (v) { - const parsed = JSON.parse(v); + const parsed = JSON.parse(v ?? ""); + if (Array.isArray(parsed)) { onChange("params")(parsed); + setCodeErrorMessage(null); + } else { + setCodeErrorMessage("Form fields must be array"); } } catch (e) { console.log(`Failed to parse JSON: ${e}`); - setCodeValid(false); + setCodeErrorMessage("Invalid JSON"); } }} - onValidStatusUpdate={({ isValid }) => - setCodeValid(isValid) - } - error={!codeValid} + error={!!codeErrorMessage} />
    - {!codeValid && ( + {codeErrorMessage && ( - Invalid JSON + {codeErrorMessage} )} From 892a51ecd30ed504bb9b55543b28b1ea74218f5b Mon Sep 17 00:00:00 2001 From: Miriam Shams-Rainey Date: Wed, 21 Sep 2022 08:27:07 -0400 Subject: [PATCH 115/309] #513: Rating customization preview uses MUIRatings --- src/components/fields/Rating/Settings.tsx | 85 +++++++++++++---------- 1 file changed, 49 insertions(+), 36 deletions(-) diff --git a/src/components/fields/Rating/Settings.tsx b/src/components/fields/Rating/Settings.tsx index 6b3cf710..2904cccb 100644 --- a/src/components/fields/Rating/Settings.tsx +++ b/src/components/fields/Rating/Settings.tsx @@ -1,8 +1,9 @@ import { ISettingsProps } from "@src/components/fields/types"; import RatingIcon from "@mui/icons-material/Star"; -import { Slider, InputLabel, TextField, Grid, FormControlLabel, Checkbox, Stack, Fab } from "@mui/material"; +import { InputLabel, TextField, Grid, FormControlLabel, Checkbox, Stack } from "@mui/material"; import ToggleButton from "@mui/material/ToggleButton"; import ToggleButtonGroup from "@mui/material/ToggleButtonGroup"; +import MuiRating from "@mui/material/Rating"; import { get } from "lodash-es"; export default function Settings({ onChange, config }: ISettingsProps) { @@ -10,18 +11,20 @@ export default function Settings({ onChange, config }: ISettingsProps) { { - onChange("max")(parseInt(e.target.value)); + let input = parseInt(e.target.value) || 0 + if (input > 20) { input = 20 } + onChange("max")(input); }} - inputProps={{ min: 1, max: 20 }} /> - Star fraction + Rating fraction 1/4 @@ -42,38 +46,47 @@ export default function Settings({ onChange, config }: ISettingsProps) { - - onChange("customIcons.enabled")(e.target.checked) - } - name="customIcons.enabled" - /> - } - label="Customize button icons with emoji" - style={{ marginLeft: -11 }} - /> + + + onChange("customIcons.enabled")(e.target.checked) + } + name="customIcons.enabled" + /> + } + label="Customize ratings with emoji" + style={{ marginLeft: -11 }} + /> + {config.customIcons?.enabled && ( - - - - - onChange("customIcons.rating")(e.target.value) - } - label="Rating:" - className="labelHorizontal" - inputProps={{ style: { width: "3ch" } }} - /> - - {get(config, "customIcons.rating") || } - - - + + + + onChange("customIcons.rating")(e.target.value) + } + label="Custom icon preview:" + className="labelHorizontal" + inputProps={{ style: { width: "2ch" } }} + /> + + e.stopPropagation()} + icon={get(config, "customIcons.rating") || } + size="small" + emptyIcon={get(config, "customIcons.rating") || } + max={get(config, "max")} + precision={get(config, "precision")} + sx={{ pt: 0.5 }} + /> + + )} From 44b82cc2e255040e0440cf1a3e623791f098bd19 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Thu, 22 Sep 2022 13:38:22 +1000 Subject: [PATCH 116/309] Modal: use M3 FadeTransition --- src/components/ConfirmDialog.tsx | 4 ++-- src/components/Modal/Modal.tsx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/ConfirmDialog.tsx b/src/components/ConfirmDialog.tsx index e867dec0..5819b169 100644 --- a/src/components/ConfirmDialog.tsx +++ b/src/components/ConfirmDialog.tsx @@ -12,7 +12,7 @@ import { Button, } from "@mui/material"; -import { SlideTransitionMui } from "@src/components/Modal/SlideTransition"; +import { FadeTransitionMui } from "@src/components/Modal/FadeTransition"; import { projectScope, confirmDialogAtom } from "@src/atoms/projectScope"; export interface IConfirmDialogProps { @@ -63,7 +63,7 @@ export default function ConfirmDialog({ else handleClose(); }} maxWidth={maxWidth} - TransitionComponent={SlideTransitionMui} + TransitionComponent={FadeTransitionMui} sx={{ cursor: "default", zIndex: (theme) => theme.zIndex.modal + 50 }} > {title} diff --git a/src/components/Modal/Modal.tsx b/src/components/Modal/Modal.tsx index 475ae796..fa9a9baa 100644 --- a/src/components/Modal/Modal.tsx +++ b/src/components/Modal/Modal.tsx @@ -16,7 +16,7 @@ import { import LoadingButton, { LoadingButtonProps } from "@mui/lab/LoadingButton"; import CloseIcon from "@mui/icons-material/Close"; -import { SlideTransitionMui } from "./SlideTransition"; +import { FadeTransitionMui } from "./FadeTransition"; import ScrollableDialogContent, { IScrollableDialogContentProps, } from "./ScrollableDialogContent"; @@ -86,7 +86,7 @@ export default function Modal({ onClose={handleClose} fullWidth fullScreen={fullScreen} - TransitionComponent={fullScreen ? Slide : SlideTransitionMui} + TransitionComponent={fullScreen ? Slide : FadeTransitionMui} TransitionProps={fullScreen ? ({ direction: "up" } as any) : undefined} aria-labelledby="modal-title" {...props} From 3353978243d892036a80c06c0e816a7e32ea99c0 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Thu, 22 Sep 2022 13:38:29 +1000 Subject: [PATCH 117/309] upgrade jotai to latest --- package.json | 2 +- src/atoms/utils.ts | 3 +-- src/components/ConfirmDialog.tsx | 3 +-- src/hooks/useBeforeUnload.ts | 6 ++++-- src/hooks/useFirestoreCollectionWithAtom.ts | 3 +-- src/hooks/useFirestoreDocWithAtom.ts | 3 +-- src/hooks/useKeyPressWithAtom.ts | 5 ++--- src/layouts/RequireAuth.tsx | 12 +++++++++--- yarn.lock | 8 ++++---- 9 files changed, 24 insertions(+), 21 deletions(-) diff --git a/package.json b/package.json index f6e3055d..721396ac 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "file-saver": "^2.0.5", "firebase": "^9.6.11", "firebaseui": "^6.0.1", - "jotai": "^1.7.2", + "jotai": "^1.8.4", "json-stable-stringify-without-jsonify": "^1.0.1", "json2csv": "^5.0.7", "jszip": "^3.10.0", diff --git a/src/atoms/utils.ts b/src/atoms/utils.ts index 7903ca86..2c1458ab 100644 --- a/src/atoms/utils.ts +++ b/src/atoms/utils.ts @@ -1,8 +1,7 @@ -import { Scope } from "jotai/core/atom"; import { useAtomsDebugValue } from "jotai/devtools"; export function DebugAtoms( - options: { scope: Scope } & Parameters[0] + options: NonNullable[0]> ) { useAtomsDebugValue(options); return null; diff --git a/src/components/ConfirmDialog.tsx b/src/components/ConfirmDialog.tsx index 5819b169..ef2549f8 100644 --- a/src/components/ConfirmDialog.tsx +++ b/src/components/ConfirmDialog.tsx @@ -1,6 +1,5 @@ import { useState } from "react"; import { useAtom } from "jotai"; -import { Scope } from "jotai/core/atom"; import { Dialog, @@ -16,7 +15,7 @@ import { FadeTransitionMui } from "@src/components/Modal/FadeTransition"; import { projectScope, confirmDialogAtom } from "@src/atoms/projectScope"; export interface IConfirmDialogProps { - scope?: Scope; + scope?: Parameters[1]; } /** diff --git a/src/hooks/useBeforeUnload.ts b/src/hooks/useBeforeUnload.ts index 9a42ba66..98438a5f 100644 --- a/src/hooks/useBeforeUnload.ts +++ b/src/hooks/useBeforeUnload.ts @@ -1,6 +1,5 @@ import { useEffect } from "react"; import { useAtom, Atom } from "jotai"; -import { Scope } from "jotai/core/atom"; function beforeUnloadHandler(event: BeforeUnloadEvent) { event.preventDefault(); @@ -14,7 +13,10 @@ function beforeUnloadHandler(event: BeforeUnloadEvent) { * @param atom - The atom’s value to listen to * @param scope - The atom scope */ -export default function useBeforeUnload(atom: Atom, scope: Scope) { +export default function useBeforeUnload( + atom: Atom, + scope: NonNullable[1]> +) { const [atomValue] = useAtom(atom, scope); const atomValueFalsy = !atomValue; diff --git a/src/hooks/useFirestoreCollectionWithAtom.ts b/src/hooks/useFirestoreCollectionWithAtom.ts index 23bc2ce5..43f7165a 100644 --- a/src/hooks/useFirestoreCollectionWithAtom.ts +++ b/src/hooks/useFirestoreCollectionWithAtom.ts @@ -1,7 +1,6 @@ import { useState, useEffect } from "react"; import useMemoValue from "use-memo-value"; import { useAtom, PrimitiveAtom, useSetAtom, SetStateAction } from "jotai"; -import { Scope } from "jotai/core/atom"; import { set } from "lodash-es"; import { Firestore, @@ -77,7 +76,7 @@ interface IUseFirestoreCollectionWithAtomOptions { */ export function useFirestoreCollectionWithAtom( dataAtom: PrimitiveAtom, - dataScope: Scope | undefined, + dataScope: Parameters[1] | undefined, path: string | undefined, options?: IUseFirestoreCollectionWithAtomOptions ) { diff --git a/src/hooks/useFirestoreDocWithAtom.ts b/src/hooks/useFirestoreDocWithAtom.ts index e7691155..007061ac 100644 --- a/src/hooks/useFirestoreDocWithAtom.ts +++ b/src/hooks/useFirestoreDocWithAtom.ts @@ -1,7 +1,6 @@ import { useEffect } from "react"; import useMemoValue from "use-memo-value"; import { useAtom, PrimitiveAtom, useSetAtom } from "jotai"; -import { Scope } from "jotai/core/atom"; import { set } from "lodash-es"; import { Firestore, @@ -45,7 +44,7 @@ interface IUseFirestoreDocWithAtomOptions { */ export function useFirestoreDocWithAtom( dataAtom: PrimitiveAtom, - dataScope: Scope | undefined, + dataScope: Parameters[1] | undefined, path: string | undefined, options?: IUseFirestoreDocWithAtomOptions ) { diff --git a/src/hooks/useKeyPressWithAtom.ts b/src/hooks/useKeyPressWithAtom.ts index 78d23286..e51b1dd0 100644 --- a/src/hooks/useKeyPressWithAtom.ts +++ b/src/hooks/useKeyPressWithAtom.ts @@ -1,6 +1,5 @@ import { useEffect } from "react"; import { useSetAtom } from "jotai"; -import { PrimitiveAtom, Scope } from "jotai/core/atom"; /** * A hook that listens to when the target key is pressed @@ -11,8 +10,8 @@ import { PrimitiveAtom, Scope } from "jotai/core/atom"; */ export default function useKeyPressWithAtom( targetKey: string, - atom: PrimitiveAtom, - scope: Scope + atom: Parameters[0], + scope: Parameters[1] ) { const setAtom = useSetAtom(atom, scope); diff --git a/src/layouts/RequireAuth.tsx b/src/layouts/RequireAuth.tsx index f568b23a..bd5d7b09 100644 --- a/src/layouts/RequireAuth.tsx +++ b/src/layouts/RequireAuth.tsx @@ -1,4 +1,4 @@ -import { useAtom } from "jotai"; +import { useAtom, Atom } from "jotai"; import { useLocation, Navigate } from "react-router-dom"; import Loading from "@src/components/Loading"; @@ -8,10 +8,16 @@ import { ROUTES } from "@src/constants/routes"; export interface IRequireAuthProps { children: React.ReactElement; + atom?: Atom; + scope?: Parameters[1]; } -export default function RequireAuth({ children }: IRequireAuthProps) { - const [currentUser] = useAtom(currentUserAtom, projectScope); +export default function RequireAuth({ + children, + atom = currentUserAtom, + scope = projectScope, +}: IRequireAuthProps) { + const [currentUser] = useAtom(atom, scope); const location = useLocation(); if (currentUser === undefined) diff --git a/yarn.lock b/yarn.lock index 3dbe40a8..3e2592d4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8745,10 +8745,10 @@ jju@~1.4.0: resolved "https://registry.yarnpkg.com/jju/-/jju-1.4.0.tgz#a3abe2718af241a2b2904f84a625970f389ae32a" integrity sha1-o6vicYryQaKykE+EpiWXDzia4yo= -jotai@^1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/jotai/-/jotai-1.7.2.tgz#80587cf10f51a614c2028688e12d2abc6ac0b00c" - integrity sha512-ksvpW1Wu+/HwW1iDYq23PpXLu2df5Vv+eWw70jRAx7IEY4c+qRsORULnqPFurSy/X8LSoPcRhVDJx/cyf8jjMg== +jotai@^1.8.4: + version "1.8.4" + resolved "https://registry.yarnpkg.com/jotai/-/jotai-1.8.4.tgz#e188bff3cc790c758d25646f6f5daf9854c98eef" + integrity sha512-bkHDHNxm7bU4+bJL4z96fTlJYN34UDRTu3ghEajJrDepayON9YEaxPrXr7xhLnIRntoFC6eDYYhMNA/ilbj2RQ== js-base64@^2.4.3: version "2.6.4" From 67c2a3b6638fd69d88b15a435c4531dc8a5ca3ca Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Fri, 23 Sep 2022 11:53:00 +1000 Subject: [PATCH 118/309] ROWY-684: set table auditing to off by default --- src/components/TableSettingsDialog/form.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/TableSettingsDialog/form.tsx b/src/components/TableSettingsDialog/form.tsx index 11942034..d26e83d8 100644 --- a/src/components/TableSettingsDialog/form.tsx +++ b/src/components/TableSettingsDialog/form.tsx @@ -300,7 +300,7 @@ export const tableSettings = ( type: FieldType.checkbox, name: "audit", label: "Enable auditing for this table", - defaultValue: true, + defaultValue: false, }, { step: "auditing", From 0acca9d8599b71c7dc04e866a055d4b439d024e1 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Fri, 23 Sep 2022 12:05:36 +1000 Subject: [PATCH 119/309] useBasicSearch: stricter search criteria --- src/hooks/useBasicSearch.ts | 6 ++++-- src/pages/TablesPage.tsx | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/hooks/useBasicSearch.ts b/src/hooks/useBasicSearch.ts index cb61aebc..20c0ff48 100644 --- a/src/hooks/useBasicSearch.ts +++ b/src/hooks/useBasicSearch.ts @@ -1,6 +1,6 @@ import { useState } from "react"; import { useDebouncedCallback } from "use-debounce"; -import { matchSorter } from "match-sorter"; +import { matchSorter, rankings } from "match-sorter"; export function useBasicSearch( list: T[], @@ -10,7 +10,9 @@ export function useBasicSearch( const [query, setQuery] = useState(""); const handleQuery = useDebouncedCallback(setQuery, debounce); - const results = query ? matchSorter(list, query, { keys }) : list; + const results = query + ? matchSorter(list, query, { keys, threshold: rankings.ACRONYM }) + : list; return [results, query, handleQuery] as const; } diff --git a/src/pages/TablesPage.tsx b/src/pages/TablesPage.tsx index 4c914754..378f04a4 100644 --- a/src/pages/TablesPage.tsx +++ b/src/pages/TablesPage.tsx @@ -44,7 +44,7 @@ import { useScrollToHash } from "@src/hooks/useScrollToHash"; const SEARCH_KEYS = ["id", "name", "section", "description"]; -export default function HomePage() { +export default function TablesPage() { const [userRoles] = useAtom(userRolesAtom, projectScope); const [userSettings] = useAtom(userSettingsAtom, projectScope); const [updateUserSettings] = useAtom(updateUserSettingsAtom, projectScope); From c33484fbba4b3682d5f095faf26001e3e4ce94e8 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Fri, 23 Sep 2022 12:13:27 +1000 Subject: [PATCH 120/309] ROWY-647: fix import wizard suggesting URLs should be a phone number column --- src/components/TableModals/ImportExistingWizard/utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/TableModals/ImportExistingWizard/utils.ts b/src/components/TableModals/ImportExistingWizard/utils.ts index 98ec10e0..45750420 100644 --- a/src/components/TableModals/ImportExistingWizard/utils.ts +++ b/src/components/TableModals/ImportExistingWizard/utils.ts @@ -58,8 +58,8 @@ const inferTypeFromValue = (value: any) => { if (typeof value === "string") { if (REGEX_EMAIL.test(value)) return FieldType.email; - if (REGEX_PHONE.test(value)) return FieldType.phone; if (REGEX_URL.test(value)) return FieldType.url; + if (REGEX_PHONE.test(value)) return FieldType.phone; if (REGEX_HTML.test(value)) return FieldType.richText; if (value.length >= 50) return FieldType.longText; return FieldType.shortText; From 9aa2ad8540b0de735177b9d2b6a5b882ccb107d4 Mon Sep 17 00:00:00 2001 From: Bobby Wang Date: Mon, 26 Sep 2022 06:54:51 +0800 Subject: [PATCH 121/309] Add stripe webhook --- .../WebhooksModal/Schemas/basic.tsx | 9 -- .../WebhooksModal/Schemas/index.ts | 3 +- .../WebhooksModal/Schemas/stripe.tsx | 95 +++++++++++++++++++ .../TableModals/WebhooksModal/utils.tsx | 8 +- 4 files changed, 102 insertions(+), 13 deletions(-) create mode 100644 src/components/TableModals/WebhooksModal/Schemas/stripe.tsx diff --git a/src/components/TableModals/WebhooksModal/Schemas/basic.tsx b/src/components/TableModals/WebhooksModal/Schemas/basic.tsx index 616e6528..d9f81121 100644 --- a/src/components/TableModals/WebhooksModal/Schemas/basic.tsx +++ b/src/components/TableModals/WebhooksModal/Schemas/basic.tsx @@ -3,15 +3,6 @@ import WarningIcon from "@mui/icons-material/WarningAmber"; import { TableSettings } from "@src/types/table"; import { IWebhook } from "@src/components/TableModals/WebhooksModal/utils"; -export const webhookTypes = [ - "basic", - "typeform", - "sendgrid", - //"shopify", - //"twitter", - //"stripe", -] as const; - const requestType = [ "declare type WebHookRequest {", " /**", diff --git a/src/components/TableModals/WebhooksModal/Schemas/index.ts b/src/components/TableModals/WebhooksModal/Schemas/index.ts index 15ea2a1a..fff6341f 100644 --- a/src/components/TableModals/WebhooksModal/Schemas/index.ts +++ b/src/components/TableModals/WebhooksModal/Schemas/index.ts @@ -2,5 +2,6 @@ import basic from "./basic"; import typeform from "./typeform"; import sendgrid from "./sendgrid"; import webform from "./webform"; +import stripe from "./stripe"; -export { basic, typeform, sendgrid, webform }; +export { basic, typeform, sendgrid, webform, stripe }; diff --git a/src/components/TableModals/WebhooksModal/Schemas/stripe.tsx b/src/components/TableModals/WebhooksModal/Schemas/stripe.tsx new file mode 100644 index 00000000..77a78536 --- /dev/null +++ b/src/components/TableModals/WebhooksModal/Schemas/stripe.tsx @@ -0,0 +1,95 @@ +import { Typography, Link, TextField } from "@mui/material"; +import InlineOpenInNewIcon from "@src/components/InlineOpenInNewIcon"; +import { TableSettings } from "@src/types/table"; +import { IWebhook } from "@src/components/TableModals/WebhooksModal/utils"; + +export const webhookStripe = { + name: "Stripe", + parser: { + additionalVariables: null, + extraLibs: null, + template: ( + table: TableSettings + ) => `const sendgridParser: Parser = async ({ req, db, ref }) => { + const event = req.body + switch (event.type) { + case "payment_intent.succeeded": + break; + case "payment_intent.payment_failed": + break; + default: + // all other types + } +};`, + }, + condition: { + additionalVariables: null, + extraLibs: null, + template: ( + table: TableSettings + ) => `const condition: Condition = async({ref,req,db}) => { + // feel free to add your own code logic here + return true; +}`, + }, + auth: (webhookObject: IWebhook, setWebhookObject: (w: IWebhook) => void) => { + return ( + <> + + Get your{" "} + + secret key + + {" "} + and{" "} + + signing key + + {" "} + from Stripe dashboard. +
    + Then add the secret below. +
    + + { + setWebhookObject({ + ...webhookObject, + auth: { ...webhookObject.auth, secretKey: e.target.value }, + }); + }} + /> + { + setWebhookObject({ + ...webhookObject, + auth: { ...webhookObject.auth, signingSecret: e.target.value }, + }); + }} + /> + + ); + }, +}; + +export default webhookStripe; diff --git a/src/components/TableModals/WebhooksModal/utils.tsx b/src/components/TableModals/WebhooksModal/utils.tsx index db833809..c9cdccf1 100644 --- a/src/components/TableModals/WebhooksModal/utils.tsx +++ b/src/components/TableModals/WebhooksModal/utils.tsx @@ -1,6 +1,7 @@ import { TableSettings } from "@src/types/table"; import { generateId } from "@src/utils/table"; -import { typeform, basic, sendgrid, webform } from "./Schemas"; +import { typeform, basic, sendgrid, webform, stripe } from "./Schemas"; + export const webhookTypes = [ "basic", "typeform", @@ -8,7 +9,7 @@ export const webhookTypes = [ "webform", //"shopify", //"twitter", - //"stripe", + "stripe", ] as const; const requestType = [ @@ -53,7 +54,7 @@ export const webhookNames: Record = { //github:"GitHub", // shopify: "Shopify", // twitter: "Twitter", - // stripe: "Stripe", + stripe: "Stripe", basic: "Basic", webform: "Web form", }; @@ -82,6 +83,7 @@ export const webhookSchemas = { typeform, sendgrid, webform, + stripe, }; export function emptyWebhookObject( From 8a3632e4f99231cc6d701c4b68e4e6427422c672 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Mon, 26 Sep 2022 12:53:11 +1000 Subject: [PATCH 122/309] NavDrawer: update Help, Learning menus --- src/constants/externalLinks.ts | 6 ++ src/layouts/Navigation/NavDrawer/HelpMenu.tsx | 58 ++++++------- .../Navigation/NavDrawer/LearningMenu.tsx | 86 +++++++++++++++++++ .../Navigation/NavDrawer/NavDrawer.tsx | 21 ++++- 4 files changed, 136 insertions(+), 35 deletions(-) create mode 100644 src/layouts/Navigation/NavDrawer/LearningMenu.tsx diff --git a/src/constants/externalLinks.ts b/src/constants/externalLinks.ts index 84035a12..bf2f41ab 100644 --- a/src/constants/externalLinks.ts +++ b/src/constants/externalLinks.ts @@ -23,6 +23,9 @@ export const EXTERNAL_LINKS = { rowyAppHostName: "rowy.app", dateFormat: "https://date-fns.org/v2.24.0/docs/format", + + welcomeVideo: + "https://www.youtube.com/watch?v=rJWASZW2ivg&list=PLow2dGbF6XclrTSvW3ug1pRxbGwsIgcWJ&index=1", } as const; const WIKI_PATHS = { @@ -38,6 +41,9 @@ const WIKI_PATHS = { howToDefaultValues: "/how-to/default-values", howToCustomViews: "/how-to/custom-views", + faqs: "/category/faqs", + faqsAccess: "/faqs/access", + fieldTypesSupportedFields: "/field-types/supported-fields", fieldTypesDerivative: "/field-types/derivative", fieldTypesConnectTable: "/field-types/connect-table", diff --git a/src/layouts/Navigation/NavDrawer/HelpMenu.tsx b/src/layouts/Navigation/NavDrawer/HelpMenu.tsx index 5ec00f04..75b7a5d4 100644 --- a/src/layouts/Navigation/NavDrawer/HelpMenu.tsx +++ b/src/layouts/Navigation/NavDrawer/HelpMenu.tsx @@ -3,16 +3,15 @@ import { useEffect } from "react"; import { Menu, MenuProps, - ListSubheader, MenuItem, - ListItemIcon, ListItemSecondaryAction, Divider, + ListItem, + ListItemText, } from "@mui/material"; import InlineOpenInNewIcon from "@src/components/InlineOpenInNewIcon"; -import SocialLogo from "@src/components/SocialLogo"; -import { EXTERNAL_LINKS } from "@src/constants/externalLinks"; +import { EXTERNAL_LINKS, WIKI_LINKS } from "@src/constants/externalLinks"; import { logEvent, analytics } from "analytics"; export default function HelpMenu({ @@ -46,28 +45,9 @@ export default function HelpMenu({ id="help-menu" anchorOrigin={{ vertical: "bottom", horizontal: "right" }} transformOrigin={{ vertical: "bottom", horizontal: "left" }} - sx={{ "& .MuiPaper-root": { mt: 1.5, py: 1 } }} + sx={{ "& .MuiPaper-root": { mt: 1.5 } }} PaperProps={{ elevation: 12 }} > - - Get support - - - Reach out for help and find FAQs on GitHub Discussions - - - - - - GitHub Discussions + Get support {externalLinkIcon} - + + FAQs + {externalLinkIcon} + - - - - Feature request + Feature requests {externalLinkIcon} + + + + + + ); } diff --git a/src/layouts/Navigation/NavDrawer/LearningMenu.tsx b/src/layouts/Navigation/NavDrawer/LearningMenu.tsx new file mode 100644 index 00000000..7aa65d14 --- /dev/null +++ b/src/layouts/Navigation/NavDrawer/LearningMenu.tsx @@ -0,0 +1,86 @@ +import { useEffect } from "react"; +import { Link } from "react-router-dom"; + +import { + Menu, + MenuProps, + MenuItem, + ListItemSecondaryAction, +} from "@mui/material"; +import InlineOpenInNewIcon from "@src/components/InlineOpenInNewIcon"; +import { ChevronRight as ChevronRightIcon } from "@src/assets/icons"; + +import { EXTERNAL_LINKS, WIKI_LINKS } from "@src/constants/externalLinks"; +import { ROUTES } from "@src/constants/routes"; +import { logEvent, analytics } from "analytics"; + +export default function LearningMenu({ + anchorEl, + onClose, +}: Pick) { + const open = Boolean(anchorEl); + useEffect(() => { + if (open) logEvent(analytics, "open_learning_menu"); + }, [open]); + + const externalLinkIcon = ( + + + + ); + + return ( + + + How-to guides + {externalLinkIcon} + + + + Table tutorial + + + + + + + Video tutorials + {externalLinkIcon} + + + ); +} diff --git a/src/layouts/Navigation/NavDrawer/NavDrawer.tsx b/src/layouts/Navigation/NavDrawer/NavDrawer.tsx index 769a0667..118ab4c5 100644 --- a/src/layouts/Navigation/NavDrawer/NavDrawer.tsx +++ b/src/layouts/Navigation/NavDrawer/NavDrawer.tsx @@ -30,6 +30,7 @@ import { import Logo from "@src/assets/Logo"; import NavItem from "./NavItem"; import GetStartedProgress from "@src/components/GetStartedChecklist/GetStartedProgress"; +import LearningMenu from "./LearningMenu"; import CommunityMenu from "./CommunityMenu"; import HelpMenu from "./HelpMenu"; import { INavDrawerContentsProps } from "./NavDrawerContents"; @@ -73,6 +74,8 @@ export default function NavDrawer({ const [getStartedCompleted, getStartedCompletionCount] = useGetStartedCompletion(); + const [learningMenuAnchorEl, setLearningMenuAnchorEl] = + useState(null); const [communityMenuAnchorEl, setCommunityMenuAnchorEl] = useState(null); const [helpMenuAnchorEl, setHelpMenuAnchorEl] = @@ -300,13 +303,27 @@ export default function NavDrawer({
  • - + { + setLearningMenuAnchorEl(e.currentTarget); + setHover("persist"); + }} + > - {externalLinkIcon} + + + + { + setLearningMenuAnchorEl(null); + setHover(false); + }} + />
  • From d801c5ecc963aedd9953d698c93d5a23604d1859 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Mon, 26 Sep 2022 12:54:05 +1000 Subject: [PATCH 123/309] fix missing import --- src/layouts/Navigation/NavDrawer/HelpMenu.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/layouts/Navigation/NavDrawer/HelpMenu.tsx b/src/layouts/Navigation/NavDrawer/HelpMenu.tsx index 75b7a5d4..1ecdf03d 100644 --- a/src/layouts/Navigation/NavDrawer/HelpMenu.tsx +++ b/src/layouts/Navigation/NavDrawer/HelpMenu.tsx @@ -13,6 +13,7 @@ import InlineOpenInNewIcon from "@src/components/InlineOpenInNewIcon"; import { EXTERNAL_LINKS, WIKI_LINKS } from "@src/constants/externalLinks"; import { logEvent, analytics } from "analytics"; +import meta from "@root/package.json"; export default function HelpMenu({ anchorEl, From 83ee0e10a81606ff1cb48ccd543c8629850b9092 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Mon, 26 Sep 2022 16:22:21 +1000 Subject: [PATCH 124/309] show rowy run popup for connector and action fields --- src/components/fields/Action/Settings.tsx | 8 +++++++- src/components/fields/Connector/Settings.tsx | 17 ++++++++++++++--- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/components/fields/Action/Settings.tsx b/src/components/fields/Action/Settings.tsx index 3c5c26b8..bc762c82 100644 --- a/src/components/fields/Action/Settings.tsx +++ b/src/components/fields/Action/Settings.tsx @@ -1,4 +1,4 @@ -import { lazy, Suspense, useState } from "react"; +import { lazy, Suspense, useState, useEffect } from "react"; import { get } from "lodash-es"; import stringify from "json-stable-stringify-without-jsonify"; import { Link } from "react-router-dom"; @@ -37,6 +37,7 @@ import { projectRolesAtom, projectSettingsAtom, compatibleRowyRunVersionAtom, + rowyRunModalAtom, } from "@src/atoms/projectScope"; import { tableScope, tableColumnsOrderedAtom } from "@src/atoms/tableScope"; import { WIKI_LINKS } from "@src/constants/externalLinks"; @@ -68,6 +69,11 @@ const Settings = ({ config, onChange, fieldName }: ISettingsProps) => { ); const [tableColumnsOrdered] = useAtom(tableColumnsOrderedAtom, tableScope); + const openRowyRunModal = useSetAtom(rowyRunModalAtom, projectScope); + useEffect(() => { + if (!settings.rowyRunUrl) openRowyRunModal({ feature: "Action fields" }); + }, [settings.rowyRunUrl]); + // const [activeStep, setActiveStep] = useState< // "requirements" | "friction" | "action" | "undo" | "customization" // >("requirements"); diff --git a/src/components/fields/Connector/Settings.tsx b/src/components/fields/Connector/Settings.tsx index a2c77c57..36548d03 100644 --- a/src/components/fields/Connector/Settings.tsx +++ b/src/components/fields/Connector/Settings.tsx @@ -1,5 +1,5 @@ -import { lazy, Suspense, useState } from "react"; -import { get } from "lodash-es"; +import { lazy, Suspense, useEffect } from "react"; +import { useAtom, useSetAtom } from "jotai"; import { Grid, @@ -11,7 +11,6 @@ import { Link, } from "@mui/material"; -import SteppedAccordion from "@src/components/SteppedAccordion"; import FieldSkeleton from "@src/components/SideDrawer/FieldSkeleton"; import CodeEditorHelper from "@src/components/CodeEditor/CodeEditorHelper"; import InlineOpenInNewIcon from "@src/components/InlineOpenInNewIcon"; @@ -21,6 +20,11 @@ import connectorDefs from "!!raw-loader!./connector.d.ts"; import { WIKI_LINKS } from "@src/constants/externalLinks"; import { baseFunction } from "./utils"; import { ISettingsProps } from "@src/components/fields/types"; +import { + projectScope, + projectSettingsAtom, + rowyRunModalAtom, +} from "@src/atoms/projectScope"; //import typeDefs from "!!raw-loader!./types.d.ts"; const CodeEditor = lazy( @@ -46,6 +50,13 @@ const diagnosticsOptions = { }; export default function Settings({ config, onChange }: ISettingsProps) { + const [projectSettings] = useAtom(projectSettingsAtom, projectScope); + const openRowyRunModal = useSetAtom(rowyRunModalAtom, projectScope); + useEffect(() => { + if (!projectSettings.rowyRunUrl) + openRowyRunModal({ feature: "Connector fields" }); + }, [projectSettings.rowyRunUrl]); + return ( <>
    From ae77fb066493eda54e017ce6b4a80ce1ec6c082a Mon Sep 17 00:00:00 2001 From: rohitb Date: Wed, 21 Sep 2022 14:45:56 +0530 Subject: [PATCH 125/309] Copy Document Path to Clipboard --- src/components/SideDrawer/FieldWrapper.tsx | 29 ++++++++++++++++------ src/constants/externalLinks.ts | 1 + src/utils/ui.ts | 4 +++ 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src/components/SideDrawer/FieldWrapper.tsx b/src/components/SideDrawer/FieldWrapper.tsx index 620cf60d..d9214b84 100644 --- a/src/components/SideDrawer/FieldWrapper.tsx +++ b/src/components/SideDrawer/FieldWrapper.tsx @@ -11,6 +11,7 @@ import { } from "@mui/material"; import { DocumentPath as DocumentPathIcon } from "@src/assets/icons"; import LaunchIcon from "@mui/icons-material/Launch"; +import ContentCopyIcon from "@mui/icons-material/ContentCopy"; import LockIcon from "@mui/icons-material/LockOutlined"; import VisibilityOffIcon from "@mui/icons-material/VisibilityOffOutlined"; @@ -25,6 +26,9 @@ import { import { FieldType } from "@src/constants/fields"; import { getFieldProp } from "@src/components/fields"; import { getLabelId, getFieldId } from "./utils"; +import { EXTERNAL_LINKS } from "@src/constants/externalLinks"; +import { useSnackbar } from "notistack"; +import { copyToClipboard } from "@src/utils/ui"; export interface IFieldWrapperProps { children?: React.ReactNode; @@ -47,9 +51,15 @@ export default function FieldWrapper({ hidden, index, }: IFieldWrapperProps) { - const [projectId] = useAtom(projectIdAtom, projectScope); - const [altPress] = useAtom(altPressAtom, projectScope); - + const [projectId] = useAtom(projectIdAtom, globalScope); + const [altPress] = useAtom(altPressAtom, globalScope); + const { enqueueSnackbar } = useSnackbar(); + const documentPath = `${ + EXTERNAL_LINKS.firebaseProjectbasePath + }/${projectId}/firestore/data/~2F${(debugText as string)?.replace( + /\//g, + "~2F" + )}`; return (
    {debugText} - { + copyToClipboard(documentPath); + enqueueSnackbar("Copied!"); + }} + > + + + { export const spreadSx = (sx?: SxProps) => Array.isArray(sx) ? sx : sx ? [sx] : []; + +export const copyToClipboard = (text: string) => { + navigator.clipboard.writeText(text); +}; From c31b9e38c4f564128192968060abf96e1e8b57a6 Mon Sep 17 00:00:00 2001 From: rohitb Date: Mon, 26 Sep 2022 16:07:56 +0530 Subject: [PATCH 126/309] Fixed merge issue --- src/components/SideDrawer/FieldWrapper.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/SideDrawer/FieldWrapper.tsx b/src/components/SideDrawer/FieldWrapper.tsx index d9214b84..3ee90927 100644 --- a/src/components/SideDrawer/FieldWrapper.tsx +++ b/src/components/SideDrawer/FieldWrapper.tsx @@ -51,8 +51,8 @@ export default function FieldWrapper({ hidden, index, }: IFieldWrapperProps) { - const [projectId] = useAtom(projectIdAtom, globalScope); - const [altPress] = useAtom(altPressAtom, globalScope); + const [projectId] = useAtom(projectIdAtom, projectScope); + const [altPress] = useAtom(altPressAtom, projectScope); const { enqueueSnackbar } = useSnackbar(); const documentPath = `${ EXTERNAL_LINKS.firebaseProjectbasePath From 0cc440c3539e2d8482c6b38ac003e2f7d1041b6c Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Tue, 27 Sep 2022 16:17:44 +1000 Subject: [PATCH 127/309] lock settings routes to admin only --- src/App.tsx | 23 ++++++------- src/components/AccessDenied.tsx | 4 +-- src/components/CircularProgressTimed.tsx | 1 + src/layouts/AdminRoute.tsx | 44 ++++++++++++++++++++++++ 4 files changed, 58 insertions(+), 14 deletions(-) create mode 100644 src/layouts/AdminRoute.tsx diff --git a/src/App.tsx b/src/App.tsx index 97209c9e..2890beba 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -9,6 +9,7 @@ import ConfirmDialog from "@src/components/ConfirmDialog"; import RowyRunModal from "@src/components/RowyRunModal"; import NotFound from "@src/pages/NotFoundPage"; import RequireAuth from "@src/layouts/RequireAuth"; +import AdminRoute from "@src/layouts/AdminRoute"; import { projectScope, @@ -20,7 +21,6 @@ import { ROUTES } from "@src/constants/routes"; import useKeyPressWithAtom from "@src/hooks/useKeyPressWithAtom"; import TableGroupRedirectPage from "./pages/TableGroupRedirectPage"; -import JotaiTestPage from "@src/pages/Test/JotaiTestPage"; import SignOutPage from "@src/pages/Auth/SignOutPage"; // prettier-ignore @@ -60,10 +60,6 @@ const MembersPage = lazy(() => import("@src/pages/Settings/MembersPage" /* webpa // prettier-ignore const DebugSettingsPage = lazy(() => import("@src/pages/Settings/DebugSettingsPage" /* webpackChunkName: "DebugSettingsPage" */)); -// prettier-ignore -const ThemeTestPage = lazy(() => import("@src/pages/Test/ThemeTestPage" /* webpackChunkName: "ThemeTestPage" */)); -// const RowyRunTestPage = lazy(() => import("@src/pages/RowyRunTestPage" /* webpackChunkName: "RowyRunTestPage" */)); - export default function App() { const [currentUser] = useAtom(currentUserAtom, projectScope); const [userRoles] = useAtom(userRolesAtom, projectScope); @@ -150,19 +146,22 @@ export default function App() { } /> } + element={ + + + + } /> } /> } + element={ + + + + } /> - {/* } /> */} - - } /> - - } /> )} diff --git a/src/components/AccessDenied.tsx b/src/components/AccessDenied.tsx index 792e9af3..7d068602 100644 --- a/src/components/AccessDenied.tsx +++ b/src/components/AccessDenied.tsx @@ -11,7 +11,7 @@ import { Link as MuiLink, Button, } from "@mui/material"; -import SecurityIcon from "@mui/icons-material/SecurityOutlined"; +import LockIcon from "@mui/icons-material/LockOutlined"; import EmptyState from "@src/components/EmptyState"; @@ -33,7 +33,7 @@ export default function AccessDenied({ resetErrorBoundary }: FallbackProps) { diff --git a/src/components/CircularProgressTimed.tsx b/src/components/CircularProgressTimed.tsx index 12c62862..11959f37 100644 --- a/src/components/CircularProgressTimed.tsx +++ b/src/components/CircularProgressTimed.tsx @@ -7,6 +7,7 @@ import { Box } from "@mui/material"; export interface ICircularProgressTimedProps extends ICircularProgressOpticalProps { + /** Duration in seconds */ duration: number; complete: boolean; } diff --git a/src/layouts/AdminRoute.tsx b/src/layouts/AdminRoute.tsx new file mode 100644 index 00000000..79cf2bcf --- /dev/null +++ b/src/layouts/AdminRoute.tsx @@ -0,0 +1,44 @@ +import { PropsWithChildren } from "react"; +import { useAtom } from "jotai"; +import { Link } from "react-router-dom"; + +import { Typography, Button } from "@mui/material"; +import LockIcon from "@mui/icons-material/LockOutlined"; +import HomeIcon from "@mui/icons-material/HomeOutlined"; + +import EmptyState from "@src/components/EmptyState"; + +import { projectScope, userRolesAtom } from "@src/atoms/projectScope"; +import { ROUTES } from "@src/constants/routes"; +import { TOP_BAR_HEIGHT } from "@src/layouts/Navigation/TopBar"; + +/** + * Lock pages for admins only + */ +export default function AdminRoute({ children }: PropsWithChildren<{}>) { + const [userRoles] = useAtom(userRolesAtom, projectScope); + + if (!userRoles.includes("ADMIN")) + return ( + + + You must be an admin of this workspace to access this page. + + + + + } + style={{ marginTop: -TOP_BAR_HEIGHT, marginBottom: -TOP_BAR_HEIGHT }} + /> + ); + + return children as JSX.Element; +} From b2102fd88a33dce12f9dc12eac8e669edf6cfb26 Mon Sep 17 00:00:00 2001 From: shamsmosowi Date: Tue, 27 Sep 2022 17:31:02 +0200 Subject: [PATCH 128/309] fix confirmation label --- src/components/ColumnMenu/ColumnMenu.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/ColumnMenu/ColumnMenu.tsx b/src/components/ColumnMenu/ColumnMenu.tsx index 9a4886bd..4884a75a 100644 --- a/src/components/ColumnMenu/ColumnMenu.tsx +++ b/src/components/ColumnMenu/ColumnMenu.tsx @@ -329,6 +329,7 @@ export default function ColumnMenu() { ), handleConfirm: handleEvaluateAll, + confirm: "Evaluate", }), }, ]; From c5730d6abe4e29227a044f934407a8b051c0e981 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Wed, 28 Sep 2022 10:30:55 +1000 Subject: [PATCH 129/309] fix tables not loading from URL --- src/pages/Table/ProvidedTablePage.tsx | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/pages/Table/ProvidedTablePage.tsx b/src/pages/Table/ProvidedTablePage.tsx index 777b59e5..f609ac4c 100644 --- a/src/pages/Table/ProvidedTablePage.tsx +++ b/src/pages/Table/ProvidedTablePage.tsx @@ -3,7 +3,7 @@ import { useAtom, Provider } from "jotai"; import { DebugAtoms } from "@src/atoms/utils"; import { useParams, useOutlet } from "react-router-dom"; import { ErrorBoundary } from "react-error-boundary"; -import { find } from "lodash-es"; +import { find, isEmpty } from "lodash-es"; import ErrorFallback, { ERROR_TABLE_NOT_FOUND, @@ -16,6 +16,7 @@ import TableSkeleton from "@src/components/Table/TableSkeleton"; import { projectScope, currentUserAtom, + projectSettingsAtom, tablesAtom, } from "@src/atoms/projectScope"; import { @@ -32,10 +33,22 @@ export default function ProvidedTablePage() { const { id } = useParams(); const outlet = useOutlet(); const [currentUser] = useAtom(currentUserAtom, projectScope); + const [projectSettings] = useAtom(projectSettingsAtom, projectScope); const [tables] = useAtom(tablesAtom, projectScope); const tableSettings = useMemo(() => find(tables, ["id", id]), [tables, id]); - if (!tableSettings) throw new Error(ERROR_TABLE_NOT_FOUND + ": " + id); + if (!tableSettings) { + if (isEmpty(projectSettings)) { + return ( + <> + + + + ); + } else { + throw new Error(ERROR_TABLE_NOT_FOUND + ": " + id); + } + } return ( From 7a5b181852709704780a683fbd667475c02439ea Mon Sep 17 00:00:00 2001 From: Miriam Shams-Rainey Date: Wed, 28 Sep 2022 13:11:08 -0400 Subject: [PATCH 130/309] #513: Using star icon outline for visibility --- src/components/fields/Rating/Settings.tsx | 3 ++- src/components/fields/Rating/SideDrawerField.tsx | 4 ++-- src/components/fields/Rating/TableCell.tsx | 9 +++++++-- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/components/fields/Rating/Settings.tsx b/src/components/fields/Rating/Settings.tsx index 2904cccb..6134b530 100644 --- a/src/components/fields/Rating/Settings.tsx +++ b/src/components/fields/Rating/Settings.tsx @@ -1,5 +1,6 @@ import { ISettingsProps } from "@src/components/fields/types"; import RatingIcon from "@mui/icons-material/Star"; +import RatingOutlineIcon from "@mui/icons-material/StarBorder" import { InputLabel, TextField, Grid, FormControlLabel, Checkbox, Stack } from "@mui/material"; import ToggleButton from "@mui/material/ToggleButton"; import ToggleButtonGroup from "@mui/material/ToggleButtonGroup"; @@ -80,7 +81,7 @@ export default function Settings({ onChange, config }: ISettingsProps) { onClick={(e) => e.stopPropagation()} icon={get(config, "customIcons.rating") || } size="small" - emptyIcon={get(config, "customIcons.rating") || } + emptyIcon={get(config, "customIcons.rating") || } max={get(config, "max")} precision={get(config, "precision")} sx={{ pt: 0.5 }} diff --git a/src/components/fields/Rating/SideDrawerField.tsx b/src/components/fields/Rating/SideDrawerField.tsx index 40e8a2bb..eb117dd4 100644 --- a/src/components/fields/Rating/SideDrawerField.tsx +++ b/src/components/fields/Rating/SideDrawerField.tsx @@ -3,7 +3,7 @@ import { ISideDrawerFieldProps } from "@src/components/fields/types"; import { Grid } from "@mui/material"; import { Rating as MuiRating } from "@mui/material"; import "@mui/lab"; -import { getStateIcon } from "./TableCell"; +import { getStateIcon, getStateOutline } from "./TableCell"; import { fieldSx } from "@src/components/SideDrawer/utils"; export default function Rating({ @@ -29,7 +29,7 @@ export default function Rating({ onSubmit(); }} icon={getStateIcon(column.config)} - emptyIcon={getStateIcon(column.config)} + emptyIcon={getStateOutline(column.config)} size="small" max={max} precision={precision} diff --git a/src/components/fields/Rating/TableCell.tsx b/src/components/fields/Rating/TableCell.tsx index f7640d59..2e7aee52 100644 --- a/src/components/fields/Rating/TableCell.tsx +++ b/src/components/fields/Rating/TableCell.tsx @@ -2,8 +2,8 @@ import { IHeavyCellProps } from "@src/components/fields/types"; import MuiRating from "@mui/material/Rating"; import RatingIcon from "@mui/icons-material/Star"; +import RatingOutlineIcon from "@mui/icons-material/StarBorder" import { get } from "lodash-es"; -import { MonitorSmall } from "mdi-material-ui"; export const getStateIcon = (config: any) => { @@ -12,6 +12,11 @@ export const getStateIcon = (config: any) => { return get(config, "customIcons.rating") || ; }; +export const getStateOutline = (config: any) => { + if (!get(config, "customIcons.enabled")) { return } + return get(config, "customIcons.rating") || ; +} + export default function Rating({ row, column, @@ -41,7 +46,7 @@ export default function Rating({ size="small" disabled={disabled} onChange={(_, newValue) => onSubmit(newValue)} - emptyIcon={getStateIcon(column.config)} + emptyIcon={getStateOutline(column.config)} max={max} precision={precision} sx={{ mx: -0.25 }} From 5c4f732e982e8abad1319f915f128fdc13dab35f Mon Sep 17 00:00:00 2001 From: shamsmosowi Date: Wed, 28 Sep 2022 23:25:25 +0100 Subject: [PATCH 131/309] change row and ref to be additional variable --- .../CodeEditor/CodeEditorHelper.tsx | 10 +-------- .../ColumnConfigModal/DefaultValueInput.tsx | 14 +++++++++++- .../ExtensionsModal/Step3Conditions.tsx | 8 +++++++ .../TableModals/ExtensionsModal/Step4Body.tsx | 8 +++++++ .../TableModals/WebhooksModal/Step3Parser.tsx | 4 ++++ src/components/fields/Action/Settings.tsx | 22 +++++++++++++++++-- src/components/fields/Connector/Settings.tsx | 11 +++++++++- src/components/fields/Derivative/Settings.tsx | 14 +++++++++++- 8 files changed, 77 insertions(+), 14 deletions(-) diff --git a/src/components/CodeEditor/CodeEditorHelper.tsx b/src/components/CodeEditor/CodeEditorHelper.tsx index 0b816c36..299c2134 100644 --- a/src/components/CodeEditor/CodeEditorHelper.tsx +++ b/src/components/CodeEditor/CodeEditorHelper.tsx @@ -22,18 +22,10 @@ export default function CodeEditorHelper({ const [projectId] = useAtom(projectIdAtom, projectScope); const availableVariables = [ - { - key: "row", - description: `row has the value of doc.data() it has type definitions using this table's schema, but you can access any field in the document.`, - }, { key: "db", description: `db object provides access to firestore database instance of this project. giving you access to any collection or document in this firestore instance`, }, - { - key: "ref", - description: `ref object that represents the reference to the current row in firestore db (ie: doc.ref).`, - }, { key: "auth", description: `auth provides access to a firebase auth instance, can be used to manage auth users or generate tokens.`, @@ -44,7 +36,7 @@ export default function CodeEditorHelper({ }, { key: "rowy", - description: `rowy provides a set of functions that are commonly used, such as easy access to GCP Secret Manager`, + description: `rowy provides a set of functions that are commonly used, such as easy file uploads & access to GCP Secret Manager`, }, ]; diff --git a/src/components/ColumnModals/ColumnConfigModal/DefaultValueInput.tsx b/src/components/ColumnModals/ColumnConfigModal/DefaultValueInput.tsx index 52ff712a..5213eb8a 100644 --- a/src/components/ColumnModals/ColumnConfigModal/DefaultValueInput.tsx +++ b/src/components/ColumnModals/ColumnConfigModal/DefaultValueInput.tsx @@ -204,7 +204,19 @@ export default function DefaultValueInput({ {column.config?.defaultValue?.type === "dynamic" && ( <> - + }> { @@ -530,7 +539,16 @@ const Settings = ({ config, onChange, fieldName }: ISettingsProps) => { diff --git a/src/components/fields/Connector/Settings.tsx b/src/components/fields/Connector/Settings.tsx index 36548d03..fc20de5a 100644 --- a/src/components/fields/Connector/Settings.tsx +++ b/src/components/fields/Connector/Settings.tsx @@ -72,7 +72,16 @@ export default function Settings({ config, onChange }: ISettingsProps) {
    diff --git a/src/components/fields/Derivative/Settings.tsx b/src/components/fields/Derivative/Settings.tsx index e084bc32..32ce65dc 100644 --- a/src/components/fields/Derivative/Settings.tsx +++ b/src/components/fields/Derivative/Settings.tsx @@ -135,7 +135,19 @@ export default function Settings({
    Derivative script - + }> Date: Thu, 29 Sep 2022 14:44:47 +1000 Subject: [PATCH 132/309] TablesPage: sort sections by name --- src/atoms/tableScope/table.ts | 2 +- src/pages/TablesPage.tsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/atoms/tableScope/table.ts b/src/atoms/tableScope/table.ts index 29bc400e..971601e6 100644 --- a/src/atoms/tableScope/table.ts +++ b/src/atoms/tableScope/table.ts @@ -1,6 +1,6 @@ import { atom } from "jotai"; import { atomWithReducer, atomWithHash } from "jotai/utils"; -import { uniqBy, findIndex, cloneDeep, unset, orderBy } from "lodash-es"; +import { findIndex, cloneDeep, unset, orderBy } from "lodash-es"; import { TableSettings, diff --git a/src/pages/TablesPage.tsx b/src/pages/TablesPage.tsx index 378f04a4..060e46e5 100644 --- a/src/pages/TablesPage.tsx +++ b/src/pages/TablesPage.tsx @@ -1,5 +1,5 @@ import { useAtom, useSetAtom } from "jotai"; -import { find, groupBy } from "lodash-es"; +import { find, groupBy, sortBy } from "lodash-es"; import { Container, @@ -67,7 +67,7 @@ export default function TablesPage() { : []; const sections: Record = { Favorites: favorites.map((id) => find(results, { id })) as TableSettings[], - ...groupBy(results, "section"), + ...groupBy(sortBy(results, ["section", "name"]), "section"), }; if (!Array.isArray(tables)) From 3b7c142a0c66bfe5a36fbf69d5dcbe035ae85dde Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Thu, 29 Sep 2022 14:45:02 +1000 Subject: [PATCH 133/309] auth redirect preserves location state --- src/layouts/RequireAuth.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/layouts/RequireAuth.tsx b/src/layouts/RequireAuth.tsx index bd5d7b09..ebe35e99 100644 --- a/src/layouts/RequireAuth.tsx +++ b/src/layouts/RequireAuth.tsx @@ -31,6 +31,7 @@ export default function RequireAuth({ ); From f136677ec85fb7bf75d897386f0af5b131146303 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Fri, 30 Sep 2022 13:16:32 +1000 Subject: [PATCH 134/309] Modal: add MemoizedText component --- src/components/Modal/MemoizedText.tsx | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/components/Modal/MemoizedText.tsx diff --git a/src/components/Modal/MemoizedText.tsx b/src/components/Modal/MemoizedText.tsx new file mode 100644 index 00000000..1b77485b --- /dev/null +++ b/src/components/Modal/MemoizedText.tsx @@ -0,0 +1,14 @@ +import { memo } from "react"; + +/** + * Used for global Modals that can have customizable text + * so that the default text doesn’t appear as the modal closes. + */ +const MemoizedText = memo( + function MemoizedTextComponent({ text }: { text: React.ReactNode }) { + return <>{text}; + }, + () => true +); + +export default MemoizedText; From 3bff1fbbd5374cc0e36ff766ff04f813039930f2 Mon Sep 17 00:00:00 2001 From: rohitb Date: Sun, 2 Oct 2022 22:59:14 +0530 Subject: [PATCH 135/309] Fixed review comments issue --- src/components/SideDrawer/FieldWrapper.tsx | 13 ++++--------- src/constants/externalLinks.ts | 1 - 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/components/SideDrawer/FieldWrapper.tsx b/src/components/SideDrawer/FieldWrapper.tsx index 3ee90927..ffedd66b 100644 --- a/src/components/SideDrawer/FieldWrapper.tsx +++ b/src/components/SideDrawer/FieldWrapper.tsx @@ -26,7 +26,6 @@ import { import { FieldType } from "@src/constants/fields"; import { getFieldProp } from "@src/components/fields"; import { getLabelId, getFieldId } from "./utils"; -import { EXTERNAL_LINKS } from "@src/constants/externalLinks"; import { useSnackbar } from "notistack"; import { copyToClipboard } from "@src/utils/ui"; @@ -54,12 +53,6 @@ export default function FieldWrapper({ const [projectId] = useAtom(projectIdAtom, projectScope); const [altPress] = useAtom(altPressAtom, projectScope); const { enqueueSnackbar } = useSnackbar(); - const documentPath = `${ - EXTERNAL_LINKS.firebaseProjectbasePath - }/${projectId}/firestore/data/~2F${(debugText as string)?.replace( - /\//g, - "~2F" - )}`; return (
    { - copyToClipboard(documentPath); + copyToClipboard((debugText as string).replace(/\//g, "~2F")); enqueueSnackbar("Copied!"); }} > Date: Mon, 3 Oct 2022 10:50:27 +1100 Subject: [PATCH 136/309] Remove replacement of `/` with `2F` in copy button --- src/components/SideDrawer/FieldWrapper.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/SideDrawer/FieldWrapper.tsx b/src/components/SideDrawer/FieldWrapper.tsx index ffedd66b..c6a352cd 100644 --- a/src/components/SideDrawer/FieldWrapper.tsx +++ b/src/components/SideDrawer/FieldWrapper.tsx @@ -131,7 +131,7 @@ export default function FieldWrapper({ { - copyToClipboard((debugText as string).replace(/\//g, "~2F")); + copyToClipboard(debugText as string); enqueueSnackbar("Copied!"); }} > From b346b892a018e7d94c4d4470b17d044f09a2de65 Mon Sep 17 00:00:00 2001 From: Miriam Shams-Rainey Date: Mon, 3 Oct 2022 01:25:28 -0400 Subject: [PATCH 137/309] #513: Added Customizable Icons for Ratings Field (#817) * Update README.md * #513: Added Customizable Icons for Ratings Field * #513: Customizable Rating Icons Side Drawer Also updated formatting of custom rating icons to match default star sz * #513: Rating customization preview uses MUIRatings * #513: Using star icon outline for visibility Co-authored-by: Harini Janakiraman --- src/components/fields/Rating/Settings.tsx | 127 ++++++++++++------ .../fields/Rating/SideDrawerField.tsx | 9 +- src/components/fields/Rating/TableCell.tsx | 20 ++- 3 files changed, 110 insertions(+), 46 deletions(-) diff --git a/src/components/fields/Rating/Settings.tsx b/src/components/fields/Rating/Settings.tsx index 5504bd08..6134b530 100644 --- a/src/components/fields/Rating/Settings.tsx +++ b/src/components/fields/Rating/Settings.tsx @@ -1,48 +1,95 @@ import { ISettingsProps } from "@src/components/fields/types"; - -import { Slider, InputLabel, TextField, Grid } from "@mui/material"; +import RatingIcon from "@mui/icons-material/Star"; +import RatingOutlineIcon from "@mui/icons-material/StarBorder" +import { InputLabel, TextField, Grid, FormControlLabel, Checkbox, Stack } from "@mui/material"; import ToggleButton from "@mui/material/ToggleButton"; import ToggleButtonGroup from "@mui/material/ToggleButtonGroup"; +import MuiRating from "@mui/material/Rating"; +import { get } from "lodash-es"; export default function Settings({ onChange, config }: ISettingsProps) { return ( - <> - - - { - onChange("max")(parseInt(e.target.value)); - }} - inputProps={{ min: 1, max: 20 }} - /> - - - Star fraction - { - onChange("precision")(value); - }} - aria-label="text alignment" - > - - 1/4 - - - 1/2 - - - 1 - - - + + + { + let input = parseInt(e.target.value) || 0 + if (input > 20) { input = 20 } + onChange("max")(input); + }} + /> - + + Rating fraction + { + onChange("precision")(value); + }} + aria-label="text alignment" + sx={{ pt: 0.5 }} + > + + 1/4 + + + 1/2 + + + 1 + + + + + + onChange("customIcons.enabled")(e.target.checked) + } + name="customIcons.enabled" + /> + } + label="Customize ratings with emoji" + style={{ marginLeft: -11 }} + /> + + {config.customIcons?.enabled && ( + + + + onChange("customIcons.rating")(e.target.value) + } + label="Custom icon preview:" + className="labelHorizontal" + inputProps={{ style: { width: "2ch" } }} + /> + + e.stopPropagation()} + icon={get(config, "customIcons.rating") || } + size="small" + emptyIcon={get(config, "customIcons.rating") || } + max={get(config, "max")} + precision={get(config, "precision")} + sx={{ pt: 0.5 }} + /> + + + + )} + ); -} +} \ No newline at end of file diff --git a/src/components/fields/Rating/SideDrawerField.tsx b/src/components/fields/Rating/SideDrawerField.tsx index d3e4ffcb..eb117dd4 100644 --- a/src/components/fields/Rating/SideDrawerField.tsx +++ b/src/components/fields/Rating/SideDrawerField.tsx @@ -3,9 +3,8 @@ import { ISideDrawerFieldProps } from "@src/components/fields/types"; import { Grid } from "@mui/material"; import { Rating as MuiRating } from "@mui/material"; import "@mui/lab"; -import StarBorderIcon from "@mui/icons-material/StarBorder"; - -import { fieldSx, getFieldId } from "@src/components/SideDrawer/utils"; +import { getStateIcon, getStateOutline } from "./TableCell"; +import { fieldSx } from "@src/components/SideDrawer/utils"; export default function Rating({ column, @@ -29,7 +28,9 @@ export default function Rating({ onChange(newValue); onSubmit(); }} - emptyIcon={} + icon={getStateIcon(column.config)} + emptyIcon={getStateOutline(column.config)} + size="small" max={max} precision={precision} sx={{ ml: -0.5 }} diff --git a/src/components/fields/Rating/TableCell.tsx b/src/components/fields/Rating/TableCell.tsx index 34da84cf..2e7aee52 100644 --- a/src/components/fields/Rating/TableCell.tsx +++ b/src/components/fields/Rating/TableCell.tsx @@ -1,7 +1,21 @@ import { IHeavyCellProps } from "@src/components/fields/types"; import MuiRating from "@mui/material/Rating"; -import StarBorderIcon from "@mui/icons-material/StarBorder"; +import RatingIcon from "@mui/icons-material/Star"; +import RatingOutlineIcon from "@mui/icons-material/StarBorder" +import { get } from "lodash-es"; + + +export const getStateIcon = (config: any) => { + // only use the config to get the custom rating icon if enabled via toggle + if (!get(config, "customIcons.enabled")) { return } + return get(config, "customIcons.rating") || ; +}; + +export const getStateOutline = (config: any) => { + if (!get(config, "customIcons.enabled")) { return } + return get(config, "customIcons.rating") || ; +} export default function Rating({ row, @@ -28,9 +42,11 @@ export default function Rating({ name={`${row.id}-${column.key}`} value={typeof value === "number" ? value : 0} onClick={(e) => e.stopPropagation()} + icon={getStateIcon(column.config)} + size="small" disabled={disabled} onChange={(_, newValue) => onSubmit(newValue)} - emptyIcon={} + emptyIcon={getStateOutline(column.config)} max={max} precision={precision} sx={{ mx: -0.25 }} From da81271ba797c8b04ae986023d6031b8b01758a2 Mon Sep 17 00:00:00 2001 From: Bobby Wang Date: Mon, 3 Oct 2022 16:27:46 +1100 Subject: [PATCH 138/309] fix code editor type declarations not found error for dynamic import --- src/components/CodeEditor/useMonacoCustomizations.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/components/CodeEditor/useMonacoCustomizations.ts b/src/components/CodeEditor/useMonacoCustomizations.ts index f16f621b..e6d55533 100644 --- a/src/components/CodeEditor/useMonacoCustomizations.ts +++ b/src/components/CodeEditor/useMonacoCustomizations.ts @@ -78,6 +78,8 @@ export default function useMonacoCustomizations({ try { monaco.languages.typescript.javascriptDefaults.setCompilerOptions({ + moduleResolution: + monaco.languages.typescript.ModuleResolutionKind.NodeJs, target: monaco.languages.typescript.ScriptTarget.ES2020, allowNonTsExtensions: true, }); @@ -125,6 +127,7 @@ export default function useMonacoCustomizations({ ...JSON.parse(stringifiedDiagnosticsOptions), diagnosticCodesToIgnore: [ 1323, // remove dynamic import error + 2307, // silence type declarations not found for dynamic import ], }); } catch (error) { From c158adb4dd154588d8f84c87ebea296cfc518c5d Mon Sep 17 00:00:00 2001 From: Raj Gaurav Maurya Date: Mon, 3 Oct 2022 11:10:31 +0530 Subject: [PATCH 139/309] Feat: Customization options added to long text field (#821) * Update README.md * Update config.yml * Feat: Customization options added to long text field Signed-off-by: Raj Gaurav Maurya * Bug:LongText working Signed-off-by: Raj Gaurav Maurya --- .github/ISSUE_TEMPLATE/config.yml | 6 ++-- src/components/fields/LongText/Filter.tsx | 12 ++++++++ src/components/fields/LongText/Settings.tsx | 31 +++++++++++++++++++++ src/components/fields/LongText/index.tsx | 8 +++++- src/components/fields/ShortText/index.tsx | 1 + 5 files changed, 54 insertions(+), 4 deletions(-) create mode 100644 src/components/fields/LongText/Filter.tsx create mode 100644 src/components/fields/LongText/Settings.tsx diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 35aaf69b..4aeb6a48 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,8 +1,8 @@ blank_issues_enabled: false contact_links: - - name: 🤔 Support & questions - url: https://discord.com/invite/fjBugmvzZP - about: Chat with us for live support on discord. + - name: 🤔 Need support / Q&A + url: https://github.com/rowyio/rowy/discussions/categories/support-q-a + about: Raise a support query on Github Discussion - name: 🙌 Want to join our team? url: https://www.rowy.io/jobs about: Get in touch to contribute & work with Rowy diff --git a/src/components/fields/LongText/Filter.tsx b/src/components/fields/LongText/Filter.tsx new file mode 100644 index 00000000..1fbbbdf7 --- /dev/null +++ b/src/components/fields/LongText/Filter.tsx @@ -0,0 +1,12 @@ +import { IFilterOperator } from "@src/components/fields/types"; + +export const filterOperators: IFilterOperator[] = [ + { + label: "equals", + value: "==", + }, + { + label: "not equals", + value: "!=", + }, +]; diff --git a/src/components/fields/LongText/Settings.tsx b/src/components/fields/LongText/Settings.tsx new file mode 100644 index 00000000..77cc58f9 --- /dev/null +++ b/src/components/fields/LongText/Settings.tsx @@ -0,0 +1,31 @@ +import { ISettingsProps } from "@src/components/fields/types"; +import { TextField } from "@mui/material"; + +export default function Settings({ onChange, config }: ISettingsProps) { + return ( + <> + { + if (e.target.value === "0") onChange("maxLength")(null); + else onChange("maxLength")(e.target.value); + }} + /> + { + if (e.target.value === "") onChange("validationRegex")(null); + else onChange("validationRegex")(e.target.value); + }} + /> + + ); +} diff --git a/src/components/fields/LongText/index.tsx b/src/components/fields/LongText/index.tsx index 2c501ce6..c4cec831 100644 --- a/src/components/fields/LongText/index.tsx +++ b/src/components/fields/LongText/index.tsx @@ -5,7 +5,8 @@ import withBasicCell from "@src/components/fields/_withTableCell/withBasicCell"; import LongTextIcon from "@mui/icons-material/Notes"; import BasicCell from "./BasicCell"; import TextEditor from "@src/components/Table/editors/TextEditor"; -import { filterOperators } from "@src/components/fields/ShortText/Filter"; + +import { filterOperators } from "./Filter"; import BasicContextMenuActions from "@src/components/fields/_BasicCell/BasicCellContextMenuActions"; const SideDrawerField = lazy( @@ -15,6 +16,10 @@ const SideDrawerField = lazy( ) ); +const Settings = lazy( + () => import("./Settings" /* webpackChunkName: "Settings-LongText" */) +); + export const config: IFieldConfig = { type: FieldType.longText, name: "Long Text", @@ -28,6 +33,7 @@ export const config: IFieldConfig = { TableCell: withBasicCell(BasicCell), TableEditor: TextEditor, SideDrawerField, + settings: Settings, filter: { operators: filterOperators, }, diff --git a/src/components/fields/ShortText/index.tsx b/src/components/fields/ShortText/index.tsx index aa288624..88ef7a20 100644 --- a/src/components/fields/ShortText/index.tsx +++ b/src/components/fields/ShortText/index.tsx @@ -15,6 +15,7 @@ const SideDrawerField = lazy( "./SideDrawerField" /* webpackChunkName: "SideDrawerField-ShortText" */ ) ); + const Settings = lazy( () => import("./Settings" /* webpackChunkName: "Settings-ShortText" */) ); From 5344d0c4085e5b5f0fbbe21d207ea8a02e739d04 Mon Sep 17 00:00:00 2001 From: shamsmosowi Date: Mon, 3 Oct 2022 07:58:06 +0200 Subject: [PATCH 140/309] remove max column width --- src/components/Table/Table.tsx | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/components/Table/Table.tsx b/src/components/Table/Table.tsx index cf3a3dff..73f910af 100644 --- a/src/components/Table/Table.tsx +++ b/src/components/Table/Table.tsx @@ -114,11 +114,7 @@ export default function Table({ tableSettings.readOnly && !userRoles.includes("ADMIN") ? false : column.editable ?? true, - width: (column.width as number) - ? (column.width as number) > MAX_COL_WIDTH - ? MAX_COL_WIDTH - : (column.width as number) - : DEFAULT_COL_WIDTH, + width: column.width ?? 100, })); if (userRoles.includes("ADMIN") || !tableSettings.readOnly) { From 46bf61c47b5ad69c577dfcb0b79e9b3156669d41 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Tue, 4 Oct 2022 16:11:11 +1100 Subject: [PATCH 141/309] =?UTF-8?q?fix=20bug=20where=20a=20row=20may=20not?= =?UTF-8?q?=20be=20deleted=20from=20the=20db=20if=20it=E2=80=99s=20in=20ro?= =?UTF-8?q?wsLocal?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/atoms/tableScope/rowActions.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/atoms/tableScope/rowActions.ts b/src/atoms/tableScope/rowActions.ts index f6d62f7d..add6af4f 100644 --- a/src/atoms/tableScope/rowActions.ts +++ b/src/atoms/tableScope/rowActions.ts @@ -213,7 +213,9 @@ export const deleteRowAtom = atom( find(tableRowsLocal, ["_rowy_ref.path", path]) ); if (isLocalRow) set(tableRowsLocalAtom, { type: "delete", path }); - else await deleteRowDb(path); + + // Always delete from db in case it exists + await deleteRowDb(path); if (auditChange) auditChange("DELETE_ROW", path); }; From 852f85e0017c51e4e19c2bbd7129233008362614 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Tue, 4 Oct 2022 17:09:47 +1100 Subject: [PATCH 142/309] fix bug where adding multiple rows with missing fields results in them having the same ID --- src/atoms/tableScope/rowActions.ts | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/atoms/tableScope/rowActions.ts b/src/atoms/tableScope/rowActions.ts index add6af4f..4ee3fe0f 100644 --- a/src/atoms/tableScope/rowActions.ts +++ b/src/atoms/tableScope/rowActions.ts @@ -15,7 +15,6 @@ import { tableColumnsOrderedAtom, tableFiltersAtom, tableRowsLocalAtom, - tableRowsDbAtom, tableRowsAtom, _updateRowDbAtom, _deleteRowDbAtom, @@ -62,7 +61,7 @@ export const addRowAtom = atom( const auditChange = get(auditChangeAtom); const tableFilters = get(tableFiltersAtom); const tableColumnsOrdered = get(tableColumnsOrderedAtom); - const tableRowsDb = get(tableRowsDbAtom); + const tableRows = get(tableRowsAtom); const _addSingleRowAndAudit = async (row: TableRow) => { // Store initial values to be written @@ -147,10 +146,19 @@ export const addRowAtom = atom( if (auditChange) auditChange("ADD_ROW", row._rowy_ref.path); }; + // Find the first row in order to be used to decrement ID + let firstInOrderRowId = tableRows[0]?._rowy_ref.id; + for (const row of tableRows) { + if (row._rowy_outOfOrder === false) { + firstInOrderRowId = row._rowy_ref.id; + break; + } + } + if (Array.isArray(row)) { const promises: Promise[] = []; - let lastId = tableRowsDb[0]?._rowy_ref.id; + let lastId = firstInOrderRowId; for (const r of row) { const id = setId === "random" @@ -175,7 +183,7 @@ export const addRowAtom = atom( setId === "random" ? generateId() : setId === "decrement" - ? decrementId(tableRowsDb[0]?._rowy_ref.id) + ? decrementId(firstInOrderRowId) : row._rowy_ref.id; const path = setId From a0ff25b983330c49796432f2021cbd521d752978 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Tue, 4 Oct 2022 17:15:17 +1100 Subject: [PATCH 143/309] Table: use DEFAULT_COL_WIDTH --- src/components/Table/Table.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Table/Table.tsx b/src/components/Table/Table.tsx index 73f910af..a05026b6 100644 --- a/src/components/Table/Table.tsx +++ b/src/components/Table/Table.tsx @@ -114,7 +114,7 @@ export default function Table({ tableSettings.readOnly && !userRoles.includes("ADMIN") ? false : column.editable ?? true, - width: column.width ?? 100, + width: column.width ?? DEFAULT_COL_WIDTH, })); if (userRoles.includes("ADMIN") || !tableSettings.readOnly) { From a1473cf58c3244188d5b65c30cd0dc2f69c883d1 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Tue, 4 Oct 2022 18:16:58 +1100 Subject: [PATCH 144/309] update addRow code for clarity --- src/atoms/tableScope/rowActions.ts | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/atoms/tableScope/rowActions.ts b/src/atoms/tableScope/rowActions.ts index 4ee3fe0f..37d1f9de 100644 --- a/src/atoms/tableScope/rowActions.ts +++ b/src/atoms/tableScope/rowActions.ts @@ -113,33 +113,33 @@ export const addRowAtom = atom( // Combine initial values with row values const rowValues = { ...initialValues, ...row }; - // Add to rowsLocal (i.e. display on top, out of order) if: - // - any required fields are missing - // (**not out of order if IDs are not decrementing**) + // Add to rowsLocal (display on top, out of order) if: // - deliberately out of order // - there are filters set and we couldn’t set the value of a field to // fit in the filtered query // - user did not set ID to decrement if ( - missingRequiredFields.length > 0 || row._rowy_outOfOrder === true || outOfOrderFilters.size > 0 || setId !== "decrement" ) { set(tableRowsLocalAtom, { type: "add", - row: { - ...rowValues, - _rowy_outOfOrder: - row._rowy_outOfOrder === true || - outOfOrderFilters.size > 0 || - setId !== "decrement", - }, + row: { ...rowValues, _rowy_outOfOrder: true }, + }); + } + + // Also add to rowsLocal if any required fields are missing + // (not out of order since those cases are handled above) + if (missingRequiredFields.length > 0) { + set(tableRowsLocalAtom, { + type: "add", + row: { ...rowValues, _rowy_outOfOrder: false }, }); } // Write to database if no required fields are missing - if (missingRequiredFields.length === 0) { + else { await updateRowDb(row._rowy_ref.path, omitRowyFields(rowValues)); } From 751fa29be91e4284995015332c8565a9355191d1 Mon Sep 17 00:00:00 2001 From: shamsmosowi Date: Tue, 4 Oct 2022 12:25:53 +0200 Subject: [PATCH 145/309] history snapshot make collectionId customizable --- src/components/TableModals/ExtensionsModal/utils.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/TableModals/ExtensionsModal/utils.ts b/src/components/TableModals/ExtensionsModal/utils.ts index e85bd207..117ef381 100644 --- a/src/components/TableModals/ExtensionsModal/utils.ts +++ b/src/components/TableModals/ExtensionsModal/utils.ts @@ -95,6 +95,7 @@ const extensionBodyTemplate = { return ({ trackedFields: [], // a list of string of column names + collectionId: "historySnapshots", // optionally change the sub-collection id of where the history snapshots are stored }) }`, algoliaIndex: `const extensionBody: AlgoliaIndexBody = async({row, db, change, ref}) => { From 433ee68c2c3aba0f588c5f0ee1673e95469f74fd Mon Sep 17 00:00:00 2001 From: shamsmosowi Date: Tue, 4 Oct 2022 12:26:43 +0200 Subject: [PATCH 146/309] prevent failed version request from crashing table view --- src/atoms/projectScope/rowyRun.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/atoms/projectScope/rowyRun.ts b/src/atoms/projectScope/rowyRun.ts index 1699be63..bc6d35cd 100644 --- a/src/atoms/projectScope/rowyRun.ts +++ b/src/atoms/projectScope/rowyRun.ts @@ -117,8 +117,13 @@ export const rowyRunAtom = atom((get) => { /** Store deployed Rowy Run version */ export const rowyRunVersionAtom = atom(async (get) => { const rowyRun = get(rowyRunAtom); - const response = await rowyRun({ route: runRoutes.version }); - return response.version as string | false; + try { + const response = await rowyRun({ route: runRoutes.version }); + return response.version as string | false; + } catch (e) { + console.log(e); + return false; + } }); /** From 3504ef5ddb311b700fafbce70cd82b6ad2cbd9bc Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Wed, 5 Oct 2022 11:50:08 +1100 Subject: [PATCH 147/309] search fields: update clear icon to match m3 --- src/theme/components.tsx | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/theme/components.tsx b/src/theme/components.tsx index fc941109..003a621f 100644 --- a/src/theme/components.tsx +++ b/src/theme/components.tsx @@ -384,6 +384,18 @@ export const components = (theme: Theme): ThemeOptions => { paddingRight: theme.spacing(1), }, }, + + "input[type='search']::-webkit-search-cancel-button": { + appearance: "none", + mask: `url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3e%3cpath d='M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm3.59-13L12 10.59 8.41 7 7 8.41 10.59 12 7 15.59 8.41 17 12 13.41 15.59 17 17 15.59 13.41 12 17 8.41z'/%3e%3c/svg%3e") no-repeat 50% 50%`, + backgroundColor: "currentColor", + opacity: 0.67, + + width: "1.5rem", + height: "1.5rem", + marginLeft: theme.spacing(0.5), + marginRight: 0, + }, }, }, }, From f48b49de87fbad8cc51840c48f9168765df66327 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Wed, 5 Oct 2022 11:53:31 +1100 Subject: [PATCH 148/309] NavDrawer: sort tables by section and name --- src/layouts/Navigation/NavDrawer/NavDrawerContents.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/layouts/Navigation/NavDrawer/NavDrawerContents.tsx b/src/layouts/Navigation/NavDrawer/NavDrawerContents.tsx index b32cfea0..dc758436 100644 --- a/src/layouts/Navigation/NavDrawer/NavDrawerContents.tsx +++ b/src/layouts/Navigation/NavDrawer/NavDrawerContents.tsx @@ -1,5 +1,5 @@ import { useAtom, useSetAtom } from "jotai"; -import { find, groupBy } from "lodash-es"; +import { find, groupBy, sortBy } from "lodash-es"; import { ListItemIcon, ListItemText, Divider } from "@mui/material"; import { Tables as TablesIcon } from "@src/assets/icons"; @@ -44,11 +44,11 @@ export default function NavDrawerContents({ const favorites = Array.isArray(userSettings.favoriteTables) ? userSettings.favoriteTables : []; - const sections = { + const sections: Record = { Favorites: favorites .map((id) => find(tables, { id })) .filter((x) => x !== undefined) as TableSettings[], - ...groupBy(tables, "section"), + ...groupBy(sortBy(tables, ["section", "name"]), "section"), }; return ( From 92c1fb5bf92e59e00e0937fc6808950cad46b9c4 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Mon, 19 Sep 2022 18:02:42 +1000 Subject: [PATCH 149/309] temp disable full screen dialog effect --- src/theme/colors.ts | 12 +++---- src/theme/components.tsx | 70 ++++++++++++++++++++-------------------- 2 files changed, 41 insertions(+), 41 deletions(-) diff --git a/src/theme/colors.ts b/src/theme/colors.ts index 2cf5e12d..0cbdede1 100644 --- a/src/theme/colors.ts +++ b/src/theme/colors.ts @@ -99,9 +99,9 @@ export const colorsLight = ( backgroundColor: colord({ l: 70, c: 5, h }) .alpha(0.6) .toHslString(), - ".MuiDialog-root:has(.MuiDialog-paperFullScreen) &": { - backgroundColor: "rgba(0, 0, 0, 0)", - }, + // ".MuiDialog-root:has(.MuiDialog-paperFullScreen) &": { + // backgroundColor: "rgba(0, 0, 0, 0)", + // }, }, invisible: { backgroundColor: "transparent" }, }, @@ -202,9 +202,9 @@ export const colorsDark = ( styleOverrides: { root: { backgroundColor: colord({ l: 0, c: 1, h }).alpha(0.6).toHslString(), - ".MuiDialog-root:has(.MuiDialog-paperFullScreen) &": { - backgroundColor: "rgba(0, 0, 0, 0)", - }, + // ".MuiDialog-root:has(.MuiDialog-paperFullScreen) &": { + // backgroundColor: "rgba(0, 0, 0, 0)", + // }, }, invisible: { backgroundColor: "transparent" }, }, diff --git a/src/theme/components.tsx b/src/theme/components.tsx index fc941109..752da0c1 100644 --- a/src/theme/components.tsx +++ b/src/theme/components.tsx @@ -81,22 +81,22 @@ export const components = (theme: Theme): ThemeOptions => { body: { cursor: "default" }, - "@supports selector(:has(a))": { - body: { - transition: "background-color 0s", - transitionDelay: theme.transitions.duration.leavingScreen + "ms", - }, + // "@supports selector(:has(a))": { + // body: { + // transition: "background-color 0s", + // transitionDelay: theme.transitions.duration.leavingScreen + "ms", + // }, - "#root": { - transformOrigin: `50% 0%`, - transition: theme.transitions.create([ - "transform", - "border-radius", - ]), - transitionDuration: `${theme.transitions.duration.leavingScreen}ms, 0s`, - transitionDelay: `0s, ${theme.transitions.duration.leavingScreen}ms`, - }, - }, + // "#root": { + // transformOrigin: `50% 0%`, + // transition: theme.transitions.create([ + // "transform", + // "border-radius", + // ]), + // transitionDuration: `${theme.transitions.duration.leavingScreen}ms, 0s`, + // transitionDelay: `0s, ${theme.transitions.duration.leavingScreen}ms`, + // }, + // }, "code, pre, pre.MuiTypography-root": { fontFamily: theme.typography.fontFamilyMono, @@ -279,28 +279,28 @@ export const components = (theme: Theme): ThemeOptions => { paddingRight: "env(safe-area-inset-right)", paddingBottom: "env(safe-area-inset-bottom)", - "body:has([data-open=true] &)": { - backgroundColor: theme.palette.common.black, - transitionDelay: "0s", + // "body:has([data-open=true] &)": { + // backgroundColor: theme.palette.common.black, + // transitionDelay: "0s", - "#root": { - borderRadius: (theme.shape.borderRadius as number) * 2, - overflow: "hidden", - filter: `grayscale(100%) contrast(${ - theme.palette.mode === "dark" ? "80" : "75" - }%)`, + // "#root": { + // borderRadius: (theme.shape.borderRadius as number) * 2, + // overflow: "hidden", + // filter: `grayscale(100%) contrast(${ + // theme.palette.mode === "dark" ? "80" : "75" + // }%)`, - transform: `scale(0.9)`, - transition: theme.transitions.create( - ["transform", "border-radius"], - { - easing: theme.transitions.easing.easeOut, - } - ), - transitionDuration: `${theme.transitions.duration.enteringScreen}ms, 0s`, - transitionDelay: "0s, 0s", - }, - }, + // transform: `scale(0.9)`, + // transition: theme.transitions.create( + // ["transform", "border-radius"], + // { + // easing: theme.transitions.easing.easeOut, + // } + // ), + // transitionDuration: `${theme.transitions.duration.enteringScreen}ms, 0s`, + // transitionDelay: "0s, 0s", + // }, + // }, }, }, }, From 01b248583fd80096742959f816aba982adfc3120 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Wed, 5 Oct 2022 12:33:12 +1100 Subject: [PATCH 150/309] tableRowsLocalReducer: use switch statement & ensure updated row is a cloned object --- src/atoms/tableScope/table.ts | 78 ++++++++++++++++++----------------- 1 file changed, 41 insertions(+), 37 deletions(-) diff --git a/src/atoms/tableScope/table.ts b/src/atoms/tableScope/table.ts index 971601e6..0018202f 100644 --- a/src/atoms/tableScope/table.ts +++ b/src/atoms/tableScope/table.ts @@ -102,49 +102,53 @@ const tableRowsLocalReducer = ( prev: TableRow[], action: TableRowsLocalAction ): TableRow[] => { - if (action.type === "set") { - return [...action.rows]; - } - if (action.type === "add") { - if (Array.isArray(action.row)) return [...action.row, ...prev]; - return [action.row, ...prev]; - } - if (action.type === "update") { - const index = findIndex(prev, ["_rowy_ref.path", action.path]); - if (index > -1) { - const updatedRows = [...prev]; - if (Array.isArray(action.deleteFields)) { + switch (action.type) { + case "set": + return [...action.rows]; + + case "add": + if (Array.isArray(action.row)) return [...action.row, ...prev]; + return [action.row, ...prev]; + + case "update": + const index = findIndex(prev, ["_rowy_ref.path", action.path]); + if (index > -1) { + const updatedRows = [...prev]; updatedRows[index] = cloneDeep(prev[index]); - for (const field of action.deleteFields) { - unset(updatedRows[index], field); + if (Array.isArray(action.deleteFields)) { + for (const field of action.deleteFields) { + unset(updatedRows[index], field); + } } + updatedRows[index] = updateRowData(updatedRows[index], action.row); + return updatedRows; } - updatedRows[index] = updateRowData(updatedRows[index], action.row); - return updatedRows; - } - // If not found, add to start - if (index === -1) - return [ - { - ...action.row, - _rowy_ref: { - path: action.path, - id: action.path.split("/").pop() || action.path, + // If not found, add to start + else { + return [ + { + ...action.row, + _rowy_ref: { + path: action.path, + id: action.path.split("/").pop() || action.path, + }, }, - }, - ...prev, - ]; - } - if (action.type === "delete") { - return prev.filter((row) => { - if (Array.isArray(action.path)) { - return !action.path.includes(row._rowy_ref.path); - } else { - return row._rowy_ref.path !== action.path; + ...prev, + ]; } - }); + + case "delete": + return prev.filter((row) => { + if (Array.isArray(action.path)) { + return !action.path.includes(row._rowy_ref.path); + } else { + return row._rowy_ref.path !== action.path; + } + }); + + default: + throw new Error("Invalid action"); } - throw new Error("Invalid action"); }; /** * Store rows that are out of order or not ready to be written to the db. From 18fe50e0da33adf90856dbb2fe5112476a01495f Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Wed, 5 Oct 2022 14:51:16 +1100 Subject: [PATCH 151/309] Duplicate row confirmation: don't use success color button --- src/components/Table/ContextMenu/MenuContents.tsx | 1 - src/components/Table/formatters/FinalColumn.tsx | 1 - 2 files changed, 2 deletions(-) diff --git a/src/components/Table/ContextMenu/MenuContents.tsx b/src/components/Table/ContextMenu/MenuContents.tsx index 52b2d3d3..60d58069 100644 --- a/src/components/Table/ContextMenu/MenuContents.tsx +++ b/src/components/Table/ContextMenu/MenuContents.tsx @@ -202,7 +202,6 @@ export default function MenuContents({ onClose }: IMenuContentsProps) { ), confirm: "Duplicate", - confirmColor: "success", handleConfirm: handleDuplicate, }); onClose(); diff --git a/src/components/Table/formatters/FinalColumn.tsx b/src/components/Table/formatters/FinalColumn.tsx index 73f1c7b1..84dd4563 100644 --- a/src/components/Table/formatters/FinalColumn.tsx +++ b/src/components/Table/formatters/FinalColumn.tsx @@ -66,7 +66,6 @@ export default function FinalColumn({ row }: FormatterProps) { ), confirm: "Duplicate", - confirmColor: "success", handleConfirm: handleDuplicate, }); } From 4f7f5e3d4f7276be4608cadaea0ff985adffa884 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Wed, 5 Oct 2022 16:38:08 +1100 Subject: [PATCH 152/309] Image: fix table cell always deleting last image --- src/components/fields/Image/TableCell.tsx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/components/fields/Image/TableCell.tsx b/src/components/fields/Image/TableCell.tsx index 84a44904..9455a059 100644 --- a/src/components/fields/Image/TableCell.tsx +++ b/src/components/fields/Image/TableCell.tsx @@ -126,9 +126,8 @@ export default function Image_({ [value] ); - const handleDelete = (ref: string) => () => { + const handleDelete = (index: number) => () => { const newValue = [...value]; - const index = findIndex(newValue, ["ref", ref]); const toBeDeleted = newValue.splice(index, 1); toBeDeleted.length && deleteUpload(toBeDeleted[0]); onSubmit(newValue); @@ -184,7 +183,7 @@ export default function Image_({ > {Array.isArray(value) && - value.map((file: FileValue) => ( + value.map((file: FileValue, i) => ( {disabled ? ( @@ -225,7 +224,7 @@ export default function Image_({ body: "This image cannot be recovered after", confirm: "Delete", confirmColor: "error", - handleConfirm: handleDelete(file.ref), + handleConfirm: handleDelete(i), }); }} > From d10f3f37b27798b5626f1ec26720cca0469c3b8f Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Thu, 6 Oct 2022 14:38:02 +1100 Subject: [PATCH 153/309] update import airtable UI for consistency --- src/components/Table/EmptyTable.tsx | 2 +- .../TableToolbar/ImportData/ImportData.tsx | 4 +- .../ImportData/ImportFromAirtable.tsx | 147 ++++++++++-------- 3 files changed, 85 insertions(+), 68 deletions(-) diff --git a/src/components/Table/EmptyTable.tsx b/src/components/Table/EmptyTable.tsx index bb6d2e86..726f62f9 100644 --- a/src/components/Table/EmptyTable.tsx +++ b/src/components/Table/EmptyTable.tsx @@ -83,7 +83,7 @@ export default function EmptyTable() { startIcon={} onClick={onClick} > - Import Data + Import data )} PopoverProps={{ diff --git a/src/components/TableToolbar/ImportData/ImportData.tsx b/src/components/TableToolbar/ImportData/ImportData.tsx index d2743cf2..01b2aa4e 100644 --- a/src/components/TableToolbar/ImportData/ImportData.tsx +++ b/src/components/TableToolbar/ImportData/ImportData.tsx @@ -55,7 +55,7 @@ export default function ImportData({ render, PopoverProps }: IImportDataProps) { render(handleOpen) ) : ( } /> @@ -84,7 +84,7 @@ export default function ImportData({ render, PopoverProps }: IImportDataProps) { setTab(v)} - aria-label="Import Data method tabs" + aria-label="Import data method tabs" action={(actions) => setTimeout(() => actions?.updateIndicator(), 200) } diff --git a/src/components/TableToolbar/ImportData/ImportFromAirtable.tsx b/src/components/TableToolbar/ImportData/ImportFromAirtable.tsx index f5ed3aa9..60095363 100644 --- a/src/components/TableToolbar/ImportData/ImportFromAirtable.tsx +++ b/src/components/TableToolbar/ImportData/ImportFromAirtable.tsx @@ -4,11 +4,14 @@ import { useAtom, useSetAtom } from "jotai"; import { Button, Typography, - TextField, - IconButton, - Stack, + FormControl, InputLabel, + FilledInput, + FormHelperText, + Stack, } from "@mui/material"; +import LoadingButton from "@mui/lab/LoadingButton"; +import InlineOpenInNewIcon from "@src/components/InlineOpenInNewIcon"; import { tableModalAtom, @@ -19,7 +22,6 @@ import { analytics, logEvent } from "@src/analytics"; import { find } from "lodash-es"; import { WIKI_LINKS } from "@src/constants/externalLinks"; -import DocsIcon from "@mui/icons-material/ArrowUpward"; export default function ImportFromAirtable() { const [{ baseId, tableId, apiKey }, setImportAirtable] = useAtom( @@ -112,78 +114,93 @@ export default function ImportFromAirtable() { return ( <> - + Forget the storage limitations of Airtable. Migrate your app data from Airtable to a more scalable Firestore database that you can easily manage with Rowy. - - Airtable API Key - - API Key - - - } - placeholder="Insert your API key here" - value={apiKey} - onChange={(e) => - setImportAirtable((prev) => ({ - ...prev, - apiKey: e.currentTarget.value, - })) - } - helperText={error?.apiKey?.message} + margin="dense" error={!!error?.apiKey?.message} - /> - + + API key + + + + + setImportAirtable((prev) => ({ + ...prev, + apiKey: e.currentTarget.value, + })) + } + aria-describedby="import-airtable-api-key-error-text" + /> + + {error?.apiKey?.message} + + + + - Airtable Table URL - - Table URL - - - } - placeholder="Insert your Table URL here" - value={tableUrl} - onChange={(e) => { - setTableUrl(e.currentTarget.value); - }} - helperText={error?.baseId?.message || error?.tableId?.message} + margin="dense" error={!!error?.baseId?.message || error?.tableId?.message} - /> - + + + { + setTableUrl(e.currentTarget.value); + }} + aria-describedby="import-airtable-table-url-error-text" + /> + + {error?.baseId?.message || error?.tableId?.message} + + + + Continue - + ); } From f6d35991f938a536a0b633c6d5d20a03538debe0 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Thu, 6 Oct 2022 14:42:28 +1100 Subject: [PATCH 154/309] GetStartedChecklist: fix transition --- src/components/GetStartedChecklist/GetStartedChecklist.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/GetStartedChecklist/GetStartedChecklist.tsx b/src/components/GetStartedChecklist/GetStartedChecklist.tsx index 21ae6bbe..ad6ba46a 100644 --- a/src/components/GetStartedChecklist/GetStartedChecklist.tsx +++ b/src/components/GetStartedChecklist/GetStartedChecklist.tsx @@ -62,6 +62,7 @@ export default function GetStartedChecklist({ "& .MuiDialog-container": { justifyContent: "flex-start", alignItems: "flex-end", + transformOrigin: "0% calc(100% - 160px)", }, "& .MuiDialog-paper": { From f565cfceef59a7279a0570261bff5e383cc40a61 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Thu, 6 Oct 2022 15:15:28 +1100 Subject: [PATCH 155/309] fix ROWY-700 --- src/components/Table/Table.tsx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/components/Table/Table.tsx b/src/components/Table/Table.tsx index a05026b6..308e8767 100644 --- a/src/components/Table/Table.tsx +++ b/src/components/Table/Table.tsx @@ -176,9 +176,16 @@ export default function Table({ (event: React.UIEvent) => { // Select corresponding header cell when scrolled to prevent jumping dataGridRef?.current?.selectCell({ - idx: selectedColumnIndex || 0, + idx: + selectedColumnIndex > -1 ? selectedColumnIndex : columns.length - 1, rowIdx: -1, }); + // console.log( + // "scroll", + // dataGridRef?.current, + // selectedColumnIndex, + // columns.length + // ); const target = event.target as HTMLDivElement; From 5fcfb9956fa9dc9380954f06fbd61f3e93369661 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Thu, 6 Oct 2022 16:12:02 +1100 Subject: [PATCH 156/309] move types in src/atoms/projectScope to src/types/settings --- src/atoms/projectScope/project.ts | 38 ++--------- src/atoms/projectScope/user.ts | 37 +---------- .../Settings/UserManagement/UserItem.tsx | 2 +- src/types/settings.d.ts | 64 +++++++++++++++++++ 4 files changed, 72 insertions(+), 69 deletions(-) create mode 100644 src/types/settings.d.ts diff --git a/src/atoms/projectScope/project.ts b/src/atoms/projectScope/project.ts index 4295a897..9a5810cb 100644 --- a/src/atoms/projectScope/project.ts +++ b/src/atoms/projectScope/project.ts @@ -1,9 +1,12 @@ import { atom } from "jotai"; import { sortBy } from "lodash-es"; -import { ThemeOptions } from "@mui/material"; import { userRolesAtom } from "./auth"; -import { UserSettings } from "./user"; +import { + PublicSettings, + ProjectSettings, + UserSettings, +} from "@src/types/settings"; import { UpdateDocFunction, UpdateCollectionDocFunction, @@ -15,22 +18,6 @@ import { FunctionSettings } from "@src/types/function"; export const projectIdAtom = atom(""); -/** Public settings are visible to unauthenticated users */ -export type PublicSettings = Partial<{ - signInOptions: Array< - | "google" - | "twitter" - | "facebook" - | "github" - | "microsoft" - | "apple" - | "yahoo" - | "email" - | "phone" - | "anonymous" - >; - theme: Record<"base" | "light" | "dark", ThemeOptions>; -}>; /** Public settings are visible to unauthenticated users */ export const publicSettingsAtom = atom({}); /** Stores a function that updates public settings */ @@ -38,21 +25,6 @@ export const updatePublicSettingsAtom = atom< UpdateDocFunction | undefined >(undefined); -/** Project settings are visible to authenticated users */ -export type ProjectSettings = Partial<{ - tables: TableSettings[]; - - setupCompleted: boolean; - - rowyRunUrl: string; - rowyRunRegion: string; - rowyRunDeployStatus: "BUILDING" | "COMPLETE"; - services: Partial<{ - hooks: string; - builder: string; - terminal: string; - }>; -}>; /** Project settings are visible to authenticated users */ export const projectSettingsAtom = atom({}); /** diff --git a/src/atoms/projectScope/user.ts b/src/atoms/projectScope/user.ts index 4f8aad75..62bcc175 100644 --- a/src/atoms/projectScope/user.ts +++ b/src/atoms/projectScope/user.ts @@ -1,45 +1,12 @@ import { atom } from "jotai"; import { atomWithStorage } from "jotai/utils"; import { merge } from "lodash-es"; -import { ThemeOptions } from "@mui/material"; import themes from "@src/theme"; import { publicSettingsAtom } from "./project"; -import { - UpdateDocFunction, - TableFilter, - TableRowRef, - TableSort, -} from "@src/types/table"; +import { UserSettings } from "@src/types/settings"; +import { UpdateDocFunction } from "@src/types/table"; -/** User info and settings */ -export type UserSettings = Partial<{ - _rowy_ref: TableRowRef; - /** Synced from user auth info */ - user: { - email: string; - displayName?: string; - photoURL?: string; - phoneNumber?: string; - }; - roles: string[]; - - theme: Record<"base" | "light" | "dark", ThemeOptions>; - - favoriteTables: string[]; - /** Stores user overrides */ - tables: Record< - string, - Partial<{ - filters: TableFilter[]; - hiddenFields: string[]; - sorts: TableSort[]; - }> - >; - - /** Stores table tutorial completion */ - tableTutorialComplete?: boolean; -}>; /** User info and settings */ export const userSettingsAtom = atom({}); /** Stores a function that updates user settings */ diff --git a/src/components/Settings/UserManagement/UserItem.tsx b/src/components/Settings/UserManagement/UserItem.tsx index 4aab15e5..3b9d2701 100644 --- a/src/components/Settings/UserManagement/UserItem.tsx +++ b/src/components/Settings/UserManagement/UserItem.tsx @@ -23,12 +23,12 @@ import { projectSettingsAtom, rowyRunAtom, rowyRunModalAtom, - UserSettings, updateUserAtom, confirmDialogAtom, } from "@src/atoms/projectScope"; import { runRoutes } from "@src/constants/runRoutes"; import { USERS } from "@src/config/dbPaths"; +import type { UserSettings } from "@src/types/settings"; export default function UserItem({ _rowy_ref, diff --git a/src/types/settings.d.ts b/src/types/settings.d.ts new file mode 100644 index 00000000..0f3b5761 --- /dev/null +++ b/src/types/settings.d.ts @@ -0,0 +1,64 @@ +import { ThemeOptions } from "@mui/material"; +import { TableSettings, TableFilter, TableRowRef, TableSort } from "./table"; + +/** Public settings are visible to unauthenticated users */ +export type PublicSettings = Partial<{ + signInOptions: Array< + | "google" + | "twitter" + | "facebook" + | "github" + | "microsoft" + | "apple" + | "yahoo" + | "email" + | "phone" + | "anonymous" + >; + theme: Record<"base" | "light" | "dark", ThemeOptions>; +}>; + +/** Project settings are visible to authenticated users */ +export type ProjectSettings = Partial<{ + tables: TableSettings[]; + + setupCompleted: boolean; + + rowyRunUrl: string; + rowyRunRegion: string; + rowyRunDeployStatus: "BUILDING" | "COMPLETE"; + services: Partial<{ + hooks: string; + builder: string; + terminal: string; + }>; +}>; + +/** User info and settings */ +export type UserSettings = Partial<{ + _rowy_ref: TableRowRef; + /** Synced from user auth info */ + user: { + email: string; + displayName?: string; + photoURL?: string; + phoneNumber?: string; + }; + roles: string[]; + + theme: Record<"base" | "light" | "dark", ThemeOptions>; + + favoriteTables: string[]; + /** Stores user overrides */ + tables: Record< + string, + Partial<{ + filters: TableFilter[]; + hiddenFields: string[]; + sorts: TableSort[]; + }> + >; + + /** Stores table tutorial completion */ + tableTutorialComplete?: boolean; +}>; From a99a1d19c2b8e8cfdfd10ecdf98850ae01ff99e8 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Thu, 6 Oct 2022 17:21:58 +1100 Subject: [PATCH 157/309] add types to settings UI components --- .../Settings/ProjectSettings/Authentication.tsx | 14 +++++++++----- .../Settings/ProjectSettings/Customization.tsx | 12 ++++++++---- src/components/Settings/UserSettings/Account.tsx | 6 +++--- .../Settings/UserSettings/Personalization.tsx | 10 ++++++---- src/components/Settings/UserSettings/Theme.tsx | 4 +++- src/pages/Settings/DebugSettingsPage.tsx | 7 ------- src/pages/Settings/ProjectSettingsPage.tsx | 9 +++++---- src/pages/Settings/UserSettingsPage.tsx | 5 +++-- 8 files changed, 37 insertions(+), 30 deletions(-) diff --git a/src/components/Settings/ProjectSettings/Authentication.tsx b/src/components/Settings/ProjectSettings/Authentication.tsx index b55ad737..aceccee5 100644 --- a/src/components/Settings/ProjectSettings/Authentication.tsx +++ b/src/components/Settings/ProjectSettings/Authentication.tsx @@ -12,7 +12,9 @@ export default function Authentication({ publicSettings, updatePublicSettings, }: IProjectSettingsChildProps) { - const [signInOptions, setSignInOptions] = useState( + const [signInOptions, setSignInOptions] = useState< + NonNullable + >( Array.isArray(publicSettings?.signInOptions) ? publicSettings.signInOptions : ["google"] @@ -23,10 +25,12 @@ export default function Authentication({ ({ - value: option, - label: startCase(option).replace("Github", "GitHub"), - }))} + options={ + Object.keys(authOptions).map((option) => ({ + value: option, + label: startCase(option).replace("Github", "GitHub"), + })) as any + } onChange={setSignInOptions} onClose={() => updatePublicSettings({ signInOptions })} multiple diff --git a/src/components/Settings/ProjectSettings/Customization.tsx b/src/components/Settings/ProjectSettings/Customization.tsx index c6d61919..320586a8 100644 --- a/src/components/Settings/ProjectSettings/Customization.tsx +++ b/src/components/Settings/ProjectSettings/Customization.tsx @@ -13,8 +13,8 @@ export default function Customization({ updatePublicSettings, }: IProjectSettingsChildProps) { const [customizedThemeColor, setCustomizedThemeColor] = useState( - publicSettings.theme?.light?.palette?.primary?.main || - publicSettings.theme?.dark?.palette?.primary?.main + (publicSettings.theme?.light?.palette?.primary as any)?.main || + (publicSettings.theme?.dark?.palette?.primary as any)?.main ); const handleSave = ({ light, dark }: { light: string; dark: string }) => { @@ -50,8 +50,12 @@ export default function Customization({ }> diff --git a/src/components/Settings/UserSettings/Account.tsx b/src/components/Settings/UserSettings/Account.tsx index f5c5c744..57f49b73 100644 --- a/src/components/Settings/UserSettings/Account.tsx +++ b/src/components/Settings/UserSettings/Account.tsx @@ -9,19 +9,19 @@ export default function Account({ settings }: IUserSettingsChildProps) { return ( - + - {settings.user.displayName} + {settings.user?.displayName} - {settings.user.email} + {settings.user?.email} diff --git a/src/components/Settings/UserSettings/Personalization.tsx b/src/components/Settings/UserSettings/Personalization.tsx index 65542669..f2687b49 100644 --- a/src/components/Settings/UserSettings/Personalization.tsx +++ b/src/components/Settings/UserSettings/Personalization.tsx @@ -14,8 +14,8 @@ export default function Personalization({ }: IUserSettingsChildProps) { const [customizedThemeColor, setCustomizedThemeColor] = useState( Boolean( - settings.theme?.light?.palette?.primary?.main || - settings.theme?.dark?.palette?.primary?.main + (settings.theme?.light?.palette?.primary as any)?.main || + (settings.theme?.dark?.palette?.primary as any)?.main ) ); @@ -52,8 +52,10 @@ export default function Personalization({ }> diff --git a/src/components/Settings/UserSettings/Theme.tsx b/src/components/Settings/UserSettings/Theme.tsx index 6f6f1c83..e7f491b4 100644 --- a/src/components/Settings/UserSettings/Theme.tsx +++ b/src/components/Settings/UserSettings/Theme.tsx @@ -62,7 +62,9 @@ export default function Theme({ { updateSettings({ theme: merge(settings.theme, { diff --git a/src/pages/Settings/DebugSettingsPage.tsx b/src/pages/Settings/DebugSettingsPage.tsx index 45c2c77f..c5ad9025 100644 --- a/src/pages/Settings/DebugSettingsPage.tsx +++ b/src/pages/Settings/DebugSettingsPage.tsx @@ -23,13 +23,6 @@ import { USERS } from "@src/config/dbPaths"; import { getTableSchemaPath } from "@src/utils/table"; import { useScrollToHash } from "@src/hooks/useScrollToHash"; -export interface IProjectSettingsChildProps { - settings: Record; - updateSettings: (data: Record) => void; - publicSettings: Record; - updatePublicSettings: (data: Record) => void; -} - export default function DebugSettingsPage() { const [firebaseDb] = useAtom(firebaseDbAtom, projectScope); const [projectSettings] = useAtom(projectSettingsAtom, projectScope); diff --git a/src/pages/Settings/ProjectSettingsPage.tsx b/src/pages/Settings/ProjectSettingsPage.tsx index 96f0e93c..f468497e 100644 --- a/src/pages/Settings/ProjectSettingsPage.tsx +++ b/src/pages/Settings/ProjectSettingsPage.tsx @@ -19,12 +19,13 @@ import { updatePublicSettingsAtom, } from "@src/atoms/projectScope"; import { useScrollToHash } from "@src/hooks/useScrollToHash"; +import { ProjectSettings, PublicSettings } from "@src/types/settings"; export interface IProjectSettingsChildProps { - settings: Record; - updateSettings: (data: Record) => void; - publicSettings: Record; - updatePublicSettings: (data: Record) => void; + settings: ProjectSettings; + updateSettings: (data: Partial) => void; + publicSettings: PublicSettings; + updatePublicSettings: (data: Partial) => void; } export default function ProjectSettingsPage() { diff --git a/src/pages/Settings/UserSettingsPage.tsx b/src/pages/Settings/UserSettingsPage.tsx index be4d43ec..1981157f 100644 --- a/src/pages/Settings/UserSettingsPage.tsx +++ b/src/pages/Settings/UserSettingsPage.tsx @@ -18,10 +18,11 @@ import { updateUserSettingsAtom, } from "@src/atoms/projectScope"; import { useScrollToHash } from "@src/hooks/useScrollToHash"; +import { UserSettings } from "@src/types/settings"; export interface IUserSettingsChildProps { - settings: Record; - updateSettings: (data: Record) => void; + settings: UserSettings; + updateSettings: (data: Partial) => void; } export default function UserSettingsPage() { From cdba5d3bbffddf525ee3dc482c8572a2dc63b3be Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Fri, 7 Oct 2022 12:06:36 +1100 Subject: [PATCH 158/309] ROWY-707 update RowyRunModal copy --- src/components/Modal/MemoizedText.tsx | 6 +- src/components/RowyRunModal.tsx | 90 ++++++++++++++++++--------- 2 files changed, 63 insertions(+), 33 deletions(-) diff --git a/src/components/Modal/MemoizedText.tsx b/src/components/Modal/MemoizedText.tsx index 1b77485b..00ee07c6 100644 --- a/src/components/Modal/MemoizedText.tsx +++ b/src/components/Modal/MemoizedText.tsx @@ -1,12 +1,12 @@ -import { memo } from "react"; +import { memo, PropsWithChildren } from "react"; /** * Used for global Modals that can have customizable text * so that the default text doesn’t appear as the modal closes. */ const MemoizedText = memo( - function MemoizedTextComponent({ text }: { text: React.ReactNode }) { - return <>{text}; + function MemoizedTextComponent({ children }: PropsWithChildren<{}>) { + return <>{children}; }, () => true ); diff --git a/src/components/RowyRunModal.tsx b/src/components/RowyRunModal.tsx index 290fa931..5057968d 100644 --- a/src/components/RowyRunModal.tsx +++ b/src/components/RowyRunModal.tsx @@ -6,10 +6,12 @@ import { Button, DialogContentText, Link as MuiLink, + Box, } from "@mui/material"; +import CheckIcon from "@mui/icons-material/CheckCircle"; import Modal from "@src/components/Modal"; -import Logo from "@src/assets/LogoRowyRun"; +import MemoizedText from "@src/components/Modal/MemoizedText"; import InlineOpenInNewIcon from "@src/components/InlineOpenInNewIcon"; import { @@ -43,45 +45,73 @@ export default function RowyRunModal() { open={rowyRunModal.open} onClose={handleClose} title={ - + + {rowyRunModal.feature + ? `${ + showUpdateModal ? "Update" : "Set up" + } Cloud Functions to use ${rowyRunModal.feature}` + : `Your Cloud isn’t set up`} + } maxWidth="xs" body={ <> - - {showUpdateModal ? "Update" : "Set up"} Rowy Run to use{" "} - {rowyRunModal.feature || "this feature"} - - {showUpdateModal && ( - + {rowyRunModal.feature || "This feature"} requires Rowy Run v {rowyRunModal.version} or later. )} - - Rowy Run is a Cloud Run instance that provides backend - functionality, such as table action scripts, user management, and - easy Cloud Function deployment.{" "} - - Learn more - - + + Cloud Functions are free to use in our Base plan, you just need to + set a few things up first. Enable Cloud Functions for: + +
  • + + Derivative fields, Extensions, Webhooks +
  • +
  • + + Table and Action scripts +
  • +
  • + + Easy Cloud Function deployment +
  • + + + + Learn more + + + {!userRoles.includes("ADMIN") && ( @@ -102,7 +132,7 @@ export default function RowyRunModal() { color="error" sx={{ mt: 1 }} > - Contact the project owner to set up Rowy Run + Only admins can set up Cloud Functions )} From 12e0528ae639a9c32992947ceb5e92d534c9966d Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Fri, 7 Oct 2022 12:32:23 +1100 Subject: [PATCH 159/309] update modal styles & transition --- package.json | 2 +- src/components/ConfirmDialog.tsx | 2 - src/components/Modal/FadeTransition.tsx | 76 -------------------- src/components/Modal/Modal.tsx | 4 -- src/components/Modal/ModalTransition.tsx | 91 ++++++++++++++++++++++++ src/theme/components.tsx | 14 ++-- yarn.lock | 8 +-- 7 files changed, 102 insertions(+), 95 deletions(-) delete mode 100644 src/components/Modal/FadeTransition.tsx create mode 100644 src/components/Modal/ModalTransition.tsx diff --git a/package.json b/package.json index 721396ac..6f35de2b 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "@mui/material": "5.6.0", "@mui/styles": "5.6.0", "@mui/x-date-pickers": "^5.0.0-alpha.4", - "@rowy/form-builder": "^0.6.2", + "@rowy/form-builder": "^0.7.0", "@rowy/multiselect": "^0.4.0", "@tinymce/tinymce-react": "^3", "@uiw/react-md-editor": "^3.14.1", diff --git a/src/components/ConfirmDialog.tsx b/src/components/ConfirmDialog.tsx index ef2549f8..5bb298ef 100644 --- a/src/components/ConfirmDialog.tsx +++ b/src/components/ConfirmDialog.tsx @@ -11,7 +11,6 @@ import { Button, } from "@mui/material"; -import { FadeTransitionMui } from "@src/components/Modal/FadeTransition"; import { projectScope, confirmDialogAtom } from "@src/atoms/projectScope"; export interface IConfirmDialogProps { @@ -62,7 +61,6 @@ export default function ConfirmDialog({ else handleClose(); }} maxWidth={maxWidth} - TransitionComponent={FadeTransitionMui} sx={{ cursor: "default", zIndex: (theme) => theme.zIndex.modal + 50 }} > {title} diff --git a/src/components/Modal/FadeTransition.tsx b/src/components/Modal/FadeTransition.tsx deleted file mode 100644 index 48e4441d..00000000 --- a/src/components/Modal/FadeTransition.tsx +++ /dev/null @@ -1,76 +0,0 @@ -import { forwardRef, cloneElement } from "react"; -import { useTheme } from "@mui/material"; -import { Transition } from "react-transition-group"; -import { TransitionProps } from "react-transition-group/Transition"; -import { TransitionProps as MuiTransitionProps } from "@mui/material/transitions"; - -export const FadeTransition: React.ForwardRefExoticComponent< - Pick & React.RefAttributes -> = forwardRef( - ({ children, ...props }: TransitionProps, ref: React.Ref) => { - const theme = useTheme(); - - if (!children) return null; - - const defaultStyle = { - opacity: 0, - transform: "scale(0.8)", - - transition: theme.transitions.create(["transform", "opacity"], { - duration: "300ms", - easing: theme.transitions.easing.strong, - }), - }; - - const transitionStyles = { - entering: { - willChange: "transform, opacity", - }, - - entered: { - opacity: 1, - transform: "none", - }, - - exiting: { - opacity: 0, - transform: "scale(0.8)", - - transitionDuration: theme.transitions.duration.leavingScreen, - }, - - exited: { - opacity: 0, - transform: "none", - transition: "none", - }, - - unmounted: {}, - }; - - return ( - - {(state) => - cloneElement(children as any, { - style: { ...defaultStyle, ...transitionStyles[state] }, - tabIndex: -1, - ref, - }) - } - - ); - } -); - -export default FadeTransition; - -export const FadeTransitionMui = forwardRef(function Transition( - props: MuiTransitionProps & { children?: React.ReactElement }, - ref: React.Ref -) { - return ; -}); diff --git a/src/components/Modal/Modal.tsx b/src/components/Modal/Modal.tsx index fa9a9baa..7cf12cb5 100644 --- a/src/components/Modal/Modal.tsx +++ b/src/components/Modal/Modal.tsx @@ -11,12 +11,10 @@ import { DialogActions, Button, ButtonProps, - Slide, } from "@mui/material"; import LoadingButton, { LoadingButtonProps } from "@mui/lab/LoadingButton"; import CloseIcon from "@mui/icons-material/Close"; -import { FadeTransitionMui } from "./FadeTransition"; import ScrollableDialogContent, { IScrollableDialogContentProps, } from "./ScrollableDialogContent"; @@ -86,8 +84,6 @@ export default function Modal({ onClose={handleClose} fullWidth fullScreen={fullScreen} - TransitionComponent={fullScreen ? Slide : FadeTransitionMui} - TransitionProps={fullScreen ? ({ direction: "up" } as any) : undefined} aria-labelledby="modal-title" {...props} sx={ diff --git a/src/components/Modal/ModalTransition.tsx b/src/components/Modal/ModalTransition.tsx new file mode 100644 index 00000000..d79f590c --- /dev/null +++ b/src/components/Modal/ModalTransition.tsx @@ -0,0 +1,91 @@ +import { forwardRef, cloneElement } from "react"; +import { useTheme, Slide } from "@mui/material"; +import { Transition } from "react-transition-group"; +import { TransitionProps } from "react-transition-group/Transition"; +import { TransitionProps as MuiTransitionProps } from "@mui/material/transitions"; + +export const ModalTransition: React.ForwardRefExoticComponent< + Pick & React.RefAttributes +> = forwardRef(function ModalTransition( + { children, ...props }: TransitionProps, + ref: React.Ref +) { + const theme = useTheme(); + + if (!children) return null; + + const isFullScreenDialog = ( + Array.isArray(children) ? children[0] : children + ).props?.children?.props?.className?.includes("MuiDialog-paperFullScreen"); + + if (isFullScreenDialog) + return ( + + {children as any} + + ); + + const defaultStyle = { + opacity: 0, + transform: "scale(0.8)", + + transition: theme.transitions.create(["transform", "opacity"], { + duration: theme.transitions.duration.enteringScreen, + easing: theme.transitions.easing.strong, + }), + }; + + const transitionStyles = { + entering: { + willChange: "transform, opacity", + }, + + entered: { + opacity: 1, + transform: "none", + }, + + exiting: { + opacity: 0, + transform: "scale(0.8)", + + transitionDuration: theme.transitions.duration.leavingScreen, + }, + + exited: { + opacity: 0, + transform: "none", + transition: "none", + }, + + unmounted: {}, + }; + + return ( + + {(state) => + cloneElement(children as any, { + style: { ...defaultStyle, ...transitionStyles[state] }, + tabIndex: -1, + ref, + }) + } + + ); +}); + +export default ModalTransition; + +export const ModalTransitionMui = forwardRef(function Transition( + props: MuiTransitionProps & { children?: React.ReactElement }, + ref: React.Ref +) { + return ; +}); diff --git a/src/theme/components.tsx b/src/theme/components.tsx index c537dfb4..6c0770c1 100644 --- a/src/theme/components.tsx +++ b/src/theme/components.tsx @@ -4,6 +4,7 @@ import type {} from "@mui/lab/themeAugmentation"; import { MultiSelectProps } from "@rowy/multiselect"; import { toRem } from "./typography"; +import ModalTransition from "@src/components/Modal/ModalTransition"; import RadioIcon from "@src/theme/RadioIcon"; import CheckboxIcon from "@src/theme/CheckboxIcon"; import CheckboxIndeterminateIcon from "@src/theme/CheckboxIndeterminateIcon"; @@ -248,6 +249,9 @@ export const components = (theme: Theme): ThemeOptions => { }, MuiDialog: { + defaultProps: { + TransitionComponent: ModalTransition, + }, styleOverrides: { root: { "--dialog-title-height": "64px", @@ -307,14 +311,8 @@ export const components = (theme: Theme): ThemeOptions => { MuiDialogTitle: { styleOverrides: { root: { - padding: "var(--dialog-spacing)", - paddingTop: (64 - 28) / 2, - paddingBottom: (64 - 28) / 2, - - [theme.breakpoints.down("sm")]: { - paddingTop: (56 - 28) / 2, - paddingBottom: (56 - 28) / 2, - }, + ...(theme.typography.h5 as any), + padding: `calc((var(--dialog-title-height) - ${theme.typography.h5.lineHeight} * ${theme.typography.h5.fontSize}) / 2) var(--dialog-spacing)`, }, }, }, diff --git a/yarn.lock b/yarn.lock index 5861d12c..b3672bac 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3350,10 +3350,10 @@ estree-walker "^1.0.1" picomatch "^2.2.2" -"@rowy/form-builder@^0.6.2": - version "0.6.2" - resolved "https://registry.yarnpkg.com/@rowy/form-builder/-/form-builder-0.6.2.tgz#aa51c877525afc061f25d614e6526ff57193dd3a" - integrity sha512-Lr4CJk4zQpp8ae27umsuxkRf8zs6GQGGA26u/z6lFDIeM+wIr33IOsRjgx9XlNhrRHGEhfLdwX4okuQGv3MwOA== +"@rowy/form-builder@^0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@rowy/form-builder/-/form-builder-0.7.0.tgz#75c95d7114d0912a944f737a1c61b60b6cefa935" + integrity sha512-D5koLnPdcGuHCMWgiU0stLVK8Dvu+mKWJY+WSKNUsPtqCxuSeoi1RWTQEy+DYkQl2msVFWvxt4Ei1FlPTNwNsQ== dependencies: "@hookform/resolvers" "^2.6.0" "@types/lodash-es" "^4.17.6" From 58eec2e0ea18e244651a502ccab18ddb2de7d339 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Mon, 10 Oct 2022 12:46:04 +1100 Subject: [PATCH 160/309] LoadedRowsSearch: add icon & offline indicator --- package.json | 2 + .../TableToolbar/LoadedRowsStatus.tsx | 64 +++++++++++++++---- yarn.lock | 12 ++++ 3 files changed, 65 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index 6f35de2b..f0051f54 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,7 @@ "react-beautiful-dnd": "^13.1.0", "react-color-palette": "^6.2.0", "react-data-grid": "7.0.0-beta.5", + "react-detect-offline": "^2.4.5", "react-div-100vh": "^0.7.0", "react-dnd": "^16.0.1", "react-dnd-html5-backend": "^16.0.1", @@ -157,6 +158,7 @@ "@types/node": "^17.0.23", "@types/react": "^18.0.5", "@types/react-beautiful-dnd": "^13.1.2", + "@types/react-detect-offline": "^2.4.1", "@types/react-div-100vh": "^0.4.0", "@types/react-dom": "^18.0.0", "@types/react-router-dom": "^5.3.3", diff --git a/src/components/TableToolbar/LoadedRowsStatus.tsx b/src/components/TableToolbar/LoadedRowsStatus.tsx index 04f619bd..f27531d9 100644 --- a/src/components/TableToolbar/LoadedRowsStatus.tsx +++ b/src/components/TableToolbar/LoadedRowsStatus.tsx @@ -1,13 +1,17 @@ import { Suspense, forwardRef } from "react"; import { useAtom } from "jotai"; +import { Offline, Online } from "react-detect-offline"; import { Tooltip, Typography, TypographyProps } from "@mui/material"; +import SyncIcon from "@mui/icons-material/Sync"; +import OfflineIcon from "@mui/icons-material/CloudOffOutlined"; import { tableScope, tableRowsAtom, tableNextPageAtom, } from "@src/atoms/tableScope"; +import { spreadSx } from "@src/utils/ui"; const StatusText = forwardRef(function StatusText( props: TypographyProps, @@ -20,27 +24,48 @@ const StatusText = forwardRef(function StatusText( color="text.disabled" display="block" {...props} - style={{ userSelect: "none", ...props.style }} + sx={[ + { + userSelect: "none", + + "& svg": { + fontSize: 20, + width: "1em", + height: "1em", + verticalAlign: "bottom", + display: "inline-block", + mr: 0.75, + }, + }, + ...spreadSx(props.sx), + ]} /> ); }); +const loadingIcon = ( + +); + function LoadedRowsStatus() { const [tableRows] = useAtom(tableRowsAtom, tableScope); const [tableNextPage] = useAtom(tableNextPageAtom, tableScope); - if (tableNextPage.loading) return Loading more…; + if (tableNextPage.loading) + return {loadingIcon}Loading more…; return ( - + + Loaded {!tableNextPage.available && "all "} {tableRows.length} row{tableRows.length !== 1 && "s"} @@ -50,8 +75,21 @@ function LoadedRowsStatus() { export default function SuspendedLoadedRowsStatus() { return ( - Loading…}> - - + <> + + {loadingIcon}Loading…}> + + + + + + + + + Offline + + + + ); } diff --git a/yarn.lock b/yarn.lock index b3672bac..5bf216e0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4052,6 +4052,13 @@ dependencies: "@types/react" "*" +"@types/react-detect-offline@^2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@types/react-detect-offline/-/react-detect-offline-2.4.1.tgz#5a71625d3614a56a6c3dacc53c5e9baed0610de0" + integrity sha512-ympSl07fvDbu7+EsnhrKwDWkdOqHp22lukhJYIHxnTfSIzOh1T/K9NGmpwKUtgJaNCfllwLvMSXBlyC6nHEObw== + dependencies: + "@types/react" "*" + "@types/react-div-100vh@^0.4.0": version "0.4.0" resolved "https://registry.yarnpkg.com/@types/react-div-100vh/-/react-div-100vh-0.4.0.tgz#750e3ac45ee239ec2952089c1516f3b510bd103e" @@ -11362,6 +11369,11 @@ react-data-grid@7.0.0-beta.5: dependencies: clsx "^1.1.1" +react-detect-offline@^2.4.5: + version "2.4.5" + resolved "https://registry.yarnpkg.com/react-detect-offline/-/react-detect-offline-2.4.5.tgz#3c242516c37b6789cf89102881031f87e70b80e6" + integrity sha512-sI13NPEKl3uQp95FT5CwrYzH3DnXCwNP6TnY6NRF5gFDM4NU9KDlbtA6HG2dwhDVS0RYQGXwZW/mHbdf8fCnaw== + react-dev-utils@^12.0.0: version "12.0.0" resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-12.0.0.tgz#4eab12cdb95692a077616770b5988f0adf806526" From b585439f3e67d1d5780c6493c2ecf61282d40961 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Mon, 10 Oct 2022 13:21:54 +1100 Subject: [PATCH 161/309] support offline errors --- src/components/ErrorFallback.tsx | 102 ++++++++++++++++++------------- src/hooks/useOffline.ts | 19 ++++++ 2 files changed, 79 insertions(+), 42 deletions(-) create mode 100644 src/hooks/useOffline.ts diff --git a/src/components/ErrorFallback.tsx b/src/components/ErrorFallback.tsx index d1c541b5..1b6d0159 100644 --- a/src/components/ErrorFallback.tsx +++ b/src/components/ErrorFallback.tsx @@ -1,10 +1,12 @@ import { useState, useEffect } from "react"; import { FallbackProps } from "react-error-boundary"; import { useLocation, Link } from "react-router-dom"; +import useOffline from "@src/hooks/useOffline"; import { Typography, Button } from "@mui/material"; import ReloadIcon from "@mui/icons-material/Refresh"; import InlineOpenInNewIcon from "@src/components/InlineOpenInNewIcon"; +import OfflineIcon from "@mui/icons-material/CloudOff"; import { Tables as TablesIcon } from "@src/assets/icons"; import EmptyState, { IEmptyStateProps } from "@src/components/EmptyState"; @@ -22,6 +24,8 @@ export function ErrorFallbackContents({ resetErrorBoundary, ...props }: IErrorFallbackProps) { + const isOffline = useOffline(); + if ((error as any).code === "permission-denied") return ( @@ -53,51 +57,65 @@ export function ErrorFallbackContents({ }; if (error.message.startsWith(ERROR_TABLE_NOT_FOUND)) { - renderProps = { - message: ERROR_TABLE_NOT_FOUND, - description: ( - <> - - Make sure you have the right ID - - {error.message.replace(ERROR_TABLE_NOT_FOUND + ": ", "")} - - - ), - }; + if (isOffline) { + renderProps = { Icon: OfflineIcon, message: "You’re offline" }; + } else { + renderProps = { + message: ERROR_TABLE_NOT_FOUND, + description: ( + <> + + Make sure you have the right ID + + + {error.message.replace(ERROR_TABLE_NOT_FOUND + ": ", "")} + + + + ), + }; + } } if (error.message.startsWith("Loading chunk")) { - renderProps = { - Icon: ReloadIcon, - message: "New update available", - description: ( - <> - - Reload this page to get the latest update - - - - ), - }; + if (isOffline) { + renderProps = { Icon: OfflineIcon, message: "You’re offline" }; + } else { + renderProps = { + Icon: ReloadIcon, + message: "New update available", + description: ( + <> + + Reload this page to get the latest update + + + + ), + }; + } + } + + if (error.message.includes("Failed to fetch")) { + renderProps = { Icon: OfflineIcon, message: "You’re offline" }; } return ; diff --git a/src/hooks/useOffline.ts b/src/hooks/useOffline.ts new file mode 100644 index 00000000..f5f09ce3 --- /dev/null +++ b/src/hooks/useOffline.ts @@ -0,0 +1,19 @@ +import { useState, useEffect } from "react"; + +export default function useOffline() { + const [isOffline, setIsOffline] = useState(true); + const handleOffline = () => setIsOffline(true); + const handleOnline = () => setIsOffline(false); + + useEffect(() => { + window.addEventListener("offline", handleOffline); + window.addEventListener("online", handleOnline); + + return () => { + window.removeEventListener("offline", handleOffline); + window.removeEventListener("online", handleOnline); + }; + }, []); + + return isOffline; +} From 6be4377768562b96919d4a62ca3a1b814577cc51 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Mon, 10 Oct 2022 13:34:09 +1100 Subject: [PATCH 162/309] display offline indicator instead of empty table --- src/components/ErrorFallback.tsx | 43 +++++++++++++--------- src/components/Table/EmptyTable.tsx | 55 +++++++++++++++++++---------- 2 files changed, 64 insertions(+), 34 deletions(-) diff --git a/src/components/ErrorFallback.tsx b/src/components/ErrorFallback.tsx index 1b6d0159..ba3b8b97 100644 --- a/src/components/ErrorFallback.tsx +++ b/src/components/ErrorFallback.tsx @@ -93,29 +93,40 @@ export function ErrorFallbackContents({ } else { renderProps = { Icon: ReloadIcon, - message: "New update available", + message: "Update available", description: ( - <> - - Reload this page to get the latest update - - - + ), }; } } if (error.message.includes("Failed to fetch")) { - renderProps = { Icon: OfflineIcon, message: "You’re offline" }; + renderProps = { + Icon: OfflineIcon, + message: "You’re offline", + description: isOffline ? null : ( + + ), + }; } return ; diff --git a/src/components/Table/EmptyTable.tsx b/src/components/Table/EmptyTable.tsx index 726f62f9..b9b3fadc 100644 --- a/src/components/Table/EmptyTable.tsx +++ b/src/components/Table/EmptyTable.tsx @@ -1,9 +1,14 @@ import { useAtom, useSetAtom } from "jotai"; +import { Offline, Online } from "react-detect-offline"; import { Grid, Stack, Typography, Button, Divider } from "@mui/material"; -import { Import as ImportIcon } from "@src/assets/icons"; -import { AddColumn as AddColumnIcon } from "@src/assets/icons"; +import { + Import as ImportIcon, + AddColumn as AddColumnIcon, +} from "@src/assets/icons"; +import OfflineIcon from "@mui/icons-material/CloudOff"; +import EmptyState from "@src/components/EmptyState"; import ImportData from "@src/components/TableToolbar/ImportData/ImportData"; import { @@ -125,21 +130,35 @@ export default function EmptyTable() { } return ( - - {contents} - + <> + + + + + + + {contents} + + + ); } From d5ebe337b071313ab25e4a5bc59af83f6430e90f Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Tue, 11 Oct 2022 11:41:06 +1100 Subject: [PATCH 163/309] useFirestoreDocWithAtom: fix createIfNonExistent overwriting doc when offline --- src/hooks/useFirestoreDocWithAtom.ts | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/hooks/useFirestoreDocWithAtom.ts b/src/hooks/useFirestoreDocWithAtom.ts index 007061ac..c387a3bb 100644 --- a/src/hooks/useFirestoreDocWithAtom.ts +++ b/src/hooks/useFirestoreDocWithAtom.ts @@ -85,10 +85,17 @@ export function useFirestoreDocWithAtom( // Create a listener for the document const unsubscribe = onSnapshot( memoizedDocRef, + { includeMetadataChanges: true }, (docSnapshot) => { try { - // Create doc if it doesn’t exist - if (!docSnapshot.exists() && !!createIfNonExistent) { + // Create doc if it doesn’t exist and we’re online + // WARNING: If offline and we doc doesn’t exist in cache, it will + // ovewrite with default values when we go online + if ( + !docSnapshot.exists() && + !!createIfNonExistent && + !docSnapshot.metadata.fromCache + ) { setDoc(docSnapshot.ref, createIfNonExistent); setDataAtom({ ...createIfNonExistent, _rowy_ref: docSnapshot.ref }); } else { @@ -121,8 +128,6 @@ export function useFirestoreDocWithAtom( disableSuspense, createIfNonExistent, handleError, - updateDataAtom, - setUpdateDataAtom, ]); // Set updateDocAtom and deleteDocAtom values if they exist From 964f96a12544339c1d3925d0833f64d38f6a0a1f Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Tue, 11 Oct 2022 12:01:00 +1100 Subject: [PATCH 164/309] update debug page --- src/App.tsx | 12 +- src/constants/routes.tsx | 12 +- src/pages/Settings/DebugPage.tsx | 190 +++++++++++++++++++++++ src/pages/Settings/DebugSettingsPage.tsx | 142 ----------------- 4 files changed, 195 insertions(+), 161 deletions(-) create mode 100644 src/pages/Settings/DebugPage.tsx delete mode 100644 src/pages/Settings/DebugSettingsPage.tsx diff --git a/src/App.tsx b/src/App.tsx index 2890beba..79162f2d 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -58,7 +58,7 @@ const ProjectSettingsPage = lazy(() => import("@src/pages/Settings/ProjectSettin // prettier-ignore const MembersPage = lazy(() => import("@src/pages/Settings/MembersPage" /* webpackChunkName: "MembersPage" */)); // prettier-ignore -const DebugSettingsPage = lazy(() => import("@src/pages/Settings/DebugSettingsPage" /* webpackChunkName: "DebugSettingsPage" */)); +const DebugPage = lazy(() => import("@src/pages/Settings/DebugPage" /* webpackChunkName: "DebugPage" */)); export default function App() { const [currentUser] = useAtom(currentUserAtom, projectScope); @@ -153,14 +153,8 @@ export default function App() { } /> } /> - - - - } - /> + + } /> )} diff --git a/src/constants/routes.tsx b/src/constants/routes.tsx index 8e4ef19b..4b59b687 100644 --- a/src/constants/routes.tsx +++ b/src/constants/routes.tsx @@ -36,14 +36,10 @@ export enum ROUTES { userSettings = "/settings/user", projectSettings = "/settings/project", members = "/members", - debugSettings = "/settings/debug", + debug = "/debug", tutorial = "/tutorial", tableTutorial = "/tutorial/table", - - test = "/test", - themeTest = "/test/theme", - rowyRunTest = "/test/rowyRunTest", } export const ROUTE_TITLES = { @@ -66,7 +62,7 @@ export const ROUTE_TITLES = { [ROUTES.userSettings]: "Settings", [ROUTES.projectSettings]: "Project Settings", [ROUTES.members]: "Members", - [ROUTES.debugSettings]: "Debug", + [ROUTES.debug]: "Debug", [ROUTES.tutorial]: "Tutorial", [ROUTES.tableTutorial]: { @@ -79,10 +75,6 @@ export const ROUTE_TITLES = { titleTransitionProps: { style: { transformOrigin: "0 50%" } }, leftAligned: true, }, - - [ROUTES.test]: "Test", - [ROUTES.themeTest]: "Theme Test", - [ROUTES.rowyRunTest]: "Rowy Run Test", } as Record< ROUTES, | string diff --git a/src/pages/Settings/DebugPage.tsx b/src/pages/Settings/DebugPage.tsx new file mode 100644 index 00000000..d3ec7ad1 --- /dev/null +++ b/src/pages/Settings/DebugPage.tsx @@ -0,0 +1,190 @@ +import { useAtom } from "jotai"; +import { useSnackbar } from "notistack"; +import { + updateDoc, + doc, + terminate, + clearIndexedDbPersistence, +} from "firebase/firestore"; + +import { Container, Stack, Button } from "@mui/material"; +import InlineOpenInNewIcon from "@src/components/InlineOpenInNewIcon"; + +import SettingsSection from "@src/components/Settings/SettingsSection"; + +import { + projectScope, + projectIdAtom, + projectSettingsAtom, + userRolesAtom, + allUsersAtom, + updateUserAtom, +} from "@src/atoms/projectScope"; +import UserManagementSourceFirebase from "@src/sources/MembersSourceFirebase"; +import { firebaseDbAtom } from "@src/sources/ProjectSourceFirebase"; +import { CONFIG, TABLE_SCHEMAS, USERS } from "@src/config/dbPaths"; +import { getTableSchemaPath } from "@src/utils/table"; +import { useScrollToHash } from "@src/hooks/useScrollToHash"; + +export default function DebugPage() { + const [firebaseDb] = useAtom(firebaseDbAtom, projectScope); + const [projectId] = useAtom(projectIdAtom, projectScope); + const [projectSettings] = useAtom(projectSettingsAtom, projectScope); + const [userRoles] = useAtom(userRolesAtom, projectScope); + const [users] = useAtom(allUsersAtom, projectScope); + const [updateUser] = useAtom(updateUserAtom, projectScope); + const { enqueueSnackbar, closeSnackbar } = useSnackbar(); + useScrollToHash(); + + return ( + + {userRoles.includes("ADMIN") && } + + + + + + + + + + + {userRoles.includes("ADMIN") && ( + + + + + )} + + + + + + + ); +} diff --git a/src/pages/Settings/DebugSettingsPage.tsx b/src/pages/Settings/DebugSettingsPage.tsx deleted file mode 100644 index c5ad9025..00000000 --- a/src/pages/Settings/DebugSettingsPage.tsx +++ /dev/null @@ -1,142 +0,0 @@ -import { useAtom } from "jotai"; -import { useSnackbar } from "notistack"; -import { - updateDoc, - doc, - terminate, - clearIndexedDbPersistence, -} from "firebase/firestore"; - -import { Container, Stack, Button } from "@mui/material"; - -import SettingsSection from "@src/components/Settings/SettingsSection"; - -import { - projectScope, - projectSettingsAtom, - allUsersAtom, - updateUserAtom, -} from "@src/atoms/projectScope"; -import UserManagementSourceFirebase from "@src/sources/MembersSourceFirebase"; -import { firebaseDbAtom } from "@src/sources/ProjectSourceFirebase"; -import { USERS } from "@src/config/dbPaths"; -import { getTableSchemaPath } from "@src/utils/table"; -import { useScrollToHash } from "@src/hooks/useScrollToHash"; - -export default function DebugSettingsPage() { - const [firebaseDb] = useAtom(firebaseDbAtom, projectScope); - const [projectSettings] = useAtom(projectSettingsAtom, projectScope); - const [users] = useAtom(allUsersAtom, projectScope); - const [updateUser] = useAtom(updateUserAtom, projectScope); - const { enqueueSnackbar, closeSnackbar } = useSnackbar(); - useScrollToHash(); - - return ( - - - - - - - - - - - - - - - ); -} From b80c08a2f538df7c55d594052bb478d39cda9975 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Tue, 11 Oct 2022 12:18:46 +1100 Subject: [PATCH 165/309] fix table name not in tab name --- src/pages/Table/ProvidedTablePage.tsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/pages/Table/ProvidedTablePage.tsx b/src/pages/Table/ProvidedTablePage.tsx index f609ac4c..35a1c887 100644 --- a/src/pages/Table/ProvidedTablePage.tsx +++ b/src/pages/Table/ProvidedTablePage.tsx @@ -15,6 +15,7 @@ import TableSkeleton from "@src/components/Table/TableSkeleton"; import { projectScope, + projectIdAtom, currentUserAtom, projectSettingsAtom, tablesAtom, @@ -24,6 +25,7 @@ import { tableIdAtom, tableSettingsAtom, } from "@src/atoms/tableScope"; +import useDocumentTitle from "@src/hooks/useDocumentTitle"; /** * Wraps `TablePage` with the data for a top-level table. @@ -32,11 +34,14 @@ import { export default function ProvidedTablePage() { const { id } = useParams(); const outlet = useOutlet(); + const [projectId] = useAtom(projectIdAtom, projectScope); const [currentUser] = useAtom(currentUserAtom, projectScope); const [projectSettings] = useAtom(projectSettingsAtom, projectScope); const [tables] = useAtom(tablesAtom, projectScope); const tableSettings = useMemo(() => find(tables, ["id", id]), [tables, id]); + useDocumentTitle(projectId, tableSettings ? tableSettings.name : "Not found"); + if (!tableSettings) { if (isEmpty(projectSettings)) { return ( From c2d7bb6527deff0ccdc8de141d0a62ba5bac6cac Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Tue, 11 Oct 2022 13:01:28 +1100 Subject: [PATCH 166/309] fix menus appearing darker when appearing inside a dialog --- src/theme/components.tsx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/theme/components.tsx b/src/theme/components.tsx index 6c0770c1..4b4f9a0d 100644 --- a/src/theme/components.tsx +++ b/src/theme/components.tsx @@ -566,6 +566,13 @@ export const components = (theme: Theme): ThemeOptions => { MuiMenu: { styleOverrides: { + root: { + ".MuiDialog-root + & .MuiMenu-paper, form:has(.MuiDialog-root) + & .MuiMenu-paper, .MuiDialog-root & .MuiMenu-paper": + { + backgroundImage: + "linear-gradient(rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.2))", // elevation 50 + }, + }, list: { padding: theme.spacing(0.5, 0) }, }, }, From 63d5bc0d22a840ab911b8d7b8581fca205490ba9 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Tue, 11 Oct 2022 13:28:11 +1100 Subject: [PATCH 167/309] Table page: fix tableSettings not updating --- src/atoms/utils.ts | 27 +++++++++++++++++++++++++++ src/pages/Table/ProvidedTablePage.tsx | 11 +++++++++-- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/atoms/utils.ts b/src/atoms/utils.ts index 2c1458ab..609ad8a7 100644 --- a/src/atoms/utils.ts +++ b/src/atoms/utils.ts @@ -1,4 +1,8 @@ +import { useEffect } from "react"; +import { useSetAtom } from "jotai"; import { useAtomsDebugValue } from "jotai/devtools"; +import useMemoValue from "use-memo-value"; +import { isEqual } from "lodash-es"; export function DebugAtoms( options: NonNullable[0]> @@ -6,3 +10,26 @@ export function DebugAtoms( useAtomsDebugValue(options); return null; } + +/** + * Sets an atom’s value when the `value` prop changes. + * Useful when setting an atom’s initialValue and you want to keep it in sync. + */ +export function SyncAtomValue({ + atom, + scope, + value, +}: { + atom: Parameters[0]; + scope: Parameters[1]; + value: T; +}) { + const memoized = useMemoValue(value, isEqual); + const setAtom = useSetAtom(atom, scope); + + useEffect(() => { + setAtom(memoized); + }, [setAtom, memoized]); + + return null; +} diff --git a/src/pages/Table/ProvidedTablePage.tsx b/src/pages/Table/ProvidedTablePage.tsx index 35a1c887..d2e5cb17 100644 --- a/src/pages/Table/ProvidedTablePage.tsx +++ b/src/pages/Table/ProvidedTablePage.tsx @@ -1,4 +1,4 @@ -import { Suspense, useMemo } from "react"; +import { Suspense } from "react"; import { useAtom, Provider } from "jotai"; import { DebugAtoms } from "@src/atoms/utils"; import { useParams, useOutlet } from "react-router-dom"; @@ -25,6 +25,7 @@ import { tableIdAtom, tableSettingsAtom, } from "@src/atoms/tableScope"; +import { SyncAtomValue } from "@src/atoms/utils"; import useDocumentTitle from "@src/hooks/useDocumentTitle"; /** @@ -39,7 +40,7 @@ export default function ProvidedTablePage() { const [projectSettings] = useAtom(projectSettingsAtom, projectScope); const [tables] = useAtom(tablesAtom, projectScope); - const tableSettings = useMemo(() => find(tables, ["id", id]), [tables, id]); + const tableSettings = find(tables, ["id", id]); useDocumentTitle(projectId, tableSettings ? tableSettings.name : "Not found"); if (!tableSettings) { @@ -75,6 +76,12 @@ export default function ProvidedTablePage() { ]} > + + Date: Tue, 11 Oct 2022 13:29:02 +1100 Subject: [PATCH 168/309] fix "Something went wrong - t.roles is not iterable" #858 --- src/atoms/projectScope/project.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/atoms/projectScope/project.ts b/src/atoms/projectScope/project.ts index 9a5810cb..0d9518ac 100644 --- a/src/atoms/projectScope/project.ts +++ b/src/atoms/projectScope/project.ts @@ -46,10 +46,10 @@ export const tablesAtom = atom((get) => { const tables = get(projectSettingsAtom).tables || []; return sortBy(tables, "name") - .filter( - (table) => - userRoles.includes("ADMIN") || - table.roles.some((role) => userRoles.includes(role)) + .filter((table) => + userRoles.includes("ADMIN") || Array.isArray(table.roles) + ? table.roles.some((role) => userRoles.includes(role)) + : false ) .map((table) => ({ ...table, From 124baf10c949bb1c35ceccce017e94aa836043dc Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Tue, 11 Oct 2022 16:58:50 +1100 Subject: [PATCH 169/309] remove @mui/styles --- package.json | 1 - yarn.lock | 118 +-------------------------------------------------- 2 files changed, 1 insertion(+), 118 deletions(-) diff --git a/package.json b/package.json index f0051f54..63284107 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,6 @@ "@mui/icons-material": "5.6.0", "@mui/lab": "^5.0.0-alpha.76", "@mui/material": "5.6.0", - "@mui/styles": "5.6.0", "@mui/x-date-pickers": "^5.0.0-alpha.4", "@rowy/form-builder": "^0.7.0", "@rowy/multiselect": "^0.4.0", diff --git a/yarn.lock b/yarn.lock index 5bf216e0..b25db533 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1823,7 +1823,7 @@ core-js-pure "^3.20.2" regenerator-runtime "^0.13.4" -"@babel/runtime@^7.10.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": +"@babel/runtime@^7.10.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.9.tgz#d19fbf802d01a8cb6cf053a64e472d42c434ba72" integrity sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg== @@ -3064,29 +3064,6 @@ csstype "^3.1.0" prop-types "^15.8.1" -"@mui/styles@5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@mui/styles/-/styles-5.6.0.tgz#c57b80974ca31c980acdd58d13b21d46fbcd81cf" - integrity sha512-1rnQ/fDQ+EtBy3eo6VI1M7EkSjeEyB4NoTaetVUGMYv9tM7qkqnr6XN7TiuB2gtAsTDfdrAABrhmYrTTTf77cw== - dependencies: - "@babel/runtime" "^7.17.2" - "@emotion/hash" "^0.8.0" - "@mui/private-theming" "^5.6.0" - "@mui/types" "^7.1.3" - "@mui/utils" "^5.6.0" - clsx "^1.1.1" - csstype "^3.0.11" - hoist-non-react-statics "^3.3.2" - jss "^10.8.2" - jss-plugin-camel-case "^10.8.2" - jss-plugin-default-unit "^10.8.2" - jss-plugin-global "^10.8.2" - jss-plugin-nested "^10.8.2" - jss-plugin-props-sort "^10.8.2" - jss-plugin-rule-value-function "^10.8.2" - jss-plugin-vendor-prefixer "^10.8.2" - prop-types "^15.7.2" - "@mui/system@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.6.0.tgz#4d6db0db6a8daf90acd7fcaab3a353aa127987ce" @@ -5875,14 +5852,6 @@ css-tree@^1.1.3: mdn-data "2.0.14" source-map "^0.6.1" -css-vendor@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/css-vendor/-/css-vendor-2.0.8.tgz#e47f91d3bd3117d49180a3c935e62e3d9f7f449d" - integrity sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ== - dependencies: - "@babel/runtime" "^7.8.3" - is-in-browser "^1.0.2" - css-what@^3.2.1: version "3.4.2" resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" @@ -7827,11 +7796,6 @@ husky@>=7.0.4: resolved "https://registry.yarnpkg.com/husky/-/husky-7.0.4.tgz#242048245dc49c8fb1bf0cc7cfb98dd722531535" integrity sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ== -hyphenate-style-name@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" - integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== - iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -8093,11 +8057,6 @@ is-hexadecimal@^2.0.0: resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz#86b5bf668fca307498d319dfc03289d781a90027" integrity sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg== -is-in-browser@^1.0.2, is-in-browser@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835" - integrity sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU= - is-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" @@ -8907,76 +8866,6 @@ jsonpointer@^5.0.0: resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.0.tgz#f802669a524ec4805fa7389eadbc9921d5dc8072" integrity sha512-PNYZIdMjVIvVgDSYKTT63Y+KZ6IZvGRNNWcxwD+GNnUz1MKPfv30J8ueCjdwcN0nDx2SlshgyB7Oy0epAzVRRg== -jss-plugin-camel-case@^10.8.2: - version "10.9.0" - resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.9.0.tgz#4921b568b38d893f39736ee8c4c5f1c64670aaf7" - integrity sha512-UH6uPpnDk413/r/2Olmw4+y54yEF2lRIV8XIZyuYpgPYTITLlPOsq6XB9qeqv+75SQSg3KLocq5jUBXW8qWWww== - dependencies: - "@babel/runtime" "^7.3.1" - hyphenate-style-name "^1.0.3" - jss "10.9.0" - -jss-plugin-default-unit@^10.8.2: - version "10.9.0" - resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.9.0.tgz#bb23a48f075bc0ce852b4b4d3f7582bc002df991" - integrity sha512-7Ju4Q9wJ/MZPsxfu4T84mzdn7pLHWeqoGd/D8O3eDNNJ93Xc8PxnLmV8s8ZPNRYkLdxZqKtm1nPQ0BM4JRlq2w== - dependencies: - "@babel/runtime" "^7.3.1" - jss "10.9.0" - -jss-plugin-global@^10.8.2: - version "10.9.0" - resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.9.0.tgz#fc07a0086ac97aca174e37edb480b69277f3931f" - integrity sha512-4G8PHNJ0x6nwAFsEzcuVDiBlyMsj2y3VjmFAx/uHk/R/gzJV+yRHICjT4MKGGu1cJq2hfowFWCyrr/Gg37FbgQ== - dependencies: - "@babel/runtime" "^7.3.1" - jss "10.9.0" - -jss-plugin-nested@^10.8.2: - version "10.9.0" - resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.9.0.tgz#cc1c7d63ad542c3ccc6e2c66c8328c6b6b00f4b3" - integrity sha512-2UJnDrfCZpMYcpPYR16oZB7VAC6b/1QLsRiAutOt7wJaaqwCBvNsosLEu/fUyKNQNGdvg2PPJFDO5AX7dwxtoA== - dependencies: - "@babel/runtime" "^7.3.1" - jss "10.9.0" - tiny-warning "^1.0.2" - -jss-plugin-props-sort@^10.8.2: - version "10.9.0" - resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.9.0.tgz#30e9567ef9479043feb6e5e59db09b4de687c47d" - integrity sha512-7A76HI8bzwqrsMOJTWKx/uD5v+U8piLnp5bvru7g/3ZEQOu1+PjHvv7bFdNO3DwNPC9oM0a//KwIJsIcDCjDzw== - dependencies: - "@babel/runtime" "^7.3.1" - jss "10.9.0" - -jss-plugin-rule-value-function@^10.8.2: - version "10.9.0" - resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.9.0.tgz#379fd2732c0746fe45168011fe25544c1a295d67" - integrity sha512-IHJv6YrEf8pRzkY207cPmdbBstBaE+z8pazhPShfz0tZSDtRdQua5jjg6NMz3IbTasVx9FdnmptxPqSWL5tyJg== - dependencies: - "@babel/runtime" "^7.3.1" - jss "10.9.0" - tiny-warning "^1.0.2" - -jss-plugin-vendor-prefixer@^10.8.2: - version "10.9.0" - resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.9.0.tgz#aa9df98abfb3f75f7ed59a3ec50a5452461a206a" - integrity sha512-MbvsaXP7iiVdYVSEoi+blrW+AYnTDvHTW6I6zqi7JcwXdc6I9Kbm234nEblayhF38EftoenbM+5218pidmC5gA== - dependencies: - "@babel/runtime" "^7.3.1" - css-vendor "^2.0.8" - jss "10.9.0" - -jss@10.9.0, jss@^10.8.2: - version "10.9.0" - resolved "https://registry.yarnpkg.com/jss/-/jss-10.9.0.tgz#7583ee2cdc904a83c872ba695d1baab4b59c141b" - integrity sha512-YpzpreB6kUunQBbrlArlsMpXYyndt9JATbt95tajx0t4MTJJcCJdd4hdNpHmOIDiUJrF/oX5wtVFrS3uofWfGw== - dependencies: - "@babel/runtime" "^7.3.1" - csstype "^3.0.2" - is-in-browser "^1.1.3" - tiny-warning "^1.0.2" - "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.2.1: version "3.2.2" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.2.tgz#6ab1e52c71dfc0c0707008a91729a9491fe9f76c" @@ -13098,11 +12987,6 @@ tiny-invariant@^1.0.6: resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.2.0.tgz#a1141f86b672a9148c72e978a19a73b9b94a15a9" integrity sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg== -tiny-warning@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" - integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== - tinymce@^5, tinymce@^5.5.1: version "5.10.4" resolved "https://registry.yarnpkg.com/tinymce/-/tinymce-5.10.4.tgz#24ee843c7648ade708605dec15d8dad07809f7db" From cd29d8fd441c158fc266d633d90dd512981a6efe Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Tue, 11 Oct 2022 17:05:38 +1100 Subject: [PATCH 170/309] run yarn-deduplicate --- yarn.lock | 1642 ++++++----------------------------------------------- 1 file changed, 162 insertions(+), 1480 deletions(-) diff --git a/yarn.lock b/yarn.lock index b25db533..22973d01 100644 --- a/yarn.lock +++ b/yarn.lock @@ -122,52 +122,19 @@ jsonpointer "^5.0.0" leven "^3.1.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.8.3": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.8.3": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== dependencies: "@babel/highlight" "^7.16.7" -"@babel/code-frame@^7.12.13": - 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.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.13.tgz#27e19e0ed3726ccf54067ced4109501765e7e2e8" - integrity sha512-U/hshG5R+SIoW7HVWIdmy1cB7s3ki+r3FpyEZiCgpi4tFgPnX/vynY80ZGSASOIrUM6O7VxOgCZgdt7h97bUGg== - -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.8", "@babel/compat-data@^7.17.0", "@babel/compat-data@^7.17.7": +"@babel/compat-data@^7.12.13", "@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.8", "@babel/compat-data@^7.17.0", "@babel/compat-data@^7.17.7": version "7.17.7" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.7.tgz#078d8b833fbbcc95286613be8c716cef2b519fa2" integrity sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ== -"@babel/core@^7.1.0", "@babel/core@^7.12.3": - version "7.12.17" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.17.tgz#993c5e893333107a2815d8e0d73a2c3755e280b2" - integrity sha512-V3CuX1aBywbJvV2yzJScRxeiiw0v2KZZYYE3giywxzFJL13RiyPjaaDwhDnxmgFTTS7FgvM2ijr4QmKNIu0AtQ== - dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.12.17" - "@babel/helper-module-transforms" "^7.12.17" - "@babel/helpers" "^7.12.17" - "@babel/parser" "^7.12.17" - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.12.17" - "@babel/types" "^7.12.17" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.2" - lodash "^4.17.19" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/core@^7.11.1", "@babel/core@^7.16.0", "@babel/core@^7.7.2", "@babel/core@^7.8.0": +"@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.7.2", "@babel/core@^7.8.0": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.9.tgz#6bae81a06d95f4d0dec5bb9d74bbc1f58babdcfe" integrity sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw== @@ -197,16 +164,7 @@ eslint-visitor-keys "^2.1.0" semver "^6.3.0" -"@babel/generator@^7.12.17": - version "7.12.17" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.17.tgz#9ef1dd792d778b32284411df63f4f668a9957287" - integrity sha512-DSA7ruZrY4WI8VxuS1jWSRezFnghEoYEFrZcw9BizQRmOZiUsiHl59+qEARGPqPikwA/GPTyRCi7isuCK/oyqg== - dependencies: - "@babel/types" "^7.12.17" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/generator@^7.17.9", "@babel/generator@^7.7.2": +"@babel/generator@^7.12.17", "@babel/generator@^7.17.9", "@babel/generator@^7.7.2": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.9.tgz#f4af9fd38fa8de143c29fce3f71852406fc1e2fc" integrity sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ== @@ -215,29 +173,14 @@ jsesc "^2.5.1" source-map "^0.5.0" -"@babel/helper-annotate-as-pure@^7.10.4": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab" - integrity sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw== - dependencies: - "@babel/types" "^7.12.13" - -"@babel/helper-annotate-as-pure@^7.12.13", "@babel/helper-annotate-as-pure@^7.16.7": +"@babel/helper-annotate-as-pure@^7.10.4", "@babel/helper-annotate-as-pure@^7.12.13", "@babel/helper-annotate-as-pure@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== dependencies: "@babel/types" "^7.16.7" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz#6bc20361c88b0a74d05137a65cac8d3cbf6f61fc" - integrity sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.12.13" - "@babel/types" "^7.12.13" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": +"@babel/helper-builder-binary-assignment-operator-visitor@^7.12.13", "@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b" integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA== @@ -245,17 +188,7 @@ "@babel/helper-explode-assignable-expression" "^7.16.7" "@babel/types" "^7.16.7" -"@babel/helper-compilation-targets@^7.12.17": - version "7.12.17" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.17.tgz#91d83fae61ef390d39c3f0507cb83979bab837c7" - integrity sha512-5EkibqLVYOuZ89BSg2lv+GG8feywLuvMXNYgf0Im4MssE0mFWPztSpJbildNnUgw0bLI2EsIN4MpSHC2iUJkQA== - dependencies: - "@babel/compat-data" "^7.12.13" - "@babel/helper-validator-option" "^7.12.17" - browserslist "^4.14.5" - semver "^5.5.0" - -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.17.7": +"@babel/helper-compilation-targets@^7.12.17", "@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.17.7": version "7.17.7" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz#a3c2924f5e5f0379b356d4cfb313d1414dc30e46" integrity sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w== @@ -265,18 +198,7 @@ browserslist "^4.17.5" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.12.13": - version "7.12.17" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.17.tgz#704b69c8a78d03fb1c5fcc2e7b593f8a65628944" - integrity sha512-I/nurmTxIxHV0M+rIpfQBF1oN342+yvl2kwZUrQuOClMamHF1w5tknfZubgNOLRoA73SzBFAdFcpb4M9HwOeWQ== - dependencies: - "@babel/helper-function-name" "^7.12.13" - "@babel/helper-member-expression-to-functions" "^7.12.17" - "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/helper-replace-supers" "^7.12.13" - "@babel/helper-split-export-declaration" "^7.12.13" - -"@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7", "@babel/helper-create-class-features-plugin@^7.17.6", "@babel/helper-create-class-features-plugin@^7.17.9": +"@babel/helper-create-class-features-plugin@^7.12.13", "@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7", "@babel/helper-create-class-features-plugin@^7.17.6", "@babel/helper-create-class-features-plugin@^7.17.9": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.9.tgz#71835d7fb9f38bd9f1378e40a4c0902fdc2ea49d" integrity sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ== @@ -318,30 +240,14 @@ dependencies: "@babel/types" "^7.16.7" -"@babel/helper-explode-assignable-expression@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.13.tgz#0e46990da9e271502f77507efa4c9918d3d8634a" - integrity sha512-5loeRNvMo9mx1dA/d6yNi+YiKziJZFylZnCo1nmFF4qPU4yJ14abhWESuSMQSlQxWdxdOFzxXjk/PpfudTtYyw== - dependencies: - "@babel/types" "^7.12.13" - -"@babel/helper-explode-assignable-expression@^7.16.7": +"@babel/helper-explode-assignable-expression@^7.12.13", "@babel/helper-explode-assignable-expression@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a" integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ== dependencies: "@babel/types" "^7.16.7" -"@babel/helper-function-name@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz#93ad656db3c3c2232559fd7b2c3dbdcbe0eb377a" - integrity sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA== - dependencies: - "@babel/helper-get-function-arity" "^7.12.13" - "@babel/template" "^7.12.13" - "@babel/types" "^7.12.13" - -"@babel/helper-function-name@^7.16.7", "@babel/helper-function-name@^7.17.9": +"@babel/helper-function-name@^7.12.13", "@babel/helper-function-name@^7.16.7", "@babel/helper-function-name@^7.17.9": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12" integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg== @@ -356,28 +262,14 @@ dependencies: "@babel/types" "^7.12.13" -"@babel/helper-hoist-variables@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.12.13.tgz#13aba58b7480b502362316ea02f52cca0e9796cd" - integrity sha512-KSC5XSj5HreRhYQtZ3cnSnQwDzgnbdUDEFsxkN0m6Q3WrCRt72xrnZ8+h+pX7YxM7hr87zIO3a/v5p/H3TrnVw== - dependencies: - "@babel/types" "^7.12.13" - -"@babel/helper-hoist-variables@^7.16.7": +"@babel/helper-hoist-variables@^7.12.13", "@babel/helper-hoist-variables@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== dependencies: "@babel/types" "^7.16.7" -"@babel/helper-member-expression-to-functions@^7.12.13", "@babel/helper-member-expression-to-functions@^7.12.17": - version "7.12.17" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.17.tgz#f82838eb06e1235307b6d71457b6670ff71ee5ac" - integrity sha512-Bzv4p3ODgS/qpBE0DiJ9qf5WxSmrQ8gVTe8ClMfwwsY2x/rhykxxy3bXzG7AGTnPB2ij37zGJ/Q/6FruxHxsxg== - dependencies: - "@babel/types" "^7.12.17" - -"@babel/helper-member-expression-to-functions@^7.16.7", "@babel/helper-member-expression-to-functions@^7.17.7": +"@babel/helper-member-expression-to-functions@^7.12.13", "@babel/helper-member-expression-to-functions@^7.12.17", "@babel/helper-member-expression-to-functions@^7.16.7", "@babel/helper-member-expression-to-functions@^7.17.7": version "7.17.7" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz#a34013b57d8542a8c4ff8ba3f747c02452a4d8c4" integrity sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw== @@ -391,22 +283,7 @@ dependencies: "@babel/types" "^7.16.7" -"@babel/helper-module-transforms@^7.12.13", "@babel/helper-module-transforms@^7.12.17": - version "7.12.17" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.17.tgz#7c75b987d6dfd5b48e575648f81eaac891539509" - integrity sha512-sFL+p6zOCQMm9vilo06M4VHuTxUAwa6IxgL56Tq1DVtA0ziAGTH1ThmJq7xwPqdQlgAbKX3fb0oZNbtRIyA5KQ== - dependencies: - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-replace-supers" "^7.12.13" - "@babel/helper-simple-access" "^7.12.13" - "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/helper-validator-identifier" "^7.12.11" - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.12.17" - "@babel/types" "^7.12.17" - lodash "^4.17.19" - -"@babel/helper-module-transforms@^7.16.7", "@babel/helper-module-transforms@^7.17.7": +"@babel/helper-module-transforms@^7.12.13", "@babel/helper-module-transforms@^7.12.17", "@babel/helper-module-transforms@^7.16.7", "@babel/helper-module-transforms@^7.17.7": version "7.17.7" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz#3943c7f777139e7954a5355c815263741a9c1cbd" integrity sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw== @@ -420,14 +297,7 @@ "@babel/traverse" "^7.17.3" "@babel/types" "^7.17.0" -"@babel/helper-optimise-call-expression@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea" - integrity sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA== - dependencies: - "@babel/types" "^7.12.13" - -"@babel/helper-optimise-call-expression@^7.16.7": +"@babel/helper-optimise-call-expression@^7.12.13", "@babel/helper-optimise-call-expression@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2" integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w== @@ -439,16 +309,7 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== -"@babel/helper-remap-async-to-generator@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.13.tgz#170365f4140e2d20e5c88f8ba23c24468c296878" - integrity sha512-Qa6PU9vNcj1NZacZZI1Mvwt+gXDH6CTfgAkSjeRMLE8HxtDK76+YDId6NQR+z7Rgd5arhD2cIbS74r0SxD6PDA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-wrap-function" "^7.12.13" - "@babel/types" "^7.12.13" - -"@babel/helper-remap-async-to-generator@^7.16.8": +"@babel/helper-remap-async-to-generator@^7.12.13", "@babel/helper-remap-async-to-generator@^7.16.8": version "7.16.8" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz#29ffaade68a367e2ed09c90901986918d25e57e3" integrity sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw== @@ -457,17 +318,7 @@ "@babel/helper-wrap-function" "^7.16.8" "@babel/types" "^7.16.8" -"@babel/helper-replace-supers@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.13.tgz#00ec4fb6862546bd3d0aff9aac56074277173121" - integrity sha512-pctAOIAMVStI2TMLhozPKbf5yTEXc0OJa0eENheb4w09SrgOWEs+P4nTOZYJQCqs8JlErGLDPDJTiGIp3ygbLg== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.12.13" - "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/traverse" "^7.12.13" - "@babel/types" "^7.12.13" - -"@babel/helper-replace-supers@^7.16.7": +"@babel/helper-replace-supers@^7.12.13", "@babel/helper-replace-supers@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz#e9f5f5f32ac90429c1a4bdec0f231ef0c2838ab1" integrity sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw== @@ -478,42 +329,21 @@ "@babel/traverse" "^7.16.7" "@babel/types" "^7.16.7" -"@babel/helper-simple-access@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz#8478bcc5cacf6aa1672b251c1d2dde5ccd61a6c4" - integrity sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA== - dependencies: - "@babel/types" "^7.12.13" - -"@babel/helper-simple-access@^7.17.7": +"@babel/helper-simple-access@^7.12.13", "@babel/helper-simple-access@^7.17.7": version "7.17.7" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz#aaa473de92b7987c6dfa7ce9a7d9674724823367" integrity sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA== dependencies: "@babel/types" "^7.17.0" -"@babel/helper-skip-transparent-expression-wrappers@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" - integrity sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA== - dependencies: - "@babel/types" "^7.12.1" - -"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": +"@babel/helper-skip-transparent-expression-wrappers@^7.12.1", "@babel/helper-skip-transparent-expression-wrappers@^7.16.0": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== dependencies: "@babel/types" "^7.16.0" -"@babel/helper-split-export-declaration@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05" - integrity sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg== - dependencies: - "@babel/types" "^7.12.13" - -"@babel/helper-split-export-declaration@^7.16.7": +"@babel/helper-split-export-declaration@^7.12.13", "@babel/helper-split-export-declaration@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== @@ -525,27 +355,12 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== -"@babel/helper-validator-option@^7.12.17": - version "7.12.17" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" - integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== - -"@babel/helper-validator-option@^7.16.7": +"@babel/helper-validator-option@^7.12.17", "@babel/helper-validator-option@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== -"@babel/helper-wrap-function@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.12.13.tgz#e3ea8cb3ee0a16911f9c1b50d9e99fe8fe30f9ff" - integrity sha512-t0aZFEmBJ1LojdtJnhOaQEVejnzYhyjWHSsNSNo8vOYRbAJNh6r6GQF7pd36SqG7OKGbn+AewVQ/0IfYfIuGdw== - dependencies: - "@babel/helper-function-name" "^7.12.13" - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.12.13" - "@babel/types" "^7.12.13" - -"@babel/helper-wrap-function@^7.16.8": +"@babel/helper-wrap-function@^7.12.13", "@babel/helper-wrap-function@^7.16.8": version "7.16.8" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz#58afda087c4cd235de92f7ceedebca2c41274200" integrity sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw== @@ -555,16 +370,7 @@ "@babel/traverse" "^7.16.8" "@babel/types" "^7.16.8" -"@babel/helpers@^7.12.17": - version "7.12.17" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.17.tgz#71e03d2981a6b5ee16899964f4101dc8471d60bc" - integrity sha512-tEpjqSBGt/SFEsFikKds1sLNChKKGGR17flIgQKXH4fG6m9gTgl3gnOC1giHNyaBCSKuTfxaSzHi7UnvqiVKxg== - dependencies: - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.12.17" - "@babel/types" "^7.12.17" - -"@babel/helpers@^7.17.9": +"@babel/helpers@^7.12.17", "@babel/helpers@^7.17.9": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.9.tgz#b2af120821bfbe44f9907b1826e168e819375a1a" integrity sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q== @@ -582,12 +388,7 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.12.17": - version "7.12.17" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.17.tgz#bc85d2d47db38094e5bb268fc761716e7d693848" - integrity sha512-r1yKkiUTYMQ8LiEI0UcQx5ETw5dpTLn9wijn9hk6KkTtOK95FndDN10M+8/s6k/Ymlbivw0Av9q4SlgF80PtHg== - -"@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.9": +"@babel/parser@^7.1.0", "@babel/parser@^7.12.17", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.9": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.9.tgz#9c94189a6062f0291418ca021077983058e171ef" integrity sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg== @@ -608,16 +409,7 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" "@babel/plugin-proposal-optional-chaining" "^7.16.7" -"@babel/plugin-proposal-async-generator-functions@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.13.tgz#d1c6d841802ffb88c64a2413e311f7345b9e66b5" - integrity sha512-1KH46Hx4WqP77f978+5Ye/VUbuwQld2hph70yaw2hXS2v7ER2f3nlpNMu909HO2rbvP0NKLlMVDPh9KXklVMhA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/helper-remap-async-to-generator" "^7.12.13" - "@babel/plugin-syntax-async-generators" "^7.8.0" - -"@babel/plugin-proposal-async-generator-functions@^7.16.8": +"@babel/plugin-proposal-async-generator-functions@^7.12.13", "@babel/plugin-proposal-async-generator-functions@^7.16.8": version "7.16.8" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz#3bdd1ebbe620804ea9416706cd67d60787504bc8" integrity sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ== @@ -626,15 +418,7 @@ "@babel/helper-remap-async-to-generator" "^7.16.8" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-proposal-class-properties@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.13.tgz#3d2ce350367058033c93c098e348161d6dc0d8c8" - integrity sha512-8SCJ0Ddrpwv4T7Gwb33EmW1V9PY5lggTO+A8WjyIwxrSHDUyBw4MtF96ifn1n8H806YlxbVCoKXbbmzD6RD+cA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-proposal-class-properties@^7.16.0", "@babel/plugin-proposal-class-properties@^7.16.7": +"@babel/plugin-proposal-class-properties@^7.12.13", "@babel/plugin-proposal-class-properties@^7.16.0", "@babel/plugin-proposal-class-properties@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz#925cad7b3b1a2fcea7e59ecc8eb5954f961f91b0" integrity sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww== @@ -663,15 +447,7 @@ "@babel/plugin-syntax-decorators" "^7.17.0" charcodes "^0.2.0" -"@babel/plugin-proposal-dynamic-import@^7.12.17": - version "7.12.17" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.17.tgz#e0ebd8db65acc37eac518fa17bead2174e224512" - integrity sha512-ZNGoFZqrnuy9H2izB2jLlnNDAfVPlGl5NhFEiFe4D84ix9GQGygF+CWMGHKuE+bpyS/AOuDQCnkiRNqW2IzS1Q== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/plugin-syntax-dynamic-import" "^7.8.0" - -"@babel/plugin-proposal-dynamic-import@^7.16.7": +"@babel/plugin-proposal-dynamic-import@^7.12.17", "@babel/plugin-proposal-dynamic-import@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz#c19c897eaa46b27634a00fee9fb7d829158704b2" integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg== @@ -679,15 +455,7 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-proposal-export-namespace-from@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz#393be47a4acd03fa2af6e3cde9b06e33de1b446d" - integrity sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-proposal-export-namespace-from@^7.16.7": +"@babel/plugin-proposal-export-namespace-from@^7.12.13", "@babel/plugin-proposal-export-namespace-from@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz#09de09df18445a5786a305681423ae63507a6163" integrity sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA== @@ -695,15 +463,7 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-json-strings@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.13.tgz#ced7888a2db92a3d520a2e35eb421fdb7fcc9b5d" - integrity sha512-v9eEi4GiORDg8x+Dmi5r8ibOe0VXoKDeNPYcTTxdGN4eOWikrJfDJCJrr1l5gKGvsNyGJbrfMftC2dTL6oz7pg== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/plugin-syntax-json-strings" "^7.8.0" - -"@babel/plugin-proposal-json-strings@^7.16.7": +"@babel/plugin-proposal-json-strings@^7.12.13", "@babel/plugin-proposal-json-strings@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz#9732cb1d17d9a2626a08c5be25186c195b6fa6e8" integrity sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ== @@ -711,15 +471,7 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-proposal-logical-assignment-operators@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.13.tgz#575b5d9a08d8299eeb4db6430da6e16e5cf14350" - integrity sha512-fqmiD3Lz7jVdK6kabeSr1PZlWSUVqSitmHEe3Z00dtGTKieWnX9beafvavc32kjORa5Bai4QNHgFDwWJP+WtSQ== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-proposal-logical-assignment-operators@^7.16.7": +"@babel/plugin-proposal-logical-assignment-operators@^7.12.13", "@babel/plugin-proposal-logical-assignment-operators@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz#be23c0ba74deec1922e639832904be0bea73cdea" integrity sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg== @@ -727,15 +479,7 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.13.tgz#24867307285cee4e1031170efd8a7ac807deefde" - integrity sha512-Qoxpy+OxhDBI5kRqliJFAl4uWXk3Bn24WeFstPH0iLymFehSAUR8MHpqU7njyXv/qbo7oN6yTy5bfCmXdKpo1Q== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7": +"@babel/plugin-proposal-nullish-coalescing-operator@^7.12.13", "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz#141fc20b6857e59459d430c850a0011e36561d99" integrity sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ== @@ -743,15 +487,7 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-proposal-numeric-separator@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz#bd9da3188e787b5120b4f9d465a8261ce67ed1db" - integrity sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-proposal-numeric-separator@^7.16.0", "@babel/plugin-proposal-numeric-separator@^7.16.7": +"@babel/plugin-proposal-numeric-separator@^7.12.13", "@babel/plugin-proposal-numeric-separator@^7.16.0", "@babel/plugin-proposal-numeric-separator@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9" integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw== @@ -759,16 +495,7 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.13.tgz#f93f3116381ff94bc676fdcb29d71045cd1ec011" - integrity sha512-WvA1okB/0OS/N3Ldb3sziSrXg6sRphsBgqiccfcQq7woEn5wQLNX82Oc4PlaFcdwcWHuQXAtb8ftbS8Fbsg/sg== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-transform-parameters" "^7.12.13" - -"@babel/plugin-proposal-object-rest-spread@^7.16.7": +"@babel/plugin-proposal-object-rest-spread@^7.12.13", "@babel/plugin-proposal-object-rest-spread@^7.16.7": version "7.17.3" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz#d9eb649a54628a51701aef7e0ea3d17e2b9dd390" integrity sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw== @@ -779,15 +506,7 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-transform-parameters" "^7.16.7" -"@babel/plugin-proposal-optional-catch-binding@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.13.tgz#4640520afe57728af14b4d1574ba844f263bcae5" - integrity sha512-9+MIm6msl9sHWg58NvqpNpLtuFbmpFYk37x8kgnGzAHvX35E1FyAwSUt5hIkSoWJFSAH+iwU8bJ4fcD1zKXOzg== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" - -"@babel/plugin-proposal-optional-catch-binding@^7.16.7": +"@babel/plugin-proposal-optional-catch-binding@^7.12.13", "@babel/plugin-proposal-optional-catch-binding@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz#c623a430674ffc4ab732fd0a0ae7722b67cb74cf" integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA== @@ -795,16 +514,7 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.12.17": - version "7.12.17" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.17.tgz#e382becadc2cb16b7913b6c672d92e4b33385b5c" - integrity sha512-TvxwI80pWftrGPKHNfkvX/HnoeSTR7gC4ezWnAL39PuktYUe6r8kEpOLTYnkBTsaoeazXm2jHJ22EQ81sdgfcA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" - "@babel/plugin-syntax-optional-chaining" "^7.8.0" - -"@babel/plugin-proposal-optional-chaining@^7.16.0", "@babel/plugin-proposal-optional-chaining@^7.16.7": +"@babel/plugin-proposal-optional-chaining@^7.12.17", "@babel/plugin-proposal-optional-chaining@^7.16.0", "@babel/plugin-proposal-optional-chaining@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz#7cd629564724816c0e8a969535551f943c64c39a" integrity sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA== @@ -813,15 +523,7 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-proposal-private-methods@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.13.tgz#ea78a12554d784ecf7fc55950b752d469d9c4a71" - integrity sha512-sV0V57uUwpauixvR7s2o75LmwJI6JECwm5oPUY5beZB1nBl2i37hc7CJGqB5G+58fur5Y6ugvl3LRONk5x34rg== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-proposal-private-methods@^7.16.0", "@babel/plugin-proposal-private-methods@^7.16.11": +"@babel/plugin-proposal-private-methods@^7.12.13", "@babel/plugin-proposal-private-methods@^7.16.0", "@babel/plugin-proposal-private-methods@^7.16.11": version "7.16.11" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz#e8df108288555ff259f4527dbe84813aac3a1c50" integrity sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw== @@ -839,15 +541,7 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-proposal-unicode-property-regex@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz#bebde51339be829c17aaaaced18641deb62b39ba" - integrity sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-proposal-unicode-property-regex@^7.16.7", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": +"@babel/plugin-proposal-unicode-property-regex@^7.12.13", "@babel/plugin-proposal-unicode-property-regex@^7.16.7", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz#635d18eb10c6214210ffc5ff4932552de08188a2" integrity sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg== @@ -925,14 +619,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz#044fb81ebad6698fe62c478875575bcbb9b70f15" - integrity sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-jsx@^7.16.7": +"@babel/plugin-syntax-jsx@^7.12.13", "@babel/plugin-syntax-jsx@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz#50b6571d13f764266a113d77c82b4a6508bbe665" integrity sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q== @@ -988,14 +675,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-top-level-await@^7.12.13", "@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz#c5f0fa6e249f5b739727f923540cf7a806130178" - integrity sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-top-level-await@^7.14.5": +"@babel/plugin-syntax-top-level-await@^7.12.13", "@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== @@ -1009,30 +689,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-arrow-functions@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.13.tgz#eda5670b282952100c229f8a3bd49e0f6a72e9fe" - integrity sha512-tBtuN6qtCTd+iHzVZVOMNp+L04iIJBpqkdY42tWbmjIT5wvR2kx7gxMBsyhQtFzHwBbyGi9h8J8r9HgnOpQHxg== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-arrow-functions@^7.16.7": +"@babel/plugin-transform-arrow-functions@^7.12.13", "@babel/plugin-transform-arrow-functions@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz#44125e653d94b98db76369de9c396dc14bef4154" integrity sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-async-to-generator@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.13.tgz#fed8c69eebf187a535bfa4ee97a614009b24f7ae" - integrity sha512-psM9QHcHaDr+HZpRuJcE1PXESuGWSCcbiGFFhhwfzdbTxaGDVzuVtdNYliAwcRo3GFg0Bc8MmI+AvIGYIJG04A== - dependencies: - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/helper-remap-async-to-generator" "^7.12.13" - -"@babel/plugin-transform-async-to-generator@^7.16.8": +"@babel/plugin-transform-async-to-generator@^7.12.13", "@babel/plugin-transform-async-to-generator@^7.16.8": version "7.16.8" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz#b83dff4b970cf41f1b819f8b49cc0cfbaa53a808" integrity sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg== @@ -1041,48 +705,21 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-remap-async-to-generator" "^7.16.8" -"@babel/plugin-transform-block-scoped-functions@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz#a9bf1836f2a39b4eb6cf09967739de29ea4bf4c4" - integrity sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-block-scoped-functions@^7.16.7": +"@babel/plugin-transform-block-scoped-functions@^7.12.13", "@babel/plugin-transform-block-scoped-functions@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620" integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-block-scoping@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz#f36e55076d06f41dfd78557ea039c1b581642e61" - integrity sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-block-scoping@^7.16.7": +"@babel/plugin-transform-block-scoping@^7.12.13", "@babel/plugin-transform-block-scoping@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz#f50664ab99ddeaee5bc681b8f3a6ea9d72ab4f87" integrity sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-classes@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.13.tgz#9728edc1838b5d62fc93ad830bd523b1fcb0e1f6" - integrity sha512-cqZlMlhCC1rVnxE5ZGMtIb896ijL90xppMiuWXcwcOAuFczynpd3KYemb91XFFPi3wJSe/OcrX9lXoowatkkxA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-function-name" "^7.12.13" - "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/helper-replace-supers" "^7.12.13" - "@babel/helper-split-export-declaration" "^7.12.13" - globals "^11.1.0" - -"@babel/plugin-transform-classes@^7.16.7": +"@babel/plugin-transform-classes@^7.12.13", "@babel/plugin-transform-classes@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz#8f4b9562850cd973de3b498f1218796eb181ce00" integrity sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ== @@ -1096,43 +733,21 @@ "@babel/helper-split-export-declaration" "^7.16.7" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.13.tgz#6a210647a3d67f21f699cfd2a01333803b27339d" - integrity sha512-dDfuROUPGK1mTtLKyDPUavmj2b6kFu82SmgpztBFEO974KMjJT+Ytj3/oWsTUMBmgPcp9J5Pc1SlcAYRpJ2hRA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-computed-properties@^7.16.7": +"@babel/plugin-transform-computed-properties@^7.12.13", "@babel/plugin-transform-computed-properties@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz#66dee12e46f61d2aae7a73710f591eb3df616470" integrity sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-destructuring@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.13.tgz#fc56c5176940c5b41735c677124d1d20cecc9aeb" - integrity sha512-Dn83KykIFzjhA3FDPA1z4N+yfF3btDGhjnJwxIj0T43tP0flCujnU8fKgEkf0C1biIpSv9NZegPBQ1J6jYkwvQ== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-destructuring@^7.16.7": +"@babel/plugin-transform-destructuring@^7.12.13", "@babel/plugin-transform-destructuring@^7.16.7": version "7.17.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz#49dc2675a7afa9a5e4c6bdee636061136c3408d1" integrity sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-dotall-regex@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz#3f1601cc29905bfcb67f53910f197aeafebb25ad" - integrity sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4": +"@babel/plugin-transform-dotall-regex@^7.12.13", "@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz#6b2d67686fab15fb6a7fd4bd895d5982cfc81241" integrity sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ== @@ -1140,29 +755,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-duplicate-keys@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz#6f06b87a8b803fd928e54b81c258f0a0033904de" - integrity sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-duplicate-keys@^7.16.7": +"@babel/plugin-transform-duplicate-keys@^7.12.13", "@babel/plugin-transform-duplicate-keys@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz#2207e9ca8f82a0d36a5a67b6536e7ef8b08823c9" integrity sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-exponentiation-operator@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz#4d52390b9a273e651e4aba6aee49ef40e80cd0a1" - integrity sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-exponentiation-operator@^7.16.7": +"@babel/plugin-transform-exponentiation-operator@^7.12.13", "@babel/plugin-transform-exponentiation-operator@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz#efa9862ef97e9e9e5f653f6ddc7b665e8536fe9b" integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA== @@ -1178,29 +778,14 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-flow" "^7.16.7" -"@babel/plugin-transform-for-of@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.13.tgz#561ff6d74d9e1c8879cb12dbaf4a14cd29d15cf6" - integrity sha512-xCbdgSzXYmHGyVX3+BsQjcd4hv4vA/FDy7Kc8eOpzKmBBPEOTurt0w5fCRQaGl+GSBORKgJdstQ1rHl4jbNseQ== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-for-of@^7.16.7": +"@babel/plugin-transform-for-of@^7.12.13", "@babel/plugin-transform-for-of@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz#649d639d4617dff502a9a158c479b3b556728d8c" integrity sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-function-name@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz#bb024452f9aaed861d374c8e7a24252ce3a50051" - integrity sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ== - dependencies: - "@babel/helper-function-name" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-function-name@^7.16.7": +"@babel/plugin-transform-function-name@^7.12.13", "@babel/plugin-transform-function-name@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf" integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA== @@ -1209,44 +794,21 @@ "@babel/helper-function-name" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-literals@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz#2ca45bafe4a820197cf315794a4d26560fe4bdb9" - integrity sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-literals@^7.16.7": +"@babel/plugin-transform-literals@^7.12.13", "@babel/plugin-transform-literals@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz#254c9618c5ff749e87cb0c0cef1a0a050c0bdab1" integrity sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-member-expression-literals@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz#5ffa66cd59b9e191314c9f1f803b938e8c081e40" - integrity sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-member-expression-literals@^7.16.7": +"@babel/plugin-transform-member-expression-literals@^7.12.13", "@babel/plugin-transform-member-expression-literals@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384" integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-modules-amd@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.13.tgz#43db16249b274ee2e551e2422090aa1c47692d56" - integrity sha512-JHLOU0o81m5UqG0Ulz/fPC68/v+UTuGTWaZBUwpEk1fYQ1D9LfKV6MPn4ttJKqRo5Lm460fkzjLTL4EHvCprvA== - dependencies: - "@babel/helper-module-transforms" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-amd@^7.16.7": +"@babel/plugin-transform-modules-amd@^7.12.13", "@babel/plugin-transform-modules-amd@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz#b28d323016a7daaae8609781d1f8c9da42b13186" integrity sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g== @@ -1255,17 +817,7 @@ "@babel/helper-plugin-utils" "^7.16.7" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.13.tgz#5043b870a784a8421fa1fd9136a24f294da13e50" - integrity sha512-OGQoeVXVi1259HjuoDnsQMlMkT9UkZT9TpXAsqWplS/M0N1g3TJAn/ByOCeQu7mfjc5WpSsRU+jV1Hd89ts0kQ== - dependencies: - "@babel/helper-module-transforms" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/helper-simple-access" "^7.12.13" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-commonjs@^7.16.8": +"@babel/plugin-transform-modules-commonjs@^7.12.13", "@babel/plugin-transform-modules-commonjs@^7.16.8": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.9.tgz#274be1a2087beec0254d4abd4d86e52442e1e5b6" integrity sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw== @@ -1275,18 +827,7 @@ "@babel/helper-simple-access" "^7.17.7" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.13.tgz#351937f392c7f07493fc79b2118201d50404a3c5" - integrity sha512-aHfVjhZ8QekaNF/5aNdStCGzwTbU7SI5hUybBKlMzqIMC7w7Ho8hx5a4R/DkTHfRfLwHGGxSpFt9BfxKCoXKoA== - dependencies: - "@babel/helper-hoist-variables" "^7.12.13" - "@babel/helper-module-transforms" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/helper-validator-identifier" "^7.12.11" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-systemjs@^7.16.7": +"@babel/plugin-transform-modules-systemjs@^7.12.13", "@babel/plugin-transform-modules-systemjs@^7.16.7": version "7.17.8" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz#81fd834024fae14ea78fbe34168b042f38703859" integrity sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw== @@ -1297,15 +838,7 @@ "@babel/helper-validator-identifier" "^7.16.7" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-umd@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.13.tgz#26c66f161d3456674e344b4b1255de4d530cfb37" - integrity sha512-BgZndyABRML4z6ibpi7Z98m4EVLFI9tVsZDADC14AElFaNHHBcJIovflJ6wtCqFxwy2YJ1tJhGRsr0yLPKoN+w== - dependencies: - "@babel/helper-module-transforms" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-modules-umd@^7.16.7": +"@babel/plugin-transform-modules-umd@^7.12.13", "@babel/plugin-transform-modules-umd@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz#23dad479fa585283dbd22215bff12719171e7618" integrity sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ== @@ -1313,43 +846,21 @@ "@babel/helper-module-transforms" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-named-capturing-groups-regex@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz#2213725a5f5bbbe364b50c3ba5998c9599c5c9d9" - integrity sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.13" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.16.8": +"@babel/plugin-transform-named-capturing-groups-regex@^7.12.13", "@babel/plugin-transform-named-capturing-groups-regex@^7.16.8": version "7.16.8" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz#7f860e0e40d844a02c9dcf9d84965e7dfd666252" integrity sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.16.7" -"@babel/plugin-transform-new-target@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz#e22d8c3af24b150dd528cbd6e685e799bf1c351c" - integrity sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-new-target@^7.16.7": +"@babel/plugin-transform-new-target@^7.12.13", "@babel/plugin-transform-new-target@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz#9967d89a5c243818e0800fdad89db22c5f514244" integrity sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-object-super@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz#b4416a2d63b8f7be314f3d349bd55a9c1b5171f7" - integrity sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/helper-replace-supers" "^7.12.13" - -"@babel/plugin-transform-object-super@^7.16.7": +"@babel/plugin-transform-object-super@^7.12.13", "@babel/plugin-transform-object-super@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94" integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw== @@ -1357,28 +868,14 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-replace-supers" "^7.16.7" -"@babel/plugin-transform-parameters@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.13.tgz#461e76dfb63c2dfd327b8a008a9e802818ce9853" - integrity sha512-e7QqwZalNiBRHCpJg/P8s/VJeSRYgmtWySs1JwvfwPqhBbiWfOcHDKdeAi6oAyIimoKWBlwc8oTgbZHdhCoVZA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-parameters@^7.16.7": +"@babel/plugin-transform-parameters@^7.12.13", "@babel/plugin-transform-parameters@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz#a1721f55b99b736511cb7e0152f61f17688f331f" integrity sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-property-literals@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz#4e6a9e37864d8f1b3bc0e2dce7bf8857db8b1a81" - integrity sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-property-literals@^7.16.7": +"@babel/plugin-transform-property-literals@^7.12.13", "@babel/plugin-transform-property-literals@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55" integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw== @@ -1392,46 +889,21 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-react-display-name@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.13.tgz#c28effd771b276f4647411c9733dbb2d2da954bd" - integrity sha512-MprESJzI9O5VnJZrL7gg1MpdqmiFcUv41Jc7SahxYsNP2kDkFqClxxTZq+1Qv4AFCamm+GXMRDQINNn+qrxmiA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-react-display-name@^7.16.0", "@babel/plugin-transform-react-display-name@^7.16.7": +"@babel/plugin-transform-react-display-name@^7.12.13", "@babel/plugin-transform-react-display-name@^7.16.0", "@babel/plugin-transform-react-display-name@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz#7b6d40d232f4c0f550ea348593db3b21e2404340" integrity sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-react-jsx-development@^7.12.12": - version "7.12.17" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.17.tgz#f510c0fa7cd7234153539f9a362ced41a5ca1447" - integrity sha512-BPjYV86SVuOaudFhsJR1zjgxxOhJDt6JHNoD48DxWEIxUCAMjV1ys6DYw4SDYZh0b1QsS2vfIA9t/ZsQGsDOUQ== - dependencies: - "@babel/plugin-transform-react-jsx" "^7.12.17" - -"@babel/plugin-transform-react-jsx-development@^7.16.7": +"@babel/plugin-transform-react-jsx-development@^7.12.12", "@babel/plugin-transform-react-jsx-development@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz#43a00724a3ed2557ed3f276a01a929e6686ac7b8" integrity sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A== dependencies: "@babel/plugin-transform-react-jsx" "^7.16.7" -"@babel/plugin-transform-react-jsx@^7.12.13", "@babel/plugin-transform-react-jsx@^7.12.17": - version "7.12.17" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.17.tgz#dd2c1299f5e26de584939892de3cfc1807a38f24" - integrity sha512-mwaVNcXV+l6qJOuRhpdTEj8sT/Z0owAVWf9QujTZ0d2ye9X/K+MTOTSizcgKOj18PGnTc/7g1I4+cIUjsKhBcw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/plugin-syntax-jsx" "^7.12.13" - "@babel/types" "^7.12.17" - -"@babel/plugin-transform-react-jsx@^7.16.7": +"@babel/plugin-transform-react-jsx@^7.12.13", "@babel/plugin-transform-react-jsx@^7.12.17", "@babel/plugin-transform-react-jsx@^7.16.7": version "7.17.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.3.tgz#eac1565da176ccb1a715dae0b4609858808008c1" integrity sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ== @@ -1442,15 +914,7 @@ "@babel/plugin-syntax-jsx" "^7.16.7" "@babel/types" "^7.17.0" -"@babel/plugin-transform-react-pure-annotations@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz#05d46f0ab4d1339ac59adf20a1462c91b37a1a42" - integrity sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-react-pure-annotations@^7.16.7": +"@babel/plugin-transform-react-pure-annotations@^7.12.1", "@babel/plugin-transform-react-pure-annotations@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz#232bfd2f12eb551d6d7d01d13fe3f86b45eb9c67" integrity sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA== @@ -1458,28 +922,14 @@ "@babel/helper-annotate-as-pure" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-regenerator@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.13.tgz#b628bcc9c85260ac1aeb05b45bde25210194a2f5" - integrity sha512-lxb2ZAvSLyJ2PEe47hoGWPmW22v7CtSl9jW8mingV4H2sEX/JOcrAj2nPuGWi56ERUm2bUpjKzONAuT6HCn2EA== - dependencies: - regenerator-transform "^0.14.2" - -"@babel/plugin-transform-regenerator@^7.16.7": +"@babel/plugin-transform-regenerator@^7.12.13", "@babel/plugin-transform-regenerator@^7.16.7": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz#0a33c3a61cf47f45ed3232903683a0afd2d3460c" integrity sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ== dependencies: regenerator-transform "^0.15.0" -"@babel/plugin-transform-reserved-words@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz#7d9988d4f06e0fe697ea1d9803188aa18b472695" - integrity sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-reserved-words@^7.16.7": +"@babel/plugin-transform-reserved-words@^7.12.13", "@babel/plugin-transform-reserved-words@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz#1d798e078f7c5958eec952059c460b220a63f586" integrity sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg== @@ -1498,29 +948,14 @@ babel-plugin-polyfill-regenerator "^0.3.0" semver "^6.3.0" -"@babel/plugin-transform-shorthand-properties@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz#db755732b70c539d504c6390d9ce90fe64aff7ad" - integrity sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-shorthand-properties@^7.16.7": +"@babel/plugin-transform-shorthand-properties@^7.12.13", "@babel/plugin-transform-shorthand-properties@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz#e8549ae4afcf8382f711794c0c7b6b934c5fbd2a" integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-spread@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.13.tgz#ca0d5645abbd560719c354451b849f14df4a7949" - integrity sha512-dUCrqPIowjqk5pXsx1zPftSq4sT0aCeZVAxhdgs3AMgyaDmoUT0G+5h3Dzja27t76aUEIJWlFgPJqJ/d4dbTtg== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" - -"@babel/plugin-transform-spread@^7.16.7": +"@babel/plugin-transform-spread@^7.12.13", "@babel/plugin-transform-spread@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz#a303e2122f9f12e0105daeedd0f30fb197d8ff44" integrity sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg== @@ -1528,42 +963,21 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" -"@babel/plugin-transform-sticky-regex@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz#760ffd936face73f860ae646fb86ee82f3d06d1f" - integrity sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-sticky-regex@^7.16.7": +"@babel/plugin-transform-sticky-regex@^7.12.13", "@babel/plugin-transform-sticky-regex@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz#c84741d4f4a38072b9a1e2e3fd56d359552e8660" integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-template-literals@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.13.tgz#655037b07ebbddaf3b7752f55d15c2fd6f5aa865" - integrity sha512-arIKlWYUgmNsF28EyfmiQHJLJFlAJNYkuQO10jL46ggjBpeb2re1P9K9YGxNJB45BqTbaslVysXDYm/g3sN/Qg== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-template-literals@^7.16.7": +"@babel/plugin-transform-template-literals@^7.12.13", "@babel/plugin-transform-template-literals@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz#f3d1c45d28967c8e80f53666fc9c3e50618217ab" integrity sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA== dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-typeof-symbol@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz#785dd67a1f2ea579d9c2be722de8c84cb85f5a7f" - integrity sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-typeof-symbol@^7.16.7": +"@babel/plugin-transform-typeof-symbol@^7.12.13", "@babel/plugin-transform-typeof-symbol@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz#9cdbe622582c21368bd482b660ba87d5545d4f7e" integrity sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ== @@ -1579,29 +993,14 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-typescript" "^7.16.7" -"@babel/plugin-transform-unicode-escapes@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz#840ced3b816d3b5127dd1d12dcedc5dead1a5e74" - integrity sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-unicode-escapes@^7.16.7": +"@babel/plugin-transform-unicode-escapes@^7.12.13", "@babel/plugin-transform-unicode-escapes@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz#da8717de7b3287a2c6d659750c964f302b31ece3" integrity sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q== dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-unicode-regex@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz#b52521685804e155b1202e83fc188d34bb70f5ac" - integrity sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-unicode-regex@^7.16.7": +"@babel/plugin-transform-unicode-regex@^7.12.13", "@babel/plugin-transform-unicode-regex@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz#0f7aa4a501198976e25e82702574c34cfebe9ef2" integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q== @@ -1609,7 +1008,7 @@ "@babel/helper-create-regexp-features-plugin" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" -"@babel/preset-env@^7.11.0", "@babel/preset-env@^7.16.4": +"@babel/preset-env@^7.11.0", "@babel/preset-env@^7.12.1", "@babel/preset-env@^7.16.4": version "7.16.11" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.11.tgz#5dd88fd885fae36f88fd7c8342475c9f0abe2982" integrity sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g== @@ -1689,90 +1088,7 @@ core-js-compat "^3.20.2" semver "^6.3.0" -"@babel/preset-env@^7.12.1": - version "7.12.17" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.17.tgz#94a3793ff089c32ee74d76a3c03a7597693ebaaa" - integrity sha512-9PMijx8zFbCwTHrd2P4PJR5nWGH3zWebx2OcpTjqQrHhCiL2ssSR2Sc9ko2BsI2VmVBfoaQmPrlMTCui4LmXQg== - dependencies: - "@babel/compat-data" "^7.12.13" - "@babel/helper-compilation-targets" "^7.12.17" - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/helper-validator-option" "^7.12.17" - "@babel/plugin-proposal-async-generator-functions" "^7.12.13" - "@babel/plugin-proposal-class-properties" "^7.12.13" - "@babel/plugin-proposal-dynamic-import" "^7.12.17" - "@babel/plugin-proposal-export-namespace-from" "^7.12.13" - "@babel/plugin-proposal-json-strings" "^7.12.13" - "@babel/plugin-proposal-logical-assignment-operators" "^7.12.13" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.13" - "@babel/plugin-proposal-numeric-separator" "^7.12.13" - "@babel/plugin-proposal-object-rest-spread" "^7.12.13" - "@babel/plugin-proposal-optional-catch-binding" "^7.12.13" - "@babel/plugin-proposal-optional-chaining" "^7.12.17" - "@babel/plugin-proposal-private-methods" "^7.12.13" - "@babel/plugin-proposal-unicode-property-regex" "^7.12.13" - "@babel/plugin-syntax-async-generators" "^7.8.0" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-dynamic-import" "^7.8.0" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.0" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.0" - "@babel/plugin-syntax-top-level-await" "^7.12.13" - "@babel/plugin-transform-arrow-functions" "^7.12.13" - "@babel/plugin-transform-async-to-generator" "^7.12.13" - "@babel/plugin-transform-block-scoped-functions" "^7.12.13" - "@babel/plugin-transform-block-scoping" "^7.12.13" - "@babel/plugin-transform-classes" "^7.12.13" - "@babel/plugin-transform-computed-properties" "^7.12.13" - "@babel/plugin-transform-destructuring" "^7.12.13" - "@babel/plugin-transform-dotall-regex" "^7.12.13" - "@babel/plugin-transform-duplicate-keys" "^7.12.13" - "@babel/plugin-transform-exponentiation-operator" "^7.12.13" - "@babel/plugin-transform-for-of" "^7.12.13" - "@babel/plugin-transform-function-name" "^7.12.13" - "@babel/plugin-transform-literals" "^7.12.13" - "@babel/plugin-transform-member-expression-literals" "^7.12.13" - "@babel/plugin-transform-modules-amd" "^7.12.13" - "@babel/plugin-transform-modules-commonjs" "^7.12.13" - "@babel/plugin-transform-modules-systemjs" "^7.12.13" - "@babel/plugin-transform-modules-umd" "^7.12.13" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.13" - "@babel/plugin-transform-new-target" "^7.12.13" - "@babel/plugin-transform-object-super" "^7.12.13" - "@babel/plugin-transform-parameters" "^7.12.13" - "@babel/plugin-transform-property-literals" "^7.12.13" - "@babel/plugin-transform-regenerator" "^7.12.13" - "@babel/plugin-transform-reserved-words" "^7.12.13" - "@babel/plugin-transform-shorthand-properties" "^7.12.13" - "@babel/plugin-transform-spread" "^7.12.13" - "@babel/plugin-transform-sticky-regex" "^7.12.13" - "@babel/plugin-transform-template-literals" "^7.12.13" - "@babel/plugin-transform-typeof-symbol" "^7.12.13" - "@babel/plugin-transform-unicode-escapes" "^7.12.13" - "@babel/plugin-transform-unicode-regex" "^7.12.13" - "@babel/preset-modules" "^0.1.3" - "@babel/types" "^7.12.17" - core-js-compat "^3.8.0" - semver "^5.5.0" - -"@babel/preset-modules@^0.1.3": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" - integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-transform-dotall-regex" "^7.4.4" - "@babel/types" "^7.4.4" - esutils "^2.0.2" - -"@babel/preset-modules@^0.1.5": +"@babel/preset-modules@^0.1.3", "@babel/preset-modules@^0.1.5": version "0.1.5" resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== @@ -1783,18 +1099,7 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-react@^7.12.5": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.12.13.tgz#5f911b2eb24277fa686820d5bd81cad9a0602a0a" - integrity sha512-TYM0V9z6Abb6dj1K7i5NrEhA13oS5ujUYQYDfqIBXYHOc2c2VkFgc+q9kyssIyUfy4/hEwqrgSlJ/Qgv8zJLsA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/plugin-transform-react-display-name" "^7.12.13" - "@babel/plugin-transform-react-jsx" "^7.12.13" - "@babel/plugin-transform-react-jsx-development" "^7.12.12" - "@babel/plugin-transform-react-pure-annotations" "^7.12.1" - -"@babel/preset-react@^7.16.0": +"@babel/preset-react@^7.12.5", "@babel/preset-react@^7.16.0": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.16.7.tgz#4c18150491edc69c183ff818f9f2aecbe5d93852" integrity sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA== @@ -1823,28 +1128,7 @@ core-js-pure "^3.20.2" regenerator-runtime "^0.13.4" -"@babel/runtime@^7.10.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.9.tgz#d19fbf802d01a8cb6cf053a64e472d42c434ba72" - integrity sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/runtime@^7.11.2", "@babel/runtime@^7.7.2": - version "7.12.18" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.18.tgz#af137bd7e7d9705a412b3caaf991fe6aaa97831b" - integrity sha512-BogPQ7ciE6SYAUPtlm9tWbgI9+2AgqSam6QivMgXgAT+fKbgppaj4ZX15MHeLC1PVF5sNk70huBu20XxWOs8Cg== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/runtime@^7.13.10", "@babel/runtime@^7.9.2": - version "7.14.8" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.8.tgz#7119a56f421018852694290b9f9148097391b446" - integrity sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/runtime@^7.14.6": +"@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.14.6", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.18.3" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.3.tgz#c7b654b57f6f63cf7f8b418ac9ca04408c4579f4" integrity sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug== @@ -1860,22 +1144,7 @@ "@babel/parser" "^7.16.7" "@babel/types" "^7.16.7" -"@babel/traverse@^7.12.13", "@babel/traverse@^7.12.17": - version "7.12.17" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.17.tgz#40ec8c7ffb502c4e54c7f95492dc11b88d718619" - integrity sha512-LGkTqDqdiwC6Q7fWSwQoas/oyiEYw6Hqjve5KOSykXkmFJFqzvGMb9niaUEag3Rlve492Mkye3gLw9FTv94fdQ== - dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.12.17" - "@babel/helper-function-name" "^7.12.13" - "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/parser" "^7.12.17" - "@babel/types" "^7.12.17" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.19" - -"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.17.3", "@babel/traverse@^7.17.9", "@babel/traverse@^7.7.2": +"@babel/traverse@^7.12.13", "@babel/traverse@^7.12.17", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.17.3", "@babel/traverse@^7.17.9", "@babel/traverse@^7.7.2": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.9.tgz#1f9b207435d9ae4a8ed6998b2b82300d83c37a0d" integrity sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw== @@ -1891,16 +1160,7 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.17", "@babel/types@^7.12.6", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.12.17" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.17.tgz#9d711eb807e0934c90b8b1ca0eb1f7230d150963" - integrity sha512-tNMDjcv/4DIcHxErTgwB9q2ZcYyN0sUfgGKUK/mm1FJK7Wz+KstoEekxrl/tBiNDgLK1HGi+sppj1An/1DR4fQ== - dependencies: - "@babel/helper-validator-identifier" "^7.12.11" - lodash "^4.17.19" - to-fast-properties "^2.0.0" - -"@babel/types@^7.12.13", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.4.4": +"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.12.17", "@babel/types@^7.12.6", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": version "7.17.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw== @@ -2001,66 +1261,33 @@ dependencies: postcss-value-parser "^4.2.0" -"@date-io/core@^2.13.1": - version "2.13.1" - resolved "https://registry.yarnpkg.com/@date-io/core/-/core-2.13.1.tgz#f041765aff5c55fbc7e37fdd75fc1792733426d6" - integrity sha512-pVI9nfkf2qClb2Cxdq0Q4zJhdawMG4ybWZUVGifT78FDwzRMX2SwXBb55s5NRJk0HcIicDuxktmCtemZqMH1Zg== - -"@date-io/core@^2.14.0": +"@date-io/core@^2.13.1", "@date-io/core@^2.14.0": version "2.14.0" resolved "https://registry.yarnpkg.com/@date-io/core/-/core-2.14.0.tgz#03e9b9b9fc8e4d561c32dd324df0f3ccd967ef14" integrity sha512-qFN64hiFjmlDHJhu+9xMkdfDG2jLsggNxKXglnekUpXSq8faiqZgtHm2lsHCUuaPDTV6wuXHcCl8J1GQ5wLmPw== -"@date-io/date-fns@^2.11.0": - version "2.13.1" - resolved "https://registry.yarnpkg.com/@date-io/date-fns/-/date-fns-2.13.1.tgz#19d8a245dab61c03c95ba492d679d98d2b0b4af5" - integrity sha512-8fmfwjiLMpFLD+t4NBwDx0eblWnNcgt4NgfT/uiiQTGI81fnPu9tpBMYdAcuWxaV7LLpXgzLBx1SYWAMDVUDQQ== - dependencies: - "@date-io/core" "^2.13.1" - -"@date-io/date-fns@^2.14.0": +"@date-io/date-fns@^2.11.0", "@date-io/date-fns@^2.14.0": version "2.14.0" resolved "https://registry.yarnpkg.com/@date-io/date-fns/-/date-fns-2.14.0.tgz#92ab150f488f294c135c873350d154803cebdbea" integrity sha512-4fJctdVyOd5cKIKGaWUM+s3MUXMuzkZaHuTY15PH70kU1YTMrCoauA7hgQVx9qj0ZEbGrH9VSPYJYnYro7nKiA== dependencies: "@date-io/core" "^2.14.0" -"@date-io/dayjs@^2.11.0": - version "2.13.1" - resolved "https://registry.yarnpkg.com/@date-io/dayjs/-/dayjs-2.13.1.tgz#98461d22ee98179b9f2dca3b36f1b618704ae593" - integrity sha512-5bL4WWWmlI4uGZVScANhHJV7Mjp93ec2gNeUHDqqLaMZhp51S0NgD25oqj/k0LqBn1cdU2MvzNpk/ObMmVv5cQ== - dependencies: - "@date-io/core" "^2.13.1" - -"@date-io/dayjs@^2.14.0": +"@date-io/dayjs@^2.11.0", "@date-io/dayjs@^2.14.0": version "2.14.0" resolved "https://registry.yarnpkg.com/@date-io/dayjs/-/dayjs-2.14.0.tgz#8d4e93e1d473bb5f25210866204dc33384ca4c20" integrity sha512-4fRvNWaOh7AjvOyJ4h6FYMS7VHLQnIEeAV5ahv6sKYWx+1g1UwYup8h7+gPuoF+sW2hTScxi7PVaba2Jk/U8Og== dependencies: "@date-io/core" "^2.14.0" -"@date-io/luxon@^2.11.1": - version "2.13.1" - resolved "https://registry.yarnpkg.com/@date-io/luxon/-/luxon-2.13.1.tgz#3701b3cabfffda5102af302979aa6e58acfda91a" - integrity sha512-yG+uM7lXfwLyKKEwjvP8oZ7qblpmfl9gxQYae55ifbwiTs0CoCTkYkxEaQHGkYtTqGTzLqcb0O9Pzx6vgWg+yg== - dependencies: - "@date-io/core" "^2.13.1" - -"@date-io/luxon@^2.14.0": +"@date-io/luxon@^2.11.1", "@date-io/luxon@^2.14.0": version "2.14.0" resolved "https://registry.yarnpkg.com/@date-io/luxon/-/luxon-2.14.0.tgz#cd1641229e00a899625895de3a31e3aaaf66629f" integrity sha512-KmpBKkQFJ/YwZgVd0T3h+br/O0uL9ZdE7mn903VPAG2ZZncEmaUfUdYKFT7v7GyIKJ4KzCp379CRthEbxevEVg== dependencies: "@date-io/core" "^2.14.0" -"@date-io/moment@^2.11.0": - version "2.13.1" - resolved "https://registry.yarnpkg.com/@date-io/moment/-/moment-2.13.1.tgz#122a51e4bdedf71ff3babb264427737dc022c1e6" - integrity sha512-XX1X/Tlvl3TdqQy2j0ZUtEJV6Rl8tOyc5WOS3ki52He28Uzme4Ro/JuPWTMBDH63weSWIZDlbR7zBgp3ZA2y1A== - dependencies: - "@date-io/core" "^2.13.1" - -"@date-io/moment@^2.14.0": +"@date-io/moment@^2.11.0", "@date-io/moment@^2.14.0": version "2.14.0" resolved "https://registry.yarnpkg.com/@date-io/moment/-/moment-2.14.0.tgz#8300abd6ae8c55d8edee90d118db3cef0b1d4f58" integrity sha512-VsoLXs94GsZ49ecWuvFbsa081zEv2xxG7d+izJsqGa2L8RPZLlwk27ANh87+SNnOUpp+qy2AoCAf0mx4XXhioA== @@ -2085,18 +1312,7 @@ source-map "^0.5.7" stylis "4.0.13" -"@emotion/cache@*", "@emotion/cache@^11.7.1": - version "11.7.1" - resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.7.1.tgz#08d080e396a42e0037848214e8aa7bf879065539" - integrity sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A== - dependencies: - "@emotion/memoize" "^0.7.4" - "@emotion/sheet" "^1.1.0" - "@emotion/utils" "^1.0.0" - "@emotion/weak-memoize" "^0.2.5" - stylis "4.0.13" - -"@emotion/cache@^11.9.3": +"@emotion/cache@*", "@emotion/cache@^11.7.1", "@emotion/cache@^11.9.3": version "11.9.3" resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.9.3.tgz#96638449f6929fd18062cfe04d79b29b44c0d6cb" integrity sha512-0dgkI/JKlCXa+lEXviaMtGBL0ynpx4osh7rjOXE71q9bIF8G+XhJgvi+wDu0B0IdCVx37BffiwXlN9I3UuzFvg== @@ -2112,14 +1328,7 @@ resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== -"@emotion/is-prop-valid@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.1.2.tgz#34ad6e98e871aa6f7a20469b602911b8b11b3a95" - integrity sha512-3QnhqeL+WW88YjYbQL5gUIkthuMw7a0NGbZ7wfFVk2kg/CK5w8w5FFa0RzWjyY1+sujN0NWbtSHH6OJmWHtJpQ== - dependencies: - "@emotion/memoize" "^0.7.4" - -"@emotion/is-prop-valid@^1.1.3": +"@emotion/is-prop-valid@^1.1.2", "@emotion/is-prop-valid@^1.1.3": version "1.1.3" resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.1.3.tgz#f0907a416368cf8df9e410117068e20fe87c0a3a" integrity sha512-RFg04p6C+1uO19uG8N+vqanzKqiM9eeV1LDOG3bmkYmuOj7NbKNlFC/4EZq5gnwAIlcC/jOT24f8Td0iax2SXA== @@ -2144,7 +1353,7 @@ "@emotion/weak-memoize" "^0.2.5" hoist-non-react-statics "^3.3.1" -"@emotion/serialize@*", "@emotion/serialize@^1.0.3": +"@emotion/serialize@*", "@emotion/serialize@^1.0.2", "@emotion/serialize@^1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.0.3.tgz#99e2060c26c6292469fb30db41f4690e1c8fea63" integrity sha512-2mSSvgLfyV3q+iVh3YWgNlUc2a9ZlDU7DjuP5MjK3AXRR0dYigCrP99aeFtaB2L/hjfEZdSThn5dsZ0ufqbvsA== @@ -2155,23 +1364,7 @@ "@emotion/utils" "^1.0.0" csstype "^3.0.2" -"@emotion/serialize@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.0.2.tgz#77cb21a0571c9f68eb66087754a65fa97bfcd965" - integrity sha512-95MgNJ9+/ajxU7QIAruiOAdYNjxZX7G2mhgrtDWswA21VviYIRP1R5QilZ/bDY42xiKsaktP4egJb3QdYQZi1A== - dependencies: - "@emotion/hash" "^0.8.0" - "@emotion/memoize" "^0.7.4" - "@emotion/unitless" "^0.7.5" - "@emotion/utils" "^1.0.0" - csstype "^3.0.2" - -"@emotion/sheet@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.1.0.tgz#56d99c41f0a1cda2726a05aa6a20afd4c63e58d2" - integrity sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g== - -"@emotion/sheet@^1.1.1": +"@emotion/sheet@^1.1.0", "@emotion/sheet@^1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.1.1.tgz#015756e2a9a3c7c5f11d8ec22966a8dbfbfac787" integrity sha512-J3YPccVRMiTZxYAY0IOq3kd+hUP8idY8Kz6B/Cyo+JuXq52Ek+zbPbSQUrVQp95aJ+lsAW7DPL1P2Z+U1jGkKA== @@ -2192,16 +1385,11 @@ resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== -"@emotion/utils@*", "@emotion/utils@^1.1.0": +"@emotion/utils@*", "@emotion/utils@^1.0.0", "@emotion/utils@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.1.0.tgz#86b0b297f3f1a0f2bdb08eeac9a2f49afd40d0cf" integrity sha512-iRLa/Y4Rs5H/f2nimczYmS5kFJEbpiVvgN3XVfZ022IYhuNA1IRSHEizcof88LtCTXtl9S2Cxt32KgaXEu72JQ== -"@emotion/utils@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.0.0.tgz#abe06a83160b10570816c913990245813a2fd6af" - integrity sha512-mQC2b3XLDs6QCW+pDQDiyO/EdGZYOygE8s5N5rrzjSI4M3IejPE/JPndCBwRT9z982aqQNi6beWs1UeayrQxxA== - "@emotion/weak-memoize@^0.2.5": version "0.2.5" resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46" @@ -2877,15 +2065,7 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== -"@jridgewell/trace-mapping@^0.3.0": - version "0.3.4" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz#f6a0832dffd5b8a6aaa633b7d9f8e8e94c83a0c3" - integrity sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/trace-mapping@^0.3.9": +"@jridgewell/trace-mapping@^0.3.0", "@jridgewell/trace-mapping@^0.3.9": version "0.3.14" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed" integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ== @@ -3027,16 +2207,7 @@ react-is "^18.2.0" react-transition-group "^4.4.2" -"@mui/private-theming@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.6.0.tgz#b907e055a0a19caf554d5b43209a143edaa9b398" - integrity sha512-62jUFaMGfW3nvq/worcOAEiY++rWd44tpWShq4o97DybWmmWvEFYlBIuHEcXrtBIK/cloaQw8jqelQIFZeiVdw== - dependencies: - "@babel/runtime" "^7.17.2" - "@mui/utils" "^5.6.0" - prop-types "^15.7.2" - -"@mui/private-theming@^5.9.1": +"@mui/private-theming@^5.6.0", "@mui/private-theming@^5.9.1": version "5.9.1" resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.9.1.tgz#4f714ed9ebd587373dc77b3fc69e9f3e720f0190" integrity sha512-eIh2IZJInNTdgPLMo9cruzm8UDX5amBBxxsSoNre7lRj3wcsu3TG5OKjIbzkf4VxHHEhdPeNNQyt92k7L78u2A== @@ -3045,16 +2216,7 @@ "@mui/utils" "^5.9.1" prop-types "^15.8.1" -"@mui/styled-engine@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-5.6.0.tgz#c7c34d2e319158559cef49b796457a4e6a4c58f7" - integrity sha512-K1WPKTruJTPA49cub0HtDCBBvosPKizqgZ4RenAfWz/ldlFtM4p7e7Mt3YEnNWTOJMHvDGcEke1tCuELkVAMyA== - dependencies: - "@babel/runtime" "^7.17.2" - "@emotion/cache" "^11.7.1" - prop-types "^15.7.2" - -"@mui/styled-engine@^5.8.7": +"@mui/styled-engine@^5.6.0", "@mui/styled-engine@^5.8.7": version "5.8.7" resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-5.8.7.tgz#63d0779c07677fe76d4705a02c7ae99f89b50780" integrity sha512-tVqtowjbYmiRq+qcqXK731L9eWoL9H8xTRhuTgaDGKdch1zlt4I2UwInUe1w2N9N/u3/jHsFbLcl1Un3uOwpQg== @@ -3064,21 +2226,7 @@ csstype "^3.1.0" prop-types "^15.8.1" -"@mui/system@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.6.0.tgz#4d6db0db6a8daf90acd7fcaab3a353aa127987ce" - integrity sha512-FoytH73hY78Dll6F0fg7AI/hnpplygbFeW0HsqBfwFWrt2PMc2YSq2ICqHzd2CZPIhzEgRHDTSI8bMTLtG9W7A== - dependencies: - "@babel/runtime" "^7.17.2" - "@mui/private-theming" "^5.6.0" - "@mui/styled-engine" "^5.6.0" - "@mui/types" "^7.1.3" - "@mui/utils" "^5.6.0" - clsx "^1.1.1" - csstype "^3.0.11" - prop-types "^15.7.2" - -"@mui/system@^5.9.1": +"@mui/system@^5.6.0", "@mui/system@^5.9.1": version "5.9.1" resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.9.1.tgz#dadd1094b1582781cc524b112a0a126f60b23c25" integrity sha512-ZixTmc2+sYp++avoYJ38eM70nfwwudN06vYCU4kfwa4nQPiH+bhLYZnfYkcXRKiDR/hfT0dptbOOfQGZqBYczQ== @@ -3092,39 +2240,12 @@ csstype "^3.1.0" prop-types "^15.8.1" -"@mui/types@^7.1.3": - version "7.1.3" - resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.1.3.tgz#d7636f3046110bcccc63e6acfd100e2ad9ca712a" - integrity sha512-DDF0UhMBo4Uezlk+6QxrlDbchF79XG6Zs0zIewlR4c0Dt6GKVFfUtzPtHCH1tTbcSlq/L2bGEdiaoHBJ9Y1gSA== - -"@mui/types@^7.1.4": +"@mui/types@^7.1.3", "@mui/types@^7.1.4": version "7.1.4" resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.1.4.tgz#4185c05d6df63ec673cda15feab80440abadc764" integrity sha512-uveM3byMbthO+6tXZ1n2zm0W3uJCQYtwt/v5zV5I77v2v18u0ITkb8xwhsDD2i3V2Kye7SaNR6FFJ6lMuY/WqQ== -"@mui/utils@^5.2.3", "@mui/utils@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.6.0.tgz#0ec741f5ac7c89ac76054832bed2d6e17ab1c011" - integrity sha512-LbZKkCOn4243vbEVGbaKV7t6eN6kz7t95DR6AcUCRk4daH3l7CXPYkWsyzysRWdXgSzHmIyrgg4FZKzTy0dTHQ== - dependencies: - "@babel/runtime" "^7.17.2" - "@types/prop-types" "^15.7.4" - "@types/react-is" "^16.7.1 || ^17.0.0" - prop-types "^15.7.2" - react-is "^17.0.2" - -"@mui/utils@^5.7.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.8.0.tgz#4b1d19cbcf70773283375e763b7b3552b84cb58f" - integrity sha512-7LgUtCvz78676iC0wpTH7HizMdCrTphhBmRWimIMFrp5Ph6JbDFVuKS1CwYnWWxRyYKL0QzXrDL0lptAU90EXg== - dependencies: - "@babel/runtime" "^7.17.2" - "@types/prop-types" "^15.7.5" - "@types/react-is" "^16.7.1 || ^17.0.0" - prop-types "^15.8.1" - react-is "^17.0.2" - -"@mui/utils@^5.9.1": +"@mui/utils@^5.2.3", "@mui/utils@^5.6.0", "@mui/utils@^5.7.0", "@mui/utils@^5.9.1": version "5.9.1" resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.9.1.tgz#2b2c9dadbf8ba6561e145b5688fb7df5ef15a934" integrity sha512-8+4adOR3xusyJwvbnZxcjqcmbWvl7Og+260ZKIrSvwnFs0aLubL+8MhiceeDDGcmb0bTKxfUgRJ96j32Jb7P+A== @@ -3671,18 +2792,7 @@ resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.2.tgz#ed4e0ad92306a704f9fb132a0cfcf77486dbe2bc" integrity sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig== -"@types/babel__core@^7.0.0": - version "7.1.12" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.12.tgz#4d8e9e51eb265552a7e4f1ff2219ab6133bdfb2d" - integrity sha512-wMTHiiTiBAAPebqaPiPDLFA4LYPKr6Ph0Xq/6rq1Ur3v66HXyG+clfR9CNETkD7MQS8ZHvpQOtA53DLws5WAEQ== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__core@^7.1.14": +"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": version "7.1.19" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460" integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw== @@ -3783,21 +2893,16 @@ "@types/estree" "*" "@types/json-schema" "*" -"@types/estree@*": - version "0.0.46" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.46.tgz#0fb6bfbbeabd7a30880504993369c4bf1deab1fe" - integrity sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg== +"@types/estree@*", "@types/estree@^0.0.51": + version "0.0.51" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" + integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== "@types/estree@0.0.39": version "0.0.39" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== -"@types/estree@^0.0.51": - version "0.0.51" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" - integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== - "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18": version "4.17.28" resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz#c47def9f34ec81dc6328d0b1b5303d1ec98d86b8" @@ -3836,12 +2941,7 @@ dependencies: "@types/unist" "*" -"@types/history@*": - version "4.7.9" - resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.9.tgz#1cfb6d60ef3822c589f18e70f8b12f9a28ce8724" - integrity sha512-MUc6zSmU3tEVnkQ78q0peeEjKWPUADMlC/t++2bI8WnAG2tvYRPIgHG8lWkXwqc8MsUF6Z2MOf+Mh5sazOmhiQ== - -"@types/history@^4.7.11": +"@types/history@*", "@types/history@^4.7.11": version "4.7.11" resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.11.tgz#56588b17ae8f50c53983a524fc3cc47437969d64" integrity sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA== @@ -3866,16 +2966,11 @@ dependencies: "@types/node" "*" -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.4" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== -"@types/istanbul-lib-coverage@^2.0.1": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" - integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== - "@types/istanbul-lib-report@*": version "3.0.0" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" @@ -3890,15 +2985,7 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@*": - version "26.0.24" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.24.tgz#943d11976b16739185913a1936e0de0c4a7d595a" - integrity sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w== - dependencies: - jest-diff "^26.0.0" - pretty-format "^26.0.0" - -"@types/jest@^27.4.1": +"@types/jest@*", "@types/jest@^27.4.1": version "27.4.1" resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.4.1.tgz#185cbe2926eaaf9662d340cc02e548ce9e11ab6d" integrity sha512-23iPJADSmicDVrWk+HT58LMJtzLAnB2AgIzplQuq/bSrGaxCrlvRFjGbXmamnnk/mAmCdLStiGqggu28ocUyiw== @@ -3906,12 +2993,7 @@ jest-matcher-utils "^27.0.0" pretty-format "^27.0.0" -"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.6": - version "7.0.7" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" - integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== - -"@types/json-schema@^7.0.4", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.6", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.11" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== @@ -3935,12 +3017,7 @@ dependencies: "@types/lodash" "*" -"@types/lodash@*": - version "4.14.181" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.181.tgz#d1d3740c379fda17ab175165ba04e2d03389385d" - integrity sha512-n3tyKthHJbkiWhDZs3DkhkCzt2MexYHXlX0td5iMplyfwketaOeKboEVBqzceH7juqvEg3q5oUoBFxSLu7zFag== - -"@types/lodash@^4.14.175": +"@types/lodash@*", "@types/lodash@^4.14.175": version "4.14.182" resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.182.tgz#05301a4d5e62963227eaafe0ce04dd77c54ea5c2" integrity sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q== @@ -4093,14 +3170,7 @@ "@types/history" "*" "@types/react" "*" -"@types/react-transition-group@^4.4.4": - version "4.4.4" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.4.tgz#acd4cceaa2be6b757db61ed7b432e103242d163e" - integrity sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug== - dependencies: - "@types/react" "*" - -"@types/react-transition-group@^4.4.5": +"@types/react-transition-group@^4.4.4", "@types/react-transition-group@^4.4.5": version "4.4.5" resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.5.tgz#aae20dcf773c5aa275d5b9f7cdbca638abc5e416" integrity sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA== @@ -4469,15 +3539,7 @@ abab@^2.0.3, abab@^2.0.5: resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== -accepts@~1.3.4, accepts@~1.3.5: - version "1.3.7" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" - integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== - dependencies: - mime-types "~2.1.24" - negotiator "0.6.2" - -accepts@~1.3.8: +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== @@ -4624,14 +3686,7 @@ anser@^1.4.1: resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.10.tgz#befa3eddf282684bd03b63dcda3927aef8c2e35b" integrity sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww== -ansi-escapes@^4.2.1, ansi-escapes@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" - integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== - dependencies: - type-fest "^0.11.0" - -ansi-escapes@^4.3.0: +ansi-escapes@^4.2.1, ansi-escapes@^4.3.0, ansi-escapes@^4.3.1: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== @@ -4685,15 +3740,7 @@ ansi-to-react@^6.1.6: anser "^1.4.1" escape-carriage "^1.3.0" -anymatch@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" - integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -anymatch@~3.1.2: +anymatch@^3.0.3, anymatch@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== @@ -5134,18 +4181,7 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.3: - version "4.16.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.3.tgz#340aa46940d7db878748567c5dea24a48ddf3717" - integrity sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw== - dependencies: - caniuse-lite "^1.0.30001181" - colorette "^1.2.1" - electron-to-chromium "^1.3.649" - escalade "^3.1.1" - node-releases "^1.1.70" - -browserslist@^4.16.6, browserslist@^4.17.5, browserslist@^4.18.1, browserslist@^4.19.1, browserslist@^4.20.2: +browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.3, browserslist@^4.16.6, browserslist@^4.17.5, browserslist@^4.18.1, browserslist@^4.19.1, browserslist@^4.20.2: version "4.20.2" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.2.tgz#567b41508757ecd904dab4d1c646c612cd3d4f88" integrity sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA== @@ -5239,12 +4275,7 @@ camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" - integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== - -camelcase@^6.2.1: +camelcase@^6.2.0, camelcase@^6.2.1: version "6.3.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== @@ -5420,12 +4451,7 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" -clsx@^1.1.0, clsx@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" - integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== - -clsx@^1.2.1: +clsx@^1.1.0, clsx@^1.1.1, clsx@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== @@ -5602,14 +4628,7 @@ content-type@~1.0.4: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== -convert-source-map@^1.4.0, convert-source-map@^1.6.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== - dependencies: - safe-buffer "~5.1.1" - -convert-source-map@^1.5.0, convert-source-map@^1.5.1, convert-source-map@^1.7.0: +convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1, convert-source-map@^1.6.0, convert-source-map@^1.7.0: version "1.8.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== @@ -5626,7 +4645,7 @@ cookie@0.4.2: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== -core-js-compat@^3.20.2, core-js-compat@^3.21.0: +core-js-compat@^3.20.2, core-js-compat@^3.21.0, core-js-compat@^3.8.0: version "3.21.1" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.21.1.tgz#cac369f67c8d134ff8f9bd1623e3bc2c42068c82" integrity sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g== @@ -5634,14 +4653,6 @@ core-js-compat@^3.20.2, core-js-compat@^3.21.0: browserslist "^4.19.1" semver "7.0.0" -core-js-compat@^3.8.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.9.0.tgz#29da39385f16b71e1915565aa0385c4e0963ad56" - integrity sha512-YK6fwFjCOKWwGnjFUR3c544YsnA/7DoLL0ysncuOJ4pwbriAtOpvM2bygdlcXbvQCQZ7bBU9CL4t7tGl7ETRpQ== - dependencies: - browserslist "^4.16.3" - semver "7.0.0" - core-js-pure@^3.20.2, core-js-pure@^3.8.1: version "3.21.1" resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.21.1.tgz#8c4d1e78839f5f46208de7230cebfb72bc3bdb51" @@ -5836,15 +4847,7 @@ css-tree@1.0.0-alpha.37: mdn-data "2.0.4" source-map "^0.6.1" -css-tree@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.2.tgz#9ae393b5dafd7dae8a622475caec78d3d8fbd7b5" - integrity sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ== - dependencies: - mdn-data "2.0.14" - source-map "^0.6.1" - -css-tree@^1.1.3: +css-tree@^1.1.2, css-tree@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== @@ -5959,12 +4962,7 @@ cssstyle@^2.3.0: dependencies: cssom "~0.3.6" -csstype@^3.0.11, csstype@^3.0.2: - version "3.0.11" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.11.tgz#d66700c5eacfac1940deb4e3ee5642792d85cd33" - integrity sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw== - -csstype@^3.1.0: +csstype@^3.0.11, csstype@^3.0.2, csstype@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.0.tgz#4ddcac3718d787cf9df0d1b7d15033925c8f29f2" integrity sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA== @@ -6208,12 +5206,7 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dom-accessibility-api@^0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.7.tgz#8c2aa6325968f2933160a0b7dbb380893ddf3e7d" - integrity sha512-ml3lJIq9YjUfM9TUnEPvEYWFSwivwIGBPKpewX7tii7fwCazA8yCioGdqQcNsItPpfFvSJ3VIdMQPj60LJhcQA== - -dom-accessibility-api@^0.5.9: +dom-accessibility-api@^0.5.6, dom-accessibility-api@^0.5.9: version "0.5.14" resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz#56082f71b1dc7aac69d83c4285eef39c15d93f56" integrity sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg== @@ -6255,12 +5248,7 @@ domelementtype@1: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== -domelementtype@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.1.0.tgz#a851c080a6d1c3d94344aed151d99f669edf585e" - integrity sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w== - -domelementtype@^2.2.0: +domelementtype@^2.0.1, domelementtype@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== @@ -6348,12 +5336,7 @@ ejs@^3.1.5, ejs@^3.1.6: dependencies: jake "^10.8.5" -electron-to-chromium@^1.3.649: - version "1.3.671" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.671.tgz#8feaed6eae42d279fa4611f58c42a5a1eb81b2a0" - integrity sha512-RTD97QkdrJKaKwRv9h/wGAaoR2lGxNXEcBXS31vjitgTPwTWAbLdS7cEsBK68eEQy7p6YyT8D5BxBEYHu2SuwQ== - -electron-to-chromium@^1.4.84: +electron-to-chromium@^1.3.649, electron-to-chromium@^1.4.84: version "1.4.106" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.106.tgz#e7a3bfa9d745dd9b9e597616cb17283cc349781a" integrity sha512-ZYfpVLULm67K7CaaGP7DmjyeMY4naxsbTy+syVVxT6QHI1Ww8XbJjmr9fDckrhq44WzCrcC5kH3zGpdusxwwqg== @@ -6417,44 +5400,7 @@ error-stack-parser@^2.0.6: dependencies: stackframe "^1.1.1" -es-abstract@^1.17.2: - version "1.17.7" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.7.tgz#a4de61b2f66989fc7421676c1cb9787573ace54c" - integrity sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g== - dependencies: - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.2.2" - is-regex "^1.1.1" - object-inspect "^1.8.0" - object-keys "^1.1.1" - object.assign "^4.1.1" - string.prototype.trimend "^1.0.1" - string.prototype.trimstart "^1.0.1" - -es-abstract@^1.18.0-next.1: - version "1.18.0-next.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.2.tgz#088101a55f0541f595e7e057199e27ddc8f3a5c2" - integrity sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw== - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.2.2" - is-negative-zero "^2.0.1" - is-regex "^1.1.1" - object-inspect "^1.9.0" - object-keys "^1.1.1" - object.assign "^4.1.2" - string.prototype.trimend "^1.0.3" - string.prototype.trimstart "^1.0.3" - -es-abstract@^1.18.0-next.2, es-abstract@^1.19.0, es-abstract@^1.19.1: +es-abstract@^1.17.2, es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2, es-abstract@^1.19.0, es-abstract@^1.19.1: version "1.19.2" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.2.tgz#8f7b696d8f15b167ae3640b4060670f3d054143f" integrity sha512-gfSBJoZdlL2xRiOCy0g8gLMryhoe1TlimjzU99L/31Z8QEGIhVQI+EWwt5lT+AuU9SnorVupXFqqOGqGfsyO6w== @@ -6831,12 +5777,7 @@ estraverse@^4.1.1, estraverse@^4.2.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" - integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== - -estraverse@^5.2.0, estraverse@^5.3.0: +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== @@ -6980,20 +5921,13 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" -faye-websocket@0.11.4: +faye-websocket@0.11.4, faye-websocket@^0.11.3: version "0.11.4" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== dependencies: websocket-driver ">=0.5.1" -faye-websocket@^0.11.3: - version "0.11.3" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e" - integrity sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA== - dependencies: - websocket-driver ">=0.5.1" - fb-watchman@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" @@ -7416,12 +6350,7 @@ globby@^11.0.4: merge2 "^1.4.1" slash "^3.0.0" -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: - version "4.2.6" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" - integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== - -graceful-fs@^4.2.6, graceful-fs@^4.2.9: +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== @@ -7982,20 +6911,13 @@ is-callable@^1.1.4, is-callable@^1.2.2, is-callable@^1.2.4: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== -is-core-module@^2.1.0: +is-core-module@^2.1.0, is-core-module@^2.2.0, is-core-module@^2.8.1: version "2.9.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== dependencies: has "^1.0.3" -is-core-module@^2.2.0, is-core-module@^2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" - integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== - dependencies: - has "^1.0.3" - is-date-object@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" @@ -8008,12 +6930,7 @@ is-decimal@^2.0.0: resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-2.0.1.tgz#9469d2dc190d0214fd87d78b78caecc0cc14eef7" integrity sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A== -is-docker@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156" - integrity sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw== - -is-docker@^2.1.1: +is-docker@^2.0.0, is-docker@^2.1.1: version "2.2.1" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== @@ -8038,14 +6955,7 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -is-glob@^4.0.0, is-glob@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== - dependencies: - is-extglob "^2.1.1" - -is-glob@^4.0.1, is-glob@^4.0.3: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== @@ -8195,12 +7105,7 @@ isomorphic-fetch@^2.2.1: node-fetch "^1.0.1" whatwg-fetch ">=0.10.0" -istanbul-lib-coverage@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" - integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== - -istanbul-lib-coverage@^3.2.0: +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== @@ -8823,7 +7728,7 @@ json2csv@^5.0.7: jsonparse "^1.3.1" lodash.get "^4.4.2" -json5@2.x, json5@^2.2.0, json5@^2.2.1: +json5@2.x, json5@^2.1.2, json5@^2.2.0, json5@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== @@ -8835,13 +7740,6 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.1.2: - 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" - jsonc-parser@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.0.0.tgz#abdd785701c7e7eaca8a9ec8cf070ca51a745a22" @@ -8874,7 +7772,7 @@ jsonpointer@^5.0.0: array-includes "^3.1.4" object.assign "^4.1.2" -jszip@^3.10.0: +jszip@^3.10.0, jszip@^3.6.0: version "3.10.0" resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.0.tgz#faf3db2b4b8515425e34effcdbb086750a346061" integrity sha512-LDfVtOLtOxb9RXkYOwPyNBTQDL4eUbqahtoY6x07GiDJHwSYvn8sHHIw8wINImV3MqbMNve2gSuM1DDqEKk09Q== @@ -8884,16 +7782,6 @@ jszip@^3.10.0: readable-stream "~2.3.6" setimmediate "^1.0.5" -jszip@^3.6.0: - version "3.7.1" - resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.7.1.tgz#bd63401221c15625a1228c556ca8a68da6fda3d9" - integrity sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg== - dependencies: - lie "~3.3.0" - pako "~1.0.2" - readable-stream "~2.3.6" - set-immediate-shim "~1.0.1" - kind-of@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" @@ -8909,12 +7797,7 @@ kleur@^4.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.4.tgz#8c202987d7e577766d039a8cd461934c01cda04d" integrity sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA== -klona@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.4.tgz#7bb1e3affb0cb8624547ef7e8f6708ea2e39dfc0" - integrity sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA== - -klona@^2.0.5: +klona@^2.0.4, klona@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== @@ -9361,12 +8244,7 @@ mdast-util-to-string@^3.0.0, mdast-util-to-string@^3.1.0: resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz#56c506d065fbf769515235e577b5a261552d56e9" integrity sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA== -mdi-material-ui@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/mdi-material-ui/-/mdi-material-ui-7.2.0.tgz#e4746b123fd3a438b1cde39eb44329a4c761162d" - integrity sha512-tJnT4fY+gJmlq/wt4GYCV5qezOs/cuSysg6N3KRkl2/8dSpyZsL/P5lN4UWZ2ayViwhoRUHns/FCKFnMngJd0g== - -mdi-material-ui@^7.3.0: +mdi-material-ui@^7.2.0, mdi-material-ui@^7.3.0: version "7.3.0" resolved "https://registry.yarnpkg.com/mdi-material-ui/-/mdi-material-ui-7.3.0.tgz#db3ed681d35ae12c37fb1c95bcfe679a1be80c0b" integrity sha512-BJ4JF+LlO/aYcOg9wrgbzRiInyRH6padgfBdJpoPNc3CoZDaik9ARTP3PWzgMjRSQQZ2KvxtFVpOHDkHfrc2Fw== @@ -9705,15 +8583,7 @@ micromark@^3.0.0: micromark-util-types "^1.0.1" uvu "^0.5.0" -micromatch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" - integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== - dependencies: - braces "^3.0.1" - picomatch "^2.0.5" - -micromatch@^4.0.4: +micromatch@^4.0.2, micromatch@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== @@ -9721,24 +8591,17 @@ micromatch@^4.0.4: braces "^3.0.2" picomatch "^2.3.1" -mime-db@1.46.0, "mime-db@>= 1.43.0 < 2": +mime-db@1.46.0: version "1.46.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.46.0.tgz#6267748a7f799594de3cbc8cde91def349661cee" integrity sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ== -mime-db@1.52.0: +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.17, mime-types@~2.1.24: - version "2.1.29" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.29.tgz#1d4ab77da64b91f5f72489df29236563754bb1b2" - integrity sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ== - dependencies: - mime-db "1.46.0" - -mime-types@^2.1.31, mime-types@~2.1.34: +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -9798,20 +8661,13 @@ minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5, minimist@^1. resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== -mkdirp@^0.5.1: +mkdirp@^0.5.1, mkdirp@^0.5.5, mkdirp@~0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: minimist "^1.2.6" -mkdirp@^0.5.5, mkdirp@~0.5.1: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - monaco-editor-auto-typings@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/monaco-editor-auto-typings/-/monaco-editor-auto-typings-0.4.0.tgz#52c0b1c74086fbf23568a0322a505808ecd95566" @@ -9965,20 +8821,13 @@ nth-check@^1.0.2: dependencies: boolbase "~1.0.0" -nth-check@^2.0.0: +nth-check@^2.0.0, nth-check@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== dependencies: boolbase "^1.0.0" -nth-check@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2" - integrity sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w== - dependencies: - boolbase "^1.0.0" - nwsapi@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" @@ -9994,16 +8843,11 @@ object-hash@^2.2.0: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5" integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw== -object-inspect@^1.12.0, object-inspect@^1.9.0: +object-inspect@^1.12.0, object-inspect@^1.8.0, object-inspect@^1.9.0: version "1.12.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== -object-inspect@^1.8.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" - integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== - object-inspect@~1.4.0: version "1.4.1" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.4.1.tgz#37ffb10e71adaf3748d05f713b4c9452f402cbc4" @@ -10059,17 +8903,7 @@ object.hasown@^1.1.0: define-properties "^1.1.3" es-abstract "^1.19.1" -object.values@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.2.tgz#7a2015e06fcb0f546bd652486ce8583a4731c731" - integrity sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" - has "^1.0.3" - -object.values@^1.1.5: +object.values@^1.1.0, object.values@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== @@ -10356,12 +9190,7 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -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#21f333e9b6b8eaff02468f5146ea406d345f4dad" - integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== - -picomatch@^2.2.3, picomatch@^2.3.1: +picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -10890,7 +9719,7 @@ postcss-selector-not@^5.0.0: dependencies: balanced-match "^1.0.0" -postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.6, postcss-selector-parser@^6.0.9: +postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.6, postcss-selector-parser@^6.0.9: version "6.0.10" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== @@ -10898,16 +9727,6 @@ postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.4, postcss-selecto cssesc "^3.0.0" util-deprecate "^1.0.2" -postcss-selector-parser@^6.0.2: - version "6.0.4" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz#56075a1380a04604c38b063ea7767a129af5c2b3" - integrity sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw== - dependencies: - cssesc "^3.0.0" - indexes-of "^1.0.1" - uniq "^1.0.1" - util-deprecate "^1.0.2" - postcss-svgo@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.1.0.tgz#0a317400ced789f233a28826e77523f15857d80d" @@ -10923,12 +9742,7 @@ postcss-unique-selectors@^5.1.1: dependencies: postcss-selector-parser "^6.0.5" -postcss-value-parser@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" - integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== - -postcss-value-parser@^4.2.0: +postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== @@ -10988,17 +9802,7 @@ pretty-format@^26.0.0, pretty-format@^26.6.2: ansi-styles "^4.0.0" react-is "^17.0.1" -pretty-format@^27.0.0: - version "27.0.6" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.0.6.tgz#ab770c47b2c6f893a21aefc57b75da63ef49a11f" - integrity sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ== - dependencies: - "@jest/types" "^27.0.6" - ansi-regex "^5.0.0" - ansi-styles "^5.0.0" - react-is "^17.0.1" - -pretty-format@^27.0.2, pretty-format@^27.5.1: +pretty-format@^27.0.0, pretty-format@^27.0.2, pretty-format@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== @@ -11036,15 +9840,7 @@ promise@^8.1.0: dependencies: asap "~2.0.6" -prompts@^2.0.1: - version "2.4.0" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.0.tgz#4aa5de0723a231d1ee9121c40fdf663df73f61d7" - integrity sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -prompts@^2.4.2: +prompts@^2.0.1, prompts@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== @@ -11052,7 +9848,7 @@ prompts@^2.4.2: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@^15.0.0, prop-types@^15.7.2, prop-types@^15.8.1: +prop-types@^15.0.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -11061,15 +9857,6 @@ prop-types@^15.0.0, prop-types@^15.7.2, prop-types@^15.8.1: object-assign "^4.1.1" react-is "^16.13.1" -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" - property-expr@^2.0.4: version "2.0.5" resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-2.0.5.tgz#278bdb15308ae16af3e3b9640024524f4dc02cb4" @@ -11404,12 +10191,7 @@ react-is@^17.0.1, react-is@^17.0.2: resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== -react-is@^18.0.0: - version "18.1.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.1.0.tgz#61aaed3096d30eacf2a2127118b5b41387d32a67" - integrity sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg== - -react-is@^18.2.0: +react-is@^18.0.0, react-is@^18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== @@ -11922,7 +10704,7 @@ resolve.exports@^1.1.0: resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== -resolve@^1.1.5, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.0: +resolve@^1.1.5, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.0: version "1.22.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== @@ -11931,14 +10713,6 @@ resolve@^1.1.5, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22 path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^1.12.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" - resolve@^2.0.0-next.3: version "2.0.0-next.3" resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46" @@ -12100,16 +10874,7 @@ schema-utils@^2.6.5: ajv "^6.12.4" ajv-keywords "^3.5.2" -schema-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.0.0.tgz#67502f6aa2b66a2d4032b4279a2944978a0913ef" - integrity sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA== - dependencies: - "@types/json-schema" "^7.0.6" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^3.1.0, schema-utils@^3.1.1: +schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== @@ -12138,7 +10903,7 @@ select-hose@^2.0.0: resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= -selenium-webdriver@4.0.0-rc-1: +selenium-webdriver@4.0.0-rc-1, selenium-webdriver@^4.0.0-beta.2: version "4.0.0-rc-1" resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.0.0-rc-1.tgz#b1e7e5821298c8a071e988518dd6b759f0c41281" integrity sha512-bcrwFPRax8fifRP60p7xkWDGSJJoMkPAzufMlk5K2NyLPht/YZzR2WcIk1+3gR8VOCLlst1P2PI+MXACaFzpIw== @@ -12148,16 +10913,6 @@ selenium-webdriver@4.0.0-rc-1: tmp "^0.2.1" ws ">=7.4.6" -selenium-webdriver@^4.0.0-beta.2: - version "4.0.0-beta.4" - resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.0.0-beta.4.tgz#db4fc7505a515ea3b4a95ded031b738a1544eddd" - integrity sha512-+s/CIYkWzmnC9WASBxxVj7Lm0dcyl6OaFxwIJaFCT5WCuACiimEEr4lUnOOFP/QlKfkDQ56m+aRczaq2EvJEJg== - dependencies: - jszip "^3.6.0" - rimraf "^3.0.2" - tmp "^0.2.1" - ws ">=7.4.6" - selfsigned@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.0.1.tgz#8b2df7fa56bf014d19b6007655fff209c0ef0a56" @@ -12170,7 +10925,7 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@7.x: +semver@7.x, semver@^7.3.2, semver@^7.3.5: version "7.3.7" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== @@ -12187,20 +10942,6 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.3.2: - version "7.3.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" - integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== - dependencies: - lru-cache "^6.0.0" - -semver@^7.3.5: - version "7.3.6" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.6.tgz#5d73886fb9c0c6602e79440b97165c29581cbb2b" - integrity sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w== - dependencies: - lru-cache "^7.4.0" - send@0.17.2: version "0.17.2" resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" @@ -12610,15 +11351,7 @@ string.prototype.matchall@^4.0.6: regexp.prototype.flags "^1.4.1" side-channel "^1.0.4" -string.prototype.trimend@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz#a22bd53cca5c7cf44d7c9d5c732118873d6cd18b" - integrity sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - -string.prototype.trimend@^1.0.3, string.prototype.trimend@^1.0.4: +string.prototype.trimend@^1.0.1, string.prototype.trimend@^1.0.3, string.prototype.trimend@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== @@ -12626,15 +11359,7 @@ string.prototype.trimend@^1.0.3, string.prototype.trimend@^1.0.4: call-bind "^1.0.2" define-properties "^1.1.3" -string.prototype.trimstart@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz#9b4cb590e123bb36564401d59824298de50fd5aa" - integrity sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - -string.prototype.trimstart@^1.0.3, string.prototype.trimstart@^1.0.4: +string.prototype.trimstart@^1.0.1, string.prototype.trimstart@^1.0.3, string.prototype.trimstart@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== @@ -12680,14 +11405,7 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== - dependencies: - ansi-regex "^5.0.0" - -strip-ansi@^6.0.1: +strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -13042,14 +11760,7 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" -tr46@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.0.2.tgz#03273586def1595ae08fedb38d7733cee91d2479" - integrity sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg== - dependencies: - punycode "^2.1.1" - -tr46@^2.1.0: +tr46@^2.0.2, tr46@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== @@ -13119,21 +11830,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.1: +tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0: version "2.4.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== -tslib@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" - integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== - -tslib@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" - integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== - tss-react@^3.6.2: version "3.6.2" resolved "https://registry.yarnpkg.com/tss-react/-/tss-react-3.6.2.tgz#5e995d8b82ca730ba04a21203ae68f1c5372a85e" @@ -13787,16 +12488,7 @@ whatwg-url@^7.0.0: tr46 "^1.0.1" webidl-conversions "^4.0.2" -whatwg-url@^8.0.0: - version "8.4.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.4.0.tgz#50fb9615b05469591d2b2bd6dfaed2942ed72837" - integrity sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw== - dependencies: - lodash.sortby "^4.7.0" - tr46 "^2.0.2" - webidl-conversions "^6.1.0" - -whatwg-url@^8.5.0: +whatwg-url@^8.0.0, whatwg-url@^8.5.0: version "8.7.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== @@ -14042,21 +12734,16 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -ws@>=7.4.6: - version "8.2.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.0.tgz#0b738cd484bfc9303421914b11bb4011e07615bb" - integrity sha512-uYhVJ/m9oXwEI04iIVmgLmugh2qrZihkywG9y5FfZV2ATeLIzHf93qs+tUNqlttbQK957/VX3mtwAS+UfIwA4g== +ws@>=7.4.6, ws@^8.4.2: + version "8.5.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" + integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== ws@^7.4.6: version "7.5.7" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A== -ws@^8.4.2: - version "8.5.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" - integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== - xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" @@ -14082,16 +12769,11 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@^1.10.0, yaml@^1.10.2, yaml@^1.5.0: +yaml@^1.10.0, yaml@^1.10.2, yaml@^1.5.0, yaml@^1.7.2: version "1.10.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yaml@^1.7.2: - version "1.10.0" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" - integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== - yargs-parser@^20.2.2, yargs-parser@^20.x: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" From 8abe5f9636f8efc698f6b45c9a99705eb9486737 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Tue, 11 Oct 2022 17:23:58 +1100 Subject: [PATCH 171/309] ROWY-710 NewColumnModal: remove short text as default field type --- package.json | 2 +- .../ColumnModals/NewColumnModal.tsx | 2 +- yarn.lock | 344 ++++++------------ 3 files changed, 118 insertions(+), 230 deletions(-) diff --git a/package.json b/package.json index 63284107..fb029fc7 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "@mui/material": "5.6.0", "@mui/x-date-pickers": "^5.0.0-alpha.4", "@rowy/form-builder": "^0.7.0", - "@rowy/multiselect": "^0.4.0", + "@rowy/multiselect": "^0.4.1", "@tinymce/tinymce-react": "^3", "@uiw/react-md-editor": "^3.14.1", "algoliasearch": "^4.13.1", diff --git a/src/components/ColumnModals/NewColumnModal.tsx b/src/components/ColumnModals/NewColumnModal.tsx index 7bbe8003..9f3a8aba 100644 --- a/src/components/ColumnModals/NewColumnModal.tsx +++ b/src/components/ColumnModals/NewColumnModal.tsx @@ -36,7 +36,7 @@ export default function NewColumnModal({ const [columnLabel, setColumnLabel] = useState(""); const [fieldKey, setFieldKey] = useState(""); - const [type, setType] = useState(FieldType.shortText); + const [type, setType] = useState("" as any); const requireConfiguration = getFieldProp("requireConfiguration", type); const isAuditField = AUDIT_FIELD_TYPES.includes(type); diff --git a/yarn.lock b/yarn.lock index 22973d01..4d281370 100644 --- a/yarn.lock +++ b/yarn.lock @@ -129,7 +129,7 @@ dependencies: "@babel/highlight" "^7.16.7" -"@babel/compat-data@^7.12.13", "@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.8", "@babel/compat-data@^7.17.0", "@babel/compat-data@^7.17.7": +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.8", "@babel/compat-data@^7.17.0", "@babel/compat-data@^7.17.7": version "7.17.7" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.7.tgz#078d8b833fbbcc95286613be8c716cef2b519fa2" integrity sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ== @@ -164,7 +164,7 @@ eslint-visitor-keys "^2.1.0" semver "^6.3.0" -"@babel/generator@^7.12.17", "@babel/generator@^7.17.9", "@babel/generator@^7.7.2": +"@babel/generator@^7.17.9", "@babel/generator@^7.7.2": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.9.tgz#f4af9fd38fa8de143c29fce3f71852406fc1e2fc" integrity sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ== @@ -173,14 +173,14 @@ jsesc "^2.5.1" source-map "^0.5.0" -"@babel/helper-annotate-as-pure@^7.10.4", "@babel/helper-annotate-as-pure@^7.12.13", "@babel/helper-annotate-as-pure@^7.16.7": +"@babel/helper-annotate-as-pure@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== dependencies: "@babel/types" "^7.16.7" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.12.13", "@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": +"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b" integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA== @@ -188,7 +188,7 @@ "@babel/helper-explode-assignable-expression" "^7.16.7" "@babel/types" "^7.16.7" -"@babel/helper-compilation-targets@^7.12.17", "@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.17.7": +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.17.7": version "7.17.7" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz#a3c2924f5e5f0379b356d4cfb313d1414dc30e46" integrity sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w== @@ -198,7 +198,7 @@ browserslist "^4.17.5" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.12.13", "@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7", "@babel/helper-create-class-features-plugin@^7.17.6", "@babel/helper-create-class-features-plugin@^7.17.9": +"@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7", "@babel/helper-create-class-features-plugin@^7.17.6", "@babel/helper-create-class-features-plugin@^7.17.9": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.9.tgz#71835d7fb9f38bd9f1378e40a4c0902fdc2ea49d" integrity sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ== @@ -211,7 +211,7 @@ "@babel/helper-replace-supers" "^7.16.7" "@babel/helper-split-export-declaration" "^7.16.7" -"@babel/helper-create-regexp-features-plugin@^7.12.13", "@babel/helper-create-regexp-features-plugin@^7.16.7": +"@babel/helper-create-regexp-features-plugin@^7.16.7": version "7.17.0" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz#1dcc7d40ba0c6b6b25618997c5dbfd310f186fe1" integrity sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA== @@ -240,14 +240,14 @@ dependencies: "@babel/types" "^7.16.7" -"@babel/helper-explode-assignable-expression@^7.12.13", "@babel/helper-explode-assignable-expression@^7.16.7": +"@babel/helper-explode-assignable-expression@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a" integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ== dependencies: "@babel/types" "^7.16.7" -"@babel/helper-function-name@^7.12.13", "@babel/helper-function-name@^7.16.7", "@babel/helper-function-name@^7.17.9": +"@babel/helper-function-name@^7.16.7", "@babel/helper-function-name@^7.17.9": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12" integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg== @@ -255,21 +255,14 @@ "@babel/template" "^7.16.7" "@babel/types" "^7.17.0" -"@babel/helper-get-function-arity@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" - integrity sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg== - dependencies: - "@babel/types" "^7.12.13" - -"@babel/helper-hoist-variables@^7.12.13", "@babel/helper-hoist-variables@^7.16.7": +"@babel/helper-hoist-variables@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== dependencies: "@babel/types" "^7.16.7" -"@babel/helper-member-expression-to-functions@^7.12.13", "@babel/helper-member-expression-to-functions@^7.12.17", "@babel/helper-member-expression-to-functions@^7.16.7", "@babel/helper-member-expression-to-functions@^7.17.7": +"@babel/helper-member-expression-to-functions@^7.16.7", "@babel/helper-member-expression-to-functions@^7.17.7": version "7.17.7" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz#a34013b57d8542a8c4ff8ba3f747c02452a4d8c4" integrity sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw== @@ -283,7 +276,7 @@ dependencies: "@babel/types" "^7.16.7" -"@babel/helper-module-transforms@^7.12.13", "@babel/helper-module-transforms@^7.12.17", "@babel/helper-module-transforms@^7.16.7", "@babel/helper-module-transforms@^7.17.7": +"@babel/helper-module-transforms@^7.16.7", "@babel/helper-module-transforms@^7.17.7": version "7.17.7" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz#3943c7f777139e7954a5355c815263741a9c1cbd" integrity sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw== @@ -297,7 +290,7 @@ "@babel/traverse" "^7.17.3" "@babel/types" "^7.17.0" -"@babel/helper-optimise-call-expression@^7.12.13", "@babel/helper-optimise-call-expression@^7.16.7": +"@babel/helper-optimise-call-expression@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2" integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w== @@ -309,7 +302,7 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== -"@babel/helper-remap-async-to-generator@^7.12.13", "@babel/helper-remap-async-to-generator@^7.16.8": +"@babel/helper-remap-async-to-generator@^7.16.8": version "7.16.8" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz#29ffaade68a367e2ed09c90901986918d25e57e3" integrity sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw== @@ -318,7 +311,7 @@ "@babel/helper-wrap-function" "^7.16.8" "@babel/types" "^7.16.8" -"@babel/helper-replace-supers@^7.12.13", "@babel/helper-replace-supers@^7.16.7": +"@babel/helper-replace-supers@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz#e9f5f5f32ac90429c1a4bdec0f231ef0c2838ab1" integrity sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw== @@ -329,38 +322,38 @@ "@babel/traverse" "^7.16.7" "@babel/types" "^7.16.7" -"@babel/helper-simple-access@^7.12.13", "@babel/helper-simple-access@^7.17.7": +"@babel/helper-simple-access@^7.17.7": version "7.17.7" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz#aaa473de92b7987c6dfa7ce9a7d9674724823367" integrity sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA== dependencies: "@babel/types" "^7.17.0" -"@babel/helper-skip-transparent-expression-wrappers@^7.12.1", "@babel/helper-skip-transparent-expression-wrappers@^7.16.0": +"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== dependencies: "@babel/types" "^7.16.0" -"@babel/helper-split-export-declaration@^7.12.13", "@babel/helper-split-export-declaration@^7.16.7": +"@babel/helper-split-export-declaration@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== dependencies: "@babel/types" "^7.16.7" -"@babel/helper-validator-identifier@^7.12.11", "@babel/helper-validator-identifier@^7.16.7": +"@babel/helper-validator-identifier@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== -"@babel/helper-validator-option@^7.12.17", "@babel/helper-validator-option@^7.16.7": +"@babel/helper-validator-option@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== -"@babel/helper-wrap-function@^7.12.13", "@babel/helper-wrap-function@^7.16.8": +"@babel/helper-wrap-function@^7.16.8": version "7.16.8" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz#58afda087c4cd235de92f7ceedebca2c41274200" integrity sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw== @@ -370,7 +363,7 @@ "@babel/traverse" "^7.16.8" "@babel/types" "^7.16.8" -"@babel/helpers@^7.12.17", "@babel/helpers@^7.17.9": +"@babel/helpers@^7.17.9": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.9.tgz#b2af120821bfbe44f9907b1826e168e819375a1a" integrity sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q== @@ -379,7 +372,7 @@ "@babel/traverse" "^7.17.9" "@babel/types" "^7.17.0" -"@babel/highlight@^7.12.13", "@babel/highlight@^7.16.7": +"@babel/highlight@^7.16.7": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.9.tgz#61b2ee7f32ea0454612def4fccdae0de232b73e3" integrity sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg== @@ -388,7 +381,7 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.12.17", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.9": +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.9": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.9.tgz#9c94189a6062f0291418ca021077983058e171ef" integrity sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg== @@ -409,7 +402,7 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" "@babel/plugin-proposal-optional-chaining" "^7.16.7" -"@babel/plugin-proposal-async-generator-functions@^7.12.13", "@babel/plugin-proposal-async-generator-functions@^7.16.8": +"@babel/plugin-proposal-async-generator-functions@^7.16.8": version "7.16.8" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz#3bdd1ebbe620804ea9416706cd67d60787504bc8" integrity sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ== @@ -418,7 +411,7 @@ "@babel/helper-remap-async-to-generator" "^7.16.8" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-proposal-class-properties@^7.12.13", "@babel/plugin-proposal-class-properties@^7.16.0", "@babel/plugin-proposal-class-properties@^7.16.7": +"@babel/plugin-proposal-class-properties@^7.16.0", "@babel/plugin-proposal-class-properties@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz#925cad7b3b1a2fcea7e59ecc8eb5954f961f91b0" integrity sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww== @@ -447,7 +440,7 @@ "@babel/plugin-syntax-decorators" "^7.17.0" charcodes "^0.2.0" -"@babel/plugin-proposal-dynamic-import@^7.12.17", "@babel/plugin-proposal-dynamic-import@^7.16.7": +"@babel/plugin-proposal-dynamic-import@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz#c19c897eaa46b27634a00fee9fb7d829158704b2" integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg== @@ -455,7 +448,7 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-proposal-export-namespace-from@^7.12.13", "@babel/plugin-proposal-export-namespace-from@^7.16.7": +"@babel/plugin-proposal-export-namespace-from@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz#09de09df18445a5786a305681423ae63507a6163" integrity sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA== @@ -463,7 +456,7 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-json-strings@^7.12.13", "@babel/plugin-proposal-json-strings@^7.16.7": +"@babel/plugin-proposal-json-strings@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz#9732cb1d17d9a2626a08c5be25186c195b6fa6e8" integrity sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ== @@ -471,7 +464,7 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-proposal-logical-assignment-operators@^7.12.13", "@babel/plugin-proposal-logical-assignment-operators@^7.16.7": +"@babel/plugin-proposal-logical-assignment-operators@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz#be23c0ba74deec1922e639832904be0bea73cdea" integrity sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg== @@ -479,7 +472,7 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.12.13", "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7": +"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz#141fc20b6857e59459d430c850a0011e36561d99" integrity sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ== @@ -487,7 +480,7 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-proposal-numeric-separator@^7.12.13", "@babel/plugin-proposal-numeric-separator@^7.16.0", "@babel/plugin-proposal-numeric-separator@^7.16.7": +"@babel/plugin-proposal-numeric-separator@^7.16.0", "@babel/plugin-proposal-numeric-separator@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9" integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw== @@ -495,7 +488,7 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.12.13", "@babel/plugin-proposal-object-rest-spread@^7.16.7": +"@babel/plugin-proposal-object-rest-spread@^7.16.7": version "7.17.3" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz#d9eb649a54628a51701aef7e0ea3d17e2b9dd390" integrity sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw== @@ -506,7 +499,7 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-transform-parameters" "^7.16.7" -"@babel/plugin-proposal-optional-catch-binding@^7.12.13", "@babel/plugin-proposal-optional-catch-binding@^7.16.7": +"@babel/plugin-proposal-optional-catch-binding@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz#c623a430674ffc4ab732fd0a0ae7722b67cb74cf" integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA== @@ -514,7 +507,7 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.12.17", "@babel/plugin-proposal-optional-chaining@^7.16.0", "@babel/plugin-proposal-optional-chaining@^7.16.7": +"@babel/plugin-proposal-optional-chaining@^7.16.0", "@babel/plugin-proposal-optional-chaining@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz#7cd629564724816c0e8a969535551f943c64c39a" integrity sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA== @@ -523,7 +516,7 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-proposal-private-methods@^7.12.13", "@babel/plugin-proposal-private-methods@^7.16.0", "@babel/plugin-proposal-private-methods@^7.16.11": +"@babel/plugin-proposal-private-methods@^7.16.0", "@babel/plugin-proposal-private-methods@^7.16.11": version "7.16.11" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz#e8df108288555ff259f4527dbe84813aac3a1c50" integrity sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw== @@ -541,7 +534,7 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-proposal-unicode-property-regex@^7.12.13", "@babel/plugin-proposal-unicode-property-regex@^7.16.7", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": +"@babel/plugin-proposal-unicode-property-regex@^7.16.7", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz#635d18eb10c6214210ffc5ff4932552de08188a2" integrity sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg== @@ -549,7 +542,7 @@ "@babel/helper-create-regexp-features-plugin" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-syntax-async-generators@^7.8.0", "@babel/plugin-syntax-async-generators@^7.8.4": +"@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== @@ -584,7 +577,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-syntax-dynamic-import@^7.8.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": +"@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== @@ -612,7 +605,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-json-strings@^7.8.0", "@babel/plugin-syntax-json-strings@^7.8.3": +"@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== @@ -633,7 +626,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== @@ -647,21 +640,21 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": +"@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-optional-catch-binding@^7.8.0", "@babel/plugin-syntax-optional-catch-binding@^7.8.3": +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-optional-chaining@^7.8.0", "@babel/plugin-syntax-optional-chaining@^7.8.3": +"@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== @@ -675,7 +668,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-top-level-await@^7.12.13", "@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": +"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== @@ -689,14 +682,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-arrow-functions@^7.12.13", "@babel/plugin-transform-arrow-functions@^7.16.7": +"@babel/plugin-transform-arrow-functions@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz#44125e653d94b98db76369de9c396dc14bef4154" integrity sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-async-to-generator@^7.12.13", "@babel/plugin-transform-async-to-generator@^7.16.8": +"@babel/plugin-transform-async-to-generator@^7.16.8": version "7.16.8" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz#b83dff4b970cf41f1b819f8b49cc0cfbaa53a808" integrity sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg== @@ -705,21 +698,21 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-remap-async-to-generator" "^7.16.8" -"@babel/plugin-transform-block-scoped-functions@^7.12.13", "@babel/plugin-transform-block-scoped-functions@^7.16.7": +"@babel/plugin-transform-block-scoped-functions@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620" integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-block-scoping@^7.12.13", "@babel/plugin-transform-block-scoping@^7.16.7": +"@babel/plugin-transform-block-scoping@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz#f50664ab99ddeaee5bc681b8f3a6ea9d72ab4f87" integrity sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-classes@^7.12.13", "@babel/plugin-transform-classes@^7.16.7": +"@babel/plugin-transform-classes@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz#8f4b9562850cd973de3b498f1218796eb181ce00" integrity sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ== @@ -733,21 +726,21 @@ "@babel/helper-split-export-declaration" "^7.16.7" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.12.13", "@babel/plugin-transform-computed-properties@^7.16.7": +"@babel/plugin-transform-computed-properties@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz#66dee12e46f61d2aae7a73710f591eb3df616470" integrity sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-destructuring@^7.12.13", "@babel/plugin-transform-destructuring@^7.16.7": +"@babel/plugin-transform-destructuring@^7.16.7": version "7.17.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz#49dc2675a7afa9a5e4c6bdee636061136c3408d1" integrity sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-dotall-regex@^7.12.13", "@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4": +"@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz#6b2d67686fab15fb6a7fd4bd895d5982cfc81241" integrity sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ== @@ -755,14 +748,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-duplicate-keys@^7.12.13", "@babel/plugin-transform-duplicate-keys@^7.16.7": +"@babel/plugin-transform-duplicate-keys@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz#2207e9ca8f82a0d36a5a67b6536e7ef8b08823c9" integrity sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-exponentiation-operator@^7.12.13", "@babel/plugin-transform-exponentiation-operator@^7.16.7": +"@babel/plugin-transform-exponentiation-operator@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz#efa9862ef97e9e9e5f653f6ddc7b665e8536fe9b" integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA== @@ -778,14 +771,14 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-flow" "^7.16.7" -"@babel/plugin-transform-for-of@^7.12.13", "@babel/plugin-transform-for-of@^7.16.7": +"@babel/plugin-transform-for-of@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz#649d639d4617dff502a9a158c479b3b556728d8c" integrity sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-function-name@^7.12.13", "@babel/plugin-transform-function-name@^7.16.7": +"@babel/plugin-transform-function-name@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf" integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA== @@ -794,21 +787,21 @@ "@babel/helper-function-name" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-literals@^7.12.13", "@babel/plugin-transform-literals@^7.16.7": +"@babel/plugin-transform-literals@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz#254c9618c5ff749e87cb0c0cef1a0a050c0bdab1" integrity sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-member-expression-literals@^7.12.13", "@babel/plugin-transform-member-expression-literals@^7.16.7": +"@babel/plugin-transform-member-expression-literals@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384" integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-modules-amd@^7.12.13", "@babel/plugin-transform-modules-amd@^7.16.7": +"@babel/plugin-transform-modules-amd@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz#b28d323016a7daaae8609781d1f8c9da42b13186" integrity sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g== @@ -817,7 +810,7 @@ "@babel/helper-plugin-utils" "^7.16.7" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.12.13", "@babel/plugin-transform-modules-commonjs@^7.16.8": +"@babel/plugin-transform-modules-commonjs@^7.16.8": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.9.tgz#274be1a2087beec0254d4abd4d86e52442e1e5b6" integrity sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw== @@ -827,7 +820,7 @@ "@babel/helper-simple-access" "^7.17.7" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.12.13", "@babel/plugin-transform-modules-systemjs@^7.16.7": +"@babel/plugin-transform-modules-systemjs@^7.16.7": version "7.17.8" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz#81fd834024fae14ea78fbe34168b042f38703859" integrity sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw== @@ -838,7 +831,7 @@ "@babel/helper-validator-identifier" "^7.16.7" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-umd@^7.12.13", "@babel/plugin-transform-modules-umd@^7.16.7": +"@babel/plugin-transform-modules-umd@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz#23dad479fa585283dbd22215bff12719171e7618" integrity sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ== @@ -846,21 +839,21 @@ "@babel/helper-module-transforms" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-named-capturing-groups-regex@^7.12.13", "@babel/plugin-transform-named-capturing-groups-regex@^7.16.8": +"@babel/plugin-transform-named-capturing-groups-regex@^7.16.8": version "7.16.8" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz#7f860e0e40d844a02c9dcf9d84965e7dfd666252" integrity sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.16.7" -"@babel/plugin-transform-new-target@^7.12.13", "@babel/plugin-transform-new-target@^7.16.7": +"@babel/plugin-transform-new-target@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz#9967d89a5c243818e0800fdad89db22c5f514244" integrity sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-object-super@^7.12.13", "@babel/plugin-transform-object-super@^7.16.7": +"@babel/plugin-transform-object-super@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94" integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw== @@ -868,14 +861,14 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-replace-supers" "^7.16.7" -"@babel/plugin-transform-parameters@^7.12.13", "@babel/plugin-transform-parameters@^7.16.7": +"@babel/plugin-transform-parameters@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz#a1721f55b99b736511cb7e0152f61f17688f331f" integrity sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-property-literals@^7.12.13", "@babel/plugin-transform-property-literals@^7.16.7": +"@babel/plugin-transform-property-literals@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55" integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw== @@ -889,21 +882,21 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-react-display-name@^7.12.13", "@babel/plugin-transform-react-display-name@^7.16.0", "@babel/plugin-transform-react-display-name@^7.16.7": +"@babel/plugin-transform-react-display-name@^7.16.0", "@babel/plugin-transform-react-display-name@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz#7b6d40d232f4c0f550ea348593db3b21e2404340" integrity sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-react-jsx-development@^7.12.12", "@babel/plugin-transform-react-jsx-development@^7.16.7": +"@babel/plugin-transform-react-jsx-development@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz#43a00724a3ed2557ed3f276a01a929e6686ac7b8" integrity sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A== dependencies: "@babel/plugin-transform-react-jsx" "^7.16.7" -"@babel/plugin-transform-react-jsx@^7.12.13", "@babel/plugin-transform-react-jsx@^7.12.17", "@babel/plugin-transform-react-jsx@^7.16.7": +"@babel/plugin-transform-react-jsx@^7.16.7": version "7.17.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.3.tgz#eac1565da176ccb1a715dae0b4609858808008c1" integrity sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ== @@ -914,7 +907,7 @@ "@babel/plugin-syntax-jsx" "^7.16.7" "@babel/types" "^7.17.0" -"@babel/plugin-transform-react-pure-annotations@^7.12.1", "@babel/plugin-transform-react-pure-annotations@^7.16.7": +"@babel/plugin-transform-react-pure-annotations@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz#232bfd2f12eb551d6d7d01d13fe3f86b45eb9c67" integrity sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA== @@ -922,14 +915,14 @@ "@babel/helper-annotate-as-pure" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-regenerator@^7.12.13", "@babel/plugin-transform-regenerator@^7.16.7": +"@babel/plugin-transform-regenerator@^7.16.7": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz#0a33c3a61cf47f45ed3232903683a0afd2d3460c" integrity sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ== dependencies: regenerator-transform "^0.15.0" -"@babel/plugin-transform-reserved-words@^7.12.13", "@babel/plugin-transform-reserved-words@^7.16.7": +"@babel/plugin-transform-reserved-words@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz#1d798e078f7c5958eec952059c460b220a63f586" integrity sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg== @@ -948,14 +941,14 @@ babel-plugin-polyfill-regenerator "^0.3.0" semver "^6.3.0" -"@babel/plugin-transform-shorthand-properties@^7.12.13", "@babel/plugin-transform-shorthand-properties@^7.16.7": +"@babel/plugin-transform-shorthand-properties@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz#e8549ae4afcf8382f711794c0c7b6b934c5fbd2a" integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg== dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-spread@^7.12.13", "@babel/plugin-transform-spread@^7.16.7": +"@babel/plugin-transform-spread@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz#a303e2122f9f12e0105daeedd0f30fb197d8ff44" integrity sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg== @@ -963,21 +956,21 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" -"@babel/plugin-transform-sticky-regex@^7.12.13", "@babel/plugin-transform-sticky-regex@^7.16.7": +"@babel/plugin-transform-sticky-regex@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz#c84741d4f4a38072b9a1e2e3fd56d359552e8660" integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-template-literals@^7.12.13", "@babel/plugin-transform-template-literals@^7.16.7": +"@babel/plugin-transform-template-literals@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz#f3d1c45d28967c8e80f53666fc9c3e50618217ab" integrity sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA== dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-typeof-symbol@^7.12.13", "@babel/plugin-transform-typeof-symbol@^7.16.7": +"@babel/plugin-transform-typeof-symbol@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz#9cdbe622582c21368bd482b660ba87d5545d4f7e" integrity sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ== @@ -993,14 +986,14 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-typescript" "^7.16.7" -"@babel/plugin-transform-unicode-escapes@^7.12.13", "@babel/plugin-transform-unicode-escapes@^7.16.7": +"@babel/plugin-transform-unicode-escapes@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz#da8717de7b3287a2c6d659750c964f302b31ece3" integrity sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q== dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-unicode-regex@^7.12.13", "@babel/plugin-transform-unicode-regex@^7.16.7": +"@babel/plugin-transform-unicode-regex@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz#0f7aa4a501198976e25e82702574c34cfebe9ef2" integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q== @@ -1088,7 +1081,7 @@ core-js-compat "^3.20.2" semver "^6.3.0" -"@babel/preset-modules@^0.1.3", "@babel/preset-modules@^0.1.5": +"@babel/preset-modules@^0.1.5": version "0.1.5" resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== @@ -1135,7 +1128,7 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.12.13", "@babel/template@^7.16.7", "@babel/template@^7.3.3": +"@babel/template@^7.16.7", "@babel/template@^7.3.3": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== @@ -1144,7 +1137,7 @@ "@babel/parser" "^7.16.7" "@babel/types" "^7.16.7" -"@babel/traverse@^7.12.13", "@babel/traverse@^7.12.17", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.17.3", "@babel/traverse@^7.17.9", "@babel/traverse@^7.7.2": +"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.17.3", "@babel/traverse@^7.17.9", "@babel/traverse@^7.7.2": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.9.tgz#1f9b207435d9ae4a8ed6998b2b82300d83c37a0d" integrity sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw== @@ -1160,7 +1153,7 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.12.17", "@babel/types@^7.12.6", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": +"@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": version "7.17.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw== @@ -1261,7 +1254,7 @@ dependencies: postcss-value-parser "^4.2.0" -"@date-io/core@^2.13.1", "@date-io/core@^2.14.0": +"@date-io/core@^2.14.0": version "2.14.0" resolved "https://registry.yarnpkg.com/@date-io/core/-/core-2.14.0.tgz#03e9b9b9fc8e4d561c32dd324df0f3ccd967ef14" integrity sha512-qFN64hiFjmlDHJhu+9xMkdfDG2jLsggNxKXglnekUpXSq8faiqZgtHm2lsHCUuaPDTV6wuXHcCl8J1GQ5wLmPw== @@ -1364,7 +1357,7 @@ "@emotion/utils" "^1.0.0" csstype "^3.0.2" -"@emotion/sheet@^1.1.0", "@emotion/sheet@^1.1.1": +"@emotion/sheet@^1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.1.1.tgz#015756e2a9a3c7c5f11d8ec22966a8dbfbfac787" integrity sha512-J3YPccVRMiTZxYAY0IOq3kd+hUP8idY8Kz6B/Cyo+JuXq52Ek+zbPbSQUrVQp95aJ+lsAW7DPL1P2Z+U1jGkKA== @@ -1999,18 +1992,7 @@ source-map "^0.6.1" write-file-atomic "^3.0.0" -"@jest/types@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" - integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^15.0.0" - chalk "^4.0.0" - -"@jest/types@^27.0.6", "@jest/types@^27.5.1": +"@jest/types@^27.5.1": version "27.5.1" resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== @@ -2207,7 +2189,7 @@ react-is "^18.2.0" react-transition-group "^4.4.2" -"@mui/private-theming@^5.6.0", "@mui/private-theming@^5.9.1": +"@mui/private-theming@^5.9.1": version "5.9.1" resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.9.1.tgz#4f714ed9ebd587373dc77b3fc69e9f3e720f0190" integrity sha512-eIh2IZJInNTdgPLMo9cruzm8UDX5amBBxxsSoNre7lRj3wcsu3TG5OKjIbzkf4VxHHEhdPeNNQyt92k7L78u2A== @@ -2216,7 +2198,7 @@ "@mui/utils" "^5.9.1" prop-types "^15.8.1" -"@mui/styled-engine@^5.6.0", "@mui/styled-engine@^5.8.7": +"@mui/styled-engine@^5.8.7": version "5.8.7" resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-5.8.7.tgz#63d0779c07677fe76d4705a02c7ae99f89b50780" integrity sha512-tVqtowjbYmiRq+qcqXK731L9eWoL9H8xTRhuTgaDGKdch1zlt4I2UwInUe1w2N9N/u3/jHsFbLcl1Un3uOwpQg== @@ -2468,10 +2450,10 @@ use-debounce "^8.0.0" yup "^0.32.9" -"@rowy/multiselect@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@rowy/multiselect/-/multiselect-0.4.0.tgz#0fe8b19e294a7c458f1610548f04ad36d00c290c" - integrity sha512-I441p29hwA99N9nlz1nckZqd7Br3/0vaIBsdR+UfCHUieQXvh19Awup1xOAi46i/ofKSWuYslhXncvGkyuEeIg== +"@rowy/multiselect@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@rowy/multiselect/-/multiselect-0.4.1.tgz#6a590dde5c7ab588c74c9188c1bb7547b4223fa6" + integrity sha512-XAHWKDeZjHWelNqjIRzS+RdAOXqWiQSv9dcWJAmwheLdhqRym2IjTEux41cy3OWyAKupAJkWacGDQmhLaRh1Lg== "@rushstack/eslint-patch@^1.1.0": version "1.1.1" @@ -2993,7 +2975,7 @@ jest-matcher-utils "^27.0.0" pretty-format "^27.0.0" -"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.6", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.11" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== @@ -3079,7 +3061,7 @@ resolved "https://registry.yarnpkg.com/@types/prismjs/-/prismjs-1.26.0.tgz#a1c3809b0ad61c62cac6d4e0c56d610c910b7654" integrity sha512-ZTaqn/qSqUuAq1YwvOFQfVW1AR/oQJlLSZVustdjwI+GZ8kr0MSHBj0tsXPW1EqHubx50gtBEjbPGsdZwQwCjQ== -"@types/prop-types@*", "@types/prop-types@^15.0.0", "@types/prop-types@^15.7.4", "@types/prop-types@^15.7.5": +"@types/prop-types@*", "@types/prop-types@^15.0.0", "@types/prop-types@^15.7.5": version "15.7.5" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== @@ -3264,13 +3246,6 @@ resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== -"@types/yargs@^15.0.0": - version "15.0.13" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.13.tgz#34f7fec8b389d7f3c1fd08026a5763e072d3c6dc" - integrity sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ== - dependencies: - "@types/yargs-parser" "*" - "@types/yargs@^16.0.0": version "16.0.4" resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977" @@ -3698,7 +3673,7 @@ ansi-html-community@^0.0.8: resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== -ansi-regex@^5.0.0, ansi-regex@^5.0.1: +ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== @@ -4154,7 +4129,7 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^3.0.1, braces@^3.0.2, braces@~3.0.2: +braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== @@ -4181,7 +4156,7 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.3, browserslist@^4.16.6, browserslist@^4.17.5, browserslist@^4.18.1, browserslist@^4.19.1, browserslist@^4.20.2: +browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4.17.5, browserslist@^4.18.1, browserslist@^4.19.1, browserslist@^4.20.2: version "4.20.2" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.2.tgz#567b41508757ecd904dab4d1c646c612cd3d4f88" integrity sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA== @@ -4290,7 +4265,7 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001181, caniuse-lite@^1.0.30001317: +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001317: version "1.0.30001328" resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001328.tgz" integrity sha512-Ue55jHkR/s4r00FLNiX+hGMMuwml/QGqqzVeMQ5thUewznU2EdULFvI3JR7JJid6OrjJNfFvHY2G2dIjmRaDDQ== @@ -4509,11 +4484,6 @@ colord@^2.9.1: resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.2.tgz#25e2bacbbaa65991422c07ea209e2089428effb1" integrity sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ== -colorette@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" - integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== - colorette@^2.0.10, colorette@^2.0.16: version "2.0.16" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" @@ -4645,7 +4615,7 @@ cookie@0.4.2: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== -core-js-compat@^3.20.2, core-js-compat@^3.21.0, core-js-compat@^3.8.0: +core-js-compat@^3.20.2, core-js-compat@^3.21.0: version "3.21.1" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.21.1.tgz#cac369f67c8d134ff8f9bd1623e3bc2c42068c82" integrity sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g== @@ -5125,11 +5095,6 @@ didyoumean@^1.2.2: resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== -diff-sequences@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" - integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== - diff-sequences@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" @@ -5336,7 +5301,7 @@ ejs@^3.1.5, ejs@^3.1.6: dependencies: jake "^10.8.5" -electron-to-chromium@^1.3.649, electron-to-chromium@^1.4.84: +electron-to-chromium@^1.4.84: version "1.4.106" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.106.tgz#e7a3bfa9d745dd9b9e597616cb17283cc349781a" integrity sha512-ZYfpVLULm67K7CaaGP7DmjyeMY4naxsbTy+syVVxT6QHI1Ww8XbJjmr9fDckrhq44WzCrcC5kH3zGpdusxwwqg== @@ -5400,7 +5365,7 @@ error-stack-parser@^2.0.6: dependencies: stackframe "^1.1.1" -es-abstract@^1.17.2, es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2, es-abstract@^1.19.0, es-abstract@^1.19.1: +es-abstract@^1.17.2, es-abstract@^1.18.0-next.2, es-abstract@^1.19.0, es-abstract@^1.19.1: version "1.19.2" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.2.tgz#8f7b696d8f15b167ae3640b4060670f3d054143f" integrity sha512-gfSBJoZdlL2xRiOCy0g8gLMryhoe1TlimjzU99L/31Z8QEGIhVQI+EWwt5lT+AuU9SnorVupXFqqOGqGfsyO6w== @@ -6221,7 +6186,7 @@ functional-red-black-tree@^1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= -gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: +gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== @@ -6802,11 +6767,6 @@ indent-string@^4.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== -indexes-of@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" - integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= - inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -6906,7 +6866,7 @@ is-buffer@^2.0.0: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== -is-callable@^1.1.4, is-callable@^1.2.2, is-callable@^1.2.4: +is-callable@^1.1.4, is-callable@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== @@ -6972,7 +6932,7 @@ is-module@^1.0.0: resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= -is-negative-zero@^2.0.1, is-negative-zero@^2.0.2: +is-negative-zero@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== @@ -7009,7 +6969,7 @@ is-potential-custom-element-name@^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-regex@^1.1.1, is-regex@^1.1.4: +is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== @@ -7239,16 +7199,6 @@ jest-config@^27.5.1: slash "^3.0.0" strip-json-comments "^3.1.1" -jest-diff@^26.0.0: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394" - integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA== - dependencies: - chalk "^4.0.0" - diff-sequences "^26.6.2" - jest-get-type "^26.3.0" - pretty-format "^26.6.2" - jest-diff@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def" @@ -7302,11 +7252,6 @@ jest-environment-node@^27.5.1: jest-mock "^27.5.1" jest-util "^27.5.1" -jest-get-type@^26.3.0: - version "26.3.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" - integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== - jest-get-type@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1" @@ -7990,7 +7935,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0: +lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -8036,11 +7981,6 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -lru-cache@^7.4.0: - version "7.8.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.8.0.tgz#649aaeb294a56297b5cbc5d70f198dcc5ebe5747" - integrity sha512-AmXqneQZL3KZMIgBpaPTeI6pfwh+xQ2vutMsyqOu1TBdEXFZgpG/80wuJ531w2ZN7TI0/oc8CPxzh/DKQudZqg== - lunr@^2.3.9: version "2.3.9" resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" @@ -8591,11 +8531,6 @@ micromatch@^4.0.2, micromatch@^4.0.4: braces "^3.0.2" picomatch "^2.3.1" -mime-db@1.46.0: - version "1.46.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.46.0.tgz#6267748a7f799594de3cbc8cde91def349661cee" - integrity sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ== - mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" @@ -8656,7 +8591,7 @@ minimatch@^5.0.1, minimatch@^5.1.0: dependencies: brace-expansion "^2.0.1" -minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: +minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.6: version "1.2.6" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== @@ -8721,11 +8656,6 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -negotiator@0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" - integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== - negotiator@0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" @@ -8769,11 +8699,6 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= -node-releases@^1.1.70: - version "1.1.70" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.70.tgz#66e0ed0273aa65666d7fe78febe7634875426a08" - integrity sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw== - node-releases@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.2.tgz#7139fe71e2f4f11b47d4d2986aaf8c48699e0c01" @@ -8843,7 +8768,7 @@ object-hash@^2.2.0: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5" integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw== -object-inspect@^1.12.0, object-inspect@^1.8.0, object-inspect@^1.9.0: +object-inspect@^1.12.0, object-inspect@^1.9.0: version "1.12.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== @@ -8858,7 +8783,7 @@ object-keys@^1.0.12, object-keys@^1.0.6, object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.0, object.assign@^4.1.1, object.assign@^4.1.2: +object.assign@^4.1.0, object.assign@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== @@ -9190,7 +9115,7 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -9792,16 +9717,6 @@ pretty-error@^4.0.0: lodash "^4.17.20" renderkid "^3.0.0" -pretty-format@^26.0.0, pretty-format@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" - integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== - dependencies: - "@jest/types" "^26.6.2" - ansi-regex "^5.0.0" - ansi-styles "^4.0.0" - react-is "^17.0.1" - pretty-format@^27.0.0, pretty-format@^27.0.2, pretty-format@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" @@ -10181,7 +10096,7 @@ react-image@^4: resolved "https://registry.yarnpkg.com/react-image/-/react-image-4.0.3.tgz#6fa722877660b67295298a914bff1ed87ad2cf83" integrity sha512-19MUK9u1qaw9xys8XEsVkSpVhHctEBUeYFvrLTe1PN+4w5Co13AN2WA7xtBshPM6SthsOj77SlDrEAeOaJpf7g== -react-is@^16.13.1, react-is@^16.7.0, react-is@^16.8.1: +react-is@^16.13.1, react-is@^16.7.0: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== @@ -10448,13 +10363,6 @@ regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.9: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== -regenerator-transform@^0.14.2: - version "0.14.5" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" - integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== - dependencies: - "@babel/runtime" "^7.8.4" - regenerator-transform@^0.15.0: version "0.15.0" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.0.tgz#cbd9ead5d77fae1a48d957cf889ad0586adb6537" @@ -10932,11 +10840,6 @@ semver@7.x, semver@^7.3.2, semver@^7.3.5: dependencies: lru-cache "^6.0.0" -semver@^5.4.1, semver@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" @@ -10998,11 +10901,6 @@ serve-static@1.14.2: parseurl "~1.3.3" send "0.17.2" -set-immediate-shim@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" - integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= - setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" @@ -11351,7 +11249,7 @@ string.prototype.matchall@^4.0.6: regexp.prototype.flags "^1.4.1" side-channel "^1.0.4" -string.prototype.trimend@^1.0.1, string.prototype.trimend@^1.0.3, string.prototype.trimend@^1.0.4: +string.prototype.trimend@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== @@ -11359,7 +11257,7 @@ string.prototype.trimend@^1.0.1, string.prototype.trimend@^1.0.3, string.prototy call-bind "^1.0.2" define-properties "^1.1.3" -string.prototype.trimstart@^1.0.1, string.prototype.trimstart@^1.0.3, string.prototype.trimstart@^1.0.4: +string.prototype.trimstart@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== @@ -11760,7 +11658,7 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" -tr46@^2.0.2, tr46@^2.1.0: +tr46@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== @@ -11870,11 +11768,6 @@ type-detect@4.0.8: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== -type-fest@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" - integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== - type-fest@^0.16.0: version "0.16.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.16.0.tgz#3240b891a78b0deae910dbeb86553e552a148860" @@ -11985,11 +11878,6 @@ unified@^10.0.0, unified@~10.1.1: trough "^2.0.0" vfile "^5.0.0" -uniq@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" - integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= - unique-string@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" From 293df99c0a46e6653e55ed53a9eae39647f34b62 Mon Sep 17 00:00:00 2001 From: shamsmosowi Date: Tue, 11 Oct 2022 19:14:31 +0200 Subject: [PATCH 172/309] enable multi file upload --- .../fields/File/SideDrawerField.tsx | 41 ++++++------ src/components/fields/File/TableCell.tsx | 33 ++++++---- .../fields/Image/SideDrawerField.tsx | 66 +++++++++---------- src/components/fields/Image/TableCell.tsx | 49 +++++++------- src/hooks/useFirebaseStorageUploader.tsx | 31 +++------ 5 files changed, 109 insertions(+), 111 deletions(-) diff --git a/src/components/fields/File/SideDrawerField.tsx b/src/components/fields/File/SideDrawerField.tsx index c28e0866..94fe90b2 100644 --- a/src/components/fields/File/SideDrawerField.tsx +++ b/src/components/fields/File/SideDrawerField.tsx @@ -23,6 +23,7 @@ import { DATE_TIME_FORMAT } from "@src/constants/dates"; import { fieldSx, getFieldId } from "@src/components/SideDrawer/utils"; import { projectScope, confirmDialogAtom } from "@src/atoms/projectScope"; import { FileValue } from "@src/types/table"; +import { arrayUnion } from "firebase/firestore"; export default function File_({ column, @@ -37,25 +38,22 @@ export default function File_({ const { uploaderState, upload, deleteUpload } = useUploader(); // Store a preview image locally while uploading - const [localFile, setLocalFile] = useState(""); + const [localFiles, setLocalFiles] = useState([]); const onDrop = useCallback( (acceptedFiles: File[]) => { - const file = acceptedFiles[0]; - - if (_rowy_ref && file) { + if (acceptedFiles.length > 0) { upload({ docRef: _rowy_ref! as any, fieldName: column.key, - files: [file], - previousValue: value ?? [], - onComplete: (newValue) => { - onChange(newValue); + files: acceptedFiles, + onComplete: (newUploads) => { + onChange(arrayUnion(newUploads)); onSubmit(); - setLocalFile(""); + setLocalFiles([]); }, }); - setLocalFile(file.name); + setLocalFiles(acceptedFiles.map((file) => file.name)); } }, [_rowy_ref, value] @@ -71,7 +69,7 @@ export default function File_({ const { getRootProps, getInputProps, isDragActive } = useDropzone({ onDrop, - multiple: false, + multiple: true, }); return ( @@ -138,15 +136,18 @@ export default function File_({
    ))} - {localFile && ( - - } - label={localFile} - deleteIcon={} - /> - - )} + {localFiles && + localFiles.map((fileName) => ( + + } + label={fileName} + deleteIcon={ + + } + /> + + ))} ); diff --git a/src/components/fields/File/TableCell.tsx b/src/components/fields/File/TableCell.tsx index 685cf62e..a4f96c0a 100644 --- a/src/components/fields/File/TableCell.tsx +++ b/src/components/fields/File/TableCell.tsx @@ -1,4 +1,4 @@ -import { useCallback } from "react"; +import { useCallback, useState } from "react"; import { IHeavyCellProps } from "@src/components/fields/types"; import { useSetAtom } from "jotai"; import { findIndex } from "lodash-es"; @@ -17,6 +17,7 @@ import useUploader from "@src/hooks/useFirebaseStorageUploader"; import { FileIcon } from "."; import { DATE_TIME_FORMAT } from "@src/constants/dates"; import { FileValue } from "@src/types/table"; +import { arrayUnion } from "firebase/firestore"; export default function File_({ column, @@ -28,28 +29,26 @@ export default function File_({ }: IHeavyCellProps) { const confirm = useSetAtom(confirmDialogAtom, projectScope); const updateField = useSetAtom(updateFieldAtom, tableScope); - + const [localFiles, setLocalFiles] = useState([]); const { uploaderState, upload, deleteUpload } = useUploader(); const { progress, isLoading } = uploaderState; - const onDrop = useCallback( (acceptedFiles: File[]) => { - const file = acceptedFiles[0]; - - if (file) { + if (acceptedFiles.length > 0) { upload({ docRef: docRef! as any, fieldName: column.key, - files: [file], - previousValue: value, - onComplete: (newValue) => { + files: acceptedFiles, + onComplete: (newUploads) => { updateField({ path: docRef.path, fieldName: column.key, - value: newValue, + value: arrayUnion(newUploads), }); + setLocalFiles([]); }, }); + setLocalFiles(acceptedFiles.map((file) => file.name)); } }, [value] @@ -65,7 +64,7 @@ export default function File_({ const { getRootProps, getInputProps, isDragActive } = useDropzone({ onDrop, - multiple: false, + multiple: true, }); const dropzoneProps = getRootProps(); @@ -135,6 +134,18 @@ export default function File_({ ))} + {localFiles && + localFiles.map((fileName) => ( + + } + label={fileName} + deleteIcon={ + + } + /> + + ))} {!isLoading ? ( diff --git a/src/components/fields/Image/SideDrawerField.tsx b/src/components/fields/Image/SideDrawerField.tsx index 9780b831..76d87a1d 100644 --- a/src/components/fields/Image/SideDrawerField.tsx +++ b/src/components/fields/Image/SideDrawerField.tsx @@ -26,6 +26,7 @@ import CircularProgressOptical from "@src/components/CircularProgressOptical"; import { projectScope, confirmDialogAtom } from "@src/atoms/projectScope"; import { IMAGE_MIME_TYPES } from "."; import { fieldSx, getFieldId } from "@src/components/SideDrawer/utils"; +import { arrayUnion } from "firebase/firestore"; const imgSx = { position: "relative", @@ -93,25 +94,21 @@ export default function Image_({ const { progress } = uploaderState; // Store a preview image locally while uploading - const [localImage, setLocalImage] = useState(""); + const [localImages, setLocalImages] = useState([]); const onDrop = useCallback( (acceptedFiles: File[]) => { - const imageFile = acceptedFiles[0]; - - if (_rowy_ref && imageFile) { + if (_rowy_ref && acceptedFiles.length > 0) { upload({ docRef: _rowy_ref! as any, fieldName: column.key, - files: [imageFile], - previousValue: value ?? [], - onComplete: (newValue) => { - onChange(newValue); - onSubmit(); - setLocalImage(""); + files: acceptedFiles, + onComplete: (newUploads) => { + onChange(arrayUnion(newUploads)); + setLocalImages([]); }, }); - setLocalImage(URL.createObjectURL(imageFile)); + setLocalImages(acceptedFiles.map((file) => URL.createObjectURL(file))); } }, [_rowy_ref, value] @@ -127,7 +124,7 @@ export default function Image_({ const { getRootProps, getInputProps, isDragActive } = useDropzone({ onDrop, - multiple: false, + multiple: true, accept: IMAGE_MIME_TYPES, }); @@ -237,29 +234,30 @@ export default function Image_({ ))} - {localImage && ( - - - ( + + - - - - - )} + + + + + + ))} ); diff --git a/src/components/fields/Image/TableCell.tsx b/src/components/fields/Image/TableCell.tsx index 84a44904..5a1cbc13 100644 --- a/src/components/fields/Image/TableCell.tsx +++ b/src/components/fields/Image/TableCell.tsx @@ -32,6 +32,7 @@ import useUploader from "@src/hooks/useFirebaseStorageUploader"; import { IMAGE_MIME_TYPES } from "./index"; import { DEFAULT_ROW_HEIGHT } from "@src/components/Table"; import { FileValue } from "@src/types/table"; +import { arrayUnion } from "firebase/firestore"; // MULTIPLE const imgSx = (rowHeight: number) => ({ @@ -99,28 +100,25 @@ export default function Image_({ const { progress, isLoading } = uploaderState; // Store a preview image locally while uploading - const [localImage, setLocalImage] = useState(""); + const [localImages, setLocalImages] = useState([]); const onDrop = useCallback( (acceptedFiles: File[]) => { - const imageFile = acceptedFiles[0]; - - if (imageFile) { + if (acceptedFiles.length > 0) { upload({ docRef: docRef! as any, fieldName: column.key, - files: [imageFile], - previousValue: value, - onComplete: (newValue) => { + files: acceptedFiles, + onComplete: (newUploads) => { updateField({ path: docRef.path, fieldName: column.key, - value: newValue, + value: arrayUnion(newUploads), }); - setLocalImage(""); + setLocalImages([]); }, }); - setLocalImage(URL.createObjectURL(imageFile)); + setLocalImages(acceptedFiles.map((file) => URL.createObjectURL(file))); } }, [value] @@ -136,7 +134,7 @@ export default function Image_({ const { getRootProps, getInputProps, isDragActive } = useDropzone({ onDrop, - multiple: false, + multiple: true, accept: IMAGE_MIME_TYPES, }); @@ -250,20 +248,21 @@ export default function Image_({ ))} - {localImage && ( - - - `0 0 0 1px ${theme.palette.divider} inset`, - }, - ]} - style={{ backgroundImage: `url("${localImage}")` }} - /> - - )} + {localImages && + localImages.map((url) => ( + + + `0 0 0 1px ${theme.palette.divider} inset`, + }, + ]} + style={{ backgroundImage: `url("${url}")` }} + /> + + ))}
    diff --git a/src/hooks/useFirebaseStorageUploader.tsx b/src/hooks/useFirebaseStorageUploader.tsx index 16fbd521..bb108af3 100644 --- a/src/hooks/useFirebaseStorageUploader.tsx +++ b/src/hooks/useFirebaseStorageUploader.tsx @@ -33,8 +33,7 @@ export type UploadProps = { docRef: DocumentReference; fieldName: string; files: File[]; - previousValue?: FileValue[]; - onComplete?: (values: FileValue[]) => void; + onComplete?: (value: FileValue) => void; }; // TODO: GENERALIZE INTO ATOM @@ -46,13 +45,7 @@ const useFirebaseStorageUploader = () => { ...initialState, }); - const upload = ({ - docRef, - fieldName, - files, - previousValue, - onComplete, - }: UploadProps) => { + const upload = ({ docRef, fieldName, files, onComplete }: UploadProps) => { uploaderDispatch({ isLoading: true }); files.forEach((file) => { @@ -139,24 +132,20 @@ const useFirebaseStorageUploader = () => { // Upload completed successfully, now we can get the download URL getDownloadURL(uploadTask.snapshot.ref).then( (downloadURL: string) => { - const newValue: FileValue[] = Array.isArray(previousValue) - ? [...previousValue] - : []; - - newValue.push({ - ref: uploadTask.snapshot.ref.fullPath, - downloadURL, - name: file.name, - type: file.type, - lastModifiedTS: file.lastModified, - }); // STore in the document if docRef provided // if (docRef && docRef.update)docRef.update({ [fieldName]: newValue }); // Also call callback if it exists // IMPORTANT: SideDrawer form may not update its local values after this // function updates the doc, so you MUST update it manually // using this callback - if (onComplete) onComplete(newValue); + const obj = { + ref: uploadTask.snapshot.ref.fullPath, + downloadURL, + name: file.name, + type: file.type, + lastModifiedTS: file.lastModified, + }; + if (onComplete) onComplete(obj); } ); } From 40600dabaac41dd9baaa771206b04baac5191fa4 Mon Sep 17 00:00:00 2001 From: shamsmosowi Date: Tue, 11 Oct 2022 23:13:48 +0200 Subject: [PATCH 173/309] fix sidedrawer image uploader --- src/components/fields/File/SideDrawerField.tsx | 2 +- src/components/fields/Image/SideDrawerField.tsx | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/fields/File/SideDrawerField.tsx b/src/components/fields/File/SideDrawerField.tsx index 94fe90b2..cad34d9b 100644 --- a/src/components/fields/File/SideDrawerField.tsx +++ b/src/components/fields/File/SideDrawerField.tsx @@ -42,7 +42,7 @@ export default function File_({ const onDrop = useCallback( (acceptedFiles: File[]) => { - if (acceptedFiles.length > 0) { + if (_rowy_ref && acceptedFiles.length > 0) { upload({ docRef: _rowy_ref! as any, fieldName: column.key, diff --git a/src/components/fields/Image/SideDrawerField.tsx b/src/components/fields/Image/SideDrawerField.tsx index 76d87a1d..304e0555 100644 --- a/src/components/fields/Image/SideDrawerField.tsx +++ b/src/components/fields/Image/SideDrawerField.tsx @@ -105,6 +105,7 @@ export default function Image_({ files: acceptedFiles, onComplete: (newUploads) => { onChange(arrayUnion(newUploads)); + onSubmit(); setLocalImages([]); }, }); From 3e606607adaf668c9edaecd209c8dcbef5b99279 Mon Sep 17 00:00:00 2001 From: shamsmosowi Date: Tue, 11 Oct 2022 23:17:43 +0200 Subject: [PATCH 174/309] add caching metadata --- src/hooks/useFirebaseStorageUploader.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/hooks/useFirebaseStorageUploader.tsx b/src/hooks/useFirebaseStorageUploader.tsx index bb108af3..97c1ff2b 100644 --- a/src/hooks/useFirebaseStorageUploader.tsx +++ b/src/hooks/useFirebaseStorageUploader.tsx @@ -53,8 +53,9 @@ const useFirebaseStorageUploader = () => { firebaseStorage, `${docRef.path}/${fieldName}/${file.name}` ); - const uploadTask = uploadBytesResumable(storageRef, file); - + const uploadTask = uploadBytesResumable(storageRef, file, { + cacheControl: "public, max-age=31536000", + }); uploadTask.on( // event "state_changed", From 17a585e6295d651ae26ee01ecdb104d292712260 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Wed, 12 Oct 2022 10:45:18 +1100 Subject: [PATCH 175/309] clarify subTable url structure --- src/components/fields/SubTable/utils.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/components/fields/SubTable/utils.ts b/src/components/fields/SubTable/utils.ts index 1c1dcae0..e62e0a45 100644 --- a/src/components/fields/SubTable/utils.ts +++ b/src/components/fields/SubTable/utils.ts @@ -20,8 +20,7 @@ export const useSubTableData = ( location.pathname.split("/" + ROUTES.subTable)[0] ); - // const [searchParams] = useSearchParams(); - // const parentLabels = searchParams.get("parentLabel"); + // Get params from URL: /table/:tableId/subTable/:docPath/:subTableKey let subTablePath = [ rootTablePath, ROUTES.subTable, @@ -29,8 +28,6 @@ export const useSubTableData = ( column.key, ].join("/"); - // if (parentLabels) subTablePath += `${parentLabels ?? ""},${label ?? ""}`; - // else subTablePath += "?parentLabel=" + encodeURIComponent(label ?? ""); return { documentCount, label, subTablePath }; From bebde59147d807b272e3a184c4a46050422f1dad Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Wed, 12 Oct 2022 10:45:41 +1100 Subject: [PATCH 176/309] =?UTF-8?q?fix=20useOffline=20having=20incorrect?= =?UTF-8?q?=20state=20when=20listener=20isn=E2=80=99t=20fired?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/useOffline.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/hooks/useOffline.ts b/src/hooks/useOffline.ts index f5f09ce3..ad5cb199 100644 --- a/src/hooks/useOffline.ts +++ b/src/hooks/useOffline.ts @@ -1,11 +1,14 @@ import { useState, useEffect } from "react"; export default function useOffline() { - const [isOffline, setIsOffline] = useState(true); + const [isOffline, setIsOffline] = useState(false); const handleOffline = () => setIsOffline(true); const handleOnline = () => setIsOffline(false); useEffect(() => { + // Need to set here because the listener doesn’t fire on initial load + setIsOffline(!window.navigator.onLine); + window.addEventListener("offline", handleOffline); window.addEventListener("online", handleOnline); From a24f2bd227a617d031ff0df684bcb147d76b9b17 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Wed, 12 Oct 2022 10:46:48 +1100 Subject: [PATCH 177/309] DebugPage: fix animations --- src/pages/Settings/DebugPage.tsx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/pages/Settings/DebugPage.tsx b/src/pages/Settings/DebugPage.tsx index d3ec7ad1..e5c64fa6 100644 --- a/src/pages/Settings/DebugPage.tsx +++ b/src/pages/Settings/DebugPage.tsx @@ -41,7 +41,7 @@ export default function DebugPage() { {userRoles.includes("ADMIN") && } - + - )} - - + {!hideCancel && ( + + )} + + + + ); } From 8dddfcd5335f5bd68a9053ff14c57f5c4690e051 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Fri, 14 Oct 2022 16:15:41 +1100 Subject: [PATCH 183/309] add basic read-only table --- package.json | 1 + src/components/Table/Styled/StyledCell.tsx | 18 + src/components/Table/Styled/StyledRow.tsx | 11 + src/components/Table/Styled/StyledTable.tsx | 7 + src/components/Table/Table.tsx | 409 +++++++----------- .../fields/SingleSelect/Settings.tsx | 2 +- src/layouts/Navigation/Navigation.tsx | 2 +- src/pages/Table/TablePage.tsx | 26 +- yarn.lock | 12 + 9 files changed, 221 insertions(+), 267 deletions(-) create mode 100644 src/components/Table/Styled/StyledCell.tsx create mode 100644 src/components/Table/Styled/StyledRow.tsx create mode 100644 src/components/Table/Styled/StyledTable.tsx diff --git a/package.json b/package.json index fb029fc7..e743edda 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "@mui/x-date-pickers": "^5.0.0-alpha.4", "@rowy/form-builder": "^0.7.0", "@rowy/multiselect": "^0.4.1", + "@tanstack/react-table": "^8.5.15", "@tinymce/tinymce-react": "^3", "@uiw/react-md-editor": "^3.14.1", "algoliasearch": "^4.13.1", diff --git a/src/components/Table/Styled/StyledCell.tsx b/src/components/Table/Styled/StyledCell.tsx new file mode 100644 index 00000000..0676daa2 --- /dev/null +++ b/src/components/Table/Styled/StyledCell.tsx @@ -0,0 +1,18 @@ +import { styled } from "@mui/material"; + +export const StyledCell = styled("div")(({ theme }) => ({ + display: "flex", + alignItems: "center", + "--cell-padding": theme.spacing(1.5), + padding: "0 var(--cell-padding)", + + overflow: "visible", + contain: "none", + position: "relative", + + lineHeight: "calc(var(--row-height) - 1px)", + + borderBottom: `1px solid ${theme.palette.divider}`, + borderLeft: `1px solid ${theme.palette.divider}`, +})); +StyledCell.displayName = "StyledCell"; diff --git a/src/components/Table/Styled/StyledRow.tsx b/src/components/Table/Styled/StyledRow.tsx new file mode 100644 index 00000000..4e76b1d8 --- /dev/null +++ b/src/components/Table/Styled/StyledRow.tsx @@ -0,0 +1,11 @@ +import { styled } from "@mui/material"; + +import { DEFAULT_ROW_HEIGHT } from "@src/components/Table"; + +export const StyledRow = styled("div")(({ theme }) => ({ + display: "flex", + height: DEFAULT_ROW_HEIGHT, + + backgroundColor: theme.palette.background.paper, +})); +StyledRow.displayName = "StyledRow"; diff --git a/src/components/Table/Styled/StyledTable.tsx b/src/components/Table/Styled/StyledTable.tsx new file mode 100644 index 00000000..fc855036 --- /dev/null +++ b/src/components/Table/Styled/StyledTable.tsx @@ -0,0 +1,7 @@ +import { styled } from "@mui/material"; + +export const StyledTable = styled("div")(({ theme }) => ({ + ...(theme.typography.caption as any), + lineHeight: "inherit !important", +})); +StyledTable.displayName = "StyledTable"; diff --git a/src/components/Table/Table.tsx b/src/components/Table/Table.tsx index 308e8767..6dbddcaf 100644 --- a/src/components/Table/Table.tsx +++ b/src/components/Table/Table.tsx @@ -5,19 +5,26 @@ import { DndProvider } from "react-dnd"; import { HTML5Backend } from "react-dnd-html5-backend"; import { findIndex } from "lodash-es"; -// import "react-data-grid/dist/react-data-grid.css"; -import DataGrid, { - Column, - DataGridHandle, - // SelectColumn as _SelectColumn, -} from "react-data-grid"; +import { + createColumnHelper, + flexRender, + getCoreRowModel, + useReactTable, +} from "@tanstack/react-table"; + +import { TOP_BAR_HEIGHT } from "@src/layouts/Navigation/TopBar"; +import { TABLE_TOOLBAR_HEIGHT } from "@src/components/TableToolbar"; +import { StyledTable } from "./Styled/StyledTable"; +import { StyledRow } from "./Styled/StyledRow"; +import ColumnHeaderComponent from "./Column"; + import { LinearProgress } from "@mui/material"; import TableContainer, { OUT_OF_ORDER_MARGIN } from "./TableContainer"; import ColumnHeader, { COLUMN_HEADER_HEIGHT } from "./ColumnHeader"; import FinalColumnHeader from "./FinalColumnHeader"; import FinalColumn from "./formatters/FinalColumn"; -import TableRow from "./TableRow"; +// import TableRow from "./TableRow"; import EmptyState from "@src/components/EmptyState"; // import BulkActions from "./BulkActions"; import AddRow from "@src/components/TableToolbar/AddRow"; @@ -47,22 +54,21 @@ import { import { getFieldType, getFieldProp } from "@src/components/fields"; import { FieldType } from "@src/constants/fields"; import { formatSubTableName } from "@src/utils/table"; -import { ColumnConfig } from "@src/types/table"; +import { TableRow, ColumnConfig } from "@src/types/table"; +import { StyledCell } from "./Styled/StyledCell"; -export type DataGridColumn = ColumnConfig & Column & { isNew?: true }; export const DEFAULT_ROW_HEIGHT = 41; export const DEFAULT_COL_WIDTH = 150; export const MAX_COL_WIDTH = 380; -const rowKeyGetter = (row: any) => row.id; -const rowClass = (row: any) => (row._rowy_outOfOrder ? "out-of-order" : ""); -//const SelectColumn = { ..._SelectColumn, width: 42, maxWidth: 42 }; +declare module "@tanstack/table-core" { + interface ColumnMeta extends ColumnConfig {} +} -export default function Table({ - dataGridRef, -}: { - dataGridRef?: React.MutableRefObject; -}) { +const columnHelper = createColumnHelper(); +const getRowId = (row: TableRow) => row._rowy_ref.path || row._rowy_ref.id; + +export default function TableComponent() { const [userRoles] = useAtom(userRolesAtom, projectScope); const [userSettings] = useAtom(userSettingsAtom, projectScope); @@ -78,266 +84,143 @@ export default function Table({ const updateColumn = useSetAtom(updateColumnAtom, tableScope); const updateField = useSetAtom(updateFieldAtom, tableScope); + const canAddColumn = userRoles.includes("ADMIN"); const userDocHiddenFields = userSettings.tables?.[formatSubTableName(tableId)]?.hiddenFields; - // Get column configs from table schema and map them to DataGridColumns - // Also filter out hidden columns and add end column + // Get column defs from table schema + // Also add end column for admins const columns = useMemo(() => { - const _columns: DataGridColumn[] = tableColumnsOrdered - .filter((column) => { - if (column.hidden) return false; - if ( - Array.isArray(userDocHiddenFields) && - userDocHiddenFields.includes(column.key) - ) - return false; - return true; - }) - .map((column: any) => ({ - draggable: true, - resizable: true, - frozen: column.fixed, - headerRenderer: ColumnHeader, - formatter: - getFieldProp("TableCell", getFieldType(column)) ?? - function InDev() { - return null; - }, - editor: - getFieldProp("TableEditor", getFieldType(column)) ?? - function InDev() { - return null; - }, - ...column, - editable: - tableSettings.readOnly && !userRoles.includes("ADMIN") - ? false - : column.editable ?? true, - width: column.width ?? DEFAULT_COL_WIDTH, - })); + const _columns = tableColumnsOrdered + // .filter((column) => { + // if (column.hidden) return false; + // if ( + // Array.isArray(userDocHiddenFields) && + // userDocHiddenFields.includes(column.key) + // ) + // return false; + // return true; + // }) + .map((columnConfig) => + columnHelper.accessor(columnConfig.fieldName, { + meta: columnConfig, + // draggable: true, + // resizable: true, + // frozen: columnConfig.fixed, + // headerRenderer: ColumnHeader, + // formatter: + // getFieldProp("TableCell", getFieldType(columnConfig)) ?? + // function InDev() { + // return null; + // }, + // editor: + // getFieldProp("TableEditor", getFieldType(columnConfig)) ?? + // function InDev() { + // return null; + // }, + // ...columnConfig, + // editable: + // tableSettings.readOnly && !userRoles.includes("ADMIN") + // ? false + // : columnConfig.editable ?? true, + // width: columnConfig.width ?? DEFAULT_COL_WIDTH, + }) + ); - if (userRoles.includes("ADMIN") || !tableSettings.readOnly) { - _columns.push({ - isNew: true, - key: "new", - fieldName: "_rowy_new", - name: "Add column", - type: FieldType.last, - index: _columns.length ?? 0, - width: 154, - headerRenderer: FinalColumnHeader, - headerCellClass: "final-column-header", - cellClass: "final-column-cell", - formatter: FinalColumn, - editable: false, - }); - } + // if (canAddColumn || !tableSettings.readOnly) { + // _columns.push({ + // isNew: true, + // key: "new", + // fieldName: "_rowy_new", + // name: "Add column", + // type: FieldType.last, + // index: _columns.length ?? 0, + // width: 154, + // headerRenderer: FinalColumnHeader, + // headerCellClass: "final-column-header", + // cellClass: "final-column-cell", + // formatter: FinalColumn, + // editable: false, + // }); + // } return _columns; }, [ tableColumnsOrdered, - userDocHiddenFields, - tableSettings.readOnly, - userRoles, + // userDocHiddenFields, + // tableSettings.readOnly, + // canAddColumn, ]); - const selectedColumnIndex = useMemo(() => { - if (!selectedCell?.columnKey) return -1; - return findIndex(columns, ["key", selectedCell.columnKey]); - }, [selectedCell?.columnKey, columns]); - // Handle columns with field names that use dot notation (nested fields) - const rows = - useMemo(() => { - // const columnsWithNestedFieldNames = columns - // .map((col) => col.fieldName) - // .filter((fieldName) => fieldName.includes(".")); + const table = useReactTable({ + data: tableRows, + columns, + getCoreRowModel: getCoreRowModel(), + getRowId, + columnResizeMode: "onChange", + // debugRows: true, + }); + console.log(table); - // if (columnsWithNestedFieldNames.length === 0) - return tableRows; - - // return tableRows.map((row) => - // columnsWithNestedFieldNames.reduce( - // (acc, fieldName) => ({ - // ...acc, - // [fieldName]: get(row, fieldName), - // }), - // { ...row } - // ) - // ); - }, [tableRows]) ?? []; - - // const [selectedRowsSet, setSelectedRowsSet] = useState>(); - // const [selectedRows, setSelectedRows] = useState([]); - - // Gets more rows when scrolled down. - // https://github.com/adazzle/react-data-grid/blob/ead05032da79d7e2b86e37cdb9af27f2a4d80b90/stories/demos/AllFeatures.tsx#L60 - const handleScroll = useThrottledCallback( - (event: React.UIEvent) => { - // Select corresponding header cell when scrolled to prevent jumping - dataGridRef?.current?.selectCell({ - idx: - selectedColumnIndex > -1 ? selectedColumnIndex : columns.length - 1, - rowIdx: -1, - }); - // console.log( - // "scroll", - // dataGridRef?.current, - // selectedColumnIndex, - // columns.length - // ); - - const target = event.target as HTMLDivElement; - - // TODO: - // if (navPinned && !columns[0].fixed) - // setShowLeftScrollDivider(target.scrollLeft > 16); - - const offset = 800; - const isAtBottom = - target.clientHeight + target.scrollTop >= target.scrollHeight - offset; - if (!isAtBottom) return; - // Call for the next page - setTablePage((p) => p + 1); - }, - 250 - ); - - const [showLeftScrollDivider, setShowLeftScrollDivider] = useState(false); - - const rowHeight = tableSchema.rowHeight ?? DEFAULT_ROW_HEIGHT; - const handleResize = useDebouncedCallback( - (colIndex: number, width: number) => { - const column = columns[colIndex]; - if (!column.key) return; - updateColumn({ key: column.key, config: { width } }); - }, - 1000 - ); + const handleKeyDown = (e: React.KeyboardEvent) => {}; return ( - }> - {/* */} - - - {showLeftScrollDivider &&
    } + <> + +
    + {table.getHeaderGroups().map((headerGroup) => ( + + {headerGroup.headers.map((header) => ( + + {/*
    */} + + ))} + + ))} +
    - { - if (dataGridRef) dataGridRef.current = handle; - }} - rows={rows} - columns={columns} - // Increase row height of out of order rows to add margins - rowHeight={({ row }) => { - if (row._rowy_outOfOrder) - return rowHeight + OUT_OF_ORDER_MARGIN + 1; - - return rowHeight; - }} - headerRowHeight={DEFAULT_ROW_HEIGHT + 1} - className="rdg-light" // Handle dark mode in MUI theme - cellNavigationMode="LOOP_OVER_ROW" - rowRenderer={TableRow} - rowKeyGetter={rowKeyGetter} - rowClass={rowClass} - // selectedRows={selectedRowsSet} - // onSelectedRowsChange={(newSelectedSet) => { - // const newSelectedArray = newSelectedSet - // ? [...newSelectedSet] - // : []; - // const prevSelectedRowsArray = selectedRowsSet - // ? [...selectedRowsSet] - // : []; - // const addedSelections = difference( - // newSelectedArray, - // prevSelectedRowsArray - // ); - // const removedSelections = difference( - // prevSelectedRowsArray, - // newSelectedArray - // ); - // addedSelections.forEach((id) => { - // const newRow = find(rows, { id }); - // setSelectedRows([...selectedRows, newRow]); - // }); - // removedSelections.forEach((rowId) => { - // setSelectedRows(selectedRows.filter((row) => row.id !== rowId)); - // }); - // setSelectedRowsSet(newSelectedSet); - // }} - // onRowsChange={() => { - //console.log('onRowsChange',rows) - // }} - // TODO: onFill={(e) => { - // console.log("onFill", e); - // const { columnKey, sourceRow, targetRows } = e; - // if (updateCell) - // targetRows.forEach((row) => - // updateCell(row._rowy_ref, columnKey, sourceRow[columnKey]) - // ); - // return []; - // }} - onPaste={(e, ...args) => { - console.log("onPaste", e, ...args); - const value = e.sourceRow[e.sourceColumnKey]; - updateField({ - path: e.targetRow._rowy_ref.path, - fieldName: e.targetColumnKey, - value, - }); - }} - onSelectedCellChange={({ rowIdx, idx }) => { - if (!rows[rowIdx]?._rowy_ref) return; // May be the header row - - const path = rows[rowIdx]._rowy_ref.path; - if (!path) return; - - const columnKey = tableColumnsOrdered.filter((col) => - userDocHiddenFields - ? !userDocHiddenFields.includes(col.key) - : true - )[idx]?.key; - if (!columnKey) return; // May be the final column - - setSelectedCell({ path, columnKey }); - }} - /> - - - {tableRows.length === 0 && ( - -
    - -
    - } - style={{ - position: "absolute", - inset: 0, - top: COLUMN_HEADER_HEIGHT, - height: "auto", - }} - /> - )} - {tableNextPage.loading && } - - - - {/* - { - setSelectedRowsSet(new Set()); - setSelectedRows([]); - }} - /> */} - +
    + {table.getRowModel().rows.map((row) => ( + + {row.getVisibleCells().map((cell) => ( + + {flexRender(cell.column.columnDef.cell, cell.getContext())} + + + ))} + + ))} +
    +
    + ); } diff --git a/src/components/fields/SingleSelect/Settings.tsx b/src/components/fields/SingleSelect/Settings.tsx index 103bb2cd..2fc908b9 100644 --- a/src/components/fields/SingleSelect/Settings.tsx +++ b/src/components/fields/SingleSelect/Settings.tsx @@ -93,7 +93,7 @@ export default function Settings({ onChange, config }: ISettingsProps) { onChange={(e) => { setNewOption(e.target.value); }} - onKeyPress={(e: any) => { + onKeyDown={(e: any) => { if (e.key === "Enter") { handleAdd(); } diff --git a/src/layouts/Navigation/Navigation.tsx b/src/layouts/Navigation/Navigation.tsx index f17053a1..3f967301 100644 --- a/src/layouts/Navigation/Navigation.tsx +++ b/src/layouts/Navigation/Navigation.tsx @@ -62,7 +62,7 @@ export default function Navigation({ children }: React.PropsWithChildren<{}>) { } > -
    +
    {children}
    diff --git a/src/pages/Table/TablePage.tsx b/src/pages/Table/TablePage.tsx index 4d682fc3..17e8213a 100644 --- a/src/pages/Table/TablePage.tsx +++ b/src/pages/Table/TablePage.tsx @@ -4,7 +4,7 @@ import { DataGridHandle } from "react-data-grid"; import { ErrorBoundary } from "react-error-boundary"; import { isEmpty } from "lodash-es"; -import { Fade } from "@mui/material"; +import { Box, Fade } from "@mui/material"; import ErrorFallback, { InlineErrorFallback, } from "@src/components/ErrorFallback"; @@ -27,6 +27,12 @@ import { import useBeforeUnload from "@src/hooks/useBeforeUnload"; import ActionParamsProvider from "@src/components/fields/Action/FormDialog/Provider"; import { useSnackLogContext } from "@src/contexts/SnackLogContext"; +import { TOP_BAR_HEIGHT } from "@src/layouts/Navigation/TopBar"; +import { TABLE_TOOLBAR_HEIGHT } from "@src/components/TableToolbar"; +import { + DRAWER_COLLAPSED_WIDTH, + DRAWER_WIDTH, +} from "@src/components/SideDrawer"; // prettier-ignore const BuildLogsSnack = lazy(() => import("@src/components/TableModals/CloudLogsModal/BuildLogs/BuildLogsSnack" /* webpackChunkName: "TableModals-BuildLogsSnack" */)); @@ -93,7 +99,23 @@ export default function TablePage({ }> - + + `max(env(safe-area-inset-bottom), ${theme.spacing(2)})`, + }, + }} + > +
    + diff --git a/yarn.lock b/yarn.lock index 4d281370..b6e7cfa3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2688,6 +2688,18 @@ dependencies: "@jest/create-cache-key-function" "^27.4.2" +"@tanstack/react-table@^8.5.15": + version "8.5.15" + resolved "https://registry.yarnpkg.com/@tanstack/react-table/-/react-table-8.5.15.tgz#8179d24d7fdf909799a517e8897501c44e51284d" + integrity sha512-9rSvhIFeMpfXksFgQNTWnVoJbkae/U8CkHnHYGWAIB/O0Ca51IKap0Rjp5WkIUVBWxJ7Wfl2y13oY+aWcyM6Rg== + dependencies: + "@tanstack/table-core" "8.5.15" + +"@tanstack/table-core@8.5.15": + version "8.5.15" + resolved "https://registry.yarnpkg.com/@tanstack/table-core/-/table-core-8.5.15.tgz#e1e674135cd6c36f29a1562a2b846f824861149b" + integrity sha512-k+BcCOAYD610Cij6p1BPyEqjMQjZIdAnVDoIUKVnA/tfHbF4JlDP7pKAftXPBxyyX5Z1yQPurPnOdEY007Snyg== + "@testing-library/dom@^8.5.0": version "8.13.0" resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.13.0.tgz#bc00bdd64c7d8b40841e27a70211399ad3af46f5" From 4f49503e7a20bd54649b6b8fface6aeb88f26747 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Mon, 17 Oct 2022 17:57:26 +1100 Subject: [PATCH 184/309] add cell navigation --- src/atoms/tableScope/ui.ts | 5 +- src/components/Table/Styled/StyledTable.tsx | 11 + src/components/Table/Table.tsx | 218 +++++++++++++++++--- 3 files changed, 207 insertions(+), 27 deletions(-) diff --git a/src/atoms/tableScope/ui.ts b/src/atoms/tableScope/ui.ts index fa987118..a26ea065 100644 --- a/src/atoms/tableScope/ui.ts +++ b/src/atoms/tableScope/ui.ts @@ -124,7 +124,10 @@ export const importAirtableAtom = atom<{ /** Store side drawer open state */ export const sideDrawerOpenAtom = atom(false); -export type SelectedCell = { path: string; columnKey: string }; +export type SelectedCell = { + path: string | "_rowy_header"; + columnKey: string | "_rowy_row_actions"; +}; /** Store selected cell in table. Used in side drawer and context menu */ export const selectedCellAtom = atom(null); diff --git a/src/components/Table/Styled/StyledTable.tsx b/src/components/Table/Styled/StyledTable.tsx index fc855036..ab65a84c 100644 --- a/src/components/Table/Styled/StyledTable.tsx +++ b/src/components/Table/Styled/StyledTable.tsx @@ -3,5 +3,16 @@ import { styled } from "@mui/material"; export const StyledTable = styled("div")(({ theme }) => ({ ...(theme.typography.caption as any), lineHeight: "inherit !important", + + "& [role='columnheader'], & [role='gridcell']": { + "&[aria-selected='true']": { + outline: `1px solid ${theme.palette.primary.main}`, + outlineOffset: "-1px", + }, + "&:focus": { + outline: `2px solid ${theme.palette.primary.main}`, + outlineOffset: "-2px", + }, + }, })); StyledTable.displayName = "StyledTable"; diff --git a/src/components/Table/Table.tsx b/src/components/Table/Table.tsx index 6dbddcaf..547016a7 100644 --- a/src/components/Table/Table.tsx +++ b/src/components/Table/Table.tsx @@ -1,4 +1,4 @@ -import React, { useMemo, useState, Suspense } from "react"; +import React, { useMemo, useState, Suspense, useRef } from "react"; import { useAtom, useSetAtom } from "jotai"; import { useDebouncedCallback, useThrottledCallback } from "use-debounce"; import { DndProvider } from "react-dnd"; @@ -49,7 +49,9 @@ import { updateColumnAtom, updateFieldAtom, selectedCellAtom, + SelectedCell, } from "@src/atoms/tableScope"; +import { COLLECTION_PAGE_SIZE } from "@src/config/db"; import { getFieldType, getFieldProp } from "@src/components/fields"; import { FieldType } from "@src/constants/fields"; @@ -84,7 +86,11 @@ export default function TableComponent() { const updateColumn = useSetAtom(updateColumnAtom, tableScope); const updateField = useSetAtom(updateFieldAtom, tableScope); + const gridRef = useRef(null); + const [focusInsideCell, setFocusInsideCell] = useState(false); + const canAddColumn = userRoles.includes("ADMIN"); + const canEditColumn = userRoles.includes("ADMIN"); const userDocHiddenFields = userSettings.tables?.[formatSubTableName(tableId)]?.hiddenFields; @@ -103,6 +109,7 @@ export default function TableComponent() { // }) .map((columnConfig) => columnHelper.accessor(columnConfig.fieldName, { + id: columnConfig.fieldName, meta: columnConfig, // draggable: true, // resizable: true, @@ -160,28 +167,162 @@ export default function TableComponent() { columnResizeMode: "onChange", // debugRows: true, }); - console.log(table); + console.log(table, selectedCell); - const handleKeyDown = (e: React.KeyboardEvent) => {}; + const handleKeyDown = (e: React.KeyboardEvent) => { + console.log( + "keydown", + // e.target, + e.key, + e.ctrlKey ? "ctrl" : "", + e.altKey ? "alt" : "", + e.metaKey ? "meta" : "", + e.shiftKey ? "shift" : "" + ); + const LISTENED_KEYS = [ + "ArrowUp", + "ArrowDown", + "ArrowLeft", + "ArrowRight", + "Enter", + "Escape", + "Home", + "End", + "PageUp", + "PageDown", + ]; + if (LISTENED_KEYS.includes(e.key)) e.preventDefault(); + + const target = e.target as HTMLDivElement; + if ( + target.getAttribute("role") !== "columnheader" && + target.getAttribute("role") !== "gridcell" + ) + return; + + const colIndex = Number(target.getAttribute("aria-colindex")) - 1; + const rowIndex = + Number(target.parentElement!.getAttribute("aria-rowindex")) - 2; + + const rowId = target.getAttribute("data-rowId")!; + const colId = target.getAttribute("data-colId")!; + + const isHeader = rowId === "_rowy_header"; + + let newColIndex = colIndex; + let newRowIndex = rowIndex; + + // const newSelectedCell: SelectedCell = selectedCell + // ? { ...selectedCell } + // : { path: rowId, columnKey: colId }; + + switch (e.key) { + case "ArrowUp": + if (rowIndex > -1) newRowIndex = rowIndex - 1; + break; + + case "ArrowDown": + if (rowIndex < tableRows.length - 1) newRowIndex = rowIndex + 1; + break; + + case "ArrowLeft": + if (colIndex > 0) newColIndex = colIndex - 1; + break; + + case "ArrowRight": + if (colIndex < columns.length - 1) newColIndex = colIndex + 1; + break; + + case "PageUp": + newRowIndex = Math.max(0, rowIndex - COLLECTION_PAGE_SIZE); + break; + + case "PageDown": + newRowIndex = Math.min( + tableRows.length - 1, + rowIndex + COLLECTION_PAGE_SIZE + ); + break; + + case "Home": + newColIndex = 0; + if (e.ctrlKey || e.metaKey) newRowIndex = -1; + break; + + case "End": + newColIndex = columns.length - 1; + if (e.ctrlKey || e.metaKey) newRowIndex = tableRows.length - 1; + break; + } + + const newSelectedCell = { + path: + newRowIndex > -1 + ? tableRows[newRowIndex]._rowy_ref.path + : "_rowy_header", + columnKey: columns[newColIndex].id! || columns[0].id!, + }; + console.log(newRowIndex, newColIndex, newSelectedCell); + + setSelectedCell(newSelectedCell); + + // Find matching DOM element for the cell + const newCellEl = gridRef.current?.querySelector( + `[aria-rowindex="${newRowIndex + 2}"] [aria-colindex="${ + newColIndex + 1 + }"]` + ); + // Focus either the cell or the first focusable element in the cell + if (newCellEl) (newCellEl as HTMLDivElement).focus(); + }; return ( <> -
    +
    {table.getHeaderGroups().map((headerGroup) => ( - - {headerGroup.headers.map((header) => ( - - {/*
    + {headerGroup.headers.map((header) => { + const isFocusable = + (!selectedCell && header.index === 0) || + (selectedCell?.path === "_rowy_header" && + selectedCell?.columnKey === header.id); + + return ( + { + setSelectedCell({ + path: "_rowy_header", + columnKey: header.id, + }); + (e.target as HTMLDivElement).focus(); + }} + > + {/*
    */} - - ))} + + ); + })} ))}
    -
    +
    {table.getRowModel().rows.map((row) => ( - - {row.getVisibleCells().map((cell) => ( - - {flexRender(cell.column.columnDef.cell, cell.getContext())} - - - ))} + + {row.getVisibleCells().map((cell, cellIndex) => { + const isFocusable = + selectedCell?.path === row.original._rowy_ref.path && + selectedCell?.columnKey === cell.column.id; + + return ( + { + setSelectedCell({ + path: row.original._rowy_ref.path, + columnKey: cell.column.id, + }); + (e.target as HTMLDivElement).focus(); + }} + > + {flexRender(cell.column.columnDef.cell, cell.getContext())} + + + ); + })} ))}
    From 0e7a02bf08717030d699e930e4fad319dd7be718 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Tue, 18 Oct 2022 14:49:17 +1100 Subject: [PATCH 185/309] add in-cell focus with Enter/Esc --- src/components/Table/Styled/StyledTable.tsx | 8 ++-- src/components/Table/Table.tsx | 49 +++++++++++++++------ 2 files changed, 39 insertions(+), 18 deletions(-) diff --git a/src/components/Table/Styled/StyledTable.tsx b/src/components/Table/Styled/StyledTable.tsx index ab65a84c..2f08622b 100644 --- a/src/components/Table/Styled/StyledTable.tsx +++ b/src/components/Table/Styled/StyledTable.tsx @@ -6,13 +6,13 @@ export const StyledTable = styled("div")(({ theme }) => ({ "& [role='columnheader'], & [role='gridcell']": { "&[aria-selected='true']": { - outline: `1px solid ${theme.palette.primary.main}`, - outlineOffset: "-1px", - }, - "&:focus": { outline: `2px solid ${theme.palette.primary.main}`, outlineOffset: "-2px", }, + "&:focus": { + outlineWidth: "3px", + outlineOffset: "-3px", + }, }, })); StyledTable.displayName = "StyledTable"; diff --git a/src/components/Table/Table.tsx b/src/components/Table/Table.tsx index 547016a7..ecca81de 100644 --- a/src/components/Table/Table.tsx +++ b/src/components/Table/Table.tsx @@ -167,7 +167,7 @@ export default function TableComponent() { columnResizeMode: "onChange", // debugRows: true, }); - console.log(table, selectedCell); + // console.log(table, selectedCell); const handleKeyDown = (e: React.KeyboardEvent) => { console.log( @@ -193,6 +193,14 @@ export default function TableComponent() { ]; if (LISTENED_KEYS.includes(e.key)) e.preventDefault(); + if (e.key === "Escape") { + setFocusInsideCell(false); + ( + gridRef.current?.querySelector("[aria-selected=true]") as HTMLDivElement + )?.focus(); + return; + } + const target = e.target as HTMLDivElement; if ( target.getAttribute("role") !== "columnheader" && @@ -200,6 +208,12 @@ export default function TableComponent() { ) return; + if (e.key === "Enter") { + setFocusInsideCell(true); + (target.querySelector("[tabindex]") as HTMLElement)?.focus(); + return; + } + const colIndex = Number(target.getAttribute("aria-colindex")) - 1; const rowIndex = Number(target.parentElement!.getAttribute("aria-rowindex")) - 2; @@ -218,19 +232,23 @@ export default function TableComponent() { switch (e.key) { case "ArrowUp": - if (rowIndex > -1) newRowIndex = rowIndex - 1; + if (e.ctrlKey || e.metaKey) newRowIndex = -1; + else if (rowIndex > -1) newRowIndex = rowIndex - 1; break; case "ArrowDown": - if (rowIndex < tableRows.length - 1) newRowIndex = rowIndex + 1; + if (e.ctrlKey || e.metaKey) newRowIndex = tableRows.length - 1; + else if (rowIndex < tableRows.length - 1) newRowIndex = rowIndex + 1; break; case "ArrowLeft": - if (colIndex > 0) newColIndex = colIndex - 1; + if (e.ctrlKey || e.metaKey) newColIndex = 0; + else if (colIndex > 0) newColIndex = colIndex - 1; break; case "ArrowRight": - if (colIndex < columns.length - 1) newColIndex = colIndex + 1; + if (e.ctrlKey || e.metaKey) newColIndex = columns.length - 1; + else if (colIndex < columns.length - 1) newColIndex = colIndex + 1; break; case "PageUp": @@ -272,8 +290,9 @@ export default function TableComponent() { newColIndex + 1 }"]` ); - // Focus either the cell or the first focusable element in the cell + // Focus the cell if (newCellEl) (newCellEl as HTMLDivElement).focus(); + setFocusInsideCell(false); }; return ( @@ -295,7 +314,7 @@ export default function TableComponent() { {table.getHeaderGroups().map((headerGroup) => ( {headerGroup.headers.map((header) => { - const isFocusable = + const isSelectedCell = (!selectedCell && header.index === 0) || (selectedCell?.path === "_rowy_header" && selectedCell?.columnKey === header.id); @@ -306,11 +325,11 @@ export default function TableComponent() { data-rowId={"_rowy_header"} data-colId={header.id} role="columnheader" - tabIndex={isFocusable ? 0 : -1} + tabIndex={isSelectedCell ? 0 : -1} aria-colindex={header.index + 1} aria-readonly={canEditColumn} // TODO: aria-sort={"none" | "ascending" | "descending" | "other" | undefined} - aria-selected={isFocusable} + aria-selected={isSelectedCell} label={header.column.columnDef.meta?.name || header.id} type={header.column.columnDef.meta?.type} style={{ width: header.getSize() }} @@ -351,7 +370,7 @@ export default function TableComponent() { {table.getRowModel().rows.map((row) => ( {row.getVisibleCells().map((cell, cellIndex) => { - const isFocusable = + const isSelectedCell = selectedCell?.path === row.original._rowy_ref.path && selectedCell?.columnKey === cell.column.id; @@ -361,12 +380,12 @@ export default function TableComponent() { data-rowId={row.id} data-colId={cell.column.id} role="gridcell" - tabIndex={isFocusable ? 0 : -1} + tabIndex={isSelectedCell && !focusInsideCell ? 0 : -1} aria-colindex={cellIndex + 1} aria-readonly={ cell.column.columnDef.meta?.editable === false } - aria-selected={isFocusable} + aria-selected={isSelectedCell} style={{ width: cell.column.getSize() }} onClick={(e) => { setSelectedCell({ @@ -377,8 +396,10 @@ export default function TableComponent() { }} > {flexRender(cell.column.columnDef.cell, cell.getContext())} - ); From bc23b93b428af17cb84afbd2b806e1e8159f7369 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Tue, 18 Oct 2022 15:05:11 +1100 Subject: [PATCH 186/309] SideDrawer: add aria-labels to buttons --- src/components/SideDrawer/SideDrawer.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/components/SideDrawer/SideDrawer.tsx b/src/components/SideDrawer/SideDrawer.tsx index eafdcdfa..c4a02119 100644 --- a/src/components/SideDrawer/SideDrawer.tsx +++ b/src/components/SideDrawer/SideDrawer.tsx @@ -141,6 +141,7 @@ export default function SideDrawer({ {!!cell && (
    { if (setOpen) From c7d97d26986eed19bb00d57b38e27747a793467b Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Tue, 18 Oct 2022 17:53:47 +1100 Subject: [PATCH 187/309] add virtualization + infinite scrolll --- package.json | 1 + src/components/Table/Table.tsx | 320 +++++++++--------- .../Table/useKeyboardNavigation.tsx | 140 ++++++++ src/pages/Table/TablePage.tsx | 10 +- yarn.lock | 12 + 5 files changed, 316 insertions(+), 167 deletions(-) create mode 100644 src/components/Table/useKeyboardNavigation.tsx diff --git a/package.json b/package.json index e743edda..baf6cda0 100644 --- a/package.json +++ b/package.json @@ -65,6 +65,7 @@ "react-router-hash-link": "^2.4.3", "react-scripts": "^5.0.0", "react-usestateref": "^1.0.8", + "react-virtual": "^2.10.4", "remark-gfm": "^3.0.1", "seedrandom": "^3.0.5", "stream-browserify": "^3.0.0", diff --git a/src/components/Table/Table.tsx b/src/components/Table/Table.tsx index ecca81de..153b5576 100644 --- a/src/components/Table/Table.tsx +++ b/src/components/Table/Table.tsx @@ -1,4 +1,4 @@ -import React, { useMemo, useState, Suspense, useRef } from "react"; +import { useMemo, useRef, useCallback, Suspense, useEffect } from "react"; import { useAtom, useSetAtom } from "jotai"; import { useDebouncedCallback, useThrottledCallback } from "use-debounce"; import { DndProvider } from "react-dnd"; @@ -11,6 +11,7 @@ import { getCoreRowModel, useReactTable, } from "@tanstack/react-table"; +import { useVirtual } from "react-virtual"; import { TOP_BAR_HEIGHT } from "@src/layouts/Navigation/TopBar"; import { TABLE_TOOLBAR_HEIGHT } from "@src/components/TableToolbar"; @@ -58,6 +59,7 @@ import { FieldType } from "@src/constants/fields"; import { formatSubTableName } from "@src/utils/table"; import { TableRow, ColumnConfig } from "@src/types/table"; import { StyledCell } from "./Styled/StyledCell"; +import { useKeyboardNavigation } from "./useKeyboardNavigation"; export const DEFAULT_ROW_HEIGHT = 41; export const DEFAULT_COL_WIDTH = 150; @@ -86,8 +88,8 @@ export default function TableComponent() { const updateColumn = useSetAtom(updateColumnAtom, tableScope); const updateField = useSetAtom(updateFieldAtom, tableScope); + const containerRef = useRef(null); const gridRef = useRef(null); - const [focusInsideCell, setFocusInsideCell] = useState(false); const canAddColumn = userRoles.includes("ADMIN"); const canEditColumn = userRoles.includes("ADMIN"); @@ -167,149 +169,111 @@ export default function TableComponent() { columnResizeMode: "onChange", // debugRows: true, }); + const { rows } = table.getRowModel(); // console.log(table, selectedCell); - const handleKeyDown = (e: React.KeyboardEvent) => { - console.log( - "keydown", - // e.target, - e.key, - e.ctrlKey ? "ctrl" : "", - e.altKey ? "alt" : "", - e.metaKey ? "meta" : "", - e.shiftKey ? "shift" : "" - ); - const LISTENED_KEYS = [ - "ArrowUp", - "ArrowDown", - "ArrowLeft", - "ArrowRight", - "Enter", - "Escape", - "Home", - "End", - "PageUp", - "PageDown", - ]; - if (LISTENED_KEYS.includes(e.key)) e.preventDefault(); + const { + virtualItems: virtualRows, + totalSize: totalHeight, + scrollToIndex: scrollToRowIndex, + } = useVirtual({ + parentRef: containerRef, + size: tableRows.length, + overscan: 10, + estimateSize: useCallback( + () => tableSchema.rowHeight || DEFAULT_ROW_HEIGHT, + [tableSchema.rowHeight] + ), + }); - if (e.key === "Escape") { - setFocusInsideCell(false); - ( - gridRef.current?.querySelector("[aria-selected=true]") as HTMLDivElement - )?.focus(); - return; + const { + virtualItems: virtualCols, + totalSize: totalWidth, + scrollToIndex: scrollToColIndex, + } = useVirtual({ + parentRef: containerRef, + horizontal: true, + size: columns.length, + overscan: 1, + estimateSize: useCallback( + (index: number) => columns[index].size || DEFAULT_COL_WIDTH, + [columns] + ), + }); + + console.log(totalHeight); + + useEffect(() => { + if (!selectedCell) return; + if (selectedCell.path) { + const rowIndex = tableRows.findIndex( + (row) => row._rowy_ref.path === selectedCell.path + ); + if (rowIndex === -1) return; + scrollToRowIndex(rowIndex); } - - const target = e.target as HTMLDivElement; - if ( - target.getAttribute("role") !== "columnheader" && - target.getAttribute("role") !== "gridcell" - ) - return; - - if (e.key === "Enter") { - setFocusInsideCell(true); - (target.querySelector("[tabindex]") as HTMLElement)?.focus(); - return; + if (selectedCell.columnKey) { + const colIndex = columns.findIndex( + (col) => col.id === selectedCell.columnKey + ); + if (colIndex === -1) return; + scrollToColIndex(colIndex); } + }, [selectedCell, tableRows, columns, scrollToRowIndex, scrollToColIndex]); - const colIndex = Number(target.getAttribute("aria-colindex")) - 1; - const rowIndex = - Number(target.parentElement!.getAttribute("aria-rowindex")) - 2; + const { handleKeyDown, focusInsideCell } = useKeyboardNavigation({ + gridRef, + tableRows, + columns, + }); - const rowId = target.getAttribute("data-rowId")!; - const colId = target.getAttribute("data-colId")!; + const paddingTop = virtualRows.length > 0 ? virtualRows?.[0]?.start || 0 : 0; + const paddingBottom = + virtualRows.length > 0 + ? totalHeight - (virtualRows?.[virtualRows.length - 1]?.end || 0) + : 0; - const isHeader = rowId === "_rowy_header"; + const paddingLeft = virtualCols.length > 0 ? virtualCols?.[0]?.start || 0 : 0; + const paddingRight = + virtualCols.length > 0 + ? totalWidth - (virtualCols?.[virtualCols.length - 1]?.end || 0) + : 0; - let newColIndex = colIndex; - let newRowIndex = rowIndex; + const fetchMoreOnBottomReached = useThrottledCallback( + (containerElement?: HTMLDivElement | null) => { + console.log("fetchMoreOnBottomReached", containerElement); + if (!containerElement) return; - // const newSelectedCell: SelectedCell = selectedCell - // ? { ...selectedCell } - // : { path: rowId, columnKey: colId }; - - switch (e.key) { - case "ArrowUp": - if (e.ctrlKey || e.metaKey) newRowIndex = -1; - else if (rowIndex > -1) newRowIndex = rowIndex - 1; - break; - - case "ArrowDown": - if (e.ctrlKey || e.metaKey) newRowIndex = tableRows.length - 1; - else if (rowIndex < tableRows.length - 1) newRowIndex = rowIndex + 1; - break; - - case "ArrowLeft": - if (e.ctrlKey || e.metaKey) newColIndex = 0; - else if (colIndex > 0) newColIndex = colIndex - 1; - break; - - case "ArrowRight": - if (e.ctrlKey || e.metaKey) newColIndex = columns.length - 1; - else if (colIndex < columns.length - 1) newColIndex = colIndex + 1; - break; - - case "PageUp": - newRowIndex = Math.max(0, rowIndex - COLLECTION_PAGE_SIZE); - break; - - case "PageDown": - newRowIndex = Math.min( - tableRows.length - 1, - rowIndex + COLLECTION_PAGE_SIZE - ); - break; - - case "Home": - newColIndex = 0; - if (e.ctrlKey || e.metaKey) newRowIndex = -1; - break; - - case "End": - newColIndex = columns.length - 1; - if (e.ctrlKey || e.metaKey) newRowIndex = tableRows.length - 1; - break; - } - - const newSelectedCell = { - path: - newRowIndex > -1 - ? tableRows[newRowIndex]._rowy_ref.path - : "_rowy_header", - columnKey: columns[newColIndex].id! || columns[0].id!, - }; - console.log(newRowIndex, newColIndex, newSelectedCell); - - setSelectedCell(newSelectedCell); - - // Find matching DOM element for the cell - const newCellEl = gridRef.current?.querySelector( - `[aria-rowindex="${newRowIndex + 2}"] [aria-colindex="${ - newColIndex + 1 - }"]` - ); - // Focus the cell - if (newCellEl) (newCellEl as HTMLDivElement).focus(); - setFocusInsideCell(false); - }; + const { scrollHeight, scrollTop, clientHeight } = containerElement; + if (scrollHeight - scrollTop - clientHeight < 300) { + setTablePage((p) => p + 1); + } + }, + 250 + ); return ( - <> +
    fetchMoreOnBottomReached(e.target as HTMLDivElement)} + style={{ overflow: "auto", width: "100%", height: "100%" }} + >
    {table.getHeaderGroups().map((headerGroup) => ( @@ -322,8 +286,8 @@ export default function TableComponent() { return (
    - {table.getRowModel().rows.map((row) => ( - - {row.getVisibleCells().map((cell, cellIndex) => { - const isSelectedCell = - selectedCell?.path === row.original._rowy_ref.path && - selectedCell?.columnKey === cell.column.id; + {paddingTop > 0 && ( +
    + )} - return ( - { - setSelectedCell({ - path: row.original._rowy_ref.path, - columnKey: cell.column.id, - }); - (e.target as HTMLDivElement).focus(); - }} - > - {flexRender(cell.column.columnDef.cell, cell.getContext())} - - - ); - })} - - ))} + {flexRender( + cell.column.columnDef.cell, + cell.getContext() + )} + + + ); + })} + + {paddingRight > 0 && ( +
    + )} + + ); + })} + + {paddingBottom > 0 && ( +
    + )}
    - +
    ); } diff --git a/src/components/Table/useKeyboardNavigation.tsx b/src/components/Table/useKeyboardNavigation.tsx new file mode 100644 index 00000000..be41e37f --- /dev/null +++ b/src/components/Table/useKeyboardNavigation.tsx @@ -0,0 +1,140 @@ +import { useState } from "react"; +import { useSetAtom } from "jotai"; +import { ColumnDef } from "@tanstack/react-table"; + +import { tableScope, selectedCellAtom } from "@src/atoms/tableScope"; +import { TableRow } from "@src/types/table"; +import { COLLECTION_PAGE_SIZE } from "@src/config/db"; + +export interface IUseKeyboardNavigationProps { + gridRef: React.RefObject; + tableRows: TableRow[]; + columns: ColumnDef[]; +} + +export function useKeyboardNavigation({ + gridRef, + tableRows, + columns, +}: IUseKeyboardNavigationProps) { + const setSelectedCell = useSetAtom(selectedCellAtom, tableScope); + const [focusInsideCell, setFocusInsideCell] = useState(false); + + const handleKeyDown = (e: React.KeyboardEvent) => { + // Block default browser behavior for arrow keys (scroll) and other keys + const LISTENED_KEYS = [ + "ArrowUp", + "ArrowDown", + "ArrowLeft", + "ArrowRight", + "Enter", + "Escape", + "Home", + "End", + "PageUp", + "PageDown", + ]; + if (LISTENED_KEYS.includes(e.key)) e.preventDefault(); + + // Esc: exit cell + if (e.key === "Escape") { + setFocusInsideCell(false); + ( + gridRef.current?.querySelector("[aria-selected=true]") as HTMLDivElement + )?.focus(); + return; + } + + // If event target is not a cell, ignore + const target = e.target as HTMLDivElement; + if ( + target.getAttribute("role") !== "columnheader" && + target.getAttribute("role") !== "gridcell" + ) + return; + + // Enter: enter cell + if (e.key === "Enter") { + setFocusInsideCell(true); + (target.querySelector("[tabindex]") as HTMLElement)?.focus(); + return; + } + + const colIndex = Number(target.getAttribute("aria-colindex")) - 1; + const rowIndex = + Number(target.parentElement!.getAttribute("aria-rowindex")) - 2; + + let newColIndex = colIndex; + let newRowIndex = rowIndex; + + switch (e.key) { + case "ArrowUp": + if (e.ctrlKey || e.metaKey) newRowIndex = -1; + else if (rowIndex > -1) newRowIndex = rowIndex - 1; + break; + + case "ArrowDown": + if (e.ctrlKey || e.metaKey) newRowIndex = tableRows.length - 1; + else if (rowIndex < tableRows.length - 1) newRowIndex = rowIndex + 1; + break; + + case "ArrowLeft": + if (e.ctrlKey || e.metaKey) newColIndex = 0; + else if (colIndex > 0) newColIndex = colIndex - 1; + break; + + case "ArrowRight": + if (e.ctrlKey || e.metaKey) newColIndex = columns.length - 1; + else if (colIndex < columns.length - 1) newColIndex = colIndex + 1; + break; + + case "PageUp": + newRowIndex = Math.max(0, rowIndex - COLLECTION_PAGE_SIZE); + break; + + case "PageDown": + newRowIndex = Math.min( + tableRows.length - 1, + rowIndex + COLLECTION_PAGE_SIZE + ); + break; + + case "Home": + newColIndex = 0; + if (e.ctrlKey || e.metaKey) newRowIndex = -1; + break; + + case "End": + newColIndex = columns.length - 1; + if (e.ctrlKey || e.metaKey) newRowIndex = tableRows.length - 1; + break; + } + + // Get `path` and `columnKey` from `tableRows` and `columns` respectively + const newSelectedCell = { + path: + newRowIndex > -1 + ? tableRows[newRowIndex]._rowy_ref.path + : "_rowy_header", + columnKey: columns[newColIndex].id! || columns[0].id!, + }; + + // Store in selectedCellAtom + setSelectedCell(newSelectedCell); + + // Find matching DOM element for the cell + const newCellEl = gridRef.current?.querySelector( + `[aria-rowindex="${newRowIndex + 2}"] [aria-colindex="${ + newColIndex + 1 + }"]` + ); + + // Focus the cell + if (newCellEl) setTimeout(() => (newCellEl as HTMLDivElement).focus()); + + // When selected cell changes, exit current cell + setFocusInsideCell(false); + }; + + return { handleKeyDown, focusInsideCell } as const; +} diff --git a/src/pages/Table/TablePage.tsx b/src/pages/Table/TablePage.tsx index 17e8213a..b82a411f 100644 --- a/src/pages/Table/TablePage.tsx +++ b/src/pages/Table/TablePage.tsx @@ -101,12 +101,12 @@ export default function TablePage({ }> diff --git a/yarn.lock b/yarn.lock index b6e7cfa3..aa25b7ed 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2363,6 +2363,11 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== +"@reach/observe-rect@^1.1.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@reach/observe-rect/-/observe-rect-1.2.0.tgz#d7a6013b8aafcc64c778a0ccb83355a11204d3b2" + integrity sha512-Ba7HmkFgfQxZqqaeIWWkNK0rEhpxVQHIoVyW1YDSkGsGIXzcaW4deC8B0pZrNSSyLTdIk7y+5olKt5+g0GmFIQ== + "@react-dnd/asap@^4.0.0": version "4.0.1" resolved "https://registry.yarnpkg.com/@react-dnd/asap/-/asap-4.0.1.tgz#5291850a6b58ce6f2da25352a64f1b0674871aab" @@ -10277,6 +10282,13 @@ react-usestateref@^1.0.8: resolved "https://registry.yarnpkg.com/react-usestateref/-/react-usestateref-1.0.8.tgz#b40519af0d6f3b3822c70eb5db80f7d47f1b1ff5" integrity sha512-whaE6H0XGarFKwZ3EYbpHBsRRCLZqdochzg/C7e+b6VFMTA3LS3K4ZfpI4NT40iy83jG89rGXrw70P9iDfOdsA== +react-virtual@^2.10.4: + version "2.10.4" + resolved "https://registry.yarnpkg.com/react-virtual/-/react-virtual-2.10.4.tgz#08712f0acd79d7d6f7c4726f05651a13b24d8704" + integrity sha512-Ir6+oPQZTVHfa6+JL9M7cvMILstFZH/H3jqeYeKI4MSUX+rIruVwFC6nGVXw9wqAw8L0Kg2KvfXxI85OvYQdpQ== + dependencies: + "@reach/observe-rect" "^1.1.0" + react@^18.0.0: version "18.0.0" resolved "https://registry.yarnpkg.com/react/-/react-18.0.0.tgz#b468736d1f4a5891f38585ba8e8fb29f91c3cb96" From 94e8a46c253136744b618596b95b4d164c942bce Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Wed, 19 Oct 2022 12:03:05 +1100 Subject: [PATCH 188/309] fix main content causing horizontal scroll --- src/layouts/Navigation/Navigation.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layouts/Navigation/Navigation.tsx b/src/layouts/Navigation/Navigation.tsx index f17053a1..3f967301 100644 --- a/src/layouts/Navigation/Navigation.tsx +++ b/src/layouts/Navigation/Navigation.tsx @@ -62,7 +62,7 @@ export default function Navigation({ children }: React.PropsWithChildren<{}>) { } > -
    +
    {children}
    From c9b1cf98e05bcd6eec96acc32aee0621c8c50866 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Wed, 19 Oct 2022 12:41:20 +1100 Subject: [PATCH 189/309] support hidden columns --- src/components/Table/Table.tsx | 92 ++++++++++--------- .../Table/useKeyboardNavigation.tsx | 16 ++-- src/pages/Table/TablePage.tsx | 8 +- 3 files changed, 62 insertions(+), 54 deletions(-) diff --git a/src/components/Table/Table.tsx b/src/components/Table/Table.tsx index 153b5576..d3cbc0a6 100644 --- a/src/components/Table/Table.tsx +++ b/src/components/Table/Table.tsx @@ -93,22 +93,13 @@ export default function TableComponent() { const canAddColumn = userRoles.includes("ADMIN"); const canEditColumn = userRoles.includes("ADMIN"); - const userDocHiddenFields = - userSettings.tables?.[formatSubTableName(tableId)]?.hiddenFields; // Get column defs from table schema // Also add end column for admins const columns = useMemo(() => { const _columns = tableColumnsOrdered - // .filter((column) => { - // if (column.hidden) return false; - // if ( - // Array.isArray(userDocHiddenFields) && - // userDocHiddenFields.includes(column.key) - // ) - // return false; - // return true; - // }) + // Hide column for all users using table schema + .filter((column) => !column.hidden) .map((columnConfig) => columnHelper.accessor(columnConfig.fieldName, { id: columnConfig.fieldName, @@ -136,30 +127,41 @@ export default function TableComponent() { }) ); - // if (canAddColumn || !tableSettings.readOnly) { - // _columns.push({ - // isNew: true, - // key: "new", - // fieldName: "_rowy_new", - // name: "Add column", - // type: FieldType.last, - // index: _columns.length ?? 0, - // width: 154, - // headerRenderer: FinalColumnHeader, - // headerCellClass: "final-column-header", - // cellClass: "final-column-cell", - // formatter: FinalColumn, - // editable: false, - // }); - // } + if (canAddColumn || !tableSettings.readOnly) { + _columns.push( + columnHelper.display({ + id: "_rowy_column_actions", + header: () => "Actions", + cell: () => <>Menu | Duplicate | Delete, + }) + // { + // isNew: true, + // key: "new", + // fieldName: "_rowy_new", + // name: "Add column", + // type: FieldType.last, + // index: _columns.length ?? 0, + // width: 154, + // headerRenderer: FinalColumnHeader, + // headerCellClass: "final-column-header", + // cellClass: "final-column-cell", + // formatter: FinalColumn, + // editable: false, + // } + ); + } return _columns; - }, [ - tableColumnsOrdered, - // userDocHiddenFields, - // tableSettings.readOnly, - // canAddColumn, - ]); + }, [tableColumnsOrdered, canAddColumn, tableSettings.readOnly]); + + // Get user’s hidden columns from user document + const userDocHiddenFields = + userSettings.tables?.[formatSubTableName(tableId)]?.hiddenFields; + // Memoize into a VisibilityState + const columnVisibility = useMemo(() => { + if (!Array.isArray(userDocHiddenFields)) return {}; + return userDocHiddenFields.reduce((a, c) => ({ ...a, [c]: false }), {}); + }, [userDocHiddenFields]); const table = useReactTable({ data: tableRows, @@ -167,9 +169,11 @@ export default function TableComponent() { getCoreRowModel: getCoreRowModel(), getRowId, columnResizeMode: "onChange", + state: { columnVisibility }, // debugRows: true, }); const { rows } = table.getRowModel(); + const leafColumns = table.getVisibleLeafColumns(); // console.log(table, selectedCell); const { @@ -193,16 +197,14 @@ export default function TableComponent() { } = useVirtual({ parentRef: containerRef, horizontal: true, - size: columns.length, + size: leafColumns.length, overscan: 1, estimateSize: useCallback( - (index: number) => columns[index].size || DEFAULT_COL_WIDTH, - [columns] + (index: number) => leafColumns[index].columnDef.size || DEFAULT_COL_WIDTH, + [leafColumns] ), }); - console.log(totalHeight); - useEffect(() => { if (!selectedCell) return; if (selectedCell.path) { @@ -213,18 +215,24 @@ export default function TableComponent() { scrollToRowIndex(rowIndex); } if (selectedCell.columnKey) { - const colIndex = columns.findIndex( + const colIndex = leafColumns.findIndex( (col) => col.id === selectedCell.columnKey ); if (colIndex === -1) return; scrollToColIndex(colIndex); } - }, [selectedCell, tableRows, columns, scrollToRowIndex, scrollToColIndex]); + }, [ + selectedCell, + tableRows, + leafColumns, + scrollToRowIndex, + scrollToColIndex, + ]); const { handleKeyDown, focusInsideCell } = useKeyboardNavigation({ gridRef, tableRows, - columns, + leafColumns, }); const paddingTop = virtualRows.length > 0 ? virtualRows?.[0]?.start || 0 : 0; @@ -296,7 +304,7 @@ export default function TableComponent() { aria-selected={isSelectedCell} label={header.column.columnDef.meta?.name || header.id} type={header.column.columnDef.meta?.type} - style={{ width: header.getSize() }} + style={{ width: header.getSize(), borderRight: "none" }} onClick={(e) => { setSelectedCell({ path: "_rowy_header", diff --git a/src/components/Table/useKeyboardNavigation.tsx b/src/components/Table/useKeyboardNavigation.tsx index be41e37f..f814f15f 100644 --- a/src/components/Table/useKeyboardNavigation.tsx +++ b/src/components/Table/useKeyboardNavigation.tsx @@ -1,6 +1,6 @@ import { useState } from "react"; import { useSetAtom } from "jotai"; -import { ColumnDef } from "@tanstack/react-table"; +import { Column } from "@tanstack/react-table"; import { tableScope, selectedCellAtom } from "@src/atoms/tableScope"; import { TableRow } from "@src/types/table"; @@ -9,13 +9,13 @@ import { COLLECTION_PAGE_SIZE } from "@src/config/db"; export interface IUseKeyboardNavigationProps { gridRef: React.RefObject; tableRows: TableRow[]; - columns: ColumnDef[]; + leafColumns: Column[]; } export function useKeyboardNavigation({ gridRef, tableRows, - columns, + leafColumns, }: IUseKeyboardNavigationProps) { const setSelectedCell = useSetAtom(selectedCellAtom, tableScope); const [focusInsideCell, setFocusInsideCell] = useState(false); @@ -84,8 +84,8 @@ export function useKeyboardNavigation({ break; case "ArrowRight": - if (e.ctrlKey || e.metaKey) newColIndex = columns.length - 1; - else if (colIndex < columns.length - 1) newColIndex = colIndex + 1; + if (e.ctrlKey || e.metaKey) newColIndex = leafColumns.length - 1; + else if (colIndex < leafColumns.length - 1) newColIndex = colIndex + 1; break; case "PageUp": @@ -105,18 +105,18 @@ export function useKeyboardNavigation({ break; case "End": - newColIndex = columns.length - 1; + newColIndex = leafColumns.length - 1; if (e.ctrlKey || e.metaKey) newRowIndex = tableRows.length - 1; break; } - // Get `path` and `columnKey` from `tableRows` and `columns` respectively + // Get `path` and `columnKey` from `tableRows` and `leafColumns` respectively const newSelectedCell = { path: newRowIndex > -1 ? tableRows[newRowIndex]._rowy_ref.path : "_rowy_header", - columnKey: columns[newColIndex].id! || columns[0].id!, + columnKey: leafColumns[newColIndex].id! || leafColumns[0].id!, }; // Store in selectedCellAtom diff --git a/src/pages/Table/TablePage.tsx b/src/pages/Table/TablePage.tsx index b82a411f..41d8c003 100644 --- a/src/pages/Table/TablePage.tsx +++ b/src/pages/Table/TablePage.tsx @@ -103,14 +103,14 @@ export default function TablePage({ sx={{ height: `calc(100vh - ${TOP_BAR_HEIGHT}px - ${TABLE_TOOLBAR_HEIGHT}px)`, width: `calc(100% - ${DRAWER_COLLAPSED_WIDTH}px)`, - // width: { - // xs: "100%", - // sm: `calc(100% - ${DRAWER_COLLAPSED_WIDTH}px)`, - // }, '& [role="grid"]': { paddingBottom: (theme) => `max(env(safe-area-inset-bottom), ${theme.spacing(2)})`, + paddingLeft: (theme) => + `max(env(safe-area-inset-left), ${theme.spacing(2)})`, + paddingRight: (theme) => + `max(env(safe-area-inset-right), ${theme.spacing(2)})`, }, }} > From f9b1a35445f5f653446760bd8863210c98b6b73e Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Wed, 19 Oct 2022 12:54:31 +1100 Subject: [PATCH 190/309] fix rowHeight & virtualized rows jumping --- src/components/Table/Table.tsx | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/components/Table/Table.tsx b/src/components/Table/Table.tsx index d3cbc0a6..99fccb45 100644 --- a/src/components/Table/Table.tsx +++ b/src/components/Table/Table.tsx @@ -249,7 +249,6 @@ export default function TableComponent() { const fetchMoreOnBottomReached = useThrottledCallback( (containerElement?: HTMLDivElement | null) => { - console.log("fetchMoreOnBottomReached", containerElement); if (!containerElement) return; const { scrollHeight, scrollTop, clientHeight } = containerElement; @@ -263,7 +262,7 @@ export default function TableComponent() { return (
    fetchMoreOnBottomReached(e.target as HTMLDivElement)} + onScroll={(e) => fetchMoreOnBottomReached(e.target as HTMLDivElement)} style={{ overflow: "auto", width: "100%", height: "100%" }} >
    + {paddingLeft > 0 && (
    {isSelectedCell ? "f" : "x"} - + */} ); })} From 23bf2876b25114ab9b57c6312bdcb64e404e91f8 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Thu, 20 Oct 2022 11:13:07 +1100 Subject: [PATCH 191/309] ConfirmDialog: fix command not typeable --- src/components/ConfirmDialog.tsx | 57 +++++++++++++++++++------------- 1 file changed, 34 insertions(+), 23 deletions(-) diff --git a/src/components/ConfirmDialog.tsx b/src/components/ConfirmDialog.tsx index e9e210df..f7de2a03 100644 --- a/src/components/ConfirmDialog.tsx +++ b/src/components/ConfirmDialog.tsx @@ -1,4 +1,4 @@ -import { useState } from "react"; +import { useEffect, useState } from "react"; import { useAtom } from "jotai"; import { @@ -49,10 +49,15 @@ export default function ConfirmDialog({ const handleClose = () => { setState({ open: false }); - setDryText(""); + setDisableConfirm(false); }; - const [dryText, setDryText] = useState(""); + const [disableConfirm, setDisableConfirm] = useState( + Boolean(confirmationCommand) + ); + useEffect(() => { + setDisableConfirm(Boolean(confirmationCommand)); + }, [confirmationCommand]); return ( theme.zIndex.modal + 50 }} > - - <> + <> + {title} + + {typeof body === "string" ? ( {body} ) : ( body )} + {confirmationCommand && ( setDryText(e.target.value)} - autoFocus + onChange={(e) => + setDisableConfirm(e.target.value !== confirmationCommand) + } label={`Type “${confirmationCommand}” below to continue:`} placeholder={confirmationCommand} fullWidth @@ -87,16 +95,18 @@ export default function ConfirmDialog({ /> )} + - :not(:first-of-type)": { ml: 0, mt: 1 }, - }, - ]} - > + :not(:first-of-type)": { ml: 0, mt: 1 }, + }, + ]} + > + {!hideCancel && ( )} + + + - - - + + + ); } From 7a4bac367313e986d3f747d5c57a065e2579c805 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Thu, 20 Oct 2022 11:25:34 +1100 Subject: [PATCH 192/309] CircularProgressTimed: fix tick position in webkit --- src/components/CircularProgressTimed.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/CircularProgressTimed.tsx b/src/components/CircularProgressTimed.tsx index 11959f37..109a0963 100644 --- a/src/components/CircularProgressTimed.tsx +++ b/src/components/CircularProgressTimed.tsx @@ -71,6 +71,8 @@ export default function CircularProgressTimed({ sx={{ position: "absolute", inset: size * 0.33 * 0.5, + width: size * 0.67, + height: size * 0.67, "& .tick": { stroke: (theme) => theme.palette.success.main, From 7fa0955dce15001607d036e7989b4b1ab4011daf Mon Sep 17 00:00:00 2001 From: Shams Date: Thu, 20 Oct 2022 18:35:48 +1100 Subject: [PATCH 193/309] Merge pull request #10 from rowyio/feat/table-information Feat: Table Information Drawer --- src/assets/icons/index.ts | 3 + src/atoms/tableScope/ui.ts | 6 + .../TableInformationDrawer/Details.tsx | 178 ++++++++++++++++++ .../TableInformationDrawer/SideDrawer.tsx | 134 +++++++++++++ .../TableInformationDrawer/index.ts | 2 + .../TableInformationDrawer/withTemplate.tsx | 61 ++++++ .../TableSettingsDialog/TableDetails.tsx | 43 +++++ .../TableSettingsDialog.tsx | 26 ++- .../TableSettingsDialog/TableThumbnail.tsx | 126 +++++++++++++ src/components/TableSettingsDialog/form.tsx | 18 +- src/components/TableSettingsDialog/utils.ts | 14 ++ .../TableToolbar/TableInformation.tsx | 25 +++ src/components/TableToolbar/TableToolbar.tsx | 6 + src/components/Tables/TableGrid/TableCard.tsx | 63 ++++--- src/pages/Table/TablePage.tsx | 7 + src/pages/TablesPage.tsx | 15 +- .../useTableFunctions.ts | 8 +- src/types/table.d.ts | 12 ++ 18 files changed, 719 insertions(+), 28 deletions(-) create mode 100644 src/components/TableInformationDrawer/Details.tsx create mode 100644 src/components/TableInformationDrawer/SideDrawer.tsx create mode 100644 src/components/TableInformationDrawer/index.ts create mode 100644 src/components/TableInformationDrawer/withTemplate.tsx create mode 100644 src/components/TableSettingsDialog/TableDetails.tsx create mode 100644 src/components/TableSettingsDialog/TableThumbnail.tsx create mode 100644 src/components/TableSettingsDialog/utils.ts create mode 100644 src/components/TableToolbar/TableInformation.tsx diff --git a/src/assets/icons/index.ts b/src/assets/icons/index.ts index 3503e99b..4e60591f 100644 --- a/src/assets/icons/index.ts +++ b/src/assets/icons/index.ts @@ -103,6 +103,9 @@ export { FileTableBoxOutline as Project }; import { TableColumn } from "mdi-material-ui"; export { TableColumn }; +import { InformationOutline } from "mdi-material-ui"; +export { InformationOutline as TableInformation }; + export * from "./AddRow"; export * from "./AddRowTop"; export * from "./ChevronDown"; diff --git a/src/atoms/tableScope/ui.ts b/src/atoms/tableScope/ui.ts index fa987118..b5aaf882 100644 --- a/src/atoms/tableScope/ui.ts +++ b/src/atoms/tableScope/ui.ts @@ -121,6 +121,12 @@ export const importAirtableAtom = atom<{ tableId: string; }>({ airtableData: null, apiKey: "", baseId: "", tableId: "" }); +/** Store side drawer open state */ +export const sideDrawerAtom = atomWithHash<"table-information" | null>( + "sideDrawer", + null, + { replaceState: true } +); /** Store side drawer open state */ export const sideDrawerOpenAtom = atom(false); diff --git a/src/components/TableInformationDrawer/Details.tsx b/src/components/TableInformationDrawer/Details.tsx new file mode 100644 index 00000000..a3d4640d --- /dev/null +++ b/src/components/TableInformationDrawer/Details.tsx @@ -0,0 +1,178 @@ +import { useMemo } from "react"; +import { format } from "date-fns"; +import MDEditor from "@uiw/react-md-editor"; + +import { + Box, + Grid, + IconButton, + Stack, + Typography, + useTheme, +} from "@mui/material"; + +import EditIcon from "@mui/icons-material/EditOutlined"; + +import { tableScope, tableSettingsAtom } from "@src/atoms/tableScope"; +import { useAtom, useSetAtom } from "jotai"; +import { + projectScope, + tablesAtom, + tableSettingsDialogAtom, + userRolesAtom, +} from "@src/atoms/projectScope"; +import { find } from "lodash-es"; + +export interface IDetailsProps { + handleOpenTemplate?: any; +} + +export default function Details({ handleOpenTemplate }: IDetailsProps) { + const [userRoles] = useAtom(userRolesAtom, projectScope); + const [tableSettings] = useAtom(tableSettingsAtom, tableScope); + const [tables] = useAtom(tablesAtom, projectScope); + const openTableSettingsDialog = useSetAtom( + tableSettingsDialogAtom, + projectScope + ); + + const settings = useMemo( + () => find(tables, ["id", tableSettings.id]), + [tables, tableSettings.id] + ); + + const theme = useTheme(); + + if (!settings) { + return null; + } + + const editButton = userRoles.includes("ADMIN") && ( + + openTableSettingsDialog({ + mode: "update", + data: settings, + }) + } + disabled={!openTableSettingsDialog || settings.id.includes("/")} + > + + + ); + + const { description, details, _createdBy } = settings; + + return ( + .MuiGrid-root": { + position: "relative", + }, + }} + > + {/* Description */} + + + + Description + + {editButton} + + + {description ? description : "No description"} + + + + {/* Details */} + + + + Details + + {editButton} + + {!details ? ( + + No details + + ) : ( + + + + )} + + + {/* Table Audits */} + {_createdBy && ( + + + Created by{" "} + + {_createdBy.displayName} + {" "} + at{" "} + + {format(_createdBy.timestamp.toDate(), "LLL d, yyyy · p")} + + + + )} + + {/* Template Settings */} + {/* {handleOpenTemplate && ( + + + + + + ); +} diff --git a/src/components/TableSettingsDialog/form.tsx b/src/components/TableSettingsDialog/form.tsx index 7b62176b..190b02bf 100644 --- a/src/components/TableSettingsDialog/form.tsx +++ b/src/components/TableSettingsDialog/form.tsx @@ -244,7 +244,23 @@ export const tableSettings = ( type: FieldType.paragraph, name: "description", label: "Description (optional)", - minRows: 2, + }, + { + step: "display", + type: "tableDetails", + name: "details", + label: "Details (optional)", + }, + { + step: "display", + type: "tableThumbnail", + name: "thumbnailFile", + label: "Thumbnail Image (optional)", + }, + { + step: "display", + type: FieldType.hidden, + name: "thumbnailURL", }, // Step 3: Access controls diff --git a/src/components/TableSettingsDialog/utils.ts b/src/components/TableSettingsDialog/utils.ts new file mode 100644 index 00000000..b70cfe07 --- /dev/null +++ b/src/components/TableSettingsDialog/utils.ts @@ -0,0 +1,14 @@ +import { + FirebaseStorage, + getDownloadURL, + ref, + uploadBytes, +} from "firebase/storage"; + +export const uploadTableThumbnail = + (storage: FirebaseStorage) => (tableId: string, imageFile: File) => { + const storageRef = ref(storage, `__thumbnails__/${tableId}`); + return uploadBytes(storageRef, imageFile).then(({ ref }) => + getDownloadURL(ref) + ); + }; diff --git a/src/components/TableToolbar/TableInformation.tsx b/src/components/TableToolbar/TableInformation.tsx new file mode 100644 index 00000000..f53688f1 --- /dev/null +++ b/src/components/TableToolbar/TableInformation.tsx @@ -0,0 +1,25 @@ +import { useAtom } from "jotai"; +import { RESET } from "jotai/utils"; + +import { + sideDrawerAtom, + tableScope, + tableSettingsAtom, +} from "@src/atoms/tableScope"; + +import TableToolbarButton from "@src/components/TableToolbar/TableToolbarButton"; +import { TableInformation as TableInformationIcon } from "@src/assets/icons"; + +export default function TableInformation() { + const [tableSettings] = useAtom(tableSettingsAtom, tableScope); + const [sideDrawer, setSideDrawer] = useAtom(sideDrawerAtom, tableScope); + + return ( + } + onClick={() => setSideDrawer(sideDrawer ? RESET : "table-information")} + disabled={!setSideDrawer || tableSettings.id.includes("/")} + /> + ); +} diff --git a/src/components/TableToolbar/TableToolbar.tsx b/src/components/TableToolbar/TableToolbar.tsx index e940e92b..3e288a88 100644 --- a/src/components/TableToolbar/TableToolbar.tsx +++ b/src/components/TableToolbar/TableToolbar.tsx @@ -36,6 +36,9 @@ import { FieldType } from "@src/constants/fields"; const Filters = lazy(() => import("./Filters" /* webpackChunkName: "Filters" */)); // prettier-ignore const ImportData = lazy(() => import("./ImportData/ImportData" /* webpackChunkName: "ImportData" */)); +// prettier-ignore +const TableInformation = lazy(() => import("./TableInformation" /* webpackChunkName: "TableInformation" */)); + // prettier-ignore const ReExecute = lazy(() => import("./ReExecute" /* webpackChunkName: "ReExecute" */)); @@ -147,6 +150,9 @@ export default function TableToolbar() { )} + }> + +
    ); diff --git a/src/components/Tables/TableGrid/TableCard.tsx b/src/components/Tables/TableGrid/TableCard.tsx index 21be4ece..b601b90a 100644 --- a/src/components/Tables/TableGrid/TableCard.tsx +++ b/src/components/Tables/TableGrid/TableCard.tsx @@ -7,10 +7,9 @@ import { Typography, CardActions, Button, + Box, } from "@mui/material"; import { Go as GoIcon } from "@src/assets/icons"; - -import RenderedMarkdown from "@src/components/RenderedMarkdown"; import { TableSettings } from "@src/types/table"; export interface ITableCardProps extends TableSettings { @@ -19,6 +18,7 @@ export interface ITableCardProps extends TableSettings { } export default function TableCard({ + thumbnailURL, section, name, description, @@ -37,27 +37,46 @@ export default function TableCard({ - - - - (theme.typography.body2.lineHeight as number) * 2 + "em", - display: "flex", - flexDirection: "column", - gap: 1, - }} - component="div" - > - {description && ( - + + - )} - - + + + )} + {description && ( + + + {description} + + + )}
    +
    +
    + + + } + style={{ position: "absolute", inset: 0 }} + /> + } + /> From 74a9c01b03496d8cbdef961eccaa71023d9bf15c Mon Sep 17 00:00:00 2001 From: Miriam Shams-Rainey Date: Wed, 2 Nov 2022 00:43:10 -0400 Subject: [PATCH 229/309] Applied global theme changes --- src/components/fields/Rating/Icon.tsx | 15 +++++++++------ src/components/fields/Rating/Settings.tsx | 4 +--- src/components/fields/Rating/SideDrawerField.tsx | 2 +- src/components/fields/Rating/TableCell.tsx | 5 +---- src/theme/components.tsx | 3 ++- 5 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/components/fields/Rating/Icon.tsx b/src/components/fields/Rating/Icon.tsx index 4bb8a95c..374a395f 100644 --- a/src/components/fields/Rating/Icon.tsx +++ b/src/components/fields/Rating/Icon.tsx @@ -3,13 +3,16 @@ import RatingOutlineIcon from "@mui/icons-material/StarBorder" import { get } from "lodash-es"; -export default function Icon(config: any, isEmpty: Boolean) { -// console.log(config) - if (isEmpty) { - //console.log(getStateOutline(config)) - return getStateOutline(config.config) +export interface IIconProps{ + config: any, + isEmpty: boolean +} + +export default function ({config, isEmpty} : IIconProps) { +if (isEmpty) { + return getStateOutline(config) } else { - return getStateIcon(config.config) + return getStateIcon(config) } } diff --git a/src/components/fields/Rating/Settings.tsx b/src/components/fields/Rating/Settings.tsx index 1d9e5096..2a258cf6 100644 --- a/src/components/fields/Rating/Settings.tsx +++ b/src/components/fields/Rating/Settings.tsx @@ -1,6 +1,4 @@ import { ISettingsProps } from "@src/components/fields/types"; -import RatingIcon from "@mui/icons-material/Star"; -import RatingOutlineIcon from "@mui/icons-material/StarBorder" import { InputLabel, TextField, Grid, FormControlLabel, Checkbox, Stack } from "@mui/material"; import ToggleButton from "@mui/material/ToggleButton"; import ToggleButtonGroup from "@mui/material/ToggleButtonGroup"; @@ -82,7 +80,7 @@ export default function Settings({ onChange, config }: ISettingsProps) { onClick={(e) => e.stopPropagation()} icon={} size="small" - emptyIcon={} + emptyIcon={} max={get(config, "max")} precision={get(config, "precision")} sx={{ pt: 0.5 }} diff --git a/src/components/fields/Rating/SideDrawerField.tsx b/src/components/fields/Rating/SideDrawerField.tsx index 2652bf65..18121c7f 100644 --- a/src/components/fields/Rating/SideDrawerField.tsx +++ b/src/components/fields/Rating/SideDrawerField.tsx @@ -29,7 +29,7 @@ export default function Rating({ onSubmit(); }} icon={} - emptyIcon={} + emptyIcon={} size="small" max={max} precision={precision} diff --git a/src/components/fields/Rating/TableCell.tsx b/src/components/fields/Rating/TableCell.tsx index 6aaa72e1..7b2a6530 100644 --- a/src/components/fields/Rating/TableCell.tsx +++ b/src/components/fields/Rating/TableCell.tsx @@ -1,9 +1,6 @@ import { IHeavyCellProps } from "@src/components/fields/types"; import MuiRating from "@mui/material/Rating"; -import RatingIcon from "@mui/icons-material/Star"; -import RatingOutlineIcon from "@mui/icons-material/StarBorder" -import { get } from "lodash-es"; import Icon from "./Icon" @@ -37,7 +34,7 @@ export default function Rating({ size="small" disabled={disabled} onChange={(_, newValue) => onSubmit(newValue)} - emptyIcon={} + emptyIcon={} max={max} precision={precision} sx={{ mx: -0.25 }} diff --git a/src/theme/components.tsx b/src/theme/components.tsx index 48d4b446..435c9586 100644 --- a/src/theme/components.tsx +++ b/src/theme/components.tsx @@ -1341,11 +1341,12 @@ export const components = (theme: Theme): ThemeOptions => { MuiRating: { styleOverrides: { - iconFilled: { color: theme.palette.text.secondary }, icon: { // https://github.com/mui/material-ui/issues/32557 "& .MuiSvgIcon-root": { pointerEvents: "auto" }, + color: theme.palette.text.secondary, }, + iconEmpty: { opacity: 0.38 }, }, }, From 9b05906fbe4973aca820a8c67512313e8c4ac821 Mon Sep 17 00:00:00 2001 From: Miriam Shams-Rainey Date: Wed, 2 Nov 2022 01:03:25 -0400 Subject: [PATCH 230/309] Merge conflicts --- src/components/fields/Rating/Settings.tsx | 2 + .../fields/Rating/SideDrawerField.tsx | 1 + src/components/fields/Rating/TableCell.tsx | 1 - src/theme/components.tsx | 140 +++++++++++------- 4 files changed, 90 insertions(+), 54 deletions(-) diff --git a/src/components/fields/Rating/Settings.tsx b/src/components/fields/Rating/Settings.tsx index 2a258cf6..5bffda3d 100644 --- a/src/components/fields/Rating/Settings.tsx +++ b/src/components/fields/Rating/Settings.tsx @@ -6,6 +6,7 @@ import MuiRating from "@mui/material/Rating"; import { get } from "lodash-es"; import Icon from "./Icon" + export default function Settings({ onChange, config }: ISettingsProps) { return ( @@ -21,6 +22,7 @@ export default function Settings({ onChange, config }: ISettingsProps) { if (input > 20) { input = 20 } onChange("max")(input); }} + inputProps={{ min: 1, max: 20 }} /> diff --git a/src/components/fields/Rating/SideDrawerField.tsx b/src/components/fields/Rating/SideDrawerField.tsx index 18121c7f..8011bf8e 100644 --- a/src/components/fields/Rating/SideDrawerField.tsx +++ b/src/components/fields/Rating/SideDrawerField.tsx @@ -6,6 +6,7 @@ import "@mui/lab"; import { fieldSx } from "@src/components/SideDrawer/utils"; import Icon from "./Icon" + export default function Rating({ column, value, diff --git a/src/components/fields/Rating/TableCell.tsx b/src/components/fields/Rating/TableCell.tsx index 7b2a6530..368d8fbe 100644 --- a/src/components/fields/Rating/TableCell.tsx +++ b/src/components/fields/Rating/TableCell.tsx @@ -4,7 +4,6 @@ import MuiRating from "@mui/material/Rating"; import Icon from "./Icon" - export default function Rating({ row, column, diff --git a/src/theme/components.tsx b/src/theme/components.tsx index 435c9586..9224d46d 100644 --- a/src/theme/components.tsx +++ b/src/theme/components.tsx @@ -4,6 +4,7 @@ import type {} from "@mui/lab/themeAugmentation"; import { MultiSelectProps } from "@rowy/multiselect"; import { toRem } from "./typography"; +import ModalTransition from "@src/components/Modal/ModalTransition"; import RadioIcon from "@src/theme/RadioIcon"; import CheckboxIcon from "@src/theme/CheckboxIcon"; import CheckboxIndeterminateIcon from "@src/theme/CheckboxIndeterminateIcon"; @@ -81,22 +82,22 @@ export const components = (theme: Theme): ThemeOptions => { body: { cursor: "default" }, - "@supports selector(:has(a))": { - body: { - transition: "background-color 0s", - transitionDelay: theme.transitions.duration.leavingScreen + "ms", - }, + // "@supports selector(:has(a))": { + // body: { + // transition: "background-color 0s", + // transitionDelay: theme.transitions.duration.leavingScreen + "ms", + // }, - "#root": { - transformOrigin: `50% ${theme.spacing(1)}`, - transition: theme.transitions.create([ - "transform", - "border-radius", - ]), - transitionDuration: `${theme.transitions.duration.leavingScreen}ms, 0s`, - transitionDelay: `0s, ${theme.transitions.duration.leavingScreen}ms`, - }, - }, + // "#root": { + // transformOrigin: `50% 0%`, + // transition: theme.transitions.create([ + // "transform", + // "border-radius", + // ]), + // transitionDuration: `${theme.transitions.duration.leavingScreen}ms, 0s`, + // transitionDelay: `0s, ${theme.transitions.duration.leavingScreen}ms`, + // }, + // }, "code, pre, pre.MuiTypography-root": { fontFamily: theme.typography.fontFamilyMono, @@ -248,6 +249,9 @@ export const components = (theme: Theme): ThemeOptions => { }, MuiDialog: { + defaultProps: { + TransitionComponent: ModalTransition, + }, styleOverrides: { root: { "--dialog-title-height": "64px", @@ -257,7 +261,7 @@ export const components = (theme: Theme): ThemeOptions => { }, paper: { - borderRadius: (theme.shape.borderRadius as number) * 2, + borderRadius: (theme.shape.borderRadius as number) * 3, "--dialog-spacing": theme.spacing(3), [theme.breakpoints.down("sm")]: { @@ -271,52 +275,44 @@ export const components = (theme: Theme): ThemeOptions => { paperFullScreen: { borderBottomLeftRadius: 0, borderBottomRightRadius: 0, - marginTop: `calc(env(safe-area-inset-top) + ${theme.spacing(2)})`, - maxHeight: `calc(100% - env(safe-area-inset-top) - ${theme.spacing( - 2 - )})`, + marginTop: `calc(env(safe-area-inset-top) + 10px)`, + maxHeight: `calc(100% - env(safe-area-inset-top) - 10px)`, maxWidth: "100% !important", paddingLeft: "env(safe-area-inset-left)", paddingRight: "env(safe-area-inset-right)", paddingBottom: "env(safe-area-inset-bottom)", - "body:has([data-open=true] &)": { - backgroundColor: theme.palette.common.black, - transitionDelay: "0s", + // "body:has([data-open=true] &)": { + // backgroundColor: theme.palette.common.black, + // transitionDelay: "0s", - "#root": { - borderRadius: (theme.shape.borderRadius as number) * 2, - overflow: "hidden", - filter: `grayscale(100%) contrast(${ - theme.palette.mode === "dark" ? "80" : "75" - }%)`, + // "#root": { + // borderRadius: (theme.shape.borderRadius as number) * 2, + // overflow: "hidden", + // filter: `grayscale(100%) contrast(${ + // theme.palette.mode === "dark" ? "80" : "75" + // }%)`, - transform: `scale(0.9) translateY(${theme.spacing(1)})`, - transition: theme.transitions.create( - ["transform", "border-radius"], - { - easing: theme.transitions.easing.easeOut, - } - ), - transitionDuration: `${theme.transitions.duration.enteringScreen}ms, 0s`, - transitionDelay: "0s, 0s", - }, - }, + // transform: `scale(0.9)`, + // transition: theme.transitions.create( + // ["transform", "border-radius"], + // { + // easing: theme.transitions.easing.easeOut, + // } + // ), + // transitionDuration: `${theme.transitions.duration.enteringScreen}ms, 0s`, + // transitionDelay: "0s, 0s", + // }, + // }, }, }, }, MuiDialogTitle: { styleOverrides: { root: { - padding: "var(--dialog-spacing)", - paddingTop: (64 - 28) / 2, - paddingBottom: (64 - 28) / 2, - - [theme.breakpoints.down("sm")]: { - paddingTop: (56 - 28) / 2, - paddingBottom: (56 - 28) / 2, - }, + ...(theme.typography.h5 as any), + padding: `calc((var(--dialog-title-height) - ${theme.typography.h5.lineHeight} * ${theme.typography.h5.fontSize}) / 2) var(--dialog-spacing)`, }, }, }, @@ -386,6 +382,18 @@ export const components = (theme: Theme): ThemeOptions => { paddingRight: theme.spacing(1), }, }, + + "input[type='search']::-webkit-search-cancel-button": { + appearance: "none", + mask: `url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3e%3cpath d='M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm3.59-13L12 10.59 8.41 7 7 8.41 10.59 12 7 15.59 8.41 17 12 13.41 15.59 17 17 15.59 13.41 12 17 8.41z'/%3e%3c/svg%3e") no-repeat 50% 50%`, + backgroundColor: "currentColor", + opacity: 0.67, + + width: "1.5rem", + height: "1.5rem", + marginLeft: theme.spacing(0.5), + marginRight: 0, + }, }, }, }, @@ -395,7 +403,17 @@ export const components = (theme: Theme): ThemeOptions => { caretColor: theme.palette.primary.main, ".Mui-error &": { caretColor: theme.palette.error.main }, }, - inputSizeSmall: theme.typography.body2 as any, + inputSizeSmall: { + ...(theme.typography.body2 as any), + [theme.breakpoints.only("xs")]: { + ...(theme.typography.body1 as any), + "&, &.MuiSelect-select": { + minHeight: `${theme.typography.body1.lineHeight}em`, + }, + paddingTop: theme.spacing(0.5), + paddingBottom: theme.spacing(0.5), + }, + }, }, }, MuiFilledInput: { @@ -535,7 +553,10 @@ export const components = (theme: Theme): ThemeOptions => { ".MuiMenu-list &": { whiteSpace: "normal" }, }, primary: { - ".MuiSelect-select &": theme.typography.body2, + ".MuiSelect-select &": { + ...(theme.typography.body2 as any), + [theme.breakpoints.only("xs")]: theme.typography.body1, + }, }, secondary: { ".MuiSelect-select &": { display: "none" }, @@ -545,6 +566,13 @@ export const components = (theme: Theme): ThemeOptions => { MuiMenu: { styleOverrides: { + root: { + ".MuiDialog-root + & .MuiMenu-paper, form:has(.MuiDialog-root) + & .MuiMenu-paper, .MuiDialog-root & .MuiMenu-paper": + { + backgroundImage: + "linear-gradient(rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.2))", // elevation 50 + }, + }, list: { padding: theme.spacing(0.5, 0) }, }, }, @@ -725,12 +753,12 @@ export const components = (theme: Theme): ThemeOptions => { }, contained: { - boxShadow: `0 -1px 0 0 rgba(0, 0, 0, 0.12) inset, ${theme.shadows[2]}`, + boxShadow: `0 -1px 0 0 rgba(0, 0, 0, 0.4) inset, 0 0 0 1px rgba(255, 255, 255, 0.08) inset, ${theme.shadows[2]}`, "&:hover": { - boxShadow: `0 -1px 0 0 rgba(0, 0, 0, 0.12) inset, ${theme.shadows[4]}`, + boxShadow: `0 -1px 0 0 rgba(0, 0, 0, 0.4) inset, 0 0 0 1px rgba(255, 255, 255, 0.08) inset, ${theme.shadows[4]}`, }, "&:active": { - boxShadow: `0 -1px 0 0 rgba(0, 0, 0, 0.12) inset, ${theme.shadows[8]}`, + boxShadow: `0 -1px 0 0 rgba(0, 0, 0, 0.4) inset, 0 0 0 1px rgba(255, 255, 255, 0.08) inset, ${theme.shadows[8]}`, }, }, containedPrimary: { @@ -1339,6 +1367,12 @@ export const components = (theme: Theme): ThemeOptions => { }, }, + MuiSkeleton: { + styleOverrides: { + rectangular: { borderRadius: theme.shape.borderRadius }, + }, + }, + MuiRating: { styleOverrides: { icon: { From e436e2083a6767525fa82f7b839a3ddfb538f2ed Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Wed, 2 Nov 2022 16:36:10 +1100 Subject: [PATCH 231/309] re-enable table cells --- src/components/Table/CellValidation.tsx | 42 +++--------- .../Table/FinalColumn/FinalColumn.tsx | 8 +-- src/components/Table/Styled/StyledCell.tsx | 8 ++- src/components/Table/Table.tsx | 53 ++++++++------- .../fields/ConnectTable/InlineCell.tsx | 4 +- .../fields/_withTableCell/withBasicCell.tsx | 32 +++------ .../fields/_withTableCell/withHeavyCell.tsx | 61 +++++------------ .../fields/_withTableCell/withPopoverCell.tsx | 67 +++++-------------- src/components/fields/types.ts | 10 +-- src/types/table.d.ts | 16 +++-- 10 files changed, 107 insertions(+), 194 deletions(-) diff --git a/src/components/Table/CellValidation.tsx b/src/components/Table/CellValidation.tsx index ac6a9764..ad7560dc 100644 --- a/src/components/Table/CellValidation.tsx +++ b/src/components/Table/CellValidation.tsx @@ -2,30 +2,9 @@ import { styled } from "@mui/material/styles"; import ErrorIcon from "@mui/icons-material/ErrorOutline"; import WarningIcon from "@mui/icons-material/WarningAmber"; +import StyledCell from "./Styled/StyledCell"; import RichTooltip from "@src/components/RichTooltip"; -const Root = styled("div", { shouldForwardProp: (prop) => prop !== "error" })( - ({ theme, ...props }) => ({ - width: "100%", - height: "100%", - padding: "var(--cell-padding)", - position: "relative", - - overflow: "hidden", - contain: "strict", - display: "flex", - alignItems: "center", - - ...((props as any).error - ? { - ".rdg-cell:not([aria-selected=true]) &": { - boxShadow: `inset 0 0 0 2px ${theme.palette.error.main}`, - }, - } - : {}), - }) -); - const Dot = styled("div")(({ theme }) => ({ position: "absolute", right: -5, @@ -40,7 +19,7 @@ const Dot = styled("div")(({ theme }) => ({ backgroundColor: theme.palette.error.main, boxShadow: `0 0 0 4px var(--background-color)`, - ".rdg-row:hover &": { + "[role='row']:hover &": { boxShadow: `0 0 0 4px var(--row-hover-background-color)`, }, })); @@ -60,13 +39,14 @@ export default function CellValidation({ required, validationRegex, children, + ...props }: ICellValidationProps) { const isInvalid = validationRegex && !new RegExp(validationRegex).test(value); const isMissing = required && value === undefined; if (isInvalid) return ( - <> + } title="Invalid data" @@ -74,14 +54,13 @@ export default function CellValidation({ placement="right" render={({ openTooltip }) => } /> - - {children} - + {children} + ); if (isMissing) return ( - <> + } title="Required field" @@ -89,10 +68,9 @@ export default function CellValidation({ placement="right" render={({ openTooltip }) => } /> - - {children} - + {children} + ); - return {children}; + return {children}; } diff --git a/src/components/Table/FinalColumn/FinalColumn.tsx b/src/components/Table/FinalColumn/FinalColumn.tsx index 0d5212ff..c9d23dca 100644 --- a/src/components/Table/FinalColumn/FinalColumn.tsx +++ b/src/components/Table/FinalColumn/FinalColumn.tsx @@ -1,5 +1,5 @@ import { useAtom, useSetAtom } from "jotai"; -import type { CellContext } from "@tanstack/table-core"; +import type { TableCellProps } from "@src/components/Table"; import { Stack, Tooltip, IconButton, alpha } from "@mui/material"; import { CopyCells as CopyCellsIcon } from "@src/assets/icons"; @@ -20,12 +20,8 @@ import { deleteRowAtom, contextMenuTargetAtom, } from "@src/atoms/tableScope"; -import { TableRow } from "@src/types/table"; -export default function FinalColumn({ - row, - focusInsideCell, -}: CellContext & { focusInsideCell: boolean }) { +export default function FinalColumn({ row, focusInsideCell }: TableCellProps) { const [userRoles] = useAtom(userRolesAtom, projectScope); const [addRowIdType] = useAtom(tableAddRowIdTypeAtom, projectScope); const confirm = useSetAtom(confirmDialogAtom, projectScope); diff --git a/src/components/Table/Styled/StyledCell.tsx b/src/components/Table/Styled/StyledCell.tsx index 58de99fd..af2e03b4 100644 --- a/src/components/Table/Styled/StyledCell.tsx +++ b/src/components/Table/Styled/StyledCell.tsx @@ -12,7 +12,7 @@ export const StyledCell = styled("div")(({ theme }) => ({ }, overflow: "visible", - contain: "none", + contain: "strict", position: "relative", backgroundColor: theme.palette.background.paper, @@ -31,5 +31,11 @@ export const StyledCell = styled("div")(({ theme }) => ({ "[data-out-of-order='true'] + [role='row'] &": { borderTop: `1px solid ${theme.palette.divider}`, }, + + "&[aria-invalid='true']": { + boxShadow: `inset 0 0 0 2px ${theme.palette.error.main}`, + }, })); StyledCell.displayName = "StyledCell"; + +export default StyledCell; diff --git a/src/components/Table/Table.tsx b/src/components/Table/Table.tsx index 614067b7..6f219236 100644 --- a/src/components/Table/Table.tsx +++ b/src/components/Table/Table.tsx @@ -6,6 +6,7 @@ import { flexRender, getCoreRowModel, useReactTable, + CellContext, } from "@tanstack/react-table"; import { DragDropContext, @@ -14,6 +15,7 @@ import { Draggable, } from "react-beautiful-dnd"; import { Portal } from "@mui/material"; +import { ErrorBoundary } from "react-error-boundary"; import StyledTable from "./Styled/StyledTable"; import StyledRow from "./Styled/StyledRow"; @@ -23,8 +25,10 @@ import FinalColumnHeader from "./FinalColumn/FinalColumnHeader"; import FinalColumn from "./FinalColumn/FinalColumn"; import OutOfOrderIndicator from "./OutOfOrderIndicator"; import ContextMenu from "./ContextMenu"; +import CellValidation from "./CellValidation"; import EmptyState from "@src/components/EmptyState"; +import { InlineErrorFallback } from "@src/components/ErrorFallback"; // import BulkActions from "./BulkActions"; import { @@ -57,6 +61,10 @@ export const TABLE_PADDING = 16; export const OUT_OF_ORDER_MARGIN = 8; export const DEBOUNCE_DELAY = 500; +export type TableCellProps = CellContext & { + focusInsideCell: boolean; +}; + declare module "@tanstack/table-core" { interface ColumnMeta extends ColumnConfig {} } @@ -107,21 +115,7 @@ export default function Table({ size: columnConfig.width, enableResizing: columnConfig.resizable !== false, minSize: MIN_COL_WIDTH, - // formatter: - // getFieldProp("TableCell", getFieldType(columnConfig)) ?? - // function InDev() { - // return null; - // }, - // editor: - // getFieldProp("TableEditor", getFieldType(columnConfig)) ?? - // function InDev() { - // return null; - // }, - // ...columnConfig, - // editable: - // tableSettings.readOnly && !userRoles.includes("ADMIN") - // ? false - // : columnConfig.editable ?? true, + cell: getFieldProp("TableCell", getFieldType(columnConfig)), }) ); @@ -419,7 +413,7 @@ export default function Table({ selectedCell?.columnKey === cell.column.id; return ( -
    - {flexRender(cell.column.columnDef.cell, { - ...cell.getContext(), - focusInsideCell: isSelectedCell && focusInsideCell, - })} + + {flexRender(cell.column.columnDef.cell, { + ...cell.getContext(), + focusInsideCell: isSelectedCell && focusInsideCell, + })} +
    - {/* */} -
    + ); })} diff --git a/src/components/fields/ConnectTable/InlineCell.tsx b/src/components/fields/ConnectTable/InlineCell.tsx index 72d886ad..3f8f3147 100644 --- a/src/components/fields/ConnectTable/InlineCell.tsx +++ b/src/components/fields/ConnectTable/InlineCell.tsx @@ -32,7 +32,7 @@ export const ConnectTable = forwardRef(function ConnectTable( value.map((item: any) => ( item.snapshot[key]) .join(" ")} /> @@ -41,7 +41,7 @@ export const ConnectTable = forwardRef(function ConnectTable( ) : value ? ( value.snapshot[key]) .join(" ")} /> diff --git a/src/components/fields/_withTableCell/withBasicCell.tsx b/src/components/fields/_withTableCell/withBasicCell.tsx index 09d0bcb9..a268bf2e 100644 --- a/src/components/fields/_withTableCell/withBasicCell.tsx +++ b/src/components/fields/_withTableCell/withBasicCell.tsx @@ -1,12 +1,9 @@ -import { get } from "lodash-es"; -import { FormatterProps } from "react-data-grid"; +import type { TableCellProps } from "@src/components/Table"; import { ErrorBoundary } from "react-error-boundary"; import { IBasicCellProps } from "@src/components/fields/types"; import { InlineErrorFallback } from "@src/components/ErrorFallback"; import CellValidation from "@src/components/Table/CellValidation"; -import { FieldType } from "@src/constants/fields"; -import { TableRow } from "@src/types/table"; /** * HOC to wrap around table cell components. @@ -16,26 +13,17 @@ import { TableRow } from "@src/types/table"; export default function withBasicCell( BasicCellComponent: React.ComponentType ) { - return function BasicCell(props: FormatterProps) { - const { name, key } = props.column; - const value = get(props.row, key); - - const { validationRegex, required } = (props.column as any).config; + return function BasicCell({ row, column, getValue }: TableCellProps) { + const columnConfig = column.columnDef.meta!; + const { name } = columnConfig; + const value = getValue(); return ( - - - - - + ); }; } diff --git a/src/components/fields/_withTableCell/withHeavyCell.tsx b/src/components/fields/_withTableCell/withHeavyCell.tsx index 29eaf370..394a497c 100644 --- a/src/components/fields/_withTableCell/withHeavyCell.tsx +++ b/src/components/fields/_withTableCell/withHeavyCell.tsx @@ -1,16 +1,11 @@ import { Suspense, useState, useEffect } from "react"; import { useSetAtom } from "jotai"; import { get } from "lodash-es"; -import { FormatterProps } from "react-data-grid"; -import { ErrorBoundary } from "react-error-boundary"; +import type { TableCellProps } from "@src/components/Table"; import { IBasicCellProps, IHeavyCellProps } from "@src/components/fields/types"; -import { InlineErrorFallback } from "@src/components/ErrorFallback"; -import CellValidation from "@src/components/Table/CellValidation"; - import { tableScope, updateFieldAtom } from "@src/atoms/tableScope"; import { FieldType } from "@src/constants/fields"; -import { TableRow } from "@src/types/table"; /** * HOC to wrap table cell components. @@ -24,11 +19,9 @@ export default function withHeavyCell( HeavyCellComponent: React.ComponentType, readOnly: boolean = false ) { - return function HeavyCell(props: FormatterProps) { + return function HeavyCell({ row, column, getValue }: TableCellProps) { const updateField = useSetAtom(updateFieldAtom, tableScope); - const { validationRegex, required } = (props.column as any).config; - // Initially display BasicCell to improve scroll performance const [displayedComponent, setDisplayedComponent] = useState< "basic" | "heavy" @@ -41,7 +34,7 @@ export default function withHeavyCell( }, []); // TODO: Investigate if this still needs to be a state - const value = get(props.row, props.column.key); + const value = getValue(); const [localValue, setLocalValue] = useState(value); useEffect(() => { setLocalValue(value); @@ -50,29 +43,18 @@ export default function withHeavyCell( // Declare basicCell here so props can be reused by HeavyCellComponent const basicCellProps = { value: localValue, - name: props.column.name as string, - type: (props.column as any).type as FieldType, + name: column.columnDef.meta!.name, + type: column.columnDef.meta!.type, }; const basicCell = ; - if (displayedComponent === "basic") - return ( - - - {basicCell} - - - ); + if (displayedComponent === "basic") return basicCell; const handleSubmit = (value: any) => { if (readOnly) return; updateField({ - path: props.row._rowy_ref.path, - fieldName: props.column.key, + path: row.original._rowy_ref.path, + fieldName: column.id, value, }); setLocalValue(value); @@ -80,23 +62,16 @@ export default function withHeavyCell( if (displayedComponent === "heavy") return ( - - - - - - - + + + ); // Should not reach this line diff --git a/src/components/fields/_withTableCell/withPopoverCell.tsx b/src/components/fields/_withTableCell/withPopoverCell.tsx index 5da116ca..5cb12ac5 100644 --- a/src/components/fields/_withTableCell/withPopoverCell.tsx +++ b/src/components/fields/_withTableCell/withPopoverCell.tsx @@ -1,19 +1,15 @@ import { Suspense, useState, useEffect, useRef } from "react"; import { useSetAtom } from "jotai"; -import { find, get } from "lodash-es"; -import { FormatterProps } from "react-data-grid"; +import { get } from "lodash-es"; +import type { TableCellProps } from "@src/components/Table"; import { IBasicCellProps, IPopoverInlineCellProps, IPopoverCellProps, } from "@src/components/fields/types"; -import { ErrorBoundary } from "react-error-boundary"; import { Popover, PopoverProps } from "@mui/material"; -import { InlineErrorFallback } from "@src/components/ErrorFallback"; -import CellValidation from "@src/components/Table/CellValidation"; - import { tableScope, updateFieldAtom } from "@src/atoms/tableScope"; import { FieldType } from "@src/constants/fields"; @@ -39,13 +35,11 @@ export default function withPopoverCell( PopoverCellComponent: React.ComponentType, options?: IPopoverCellOptions ) { - return function PopoverCell(props: FormatterProps) { + return function PopoverCell({ row, column, getValue }: TableCellProps) { const { transparent, ...popoverProps } = options ?? {}; const updateField = useSetAtom(updateFieldAtom, tableScope); - const { validationRegex, required } = (props.column as any).config; - // Initially display BasicCell to improve scroll performance const [displayedComponent, setDisplayedComponent] = useState< "basic" | "inline" | "popover" @@ -64,7 +58,7 @@ export default function withPopoverCell( const inlineCellRef = useRef(null); // TODO: Investigate if this still needs to be a state - const value = get(props.row, props.column.key); + const value = getValue(); const [localValue, setLocalValue] = useState(value); useEffect(() => { setLocalValue(value); @@ -73,29 +67,19 @@ export default function withPopoverCell( // Declare basicCell here so props can be reused by HeavyCellComponent const basicCellProps = { value: localValue, - name: props.column.name as string, - type: (props.column as any).type as FieldType, + name: column.columnDef.meta!.name, + type: column.columnDef.meta!.type, }; if (displayedComponent === "basic") - return ( - - - - - - ); + return ; // This is where we update the documents const handleSubmit = (value: any) => { if (options?.readOnly) return; updateField({ - path: props.row._rowy_ref.path, - fieldName: props.column.key, + path: row.original._rowy_ref.path, + fieldName: column.id, value, deleteField: value === undefined, }); @@ -113,12 +97,12 @@ export default function withPopoverCell( // Declare inlineCell and props here so it can be reused later const commonCellProps = { - ...props, ...basicCellProps, - column: props.column, + row: row.original, + column: column.columnDef.meta!, onSubmit: handleSubmit, - disabled: props.column.editable === false, - docRef: props.row._rowy_ref, + disabled: column.columnDef.meta!.editable === false, + docRef: row.original._rowy_ref, showPopoverCell, ref: inlineCellRef, }; @@ -126,31 +110,14 @@ export default function withPopoverCell( ); - if (displayedComponent === "inline") - return ( - - - {inlineCell} - - - ); + if (displayedComponent === "inline") return inlineCell; const parentRef = inlineCellRef.current?.parentElement; if (displayedComponent === "popover") return ( - - - {inlineCell} - + <> + {inlineCell} - + ); // Should not reach this line diff --git a/src/components/fields/types.ts b/src/components/fields/types.ts index 66890472..c7309452 100644 --- a/src/components/fields/types.ts +++ b/src/components/fields/types.ts @@ -1,4 +1,5 @@ import { FieldType } from "@src/constants/fields"; +import type { TableCellProps } from "@src/components/Table"; import { FormatterProps, EditorProps } from "react-data-grid"; import { Control, UseFormReturn } from "react-hook-form"; import { PopoverProps } from "@mui/material"; @@ -28,7 +29,7 @@ export interface IFieldConfig { selectedCell: SelectedCell, reset: () => void ) => IContextMenuItem[]; - TableCell: React.ComponentType>; + TableCell: React.ComponentType; TableEditor: React.ComponentType>; SideDrawerField: React.ComponentType; settings?: React.ComponentType; @@ -49,10 +50,9 @@ export interface IBasicCellProps { type: FieldType; name: string; } -export interface IHeavyCellProps - extends IBasicCellProps, - FormatterProps { - column: FormatterProps["column"] & { config?: Record }; +export interface IHeavyCellProps extends IBasicCellProps { + row: TableRow; + column: ColumnConfig; onSubmit: (value: any) => void; docRef: TableRowRef; disabled: boolean; diff --git a/src/types/table.d.ts b/src/types/table.d.ts index 376cd3ea..5b54b9be 100644 --- a/src/types/table.d.ts +++ b/src/types/table.d.ts @@ -133,26 +133,28 @@ export type ColumnConfig = { /** Prevent column resizability */ resizable?: boolean = true; - config?: { + config?: Partial<{ /** Set column to required */ - required?: boolean; + required: boolean; /** Set column default value */ - defaultValue?: { + defaultValue: { type: "undefined" | "null" | "static" | "dynamic"; value?: any; script?: string; dynamicValueFn?: string; }; + /** Regex used in CellValidation */ + validationRegex: string; /** FieldType to render for Derivative fields */ - renderFieldType?: FieldType; + renderFieldType: FieldType; /** For sub-table fields */ - parentLabel?: string[]; + parentLabel: string[]; - primaryKeys?: string[]; + primaryKeys: string[]; /** Column-specific config */ [key: string]: any; - }; + }>; }; export type TableFilter = { From 63265e3c859ee8f0c6157c39f7f1d9775728b796 Mon Sep 17 00:00:00 2001 From: Miriam Shams-Rainey Date: Wed, 2 Nov 2022 01:40:42 -0400 Subject: [PATCH 232/309] #523: Added functional color field filtering (#894) * #523: Added functional color field filtering * Added custom Firestore filter comparing only hex * Minor code style fixes --- src/components/fields/Color/filters.ts | 21 +++++++++++++++++++++ src/components/fields/Color/index.tsx | 5 +++++ src/hooks/useFirestoreCollectionWithAtom.ts | 8 ++++++-- src/types/table.d.ts | 4 +++- 4 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 src/components/fields/Color/filters.ts diff --git a/src/components/fields/Color/filters.ts b/src/components/fields/Color/filters.ts new file mode 100644 index 00000000..68677a91 --- /dev/null +++ b/src/components/fields/Color/filters.ts @@ -0,0 +1,21 @@ +import { IFilterOperator } from "@src/components/fields/types"; + +export const filterOperators: IFilterOperator[] = [ + { + label: "is", + secondaryLabel: "==", + value: "color-equal" + }, + { + label: "is not", + secondaryLabel: "!=", + value: "color-not-equal" +} +]; + +export const valueFormatter = (value: any) => { + if (value && value.hex) { + return value.hex.toString() + } + return ""; +}; \ No newline at end of file diff --git a/src/components/fields/Color/index.tsx b/src/components/fields/Color/index.tsx index 13cb9843..d8da5e50 100644 --- a/src/components/fields/Color/index.tsx +++ b/src/components/fields/Color/index.tsx @@ -7,6 +7,7 @@ import ColorIcon from "@mui/icons-material/Colorize"; import BasicCell from "@src/components/fields/_BasicCell/BasicCellNull"; import InlineCell from "./InlineCell"; import NullEditor from "@src/components/Table/editors/NullEditor"; +import { filterOperators, valueFormatter } from "./filters"; const PopoverCell = lazy( () => import("./PopoverCell" /* webpackChunkName: "PopoverCell-Color" */) @@ -31,6 +32,10 @@ export const config: IFieldConfig = { }), TableEditor: NullEditor as any, SideDrawerField, + filter: { + operators: filterOperators, + valueFormatter + }, csvImportParser: (value: string) => { try { const obj = JSON.parse(value); diff --git a/src/hooks/useFirestoreCollectionWithAtom.ts b/src/hooks/useFirestoreCollectionWithAtom.ts index 43f7165a..f8dada5f 100644 --- a/src/hooks/useFirestoreCollectionWithAtom.ts +++ b/src/hooks/useFirestoreCollectionWithAtom.ts @@ -376,12 +376,16 @@ export const tableFiltersToFirestoreFilters = (filters: TableFilter[]) => { } else if (filter.operator === "id-equal") { firestoreFilters.push(where(documentId(), "==", filter.value)); continue; + } else if (filter.operator === "color-equal") { + firestoreFilters.push(where(filter.key.concat(".hex"), "==", filter.value.hex.toString())) + continue + } else if (filter.operator === "color-not-equal") { + firestoreFilters.push(where(filter.key.concat(".hex"), "!=", filter.value.hex.toString())) + continue } - firestoreFilters.push( where(filter.key, filter.operator as WhereFilterOp, filter.value) ); } - return firestoreFilters; }; diff --git a/src/types/table.d.ts b/src/types/table.d.ts index dadbf2ab..fd149f5e 100644 --- a/src/types/table.d.ts +++ b/src/types/table.d.ts @@ -169,7 +169,9 @@ export type TableFilter = { | "date-before-equal" | "date-after-equal" | "time-minute-equal" - | "id-equal"; + | "id-equal" + | "color-equal" + | "color-not-equal"; value: any; }; From 52411d29d301094e8654dda2c067215f688af07d Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Wed, 2 Nov 2022 16:49:00 +1100 Subject: [PATCH 233/309] Update src/components/fields/Rating/Icon.tsx --- src/components/fields/Rating/Icon.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/fields/Rating/Icon.tsx b/src/components/fields/Rating/Icon.tsx index 374a395f..c0250c54 100644 --- a/src/components/fields/Rating/Icon.tsx +++ b/src/components/fields/Rating/Icon.tsx @@ -8,7 +8,7 @@ export interface IIconProps{ isEmpty: boolean } -export default function ({config, isEmpty} : IIconProps) { +export default function Icon({config, isEmpty} : IIconProps) { if (isEmpty) { return getStateOutline(config) } else { From d320ab24403be65911a4c6603821c7e003647a29 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Thu, 3 Nov 2022 15:07:43 +1100 Subject: [PATCH 234/309] fix dependencies --- package.json | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index ff663d09..fb029fc7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rowy", - "version": "2.6.1", + "version": "3.0.0", "homepage": "https://rowy.io", "repository": { "type": "git", @@ -15,10 +15,9 @@ "@mui/icons-material": "5.6.0", "@mui/lab": "^5.0.0-alpha.76", "@mui/material": "5.6.0", - "@mui/styles": "5.6.0", "@mui/x-date-pickers": "^5.0.0-alpha.4", - "@rowy/form-builder": "^0.6.2", - "@rowy/multiselect": "^0.4.0", + "@rowy/form-builder": "^0.7.0", + "@rowy/multiselect": "^0.4.1", "@tinymce/tinymce-react": "^3", "@uiw/react-md-editor": "^3.14.1", "algoliasearch": "^4.13.1", @@ -31,12 +30,13 @@ "file-saver": "^2.0.5", "firebase": "^9.6.11", "firebaseui": "^6.0.1", - "jotai": "^1.7.2", + "jotai": "^1.8.4", "json-stable-stringify-without-jsonify": "^1.0.1", "json2csv": "^5.0.7", "jszip": "^3.10.0", "lodash-es": "^4.17.21", "match-sorter": "^6.3.1", + "material-ui-popup-state": "^4.0.1", "mdi-material-ui": "^7.3.0", "monaco-editor-auto-typings": "^0.4.0", "notistack": "^2.0.4", @@ -47,6 +47,7 @@ "react-beautiful-dnd": "^13.1.0", "react-color-palette": "^6.2.0", "react-data-grid": "7.0.0-beta.5", + "react-detect-offline": "^2.4.5", "react-div-100vh": "^0.7.0", "react-dnd": "^16.0.1", "react-dnd-html5-backend": "^16.0.1", @@ -64,6 +65,7 @@ "react-scripts": "^5.0.0", "react-usestateref": "^1.0.8", "remark-gfm": "^3.0.1", + "seedrandom": "^3.0.5", "stream-browserify": "^3.0.0", "swr": "^1.3.0", "tinymce": "^5", @@ -155,10 +157,12 @@ "@types/node": "^17.0.23", "@types/react": "^18.0.5", "@types/react-beautiful-dnd": "^13.1.2", + "@types/react-detect-offline": "^2.4.1", "@types/react-div-100vh": "^0.4.0", "@types/react-dom": "^18.0.0", "@types/react-router-dom": "^5.3.3", "@types/react-router-hash-link": "^2.4.5", + "@types/seedrandom": "^3.0.2", "@typescript-eslint/parser": "^5.18.0", "craco-alias": "^3.0.1", "craco-swc": "^0.5.1", From 796c980337084a29c98916276fde0bf2c123df7a Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Tue, 8 Nov 2022 16:18:33 +1100 Subject: [PATCH 235/309] unify withTableCell HOCs into single HOC with memo --- src/atoms/tableScope/ui.ts | 1 + src/components/SideDrawer/SideDrawer.tsx | 6 +- src/components/Table/CellValidation.tsx | 9 +- .../Table/FinalColumn/FinalColumn.tsx | 11 +- src/components/Table/Styled/StyledCell.tsx | 20 +- src/components/Table/Styled/StyledRow.tsx | 34 +-- src/components/Table/Styled/StyledTable.tsx | 13 ++ src/components/Table/Table.tsx | 75 ++++--- src/components/Table/TableContainer.tsx | 2 +- src/components/Table/editors/TextEditor.tsx | 2 +- .../Table/useKeyboardNavigation.tsx | 13 +- src/components/Table/useVirtualization.tsx | 4 +- src/components/Table/withTableCell.tsx | 198 ++++++++++++++++++ src/components/TableToolbar/RowHeight.tsx | 4 +- .../fields/Checkbox/DisplayCell.tsx | 30 +++ .../{TableCell.tsx => EditorCell.tsx} | 6 +- src/components/fields/Checkbox/index.tsx | 14 +- .../{InlineCell.tsx => DisplayCell.tsx} | 39 ++-- .../fields/MultiSelect/PopoverCell.tsx | 4 +- src/components/fields/MultiSelect/index.tsx | 10 +- .../fields/Reference/EditorCell.tsx | 2 +- .../fields/ShortText/EditorCell.tsx | 61 ++++++ src/components/fields/ShortText/index.tsx | 7 +- .../fields/_BasicCell/BasicCellNull.tsx | 4 +- .../fields/_withTableCell/withHeavyCell.tsx | 7 +- .../fields/_withTableCell/withPopoverCell.tsx | 12 +- src/components/fields/types.ts | 25 ++- src/hooks/useSaveOnUnmount.ts | 19 ++ src/index.tsx | 10 +- src/pages/Table/TablePage.tsx | 7 +- 30 files changed, 509 insertions(+), 140 deletions(-) create mode 100644 src/components/Table/withTableCell.tsx create mode 100644 src/components/fields/Checkbox/DisplayCell.tsx rename src/components/fields/Checkbox/{TableCell.tsx => EditorCell.tsx} (92%) rename src/components/fields/MultiSelect/{InlineCell.tsx => DisplayCell.tsx} (50%) create mode 100644 src/components/fields/ShortText/EditorCell.tsx create mode 100644 src/hooks/useSaveOnUnmount.ts diff --git a/src/atoms/tableScope/ui.ts b/src/atoms/tableScope/ui.ts index f0083eda..3d11a081 100644 --- a/src/atoms/tableScope/ui.ts +++ b/src/atoms/tableScope/ui.ts @@ -133,6 +133,7 @@ export const sideDrawerOpenAtom = atom(false); export type SelectedCell = { path: string | "_rowy_header"; columnKey: string | "_rowy_row_actions"; + focusInside: boolean; }; /** Store selected cell in table. Used in side drawer and context menu */ export const selectedCellAtom = atom(null); diff --git a/src/components/SideDrawer/SideDrawer.tsx b/src/components/SideDrawer/SideDrawer.tsx index 54b82de0..04f896bd 100644 --- a/src/components/SideDrawer/SideDrawer.tsx +++ b/src/components/SideDrawer/SideDrawer.tsx @@ -79,7 +79,11 @@ export default function SideDrawer({ if (direction === "down" && rowIndex < tableRows.length - 1) rowIndex += 1; const newPath = tableRows[rowIndex]._rowy_ref.path; - setCell((cell) => ({ columnKey: cell!.columnKey, path: newPath })); + setCell((cell) => ({ + columnKey: cell!.columnKey, + path: newPath, + focusInside: false, + })); const columnIndex = visibleColumnKeys.indexOf(cell!.columnKey || ""); dataGridRef?.current?.selectCell( diff --git a/src/components/Table/CellValidation.tsx b/src/components/Table/CellValidation.tsx index ad7560dc..02284cb3 100644 --- a/src/components/Table/CellValidation.tsx +++ b/src/components/Table/CellValidation.tsx @@ -1,3 +1,4 @@ +import { memo } from "react"; import { styled } from "@mui/material/styles"; import ErrorIcon from "@mui/icons-material/ErrorOutline"; import WarningIcon from "@mui/icons-material/WarningAmber"; @@ -18,7 +19,7 @@ const Dot = styled("div")(({ theme }) => ({ borderRadius: "50%", backgroundColor: theme.palette.error.main, - boxShadow: `0 0 0 4px var(--background-color)`, + boxShadow: `0 0 0 4px var(--cell-background-color)`, "[role='row']:hover &": { boxShadow: `0 0 0 4px var(--row-hover-background-color)`, }, @@ -34,7 +35,7 @@ export interface ICellValidationProps validationRegex?: string; } -export default function CellValidation({ +export const CellValidation = memo(function MemoizedCellValidation({ value, required, validationRegex, @@ -73,4 +74,6 @@ export default function CellValidation({ ); return {children}; -} +}); + +export default CellValidation; diff --git a/src/components/Table/FinalColumn/FinalColumn.tsx b/src/components/Table/FinalColumn/FinalColumn.tsx index c9d23dca..4b7c8bd0 100644 --- a/src/components/Table/FinalColumn/FinalColumn.tsx +++ b/src/components/Table/FinalColumn/FinalColumn.tsx @@ -1,3 +1,4 @@ +import { memo } from "react"; import { useAtom, useSetAtom } from "jotai"; import type { TableCellProps } from "@src/components/Table"; @@ -21,7 +22,10 @@ import { contextMenuTargetAtom, } from "@src/atoms/tableScope"; -export default function FinalColumn({ row, focusInsideCell }: TableCellProps) { +export const FinalColumn = memo(function FinalColumn({ + row, + focusInsideCell, +}: TableCellProps) { const [userRoles] = useAtom(userRolesAtom, projectScope); const [addRowIdType] = useAtom(tableAddRowIdTypeAtom, projectScope); const confirm = useSetAtom(confirmDialogAtom, projectScope); @@ -47,7 +51,7 @@ export default function FinalColumn({ row, focusInsideCell }: TableCellProps) { @@ -145,4 +149,5 @@ export default function FinalColumn({ row, focusInsideCell }: TableCellProps) { ); -} +}); +export default FinalColumn; diff --git a/src/components/Table/Styled/StyledCell.tsx b/src/components/Table/Styled/StyledCell.tsx index af2e03b4..23ffb2ef 100644 --- a/src/components/Table/Styled/StyledCell.tsx +++ b/src/components/Table/Styled/StyledCell.tsx @@ -1,31 +1,29 @@ -import { colord } from "colord"; import { styled } from "@mui/material"; export const StyledCell = styled("div")(({ theme }) => ({ + position: "relative", display: "flex", alignItems: "center", + lineHeight: "calc(var(--row-height) - 1px)", + whiteSpace: "nowrap", "--cell-padding": theme.spacing(10 / 8), "& > .cell-contents": { padding: "0 var(--cell-padding)", - lineHeight: "calc(var(--row-height) - 1px)", + width: "100%", + height: "100%", + contain: "strict", + overflow: "hidden", }, - overflow: "visible", - contain: "strict", - position: "relative", - - backgroundColor: theme.palette.background.paper, + backgroundColor: "var(--cell-background-color)", border: `1px solid ${theme.palette.divider}`, borderTop: "none", "& + &": { borderLeft: "none" }, "[role='row']:hover &": { - backgroundColor: colord(theme.palette.background.paper) - .mix(theme.palette.action.hover, theme.palette.action.hoverOpacity) - .alpha(1) - .toHslString(), + backgroundColor: "var(--row-hover-background-color)", }, "[data-out-of-order='true'] + [role='row'] &": { diff --git a/src/components/Table/Styled/StyledRow.tsx b/src/components/Table/Styled/StyledRow.tsx index cbaed8c2..49c3408f 100644 --- a/src/components/Table/Styled/StyledRow.tsx +++ b/src/components/Table/Styled/StyledRow.tsx @@ -1,10 +1,7 @@ import { styled, alpha } from "@mui/material"; -import { DEFAULT_ROW_HEIGHT } from "@src/components/Table"; - export const StyledRow = styled("div")(({ theme }) => ({ display: "flex", - height: DEFAULT_ROW_HEIGHT, position: "relative", "& > *": { @@ -31,19 +28,24 @@ export const StyledRow = styled("div")(({ theme }) => ({ }, }, - "& .MuiIconButton-root.row-hover-iconButton, .MuiIconButton-root.row-hover-iconButton:focus": - { - color: theme.palette.text.disabled, - transitionDuration: "0s", - }, - "&:hover .MuiIconButton-root.row-hover-iconButton, .MuiIconButton-root.row-hover-iconButton:focus": - { - color: theme.palette.text.primary, - backgroundColor: alpha( - theme.palette.action.hover, - theme.palette.action.hoverOpacity * 1.5 - ), - }, + "& .row-hover-iconButton, .row-hover-iconButton:focus": { + color: theme.palette.text.disabled, + transitionDuration: "0s", + + flexShrink: 0, + borderRadius: theme.shape.borderRadius, + padding: (32 - 20) / 2, + boxSizing: "content-box", + + "&.end": { marginRight: theme.spacing(0.5) }, + }, + "&:hover .row-hover-iconButton, .row-hover-iconButton:focus": { + color: theme.palette.text.primary, + backgroundColor: alpha( + theme.palette.action.hover, + theme.palette.action.hoverOpacity * 1.5 + ), + }, })); StyledRow.displayName = "StyledRow"; diff --git a/src/components/Table/Styled/StyledTable.tsx b/src/components/Table/Styled/StyledTable.tsx index 23c648e5..904520ba 100644 --- a/src/components/Table/Styled/StyledTable.tsx +++ b/src/components/Table/Styled/StyledTable.tsx @@ -1,6 +1,19 @@ import { styled } from "@mui/material"; +import { colord } from "colord"; export const StyledTable = styled("div")(({ theme }) => ({ + "--cell-background-color": + theme.palette.mode === "light" + ? theme.palette.background.paper + : colord(theme.palette.background.paper) + .mix("#fff", 0.04) + .alpha(1) + .toHslString(), + "--row-hover-background-color": colord(theme.palette.background.paper) + .mix(theme.palette.action.hover, theme.palette.action.hoverOpacity) + .alpha(1) + .toHslString(), + ...(theme.typography.caption as any), lineHeight: "inherit !important", diff --git a/src/components/Table/Table.tsx b/src/components/Table/Table.tsx index 6f219236..a3d60147 100644 --- a/src/components/Table/Table.tsx +++ b/src/components/Table/Table.tsx @@ -14,6 +14,7 @@ import { Droppable, Draggable, } from "react-beautiful-dnd"; +import { get } from "lodash-es"; import { Portal } from "@mui/material"; import { ErrorBoundary } from "react-error-boundary"; @@ -63,6 +64,8 @@ export const DEBOUNCE_DELAY = 500; export type TableCellProps = CellContext & { focusInsideCell: boolean; + setFocusInsideCell: (focusInside: boolean) => void; + disabled: boolean; }; declare module "@tanstack/table-core" { @@ -95,6 +98,7 @@ export default function Table({ const [tablePage, setTablePage] = useAtom(tablePageAtom, tableScope); const [selectedCell, setSelectedCell] = useAtom(selectedCellAtom, tableScope); const setContextMenuTarget = useSetAtom(contextMenuTargetAtom, tableScope); + const focusInsideCell = selectedCell?.focusInside ?? false; const updateColumn = useSetAtom(updateColumnAtom, tableScope); const updateField = useSetAtom(updateFieldAtom, tableScope); @@ -109,7 +113,7 @@ export default function Table({ // Hide column for all users using table schema .filter((column) => !column.hidden) .map((columnConfig) => - columnHelper.accessor(columnConfig.fieldName, { + columnHelper.accessor((row) => get(row, columnConfig.fieldName), { id: columnConfig.fieldName, meta: columnConfig, size: columnConfig.width, @@ -119,7 +123,7 @@ export default function Table({ }) ); - if (canAddColumn || !tableSettings.readOnly) { + if (canAddColumn || canEditCell) { _columns.push( columnHelper.display({ id: "_rowy_column_actions", @@ -129,7 +133,7 @@ export default function Table({ } return _columns; - }, [tableColumnsOrdered, canAddColumn, tableSettings.readOnly]); + }, [tableColumnsOrdered, canAddColumn, canEditCell]); // Get user’s hidden columns from props and memoize into a VisibilityState const columnVisibility = useMemo(() => { @@ -171,7 +175,7 @@ export default function Table({ const { rows } = table.getRowModel(); const leafColumns = table.getVisibleLeafColumns(); - const { handleKeyDown, focusInsideCell } = useKeyboardNavigation({ + const { handleKeyDown } = useKeyboardNavigation({ gridRef, tableRows, leafColumns, @@ -228,7 +232,7 @@ export default function Table({ { setSelectedCell({ path: "_rowy_header", columnKey: header.id, + focusInside: false, + }); + (e.target as HTMLDivElement).focus(); + }} + onDoubleClick={(e) => { + setSelectedCell({ + path: "_rowy_header", + columnKey: header.id, + focusInside: true, }); (e.target as HTMLDivElement).focus(); }} @@ -425,11 +438,11 @@ export default function Table({ tabIndex={isSelectedCell && !focusInsideCell ? 0 : -1} aria-colindex={cellIndex + 1} aria-readonly={ - !canEditCell && + !canEditCell || cell.column.columnDef.meta?.editable === false } aria-required={Boolean( - cell.column.columnDef.meta!.config?.required + cell.column.columnDef.meta?.config?.required )} aria-selected={isSelectedCell} aria-describedby="rowy-table-cell-description" @@ -456,6 +469,15 @@ export default function Table({ setSelectedCell({ path: row.original._rowy_ref.path, columnKey: cell.column.id, + focusInside: false, + }); + (e.target as HTMLDivElement).focus(); + }} + onDoubleClick={(e) => { + setSelectedCell({ + path: row.original._rowy_ref.path, + columnKey: cell.column.id, + focusInside: true, }); (e.target as HTMLDivElement).focus(); }} @@ -464,27 +486,32 @@ export default function Table({ setSelectedCell({ path: row.original._rowy_ref.path, columnKey: cell.column.id, + focusInside: false, }); (e.target as HTMLDivElement).focus(); setContextMenuTarget(e.target as HTMLElement); }} value={cell.getValue()} - required={cell.column.columnDef.meta!.config?.required} + required={cell.column.columnDef.meta?.config?.required} validationRegex={ - cell.column.columnDef.meta!.config?.validationRegex + cell.column.columnDef.meta?.config?.validationRegex } > -
    - - {flexRender(cell.column.columnDef.cell, { - ...cell.getContext(), - focusInsideCell: isSelectedCell && focusInsideCell, - })} - -
    + + {flexRender(cell.column.columnDef.cell, { + ...cell.getContext(), + focusInsideCell: isSelectedCell && focusInsideCell, + setFocusInsideCell: (focusInside: boolean) => + setSelectedCell({ + path: row.original._rowy_ref.path, + columnKey: cell.column.id, + focusInside, + }), + disabled: + !canEditCell || + cell.column.columnDef.meta?.editable === false, + })} + ); })} diff --git a/src/components/Table/TableContainer.tsx b/src/components/Table/TableContainer.tsx index eb372f3e..10061298 100644 --- a/src/components/Table/TableContainer.tsx +++ b/src/components/Table/TableContainer.tsx @@ -43,7 +43,7 @@ export const TableContainer = styled("div", { "--color": theme.palette.text.primary, "--border-color": theme.palette.divider, // "--summary-border-color": "#aaa", - "--background-color": + "--cell-background-color": theme.palette.mode === "light" ? theme.palette.background.paper : colord(theme.palette.background.paper) diff --git a/src/components/Table/editors/TextEditor.tsx b/src/components/Table/editors/TextEditor.tsx index 2652c330..58229457 100644 --- a/src/components/Table/editors/TextEditor.tsx +++ b/src/components/Table/editors/TextEditor.tsx @@ -81,7 +81,7 @@ export default function TextEditor({ row, column }: EditorProps) { sx={{ width: "100%", height: "100%", - backgroundColor: "var(--background-color)", + backgroundColor: "var(--cell-background-color)", "& .MuiInputBase-root": { height: "100%", diff --git a/src/components/Table/useKeyboardNavigation.tsx b/src/components/Table/useKeyboardNavigation.tsx index cd2332c6..57c8829c 100644 --- a/src/components/Table/useKeyboardNavigation.tsx +++ b/src/components/Table/useKeyboardNavigation.tsx @@ -1,4 +1,3 @@ -import { useState } from "react"; import { useSetAtom } from "jotai"; import { Column } from "@tanstack/react-table"; @@ -23,7 +22,6 @@ export function useKeyboardNavigation({ leafColumns, }: IUseKeyboardNavigationProps) { const setSelectedCell = useSetAtom(selectedCellAtom, tableScope); - const [focusInsideCell, setFocusInsideCell] = useState(false); const handleKeyDown = (e: React.KeyboardEvent) => { // Block default browser behavior for arrow keys (scroll) and other keys @@ -43,7 +41,7 @@ export function useKeyboardNavigation({ // Esc: exit cell if (e.key === "Escape") { - setFocusInsideCell(false); + setSelectedCell((c) => ({ ...c!, focusInside: false })); ( gridRef.current?.querySelector("[aria-selected=true]") as HTMLDivElement )?.focus(); @@ -63,7 +61,7 @@ export function useKeyboardNavigation({ // Enter: enter cell if (e.key === "Enter") { - setFocusInsideCell(true); + setSelectedCell((c) => ({ ...c!, focusInside: true })); (target.querySelector("[tabindex]") as HTMLElement)?.focus(); return; } @@ -125,6 +123,8 @@ export function useKeyboardNavigation({ ? tableRows[newRowIndex]._rowy_ref.path : "_rowy_header", columnKey: leafColumns[newColIndex].id! || leafColumns[0].id!, + // When selected cell changes, exit current cell + focusInside: false, }; // Store in selectedCellAtom @@ -139,12 +139,9 @@ export function useKeyboardNavigation({ // Focus the cell if (newCellEl) setTimeout(() => (newCellEl as HTMLDivElement).focus()); - - // When selected cell changes, exit current cell - setFocusInsideCell(false); }; - return { handleKeyDown, focusInsideCell } as const; + return { handleKeyDown } as const; } export default useKeyboardNavigation; diff --git a/src/components/Table/useVirtualization.tsx b/src/components/Table/useVirtualization.tsx index 66b226ea..b9b3ca55 100644 --- a/src/components/Table/useVirtualization.tsx +++ b/src/components/Table/useVirtualization.tsx @@ -39,7 +39,7 @@ export function useVirtualization( } = useVirtual({ parentRef: containerRef, size: tableRows.length, - overscan: 10, + overscan: 5, paddingEnd: TABLE_PADDING, estimateSize: useCallback( (index: number) => @@ -58,7 +58,7 @@ export function useVirtualization( parentRef: containerRef, horizontal: true, size: leafColumns.length, - overscan: 10, + overscan: 5, paddingStart: TABLE_PADDING, paddingEnd: TABLE_PADDING, estimateSize: useCallback( diff --git a/src/components/Table/withTableCell.tsx b/src/components/Table/withTableCell.tsx new file mode 100644 index 00000000..3021fe40 --- /dev/null +++ b/src/components/Table/withTableCell.tsx @@ -0,0 +1,198 @@ +import { memo, Suspense, useState, useEffect, useRef } from "react"; +import { useSetAtom } from "jotai"; +import { get, isEqual } from "lodash-es"; +import type { TableCellProps } from "@src/components/Table"; +import { + IDisplayCellProps, + IEditorCellProps, +} from "@src/components/fields/types"; + +import { Popover, PopoverProps } from "@mui/material"; + +import { tableScope, updateFieldAtom } from "@src/atoms/tableScope"; + +export interface ICellOptions { + /** If the rest of the row’s data is used, set this to true for memoization */ + usesRowData?: boolean; + /** Handle padding inside the cell component */ + disablePadding?: boolean; + /** Set popover background to be transparent */ + transparent?: boolean; + /** Props to pass to MUI Popover component */ + popoverProps?: Partial; +} + +/** + * HOC to render table cells. + * Renders read-only DisplayCell while scrolling for scroll performance. + * Defers render for inline EditorCell. + * @param DisplayCellComponent - The lighter cell component to display values + * @param EditorCellComponent - The heavier cell component to edit inline + * @param editorMode - When to display the EditorCell + * - "focus" (default) - when the cell is focused (Enter or double-click) + * - "inline" - inline with deferred render + * - "popover" - as a popover + * @param options - {@link ICellOptions} + */ +export default function withTableCell( + DisplayCellComponent: React.ComponentType, + EditorCellComponent: React.ComponentType, + editorMode: "focus" | "inline" | "popover" = "focus", + options: ICellOptions = {} +) { + return memo( + function TableCell({ + row, + column, + getValue, + focusInsideCell, + setFocusInsideCell, + disabled, + }: TableCellProps) { + const value = getValue(); + const updateField = useSetAtom(updateFieldAtom, tableScope); + + // Store ref to rendered DisplayCell to get positioning for PopoverCell + const displayCellRef = useRef(null); + const parentRef = displayCellRef.current?.parentElement; + + // Store Popover open state here so we can add delay for close transition + const [popoverOpen, setPopoverOpen] = useState(false); + useEffect(() => { + if (focusInsideCell) setPopoverOpen(true); + }, [focusInsideCell]); + const showPopoverCell = (popover: boolean) => { + if (popover) { + setPopoverOpen(true); + // Need to call this after a timeout, since the cell’s `onClick` + // event is fired, which sets focusInsideCell false + setTimeout(() => setFocusInsideCell(true)); + } else { + setPopoverOpen(false); + // Call after a timeout to allow the close transition to finish + setTimeout(() => { + setFocusInsideCell(false); + // Focus the cell. Otherwise, it focuses the body. + parentRef?.focus(); + }, 300); + } + }; + + // Declare basicCell here so props can be reused by HeavyCellComponent + const basicCellProps: IDisplayCellProps = { + value, + name: column.columnDef.meta!.name, + type: column.columnDef.meta!.type, + row: row.original, + column: column.columnDef.meta!, + docRef: row.original._rowy_ref, + disabled: column.columnDef.meta!.editable === false, + showPopoverCell, + setFocusInsideCell, + }; + + // Show display cell, unless if editorMode is inline + const displayCell = ( +
    + +
    + ); + if (disabled || (editorMode !== "inline" && !focusInsideCell)) + return displayCell; + + // This is where we update the documents + const handleSubmit = (value: any) => { + if (disabled) return; + updateField({ + path: row.original._rowy_ref.path, + fieldName: column.id, + value, + deleteField: value === undefined, + }); + }; + + const editorCell = ( + + ); + + if (editorMode === "focus" && focusInsideCell) { + return editorCell; + } + + if (editorMode === "inline") { + return ( +
    + {editorCell} +
    + ); + } + + if (editorMode === "popover") + return ( + <> + {displayCell} + + + showPopoverCell(false)} + anchorOrigin={{ horizontal: "left", vertical: "bottom" }} + {...options.popoverProps} + sx={ + options.transparent + ? { + "& .MuiPopover-paper": { + backgroundColor: "transparent", + }, + } + : {} + } + onClick={(e) => e.stopPropagation()} + onDoubleClick={(e) => e.stopPropagation()} + onKeyDown={(e) => e.stopPropagation()} + > + {editorCell} + + + + ); + + // Should not reach this line + return null; + }, + (prev, next) => { + const valueEqual = isEqual( + get(prev.row.original, prev.column.columnDef.meta!.fieldName), + get(next.row.original, next.column.columnDef.meta!.fieldName) + ); + const columnEqual = isEqual( + prev.column.columnDef.meta, + next.column.columnDef.meta + ); + const rowEqual = isEqual(prev.row.original, next.row.original); + const focusInsideCellEqual = + prev.focusInsideCell === next.focusInsideCell; + const disabledEqual = prev.disabled === next.disabled; + + const baseEqualities = + valueEqual && columnEqual && focusInsideCellEqual && disabledEqual; + + if (options?.usesRowData) return baseEqualities && rowEqual; + else return baseEqualities; + } + ); +} diff --git a/src/components/TableToolbar/RowHeight.tsx b/src/components/TableToolbar/RowHeight.tsx index 59e8523b..88f56944 100644 --- a/src/components/TableToolbar/RowHeight.tsx +++ b/src/components/TableToolbar/RowHeight.tsx @@ -12,7 +12,7 @@ import { } from "@src/atoms/tableScope"; import { DEFAULT_ROW_HEIGHT } from "@src/components/Table"; -const ROW_HEIGHTS = [32, 40, 64, 96, 128, 160]; +const ROW_HEIGHTS = [32, 40, 64, 96, 128, 160].map((x) => x + 1); export default function RowHeight() { const theme = useTheme(); @@ -63,7 +63,7 @@ export default function RowHeight() { Row height {ROW_HEIGHTS.map((height) => ( - {height}px + {height - 1}px ))} diff --git a/src/components/fields/Checkbox/DisplayCell.tsx b/src/components/fields/Checkbox/DisplayCell.tsx new file mode 100644 index 00000000..67943586 --- /dev/null +++ b/src/components/fields/Checkbox/DisplayCell.tsx @@ -0,0 +1,30 @@ +import { IDisplayCellProps } from "@src/components/fields/types"; + +import { FormControlLabel, Switch } from "@mui/material"; + +export default function Checkbox({ column, value }: IDisplayCellProps) { + return ( + + } + label={column.name as string} + labelPlacement="start" + sx={{ + m: 0, + width: "100%", + alignItems: "center", + + "& .MuiFormControlLabel-label": { + font: "inherit", + letterSpacing: "inherit", + flexGrow: 1, + overflowX: "hidden", + mt: "0 !important", + }, + + "& .MuiSwitch-root": { mr: -0.75 }, + }} + /> + ); +} diff --git a/src/components/fields/Checkbox/TableCell.tsx b/src/components/fields/Checkbox/EditorCell.tsx similarity index 92% rename from src/components/fields/Checkbox/TableCell.tsx rename to src/components/fields/Checkbox/EditorCell.tsx index 5cef0a3b..4785700c 100644 --- a/src/components/fields/Checkbox/TableCell.tsx +++ b/src/components/fields/Checkbox/EditorCell.tsx @@ -1,4 +1,4 @@ -import { IHeavyCellProps } from "@src/components/fields/types"; +import { IEditorCellProps } from "@src/components/fields/types"; import { useSetAtom } from "jotai"; import { get } from "lodash-es"; @@ -17,7 +17,8 @@ export default function Checkbox({ value, onSubmit, disabled, -}: IHeavyCellProps) { + tabIndex, +}: IEditorCellProps) { const confirm = useSetAtom(confirmDialogAtom, projectScope); const handleChange = () => { @@ -43,6 +44,7 @@ export default function Checkbox({ onChange={handleChange} disabled={disabled} color="success" + tabIndex={tabIndex} /> } label={column.name as string} diff --git a/src/components/fields/Checkbox/index.tsx b/src/components/fields/Checkbox/index.tsx index 848a52c0..291d074c 100644 --- a/src/components/fields/Checkbox/index.tsx +++ b/src/components/fields/Checkbox/index.tsx @@ -1,13 +1,12 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withHeavyCell from "@src/components/fields/_withTableCell/withHeavyCell"; +import withTableCell from "@src/components/Table/withTableCell"; import CheckboxIcon from "@mui/icons-material/ToggleOnOutlined"; -import BasicCell from "@src/components/fields/_BasicCell/BasicCellName"; -import NullEditor from "@src/components/Table/editors/NullEditor"; +import DisplayCell from "./DisplayCell"; -const TableCell = lazy( - () => import("./TableCell" /* webpackChunkName: "TableCell-Checkbox" */) +const EditorCell = lazy( + () => import("./EditorCell" /* webpackChunkName: "EditorCell-Checkbox" */) ); const SideDrawerField = lazy( () => @@ -25,8 +24,9 @@ export const config: IFieldConfig = { initializable: true, icon: , description: "True/false value. Default: false.", - TableCell: withHeavyCell(BasicCell, TableCell), - TableEditor: NullEditor as any, + TableCell: withTableCell(DisplayCell, EditorCell, "inline", { + usesRowData: true, + }), csvImportParser: (value: string) => { if (["YES", "TRUE", "1"].includes(value.toUpperCase())) return true; else if (["NO", "FALSE", "0"].includes(value.toUpperCase())) return false; diff --git a/src/components/fields/MultiSelect/InlineCell.tsx b/src/components/fields/MultiSelect/DisplayCell.tsx similarity index 50% rename from src/components/fields/MultiSelect/InlineCell.tsx rename to src/components/fields/MultiSelect/DisplayCell.tsx index 8f27323c..94a07938 100644 --- a/src/components/fields/MultiSelect/InlineCell.tsx +++ b/src/components/fields/MultiSelect/DisplayCell.tsx @@ -1,5 +1,4 @@ -import { forwardRef } from "react"; -import { IPopoverInlineCellProps } from "@src/components/fields/types"; +import { IDisplayCellProps } from "@src/components/fields/types"; import { ButtonBase, Grid } from "@mui/material"; import { ChevronDown } from "@src/assets/icons"; @@ -7,22 +6,21 @@ import { ChevronDown } from "@src/assets/icons"; import { sanitiseValue } from "./utils"; import ChipList from "@src/components/Table/formatters/ChipList"; import FormattedChip from "@src/components/FormattedChip"; -import { ConvertStringToArray } from "./ConvertStringToArray"; -export const MultiSelect = forwardRef(function MultiSelect( - { value, showPopoverCell, disabled, onSubmit }: IPopoverInlineCellProps, - ref: React.Ref -) { - if (typeof value === "string" && value !== "") - return ; +export default function MultiSelect({ + value, + showPopoverCell, + disabled, +}: IDisplayCellProps) { + // if (typeof value === "string" && value !== "") + // return ; return ( showPopoverCell(true)} - ref={ref} disabled={disabled} - className="cell-collapse-padding" - sx={{ + style={{ + width: "100%", height: "100%", font: "inherit", color: "inherit !important", @@ -42,20 +40,7 @@ export const MultiSelect = forwardRef(function MultiSelect( )} - {!disabled && ( - - )} + {!disabled && } ); -}); - -export default MultiSelect; +} diff --git a/src/components/fields/MultiSelect/PopoverCell.tsx b/src/components/fields/MultiSelect/PopoverCell.tsx index 50c0ad05..0f35e52d 100644 --- a/src/components/fields/MultiSelect/PopoverCell.tsx +++ b/src/components/fields/MultiSelect/PopoverCell.tsx @@ -1,4 +1,4 @@ -import { IPopoverCellProps } from "@src/components/fields/types"; +import { IEditorCellProps } from "@src/components/fields/types"; import MultiSelectComponent from "@rowy/multiselect"; @@ -11,7 +11,7 @@ export default function MultiSelect({ parentRef, showPopoverCell, disabled, -}: IPopoverCellProps) { +}: IEditorCellProps) { const config = column.config ?? {}; return ( diff --git a/src/components/fields/MultiSelect/index.tsx b/src/components/fields/MultiSelect/index.tsx index b6f3a853..d5a18ed5 100644 --- a/src/components/fields/MultiSelect/index.tsx +++ b/src/components/fields/MultiSelect/index.tsx @@ -1,10 +1,9 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withPopoverCell from "@src/components/fields/_withTableCell/withPopoverCell"; +import withTableCell from "@src/components/Table/withTableCell"; import { MultiSelect as MultiSelectIcon } from "@src/assets/icons"; -import BasicCell from "@src/components/fields/_BasicCell/BasicCellNull"; -import InlineCell from "./InlineCell"; +import DisplayCell from "./DisplayCell"; import NullEditor from "@src/components/Table/editors/NullEditor"; import { filterOperators } from "./Filter"; const PopoverCell = lazy( @@ -34,9 +33,8 @@ export const config: IFieldConfig = { icon: , description: "Multiple values from predefined options. Options are searchable and users can optionally input custom values.", - TableCell: withPopoverCell(BasicCell, InlineCell, PopoverCell, { - anchorOrigin: { horizontal: "left", vertical: "bottom" }, - transparent: true, + TableCell: withTableCell(DisplayCell, PopoverCell, "popover", { + disablePadding: true, }), TableEditor: NullEditor as any, SideDrawerField, diff --git a/src/components/fields/Reference/EditorCell.tsx b/src/components/fields/Reference/EditorCell.tsx index 12c5e6b2..8b96b8b3 100644 --- a/src/components/fields/Reference/EditorCell.tsx +++ b/src/components/fields/Reference/EditorCell.tsx @@ -61,7 +61,7 @@ export default function TextEditor({ row, column }: EditorProps) { sx={{ width: "100%", height: "100%", - backgroundColor: "var(--background-color)", + backgroundColor: "var(--cell-background-color)", "& .MuiInputBase-root": { height: "100%", diff --git a/src/components/fields/ShortText/EditorCell.tsx b/src/components/fields/ShortText/EditorCell.tsx new file mode 100644 index 00000000..418ce4dd --- /dev/null +++ b/src/components/fields/ShortText/EditorCell.tsx @@ -0,0 +1,61 @@ +import type { IEditorCellProps } from "@src/components/fields/types"; +import { useSaveOnUnmount } from "@src/hooks/useSaveOnUnmount"; + +import { InputBase } from "@mui/material"; + +export default function ShortText({ + column, + value, + onSubmit, + setFocusInsideCell, +}: IEditorCellProps) { + const [localValue, setLocalValue] = useSaveOnUnmount(value, onSubmit); + const maxLength = column.config?.maxLength; + + return ( + setLocalValue(e.target.value)} + fullWidth + inputProps={{ maxLength }} + sx={{ + width: "100%", + height: "calc(100% - 1px)", + marginTop: "1px", + paddingBottom: "1px", + + backgroundColor: "var(--cell-background-color)", + outline: "inherit", + outlineOffset: "inherit", + + font: "inherit", // Prevent text jumping + letterSpacing: "inherit", // Prevent text jumping + + "& .MuiInputBase-input": { p: "var(--cell-padding)" }, + + "& textarea.MuiInputBase-input": { + lineHeight: (theme) => theme.typography.body2.lineHeight, + maxHeight: "100%", + boxSizing: "border-box", + py: 3 / 8, + }, + }} + autoFocus + onKeyDown={(e) => { + if (e.key === "ArrowLeft" || e.key === "ArrowRight") { + e.stopPropagation(); + } + if (e.key === "Escape") { + // Escape removes focus inside cell, this runs before save on unmount + setLocalValue(value); + } + if (e.key === "Enter") { + // Removes focus from inside cell, triggering save on unmount + setFocusInsideCell(false); + } + }} + onClick={(e) => e.stopPropagation()} + onDoubleClick={(e) => e.stopPropagation()} + /> + ); +} diff --git a/src/components/fields/ShortText/index.tsx b/src/components/fields/ShortText/index.tsx index 88ef7a20..7bd36ddc 100644 --- a/src/components/fields/ShortText/index.tsx +++ b/src/components/fields/ShortText/index.tsx @@ -1,10 +1,10 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withBasicCell from "@src/components/fields/_withTableCell/withBasicCell"; +import withTableCell from "@src/components/Table/withTableCell"; import ShortTextIcon from "@mui/icons-material/ShortText"; import BasicCell from "@src/components/fields/_BasicCell/BasicCellValue"; -import TextEditor from "@src/components/Table/editors/TextEditor"; +import EditorCell from "./EditorCell"; import { filterOperators } from "./Filter"; import BasicContextMenuActions from "@src/components/fields/_BasicCell/BasicCellContextMenuActions"; @@ -30,8 +30,7 @@ export const config: IFieldConfig = { icon: , description: "Text displayed on a single line.", contextMenuActions: BasicContextMenuActions, - TableCell: withBasicCell(BasicCell), - TableEditor: TextEditor, + TableCell: withTableCell(BasicCell, EditorCell), SideDrawerField, settings: Settings, filter: { diff --git a/src/components/fields/_BasicCell/BasicCellNull.tsx b/src/components/fields/_BasicCell/BasicCellNull.tsx index 43d91ccb..6b8471b3 100644 --- a/src/components/fields/_BasicCell/BasicCellNull.tsx +++ b/src/components/fields/_BasicCell/BasicCellNull.tsx @@ -1,3 +1,3 @@ -export default function BasicCellNull() { - return null; +export default function BasicCellNull(props: any) { + return
    ; } diff --git a/src/components/fields/_withTableCell/withHeavyCell.tsx b/src/components/fields/_withTableCell/withHeavyCell.tsx index 394a497c..64c612fb 100644 --- a/src/components/fields/_withTableCell/withHeavyCell.tsx +++ b/src/components/fields/_withTableCell/withHeavyCell.tsx @@ -1,4 +1,4 @@ -import { Suspense, useState, useEffect } from "react"; +import { Suspense, useState, useEffect, startTransition } from "react"; import { useSetAtom } from "jotai"; import { get } from "lodash-es"; import type { TableCellProps } from "@src/components/Table"; @@ -22,13 +22,14 @@ export default function withHeavyCell( return function HeavyCell({ row, column, getValue }: TableCellProps) { const updateField = useSetAtom(updateFieldAtom, tableScope); + // const displayedComponent = "heavy"; // Initially display BasicCell to improve scroll performance const [displayedComponent, setDisplayedComponent] = useState< "basic" | "heavy" >("basic"); // Then switch to HeavyCell once completed useEffect(() => { - setTimeout(() => { + startTransition(() => { setDisplayedComponent("heavy"); }); }, []); @@ -45,6 +46,8 @@ export default function withHeavyCell( value: localValue, name: column.columnDef.meta!.name, type: column.columnDef.meta!.type, + onMouseOver: () => setDisplayedComponent("heavy"), + onMouseLeave: () => setDisplayedComponent("basic"), }; const basicCell = ; diff --git a/src/components/fields/_withTableCell/withPopoverCell.tsx b/src/components/fields/_withTableCell/withPopoverCell.tsx index 5cb12ac5..8a1f6b20 100644 --- a/src/components/fields/_withTableCell/withPopoverCell.tsx +++ b/src/components/fields/_withTableCell/withPopoverCell.tsx @@ -43,13 +43,13 @@ export default function withPopoverCell( // Initially display BasicCell to improve scroll performance const [displayedComponent, setDisplayedComponent] = useState< "basic" | "inline" | "popover" - >("basic"); + >("inline"); // Then switch to heavier InlineCell once completed - useEffect(() => { - setTimeout(() => { - setDisplayedComponent("inline"); - }); - }, []); + // useEffect(() => { + // setTimeout(() => { + // setDisplayedComponent("inline"); + // }); + // }, []); // Store Popover open state here so we can add delay for close transition const [popoverOpen, setPopoverOpen] = useState(false); diff --git a/src/components/fields/types.ts b/src/components/fields/types.ts index c7309452..1837e1db 100644 --- a/src/components/fields/types.ts +++ b/src/components/fields/types.ts @@ -30,7 +30,8 @@ export interface IFieldConfig { reset: () => void ) => IContextMenuItem[]; TableCell: React.ComponentType; - TableEditor: React.ComponentType>; + /** @deprecated TODO: REMOVE */ + TableEditor?: React.ComponentType>; SideDrawerField: React.ComponentType; settings?: React.ComponentType; settingsValidator?: (config: Record) => Record; @@ -45,11 +46,13 @@ export interface IFieldConfig { csvImportParser?: (value: string, config?: any) => any; } +/** @deprecated TODO: REMOVE */ export interface IBasicCellProps { value: any; type: FieldType; name: string; } +/** @deprecated TODO: REMOVE */ export interface IHeavyCellProps extends IBasicCellProps { row: TableRow; column: ColumnConfig; @@ -57,14 +60,32 @@ export interface IHeavyCellProps extends IBasicCellProps { docRef: TableRowRef; disabled: boolean; } - +/** @deprecated TODO: REMOVE */ export interface IPopoverInlineCellProps extends IHeavyCellProps { showPopoverCell: React.Dispatch>; } +/** @deprecated TODO: REMOVE */ export interface IPopoverCellProps extends IPopoverInlineCellProps { parentRef: PopoverProps["anchorEl"]; } +export interface IDisplayCellProps { + value: T; + type: FieldType; + name: string; + row: TableRow; + column: ColumnConfig; + docRef: TableRowRef; + disabled: boolean; + showPopoverCell: (value: boolean) => void; + setFocusInsideCell: (focusInside: boolean) => void; +} +export interface IEditorCellProps extends IDisplayCellProps { + onSubmit: (value: T) => void; + tabIndex: number; + parentRef: PopoverProps["anchorEl"]; +} + /** Props to be passed to all SideDrawerFields */ export interface ISideDrawerFieldProps { /** The column config */ diff --git a/src/hooks/useSaveOnUnmount.ts b/src/hooks/useSaveOnUnmount.ts new file mode 100644 index 00000000..7807ce23 --- /dev/null +++ b/src/hooks/useSaveOnUnmount.ts @@ -0,0 +1,19 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { useLayoutEffect } from "react"; +import useState from "react-usestateref"; + +export function useSaveOnUnmount( + initialValue: T, + onSave: (value: T) => void +) { + const [localValue, setLocalValue, localValueRef] = useState(initialValue); + + useLayoutEffect(() => { + return () => { + onSave(localValueRef.current); + }; + }, []); + + return [localValue, setLocalValue, localValueRef] as const; +} +export default useSaveOnUnmount; diff --git a/src/index.tsx b/src/index.tsx index f4d7b2c9..5d545f47 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -8,11 +8,11 @@ import reportWebVitals from "./reportWebVitals"; const container = document.getElementById("root")!; const root = createRoot(container); root.render( - // - - - - // + + + + + ); // If you want to start measuring performance in your app, pass a function diff --git a/src/pages/Table/TablePage.tsx b/src/pages/Table/TablePage.tsx index d324a69d..234be866 100644 --- a/src/pages/Table/TablePage.tsx +++ b/src/pages/Table/TablePage.tsx @@ -2,7 +2,7 @@ import { useRef, Suspense, lazy } from "react"; import { useAtom } from "jotai"; import { DataGridHandle } from "react-data-grid"; import { ErrorBoundary } from "react-error-boundary"; -import { isEmpty } from "lodash-es"; +import { isEmpty, intersection } from "lodash-es"; import { Box, Fade } from "@mui/material"; import ErrorFallback, { @@ -72,7 +72,10 @@ export default function TablePage({ // shouldn’t access projectScope at all, to separate concerns. const canAddColumn = userRoles.includes("ADMIN"); const canEditColumn = userRoles.includes("ADMIN"); - const canEditCell = userRoles.includes("ADMIN") || !tableSettings.readOnly; + const canEditCell = + userRoles.includes("ADMIN") || + (!tableSettings.readOnly && + intersection(userRoles, tableSettings.roles).length > 0); // Warn user about leaving when they have a table modal open useBeforeUnload(columnModalAtom, tableScope); From c31f15f0584ef24f81c52c269cbeb62a56a47b84 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Tue, 8 Nov 2022 17:29:13 +1100 Subject: [PATCH 236/309] remove table not found error in case tableSettingsAtom value is stale --- src/components/ErrorFallback.tsx | 37 +------------------- src/pages/Table/ProvidedTablePage.tsx | 50 ++++++++++++++++++++++++--- 2 files changed, 46 insertions(+), 41 deletions(-) diff --git a/src/components/ErrorFallback.tsx b/src/components/ErrorFallback.tsx index 83257aac..3d7f130a 100644 --- a/src/components/ErrorFallback.tsx +++ b/src/components/ErrorFallback.tsx @@ -1,22 +1,18 @@ import { useState, useEffect } from "react"; import { FallbackProps } from "react-error-boundary"; -import { useLocation, Link } from "react-router-dom"; +import { useLocation } from "react-router-dom"; import useOffline from "@src/hooks/useOffline"; import { Typography, Button } from "@mui/material"; import ReloadIcon from "@mui/icons-material/Refresh"; import InlineOpenInNewIcon from "@src/components/InlineOpenInNewIcon"; import OfflineIcon from "@mui/icons-material/CloudOff"; -import { Tables as TablesIcon } from "@src/assets/icons"; import EmptyState, { IEmptyStateProps } from "@src/components/EmptyState"; import AccessDenied from "@src/components/AccessDenied"; -import { ROUTES } from "@src/constants/routes"; import { EXTERNAL_LINKS } from "@src/constants/externalLinks"; -export const ERROR_TABLE_NOT_FOUND = "Table not found"; - export interface IErrorFallbackProps extends FallbackProps, IEmptyStateProps {} export function ErrorFallbackContents({ @@ -70,37 +66,6 @@ export function ErrorFallbackContents({ ), }; - if (error.message.startsWith(ERROR_TABLE_NOT_FOUND)) { - if (isOffline) { - renderProps = { Icon: OfflineIcon, message: "You’re offline" }; - } else { - renderProps = { - message: ERROR_TABLE_NOT_FOUND, - description: ( - <> - - Make sure you have the right ID - - - {error.message.replace(ERROR_TABLE_NOT_FOUND + ": ", "")} - - - - ), - }; - } - } - if (error.message.startsWith("Loading chunk")) { if (isOffline) { renderProps = { Icon: OfflineIcon, message: "You’re offline" }; diff --git a/src/pages/Table/ProvidedTablePage.tsx b/src/pages/Table/ProvidedTablePage.tsx index d2e5cb17..e605fcc6 100644 --- a/src/pages/Table/ProvidedTablePage.tsx +++ b/src/pages/Table/ProvidedTablePage.tsx @@ -1,17 +1,21 @@ import { Suspense } from "react"; import { useAtom, Provider } from "jotai"; import { DebugAtoms } from "@src/atoms/utils"; -import { useParams, useOutlet } from "react-router-dom"; +import { useParams, useOutlet, Link } from "react-router-dom"; import { ErrorBoundary } from "react-error-boundary"; import { find, isEmpty } from "lodash-es"; +import useOffline from "@src/hooks/useOffline"; -import ErrorFallback, { - ERROR_TABLE_NOT_FOUND, -} from "@src/components/ErrorFallback"; +import { Typography, Button } from "@mui/material"; + +import ErrorFallback from "@src/components/ErrorFallback"; import TableSourceFirestore from "@src/sources/TableSourceFirestore"; import TablePage from "./TablePage"; import TableToolbarSkeleton from "@src/components/TableToolbar/TableToolbarSkeleton"; import TableSkeleton from "@src/components/Table/TableSkeleton"; +import EmptyState from "@src/components/EmptyState"; +import OfflineIcon from "@mui/icons-material/CloudOff"; +import { Tables as TablesIcon } from "@src/assets/icons"; import { projectScope, @@ -26,6 +30,7 @@ import { tableSettingsAtom, } from "@src/atoms/tableScope"; import { SyncAtomValue } from "@src/atoms/utils"; +import { ROUTES } from "@src/constants/routes"; import useDocumentTitle from "@src/hooks/useDocumentTitle"; /** @@ -39,6 +44,7 @@ export default function ProvidedTablePage() { const [currentUser] = useAtom(currentUserAtom, projectScope); const [projectSettings] = useAtom(projectSettingsAtom, projectScope); const [tables] = useAtom(tablesAtom, projectScope); + const isOffline = useOffline(); const tableSettings = find(tables, ["id", id]); useDocumentTitle(projectId, tableSettings ? tableSettings.name : "Not found"); @@ -52,7 +58,41 @@ export default function ProvidedTablePage() { ); } else { - throw new Error(ERROR_TABLE_NOT_FOUND + ": " + id); + if (isOffline) { + return ( + + ); + } else { + return ( + + + Make sure you have the right ID + + {id} + + + } + /> + ); + } } } From 0356c0c12588648ba1e42eab6a070db8c2ddd49c Mon Sep 17 00:00:00 2001 From: shamsmosowi Date: Tue, 8 Nov 2022 16:46:15 +0100 Subject: [PATCH 237/309] fix clear value logic --- src/components/Table/ContextMenu/MenuContents.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Table/ContextMenu/MenuContents.tsx b/src/components/Table/ContextMenu/MenuContents.tsx index 60d58069..f4d36ef3 100644 --- a/src/components/Table/ContextMenu/MenuContents.tsx +++ b/src/components/Table/ContextMenu/MenuContents.tsx @@ -111,7 +111,7 @@ export default function MenuContents({ onClose }: IMenuContentsProps) { disabled: selectedColumn.editable === false || !row || - cellValue || + cellValue === undefined || getFieldProp("group", selectedColumn.type) === "Auditing", onClick: altPress ? handleClearValue From 53c7cc83d0e6666e09eb4776f49d6619ee0ec605 Mon Sep 17 00:00:00 2001 From: Han Tuerker <46192266+htuerker@users.noreply.github.com> Date: Wed, 9 Nov 2022 05:04:07 +0300 Subject: [PATCH 238/309] fix error state (#18) --- .../TableModals/ExtensionsModal/ExtensionsModal.tsx | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/components/TableModals/ExtensionsModal/ExtensionsModal.tsx b/src/components/TableModals/ExtensionsModal/ExtensionsModal.tsx index 3ae3d20b..71146804 100644 --- a/src/components/TableModals/ExtensionsModal/ExtensionsModal.tsx +++ b/src/components/TableModals/ExtensionsModal/ExtensionsModal.tsx @@ -1,6 +1,6 @@ import { useEffect, useState } from "react"; import { useAtom, useSetAtom } from "jotai"; -import { isEqual } from "lodash-es"; +import { isEqual, isUndefined } from "lodash-es"; import { ITableModalProps } from "@src/components/TableModals"; import Modal from "@src/components/Modal"; @@ -56,11 +56,12 @@ export default function ExtensionsModal({ onClose }: ITableModalProps) { const errors = { runtimeOptions: { - timeoutSeconds: !( - !!localRuntimeOptions.timeoutSeconds && - localRuntimeOptions.timeoutSeconds > 0 && - localRuntimeOptions.timeoutSeconds <= 540 - ), + timeoutSeconds: + !isUndefined(localRuntimeOptions.timeoutSeconds) && + !( + localRuntimeOptions.timeoutSeconds! > 0 && + localRuntimeOptions.timeoutSeconds! <= 540 + ), }, }; From 9d8ff4d10abb592a373e547326532b4c667b1a95 Mon Sep 17 00:00:00 2001 From: Bobby Wang Date: Wed, 9 Nov 2022 10:24:28 +0800 Subject: [PATCH 239/309] Feature/remove listener fields when deleting column (#924) * remove column from Derivative -> listenerFields and Action -> requiredFields when deleting a column * remove column from Extensions -> requiredFields when deleting a column * display where reference will be removed and force a rebuild if required when deleting column * Update src/types/table.d.ts * Update src/components/ColumnMenu/ColumnMenu.tsx * Update src/components/ColumnMenu/ColumnMenu.tsx * Update src/components/ColumnMenu/ColumnMenu.tsx Co-authored-by: Sidney Alcantara --- src/atoms/tableScope/columnActions.ts | 43 ++++++++++++- src/components/ColumnMenu/ColumnMenu.tsx | 77 ++++++++++++++++++++++-- src/types/table.d.ts | 4 ++ 3 files changed, 118 insertions(+), 6 deletions(-) diff --git a/src/atoms/tableScope/columnActions.ts b/src/atoms/tableScope/columnActions.ts index 58e44405..c0be303a 100644 --- a/src/atoms/tableScope/columnActions.ts +++ b/src/atoms/tableScope/columnActions.ts @@ -1,10 +1,12 @@ import { atom } from "jotai"; import { findIndex } from "lodash-es"; +import { FieldType } from "@src/constants/fields"; import { tableColumnsOrderedAtom, tableColumnsReducer, updateTableSchemaAtom, + tableSchemaAtom, } from "./table"; import { ColumnConfig } from "@src/types/table"; @@ -14,6 +16,7 @@ export interface IAddColumnOptions { /** Index to add column at. If undefined, adds to end */ index?: number; } + /** * Set function adds a column to tableSchema, to the end or by index. * Also fixes any issues with column indexes, so they go from 0 to length - 1 @@ -52,6 +55,7 @@ export interface IUpdateColumnOptions { /** If passed, reorders the column to the index */ index?: number; } + /** * Set function updates a column in tableSchema * @throws Error if column not found @@ -112,13 +116,50 @@ export const updateColumnAtom = atom( * ``` */ export const deleteColumnAtom = atom(null, async (get, _set, key: string) => { + const tableSchema = get(tableSchemaAtom); const tableColumnsOrdered = [...get(tableColumnsOrderedAtom)]; const updateTableSchema = get(updateTableSchemaAtom); if (!updateTableSchema) throw new Error("Cannot update table schema"); const updatedColumns = tableColumnsOrdered .filter((c) => c.key !== key) + .map((c) => { + // remove column from derivatives listener fields + if (c.type === FieldType.derivative) { + return { + ...c, + config: { + ...c.config, + listenerFields: + c.config?.listenerFields?.filter((f) => f !== key) ?? [], + }, + }; + } else if (c.type === FieldType.action) { + return { + ...c, + config: { + ...c.config, + requiredFields: + c.config?.requiredFields?.filter((f) => f !== key) ?? [], + }, + }; + } else { + return c; + } + }) .reduce(tableColumnsReducer, {}); - await updateTableSchema({ columns: updatedColumns }, [`columns.${key}`]); + const updatedExtensionObjects = tableSchema?.extensionObjects?.map( + (extension) => { + return { + ...extension, + requiredFields: extension.requiredFields.filter((f) => f !== key), + }; + } + ); + + await updateTableSchema( + { columns: updatedColumns, extensionObjects: updatedExtensionObjects }, + [`columns.${key}`] + ); }); diff --git a/src/components/ColumnMenu/ColumnMenu.tsx b/src/components/ColumnMenu/ColumnMenu.tsx index 4884a75a..4ba8400b 100644 --- a/src/components/ColumnMenu/ColumnMenu.tsx +++ b/src/components/ColumnMenu/ColumnMenu.tsx @@ -7,6 +7,7 @@ import { ListItemIcon, ListItemText, Typography, + Divider, } from "@mui/material"; import FilterIcon from "@mui/icons-material/FilterList"; import LockOpenIcon from "@mui/icons-material/LockOpen"; @@ -50,12 +51,18 @@ import { columnModalAtom, tableFiltersPopoverAtom, tableNextPageAtom, + tableSchemaAtom, } from "@src/atoms/tableScope"; import { FieldType } from "@src/constants/fields"; import { getFieldProp } from "@src/components/fields"; import { analytics, logEvent } from "@src/analytics"; -import { formatSubTableName, getTableSchemaPath } from "@src/utils/table"; +import { + formatSubTableName, + getTableBuildFunctionPathname, + getTableSchemaPath, +} from "@src/utils/table"; import { runRoutes } from "@src/constants/runRoutes"; +import { useSnackLogContext } from "@src/contexts/SnackLogContext"; export interface IMenuModalProps { name: string; @@ -91,6 +98,8 @@ export default function ColumnMenu() { tableScope ); const [tableNextPage] = useAtom(tableNextPageAtom, tableScope); + const [tableSchema] = useAtom(tableSchemaAtom, tableScope); + const snackLogContext = useSnackLogContext(); const [altPress] = useAtom(altPressAtom, projectScope); const { enqueueSnackbar, closeSnackbar } = useSnackbar(); @@ -117,8 +126,42 @@ export default function ColumnMenu() { const userDocHiddenFields = userSettings.tables?.[formatSubTableName(tableId)]?.hiddenFields ?? []; + let referencedColumns: string[] = []; + let referencedExtensions: string[] = []; + Object.entries(tableSchema?.columns ?? {}).forEach(([key, c], index) => { + if ( + c.config?.listenerFields?.includes(column.key) || + c.config?.requiredFields?.includes(column.key) + ) { + referencedColumns.push(c.name); + } + }); + tableSchema?.extensionObjects?.forEach((extension) => { + if (extension.requiredFields.includes(column.key)) { + referencedExtensions.push(extension.name); + } + }); + const requireRebuild = + referencedColumns.length || referencedExtensions.length; + const handleDeleteColumn = () => { deleteColumn(column.key); + if (requireRebuild) { + snackLogContext.requestSnackLog(); + rowyRun({ + route: runRoutes.buildFunction, + body: { + tablePath: tableSettings.collection, + // pathname must match old URL format + pathname: getTableBuildFunctionPathname( + tableSettings.id, + tableSettings.tableType + ), + tableConfigPath: getTableSchemaPath(tableSettings), + }, + }); + logEvent(analytics, "deployed_extensions"); + } logEvent(analytics, "delete_column", { type: column.type }); handleClose(); }; @@ -360,8 +403,8 @@ export default function ColumnMenu() { icon: , onClick: altPress ? handleDeleteColumn - : () => - confirm({ + : () => { + return confirm({ title: "Delete column?", body: ( <> @@ -373,12 +416,36 @@ export default function ColumnMenu() { Key: {column.key} + {requireRebuild ? ( + <> + + {referencedColumns.length ? ( + + This column will be removed as a dependency of the following columns:{" "} + + {referencedColumns.join(", ")} + + + ) : null} + {referencedExtensions.length ? ( + + This column will be removed as a dependency from the following Extensions:{" "} + + {referencedExtensions.join(", ")} + + ) : null} + + You need to re-deploy this table’s cloud function. + + + ) : null} ), - confirm: "Delete", + confirm: requireRebuild ? "Delete & re-deploy" : "Delete", confirmColor: "error", handleConfirm: handleDeleteColumn, - }), + }); + }, color: "error" as "error", }, ]; diff --git a/src/types/table.d.ts b/src/types/table.d.ts index fd149f5e..f4e3bb96 100644 --- a/src/types/table.d.ts +++ b/src/types/table.d.ts @@ -149,6 +149,10 @@ export type ColumnConfig = { }; /** FieldType to render for Derivative fields */ renderFieldType?: FieldType; + /** Used in Derivative fields */ + listenerFields?: string[]; + /** Used in Derivative and Action fields */ + requiredFields?: string[]; /** For sub-table fields */ parentLabel?: string[]; From 42a8443c94e99a37f69629769e429f7dd7bce184 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Wed, 9 Nov 2022 15:02:13 +1100 Subject: [PATCH 240/309] fix delete column copy --- src/components/ColumnMenu/ColumnMenu.tsx | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/components/ColumnMenu/ColumnMenu.tsx b/src/components/ColumnMenu/ColumnMenu.tsx index 4ba8400b..09c17e23 100644 --- a/src/components/ColumnMenu/ColumnMenu.tsx +++ b/src/components/ColumnMenu/ColumnMenu.tsx @@ -421,18 +421,21 @@ export default function ColumnMenu() { {referencedColumns.length ? ( - This column will be removed as a dependency of the following columns:{" "} - + This column will be removed as a dependency of the + following columns:{" "} + {referencedColumns.join(", ")} ) : null} {referencedExtensions.length ? ( - This column will be removed as a dependency from the following Extensions:{" "} - + This column will be removed as a dependency from the + following Extensions:{" "} + {referencedExtensions.join(", ")} + ) : null} You need to re-deploy this table’s cloud function. From 73af4d768bd9786625143f5250d8e358cf39343a Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Wed, 9 Nov 2022 15:15:58 +1100 Subject: [PATCH 241/309] separate TablePage into its own chunk --- src/pages/Table/ProvidedSubTablePage.tsx | 6 ++++-- src/pages/Table/ProvidedTablePage.tsx | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/pages/Table/ProvidedSubTablePage.tsx b/src/pages/Table/ProvidedSubTablePage.tsx index 2b3e090b..58380d27 100644 --- a/src/pages/Table/ProvidedSubTablePage.tsx +++ b/src/pages/Table/ProvidedSubTablePage.tsx @@ -1,4 +1,4 @@ -import { Suspense, useMemo } from "react"; +import { lazy, Suspense, useMemo } from "react"; import { useAtom, Provider } from "jotai"; import { selectAtom } from "jotai/utils"; import { DebugAtoms } from "@src/atoms/utils"; @@ -10,7 +10,6 @@ import Modal from "@src/components/Modal"; import BreadcrumbsSubTable from "@src/components/Table/BreadcrumbsSubTable"; import ErrorFallback from "@src/components/ErrorFallback"; import TableSourceFirestore from "@src/sources/TableSourceFirestore"; -import TablePage from "./TablePage"; import TableToolbarSkeleton from "@src/components/TableToolbar/TableToolbarSkeleton"; import TableSkeleton from "@src/components/Table/TableSkeleton"; @@ -25,6 +24,9 @@ import { ROUTES } from "@src/constants/routes"; import { TOP_BAR_HEIGHT } from "@src/layouts/Navigation/TopBar"; import { TABLE_TOOLBAR_HEIGHT } from "@src/components/TableToolbar"; +// prettier-ignore +const TablePage = lazy(() => import("./TablePage" /* webpackChunkName: "TablePage" */)); + /** * Wraps `TablePage` with the data for a top-level table. */ diff --git a/src/pages/Table/ProvidedTablePage.tsx b/src/pages/Table/ProvidedTablePage.tsx index d2e5cb17..ab2b7614 100644 --- a/src/pages/Table/ProvidedTablePage.tsx +++ b/src/pages/Table/ProvidedTablePage.tsx @@ -1,4 +1,4 @@ -import { Suspense } from "react"; +import { lazy, Suspense } from "react"; import { useAtom, Provider } from "jotai"; import { DebugAtoms } from "@src/atoms/utils"; import { useParams, useOutlet } from "react-router-dom"; @@ -9,7 +9,6 @@ import ErrorFallback, { ERROR_TABLE_NOT_FOUND, } from "@src/components/ErrorFallback"; import TableSourceFirestore from "@src/sources/TableSourceFirestore"; -import TablePage from "./TablePage"; import TableToolbarSkeleton from "@src/components/TableToolbar/TableToolbarSkeleton"; import TableSkeleton from "@src/components/Table/TableSkeleton"; @@ -28,6 +27,9 @@ import { import { SyncAtomValue } from "@src/atoms/utils"; import useDocumentTitle from "@src/hooks/useDocumentTitle"; +// prettier-ignore +const TablePage = lazy(() => import("./TablePage" /* webpackChunkName: "TablePage" */)); + /** * Wraps `TablePage` with the data for a top-level table. * `SubTablePage` is inserted in the outlet, alongside `TablePage`. From 2dc2bdb6bc8ea4ee93a9aa9e8ee33791ed8f1d57 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Wed, 9 Nov 2022 15:59:27 +1100 Subject: [PATCH 242/309] Multiselect field: add back convert to array --- src/components/Table/withTableCell.tsx | 1 + .../MultiSelect/ConvertStringToArray.tsx | 29 ------------------- .../fields/MultiSelect/DisplayCell.tsx | 29 ++++++++++++------- .../fields/MultiSelect/PopoverCell.tsx | 20 +++++++++++++ .../fields/MultiSelect/SideDrawerField.tsx | 25 ++++++++++++++-- 5 files changed, 62 insertions(+), 42 deletions(-) delete mode 100644 src/components/fields/MultiSelect/ConvertStringToArray.tsx diff --git a/src/components/Table/withTableCell.tsx b/src/components/Table/withTableCell.tsx index 3021fe40..88aa7e68 100644 --- a/src/components/Table/withTableCell.tsx +++ b/src/components/Table/withTableCell.tsx @@ -164,6 +164,7 @@ export default function withTableCell( onClick={(e) => e.stopPropagation()} onDoubleClick={(e) => e.stopPropagation()} onKeyDown={(e) => e.stopPropagation()} + onContextMenu={(e) => e.stopPropagation()} > {editorCell} diff --git a/src/components/fields/MultiSelect/ConvertStringToArray.tsx b/src/components/fields/MultiSelect/ConvertStringToArray.tsx deleted file mode 100644 index 9d3f3ce0..00000000 --- a/src/components/fields/MultiSelect/ConvertStringToArray.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { IPopoverInlineCellProps } from "@src/components/fields/types"; -import { Grid, Tooltip, Button } from "@mui/material"; - -export const ConvertStringToArray = ({ - value, - onSubmit, -}: Pick) => ( - - - {value} - - - - - - - -); diff --git a/src/components/fields/MultiSelect/DisplayCell.tsx b/src/components/fields/MultiSelect/DisplayCell.tsx index 94a07938..9cb58369 100644 --- a/src/components/fields/MultiSelect/DisplayCell.tsx +++ b/src/components/fields/MultiSelect/DisplayCell.tsx @@ -1,6 +1,7 @@ import { IDisplayCellProps } from "@src/components/fields/types"; import { ButtonBase, Grid } from "@mui/material"; +import WarningIcon from "@mui/icons-material/WarningAmber"; import { ChevronDown } from "@src/assets/icons"; import { sanitiseValue } from "./utils"; @@ -29,16 +30,24 @@ export default function MultiSelect({ justifyContent: "flex-start", }} > - - {sanitiseValue(value).map( - (item) => - typeof item === "string" && ( - - - - ) - )} - + {typeof value === "string" && value !== "" ? ( +
    + +   + {value} +
    + ) : ( + + {sanitiseValue(value).map( + (item) => + typeof item === "string" && ( + + + + ) + )} + + )} {!disabled && } diff --git a/src/components/fields/MultiSelect/PopoverCell.tsx b/src/components/fields/MultiSelect/PopoverCell.tsx index 0f35e52d..8ef894cf 100644 --- a/src/components/fields/MultiSelect/PopoverCell.tsx +++ b/src/components/fields/MultiSelect/PopoverCell.tsx @@ -1,6 +1,9 @@ import { IEditorCellProps } from "@src/components/fields/types"; +import { Typography, Button } from "@mui/material"; +import WarningIcon from "@mui/icons-material/WarningAmber"; import MultiSelectComponent from "@rowy/multiselect"; +import EmptyState from "@src/components/EmptyState"; import { sanitiseValue } from "./utils"; @@ -14,6 +17,23 @@ export default function MultiSelect({ }: IEditorCellProps) { const config = column.config ?? {}; + if (typeof value === "string" && value !== "") + return ( + + This cell’s value is a string + + + } + sx={{ my: 3, width: column.width }} + /> + ); + return ( ; + return ( + + + +  {value} + + + + + + ); return ( <> From 387c2db2bcf5e7fe9685a0bf35cfea5e2489d053 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Wed, 9 Nov 2022 15:59:46 +1100 Subject: [PATCH 243/309] fix final/actions column for read-only users --- .../Table/FinalColumn/FinalColumnHeader.tsx | 32 +++++++++++++++++-- src/components/Table/Styled/StyledRow.tsx | 3 +- src/components/Table/Table.tsx | 1 + 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/components/Table/FinalColumn/FinalColumnHeader.tsx b/src/components/Table/FinalColumn/FinalColumnHeader.tsx index 0a949885..416cab5c 100644 --- a/src/components/Table/FinalColumn/FinalColumnHeader.tsx +++ b/src/components/Table/FinalColumn/FinalColumnHeader.tsx @@ -9,16 +9,44 @@ import { spreadSx } from "@src/utils/ui"; export interface IFinalColumnHeaderProps extends Partial { focusInsideCell: boolean; + canAddColumn: boolean; } export default function FinalColumnHeader({ focusInsideCell, + canAddColumn, ...props }: IFinalColumnHeaderProps) { const [userRoles] = useAtom(userRolesAtom, projectScope); const openColumnModal = useSetAtom(columnModalAtom, tableScope); - if (!userRoles.includes("ADMIN")) return null; + if (!userRoles.includes("ADMIN")) + return ( + `1px solid ${theme.palette.divider}`, + borderLeft: "none", + borderTopRightRadius: (theme) => theme.shape.borderRadius, + borderBottomRightRadius: (theme) => theme.shape.borderRadius, + + display: "flex", + alignItems: "center", + + width: 32 * 3 + 4 * 2 + 10 * 2, + px: 1.5, + color: "text.secondary", + }, + ...spreadSx(props.sx), + ]} + className="column-header" + > + Actions + + ); return ( ({ flexShrink: 0, borderRadius: theme.shape.borderRadius, padding: (32 - 20) / 2, - boxSizing: "content-box", + width: 32, + height: 32, "&.end": { marginRight: theme.spacing(0.5) }, }, diff --git a/src/components/Table/Table.tsx b/src/components/Table/Table.tsx index a3d60147..f7d72c76 100644 --- a/src/components/Table/Table.tsx +++ b/src/components/Table/Table.tsx @@ -283,6 +283,7 @@ export default function Table({ aria-colindex={header.index + 1} aria-readonly={!canEditColumn} aria-selected={isSelectedCell} + canAddColumn={canAddColumn} /> ); From 5678f96c2b8cc86d728eed4469d61ac906924aea Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Wed, 9 Nov 2022 17:07:22 +1100 Subject: [PATCH 244/309] migrate field types based on TextEditor --- src/components/Table/EditorCellTextField.tsx | 77 +++++++++++ src/components/Table/Styled/StyledCell.tsx | 3 + src/components/Table/Table.tsx | 11 +- src/components/Table/editors/TextEditor.tsx | 122 ------------------ src/components/Table/withTableCell.tsx | 7 +- src/components/fields/Email/EditorCell.tsx | 6 + src/components/fields/Email/index.tsx | 9 +- .../Id/{TableCell.tsx => DisplayCell.tsx} | 4 +- src/components/fields/Id/index.tsx | 17 +-- .../{BasicCell.tsx => DisplayCell.tsx} | 7 +- src/components/fields/LongText/EditorCell.tsx | 6 + src/components/fields/LongText/index.tsx | 17 +-- src/components/fields/Number/BasicCell.tsx | 5 - src/components/fields/Number/DisplayCell.tsx | 5 + src/components/fields/Number/EditorCell.tsx | 12 ++ src/components/fields/Number/index.tsx | 9 +- .../fields/Percentage/BasicCell.tsx | 23 ---- .../{TableCell.tsx => DisplayCell.tsx} | 4 +- .../fields/Percentage/EditorCell.tsx | 13 ++ src/components/fields/Percentage/index.tsx | 16 +-- src/components/fields/Phone/EditorCell.tsx | 6 + src/components/fields/Phone/index.tsx | 9 +- .../{BasicCell.tsx => DisplayCell.tsx} | 7 +- .../fields/Reference/EditorCell.tsx | 111 ++++------------ src/components/fields/Reference/index.tsx | 18 +-- .../fields/ShortText/EditorCell.tsx | 61 +-------- .../Url/{TableCell.tsx => DisplayCell.tsx} | 7 +- src/components/fields/Url/EditorCell.tsx | 6 + src/components/fields/Url/index.tsx | 11 +- 29 files changed, 223 insertions(+), 386 deletions(-) create mode 100644 src/components/Table/EditorCellTextField.tsx delete mode 100644 src/components/Table/editors/TextEditor.tsx create mode 100644 src/components/fields/Email/EditorCell.tsx rename src/components/fields/Id/{TableCell.tsx => DisplayCell.tsx} (69%) rename src/components/fields/LongText/{BasicCell.tsx => DisplayCell.tsx} (58%) create mode 100644 src/components/fields/LongText/EditorCell.tsx delete mode 100644 src/components/fields/Number/BasicCell.tsx create mode 100644 src/components/fields/Number/DisplayCell.tsx create mode 100644 src/components/fields/Number/EditorCell.tsx delete mode 100644 src/components/fields/Percentage/BasicCell.tsx rename src/components/fields/Percentage/{TableCell.tsx => DisplayCell.tsx} (85%) create mode 100644 src/components/fields/Percentage/EditorCell.tsx create mode 100644 src/components/fields/Phone/EditorCell.tsx rename src/components/fields/Reference/{BasicCell.tsx => DisplayCell.tsx} (81%) rename src/components/fields/Url/{TableCell.tsx => DisplayCell.tsx} (77%) create mode 100644 src/components/fields/Url/EditorCell.tsx diff --git a/src/components/Table/EditorCellTextField.tsx b/src/components/Table/EditorCellTextField.tsx new file mode 100644 index 00000000..ee0fd9f3 --- /dev/null +++ b/src/components/Table/EditorCellTextField.tsx @@ -0,0 +1,77 @@ +import type { IEditorCellProps } from "@src/components/fields/types"; +import { useSaveOnUnmount } from "@src/hooks/useSaveOnUnmount"; + +import { InputBase, InputBaseProps } from "@mui/material"; + +import { spreadSx } from "@src/utils/ui"; + +export interface IEditorCellTextFieldProps extends IEditorCellProps { + InputProps?: Partial; +} + +export default function EditorCellTextField({ + column, + value, + onSubmit, + setFocusInsideCell, + InputProps = {}, +}: IEditorCellTextFieldProps) { + const [localValue, setLocalValue] = useSaveOnUnmount(value, onSubmit); + const maxLength = column.config?.maxLength; + + return ( + setLocalValue(e.target.value)} + fullWidth + autoFocus + onKeyDown={(e) => { + if ( + e.key === "ArrowLeft" || + e.key === "ArrowRight" || + e.key === "ArrowUp" || + e.key === "ArrowDown" + ) { + e.stopPropagation(); + } + if (e.key === "Escape") { + // Escape removes focus inside cell, this runs before save on unmount + setLocalValue(value); + } + if (e.key === "Enter" && !e.shiftKey) { + // Removes focus from inside cell, triggering save on unmount + setFocusInsideCell(false); + } + }} + onClick={(e) => e.stopPropagation()} + onDoubleClick={(e) => e.stopPropagation()} + {...InputProps} + inputProps={{ maxLength, ...InputProps.inputProps }} + sx={[ + { + width: "100%", + height: "calc(100% - 1px)", + marginTop: "1px", + paddingBottom: "1px", + + backgroundColor: "var(--cell-background-color)", + outline: "inherit", + outlineOffset: "inherit", + + font: "inherit", // Prevent text jumping + letterSpacing: "inherit", // Prevent text jumping + + "& .MuiInputBase-input": { p: "var(--cell-padding)" }, + + "& textarea.MuiInputBase-input": { + lineHeight: (theme) => theme.typography.body2.lineHeight, + maxHeight: "100%", + boxSizing: "border-box", + py: 3 / 8, + }, + }, + ...spreadSx(InputProps.sx), + ]} + /> + ); +} diff --git a/src/components/Table/Styled/StyledCell.tsx b/src/components/Table/Styled/StyledCell.tsx index 23ffb2ef..c11fee62 100644 --- a/src/components/Table/Styled/StyledCell.tsx +++ b/src/components/Table/Styled/StyledCell.tsx @@ -14,6 +14,9 @@ export const StyledCell = styled("div")(({ theme }) => ({ height: "100%", contain: "strict", overflow: "hidden", + + display: "flex", + alignItems: "center", }, backgroundColor: "var(--cell-background-color)", diff --git a/src/components/Table/Table.tsx b/src/components/Table/Table.tsx index f7d72c76..f8ca9486 100644 --- a/src/components/Table/Table.tsx +++ b/src/components/Table/Table.tsx @@ -446,7 +446,11 @@ export default function Table({ cell.column.columnDef.meta?.config?.required )} aria-selected={isSelectedCell} - aria-describedby="rowy-table-cell-description" + aria-describedby={ + canEditCell + ? "rowy-table-editable-cell-description" + : undefined + } style={{ width: cell.column.getSize(), height: tableSchema.rowHeight, @@ -537,7 +541,10 @@ export default function Table({ -
    +
    Press Enter to edit.
    diff --git a/src/components/Table/editors/TextEditor.tsx b/src/components/Table/editors/TextEditor.tsx deleted file mode 100644 index 58229457..00000000 --- a/src/components/Table/editors/TextEditor.tsx +++ /dev/null @@ -1,122 +0,0 @@ -import { useRef, useLayoutEffect } from "react"; -import { EditorProps } from "react-data-grid"; -import { useSetAtom } from "jotai"; -import { get } from "lodash-es"; - -import { TextField } from "@mui/material"; - -import { tableScope, updateFieldAtom } from "@src/atoms/tableScope"; -import { FieldType } from "@src/constants/fields"; -import { getFieldType } from "@src/components/fields"; - -/** WARNING: THIS DOES NOT WORK IN REACT 18 STRICT MODE */ -export default function TextEditor({ row, column }: EditorProps) { - const updateField = useSetAtom(updateFieldAtom, tableScope); - - const type = getFieldType(column as any); - - const cellValue = get(row, column.key); - const defaultValue = - type === FieldType.percentage && typeof cellValue === "number" - ? cellValue * 100 - : cellValue; - - const inputRef = useRef(null); - - // WARNING: THIS DOES NOT WORK IN REACT 18 STRICT MODE - useLayoutEffect(() => { - const inputElement = inputRef.current; - return () => { - const newValue = inputElement?.value; - let formattedValue: any = newValue; - if (newValue !== undefined) { - if (type === FieldType.number) { - formattedValue = Number(newValue); - } else if (type === FieldType.percentage) { - formattedValue = Number(newValue) / 100; - } - - updateField({ - path: row._rowy_ref.path, - fieldName: column.key, - value: formattedValue, - }); - } - }; - }, [column.key, row._rowy_ref.path, type, updateField]); - - let inputType = "text"; - switch (type) { - case FieldType.email: - inputType = "email"; - break; - case FieldType.phone: - inputType = "tel"; - break; - case FieldType.url: - inputType = "url"; - break; - case FieldType.number: - case FieldType.percentage: - inputType = "number"; - break; - - default: - break; - } - - const { maxLength } = (column as any).config; - - return ( - theme.typography.body2.lineHeight, - maxHeight: "100%", - boxSizing: "border-box", - py: 3 / 8, - }, - }} - InputProps={{ - endAdornment: - (column as any).type === FieldType.percentage ? "%" : undefined, - }} - autoFocus - onKeyDown={(e) => { - if (e.key === "ArrowLeft" || e.key === "ArrowRight") { - e.stopPropagation(); - } - - if (e.key === "Escape") { - (e.target as any).value = defaultValue; - } - }} - /> - ); -} diff --git a/src/components/Table/withTableCell.tsx b/src/components/Table/withTableCell.tsx index 88aa7e68..5e0b5478 100644 --- a/src/components/Table/withTableCell.tsx +++ b/src/components/Table/withTableCell.tsx @@ -36,7 +36,7 @@ export interface ICellOptions { */ export default function withTableCell( DisplayCellComponent: React.ComponentType, - EditorCellComponent: React.ComponentType, + EditorCellComponent: React.ComponentType | null, editorMode: "focus" | "inline" | "popover" = "focus", options: ICellOptions = {} ) { @@ -115,13 +115,16 @@ export default function withTableCell( }); }; - const editorCell = ( + // Show displayCell as a fallback if intentionally null + const editorCell = EditorCellComponent ? ( + ) : ( + displayCell ); if (editorMode === "focus" && focusInsideCell) { diff --git a/src/components/fields/Email/EditorCell.tsx b/src/components/fields/Email/EditorCell.tsx new file mode 100644 index 00000000..c14a114a --- /dev/null +++ b/src/components/fields/Email/EditorCell.tsx @@ -0,0 +1,6 @@ +import type { IEditorCellProps } from "@src/components/fields/types"; +import EditorCellTextField from "@src/components/Table/EditorCellTextField"; + +export default function Email(props: IEditorCellProps) { + return ; +} diff --git a/src/components/fields/Email/index.tsx b/src/components/fields/Email/index.tsx index 87b3a07a..d8a461ac 100644 --- a/src/components/fields/Email/index.tsx +++ b/src/components/fields/Email/index.tsx @@ -1,10 +1,10 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withBasicCell from "@src/components/fields/_withTableCell/withBasicCell"; +import withTableCell from "@src/components/Table/withTableCell"; import EmailIcon from "@mui/icons-material/MailOutlined"; -import BasicCell from "@src/components/fields/_BasicCell/BasicCellValue"; -import TextEditor from "@src/components/Table/editors/TextEditor"; +import DisplayCell from "@src/components/fields/_BasicCell/BasicCellValue"; +import EditorCell from "./EditorCell"; import { filterOperators } from "@src/components/fields/ShortText/Filter"; import BasicContextMenuActions from "@src/components/fields/_BasicCell/BasicCellContextMenuActions"; @@ -23,8 +23,7 @@ export const config: IFieldConfig = { icon: , description: "Email address. Not validated.", contextMenuActions: BasicContextMenuActions, - TableCell: withBasicCell(BasicCell), - TableEditor: TextEditor, + TableCell: withTableCell(DisplayCell, EditorCell), SideDrawerField, filter: { operators: filterOperators, diff --git a/src/components/fields/Id/TableCell.tsx b/src/components/fields/Id/DisplayCell.tsx similarity index 69% rename from src/components/fields/Id/TableCell.tsx rename to src/components/fields/Id/DisplayCell.tsx index 2ff1feff..fe86e927 100644 --- a/src/components/fields/Id/TableCell.tsx +++ b/src/components/fields/Id/DisplayCell.tsx @@ -1,8 +1,8 @@ -import { IHeavyCellProps } from "@src/components/fields/types"; +import { IDisplayCellProps } from "@src/components/fields/types"; import { useTheme } from "@mui/material"; -export default function Id({ docRef }: IHeavyCellProps) { +export default function Id({ docRef }: IDisplayCellProps) { const theme = useTheme(); return ( diff --git a/src/components/fields/Id/index.tsx b/src/components/fields/Id/index.tsx index c6222990..757ed231 100644 --- a/src/components/fields/Id/index.tsx +++ b/src/components/fields/Id/index.tsx @@ -1,17 +1,9 @@ -import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withHeavyCell from "@src/components/fields/_withTableCell/withHeavyCell"; +import withTableCell from "@src/components/Table/withTableCell"; +import DisplayCell from "./DisplayCell"; +import SideDrawerField from "./SideDrawerField"; import { Id as IdIcon } from "@src/assets/icons"; -import BasicCell from "@src/components/fields/_BasicCell/BasicCellValue"; -import withSideDrawerEditor from "@src/components/Table/editors/withSideDrawerEditor"; - -const TableCell = lazy( - () => import("./TableCell" /* webpackChunkName: "TableCell-Id" */) -); -const SideDrawerField = lazy( - () => import("./SideDrawerField" /* webpackChunkName: "SideDrawerField-Id" */) -); export const config: IFieldConfig = { type: FieldType.id, @@ -21,8 +13,7 @@ export const config: IFieldConfig = { initialValue: "", icon: , description: "Displays the row’s ID. Read-only. Cannot be sorted.", - TableCell: withHeavyCell(BasicCell, TableCell), - TableEditor: withSideDrawerEditor(TableCell), + TableCell: withTableCell(DisplayCell, null), SideDrawerField, }; export default config; diff --git a/src/components/fields/LongText/BasicCell.tsx b/src/components/fields/LongText/DisplayCell.tsx similarity index 58% rename from src/components/fields/LongText/BasicCell.tsx rename to src/components/fields/LongText/DisplayCell.tsx index 14c6e23e..1e8e0fc2 100644 --- a/src/components/fields/LongText/BasicCell.tsx +++ b/src/components/fields/LongText/DisplayCell.tsx @@ -1,16 +1,15 @@ -import { IBasicCellProps } from "@src/components/fields/types"; +import { IDisplayCellProps } from "@src/components/fields/types"; import { useTheme } from "@mui/material"; -export default function LongText({ value }: IBasicCellProps) { +export default function LongText({ value }: IDisplayCellProps) { const theme = useTheme(); return (
    ) { + return ; +} diff --git a/src/components/fields/LongText/index.tsx b/src/components/fields/LongText/index.tsx index c4cec831..ef0ce27c 100644 --- a/src/components/fields/LongText/index.tsx +++ b/src/components/fields/LongText/index.tsx @@ -1,21 +1,15 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withBasicCell from "@src/components/fields/_withTableCell/withBasicCell"; +import withTableCell from "@src/components/Table/withTableCell"; import LongTextIcon from "@mui/icons-material/Notes"; -import BasicCell from "./BasicCell"; -import TextEditor from "@src/components/Table/editors/TextEditor"; +import DisplayCell from "./DisplayCell"; +import EditorCell from "./EditorCell"; +import SideDrawerField from "./SideDrawerField"; import { filterOperators } from "./Filter"; import BasicContextMenuActions from "@src/components/fields/_BasicCell/BasicCellContextMenuActions"; -const SideDrawerField = lazy( - () => - import( - "./SideDrawerField" /* webpackChunkName: "SideDrawerField-LongText" */ - ) -); - const Settings = lazy( () => import("./Settings" /* webpackChunkName: "Settings-LongText" */) ); @@ -30,8 +24,7 @@ export const config: IFieldConfig = { icon: , description: "Text displayed on multiple lines.", contextMenuActions: BasicContextMenuActions, - TableCell: withBasicCell(BasicCell), - TableEditor: TextEditor, + TableCell: withTableCell(DisplayCell, EditorCell), SideDrawerField, settings: Settings, filter: { diff --git a/src/components/fields/Number/BasicCell.tsx b/src/components/fields/Number/BasicCell.tsx deleted file mode 100644 index 71d6be89..00000000 --- a/src/components/fields/Number/BasicCell.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { IBasicCellProps } from "@src/components/fields/types"; - -export default function Number_({ value }: IBasicCellProps) { - return <>{`${value ?? ""}`}; -} diff --git a/src/components/fields/Number/DisplayCell.tsx b/src/components/fields/Number/DisplayCell.tsx new file mode 100644 index 00000000..5256a741 --- /dev/null +++ b/src/components/fields/Number/DisplayCell.tsx @@ -0,0 +1,5 @@ +import { IDisplayCellProps } from "@src/components/fields/types"; + +export default function Number_({ value }: IDisplayCellProps) { + return <>{`${value ?? ""}`}; +} diff --git a/src/components/fields/Number/EditorCell.tsx b/src/components/fields/Number/EditorCell.tsx new file mode 100644 index 00000000..93c5c31c --- /dev/null +++ b/src/components/fields/Number/EditorCell.tsx @@ -0,0 +1,12 @@ +import type { IEditorCellProps } from "@src/components/fields/types"; +import EditorCellTextField from "@src/components/Table/EditorCellTextField"; + +export default function Number_(props: IEditorCellProps) { + return ( + props.onSubmit(Number(v))} + /> + ); +} diff --git a/src/components/fields/Number/index.tsx b/src/components/fields/Number/index.tsx index a7fdc94c..7bed8e43 100644 --- a/src/components/fields/Number/index.tsx +++ b/src/components/fields/Number/index.tsx @@ -1,10 +1,10 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withBasicCell from "@src/components/fields/_withTableCell/withBasicCell"; +import withTableCell from "@src/components/Table/withTableCell"; import { Number as NumberIcon } from "@src/assets/icons"; -import BasicCell from "./BasicCell"; -import TextEditor from "@src/components/Table/editors/TextEditor"; +import DisplayCell from "./DisplayCell"; +import EditorCell from "./EditorCell"; import { filterOperators } from "./Filter"; import BasicContextMenuActions from "@src/components/fields/_BasicCell/BasicCellContextMenuActions"; const SideDrawerField = lazy( @@ -22,8 +22,7 @@ export const config: IFieldConfig = { icon: , description: "Numeric value.", contextMenuActions: BasicContextMenuActions, - TableCell: withBasicCell(BasicCell), - TableEditor: TextEditor, + TableCell: withTableCell(DisplayCell, EditorCell), SideDrawerField, filter: { operators: filterOperators, diff --git a/src/components/fields/Percentage/BasicCell.tsx b/src/components/fields/Percentage/BasicCell.tsx deleted file mode 100644 index 5f6228aa..00000000 --- a/src/components/fields/Percentage/BasicCell.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { IBasicCellProps } from "@src/components/fields/types"; - -import { useTheme } from "@mui/material"; - -export default function Percentage({ value }: IBasicCellProps) { - const theme = useTheme(); - - if (value === null || value === undefined) return null; - - const percentage = typeof value === "number" ? value : 0; - return ( -
    - {Math.round(percentage * 100)}% -
    - ); -} diff --git a/src/components/fields/Percentage/TableCell.tsx b/src/components/fields/Percentage/DisplayCell.tsx similarity index 85% rename from src/components/fields/Percentage/TableCell.tsx rename to src/components/fields/Percentage/DisplayCell.tsx index 29174a39..532103e4 100644 --- a/src/components/fields/Percentage/TableCell.tsx +++ b/src/components/fields/Percentage/DisplayCell.tsx @@ -1,9 +1,9 @@ -import { IHeavyCellProps } from "@src/components/fields/types"; +import { IDisplayCellProps } from "@src/components/fields/types"; import { useTheme } from "@mui/material"; import { resultColorsScale } from "@src/utils/color"; -export default function Percentage({ column, value }: IHeavyCellProps) { +export default function Percentage({ column, value }: IDisplayCellProps) { const theme = useTheme(); const { colors } = (column as any).config; diff --git a/src/components/fields/Percentage/EditorCell.tsx b/src/components/fields/Percentage/EditorCell.tsx new file mode 100644 index 00000000..652cdcd0 --- /dev/null +++ b/src/components/fields/Percentage/EditorCell.tsx @@ -0,0 +1,13 @@ +import type { IEditorCellProps } from "@src/components/fields/types"; +import EditorCellTextField from "@src/components/Table/EditorCellTextField"; + +export default function Percentage(props: IEditorCellProps) { + return ( + props.onSubmit(Number(v) / 100)} + /> + ); +} diff --git a/src/components/fields/Percentage/index.tsx b/src/components/fields/Percentage/index.tsx index f353774f..99239f7c 100644 --- a/src/components/fields/Percentage/index.tsx +++ b/src/components/fields/Percentage/index.tsx @@ -1,20 +1,13 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withHeavyCell from "@src/components/fields/_withTableCell/withHeavyCell"; +import withTableCell from "@src/components/Table/withTableCell"; import { Percentage as PercentageIcon } from "@src/assets/icons"; -import TextEditor from "@src/components/Table/editors/TextEditor"; +import DisplayCell from "./DisplayCell"; +import EditorCell from "./EditorCell"; import { filterOperators } from "@src/components/fields/Number/Filter"; import BasicContextMenuActions from "@src/components/fields/_BasicCell/BasicCellContextMenuActions"; -const BasicCell = lazy( - () => import("./BasicCell" /* webpackChunkName: "BasicCell-Percentage" */) -); - -const TableCell = lazy( - () => import("./TableCell" /* webpackChunkName: "TableCell-Percentage" */) -); - const SideDrawerField = lazy( () => import( @@ -37,8 +30,7 @@ export const config: IFieldConfig = { requireConfiguration: true, description: "Percentage stored as a number between 0 and 1.", contextMenuActions: BasicContextMenuActions, - TableCell: withHeavyCell(BasicCell, TableCell), - TableEditor: TextEditor, + TableCell: withTableCell(DisplayCell, EditorCell), SideDrawerField, settings: Settings, filter: { diff --git a/src/components/fields/Phone/EditorCell.tsx b/src/components/fields/Phone/EditorCell.tsx new file mode 100644 index 00000000..825fd00f --- /dev/null +++ b/src/components/fields/Phone/EditorCell.tsx @@ -0,0 +1,6 @@ +import type { IEditorCellProps } from "@src/components/fields/types"; +import EditorCellTextField from "@src/components/Table/EditorCellTextField"; + +export default function Phone(props: IEditorCellProps) { + return ; +} diff --git a/src/components/fields/Phone/index.tsx b/src/components/fields/Phone/index.tsx index 96115973..9e5c1ebe 100644 --- a/src/components/fields/Phone/index.tsx +++ b/src/components/fields/Phone/index.tsx @@ -1,10 +1,10 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withBasicCell from "@src/components/fields/_withTableCell/withBasicCell"; +import withTableCell from "@src/components/Table/withTableCell"; import PhoneIcon from "@mui/icons-material/PhoneOutlined"; -import BasicCell from "@src/components/fields/_BasicCell/BasicCellValue"; -import TextEditor from "@src/components/Table/editors/TextEditor"; +import DisplayCell from "@src/components/fields/_BasicCell/BasicCellValue"; +import EditorCell from "./EditorCell"; import { filterOperators } from "@src/components/fields/ShortText/Filter"; import BasicContextMenuActions from "@src/components/fields/_BasicCell/BasicCellContextMenuActions"; @@ -23,8 +23,7 @@ export const config: IFieldConfig = { icon: , description: "Phone number stored as text. Not validated.", contextMenuActions: BasicContextMenuActions, - TableCell: withBasicCell(BasicCell), - TableEditor: TextEditor, + TableCell: withTableCell(DisplayCell, EditorCell), SideDrawerField, filter: { operators: filterOperators, diff --git a/src/components/fields/Reference/BasicCell.tsx b/src/components/fields/Reference/DisplayCell.tsx similarity index 81% rename from src/components/fields/Reference/BasicCell.tsx rename to src/components/fields/Reference/DisplayCell.tsx index b75b62d2..a15d9db4 100644 --- a/src/components/fields/Reference/BasicCell.tsx +++ b/src/components/fields/Reference/DisplayCell.tsx @@ -1,12 +1,12 @@ import { useAtom } from "jotai"; -import { IBasicCellProps } from "@src/components/fields/types"; +import { IDisplayCellProps } from "@src/components/fields/types"; import { Stack, IconButton } from "@mui/material"; import LaunchIcon from "@mui/icons-material/Launch"; import { projectScope, projectIdAtom } from "@src/atoms/projectScope"; -export default function Reference({ value }: IBasicCellProps) { +export default function Reference({ value }: IDisplayCellProps) { const [projectId] = useAtom(projectIdAtom, projectScope); const path = value?.path ?? ""; @@ -17,8 +17,7 @@ export default function Reference({ value }: IBasicCellProps) { direction="row" alignItems="center" justifyContent="space-between" - className="cell-collapse-padding" - sx={{ p: "var(--cell-padding)", pr: 0.5 }} + sx={{ p: "var(--cell-padding)", pr: 0.5, width: "100%" }} >
    {path}
    diff --git a/src/components/fields/Reference/EditorCell.tsx b/src/components/fields/Reference/EditorCell.tsx index 8b96b8b3..770f352c 100644 --- a/src/components/fields/Reference/EditorCell.tsx +++ b/src/components/fields/Reference/EditorCell.tsx @@ -1,100 +1,33 @@ -import { useRef, useLayoutEffect } from "react"; -import { useAtom, useSetAtom } from "jotai"; -import { EditorProps } from "react-data-grid"; -import { get } from "lodash-es"; -import { useSnackbar } from "notistack"; +import type { IEditorCellProps } from "@src/components/fields/types"; +import EditorCellTextField from "@src/components/Table/EditorCellTextField"; -import { TextField } from "@mui/material"; +import { useAtom } from "jotai"; +import { doc, deleteField } from "firebase/firestore"; +import { useSnackbar } from "notistack"; import { projectScope } from "@src/atoms/projectScope"; import { firebaseDbAtom } from "@src/sources/ProjectSourceFirebase"; -import { tableScope, updateFieldAtom } from "@src/atoms/tableScope"; -import { doc, deleteField } from "firebase/firestore"; -/** WARNING: THIS DOES NOT WORK IN REACT 18 STRICT MODE */ -export default function TextEditor({ row, column }: EditorProps) { - const [firebaseDb] = useAtom(firebaseDbAtom, projectScope); - const updateField = useSetAtom(updateFieldAtom, tableScope); +export default function Reference( + props: IEditorCellProps> +) { const { enqueueSnackbar } = useSnackbar(); - - const inputRef = useRef(null); - - // WARNING: THIS DOES NOT WORK IN REACT 18 STRICT MODE - useLayoutEffect(() => { - const inputElement = inputRef.current; - return () => { - const newValue = inputElement?.value; - if (newValue !== undefined && newValue !== "") { - try { - const refValue = doc(firebaseDb, newValue); - - updateField({ - path: row._rowy_ref.path, - fieldName: column.key, - value: refValue, - }); - } catch (e: any) { - enqueueSnackbar(`Invalid path: ${e.message}`, { variant: "error" }); - } - } else { - updateField({ - path: row._rowy_ref.path, - fieldName: column.key, - value: deleteField(), - }); - } - }; - }, [column.key, row._rowy_ref.path, updateField]); - - const defaultValue = get(row, column.key)?.path ?? ""; - const { maxLength } = (column as any).config; + const [firebaseDb] = useAtom(firebaseDbAtom, projectScope); return ( - theme.typography.body2.lineHeight, - maxHeight: "100%", - boxSizing: "border-box", - py: 3 / 8, - }, - }} - // InputProps={{ - // endAdornment: - // (column as any).type === FieldType.percentage ? "%" : undefined, - // }} - autoFocus - onKeyDown={(e) => { - if (e.key === "ArrowLeft" || e.key === "ArrowRight") { - e.stopPropagation(); - } - - if (e.key === "Escape") { - (e.target as any).value = defaultValue; + { + if (newValue !== undefined && newValue !== "") { + try { + const refValue = doc(firebaseDb, newValue); + props.onSubmit(refValue); + } catch (e: any) { + enqueueSnackbar(`Invalid path: ${e.message}`, { variant: "error" }); + } + } else { + props.onSubmit(deleteField() as any); } }} /> diff --git a/src/components/fields/Reference/index.tsx b/src/components/fields/Reference/index.tsx index 9d5b0f43..fcf0345d 100644 --- a/src/components/fields/Reference/index.tsx +++ b/src/components/fields/Reference/index.tsx @@ -1,24 +1,18 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; +import withTableCell from "@src/components/Table/withTableCell"; import { Reference } from "@src/assets/icons"; -//import InlineCell from "./InlineCell"; -import BasicCell from "./BasicCell"; +import DisplayCell from "./DisplayCell"; +import EditorCell from "./EditorCell"; import { filterOperators } from "@src/components/fields/ShortText/Filter"; -import withBasicCell from "@src/components/fields/_withTableCell/withBasicCell"; -const EditorCell = lazy( - () => import("./EditorCell" /* webpackChunkName: "EditorCell-Reference" */) -); const SideDrawerField = lazy( () => import( "./SideDrawerField" /* webpackChunkName: "SideDrawerField-Reference" */ ) ); -// const Settings = lazy( -// () => import("./Settings" /* webpackChunkName: "Settings-Reference" */) -// ); export const config: IFieldConfig = { type: FieldType.reference, @@ -29,10 +23,10 @@ export const config: IFieldConfig = { initializable: true, icon: , description: "Firestore document reference", - TableCell: withBasicCell(BasicCell), - TableEditor: EditorCell, + TableCell: withTableCell(DisplayCell, EditorCell, "focus", { + disablePadding: true, + }), SideDrawerField, - //settings: Settings, filter: { operators: filterOperators }, }; export default config; diff --git a/src/components/fields/ShortText/EditorCell.tsx b/src/components/fields/ShortText/EditorCell.tsx index 418ce4dd..0e34e5a8 100644 --- a/src/components/fields/ShortText/EditorCell.tsx +++ b/src/components/fields/ShortText/EditorCell.tsx @@ -1,61 +1,6 @@ import type { IEditorCellProps } from "@src/components/fields/types"; -import { useSaveOnUnmount } from "@src/hooks/useSaveOnUnmount"; +import EditorCellTextField from "@src/components/Table/EditorCellTextField"; -import { InputBase } from "@mui/material"; - -export default function ShortText({ - column, - value, - onSubmit, - setFocusInsideCell, -}: IEditorCellProps) { - const [localValue, setLocalValue] = useSaveOnUnmount(value, onSubmit); - const maxLength = column.config?.maxLength; - - return ( - setLocalValue(e.target.value)} - fullWidth - inputProps={{ maxLength }} - sx={{ - width: "100%", - height: "calc(100% - 1px)", - marginTop: "1px", - paddingBottom: "1px", - - backgroundColor: "var(--cell-background-color)", - outline: "inherit", - outlineOffset: "inherit", - - font: "inherit", // Prevent text jumping - letterSpacing: "inherit", // Prevent text jumping - - "& .MuiInputBase-input": { p: "var(--cell-padding)" }, - - "& textarea.MuiInputBase-input": { - lineHeight: (theme) => theme.typography.body2.lineHeight, - maxHeight: "100%", - boxSizing: "border-box", - py: 3 / 8, - }, - }} - autoFocus - onKeyDown={(e) => { - if (e.key === "ArrowLeft" || e.key === "ArrowRight") { - e.stopPropagation(); - } - if (e.key === "Escape") { - // Escape removes focus inside cell, this runs before save on unmount - setLocalValue(value); - } - if (e.key === "Enter") { - // Removes focus from inside cell, triggering save on unmount - setFocusInsideCell(false); - } - }} - onClick={(e) => e.stopPropagation()} - onDoubleClick={(e) => e.stopPropagation()} - /> - ); +export default function ShortText(props: IEditorCellProps) { + return ; } diff --git a/src/components/fields/Url/TableCell.tsx b/src/components/fields/Url/DisplayCell.tsx similarity index 77% rename from src/components/fields/Url/TableCell.tsx rename to src/components/fields/Url/DisplayCell.tsx index 6c8affc3..b3145716 100644 --- a/src/components/fields/Url/TableCell.tsx +++ b/src/components/fields/Url/DisplayCell.tsx @@ -1,9 +1,9 @@ -import { IBasicCellProps } from "@src/components/fields/types"; +import { IDisplayCellProps } from "@src/components/fields/types"; import { Stack, IconButton } from "@mui/material"; import LaunchIcon from "@mui/icons-material/Launch"; -export default function Url({ value }: IBasicCellProps) { +export default function Url({ value }: IDisplayCellProps) { if (!value || typeof value !== "string") return null; const href = value.includes("http") ? value : `https://${value}`; @@ -13,8 +13,7 @@ export default function Url({ value }: IBasicCellProps) { direction="row" alignItems="center" justifyContent="space-between" - className="cell-collapse-padding" - sx={{ p: "var(--cell-padding)", pr: 0.5 }} + sx={{ p: "var(--cell-padding)", pr: 0.5, width: "100%" }} >
    {value}
    diff --git a/src/components/fields/Url/EditorCell.tsx b/src/components/fields/Url/EditorCell.tsx new file mode 100644 index 00000000..6f39d2d9 --- /dev/null +++ b/src/components/fields/Url/EditorCell.tsx @@ -0,0 +1,6 @@ +import type { IEditorCellProps } from "@src/components/fields/types"; +import EditorCellTextField from "@src/components/Table/EditorCellTextField"; + +export default function Url(props: IEditorCellProps) { + return ; +} diff --git a/src/components/fields/Url/index.tsx b/src/components/fields/Url/index.tsx index 95376b06..c6fb3fd7 100644 --- a/src/components/fields/Url/index.tsx +++ b/src/components/fields/Url/index.tsx @@ -1,10 +1,10 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withBasicCell from "@src/components/fields/_withTableCell/withBasicCell"; +import withTableCell from "@src/components/Table/withTableCell"; import UrlIcon from "@mui/icons-material/Link"; -import TableCell from "./TableCell"; -import TextEditor from "@src/components/Table/editors/TextEditor"; +import DisplayCell from "./DisplayCell"; +import EditorCell from "./EditorCell"; import { filterOperators } from "@src/components/fields/ShortText/Filter"; import BasicContextMenuActions from "@src/components/fields/_BasicCell/BasicCellContextMenuActions"; @@ -23,8 +23,9 @@ export const config: IFieldConfig = { icon: , description: "Web address. Not validated.", contextMenuActions: BasicContextMenuActions, - TableCell: withBasicCell(TableCell), - TableEditor: TextEditor, + TableCell: withTableCell(DisplayCell, EditorCell, "focus", { + disablePadding: true, + }), SideDrawerField, filter: { operators: filterOperators, From 314824fd2b559b463a19da8d78fda89125b0aa4e Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Wed, 9 Nov 2022 17:38:19 +1100 Subject: [PATCH 245/309] add tabIndex to DisplayCells --- src/components/SideDrawer/MemoizedField.tsx | 4 --- src/components/Table/withTableCell.tsx | 26 ++++++++++++++----- src/components/fields/Action/BasicCell.tsx | 5 ---- src/components/fields/Action/DisplayCell.tsx | 5 ++++ .../Action/{TableCell.tsx => EditorCell.tsx} | 9 ++++--- src/components/fields/Action/index.tsx | 14 +++++----- .../fields/MultiSelect/DisplayCell.tsx | 2 ++ .../fields/Reference/DisplayCell.tsx | 3 ++- src/components/fields/Url/DisplayCell.tsx | 3 ++- src/components/fields/types.ts | 12 +++------ 10 files changed, 47 insertions(+), 36 deletions(-) delete mode 100644 src/components/fields/Action/BasicCell.tsx create mode 100644 src/components/fields/Action/DisplayCell.tsx rename src/components/fields/Action/{TableCell.tsx => EditorCell.tsx} (81%) diff --git a/src/components/SideDrawer/MemoizedField.tsx b/src/components/SideDrawer/MemoizedField.tsx index 8333631e..835ed74e 100644 --- a/src/components/SideDrawer/MemoizedField.tsx +++ b/src/components/SideDrawer/MemoizedField.tsx @@ -78,10 +78,6 @@ export const MemoizedField = memo( }, onSubmit: handleSubmit, disabled, - // TODO: Remove - control: {} as any, - useFormMethods: {} as any, - docRef: _rowy_ref, })} ); diff --git a/src/components/Table/withTableCell.tsx b/src/components/Table/withTableCell.tsx index 5e0b5478..93d5641c 100644 --- a/src/components/Table/withTableCell.tsx +++ b/src/components/Table/withTableCell.tsx @@ -9,7 +9,11 @@ import { import { Popover, PopoverProps } from "@mui/material"; -import { tableScope, updateFieldAtom } from "@src/atoms/tableScope"; +import { + tableScope, + updateFieldAtom, + sideDrawerOpenAtom, +} from "@src/atoms/tableScope"; export interface ICellOptions { /** If the rest of the row’s data is used, set this to true for memoization */ @@ -32,12 +36,13 @@ export interface ICellOptions { * - "focus" (default) - when the cell is focused (Enter or double-click) * - "inline" - inline with deferred render * - "popover" - as a popover + * - "sideDrawer" - open the side drawer * @param options - {@link ICellOptions} */ export default function withTableCell( DisplayCellComponent: React.ComponentType, EditorCellComponent: React.ComponentType | null, - editorMode: "focus" | "inline" | "popover" = "focus", + editorMode: "focus" | "inline" | "popover" | "sideDrawer" = "focus", options: ICellOptions = {} ) { return memo( @@ -51,6 +56,7 @@ export default function withTableCell( }: TableCellProps) { const value = getValue(); const updateField = useSetAtom(updateFieldAtom, tableScope); + const setSideDrawerOpen = useSetAtom(sideDrawerOpenAtom, tableScope); // Store ref to rendered DisplayCell to get positioning for PopoverCell const displayCellRef = useRef(null); @@ -59,8 +65,11 @@ export default function withTableCell( // Store Popover open state here so we can add delay for close transition const [popoverOpen, setPopoverOpen] = useState(false); useEffect(() => { - if (focusInsideCell) setPopoverOpen(true); - }, [focusInsideCell]); + if (focusInsideCell) { + setPopoverOpen(true); + if (editorMode === "sideDrawer") setSideDrawerOpen(true); + } + }, [focusInsideCell, setSideDrawerOpen]); const showPopoverCell = (popover: boolean) => { if (popover) { setPopoverOpen(true); @@ -86,7 +95,9 @@ export default function withTableCell( row: row.original, column: column.columnDef.meta!, docRef: row.original._rowy_ref, + _rowy_ref: row.original._rowy_ref, disabled: column.columnDef.meta!.editable === false, + tabIndex: focusInsideCell ? 0 : -1, showPopoverCell, setFocusInsideCell, }; @@ -101,7 +112,11 @@ export default function withTableCell(
    ); - if (disabled || (editorMode !== "inline" && !focusInsideCell)) + if ( + disabled || + (editorMode !== "inline" && !focusInsideCell) || + editorMode === "sideDrawer" + ) return displayCell; // This is where we update the documents @@ -119,7 +134,6 @@ export default function withTableCell( const editorCell = EditorCellComponent ? ( diff --git a/src/components/fields/Action/BasicCell.tsx b/src/components/fields/Action/BasicCell.tsx deleted file mode 100644 index 76630d8f..00000000 --- a/src/components/fields/Action/BasicCell.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { IBasicCellProps } from "@src/components/fields/types"; - -export default function Action({ name, value }: IBasicCellProps) { - return <>{value ? value.status : name}; -} diff --git a/src/components/fields/Action/DisplayCell.tsx b/src/components/fields/Action/DisplayCell.tsx new file mode 100644 index 00000000..f852ce6b --- /dev/null +++ b/src/components/fields/Action/DisplayCell.tsx @@ -0,0 +1,5 @@ +import { IDisplayCellProps } from "@src/components/fields/types"; + +export default function Action({ name, value }: IDisplayCellProps) { + return <>{value ? value.status : name}; +} diff --git a/src/components/fields/Action/TableCell.tsx b/src/components/fields/Action/EditorCell.tsx similarity index 81% rename from src/components/fields/Action/TableCell.tsx rename to src/components/fields/Action/EditorCell.tsx index d762d913..e05afbc8 100644 --- a/src/components/fields/Action/TableCell.tsx +++ b/src/components/fields/Action/EditorCell.tsx @@ -1,4 +1,4 @@ -import { IHeavyCellProps } from "@src/components/fields/types"; +import { IEditorCellProps } from "@src/components/fields/types"; import { Stack } from "@mui/material"; @@ -11,15 +11,15 @@ export default function Action({ value, onSubmit, disabled, -}: IHeavyCellProps) { + tabIndex, +}: IEditorCellProps) { const hasRan = value && ![null, undefined].includes(value.status); return (
    {hasRan && isUrl(value.status) ? ( @@ -39,6 +39,7 @@ export default function Action({ onSubmit={onSubmit} value={value} disabled={disabled} + tabIndex={tabIndex} /> ); diff --git a/src/components/fields/Action/index.tsx b/src/components/fields/Action/index.tsx index 6a2b6de6..0677e7e4 100644 --- a/src/components/fields/Action/index.tsx +++ b/src/components/fields/Action/index.tsx @@ -1,13 +1,12 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withHeavyCell from "@src/components/fields/_withTableCell/withHeavyCell"; +import withTableCell from "@src/components/Table/withTableCell"; import ActionIcon from "@mui/icons-material/TouchAppOutlined"; -import BasicCell from "./BasicCell"; -import NullEditor from "@src/components/Table/editors/NullEditor"; +import DisplayCell from "./DisplayCell"; -const TableCell = lazy( - () => import("./TableCell" /* webpackChunkName: "TableCell-Action" */) +const EditorCell = lazy( + () => import("./EditorCell" /* webpackChunkName: "EditorCell-Action" */) ); const SideDrawerField = lazy( () => @@ -25,8 +24,9 @@ export const config: IFieldConfig = { icon: , description: "Button with pre-defined action script or triggers a Cloud Function. Optionally supports Undo and Redo.", - TableCell: withHeavyCell(BasicCell, TableCell), - TableEditor: NullEditor as any, + TableCell: withTableCell(DisplayCell, EditorCell, "inline", { + disablePadding: true, + }), SideDrawerField, settings: Settings, requireConfiguration: true, diff --git a/src/components/fields/MultiSelect/DisplayCell.tsx b/src/components/fields/MultiSelect/DisplayCell.tsx index 9cb58369..91bcee84 100644 --- a/src/components/fields/MultiSelect/DisplayCell.tsx +++ b/src/components/fields/MultiSelect/DisplayCell.tsx @@ -12,6 +12,7 @@ export default function MultiSelect({ value, showPopoverCell, disabled, + tabIndex, }: IDisplayCellProps) { // if (typeof value === "string" && value !== "") // return ; @@ -29,6 +30,7 @@ export default function MultiSelect({ textAlign: "inherit", justifyContent: "flex-start", }} + tabIndex={tabIndex} > {typeof value === "string" && value !== "" ? (
    diff --git a/src/components/fields/Reference/DisplayCell.tsx b/src/components/fields/Reference/DisplayCell.tsx index a15d9db4..98705d43 100644 --- a/src/components/fields/Reference/DisplayCell.tsx +++ b/src/components/fields/Reference/DisplayCell.tsx @@ -6,7 +6,7 @@ import LaunchIcon from "@mui/icons-material/Launch"; import { projectScope, projectIdAtom } from "@src/atoms/projectScope"; -export default function Reference({ value }: IDisplayCellProps) { +export default function Reference({ value, tabIndex }: IDisplayCellProps) { const [projectId] = useAtom(projectIdAtom, projectScope); const path = value?.path ?? ""; @@ -32,6 +32,7 @@ export default function Reference({ value }: IDisplayCellProps) { aria-label="Open in Firebase Console" className="row-hover-iconButton" style={{ flexShrink: 0 }} + tabIndex={tabIndex} > diff --git a/src/components/fields/Url/DisplayCell.tsx b/src/components/fields/Url/DisplayCell.tsx index b3145716..20bd48dd 100644 --- a/src/components/fields/Url/DisplayCell.tsx +++ b/src/components/fields/Url/DisplayCell.tsx @@ -3,7 +3,7 @@ import { IDisplayCellProps } from "@src/components/fields/types"; import { Stack, IconButton } from "@mui/material"; import LaunchIcon from "@mui/icons-material/Launch"; -export default function Url({ value }: IDisplayCellProps) { +export default function Url({ value, tabIndex }: IDisplayCellProps) { if (!value || typeof value !== "string") return null; const href = value.includes("http") ? value : `https://${value}`; @@ -25,6 +25,7 @@ export default function Url({ value }: IDisplayCellProps) { size="small" style={{ flexShrink: 0 }} aria-label="Open in new tab" + tabIndex={tabIndex} > diff --git a/src/components/fields/types.ts b/src/components/fields/types.ts index 1837e1db..a875a456 100644 --- a/src/components/fields/types.ts +++ b/src/components/fields/types.ts @@ -75,14 +75,17 @@ export interface IDisplayCellProps { name: string; row: TableRow; column: ColumnConfig; + /** @deprecated */ docRef: TableRowRef; + /** The row’s _rowy_ref object */ + _rowy_ref: TableRowRef; disabled: boolean; + tabIndex: number; showPopoverCell: (value: boolean) => void; setFocusInsideCell: (focusInside: boolean) => void; } export interface IEditorCellProps extends IDisplayCellProps { onSubmit: (value: T) => void; - tabIndex: number; parentRef: PopoverProps["anchorEl"]; } @@ -104,13 +107,6 @@ export interface ISideDrawerFieldProps { /** Field locked. Do NOT check `column.locked` */ disabled: boolean; - - /** @deprecated */ - docRef: TableRowRef; - /** @deprecated */ - control: Control; - /** @deprecated */ - useFormMethods: UseFormReturn; } export interface ISettingsProps { From fd717075f8237d29e31f563ade58a5ab3770be50 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Wed, 9 Nov 2022 18:39:14 +1100 Subject: [PATCH 246/309] use side drawer fields as EditorCells --- src/atoms/tableScope/columnActions.ts | 2 - src/components/Table/EditorCellTextField.tsx | 21 ++-- src/components/Table/withTableCell.tsx | 116 ++++++++++++------ src/components/fields/Action/ActionFab.tsx | 2 - src/components/fields/Action/EditorCell.tsx | 2 - .../fields/Action/SideDrawerField.tsx | 6 - src/components/fields/Checkbox/EditorCell.tsx | 9 +- .../Code/{BasicCell.tsx => DisplayCell.tsx} | 7 +- src/components/fields/Code/index.tsx | 8 +- .../fields/MultiSelect/PopoverCell.tsx | 16 ++- src/components/fields/Number/EditorCell.tsx | 2 +- .../fields/Percentage/EditorCell.tsx | 2 +- .../fields/Reference/EditorCell.tsx | 46 +++++-- src/components/fields/types.ts | 18 ++- 14 files changed, 166 insertions(+), 91 deletions(-) rename src/components/fields/Code/{BasicCell.tsx => DisplayCell.tsx} (67%) diff --git a/src/atoms/tableScope/columnActions.ts b/src/atoms/tableScope/columnActions.ts index 58e44405..96a37d2a 100644 --- a/src/atoms/tableScope/columnActions.ts +++ b/src/atoms/tableScope/columnActions.ts @@ -93,8 +93,6 @@ export const updateColumnAtom = atom( }); } - console.log(tableColumnsOrdered); - // Reduce array into single object with updated indexes const updatedColumns = tableColumnsOrdered.reduce(tableColumnsReducer, {}); await updateTableSchema({ columns: updatedColumns }); diff --git a/src/components/Table/EditorCellTextField.tsx b/src/components/Table/EditorCellTextField.tsx index ee0fd9f3..3d89d8be 100644 --- a/src/components/Table/EditorCellTextField.tsx +++ b/src/components/Table/EditorCellTextField.tsx @@ -1,8 +1,5 @@ import type { IEditorCellProps } from "@src/components/fields/types"; -import { useSaveOnUnmount } from "@src/hooks/useSaveOnUnmount"; - import { InputBase, InputBaseProps } from "@mui/material"; - import { spreadSx } from "@src/utils/ui"; export interface IEditorCellTextFieldProps extends IEditorCellProps { @@ -12,17 +9,18 @@ export interface IEditorCellTextFieldProps extends IEditorCellProps { export default function EditorCellTextField({ column, value, - onSubmit, + onDirty, + onChange, setFocusInsideCell, InputProps = {}, }: IEditorCellTextFieldProps) { - const [localValue, setLocalValue] = useSaveOnUnmount(value, onSubmit); const maxLength = column.config?.maxLength; return ( setLocalValue(e.target.value)} + value={value} + onBlur={() => onDirty()} + onChange={(e) => onChange(e.target.value)} fullWidth autoFocus onKeyDown={(e) => { @@ -34,9 +32,14 @@ export default function EditorCellTextField({ ) { e.stopPropagation(); } + // Escape prevents saving the new value if (e.key === "Escape") { - // Escape removes focus inside cell, this runs before save on unmount - setLocalValue(value); + // Setting isDirty to false prevents saving + onDirty(false); + // Stop propagation to prevent the table from closing the editor + e.stopPropagation(); + // Close the editor after isDirty is set to false again + setTimeout(() => setFocusInsideCell(false)); } if (e.key === "Enter" && !e.shiftKey) { // Removes focus from inside cell, triggering save on unmount diff --git a/src/components/Table/withTableCell.tsx b/src/components/Table/withTableCell.tsx index 93d5641c..65993041 100644 --- a/src/components/Table/withTableCell.tsx +++ b/src/components/Table/withTableCell.tsx @@ -1,4 +1,12 @@ -import { memo, Suspense, useState, useEffect, useRef } from "react"; +import { + memo, + Suspense, + useState, + useEffect, + useRef, + useLayoutEffect, +} from "react"; +import useStateRef from "react-usestateref"; import { useSetAtom } from "jotai"; import { get, isEqual } from "lodash-es"; import type { TableCellProps } from "@src/components/Table"; @@ -14,6 +22,7 @@ import { updateFieldAtom, sideDrawerOpenAtom, } from "@src/atoms/tableScope"; +import { spreadSx } from "@src/utils/ui"; export interface ICellOptions { /** If the rest of the row’s data is used, set this to true for memoization */ @@ -36,13 +45,12 @@ export interface ICellOptions { * - "focus" (default) - when the cell is focused (Enter or double-click) * - "inline" - inline with deferred render * - "popover" - as a popover - * - "sideDrawer" - open the side drawer * @param options - {@link ICellOptions} */ export default function withTableCell( DisplayCellComponent: React.ComponentType, EditorCellComponent: React.ComponentType | null, - editorMode: "focus" | "inline" | "popover" | "sideDrawer" = "focus", + editorMode: "focus" | "inline" | "popover" = "focus", options: ICellOptions = {} ) { return memo( @@ -55,8 +63,6 @@ export default function withTableCell( disabled, }: TableCellProps) { const value = getValue(); - const updateField = useSetAtom(updateFieldAtom, tableScope); - const setSideDrawerOpen = useSetAtom(sideDrawerOpenAtom, tableScope); // Store ref to rendered DisplayCell to get positioning for PopoverCell const displayCellRef = useRef(null); @@ -65,11 +71,8 @@ export default function withTableCell( // Store Popover open state here so we can add delay for close transition const [popoverOpen, setPopoverOpen] = useState(false); useEffect(() => { - if (focusInsideCell) { - setPopoverOpen(true); - if (editorMode === "sideDrawer") setSideDrawerOpen(true); - } - }, [focusInsideCell, setSideDrawerOpen]); + if (focusInsideCell) setPopoverOpen(true); + }, [focusInsideCell]); const showPopoverCell = (popover: boolean) => { if (popover) { setPopoverOpen(true); @@ -112,30 +115,16 @@ export default function withTableCell(
    ); - if ( - disabled || - (editorMode !== "inline" && !focusInsideCell) || - editorMode === "sideDrawer" - ) + if (disabled || (editorMode !== "inline" && !focusInsideCell)) return displayCell; - // This is where we update the documents - const handleSubmit = (value: any) => { - if (disabled) return; - updateField({ - path: row.original._rowy_ref.path, - fieldName: column.id, - value, - deleteField: value === undefined, - }); - }; - // Show displayCell as a fallback if intentionally null const editorCell = EditorCellComponent ? ( - ) : ( displayCell @@ -169,15 +158,17 @@ export default function withTableCell( onClose={() => showPopoverCell(false)} anchorOrigin={{ horizontal: "left", vertical: "bottom" }} {...options.popoverProps} - sx={ - options.transparent - ? { - "& .MuiPopover-paper": { - backgroundColor: "transparent", - }, - } - : {} - } + sx={[ + { + "& .MuiPopover-paper": { + backgroundColor: options.transparent + ? "transparent" + : undefined, + minWidth: column.getSize(), + }, + }, + ...spreadSx(options.popoverProps?.sx), + ]} onClick={(e) => e.stopPropagation()} onDoubleClick={(e) => e.stopPropagation()} onKeyDown={(e) => e.stopPropagation()} @@ -214,3 +205,54 @@ export default function withTableCell( } ); } + +interface IEditorCellManagerProps extends IDisplayCellProps { + EditorCellComponent: React.ComponentType; + parentRef: IEditorCellProps["parentRef"]; + saveOnUnmount: boolean; +} + +function EditorCellManager({ + EditorCellComponent, + saveOnUnmount, + ...props +}: IEditorCellManagerProps) { + const [localValue, setLocalValue, localValueRef] = useStateRef(props.value); + const [, setIsDirty, isDirtyRef] = useStateRef(false); + const updateField = useSetAtom(updateFieldAtom, tableScope); + + // This is where we update the documents + const handleSubmit = () => { + if (props.disabled || !isDirtyRef.current) return; + + updateField({ + path: props._rowy_ref.path, + fieldName: props.column.fieldName, + value: localValueRef.current, + deleteField: localValueRef.current === undefined, + }); + }; + + useLayoutEffect(() => { + return () => { + if (saveOnUnmount) { + console.log("unmount", props._rowy_ref.path, props.column.fieldName); + handleSubmit(); + } + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ( + setIsDirty(dirty ?? true)} + onChange={(v) => { + setIsDirty(true); + setLocalValue(v); + }} + onSubmit={handleSubmit} + /> + ); +} diff --git a/src/components/fields/Action/ActionFab.tsx b/src/components/fields/Action/ActionFab.tsx index 4f8c31cc..6f87fb15 100644 --- a/src/components/fields/Action/ActionFab.tsx +++ b/src/components/fields/Action/ActionFab.tsx @@ -51,7 +51,6 @@ const getStateIcon = (actionState: "undo" | "redo" | string, config: any) => { export interface IActionFabProps extends Partial { row: any; column: any; - onSubmit: (value: any) => void; value: any; disabled: boolean; } @@ -59,7 +58,6 @@ export interface IActionFabProps extends Partial { export default function ActionFab({ row, column, - onSubmit, value, disabled, ...props diff --git a/src/components/fields/Action/EditorCell.tsx b/src/components/fields/Action/EditorCell.tsx index e05afbc8..1706c4e2 100644 --- a/src/components/fields/Action/EditorCell.tsx +++ b/src/components/fields/Action/EditorCell.tsx @@ -9,7 +9,6 @@ export default function Action({ column, row, value, - onSubmit, disabled, tabIndex, }: IEditorCellProps) { @@ -36,7 +35,6 @@ export default function Action({ { - onChange(value); - onSubmit(); - }} value={value} disabled={disabled} id={getFieldId(column.key)} diff --git a/src/components/fields/Checkbox/EditorCell.tsx b/src/components/fields/Checkbox/EditorCell.tsx index 4785700c..620a8e62 100644 --- a/src/components/fields/Checkbox/EditorCell.tsx +++ b/src/components/fields/Checkbox/EditorCell.tsx @@ -15,6 +15,7 @@ export default function Checkbox({ row, column, value, + onChange, onSubmit, disabled, tabIndex, @@ -29,10 +30,14 @@ export default function Checkbox({ /\{\{(.*?)\}\}/g, replacer(row) ), - handleConfirm: () => onSubmit(!value), + handleConfirm: () => { + onChange(!value); + onSubmit(); + }, }); } else { - onSubmit(!value); + onChange(!value); + onSubmit(); } }; diff --git a/src/components/fields/Code/BasicCell.tsx b/src/components/fields/Code/DisplayCell.tsx similarity index 67% rename from src/components/fields/Code/BasicCell.tsx rename to src/components/fields/Code/DisplayCell.tsx index 8b776896..2d8aa566 100644 --- a/src/components/fields/Code/BasicCell.tsx +++ b/src/components/fields/Code/DisplayCell.tsx @@ -1,20 +1,21 @@ -import { IBasicCellProps } from "@src/components/fields/types"; +import { IDisplayCellProps } from "@src/components/fields/types"; import { useTheme } from "@mui/material"; -export default function Code({ value }: IBasicCellProps) { +export default function Code({ value }: IDisplayCellProps) { const theme = useTheme(); return (
    {value} diff --git a/src/components/fields/Code/index.tsx b/src/components/fields/Code/index.tsx index 8db3ae97..18a7da7d 100644 --- a/src/components/fields/Code/index.tsx +++ b/src/components/fields/Code/index.tsx @@ -1,10 +1,9 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withBasicCell from "@src/components/fields/_withTableCell/withBasicCell"; +import withTableCell from "@src/components/Table/withTableCell"; import CodeIcon from "@mui/icons-material/Code"; -import BasicCell from "./BasicCell"; -import withSideDrawerEditor from "@src/components/Table/editors/withSideDrawerEditor"; +import DisplayCell from "./DisplayCell"; const Settings = lazy( () => import("./Settings" /* webpackChunkName: "Settings-Code" */) @@ -24,8 +23,7 @@ export const config: IFieldConfig = { initializable: true, icon: , description: "Raw code edited with the Monaco Editor.", - TableCell: withBasicCell(BasicCell), - TableEditor: withSideDrawerEditor(BasicCell), + TableCell: withTableCell(DisplayCell, SideDrawerField, "popover"), SideDrawerField, settings: Settings, }; diff --git a/src/components/fields/MultiSelect/PopoverCell.tsx b/src/components/fields/MultiSelect/PopoverCell.tsx index 8ef894cf..c96f5746 100644 --- a/src/components/fields/MultiSelect/PopoverCell.tsx +++ b/src/components/fields/MultiSelect/PopoverCell.tsx @@ -9,6 +9,7 @@ import { sanitiseValue } from "./utils"; export default function MultiSelect({ value, + onChange, onSubmit, column, parentRef, @@ -25,7 +26,13 @@ export default function MultiSelect({ description={ <> This cell’s value is a string - @@ -37,7 +44,7 @@ export default function MultiSelect({ return ( showPopoverCell(false)} + onClose={() => { + showPopoverCell(false); + onSubmit(); + }} /> ); } diff --git a/src/components/fields/Number/EditorCell.tsx b/src/components/fields/Number/EditorCell.tsx index 93c5c31c..5ae634a2 100644 --- a/src/components/fields/Number/EditorCell.tsx +++ b/src/components/fields/Number/EditorCell.tsx @@ -6,7 +6,7 @@ export default function Number_(props: IEditorCellProps) { props.onSubmit(Number(v))} + onChange={(v) => props.onChange(Number(v))} /> ); } diff --git a/src/components/fields/Percentage/EditorCell.tsx b/src/components/fields/Percentage/EditorCell.tsx index 652cdcd0..16dd9a88 100644 --- a/src/components/fields/Percentage/EditorCell.tsx +++ b/src/components/fields/Percentage/EditorCell.tsx @@ -7,7 +7,7 @@ export default function Percentage(props: IEditorCellProps) { {...(props as any)} InputProps={{ type: "number", endAdornment: "%" }} value={typeof props.value === "number" ? props.value * 100 : props.value} - onSubmit={(v) => props.onSubmit(Number(v) / 100)} + onChange={(v) => props.onChange(Number(v) / 100)} /> ); } diff --git a/src/components/fields/Reference/EditorCell.tsx b/src/components/fields/Reference/EditorCell.tsx index 770f352c..27232cff 100644 --- a/src/components/fields/Reference/EditorCell.tsx +++ b/src/components/fields/Reference/EditorCell.tsx @@ -1,34 +1,56 @@ +import { useState } from "react"; +import { useAtom } from "jotai"; +import { doc, deleteField } from "firebase/firestore"; + import type { IEditorCellProps } from "@src/components/fields/types"; import EditorCellTextField from "@src/components/Table/EditorCellTextField"; -import { useAtom } from "jotai"; -import { doc, deleteField } from "firebase/firestore"; -import { useSnackbar } from "notistack"; +import { InputAdornment, Tooltip } from "@mui/material"; +import ErrorIcon from "@mui/icons-material/ErrorOutline"; import { projectScope } from "@src/atoms/projectScope"; import { firebaseDbAtom } from "@src/sources/ProjectSourceFirebase"; -export default function Reference( - props: IEditorCellProps> -) { - const { enqueueSnackbar } = useSnackbar(); +export default function Reference({ + value, + ...props +}: IEditorCellProps>) { const [firebaseDb] = useAtom(firebaseDbAtom, projectScope); + const [localValue, setLocalValue] = useState( + Boolean(value) && "path" in value && typeof value.path === "string" + ? value.path + : "" + ); + const [error, setError] = useState(""); + return ( { + value={localValue} + onChange={(newValue) => { if (newValue !== undefined && newValue !== "") { try { const refValue = doc(firebaseDb, newValue); - props.onSubmit(refValue); + props.onChange(refValue); + setError(""); } catch (e: any) { - enqueueSnackbar(`Invalid path: ${e.message}`, { variant: "error" }); + setError(e.message); } } else { - props.onSubmit(deleteField() as any); + props.onChange(deleteField() as any); } + + setLocalValue(newValue); + }} + InputProps={{ + endAdornment: error && ( + + + + + + ), }} /> ); diff --git a/src/components/fields/types.ts b/src/components/fields/types.ts index a875a456..95e57c68 100644 --- a/src/components/fields/types.ts +++ b/src/components/fields/types.ts @@ -85,23 +85,29 @@ export interface IDisplayCellProps { setFocusInsideCell: (focusInside: boolean) => void; } export interface IEditorCellProps extends IDisplayCellProps { - onSubmit: (value: T) => void; + /** Call when the user has input but changes have not been saved */ + onDirty: (dirty?: boolean) => void; + /** Update the local value. Also calls onDirty */ + onChange: (value: T) => void; + /** Call when user input is ready to be saved (e.g. onBlur) */ + onSubmit: () => void; + /** Get parent element for popover positioning */ parentRef: PopoverProps["anchorEl"]; } /** Props to be passed to all SideDrawerFields */ -export interface ISideDrawerFieldProps { +export interface ISideDrawerFieldProps { /** The column config */ - column: FormatterProps["column"] & ColumnConfig; + column: ColumnConfig; /** The row’s _rowy_ref object */ _rowy_ref: TableRowRef; /** The field’s local value – synced with db when field is not dirty */ - value: any; + value: T; /** Call when the user has input but changes have not been saved */ - onDirty: () => void; + onDirty: (dirty?: boolean) => void; /** Update the local value. Also calls onDirty */ - onChange: (value: any) => void; + onChange: (T: any) => void; /** Call when user input is ready to be saved (e.g. onBlur) */ onSubmit: () => void; From fe665fef2a8a525b9a7712db91d2ed2dcf7d0fc9 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Thu, 10 Nov 2022 18:21:32 +1100 Subject: [PATCH 247/309] migrate all side drawer cells --- src/components/ColumnMenu/ColumnMenu.tsx | 2 +- src/components/SideDrawer/MemoizedField.tsx | 2 +- .../Table/ContextMenu/MenuContents.tsx | 2 +- src/components/Table/withTableCell.tsx | 72 +++++------ src/components/fields/Code/DisplayCell.tsx | 5 +- src/components/fields/Code/index.tsx | 7 +- src/components/fields/Color/DisplayCell.tsx | 60 +++++++++ src/components/fields/Color/EditorCell.tsx | 19 +++ src/components/fields/Color/InlineCell.tsx | 41 ------ src/components/fields/Color/PopoverCell.tsx | 30 ----- .../fields/Color/SideDrawerField.tsx | 4 +- src/components/fields/Color/index.tsx | 15 +-- .../fields/ConnectService/DisplayCell.tsx | 50 +++++++ .../{PopoverCell.tsx => EditorCell.tsx} | 12 +- .../fields/ConnectService/InlineCell.tsx | 56 -------- .../fields/ConnectService/index.tsx | 17 +-- .../fields/ConnectTable/DisplayCell.tsx | 61 +++++++++ .../{PopoverCell.tsx => EditorCell.tsx} | 12 +- .../fields/ConnectTable/InlineCell.tsx | 68 ---------- src/components/fields/ConnectTable/index.tsx | 18 +-- .../fields/Connector/DisplayCell.tsx | 48 +++++++ .../fields/Connector/EditorCell.tsx | 25 ++++ .../fields/Connector/InlineCell.tsx | 57 -------- .../fields/Connector/PopoverCell.tsx | 35 ----- .../fields/Connector/Select/PopupContents.tsx | 122 ++++++++---------- .../fields/Connector/Select/index.tsx | 8 +- .../fields/Connector/SideDrawerField.tsx | 4 +- src/components/fields/Connector/index.tsx | 19 ++- .../{TableCell.tsx => DisplayCell.tsx} | 4 +- src/components/fields/CreatedAt/index.tsx | 11 +- .../{TableCell.tsx => DisplayCell.tsx} | 4 +- src/components/fields/CreatedBy/index.tsx | 11 +- .../Date/{BasicCell.tsx => DisplayCell.tsx} | 18 ++- .../Date/{TableCell.tsx => EditorCell.tsx} | 49 +++---- src/components/fields/Date/index.tsx | 14 +- .../{BasicCell.tsx => DisplayCell.tsx} | 18 ++- .../{TableCell.tsx => EditorCell.tsx} | 50 +++---- src/components/fields/DateTime/index.tsx | 14 +- src/components/fields/Derivative/index.tsx | 9 +- .../{TableCell.tsx => DisplayCell.tsx} | 4 +- src/components/fields/Duration/index.tsx | 13 +- .../{TableCell.tsx => DisplayCell.tsx} | 4 +- src/components/fields/GeoPoint/index.tsx | 14 +- src/components/fields/Id/index.tsx | 6 +- .../Json/{BasicCell.tsx => DisplayCell.tsx} | 8 +- .../fields/Json/SideDrawerField.tsx | 8 +- src/components/fields/Json/index.tsx | 10 +- src/components/fields/LongText/index.tsx | 7 +- .../{BasicCell.tsx => DisplayCell.tsx} | 4 +- .../fields/Markdown/SideDrawerField.tsx | 2 +- src/components/fields/Markdown/index.tsx | 8 +- .../fields/MultiSelect/DisplayCell.tsx | 50 +++---- .../{PopoverCell.tsx => EditorCell.tsx} | 7 +- .../fields/MultiSelect/SideDrawerField.tsx | 7 +- src/components/fields/MultiSelect/index.tsx | 11 +- .../fields/RichText/DisplayCell.tsx | 101 +++++++++++++++ src/components/fields/RichText/TableCell.tsx | 98 -------------- src/components/fields/RichText/index.tsx | 11 +- .../Slider/{TableCell.tsx => DisplayCell.tsx} | 4 +- src/components/fields/Slider/index.tsx | 13 +- .../{TableCell.tsx => DisplayCell.tsx} | 4 +- src/components/fields/UpdatedAt/index.tsx | 11 +- .../{TableCell.tsx => DisplayCell.tsx} | 4 +- src/components/fields/UpdatedBy/index.tsx | 11 +- .../User/{TableCell.tsx => DisplayCell.tsx} | 4 +- src/components/fields/User/index.tsx | 11 +- ...json-stable-stringify-without-jsonify.d.ts | 2 +- 67 files changed, 722 insertions(+), 788 deletions(-) create mode 100644 src/components/fields/Color/DisplayCell.tsx create mode 100644 src/components/fields/Color/EditorCell.tsx delete mode 100644 src/components/fields/Color/InlineCell.tsx delete mode 100644 src/components/fields/Color/PopoverCell.tsx create mode 100644 src/components/fields/ConnectService/DisplayCell.tsx rename src/components/fields/ConnectService/{PopoverCell.tsx => EditorCell.tsx} (81%) delete mode 100644 src/components/fields/ConnectService/InlineCell.tsx create mode 100644 src/components/fields/ConnectTable/DisplayCell.tsx rename src/components/fields/ConnectTable/{PopoverCell.tsx => EditorCell.tsx} (79%) delete mode 100644 src/components/fields/ConnectTable/InlineCell.tsx create mode 100644 src/components/fields/Connector/DisplayCell.tsx create mode 100644 src/components/fields/Connector/EditorCell.tsx delete mode 100644 src/components/fields/Connector/InlineCell.tsx delete mode 100644 src/components/fields/Connector/PopoverCell.tsx rename src/components/fields/CreatedAt/{TableCell.tsx => DisplayCell.tsx} (70%) rename src/components/fields/CreatedBy/{TableCell.tsx => DisplayCell.tsx} (85%) rename src/components/fields/Date/{BasicCell.tsx => DisplayCell.tsx} (51%) rename src/components/fields/Date/{TableCell.tsx => EditorCell.tsx} (69%) rename src/components/fields/DateTime/{BasicCell.tsx => DisplayCell.tsx} (51%) rename src/components/fields/DateTime/{TableCell.tsx => EditorCell.tsx} (70%) rename src/components/fields/Duration/{TableCell.tsx => DisplayCell.tsx} (67%) rename src/components/fields/GeoPoint/{TableCell.tsx => DisplayCell.tsx} (90%) rename src/components/fields/Json/{BasicCell.tsx => DisplayCell.tsx} (66%) rename src/components/fields/Markdown/{BasicCell.tsx => DisplayCell.tsx} (75%) rename src/components/fields/MultiSelect/{PopoverCell.tsx => EditorCell.tsx} (86%) create mode 100644 src/components/fields/RichText/DisplayCell.tsx delete mode 100644 src/components/fields/RichText/TableCell.tsx rename src/components/fields/Slider/{TableCell.tsx => DisplayCell.tsx} (89%) rename src/components/fields/UpdatedAt/{TableCell.tsx => DisplayCell.tsx} (70%) rename src/components/fields/UpdatedBy/{TableCell.tsx => DisplayCell.tsx} (87%) rename src/components/fields/User/{TableCell.tsx => DisplayCell.tsx} (83%) diff --git a/src/components/ColumnMenu/ColumnMenu.tsx b/src/components/ColumnMenu/ColumnMenu.tsx index 4884a75a..9d193179 100644 --- a/src/components/ColumnMenu/ColumnMenu.tsx +++ b/src/components/ColumnMenu/ColumnMenu.tsx @@ -205,7 +205,7 @@ export default function ColumnMenu() { }); handleClose(); }, - active: !column.editable, + active: column.editable === false, }, { label: "Disable resize", diff --git a/src/components/SideDrawer/MemoizedField.tsx b/src/components/SideDrawer/MemoizedField.tsx index 835ed74e..0fb62f62 100644 --- a/src/components/SideDrawer/MemoizedField.tsx +++ b/src/components/SideDrawer/MemoizedField.tsx @@ -53,7 +53,7 @@ export const MemoizedField = memo( // Should not reach this state if (isEmpty(fieldComponent)) { - // console.error('Could not find SideDrawerField component', field); + console.error("Could not find SideDrawerField component", field); return null; } diff --git a/src/components/Table/ContextMenu/MenuContents.tsx b/src/components/Table/ContextMenu/MenuContents.tsx index c098ebe2..5a10aaef 100644 --- a/src/components/Table/ContextMenu/MenuContents.tsx +++ b/src/components/Table/ContextMenu/MenuContents.tsx @@ -211,7 +211,7 @@ export default function MenuContents({ onClose }: IMenuContentsProps) { disabled: selectedColumn?.editable === false || !row || - cellValue || + cellValue === undefined || getFieldProp("group", selectedColumn?.type) === "Auditing", onClick: altPress ? handleClearValue diff --git a/src/components/Table/withTableCell.tsx b/src/components/Table/withTableCell.tsx index 65993041..28a7d3bd 100644 --- a/src/components/Table/withTableCell.tsx +++ b/src/components/Table/withTableCell.tsx @@ -17,11 +17,7 @@ import { import { Popover, PopoverProps } from "@mui/material"; -import { - tableScope, - updateFieldAtom, - sideDrawerOpenAtom, -} from "@src/atoms/tableScope"; +import { tableScope, updateFieldAtom } from "@src/atoms/tableScope"; import { spreadSx } from "@src/utils/ui"; export interface ICellOptions { @@ -30,7 +26,7 @@ export interface ICellOptions { /** Handle padding inside the cell component */ disablePadding?: boolean; /** Set popover background to be transparent */ - transparent?: boolean; + transparentPopover?: boolean; /** Props to pass to MUI Popover component */ popoverProps?: Partial; } @@ -120,12 +116,14 @@ export default function withTableCell( // Show displayCell as a fallback if intentionally null const editorCell = EditorCellComponent ? ( - + + + ) : ( displayCell ); @@ -151,32 +149,32 @@ export default function withTableCell( <> {displayCell} - - showPopoverCell(false)} - anchorOrigin={{ horizontal: "left", vertical: "bottom" }} - {...options.popoverProps} - sx={[ - { - "& .MuiPopover-paper": { - backgroundColor: options.transparent - ? "transparent" - : undefined, - minWidth: column.getSize(), - }, + showPopoverCell(false)} + anchorOrigin={{ horizontal: "center", vertical: "bottom" }} + transformOrigin={{ horizontal: "center", vertical: "top" }} + {...options.popoverProps} + sx={[ + { + "& .MuiPopover-paper": { + backgroundColor: options.transparentPopover + ? "transparent" + : undefined, + boxShadow: options.transparentPopover ? "none" : undefined, + minWidth: column.getSize(), }, - ...spreadSx(options.popoverProps?.sx), - ]} - onClick={(e) => e.stopPropagation()} - onDoubleClick={(e) => e.stopPropagation()} - onKeyDown={(e) => e.stopPropagation()} - onContextMenu={(e) => e.stopPropagation()} - > - {editorCell} - - + }, + ...spreadSx(options.popoverProps?.sx), + ]} + onClick={(e) => e.stopPropagation()} + onDoubleClick={(e) => e.stopPropagation()} + onKeyDown={(e) => e.stopPropagation()} + onContextMenu={(e) => e.stopPropagation()} + > + {editorCell} + ); diff --git a/src/components/fields/Code/DisplayCell.tsx b/src/components/fields/Code/DisplayCell.tsx index 2d8aa566..215266f2 100644 --- a/src/components/fields/Code/DisplayCell.tsx +++ b/src/components/fields/Code/DisplayCell.tsx @@ -4,6 +4,9 @@ import { useTheme } from "@mui/material"; export default function Code({ value }: IDisplayCellProps) { const theme = useTheme(); + + if (typeof value !== "string") return null; + return (
    - {value} + {value.substring(0, 1000)}
    ); } diff --git a/src/components/fields/Code/index.tsx b/src/components/fields/Code/index.tsx index 18a7da7d..72738586 100644 --- a/src/components/fields/Code/index.tsx +++ b/src/components/fields/Code/index.tsx @@ -23,7 +23,12 @@ export const config: IFieldConfig = { initializable: true, icon: , description: "Raw code edited with the Monaco Editor.", - TableCell: withTableCell(DisplayCell, SideDrawerField, "popover"), + TableCell: withTableCell(DisplayCell, SideDrawerField, "popover", { + popoverProps: { + anchorOrigin: { vertical: "top", horizontal: "center" }, + PaperProps: { sx: { borderRadius: 1 } }, + }, + }), SideDrawerField, settings: Settings, }; diff --git a/src/components/fields/Color/DisplayCell.tsx b/src/components/fields/Color/DisplayCell.tsx new file mode 100644 index 00000000..acdf325a --- /dev/null +++ b/src/components/fields/Color/DisplayCell.tsx @@ -0,0 +1,60 @@ +import { IDisplayCellProps } from "@src/components/fields/types"; + +import { ButtonBase, Box } from "@mui/material"; +import { ChevronDown } from "@src/assets/icons"; + +export default function Color({ + value, + showPopoverCell, + disabled, + tabIndex, +}: IDisplayCellProps) { + const rendered = ( +
    + {value?.hex && ( + `0 0 0 1px ${theme.palette.divider} inset`, + borderRadius: 0.5, + }} + /> + )} + + {value?.hex} +
    + ); + + if (disabled) return rendered; + + return ( + showPopoverCell(true)} + sx={{ + width: "100%", + height: "100%", + font: "inherit", + color: "inherit", + letterSpacing: "inherit", + justifyContent: "flex-start", + }} + tabIndex={tabIndex} + > + {rendered} + + + ); +} diff --git a/src/components/fields/Color/EditorCell.tsx b/src/components/fields/Color/EditorCell.tsx new file mode 100644 index 00000000..a0ce903b --- /dev/null +++ b/src/components/fields/Color/EditorCell.tsx @@ -0,0 +1,19 @@ +import { IEditorCellProps } from "@src/components/fields/types"; +import { ColorPicker, toColor } from "react-color-palette"; +import "react-color-palette/lib/css/styles.css"; + +import { Box } from "@mui/material"; + +export default function Color({ value, onChange }: IEditorCellProps) { + return ( + + + + ); +} diff --git a/src/components/fields/Color/InlineCell.tsx b/src/components/fields/Color/InlineCell.tsx deleted file mode 100644 index af36b90f..00000000 --- a/src/components/fields/Color/InlineCell.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { forwardRef } from "react"; -import { IPopoverInlineCellProps } from "@src/components/fields/types"; - -import { ButtonBase, Box } from "@mui/material"; - -export const Color = forwardRef(function Color( - { value, showPopoverCell, disabled }: IPopoverInlineCellProps, - ref: React.Ref -) { - return ( - showPopoverCell(true)} - ref={ref} - disabled={disabled} - className="cell-collapse-padding" - sx={{ - font: "inherit", - letterSpacing: "inherit", - p: "var(--cell-padding)", - justifyContent: "flex-start", - height: "100%", - }} - > - `0 0 0 1px ${theme.palette.divider} inset`, - borderRadius: 0.5, - }} - /> - - {value?.hex} - - ); -}); - -export default Color; diff --git a/src/components/fields/Color/PopoverCell.tsx b/src/components/fields/Color/PopoverCell.tsx deleted file mode 100644 index cfdbb219..00000000 --- a/src/components/fields/Color/PopoverCell.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { useEffect, useState } from "react"; -import { IPopoverCellProps } from "@src/components/fields/types"; -import { useDebouncedCallback } from "use-debounce"; -import { ColorPicker, toColor } from "react-color-palette"; -import "react-color-palette/lib/css/styles.css"; - -import { Box } from "@mui/material"; - -export default function Color({ value, onSubmit }: IPopoverCellProps) { - const [localValue, setLocalValue] = useState(value); - const handleChangeComplete = useDebouncedCallback((color) => { - onSubmit(color); - }, 400); - - useEffect(() => { - handleChangeComplete(localValue); - }, [localValue]); - - return ( - - - - ); -} diff --git a/src/components/fields/Color/SideDrawerField.tsx b/src/components/fields/Color/SideDrawerField.tsx index 2090b68c..8f9499e3 100644 --- a/src/components/fields/Color/SideDrawerField.tsx +++ b/src/components/fields/Color/SideDrawerField.tsx @@ -87,7 +87,9 @@ export default function Color({ import("./PopoverCell" /* webpackChunkName: "PopoverCell-Color" */) +const EditorCell = lazy( + () => import("./EditorCell" /* webpackChunkName: "EditorCell-Color" */) ); const SideDrawerField = lazy( () => @@ -26,10 +24,9 @@ export const config: IFieldConfig = { icon: , description: "Color stored as Hex, RGB, and HSV. Edited with a visual picker.", - TableCell: withPopoverCell(BasicCell, InlineCell, PopoverCell, { - anchorOrigin: { horizontal: "left", vertical: "bottom" }, + TableCell: withTableCell(DisplayCell, EditorCell, "popover", { + disablePadding: true, }), - TableEditor: NullEditor as any, SideDrawerField, csvImportParser: (value: string) => { try { diff --git a/src/components/fields/ConnectService/DisplayCell.tsx b/src/components/fields/ConnectService/DisplayCell.tsx new file mode 100644 index 00000000..e4d08055 --- /dev/null +++ b/src/components/fields/ConnectService/DisplayCell.tsx @@ -0,0 +1,50 @@ +import { IDisplayCellProps } from "@src/components/fields/types"; + +import { ButtonBase, Grid, Chip } from "@mui/material"; +import { ChevronDown } from "@src/assets/icons"; + +import ChipList from "@src/components/Table/formatters/ChipList"; +import { get } from "lodash-es"; + +export default function ConnectService({ + value, + showPopoverCell, + disabled, + column, + tabIndex, +}: IDisplayCellProps) { + const config = column.config ?? {}; + const displayKey = config.titleKey ?? config.primaryKey; + + const rendered = ( + + {Array.isArray(value) && + value.map((snapshot) => ( + + + + ))} + + ); + + if (disabled) return rendered; + + return ( + showPopoverCell(true)} + style={{ + width: "100%", + height: "100%", + font: "inherit", + color: "inherit !important", + letterSpacing: "inherit", + textAlign: "inherit", + justifyContent: "flex-start", + }} + tabIndex={tabIndex} + > + {rendered} + + + ); +} diff --git a/src/components/fields/ConnectService/PopoverCell.tsx b/src/components/fields/ConnectService/EditorCell.tsx similarity index 81% rename from src/components/fields/ConnectService/PopoverCell.tsx rename to src/components/fields/ConnectService/EditorCell.tsx index cc79c729..6d506f9c 100644 --- a/src/components/fields/ConnectService/PopoverCell.tsx +++ b/src/components/fields/ConnectService/EditorCell.tsx @@ -1,26 +1,26 @@ -import { IPopoverCellProps } from "@src/components/fields/types"; +import { IEditorCellProps } from "@src/components/fields/types"; import ConnectServiceSelect from "./ConnectServiceSelect"; export default function ConnectService({ value, - onSubmit, + onChange, column, parentRef, showPopoverCell, disabled, - docRef, -}: IPopoverCellProps) { + _rowy_ref, +}: IEditorCellProps) { const config = column.config ?? {}; if (!config) return null; return ( -) { - const config = column.config ?? {}; - const displayKey = config.titleKey ?? config.primaryKey; - return ( - showPopoverCell(true)} - ref={ref} - disabled={disabled} - className="cell-collapse-padding" - sx={{ - height: "100%", - font: "inherit", - color: "inherit !important", - letterSpacing: "inherit", - textAlign: "inherit", - justifyContent: "flex-start", - }} - > - - {Array.isArray(value) && - value.map((snapshot) => ( - - - - ))} - - - {!disabled && ( - - )} - - ); -}); - -export default ConnectService; diff --git a/src/components/fields/ConnectService/index.tsx b/src/components/fields/ConnectService/index.tsx index fd34cda9..2495b867 100644 --- a/src/components/fields/ConnectService/index.tsx +++ b/src/components/fields/ConnectService/index.tsx @@ -1,15 +1,13 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withPopoverCell from "@src/components/fields/_withTableCell/withPopoverCell"; +import withTableCell from "@src/components/Table/withTableCell"; import ConnectServiceIcon from "@mui/icons-material/Http"; -import BasicCell from "@src/components/fields/_BasicCell/BasicCellNull"; -import InlineCell from "./InlineCell"; -import NullEditor from "@src/components/Table/editors/NullEditor"; +import DisplayCell from "./DisplayCell"; -const PopoverCell = lazy( +const EditorCell = lazy( () => - import("./PopoverCell" /* webpackChunkName: "PopoverCell-ConnectService" */) + import("./EditorCell" /* webpackChunkName: "EditorCell-ConnectService" */) ); const SideDrawerField = lazy( () => @@ -30,11 +28,10 @@ export const config: IFieldConfig = { icon: , description: "Connects to an external web service to fetch a list of results.", - TableCell: withPopoverCell(BasicCell, InlineCell, PopoverCell, { - anchorOrigin: { horizontal: "left", vertical: "bottom" }, - transparent: true, + TableCell: withTableCell(DisplayCell, EditorCell, "popover", { + disablePadding: true, + transparentPopover: true, }), - TableEditor: NullEditor as any, SideDrawerField, requireConfiguration: true, settings: Settings, diff --git a/src/components/fields/ConnectTable/DisplayCell.tsx b/src/components/fields/ConnectTable/DisplayCell.tsx new file mode 100644 index 00000000..75c0da2b --- /dev/null +++ b/src/components/fields/ConnectTable/DisplayCell.tsx @@ -0,0 +1,61 @@ +import { IDisplayCellProps } from "@src/components/fields/types"; + +import { ButtonBase, Grid, Chip } from "@mui/material"; +import { ChevronDown } from "@src/assets/icons"; + +import ChipList from "@src/components/Table/formatters/ChipList"; + +export default function ConnectTable({ + value, + showPopoverCell, + disabled, + column, + tabIndex, +}: IDisplayCellProps) { + const config = column.config ?? {}; + + const rendered = ( + + {Array.isArray(value) ? ( + value.map((item: any) => ( + + item.snapshot[key]) + .join(" ")} + /> + + )) + ) : value ? ( + + value.snapshot[key]) + .join(" ")} + /> + + ) : null} + + ); + + if (disabled) return rendered; + + return ( + showPopoverCell(true)} + style={{ + width: "100%", + height: "100%", + font: "inherit", + color: "inherit !important", + letterSpacing: "inherit", + textAlign: "inherit", + justifyContent: "flex-start", + }} + tabIndex={tabIndex} + > + {rendered} + + + ); +} diff --git a/src/components/fields/ConnectTable/PopoverCell.tsx b/src/components/fields/ConnectTable/EditorCell.tsx similarity index 79% rename from src/components/fields/ConnectTable/PopoverCell.tsx rename to src/components/fields/ConnectTable/EditorCell.tsx index 41192ef0..e4a7af9f 100644 --- a/src/components/fields/ConnectTable/PopoverCell.tsx +++ b/src/components/fields/ConnectTable/EditorCell.tsx @@ -1,16 +1,17 @@ -import { IPopoverCellProps } from "@src/components/fields/types"; +import { IEditorCellProps } from "@src/components/fields/types"; import ConnectTableSelect from "./ConnectTableSelect"; export default function ConnectTable({ value, + onChange, onSubmit, column, parentRef, showPopoverCell, row, disabled, -}: IPopoverCellProps) { +}: IEditorCellProps) { const config = column.config ?? {}; if (!config || !config.primaryKeys) return null; @@ -19,7 +20,7 @@ export default function ConnectTable({ row={row} column={column} value={value} - onChange={onSubmit} + onChange={onChange} config={(config as any) ?? {}} disabled={disabled} TextFieldProps={{ @@ -33,7 +34,10 @@ export default function ConnectTable({ }, }, }} - onClose={() => showPopoverCell(false)} + onClose={() => { + showPopoverCell(false); + onSubmit(); + }} loadBeforeOpen /> ); diff --git a/src/components/fields/ConnectTable/InlineCell.tsx b/src/components/fields/ConnectTable/InlineCell.tsx deleted file mode 100644 index 3f8f3147..00000000 --- a/src/components/fields/ConnectTable/InlineCell.tsx +++ /dev/null @@ -1,68 +0,0 @@ -import { forwardRef } from "react"; -import { IPopoverInlineCellProps } from "@src/components/fields/types"; - -import { ButtonBase, Grid, Chip } from "@mui/material"; -import { ChevronDown } from "@src/assets/icons"; - -import ChipList from "@src/components/Table/formatters/ChipList"; - -export const ConnectTable = forwardRef(function ConnectTable( - { value, showPopoverCell, disabled, column }: IPopoverInlineCellProps, - ref: React.Ref -) { - const config = column.config ?? {}; - - return ( - showPopoverCell(true)} - ref={ref} - disabled={disabled} - className="cell-collapse-padding" - sx={{ - height: "100%", - font: "inherit", - color: "inherit !important", - letterSpacing: "inherit", - textAlign: "inherit", - justifyContent: "flex-start", - }} - > - - {Array.isArray(value) ? ( - value.map((item: any) => ( - - item.snapshot[key]) - .join(" ")} - /> - - )) - ) : value ? ( - - value.snapshot[key]) - .join(" ")} - /> - - ) : null} - - - {!disabled && ( - - )} - - ); -}); - -export default ConnectTable; diff --git a/src/components/fields/ConnectTable/index.tsx b/src/components/fields/ConnectTable/index.tsx index 30fae9c4..e5cd002b 100644 --- a/src/components/fields/ConnectTable/index.tsx +++ b/src/components/fields/ConnectTable/index.tsx @@ -1,15 +1,12 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withPopoverCell from "@src/components/fields/_withTableCell/withPopoverCell"; +import withTableCell from "@src/components/Table/withTableCell"; import { ConnectTable as ConnectTableIcon } from "@src/assets/icons"; -import BasicCell from "@src/components/fields/_BasicCell/BasicCellNull"; -import InlineCell from "./InlineCell"; -import NullEditor from "@src/components/Table/editors/NullEditor"; +import DisplayCell from "./DisplayCell"; -const PopoverCell = lazy( - () => - import("./PopoverCell" /* webpackChunkName: "PopoverCell-ConnectTable" */) +const EditorCell = lazy( + () => import("./EditorCell" /* webpackChunkName: "EditorCell-ConnectTable" */) ); const SideDrawerField = lazy( () => @@ -31,11 +28,10 @@ export const config: IFieldConfig = { icon: , description: "Connects to an existing table to fetch a snapshot of values from a row. Requires Rowy Run and Algolia setup.", - TableCell: withPopoverCell(BasicCell, InlineCell, PopoverCell, { - anchorOrigin: { horizontal: "left", vertical: "bottom" }, - transparent: true, + TableCell: withTableCell(DisplayCell, EditorCell, "popover", { + disablePadding: true, + transparentPopover: true, }), - TableEditor: NullEditor as any, SideDrawerField, settings: Settings, requireConfiguration: true, diff --git a/src/components/fields/Connector/DisplayCell.tsx b/src/components/fields/Connector/DisplayCell.tsx new file mode 100644 index 00000000..8c6316bc --- /dev/null +++ b/src/components/fields/Connector/DisplayCell.tsx @@ -0,0 +1,48 @@ +import { IDisplayCellProps } from "@src/components/fields/types"; + +import { ButtonBase, Grid, Chip } from "@mui/material"; +import { ChevronDown } from "@src/assets/icons"; + +import ChipList from "@src/components/Table/formatters/ChipList"; +import { get } from "lodash-es"; +import { getLabel } from "./utils"; + +export default function Connector({ + value, + showPopoverCell, + disabled, + column, + tabIndex, +}: IDisplayCellProps) { + const rendered = ( + + {Array.isArray(value) && + value.map((item) => ( + + + + ))} + + ); + + if (disabled) return rendered; + + return ( + showPopoverCell(true)} + sx={{ + width: "100%", + height: "100%", + font: "inherit", + color: "inherit !important", + letterSpacing: "inherit", + textAlign: "inherit", + justifyContent: "flex-start", + }} + tabIndex={tabIndex} + > + {rendered} + + + ); +} diff --git a/src/components/fields/Connector/EditorCell.tsx b/src/components/fields/Connector/EditorCell.tsx new file mode 100644 index 00000000..e665af15 --- /dev/null +++ b/src/components/fields/Connector/EditorCell.tsx @@ -0,0 +1,25 @@ +import { Suspense } from "react"; +import { IEditorCellProps } from "@src/components/fields/types"; + +import PopupContents from "./Select/PopupContents"; +import Loading from "@src/components/Loading"; + +export default function Connector({ + value, + onChange, + column, + disabled, + _rowy_ref, +}: IEditorCellProps) { + return ( + }> + + + ); +} diff --git a/src/components/fields/Connector/InlineCell.tsx b/src/components/fields/Connector/InlineCell.tsx deleted file mode 100644 index bd99142e..00000000 --- a/src/components/fields/Connector/InlineCell.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import { forwardRef } from "react"; -import { IPopoverInlineCellProps } from "@src/components/fields/types"; - -import { ButtonBase, Grid, Chip } from "@mui/material"; -import { ChevronDown } from "@src/assets/icons"; - -import ChipList from "@src/components/Table/formatters/ChipList"; -import { get } from "lodash-es"; -import { getLabel } from "./utils"; - -export const Connector = forwardRef(function Connector( - { value, showPopoverCell, disabled, column }: IPopoverInlineCellProps, - ref: React.Ref -) { - const config = column.config ?? {}; - const displayKey = config.titleKey ?? config.primaryKey; - return ( - showPopoverCell(true)} - ref={ref} - disabled={disabled} - className="cell-collapse-padding" - sx={{ - height: "100%", - font: "inherit", - color: "inherit !important", - letterSpacing: "inherit", - textAlign: "inherit", - justifyContent: "flex-start", - }} - > - - {Array.isArray(value) && - value.map((item) => ( - - - - ))} - - - {!disabled && ( - - )} - - ); -}); - -export default Connector; diff --git a/src/components/fields/Connector/PopoverCell.tsx b/src/components/fields/Connector/PopoverCell.tsx deleted file mode 100644 index e52e94ea..00000000 --- a/src/components/fields/Connector/PopoverCell.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { IPopoverCellProps } from "@src/components/fields/types"; - -import Selector from "./Select"; - -export default function ConnectService({ - value, - onSubmit, - column, - parentRef, - showPopoverCell, - disabled, - docRef, -}: IPopoverCellProps) { - return ( - showPopoverCell(false), - }, - }} - /> - ); -} diff --git a/src/components/fields/Connector/Select/PopupContents.tsx b/src/components/fields/Connector/Select/PopupContents.tsx index 29453471..941418c7 100644 --- a/src/components/fields/Connector/Select/PopupContents.tsx +++ b/src/components/fields/Connector/Select/PopupContents.tsx @@ -1,5 +1,4 @@ -import React, { useEffect, useState } from "react"; -import clsx from "clsx"; +import { useEffect, useState } from "react"; import { useDebouncedCallback } from "use-debounce"; import { get } from "lodash-es"; import { useAtom } from "jotai"; @@ -7,7 +6,6 @@ import { useAtom } from "jotai"; import { Button, Checkbox, - Divider, Grid, InputAdornment, List, @@ -21,7 +19,6 @@ import { import SearchIcon from "@mui/icons-material/Search"; import { IConnectorSelectProps } from "."; -import useStyles from "./styles"; import Loading from "@src/components/Loading"; import { getLabel } from "@src/components/fields/Connector/utils"; import { useSnackbar } from "notistack"; @@ -37,7 +34,7 @@ export default function PopupContents({ value = [], onChange, column, - docRef, + _rowy_ref, }: IPopupContentsProps) { const [rowyRun] = useAtom(rowyRunAtom, projectScope); const [tableSettings] = useAtom(tableSettingsAtom, tableScope); @@ -48,8 +45,6 @@ export default function PopupContents({ const elementId = config.elementId; const multiple = Boolean(config.multiple); - const { classes } = useStyles(); - // Webservice search query const [query, setQuery] = useState(""); // Webservice response @@ -75,7 +70,7 @@ export default function PopupContents({ columnKey: column.key, query: query, schemaDocPath: getTableSchemaPath(tableSettings), - rowDocPath: docRef.path, + rowDocPath: _rowy_ref.path, }, }); setResponse(resp); @@ -105,93 +100,88 @@ export default function PopupContents({ const clearSelection = () => onChange([]); return ( - - + + setQuery(e.target.value)} fullWidth variant="filled" - margin="dense" label="Search items" - className={classes.noMargins} + hiddenLabel + placeholder="Search items" InputProps={{ - endAdornment: ( - + startAdornment: ( + ), }} + InputLabelProps={{ className: "visually-hidden" }} onClick={(e) => e.stopPropagation()} onKeyDown={(e) => e.stopPropagation()} /> - - + + {hits.map((hit) => { const isSelected = selectedValues.some((v) => v === hit[elementId]); return ( - - = config.max - } - > - - {multiple ? ( - - ) : ( - - )} - - - - - + = config.max} + disableGutters + style={{ margin: 0, width: "100%" }} + > + + {multiple ? ( + + ) : ( + + )} + + + ); })} {multiple && ( - + - + {value?.length} of {hits?.length} @@ -199,9 +189,9 @@ export default function PopupContents({ disabled={!value || value.length === 0} onClick={clearSelection} color="primary" - className={classes.selectAllButton} + variant="text" > - Clear selection + Clear diff --git a/src/components/fields/Connector/Select/index.tsx b/src/components/fields/Connector/Select/index.tsx index 9e09ba40..2025ec37 100644 --- a/src/components/fields/Connector/Select/index.tsx +++ b/src/components/fields/Connector/Select/index.tsx @@ -24,7 +24,7 @@ export interface IConnectorSelectProps { className?: string; /** Override any props of the root MUI `TextField` component */ TextFieldProps?: Partial; - docRef: TableRowRef; + _rowy_ref: TableRowRef; disabled?: boolean; } @@ -56,7 +56,11 @@ export default function ConnectorSelect({ // prop for this component to a comma-separated string MenuProps: { classes: { paper: classes.paper, list: classes.menuChild }, - MenuListProps: { disablePadding: true }, + MenuListProps: { + disablePadding: true, + style: { padding: 0 }, + component: "div", + } as any, anchorOrigin: { vertical: "bottom", horizontal: "center" }, transformOrigin: { vertical: "top", horizontal: "center" }, ...TextFieldProps.SelectProps?.MenuProps, diff --git a/src/components/fields/Connector/SideDrawerField.tsx b/src/components/fields/Connector/SideDrawerField.tsx index feccb0aa..b97f1491 100644 --- a/src/components/fields/Connector/SideDrawerField.tsx +++ b/src/components/fields/Connector/SideDrawerField.tsx @@ -11,7 +11,6 @@ export default function Connector({ column, _rowy_ref, value, - onDirty, onChange, onSubmit, disabled, @@ -32,7 +31,7 @@ export default function Connector({ column={column} value={value} onChange={onChange} - docRef={_rowy_ref as any} + _rowy_ref={_rowy_ref} TextFieldProps={{ label: "", hiddenLabel: true, @@ -50,7 +49,6 @@ export default function Connector({ {value.map((item) => { const key = get(item, config.elementId); - console.log(key, item); return ( - import("./PopoverCell" /* webpackChunkName: "PopoverCell-ConnectService" */) + import("./EditorCell" /* webpackChunkName: "EditorCell-ConnectService" */) ); const SideDrawerField = lazy( () => @@ -30,11 +29,9 @@ export const config: IFieldConfig = { icon: , description: "Connects to any table or API to fetch a list of results based on a text query or row data.", - TableCell: withPopoverCell(BasicCell, InlineCell, PopoverCell, { - anchorOrigin: { horizontal: "left", vertical: "bottom" }, - transparent: true, + TableCell: withTableCell(DisplayCell, EditorCell, "popover", { + disablePadding: true, }), - TableEditor: NullEditor as any, SideDrawerField, requireConfiguration: true, settings: Settings, diff --git a/src/components/fields/CreatedAt/TableCell.tsx b/src/components/fields/CreatedAt/DisplayCell.tsx similarity index 70% rename from src/components/fields/CreatedAt/TableCell.tsx rename to src/components/fields/CreatedAt/DisplayCell.tsx index b659618d..04b56517 100644 --- a/src/components/fields/CreatedAt/TableCell.tsx +++ b/src/components/fields/CreatedAt/DisplayCell.tsx @@ -1,9 +1,9 @@ -import { IHeavyCellProps } from "@src/components/fields/types"; +import { IDisplayCellProps } from "@src/components/fields/types"; import { format } from "date-fns"; import { DATE_TIME_FORMAT } from "@src/constants/dates"; -export default function CreatedAt({ column, value }: IHeavyCellProps) { +export default function CreatedAt({ column, value }: IDisplayCellProps) { if (!value) return null; const dateLabel = format( value.toDate ? value.toDate() : value, diff --git a/src/components/fields/CreatedAt/index.tsx b/src/components/fields/CreatedAt/index.tsx index 7f306509..151466fe 100644 --- a/src/components/fields/CreatedAt/index.tsx +++ b/src/components/fields/CreatedAt/index.tsx @@ -1,14 +1,10 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withHeavyCell from "@src/components/fields/_withTableCell/withHeavyCell"; +import withTableCell from "@src/components/Table/withTableCell"; import { CreatedAt as CreatedAtIcon } from "@src/assets/icons"; -import BasicCell from "@src/components/fields/_BasicCell/BasicCellNull"; -import withSideDrawerEditor from "@src/components/Table/editors/withSideDrawerEditor"; +import DisplayCell from "./DisplayCell"; -const TableCell = lazy( - () => import("./TableCell" /* webpackChunkName: "TableCell-CreatedAt" */) -); const SideDrawerField = lazy( () => import( @@ -28,8 +24,7 @@ export const config: IFieldConfig = { initialValue: null, icon: , description: "Displays the timestamp of when the row was created. Read-only.", - TableCell: withHeavyCell(BasicCell, TableCell), - TableEditor: withSideDrawerEditor(TableCell), + TableCell: withTableCell(DisplayCell, null), SideDrawerField, settings: Settings, }; diff --git a/src/components/fields/CreatedBy/TableCell.tsx b/src/components/fields/CreatedBy/DisplayCell.tsx similarity index 85% rename from src/components/fields/CreatedBy/TableCell.tsx rename to src/components/fields/CreatedBy/DisplayCell.tsx index 69cc68e9..17ca0396 100644 --- a/src/components/fields/CreatedBy/TableCell.tsx +++ b/src/components/fields/CreatedBy/DisplayCell.tsx @@ -1,11 +1,11 @@ -import { IHeavyCellProps } from "@src/components/fields/types"; +import { IDisplayCellProps } from "@src/components/fields/types"; import { Tooltip, Stack, Avatar } from "@mui/material"; import { format } from "date-fns"; import { DATE_TIME_FORMAT } from "@src/constants/dates"; -export default function CreatedBy({ column, value }: IHeavyCellProps) { +export default function CreatedBy({ column, value }: IDisplayCellProps) { if (!value || !value.displayName || !value.timestamp) return null; const dateLabel = format( value.timestamp.toDate ? value.timestamp.toDate() : value.timestamp, diff --git a/src/components/fields/CreatedBy/index.tsx b/src/components/fields/CreatedBy/index.tsx index c844ec51..8bb0329c 100644 --- a/src/components/fields/CreatedBy/index.tsx +++ b/src/components/fields/CreatedBy/index.tsx @@ -1,14 +1,10 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withHeavyCell from "@src/components/fields/_withTableCell/withHeavyCell"; +import withTableCell from "@src/components/Table/withTableCell"; import { CreatedBy as CreatedByIcon } from "@src/assets/icons"; -import BasicCell from "@src/components/fields/_BasicCell/BasicCellNull"; -import withSideDrawerEditor from "@src/components/Table/editors/withSideDrawerEditor"; +import DisplayCell from "./DisplayCell"; -const TableCell = lazy( - () => import("./TableCell" /* webpackChunkName: "TableCell-CreatedBy" */) -); const SideDrawerField = lazy( () => import( @@ -29,8 +25,7 @@ export const config: IFieldConfig = { icon: , description: "Displays the user that created the row and timestamp. Read-only.", - TableCell: withHeavyCell(BasicCell, TableCell), - TableEditor: withSideDrawerEditor(TableCell), + TableCell: withTableCell(DisplayCell, null), SideDrawerField, settings: Settings, }; diff --git a/src/components/fields/Date/BasicCell.tsx b/src/components/fields/Date/DisplayCell.tsx similarity index 51% rename from src/components/fields/Date/BasicCell.tsx rename to src/components/fields/Date/DisplayCell.tsx index 11181f9a..719f2801 100644 --- a/src/components/fields/Date/BasicCell.tsx +++ b/src/components/fields/Date/DisplayCell.tsx @@ -1,20 +1,24 @@ -import { IBasicCellProps } from "@src/components/fields/types"; +import { IDisplayCellProps } from "@src/components/fields/types"; import { isFunction, isDate } from "lodash-es"; import { format } from "date-fns"; import { DATE_FORMAT } from "@src/constants/dates"; -export default function Date_({ - value, - format: formatProp, -}: IBasicCellProps & { format?: string }) { +export default function Date_({ value, column }: IDisplayCellProps) { if ((!!value && isFunction(value.toDate)) || isDate(value)) { try { const formatted = format( isDate(value) ? value : value.toDate(), - formatProp || DATE_FORMAT + column.config?.format || DATE_FORMAT ); return ( - {formatted} +
    + {formatted} +
    ); } catch (e) { return null; diff --git a/src/components/fields/Date/TableCell.tsx b/src/components/fields/Date/EditorCell.tsx similarity index 69% rename from src/components/fields/Date/TableCell.tsx rename to src/components/fields/Date/EditorCell.tsx index 08295168..2b9523ed 100644 --- a/src/components/fields/Date/TableCell.tsx +++ b/src/components/fields/Date/EditorCell.tsx @@ -1,5 +1,5 @@ import { useDebouncedCallback } from "use-debounce"; -import { IHeavyCellProps } from "@src/components/fields/types"; +import { IEditorCellProps } from "@src/components/fields/types"; import DatePicker from "@mui/lab/DatePicker"; import { TextField } from "@mui/material"; @@ -7,33 +7,25 @@ import { ChevronDown } from "@src/assets/icons"; import { transformValue, sanitizeValue } from "./utils"; import { DATE_FORMAT } from "@src/constants/dates"; -import BasicCell from "./BasicCell"; export default function Date_({ column, value, disabled, + onChange, onSubmit, -}: IHeavyCellProps) { + tabIndex, +}: IEditorCellProps) { const format = column.config?.format ?? DATE_FORMAT; const transformedValue = transformValue(value); const handleDateChange = useDebouncedCallback((date: Date | null) => { const sanitized = sanitizeValue(date); if (sanitized === undefined) return; - onSubmit(sanitized); + onChange(sanitized); + onSubmit(); }, 500); - if (disabled) - return ( - - ); - return ( ( @@ -43,24 +35,21 @@ export default function Date_({ label="" hiddenLabel aria-label={column.name as string} - className="cell-collapse-padding" sx={{ width: "100%", height: "100%", - "& .MuiInputBase-root": { + "&& .MuiInputBase-root": { height: "100%", font: "inherit", // Prevent text jumping letterSpacing: "inherit", // Prevent text jumping - ".rdg-cell &": { - background: "none !important", - boxShadow: "none", - borderRadius: 0, - padding: 0, + background: "none !important", + boxShadow: "none", + borderRadius: 0, + padding: 0, - "&::after": { width: "100%", left: 0 }, - }, + "&::after": { width: "100%", left: 0 }, }, "& .MuiInputBase-input": { height: "100%", @@ -68,11 +57,9 @@ export default function Date_({ letterSpacing: "inherit", // Prevent text jumping fontVariantNumeric: "tabular-nums", - ".rdg-cell &": { - padding: "var(--cell-padding)", - pr: 0, - pb: 1 / 8, - }, + padding: "0 var(--cell-padding)", + pr: 0, + pb: 1 / 8, }, "& .MuiInputAdornment-root": { m: 0 }, }} @@ -81,6 +68,7 @@ export default function Date_({ onKeyDown={(e) => e.stopPropagation()} // Touch mode: make the whole field clickable onClick={props.inputProps?.onClick as any} + inputProps={{ ...props.inputProps, tabIndex }} /> )} label={column.name} @@ -91,12 +79,13 @@ export default function Date_({ clearable OpenPickerButtonProps={{ size: "small", - className: "row-hover-iconButton", + className: "row-hover-iconButton end", edge: false, - sx: { mr: 3 / 8, width: 32, height: 32 }, + tabIndex, }} components={{ OpenPickerIcon: ChevronDown }} disableOpenPicker={false} + disabled={disabled} /> ); } diff --git a/src/components/fields/Date/index.tsx b/src/components/fields/Date/index.tsx index a4a6e353..fdc634d0 100644 --- a/src/components/fields/Date/index.tsx +++ b/src/components/fields/Date/index.tsx @@ -1,16 +1,15 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withHeavyCell from "@src/components/fields/_withTableCell/withHeavyCell"; +import withTableCell from "@src/components/Table/withTableCell"; import { parse, format } from "date-fns"; import { DATE_FORMAT } from "@src/constants/dates"; import DateIcon from "@mui/icons-material/TodayOutlined"; -import BasicCell from "./BasicCell"; -import NullEditor from "@src/components/Table/editors/NullEditor"; +import DisplayCell from "./DisplayCell"; import { filterOperators, valueFormatter } from "./filters"; -const TableCell = lazy( - () => import("./TableCell" /* webpackChunkName: "TableCell-Date" */) +const EditorCell = lazy( + () => import("./EditorCell" /* webpackChunkName: "EditorCell-Date" */) ); const SideDrawerField = lazy( () => @@ -29,8 +28,9 @@ export const config: IFieldConfig = { initializable: true, icon: , description: `Formatted date. Format is configurable, default: ${DATE_FORMAT}. Edited with a visual picker.`, - TableCell: withHeavyCell(BasicCell, TableCell), - TableEditor: NullEditor as any, + TableCell: withTableCell(DisplayCell, EditorCell, "inline", { + disablePadding: true, + }), SideDrawerField, filter: { operators: filterOperators, valueFormatter }, settings: Settings, diff --git a/src/components/fields/DateTime/BasicCell.tsx b/src/components/fields/DateTime/DisplayCell.tsx similarity index 51% rename from src/components/fields/DateTime/BasicCell.tsx rename to src/components/fields/DateTime/DisplayCell.tsx index 6c4bac2f..f104d979 100644 --- a/src/components/fields/DateTime/BasicCell.tsx +++ b/src/components/fields/DateTime/DisplayCell.tsx @@ -1,20 +1,24 @@ -import { IBasicCellProps } from "@src/components/fields/types"; +import { IDisplayCellProps } from "@src/components/fields/types"; import { isFunction, isDate } from "lodash-es"; import { format } from "date-fns"; import { DATE_TIME_FORMAT } from "@src/constants/dates"; -export default function DateTime({ - value, - format: formatProp, -}: IBasicCellProps & { format?: string }) { +export default function DateTime({ value, column }: IDisplayCellProps) { if ((!!value && isFunction(value.toDate)) || isDate(value)) { try { const formatted = format( isDate(value) ? value : value.toDate(), - formatProp || DATE_TIME_FORMAT + column.config?.format || DATE_TIME_FORMAT ); return ( - {formatted} +
    + {formatted} +
    ); } catch (e) { return null; diff --git a/src/components/fields/DateTime/TableCell.tsx b/src/components/fields/DateTime/EditorCell.tsx similarity index 70% rename from src/components/fields/DateTime/TableCell.tsx rename to src/components/fields/DateTime/EditorCell.tsx index 53439ff0..acf8ca69 100644 --- a/src/components/fields/DateTime/TableCell.tsx +++ b/src/components/fields/DateTime/EditorCell.tsx @@ -1,5 +1,5 @@ import { useDebouncedCallback } from "use-debounce"; -import { IHeavyCellProps } from "@src/components/fields/types"; +import { IEditorCellProps } from "@src/components/fields/types"; import { setSeconds } from "date-fns"; import DateTimePicker from "@mui/lab/DateTimePicker"; @@ -11,34 +11,26 @@ import { sanitizeValue, } from "@src/components/fields/Date/utils"; import { DATE_TIME_FORMAT } from "@src/constants/dates"; -import BasicCell from "./BasicCell"; export default function DateTime({ column, value, disabled, + onChange, onSubmit, -}: IHeavyCellProps) { + tabIndex, +}: IEditorCellProps) { const transformedValue = transformValue(value); const handleDateChange = useDebouncedCallback((date: Date | null) => { const sanitized = sanitizeValue(date); if (!sanitized) return; // Temp disable setting it to null - onSubmit(sanitized); + onChange(sanitized); + onSubmit(); }, 500); const format = column.config?.format ?? DATE_TIME_FORMAT; - if (disabled) - return ( - - ); - return ( ( @@ -48,24 +40,21 @@ export default function DateTime({ label="" hiddenLabel aria-label={column.name as string} - className="cell-collapse-padding" sx={{ width: "100%", height: "100%", - "& .MuiInputBase-root": { + "&& .MuiInputBase-root": { height: "100%", font: "inherit", // Prevent text jumping letterSpacing: "inherit", // Prevent text jumping - ".rdg-cell &": { - background: "none !important", - boxShadow: "none", - borderRadius: 0, - padding: 0, + background: "none !important", + boxShadow: "none", + borderRadius: 0, + padding: 0, - "&::after": { width: "100%", left: 0 }, - }, + "&::after": { width: "100%", left: 0 }, }, "& .MuiInputBase-input": { height: "100%", @@ -73,11 +62,9 @@ export default function DateTime({ letterSpacing: "inherit", // Prevent text jumping fontVariantNumeric: "tabular-nums", - ".rdg-cell &": { - padding: "var(--cell-padding)", - pr: 0, - pb: 1 / 8, - }, + padding: "0 var(--cell-padding)", + pr: 0, + pb: 1 / 8, }, "& .MuiInputAdornment-root": { m: 0 }, }} @@ -86,22 +73,23 @@ export default function DateTime({ onKeyDown={(e) => e.stopPropagation()} // Touch mode: make the whole field clickable onClick={props.inputProps?.onClick as any} + inputProps={{ ...props.inputProps, tabIndex }} /> )} label={column.name} value={transformedValue} onChange={(date) => handleDateChange(date ? setSeconds(date, 0) : null)} inputFormat={format} - mask={format.replace(/[A-Za-z]/g, "_")} clearable OpenPickerButtonProps={{ size: "small", - className: "row-hover-iconButton", + className: "row-hover-iconButton end", edge: false, - sx: { mr: 3 / 8, width: 32, height: 32 }, + tabIndex, }} components={{ OpenPickerIcon: ChevronDown }} disableOpenPicker={false} + disabled={disabled} /> ); } diff --git a/src/components/fields/DateTime/index.tsx b/src/components/fields/DateTime/index.tsx index 880557a0..dade54b4 100644 --- a/src/components/fields/DateTime/index.tsx +++ b/src/components/fields/DateTime/index.tsx @@ -1,16 +1,15 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withHeavyCell from "@src/components/fields/_withTableCell/withHeavyCell"; +import withTableCell from "@src/components/Table/withTableCell"; import { parseJSON, format } from "date-fns"; import { DATE_TIME_FORMAT } from "@src/constants/dates"; import DateTimeIcon from "@mui/icons-material/AccessTime"; -import BasicCell from "./BasicCell"; -import NullEditor from "@src/components/Table/editors/NullEditor"; +import DisplayCell from "./DisplayCell"; import { filterOperators, valueFormatter } from "./filters"; -const TableCell = lazy( - () => import("./TableCell" /* webpackChunkName: "TableCell-DateTime" */) +const EditorCell = lazy( + () => import("./EditorCell" /* webpackChunkName: "EditorCell-DateTime" */) ); const SideDrawerField = lazy( () => @@ -37,8 +36,9 @@ export const config: IFieldConfig = { initializable: true, icon: , description: `Formatted date & time. Format is configurable, default: ${DATE_TIME_FORMAT}. Edited with a visual picker.`, - TableCell: withHeavyCell(BasicCell, TableCell), - TableEditor: NullEditor as any, + TableCell: withTableCell(DisplayCell, EditorCell, "inline", { + disablePadding: true, + }), SideDrawerField, filter: { operators: filterOperators, diff --git a/src/components/fields/Derivative/index.tsx b/src/components/fields/Derivative/index.tsx index a42f2f8c..f37897ed 100644 --- a/src/components/fields/Derivative/index.tsx +++ b/src/components/fields/Derivative/index.tsx @@ -1,9 +1,7 @@ import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withBasicCell from "@src/components/fields/_withTableCell/withBasicCell"; +import withTableCell from "@src/components/Table/withTableCell"; import { Derivative as DerivativeIcon } from "@src/assets/icons"; -import BasicCell from "@src/components/fields/_BasicCell/BasicCellNull"; -import NullEditor from "@src/components/Table/editors/NullEditor"; import Settings, { settingsValidator } from "./Settings"; import ContextMenuActions from "./ContextMenuActions"; @@ -17,9 +15,8 @@ export const config: IFieldConfig = { icon: , description: "Value derived from the rest of the row’s values. Displayed using any other field type. Requires Rowy Run set up.", - TableCell: withBasicCell(BasicCell), - TableEditor: NullEditor as any, - SideDrawerField: BasicCell as any, + TableCell: withTableCell(() => null, null), + SideDrawerField: () => null as any, contextMenuActions: ContextMenuActions, settings: Settings, settingsValidator, diff --git a/src/components/fields/Duration/TableCell.tsx b/src/components/fields/Duration/DisplayCell.tsx similarity index 67% rename from src/components/fields/Duration/TableCell.tsx rename to src/components/fields/Duration/DisplayCell.tsx index 78be60c0..a5bade41 100644 --- a/src/components/fields/Duration/TableCell.tsx +++ b/src/components/fields/Duration/DisplayCell.tsx @@ -1,8 +1,8 @@ -import { IBasicCellProps } from "@src/components/fields/types"; +import { IDisplayCellProps } from "@src/components/fields/types"; import { getDurationString } from "./utils"; -export default function Duration({ value }: IBasicCellProps) { +export default function Duration({ value }: IDisplayCellProps) { if ( !value || !value.start || diff --git a/src/components/fields/Duration/index.tsx b/src/components/fields/Duration/index.tsx index 92d42ef9..56f05132 100644 --- a/src/components/fields/Duration/index.tsx +++ b/src/components/fields/Duration/index.tsx @@ -1,14 +1,10 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withBasicCell from "@src/components/fields/_withTableCell/withBasicCell"; +import withTableCell from "@src/components/Table/withTableCell"; import DurationIcon from "@mui/icons-material/TimerOutlined"; -import BasicCell from "@src/components/fields/_BasicCell/BasicCellNull"; -import withSideDrawerEditor from "@src/components/Table/editors/withSideDrawerEditor"; +import DisplayCell from "./DisplayCell"; -const TableCell = lazy( - () => import("./TableCell" /* webpackChunkName: "TableCell-Duration" */) -); const SideDrawerField = lazy( () => import( @@ -24,8 +20,9 @@ export const config: IFieldConfig = { initialValue: {}, icon: , description: "Duration calculated from two timestamps.", - TableCell: withBasicCell(TableCell), - TableEditor: withSideDrawerEditor(TableCell), + TableCell: withTableCell(DisplayCell, SideDrawerField, "popover", { + popoverProps: { PaperProps: { sx: { p: 1 } } }, + }), SideDrawerField, }; export default config; diff --git a/src/components/fields/GeoPoint/TableCell.tsx b/src/components/fields/GeoPoint/DisplayCell.tsx similarity index 90% rename from src/components/fields/GeoPoint/TableCell.tsx rename to src/components/fields/GeoPoint/DisplayCell.tsx index 2e57a835..f452c3fc 100644 --- a/src/components/fields/GeoPoint/TableCell.tsx +++ b/src/components/fields/GeoPoint/DisplayCell.tsx @@ -1,7 +1,7 @@ -import { IBasicCellProps } from "@src/components/fields/types"; +import { IDisplayCellProps } from "@src/components/fields/types"; import { Typography } from "@mui/material"; -export default function GeoPoint({ value }: IBasicCellProps) { +export default function GeoPoint({ value }: IDisplayCellProps) { if (!value) return null; const { latitude, longitude } = value; diff --git a/src/components/fields/GeoPoint/index.tsx b/src/components/fields/GeoPoint/index.tsx index 21b898b1..481198f6 100644 --- a/src/components/fields/GeoPoint/index.tsx +++ b/src/components/fields/GeoPoint/index.tsx @@ -1,14 +1,11 @@ import { lazy } from "react"; import { GeoPoint } from "firebase/firestore"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withBasicCell from "@src/components/fields/_withTableCell/withBasicCell"; +import withTableCell from "@src/components/Table/withTableCell"; import GeoPointIcon from "@mui/icons-material/PinDropOutlined"; -import withSideDrawerEditor from "@src/components/Table/editors/withSideDrawerEditor"; +import DisplayCell from "./DisplayCell"; -const TableCell = lazy( - () => import("./TableCell" /* webpackChunkName: "TableCell-GeoPoint" */) -); const SideDrawerField = lazy( () => import( @@ -24,8 +21,9 @@ export const config: IFieldConfig = { initialValue: {}, icon: , description: "Geo point is represented as latitude/longitude pair.", - TableCell: withBasicCell(TableCell), - TableEditor: withSideDrawerEditor(TableCell), + TableCell: withTableCell(DisplayCell, SideDrawerField, "popover", { + popoverProps: { PaperProps: { sx: { p: 1, pt: 0 } } }, + }), SideDrawerField, csvImportParser: (value: string) => { try { @@ -35,7 +33,7 @@ export const config: IFieldConfig = { } throw new Error(); } catch (e) { - console.error("Invalid Geopoint value"); + console.error("Invalid GeoPoint value"); return null; } }, diff --git a/src/components/fields/Id/index.tsx b/src/components/fields/Id/index.tsx index 757ed231..0b2a5b85 100644 --- a/src/components/fields/Id/index.tsx +++ b/src/components/fields/Id/index.tsx @@ -1,10 +1,14 @@ +import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; import withTableCell from "@src/components/Table/withTableCell"; import DisplayCell from "./DisplayCell"; -import SideDrawerField from "./SideDrawerField"; import { Id as IdIcon } from "@src/assets/icons"; +const SideDrawerField = lazy( + () => import("./SideDrawerField" /* webpackChunkName: "SideDrawerField-Id" */) +); + export const config: IFieldConfig = { type: FieldType.id, name: "ID", diff --git a/src/components/fields/Json/BasicCell.tsx b/src/components/fields/Json/DisplayCell.tsx similarity index 66% rename from src/components/fields/Json/BasicCell.tsx rename to src/components/fields/Json/DisplayCell.tsx index ababa833..82a1eea1 100644 --- a/src/components/fields/Json/BasicCell.tsx +++ b/src/components/fields/Json/DisplayCell.tsx @@ -1,21 +1,21 @@ import stringify from "json-stable-stringify-without-jsonify"; -import { IBasicCellProps } from "@src/components/fields/types"; +import { IDisplayCellProps } from "@src/components/fields/types"; import { useTheme } from "@mui/material"; -export default function Json({ value }: IBasicCellProps) { +export default function Json({ value }: IDisplayCellProps) { const theme = useTheme(); if (!value) return null; - const formattedJson = stringify(value, { space: 2 }); + const formattedJson = stringify(value, { space: 2 }).substring(0, 1000); return (
    diff --git a/src/components/fields/Json/index.tsx b/src/components/fields/Json/index.tsx index 8981d877..a847f009 100644 --- a/src/components/fields/Json/index.tsx +++ b/src/components/fields/Json/index.tsx @@ -1,10 +1,9 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withBasicCell from "@src/components/fields/_withTableCell/withBasicCell"; +import withTableCell from "@src/components/Table/withTableCell"; import { Json as JsonIcon } from "@src/assets/icons"; -import BasicCell from "./BasicCell"; -import withSideDrawerEditor from "@src/components/Table/editors/withSideDrawerEditor"; +import DisplayCell from "./DisplayCell"; import ContextMenuActions from "./ContextMenuActions"; const SideDrawerField = lazy( @@ -25,8 +24,9 @@ export const config: IFieldConfig = { initializable: true, icon: , description: "Object edited with a visual JSON editor.", - TableCell: withBasicCell(BasicCell), - TableEditor: withSideDrawerEditor(BasicCell), + TableCell: withTableCell(DisplayCell, SideDrawerField, "popover", { + popoverProps: { PaperProps: { sx: { p: 1 } } }, + }), csvImportParser: (value) => { try { return JSON.parse(value); diff --git a/src/components/fields/LongText/index.tsx b/src/components/fields/LongText/index.tsx index ef0ce27c..6685d26c 100644 --- a/src/components/fields/LongText/index.tsx +++ b/src/components/fields/LongText/index.tsx @@ -5,11 +5,16 @@ import withTableCell from "@src/components/Table/withTableCell"; import LongTextIcon from "@mui/icons-material/Notes"; import DisplayCell from "./DisplayCell"; import EditorCell from "./EditorCell"; -import SideDrawerField from "./SideDrawerField"; import { filterOperators } from "./Filter"; import BasicContextMenuActions from "@src/components/fields/_BasicCell/BasicCellContextMenuActions"; +const SideDrawerField = lazy( + () => + import( + "./SideDrawerField" /* webpackChunkName: "SideDrawerField-LongText" */ + ) +); const Settings = lazy( () => import("./Settings" /* webpackChunkName: "Settings-LongText" */) ); diff --git a/src/components/fields/Markdown/BasicCell.tsx b/src/components/fields/Markdown/DisplayCell.tsx similarity index 75% rename from src/components/fields/Markdown/BasicCell.tsx rename to src/components/fields/Markdown/DisplayCell.tsx index 37e825c1..8fe5d93f 100644 --- a/src/components/fields/Markdown/BasicCell.tsx +++ b/src/components/fields/Markdown/DisplayCell.tsx @@ -1,10 +1,10 @@ -import { IBasicCellProps } from "@src/components/fields/types"; +import { IDisplayCellProps } from "@src/components/fields/types"; import { useTheme } from "@mui/material"; import MDEditor from "@uiw/react-md-editor"; -export default function Markdown({ value }: IBasicCellProps) { +export default function Markdown({ value }: IDisplayCellProps) { const theme = useTheme(); if (!value || typeof value !== "string") return null; diff --git a/src/components/fields/Markdown/SideDrawerField.tsx b/src/components/fields/Markdown/SideDrawerField.tsx index 815c539d..2b51d9b1 100644 --- a/src/components/fields/Markdown/SideDrawerField.tsx +++ b/src/components/fields/Markdown/SideDrawerField.tsx @@ -34,7 +34,7 @@ export default function Markdown({ { display: "block", padding: 0, - "& .wmde-markdown-var": { boxShadow: "none" }, + "& .wmde-markdown-var": { boxShadow: (fieldSx as any)?.boxShadow }, }, ]} data-color-mode={theme.palette.mode} diff --git a/src/components/fields/Markdown/index.tsx b/src/components/fields/Markdown/index.tsx index 6053f093..23776019 100644 --- a/src/components/fields/Markdown/index.tsx +++ b/src/components/fields/Markdown/index.tsx @@ -1,10 +1,9 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withBasicCell from "@src/components/fields/_withTableCell/withBasicCell"; +import withTableCell from "@src/components/Table/withTableCell"; import { Markdown as MarkdownIcon } from "@src/assets/icons"; -import BasicCell from "./BasicCell"; -import withSideDrawerEditor from "@src/components/Table/editors/withSideDrawerEditor"; +import DisplayCell from "./DisplayCell"; const SideDrawerField = lazy( () => @@ -22,8 +21,7 @@ export const config: IFieldConfig = { initializable: true, icon: , description: "Markdown editor with preview", - TableCell: withBasicCell(BasicCell), - TableEditor: withSideDrawerEditor(BasicCell), + TableCell: withTableCell(DisplayCell, SideDrawerField, "popover"), SideDrawerField, }; export default config; diff --git a/src/components/fields/MultiSelect/DisplayCell.tsx b/src/components/fields/MultiSelect/DisplayCell.tsx index 91bcee84..eb5e8267 100644 --- a/src/components/fields/MultiSelect/DisplayCell.tsx +++ b/src/components/fields/MultiSelect/DisplayCell.tsx @@ -1,6 +1,6 @@ import { IDisplayCellProps } from "@src/components/fields/types"; -import { ButtonBase, Grid } from "@mui/material"; +import { ButtonBase, Grid, Tooltip } from "@mui/material"; import WarningIcon from "@mui/icons-material/WarningAmber"; import { ChevronDown } from "@src/assets/icons"; @@ -14,13 +14,33 @@ export default function MultiSelect({ disabled, tabIndex, }: IDisplayCellProps) { - // if (typeof value === "string" && value !== "") - // return ; + const rendered = + typeof value === "string" && value !== "" ? ( +
    + + + +   + {value} +
    + ) : ( + + {sanitiseValue(value).map( + (item) => + typeof item === "string" && ( + + + + ) + )} + + ); + + if (disabled) return rendered; return ( showPopoverCell(true)} - disabled={disabled} style={{ width: "100%", height: "100%", @@ -32,26 +52,8 @@ export default function MultiSelect({ }} tabIndex={tabIndex} > - {typeof value === "string" && value !== "" ? ( -
    - -   - {value} -
    - ) : ( - - {sanitiseValue(value).map( - (item) => - typeof item === "string" && ( - - - - ) - )} - - )} - - {!disabled && } + {rendered} +
    ); } diff --git a/src/components/fields/MultiSelect/PopoverCell.tsx b/src/components/fields/MultiSelect/EditorCell.tsx similarity index 86% rename from src/components/fields/MultiSelect/PopoverCell.tsx rename to src/components/fields/MultiSelect/EditorCell.tsx index c96f5746..46fa6837 100644 --- a/src/components/fields/MultiSelect/PopoverCell.tsx +++ b/src/components/fields/MultiSelect/EditorCell.tsx @@ -57,8 +57,11 @@ export default function MultiSelect({ open: true, MenuProps: { anchorEl: parentRef, - anchorOrigin: { vertical: "bottom", horizontal: "left" }, - transformOrigin: { vertical: "top", horizontal: "left" }, + anchorOrigin: { vertical: "bottom", horizontal: "center" }, + transformOrigin: { vertical: "top", horizontal: "center" }, + sx: { + "& .MuiPaper-root": { minWidth: `${column.width}px !important` }, + }, }, }, }} diff --git a/src/components/fields/MultiSelect/SideDrawerField.tsx b/src/components/fields/MultiSelect/SideDrawerField.tsx index 2716e34c..99c260be 100644 --- a/src/components/fields/MultiSelect/SideDrawerField.tsx +++ b/src/components/fields/MultiSelect/SideDrawerField.tsx @@ -1,6 +1,6 @@ import { ISideDrawerFieldProps } from "@src/components/fields/types"; -import { Grid, Button } from "@mui/material"; +import { Grid, Button, Tooltip } from "@mui/material"; import WarningIcon from "@mui/icons-material/WarningAmber"; import MultiSelectComponent from "@rowy/multiselect"; import FormattedChip from "@src/components/FormattedChip"; @@ -28,7 +28,9 @@ export default function MultiSelect({ return ( - + + +  {value} @@ -38,6 +40,7 @@ export default function MultiSelect({ onChange([value]); onSubmit(); }} + disabled={disabled} > Convert to array diff --git a/src/components/fields/MultiSelect/index.tsx b/src/components/fields/MultiSelect/index.tsx index d5a18ed5..cdda43c0 100644 --- a/src/components/fields/MultiSelect/index.tsx +++ b/src/components/fields/MultiSelect/index.tsx @@ -4,11 +4,10 @@ import withTableCell from "@src/components/Table/withTableCell"; import { MultiSelect as MultiSelectIcon } from "@src/assets/icons"; import DisplayCell from "./DisplayCell"; -import NullEditor from "@src/components/Table/editors/NullEditor"; import { filterOperators } from "./Filter"; -const PopoverCell = lazy( - () => - import("./PopoverCell" /* webpackChunkName: "PopoverCell-MultiSelect" */) + +const EditorCell = lazy( + () => import("./EditorCell" /* webpackChunkName: "EditorCell-MultiSelect" */) ); const SideDrawerField = lazy( () => @@ -33,10 +32,10 @@ export const config: IFieldConfig = { icon: , description: "Multiple values from predefined options. Options are searchable and users can optionally input custom values.", - TableCell: withTableCell(DisplayCell, PopoverCell, "popover", { + TableCell: withTableCell(DisplayCell, EditorCell, "popover", { disablePadding: true, + transparentPopover: true, }), - TableEditor: NullEditor as any, SideDrawerField, settings: Settings, csvImportParser: (v) => { diff --git a/src/components/fields/RichText/DisplayCell.tsx b/src/components/fields/RichText/DisplayCell.tsx new file mode 100644 index 00000000..0513e198 --- /dev/null +++ b/src/components/fields/RichText/DisplayCell.tsx @@ -0,0 +1,101 @@ +import { IDisplayCellProps } from "@src/components/fields/types"; +// import { useAtom } from "jotai"; + +import { + // styled, + useTheme, + // Tooltip, + // TooltipProps, + // tooltipClasses, + // Fade, +} from "@mui/material"; +import RenderedHtml from "@src/components/RenderedHtml"; + +// import { tableScope, tableSchemaAtom } from "@src/atoms/tableScope"; +// import { DEFAULT_ROW_HEIGHT } from "@src/components/Table"; + +// type StylesProps = { width: number; rowHeight: number }; + +// const StyledTooltip = styled( +// ({ className, width, rowHeight, ...props }: TooltipProps & StylesProps) => ( +// +// ) +// )(({ theme, width, rowHeight }) => ({ +// [`& .${tooltipClasses.tooltip}`]: { +// margin: 0, +// marginTop: `-${rowHeight - 1}px !important`, +// padding: theme.spacing(3 / 8, 1.25), + +// width: width - 1, +// maxWidth: "none", +// minHeight: rowHeight - 1, +// overflowX: "hidden", + +// background: theme.palette.background.paper, +// borderRadius: 0, +// boxShadow: `0 0 0 1px ${theme.palette.divider}, ${theme.shadows[4]}`, +// color: theme.palette.text.primary, + +// display: "flex", +// alignItems: "center", +// }, +// })); + +export default function RichText({ column, value }: IDisplayCellProps) { + // const [tableSchema] = useAtom(tableSchemaAtom, tableScope); + + const theme = useTheme(); + + if (!value) return null; + + const content = ( + + ); + + // temp disable tooltip, which causes performance issues + return content; + + // return ( + // + //
    + // {content} + //
    + //
    + // ); +} diff --git a/src/components/fields/RichText/TableCell.tsx b/src/components/fields/RichText/TableCell.tsx deleted file mode 100644 index 354a9a76..00000000 --- a/src/components/fields/RichText/TableCell.tsx +++ /dev/null @@ -1,98 +0,0 @@ -import { IHeavyCellProps } from "@src/components/fields/types"; -import { useAtom } from "jotai"; - -import { - styled, - useTheme, - Tooltip, - TooltipProps, - tooltipClasses, - Fade, -} from "@mui/material"; -import RenderedHtml from "@src/components/RenderedHtml"; - -import { tableScope, tableSchemaAtom } from "@src/atoms/tableScope"; -import { DEFAULT_ROW_HEIGHT } from "@src/components/Table"; - -type StylesProps = { width: number; rowHeight: number }; - -const StyledTooltip = styled( - ({ className, width, rowHeight, ...props }: TooltipProps & StylesProps) => ( - - ) -)(({ theme, width, rowHeight }) => ({ - [`& .${tooltipClasses.tooltip}`]: { - margin: 0, - marginTop: `-${rowHeight - 1}px !important`, - padding: theme.spacing(3 / 8, 1.25), - - width: width - 1, - maxWidth: "none", - minHeight: rowHeight - 1, - overflowX: "hidden", - - background: theme.palette.background.paper, - borderRadius: 0, - boxShadow: `0 0 0 1px ${theme.palette.divider}, ${theme.shadows[4]}`, - color: theme.palette.text.primary, - - display: "flex", - alignItems: "center", - }, -})); - -export default function RichText({ column, value }: IHeavyCellProps) { - const [tableSchema] = useAtom(tableSchemaAtom, tableScope); - - const theme = useTheme(); - - if (!value) return null; - - const content = ( - - ); - - return ( - -
    - {content} -
    -
    - ); -} diff --git a/src/components/fields/RichText/index.tsx b/src/components/fields/RichText/index.tsx index 890f1d68..80202a98 100644 --- a/src/components/fields/RichText/index.tsx +++ b/src/components/fields/RichText/index.tsx @@ -1,15 +1,11 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withHeavyCell from "@src/components/fields/_withTableCell/withHeavyCell"; +import withTableCell from "@src/components/Table/withTableCell"; import RichTextIcon from "@mui/icons-material/TextFormat"; -import BasicCell from "@src/components/fields/_BasicCell/BasicCellNull"; -import withSideDrawerEditor from "@src/components/Table/editors/withSideDrawerEditor"; +import DisplayCell from "./DisplayCell"; import BasicContextMenuActions from "@src/components/fields/_BasicCell/BasicCellContextMenuActions"; -const TableCell = lazy( - () => import("./TableCell" /* webpackChunkName: "TableCell-RichText" */) -); const SideDrawerField = lazy( () => import( @@ -27,8 +23,7 @@ export const config: IFieldConfig = { icon: , description: "HTML edited with a rich text editor.", contextMenuActions: BasicContextMenuActions, - TableCell: withHeavyCell(BasicCell, TableCell), - TableEditor: withSideDrawerEditor(TableCell), + TableCell: withTableCell(DisplayCell, SideDrawerField, "popover"), SideDrawerField, }; export default config; diff --git a/src/components/fields/Slider/TableCell.tsx b/src/components/fields/Slider/DisplayCell.tsx similarity index 89% rename from src/components/fields/Slider/TableCell.tsx rename to src/components/fields/Slider/DisplayCell.tsx index 80699449..ae8cc736 100644 --- a/src/components/fields/Slider/TableCell.tsx +++ b/src/components/fields/Slider/DisplayCell.tsx @@ -1,10 +1,10 @@ -import { IHeavyCellProps } from "@src/components/fields/types"; +import { IDisplayCellProps } from "@src/components/fields/types"; import { Grid, Box } from "@mui/material"; import { resultColorsScale } from "@src/utils/color"; -export default function Slider({ column, value }: IHeavyCellProps) { +export default function Slider({ column, value }: IDisplayCellProps) { const { max, min, diff --git a/src/components/fields/Slider/index.tsx b/src/components/fields/Slider/index.tsx index 80816fdf..6d21dc9d 100644 --- a/src/components/fields/Slider/index.tsx +++ b/src/components/fields/Slider/index.tsx @@ -1,15 +1,11 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withHeavyCell from "@src/components/fields/_withTableCell/withHeavyCell"; +import withTableCell from "@src/components/Table/withTableCell"; import { Slider as SliderIcon } from "@src/assets/icons"; -import BasicCell from "@src/components/fields/_BasicCell/BasicCellNull"; -import withSideDrawerEditor from "@src/components/Table/editors/withSideDrawerEditor"; +import DisplayCell from "./DisplayCell"; import { filterOperators } from "@src/components/fields/Number/Filter"; -const TableCell = lazy( - () => import("./TableCell" /* webpackChunkName: "TableCell-Slider" */) -); const SideDrawerField = lazy( () => import("./SideDrawerField" /* webpackChunkName: "SideDrawerField-Slider" */) @@ -28,8 +24,9 @@ export const config: IFieldConfig = { icon: , requireConfiguration: true, description: "Numeric value edited with a Slider. Range is configurable.", - TableCell: withHeavyCell(BasicCell, TableCell), - TableEditor: withSideDrawerEditor(TableCell), + TableCell: withTableCell(DisplayCell, SideDrawerField, "popover", { + popoverProps: { PaperProps: { sx: { p: 1, pt: 5 } } }, + }), settings: Settings, filter: { operators: filterOperators, diff --git a/src/components/fields/UpdatedAt/TableCell.tsx b/src/components/fields/UpdatedAt/DisplayCell.tsx similarity index 70% rename from src/components/fields/UpdatedAt/TableCell.tsx rename to src/components/fields/UpdatedAt/DisplayCell.tsx index 52417bce..c6b29d9a 100644 --- a/src/components/fields/UpdatedAt/TableCell.tsx +++ b/src/components/fields/UpdatedAt/DisplayCell.tsx @@ -1,9 +1,9 @@ -import { IHeavyCellProps } from "@src/components/fields/types"; +import { IDisplayCellProps } from "@src/components/fields/types"; import { format } from "date-fns"; import { DATE_TIME_FORMAT } from "@src/constants/dates"; -export default function UpdatedAt({ column, value }: IHeavyCellProps) { +export default function UpdatedAt({ column, value }: IDisplayCellProps) { if (!value) return null; const dateLabel = format( value.toDate ? value.toDate() : value, diff --git a/src/components/fields/UpdatedAt/index.tsx b/src/components/fields/UpdatedAt/index.tsx index 3c2c3f28..9b7476eb 100644 --- a/src/components/fields/UpdatedAt/index.tsx +++ b/src/components/fields/UpdatedAt/index.tsx @@ -1,14 +1,10 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withHeavyCell from "@src/components/fields/_withTableCell/withHeavyCell"; +import withTableCell from "@src/components/Table/withTableCell"; import { UpdatedAt as UpdatedAtIcon } from "@src/assets/icons"; -import BasicCell from "@src/components/fields/_BasicCell/BasicCellNull"; -import withSideDrawerEditor from "@src/components/Table/editors/withSideDrawerEditor"; +import DisplayCell from "./DisplayCell"; -const TableCell = lazy( - () => import("./TableCell" /* webpackChunkName: "TableCell-UpdatedAt" */) -); const SideDrawerField = lazy( () => import( @@ -29,8 +25,7 @@ export const config: IFieldConfig = { icon: , description: "Displays the timestamp of the last update to the row. Read-only.", - TableCell: withHeavyCell(BasicCell, TableCell), - TableEditor: withSideDrawerEditor(TableCell), + TableCell: withTableCell(DisplayCell, null), SideDrawerField, settings: Settings, }; diff --git a/src/components/fields/UpdatedBy/TableCell.tsx b/src/components/fields/UpdatedBy/DisplayCell.tsx similarity index 87% rename from src/components/fields/UpdatedBy/TableCell.tsx rename to src/components/fields/UpdatedBy/DisplayCell.tsx index 5484626f..1bf71be3 100644 --- a/src/components/fields/UpdatedBy/TableCell.tsx +++ b/src/components/fields/UpdatedBy/DisplayCell.tsx @@ -1,11 +1,11 @@ -import { IHeavyCellProps } from "@src/components/fields/types"; +import { IDisplayCellProps } from "@src/components/fields/types"; import { Tooltip, Stack, Avatar } from "@mui/material"; import { format } from "date-fns"; import { DATE_TIME_FORMAT } from "@src/constants/dates"; -export default function UpdatedBy({ column, value }: IHeavyCellProps) { +export default function UpdatedBy({ column, value }: IDisplayCellProps) { if (!value || !value.displayName || !value.timestamp) return null; const dateLabel = format( value.timestamp.toDate ? value.timestamp.toDate() : value.timestamp, diff --git a/src/components/fields/UpdatedBy/index.tsx b/src/components/fields/UpdatedBy/index.tsx index 09ca1e2f..5ddfb877 100644 --- a/src/components/fields/UpdatedBy/index.tsx +++ b/src/components/fields/UpdatedBy/index.tsx @@ -1,14 +1,10 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withHeavyCell from "@src/components/fields/_withTableCell/withHeavyCell"; +import withTableCell from "@src/components/Table/withTableCell"; import { UpdatedBy as UpdatedByIcon } from "@src/assets/icons"; -import BasicCell from "@src/components/fields/_BasicCell/BasicCellNull"; -import withSideDrawerEditor from "@src/components/Table/editors/withSideDrawerEditor"; +import DisplayCell from "./DisplayCell"; -const TableCell = lazy( - () => import("./TableCell" /* webpackChunkName: "TableCell-UpdatedBy" */) -); const SideDrawerField = lazy( () => import( @@ -30,8 +26,7 @@ export const config: IFieldConfig = { icon: , description: "Displays the user that last updated the row, timestamp, and updated field key. Read-only.", - TableCell: withHeavyCell(BasicCell, TableCell), - TableEditor: withSideDrawerEditor(TableCell), + TableCell: withTableCell(DisplayCell, null), SideDrawerField, settings: Settings, }; diff --git a/src/components/fields/User/TableCell.tsx b/src/components/fields/User/DisplayCell.tsx similarity index 83% rename from src/components/fields/User/TableCell.tsx rename to src/components/fields/User/DisplayCell.tsx index e1761826..d299b6c5 100644 --- a/src/components/fields/User/TableCell.tsx +++ b/src/components/fields/User/DisplayCell.tsx @@ -1,11 +1,11 @@ -import { IHeavyCellProps } from "@src/components/fields/types"; +import { IDisplayCellProps } from "@src/components/fields/types"; import { Tooltip, Stack, Avatar } from "@mui/material"; import { format } from "date-fns"; import { DATE_TIME_FORMAT } from "@src/constants/dates"; -export default function User({ value, column }: IHeavyCellProps) { +export default function User({ value, column }: IDisplayCellProps) { if (!value || !value.displayName) return null; const chip = ( diff --git a/src/components/fields/User/index.tsx b/src/components/fields/User/index.tsx index 70ec0a83..29f996d8 100644 --- a/src/components/fields/User/index.tsx +++ b/src/components/fields/User/index.tsx @@ -1,14 +1,10 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withHeavyCell from "@src/components/fields/_withTableCell/withHeavyCell"; +import withTableCell from "@src/components/Table/withTableCell"; import UserIcon from "@mui/icons-material/PersonOutlined"; -import BasicCell from "@src/components/fields/_BasicCell/BasicCellNull"; -import withSideDrawerEditor from "@src/components/Table/editors/withSideDrawerEditor"; +import DisplayCell from "./DisplayCell"; -const TableCell = lazy( - () => import("./TableCell" /* webpackChunkName: "TableCell-User" */) -); const SideDrawerField = lazy( () => import("./SideDrawerField" /* webpackChunkName: "SideDrawerField-User" */) @@ -27,8 +23,7 @@ export const config: IFieldConfig = { initialValue: null, icon: , description: "User information and optionally, timestamp. Read-only.", - TableCell: withHeavyCell(BasicCell, TableCell), - TableEditor: withSideDrawerEditor(TableCell), + TableCell: withTableCell(DisplayCell, null), SideDrawerField, settings: Settings, }; diff --git a/src/types/json-stable-stringify-without-jsonify.d.ts b/src/types/json-stable-stringify-without-jsonify.d.ts index 3e1639a6..a0f5dc4b 100644 --- a/src/types/json-stable-stringify-without-jsonify.d.ts +++ b/src/types/json-stable-stringify-without-jsonify.d.ts @@ -1,4 +1,4 @@ declare module "json-stable-stringify-without-jsonify" { - const stringify: any; + const stringify: (...args: any) => string; export default stringify; } From 26ea9abaf4312ee516bed8f9fff99c5dfa5f2d0d Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Fri, 11 Nov 2022 14:20:53 +1100 Subject: [PATCH 248/309] fix rendered rich text & markdown being tab-able --- src/components/fields/Markdown/DisplayCell.tsx | 4 +++- src/components/fields/RichText/DisplayCell.tsx | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/components/fields/Markdown/DisplayCell.tsx b/src/components/fields/Markdown/DisplayCell.tsx index 8fe5d93f..9bf4c028 100644 --- a/src/components/fields/Markdown/DisplayCell.tsx +++ b/src/components/fields/Markdown/DisplayCell.tsx @@ -4,7 +4,7 @@ import { useTheme } from "@mui/material"; import MDEditor from "@uiw/react-md-editor"; -export default function Markdown({ value }: IDisplayCellProps) { +export default function Markdown({ value, tabIndex }: IDisplayCellProps) { const theme = useTheme(); if (!value || typeof value !== "string") return null; @@ -13,6 +13,8 @@ export default function Markdown({ value }: IDisplayCellProps) {
    diff --git a/src/components/fields/RichText/DisplayCell.tsx b/src/components/fields/RichText/DisplayCell.tsx index 0513e198..aceb4d5d 100644 --- a/src/components/fields/RichText/DisplayCell.tsx +++ b/src/components/fields/RichText/DisplayCell.tsx @@ -41,7 +41,7 @@ import RenderedHtml from "@src/components/RenderedHtml"; // }, // })); -export default function RichText({ column, value }: IDisplayCellProps) { +export default function RichText({ value, tabIndex }: IDisplayCellProps) { // const [tableSchema] = useAtom(tableSchemaAtom, tableScope); const theme = useTheme(); @@ -59,6 +59,8 @@ export default function RichText({ column, value }: IDisplayCellProps) { fontSize: "0.75rem", lineHeight: theme.typography.body2.lineHeight, }} + // Prevent user tabbing into any rendered links + {...({ inert: tabIndex === -1 ? "inert" : undefined } as any)} /> ); From 742a992098e6554cbc2644bc644712bfe394a23a Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Fri, 11 Nov 2022 14:59:07 +1100 Subject: [PATCH 249/309] fix date fields render loop --- src/components/fields/Date/EditorCell.tsx | 7 ++----- src/components/fields/Date/index.tsx | 2 +- src/components/fields/DateTime/EditorCell.tsx | 6 ++---- src/components/fields/DateTime/index.tsx | 2 +- 4 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/components/fields/Date/EditorCell.tsx b/src/components/fields/Date/EditorCell.tsx index 2b9523ed..56de95c1 100644 --- a/src/components/fields/Date/EditorCell.tsx +++ b/src/components/fields/Date/EditorCell.tsx @@ -63,11 +63,7 @@ export default function Date_({ }, "& .MuiInputAdornment-root": { m: 0 }, }} - // Prevent react-data-grid showing NullEditor, which unmounts this field - onDoubleClick={(e) => e.stopPropagation()} - onKeyDown={(e) => e.stopPropagation()} - // Touch mode: make the whole field clickable - onClick={props.inputProps?.onClick as any} + onClick={(e) => e.stopPropagation()} inputProps={{ ...props.inputProps, tabIndex }} /> )} @@ -86,6 +82,7 @@ export default function Date_({ components={{ OpenPickerIcon: ChevronDown }} disableOpenPicker={false} disabled={disabled} + PopperProps={{ onClick: (e) => e.stopPropagation() }} /> ); } diff --git a/src/components/fields/Date/index.tsx b/src/components/fields/Date/index.tsx index fdc634d0..1ff9b01a 100644 --- a/src/components/fields/Date/index.tsx +++ b/src/components/fields/Date/index.tsx @@ -28,7 +28,7 @@ export const config: IFieldConfig = { initializable: true, icon: , description: `Formatted date. Format is configurable, default: ${DATE_FORMAT}. Edited with a visual picker.`, - TableCell: withTableCell(DisplayCell, EditorCell, "inline", { + TableCell: withTableCell(DisplayCell, EditorCell, "focus", { disablePadding: true, }), SideDrawerField, diff --git a/src/components/fields/DateTime/EditorCell.tsx b/src/components/fields/DateTime/EditorCell.tsx index acf8ca69..5a8cf2f1 100644 --- a/src/components/fields/DateTime/EditorCell.tsx +++ b/src/components/fields/DateTime/EditorCell.tsx @@ -68,11 +68,8 @@ export default function DateTime({ }, "& .MuiInputAdornment-root": { m: 0 }, }} - // Prevent react-data-grid showing NullEditor, which unmounts this field - onDoubleClick={(e) => e.stopPropagation()} onKeyDown={(e) => e.stopPropagation()} - // Touch mode: make the whole field clickable - onClick={props.inputProps?.onClick as any} + onClick={(e) => e.stopPropagation()} inputProps={{ ...props.inputProps, tabIndex }} /> )} @@ -90,6 +87,7 @@ export default function DateTime({ components={{ OpenPickerIcon: ChevronDown }} disableOpenPicker={false} disabled={disabled} + PopperProps={{ onClick: (e) => e.stopPropagation() }} /> ); } diff --git a/src/components/fields/DateTime/index.tsx b/src/components/fields/DateTime/index.tsx index dade54b4..cc247b97 100644 --- a/src/components/fields/DateTime/index.tsx +++ b/src/components/fields/DateTime/index.tsx @@ -36,7 +36,7 @@ export const config: IFieldConfig = { initializable: true, icon: , description: `Formatted date & time. Format is configurable, default: ${DATE_TIME_FORMAT}. Edited with a visual picker.`, - TableCell: withTableCell(DisplayCell, EditorCell, "inline", { + TableCell: withTableCell(DisplayCell, EditorCell, "focus", { disablePadding: true, }), SideDrawerField, From f9656e2c4ed63954e9d129dcefa649f2324d7a6d Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Fri, 11 Nov 2022 15:49:47 +1100 Subject: [PATCH 250/309] migrate all remaining fields --- src/components/Table/Table.tsx | 25 +- src/components/Table/TableContainer.tsx | 252 ------------------ src/components/fields/File/DisplayCell.tsx | 36 +++ .../File/{TableCell.tsx => EditorCell.tsx} | 28 +- src/components/fields/File/index.tsx | 14 +- src/components/fields/Image/DisplayCell.tsx | 113 ++++++++ .../Image/{TableCell.tsx => EditorCell.tsx} | 184 ++++--------- src/components/fields/Image/index.tsx | 14 +- src/components/fields/Rating/DisplayCell.tsx | 68 +++++ src/components/fields/Rating/EditorCell.tsx | 27 ++ .../fields/Rating/SideDrawerField.tsx | 3 +- src/components/fields/Rating/TableCell.tsx | 55 ---- src/components/fields/Rating/index.tsx | 12 +- .../fields/SingleSelect/DisplayCell.tsx | 46 ++++ .../{PopoverCell.tsx => EditorCell.tsx} | 23 +- .../fields/SingleSelect/InlineCell.tsx | 51 ---- src/components/fields/SingleSelect/index.tsx | 18 +- src/components/fields/Status/DisplayCell.tsx | 71 +++++ .../{PopoverCell.tsx => EditorCell.tsx} | 23 +- src/components/fields/Status/InlineCell.tsx | 69 ----- src/components/fields/Status/index.tsx | 19 +- .../{TableCell.tsx => DisplayCell.tsx} | 24 +- .../fields/SubTable/SideDrawerField.tsx | 4 +- src/components/fields/SubTable/index.tsx | 14 +- src/hooks/useFirebaseStorageUploader.tsx | 5 +- 25 files changed, 527 insertions(+), 671 deletions(-) delete mode 100644 src/components/Table/TableContainer.tsx create mode 100644 src/components/fields/File/DisplayCell.tsx rename src/components/fields/File/{TableCell.tsx => EditorCell.tsx} (89%) create mode 100644 src/components/fields/Image/DisplayCell.tsx rename src/components/fields/Image/{TableCell.tsx => EditorCell.tsx} (51%) create mode 100644 src/components/fields/Rating/DisplayCell.tsx create mode 100644 src/components/fields/Rating/EditorCell.tsx delete mode 100644 src/components/fields/Rating/TableCell.tsx create mode 100644 src/components/fields/SingleSelect/DisplayCell.tsx rename src/components/fields/SingleSelect/{PopoverCell.tsx => EditorCell.tsx} (54%) delete mode 100644 src/components/fields/SingleSelect/InlineCell.tsx create mode 100644 src/components/fields/Status/DisplayCell.tsx rename src/components/fields/Status/{PopoverCell.tsx => EditorCell.tsx} (67%) delete mode 100644 src/components/fields/Status/InlineCell.tsx rename src/components/fields/SubTable/{TableCell.tsx => DisplayCell.tsx} (60%) diff --git a/src/components/Table/Table.tsx b/src/components/Table/Table.tsx index f8ca9486..ad26cb42 100644 --- a/src/components/Table/Table.tsx +++ b/src/components/Table/Table.tsx @@ -15,7 +15,6 @@ import { Draggable, } from "react-beautiful-dnd"; import { get } from "lodash-es"; -import { Portal } from "@mui/material"; import { ErrorBoundary } from "react-error-boundary"; import StyledTable from "./Styled/StyledTable"; @@ -426,6 +425,14 @@ export default function Table({ selectedCell?.path === row.original._rowy_ref.path && selectedCell?.columnKey === cell.column.id; + const fieldTypeGroup = getFieldProp( + "group", + cell.column.columnDef.meta?.type + ); + const isReadOnlyCell = + fieldTypeGroup === "Auditing" || + fieldTypeGroup === "Metadata"; + return ( - -
    - Press Enter to edit. -
    -
    +
    + Press Enter to edit. +
    diff --git a/src/components/Table/TableContainer.tsx b/src/components/Table/TableContainer.tsx deleted file mode 100644 index 10061298..00000000 --- a/src/components/Table/TableContainer.tsx +++ /dev/null @@ -1,252 +0,0 @@ -import { colord } from "colord"; -import { styled, alpha, darken, lighten } from "@mui/material"; -import { TOP_BAR_HEIGHT } from "@src/layouts/Navigation/TopBar"; -import { TABLE_TOOLBAR_HEIGHT } from "@src/components/TableToolbar"; -import { - DRAWER_COLLAPSED_WIDTH, - DRAWER_WIDTH, -} from "@src/components/SideDrawer"; - -export const OUT_OF_ORDER_MARGIN = 8; - -export const TableContainer = styled("div", { - shouldForwardProp: (prop) => prop !== "rowHeight", -})<{ rowHeight: number }>(({ theme, rowHeight }) => ({ - display: "flex", - position: "relative", - flexDirection: "column", - height: `calc(100vh - ${TOP_BAR_HEIGHT}px - ${TABLE_TOOLBAR_HEIGHT}px)`, - - "& .left-scroll-divider": { - position: "absolute", - top: 0, - bottom: 0, - left: 0, - width: 1, - zIndex: 1, - - backgroundColor: colord(theme.palette.background.paper) - .mix(theme.palette.divider, 0.12) - .alpha(1) - .toHslString(), - }, - - "& > .rdg": { - width: `calc(100% - ${DRAWER_COLLAPSED_WIDTH}px)`, - flex: 1, - paddingBottom: `max(env(safe-area-inset-bottom), ${theme.spacing(2)})`, - }, - - [theme.breakpoints.down("sm")]: { width: "100%" }, - - "& .rdg": { - "--color": theme.palette.text.primary, - "--border-color": theme.palette.divider, - // "--summary-border-color": "#aaa", - "--cell-background-color": - theme.palette.mode === "light" - ? theme.palette.background.paper - : colord(theme.palette.background.paper) - .mix("#fff", 0.04) - .alpha(1) - .toHslString(), - "--header-background-color": theme.palette.background.default, - "--row-hover-background-color": colord(theme.palette.background.paper) - .mix(theme.palette.action.hover, theme.palette.action.hoverOpacity) - .alpha(1) - .toHslString(), - "--row-selected-background-color": - theme.palette.mode === "light" - ? lighten(theme.palette.primary.main, 0.9) - : darken(theme.palette.primary.main, 0.8), - "--row-selected-hover-background-color": - theme.palette.mode === "light" - ? lighten(theme.palette.primary.main, 0.8) - : darken(theme.palette.primary.main, 0.7), - "--checkbox-color": theme.palette.primary.main, - "--checkbox-focus-color": theme.palette.primary.main, - "--checkbox-disabled-border-color": "#ccc", - "--checkbox-disabled-background-color": "#ddd", - "--selection-color": theme.palette.primary.main, - "--font-size": "0.75rem", - "--cell-padding": theme.spacing(0, 1.25), - - border: "none", - backgroundColor: "transparent", - - ...(theme.typography.caption as any), - // fontSize: "0.8125rem", - lineHeight: "inherit !important", - - "& .rdg-cell": { - display: "flex", - alignItems: "center", - padding: 0, - - overflow: "visible", - contain: "none", - position: "relative", - - lineHeight: "calc(var(--row-height) - 1px)", - }, - - "& .rdg-cell-frozen": { - position: "sticky", - }, - "& .rdg-cell-frozen-last": { - boxShadow: theme.shadows[2] - .replace(/, 0 (\d+px)/g, ", $1 0") - .split("),") - .slice(1) - .join("),"), - - "&[aria-selected=true]": { - boxShadow: - theme.shadows[2] - .replace(/, 0 (\d+px)/g, ", $1 0") - .split("),") - .slice(1) - .join("),") + ", inset 0 0 0 2px var(--selection-color)", - }, - }, - - "& .rdg-cell-copied": { - backgroundColor: - theme.palette.mode === "light" - ? lighten(theme.palette.primary.main, 0.7) - : darken(theme.palette.primary.main, 0.6), - }, - - "& .final-column-cell": { - backgroundColor: "var(--header-background-color)", - borderColor: "var(--header-background-color)", - color: theme.palette.text.disabled, - padding: "var(--cell-padding)", - }, - }, - - ".rdg-row, .rdg-header-row": { - marginLeft: `max(env(safe-area-inset-left), ${theme.spacing(2)})`, - marginRight: `max(env(safe-area-inset-right), ${DRAWER_WIDTH}px)`, - display: "inline-grid", // Fix Safari not showing margin-right - }, - - ".rdg-header-row .rdg-cell:first-of-type": { - borderTopLeftRadius: theme.shape.borderRadius, - }, - ".rdg-header-row .rdg-cell:last-of-type": { - borderTopRightRadius: theme.shape.borderRadius, - }, - - ".rdg-header-row .rdg-cell.final-column-header": { - border: "none", - padding: theme.spacing(0, 0.75), - borderBottomRightRadius: theme.shape.borderRadius, - - display: "flex", - alignItems: "center", - justifyContent: "flex-start", - - position: "relative", - "&::before": { - content: "''", - display: "block", - width: 88, - height: "100%", - - position: "absolute", - top: 0, - left: 0, - - border: "1px solid var(--border-color)", - borderLeftWidth: 0, - borderTopRightRadius: theme.shape.borderRadius, - borderBottomRightRadius: theme.shape.borderRadius, - }, - }, - - ".rdg-row .rdg-cell:first-of-type, .rdg-header-row .rdg-cell:first-of-type": { - borderLeft: "1px solid var(--border-color)", - }, - - ".rdg-row:last-of-type": { - borderBottomLeftRadius: theme.shape.borderRadius, - borderBottomRightRadius: theme.shape.borderRadius, - - "& .rdg-cell:first-of-type": { - borderBottomLeftRadius: theme.shape.borderRadius, - }, - "& .rdg-cell:nth-last-of-type(2)": { - borderBottomRightRadius: theme.shape.borderRadius, - }, - }, - - ".rdg-header-row .rdg-cell": { - borderTop: "1px solid var(--border-color)", - }, - - ".rdg-row:hover": { color: theme.palette.text.primary }, - - ".row-hover-iconButton": { - color: theme.palette.text.disabled, - transitionDuration: "0s", - }, - ".rdg-row:hover .row-hover-iconButton": { - color: theme.palette.text.primary, - backgroundColor: alpha( - theme.palette.action.hover, - theme.palette.action.hoverOpacity * 1.5 - ), - }, - - ".cell-collapse-padding": { - margin: theme.spacing(0, -1.25), - width: `calc(100% + ${theme.spacing(1.25 * 2)})`, - }, - - ".rdg-row.out-of-order": { - "--row-height": rowHeight + 1 + "px !important", - marginTop: -1, - marginBottom: OUT_OF_ORDER_MARGIN, - borderBottomLeftRadius: theme.shape.borderRadius, - - "& .rdg-cell:not(:last-of-type)": { - borderTop: `1px solid var(--border-color)`, - }, - "& .rdg-cell:first-of-type": { - borderBottomLeftRadius: theme.shape.borderRadius, - }, - "& .rdg-cell:nth-last-of-type(2)": { - borderBottomRightRadius: theme.shape.borderRadius, - }, - "&:not(:nth-of-type(4))": { - borderTopLeftRadius: theme.shape.borderRadius, - - "& .rdg-cell:first-of-type": { - borderTopLeftRadius: theme.shape.borderRadius, - }, - "& .rdg-cell:nth-last-of-type(2)": { - borderTopRightRadius: theme.shape.borderRadius, - }, - }, - - "& + .rdg-row:not(.out-of-order)": { - "--row-height": rowHeight + 1 + "px !important", - marginTop: -1, - borderTopLeftRadius: theme.shape.borderRadius, - - "& .rdg-cell:not(:last-of-type)": { - borderTop: `1px solid var(--border-color)`, - }, - "& .rdg-cell:first-of-type": { - borderTopLeftRadius: theme.shape.borderRadius, - }, - "& .rdg-cell:nth-last-of-type(2)": { - borderTopRightRadius: theme.shape.borderRadius, - }, - }, - }, -})); -TableContainer.displayName = "TableContainer"; - -export default TableContainer; diff --git a/src/components/fields/File/DisplayCell.tsx b/src/components/fields/File/DisplayCell.tsx new file mode 100644 index 00000000..73303ddf --- /dev/null +++ b/src/components/fields/File/DisplayCell.tsx @@ -0,0 +1,36 @@ +import { IDisplayCellProps } from "@src/components/fields/types"; + +import { Grid, Chip } from "@mui/material"; +import ChipList from "@src/components/Table/formatters/ChipList"; + +import { FileIcon } from "."; +import { FileValue } from "@src/types/table"; + +export default function File_({ value, tabIndex }: IDisplayCellProps) { + return ( + + {Array.isArray(value) && + value.map((file: FileValue) => ( + 1 ? { maxWidth: `calc(100% - 12px)` } : {} + } + > + } + label={file.name} + onClick={(e) => { + window.open(file.downloadURL); + e.stopPropagation(); + }} + style={{ width: "100%" }} + tabIndex={tabIndex} + /> + + ))} + + ); +} diff --git a/src/components/fields/File/TableCell.tsx b/src/components/fields/File/EditorCell.tsx similarity index 89% rename from src/components/fields/File/TableCell.tsx rename to src/components/fields/File/EditorCell.tsx index 685cf62e..deb5b5fa 100644 --- a/src/components/fields/File/TableCell.tsx +++ b/src/components/fields/File/EditorCell.tsx @@ -1,5 +1,5 @@ import { useCallback } from "react"; -import { IHeavyCellProps } from "@src/components/fields/types"; +import { IEditorCellProps } from "@src/components/fields/types"; import { useSetAtom } from "jotai"; import { findIndex } from "lodash-es"; @@ -20,12 +20,13 @@ import { FileValue } from "@src/types/table"; export default function File_({ column, - row, value, + onChange, onSubmit, disabled, - docRef, -}: IHeavyCellProps) { + _rowy_ref, + tabIndex, +}: IEditorCellProps) { const confirm = useSetAtom(confirmDialogAtom, projectScope); const updateField = useSetAtom(updateFieldAtom, tableScope); @@ -38,13 +39,13 @@ export default function File_({ if (file) { upload({ - docRef: docRef! as any, + docRef: _rowy_ref, fieldName: column.key, files: [file], previousValue: value, onComplete: (newValue) => { updateField({ - path: docRef.path, + path: _rowy_ref.path, fieldName: column.key, value: newValue, }); @@ -60,7 +61,8 @@ export default function File_({ const index = findIndex(newValue, ["ref", ref]); const toBeDeleted = newValue.splice(index, 1); toBeDeleted.length && deleteUpload(toBeDeleted[0]); - onSubmit(newValue); + onChange(newValue); + onSubmit(); }; const { getRootProps, getInputProps, isDragActive } = useDropzone({ @@ -73,11 +75,10 @@ export default function File_({ return ( @@ -130,6 +132,7 @@ export default function File_({ confirmColor: "error", }) } + tabIndex={tabIndex} style={{ width: "100%" }} /> @@ -146,8 +149,9 @@ export default function File_({ e.stopPropagation(); }} style={{ display: "flex" }} - className={docRef && "row-hover-iconButton"} - disabled={!docRef} + className={_rowy_ref && "row-hover-iconButton end"} + disabled={!_rowy_ref} + tabIndex={tabIndex} > @@ -163,7 +167,7 @@ export default function File_({
    )} - + ); } diff --git a/src/components/fields/File/index.tsx b/src/components/fields/File/index.tsx index bdd0a323..2f883954 100644 --- a/src/components/fields/File/index.tsx +++ b/src/components/fields/File/index.tsx @@ -1,13 +1,12 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withHeavyCell from "@src/components/fields/_withTableCell/withHeavyCell"; +import withTableCell from "@src/components/Table/withTableCell"; import FileIcon from "@mui/icons-material/AttachFile"; -import BasicCell from "@src/components/fields/_BasicCell/BasicCellNull"; -import NullEditor from "@src/components/Table/editors/NullEditor"; +import DisplayCell from "./DisplayCell"; -const TableCell = lazy( - () => import("./TableCell" /* webpackChunkName: "TableCell-File" */) +const EditorCell = lazy( + () => import("./EditorCell" /* webpackChunkName: "EditorCell-File" */) ); const SideDrawerField = lazy( () => @@ -23,8 +22,9 @@ export const config: IFieldConfig = { initialValue: [], icon: , description: "File uploaded to Firebase Storage. Supports any file type.", - TableCell: withHeavyCell(BasicCell, TableCell), - TableEditor: NullEditor as any, + TableCell: withTableCell(DisplayCell, EditorCell, "inline", { + disablePadding: true, + }), SideDrawerField, }; export default config; diff --git a/src/components/fields/Image/DisplayCell.tsx b/src/components/fields/Image/DisplayCell.tsx new file mode 100644 index 00000000..0a4f955f --- /dev/null +++ b/src/components/fields/Image/DisplayCell.tsx @@ -0,0 +1,113 @@ +import { IDisplayCellProps } from "@src/components/fields/types"; +import { useAtom } from "jotai"; + +import { alpha, Theme, Stack, Grid, ButtonBase } from "@mui/material"; +import OpenIcon from "@mui/icons-material/OpenInNewOutlined"; + +import Thumbnail from "@src/components/Thumbnail"; + +import { tableSchemaAtom, tableScope } from "@src/atoms/tableScope"; +import { DEFAULT_ROW_HEIGHT } from "@src/components/Table"; +import { FileValue } from "@src/types/table"; + +// MULTIPLE +export const imgSx = (rowHeight: number) => ({ + position: "relative", + display: "flex", + + width: (theme: Theme) => `calc(${rowHeight}px - ${theme.spacing(1)} - 1px)`, + height: (theme: Theme) => `calc(${rowHeight}px - ${theme.spacing(1)} - 1px)`, + + backgroundSize: "contain", + backgroundPosition: "center center", + backgroundRepeat: "no-repeat", + + borderRadius: 1, +}); +export const thumbnailSx = { + position: "absolute", + top: 0, + left: 0, + width: "100%", + height: "100%", +}; +export const deleteImgHoverSx = { + position: "absolute", + top: 0, + left: 0, + bottom: 0, + right: 0, + + color: "text.secondary", + boxShadow: (theme: Theme) => `0 0 0 1px ${theme.palette.divider} inset`, + borderRadius: 1, + + transition: (theme: Theme) => + theme.transitions.create("background-color", { + duration: theme.transitions.duration.shortest, + }), + + "& *": { + opacity: 0, + transition: (theme: Theme) => + theme.transitions.create("opacity", { + duration: theme.transitions.duration.shortest, + }), + }, + + ".img:hover &, .img:focus &": { + backgroundColor: (theme: Theme) => + alpha(theme.palette.background.paper, 0.8), + "& *": { opacity: 1 }, + }, +}; + +export default function Image_({ value, tabIndex }: IDisplayCellProps) { + const [tableSchema] = useAtom(tableSchemaAtom, tableScope); + + const rowHeight = tableSchema.rowHeight ?? DEFAULT_ROW_HEIGHT; + let thumbnailSize = "100x100"; + if (rowHeight > 50) thumbnailSize = "200x200"; + if (rowHeight > 100) thumbnailSize = "400x400"; + + return ( + + + {Array.isArray(value) && + value.map((file: FileValue, i) => ( + + { + window.open(file.downloadURL, "_blank")} + tabIndex={tabIndex} + > + + + + + + } + + ))} + + + ); +} diff --git a/src/components/fields/Image/TableCell.tsx b/src/components/fields/Image/EditorCell.tsx similarity index 51% rename from src/components/fields/Image/TableCell.tsx rename to src/components/fields/Image/EditorCell.tsx index 9455a059..6d7cdbe2 100644 --- a/src/components/fields/Image/TableCell.tsx +++ b/src/components/fields/Image/EditorCell.tsx @@ -1,23 +1,12 @@ import { useCallback, useState } from "react"; -import { IHeavyCellProps } from "@src/components/fields/types"; +import { IEditorCellProps } from "@src/components/fields/types"; import { useAtom, useSetAtom } from "jotai"; -import { findIndex } from "lodash-es"; import { useDropzone } from "react-dropzone"; -import { - alpha, - Theme, - Box, - Stack, - Grid, - IconButton, - ButtonBase, - Tooltip, -} from "@mui/material"; +import { alpha, Box, Stack, Grid, IconButton, ButtonBase } from "@mui/material"; import AddIcon from "@mui/icons-material/AddAPhotoOutlined"; import DeleteIcon from "@mui/icons-material/DeleteOutlined"; -import OpenIcon from "@mui/icons-material/OpenInNewOutlined"; import Thumbnail from "@src/components/Thumbnail"; import CircularProgressOptical from "@src/components/CircularProgressOptical"; @@ -32,66 +21,17 @@ import useUploader from "@src/hooks/useFirebaseStorageUploader"; import { IMAGE_MIME_TYPES } from "./index"; import { DEFAULT_ROW_HEIGHT } from "@src/components/Table"; import { FileValue } from "@src/types/table"; - -// MULTIPLE -const imgSx = (rowHeight: number) => ({ - position: "relative", - display: "flex", - - width: (theme: Theme) => `calc(${rowHeight}px - ${theme.spacing(1)} - 1px)`, - height: (theme: Theme) => `calc(${rowHeight}px - ${theme.spacing(1)} - 1px)`, - - backgroundSize: "contain", - backgroundPosition: "center center", - backgroundRepeat: "no-repeat", - - borderRadius: 1, -}); -const thumbnailSx = { - position: "absolute", - top: 0, - left: 0, - width: "100%", - height: "100%", -}; -const deleteImgHoverSx = { - position: "absolute", - top: 0, - left: 0, - bottom: 0, - right: 0, - - color: "text.secondary", - boxShadow: (theme: Theme) => `0 0 0 1px ${theme.palette.divider} inset`, - borderRadius: 1, - - transition: (theme: Theme) => - theme.transitions.create("background-color", { - duration: theme.transitions.duration.shortest, - }), - - "& *": { - opacity: 0, - transition: (theme: Theme) => - theme.transitions.create("opacity", { - duration: theme.transitions.duration.shortest, - }), - }, - - ".img:hover &": { - backgroundColor: (theme: Theme) => - alpha(theme.palette.background.paper, 0.8), - "& *": { opacity: 1 }, - }, -}; +import { imgSx, thumbnailSx, deleteImgHoverSx } from "./DisplayCell"; export default function Image_({ column, value, + onChange, onSubmit, disabled, - docRef, -}: IHeavyCellProps) { + _rowy_ref, + tabIndex, +}: IEditorCellProps) { const confirm = useSetAtom(confirmDialogAtom, projectScope); const updateField = useSetAtom(updateFieldAtom, tableScope); const [tableSchema] = useAtom(tableSchemaAtom, tableScope); @@ -107,13 +47,13 @@ export default function Image_({ if (imageFile) { upload({ - docRef: docRef! as any, + docRef: _rowy_ref, fieldName: column.key, files: [imageFile], previousValue: value, onComplete: (newValue) => { updateField({ - path: docRef.path, + path: _rowy_ref.path, fieldName: column.key, value: newValue, }); @@ -130,7 +70,8 @@ export default function Image_({ const newValue = [...value]; const toBeDeleted = newValue.splice(index, 1); toBeDeleted.length && deleteUpload(toBeDeleted[0]); - onSubmit(newValue); + onChange(newValue); + onSubmit(); }; const { getRootProps, getInputProps, isDragActive } = useDropzone({ @@ -154,9 +95,8 @@ export default function Image_({ { py: 0, pl: 1, - pr: 0.5, - outline: "none", height: "100%", + width: "100%", }, isDragActive ? { @@ -172,6 +112,7 @@ export default function Image_({ ]} alignItems="center" {...dropzoneProps} + tabIndex={tabIndex} onClick={undefined} >
    ( - {disabled ? ( - - window.open(file.downloadURL, "_blank")} - > - - - {disabled ? ( - - ) : ( - - )} - - - - ) : ( - -
    - { - confirm({ - title: "Delete image?", - body: "This image cannot be recovered after", - confirm: "Delete", - confirmColor: "error", - handleConfirm: handleDelete(i), - }); - }} - > - - - - - -
    -
    - )} + { + confirm({ + title: "Delete image?", + body: "This image cannot be recovered after", + confirm: "Delete", + confirmColor: "error", + handleConfirm: handleDelete(i), + }); + }} + disabled={disabled} + tabIndex={tabIndex} + > + + + + +
    ))} @@ -275,8 +186,9 @@ export default function Image_({ e.stopPropagation(); }} style={{ display: "flex" }} - className={docRef && "row-hover-iconButton"} - disabled={!docRef} + className={_rowy_ref && "row-hover-iconButton end"} + disabled={!_rowy_ref} + tabIndex={tabIndex} > @@ -292,7 +204,7 @@ export default function Image_({
    )} - + ); } diff --git a/src/components/fields/Image/index.tsx b/src/components/fields/Image/index.tsx index b29a7dab..1dbcde26 100644 --- a/src/components/fields/Image/index.tsx +++ b/src/components/fields/Image/index.tsx @@ -1,14 +1,13 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withHeavyCell from "@src/components/fields/_withTableCell/withHeavyCell"; +import withTableCell from "@src/components/Table/withTableCell"; import { Image as ImageIcon } from "@src/assets/icons"; -import BasicCell from "@src/components/fields/_BasicCell/BasicCellNull"; -import NullEditor from "@src/components/Table/editors/NullEditor"; +import DisplayCell from "./DisplayCell"; import ContextMenuActions from "./ContextMenuActions"; -const TableCell = lazy( - () => import("./TableCell" /* webpackChunkName: "TableCell-Image" */) +const EditorCell = lazy( + () => import("./EditorCell" /* webpackChunkName: "EditorCell-Image" */) ); const SideDrawerField = lazy( () => @@ -24,8 +23,9 @@ export const config: IFieldConfig = { icon: , description: "Image file uploaded to Firebase Storage. Supports JPEG, PNG, SVG, GIF, WebP, AVIF, JPEG XL.", - TableCell: withHeavyCell(BasicCell, TableCell), - TableEditor: NullEditor as any, + TableCell: withTableCell(DisplayCell, EditorCell, "inline", { + disablePadding: true, + }), SideDrawerField, contextMenuActions: ContextMenuActions, }; diff --git a/src/components/fields/Rating/DisplayCell.tsx b/src/components/fields/Rating/DisplayCell.tsx new file mode 100644 index 00000000..1e539ad4 --- /dev/null +++ b/src/components/fields/Rating/DisplayCell.tsx @@ -0,0 +1,68 @@ +import React, { forwardRef } from "react"; +import { IDisplayCellProps } from "@src/components/fields/types"; + +import MuiRating, { RatingProps as MuiRatingProps } from "@mui/material/Rating"; +import RatingIcon from "@mui/icons-material/Star"; +import RatingOutlineIcon from "@mui/icons-material/StarBorder"; +import { get } from "lodash-es"; + +export const getStateIcon = (config: any) => { + // only use the config to get the custom rating icon if enabled via toggle + if (!get(config, "customIcons.enabled")) { + return ; + } + return get(config, "customIcons.rating") || ; +}; + +export const getStateOutline = (config: any) => { + if (!get(config, "customIcons.enabled")) { + return ; + } + return get(config, "customIcons.rating") || ; +}; + +export const Rating = forwardRef(function Rating( + { + _rowy_ref, + column, + value, + disabled, + onChange, + }: IDisplayCellProps & Pick, + ref: React.Ref +) { + // Set max and precision from config + const { + max, + precision, + }: { + max: number; + precision: number; + } = { + max: 5, + precision: 1, + ...column.config, + }; + + return ( + e.stopPropagation()} + onKeyDown={(e) => { + if (["ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown"].includes(e.key)) + e.stopPropagation(); + }} + icon={getStateIcon(column.config)} + size="small" + readOnly={disabled} + emptyIcon={getStateOutline(column.config)} + max={max} + precision={precision} + sx={{ mx: -0.25 }} + /> + ); +}); +export default Rating; diff --git a/src/components/fields/Rating/EditorCell.tsx b/src/components/fields/Rating/EditorCell.tsx new file mode 100644 index 00000000..4d3c0c23 --- /dev/null +++ b/src/components/fields/Rating/EditorCell.tsx @@ -0,0 +1,27 @@ +import { useRef, useEffect } from "react"; +import { IEditorCellProps } from "@src/components/fields/types"; +import DisplayCell from "./DisplayCell"; + +export default function Rating({ + onChange, + tabIndex, + ...props +}: IEditorCellProps) { + const ref = useRef(null); + useEffect(() => { + const el = ref.current; + if (!el) return; + const inputs = el.querySelectorAll("input"); + for (const input of inputs) + input.setAttribute("tabindex", tabIndex.toString()); + }, [tabIndex]); + + return ( + onChange(newValue)} + ref={ref} + /> + ); +} diff --git a/src/components/fields/Rating/SideDrawerField.tsx b/src/components/fields/Rating/SideDrawerField.tsx index eb117dd4..389d3211 100644 --- a/src/components/fields/Rating/SideDrawerField.tsx +++ b/src/components/fields/Rating/SideDrawerField.tsx @@ -3,7 +3,7 @@ import { ISideDrawerFieldProps } from "@src/components/fields/types"; import { Grid } from "@mui/material"; import { Rating as MuiRating } from "@mui/material"; import "@mui/lab"; -import { getStateIcon, getStateOutline } from "./TableCell"; +import { getStateIcon, getStateOutline } from "./DisplayCell"; import { fieldSx } from "@src/components/SideDrawer/utils"; export default function Rating({ @@ -24,7 +24,6 @@ export default function Rating({ value={typeof value === "number" ? value : 0} disabled={disabled} onChange={(_, newValue) => { - console.log("onChange", newValue); onChange(newValue); onSubmit(); }} diff --git a/src/components/fields/Rating/TableCell.tsx b/src/components/fields/Rating/TableCell.tsx deleted file mode 100644 index 2e7aee52..00000000 --- a/src/components/fields/Rating/TableCell.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import { IHeavyCellProps } from "@src/components/fields/types"; - -import MuiRating from "@mui/material/Rating"; -import RatingIcon from "@mui/icons-material/Star"; -import RatingOutlineIcon from "@mui/icons-material/StarBorder" -import { get } from "lodash-es"; - - -export const getStateIcon = (config: any) => { - // only use the config to get the custom rating icon if enabled via toggle - if (!get(config, "customIcons.enabled")) { return } - return get(config, "customIcons.rating") || ; -}; - -export const getStateOutline = (config: any) => { - if (!get(config, "customIcons.enabled")) { return } - return get(config, "customIcons.rating") || ; -} - -export default function Rating({ - row, - column, - value, - onSubmit, - disabled, -}: IHeavyCellProps) { - // Set max and precision from config - const { - max, - precision, - }: { - max: number; - precision: number; - } = { - max: 5, - precision: 1, - ...column.config, - }; - - return ( - e.stopPropagation()} - icon={getStateIcon(column.config)} - size="small" - disabled={disabled} - onChange={(_, newValue) => onSubmit(newValue)} - emptyIcon={getStateOutline(column.config)} - max={max} - precision={precision} - sx={{ mx: -0.25 }} - /> - ); -} diff --git a/src/components/fields/Rating/index.tsx b/src/components/fields/Rating/index.tsx index 3cbc5108..eac10ed3 100644 --- a/src/components/fields/Rating/index.tsx +++ b/src/components/fields/Rating/index.tsx @@ -1,15 +1,12 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withHeavyCell from "@src/components/fields/_withTableCell/withHeavyCell"; +import withTableCell from "@src/components/Table/withTableCell"; import RatingIcon from "@mui/icons-material/StarBorder"; -import BasicCell from "@src/components/fields/_BasicCell/BasicCellNull"; -import NullEditor from "@src/components/Table/editors/NullEditor"; +import DisplayCell from "./DisplayCell"; +import EditorCell from "./EditorCell"; import { filterOperators } from "@src/components/fields/Number/Filter"; -const TableCell = lazy( - () => import("./TableCell" /* webpackChunkName: "TableCell-Rating" */) -); const SideDrawerField = lazy( () => import("./SideDrawerField" /* webpackChunkName: "SideDrawerField-Rating" */) @@ -29,8 +26,7 @@ export const config: IFieldConfig = { requireConfiguration: true, description: "Rating displayed as stars. Max stars is configurable, default: 5 stars.", - TableCell: withHeavyCell(BasicCell, TableCell), - TableEditor: NullEditor as any, + TableCell: withTableCell(DisplayCell, EditorCell, "inline"), settings: Settings, SideDrawerField, filter: { diff --git a/src/components/fields/SingleSelect/DisplayCell.tsx b/src/components/fields/SingleSelect/DisplayCell.tsx new file mode 100644 index 00000000..ece750d1 --- /dev/null +++ b/src/components/fields/SingleSelect/DisplayCell.tsx @@ -0,0 +1,46 @@ +import { IDisplayCellProps } from "@src/components/fields/types"; + +import { ButtonBase } from "@mui/material"; +import { ChevronDown } from "@src/assets/icons"; + +import { sanitiseValue } from "./utils"; + +export default function SingleSelect({ + value, + showPopoverCell, + disabled, + tabIndex, +}: IDisplayCellProps) { + const rendered = ( +
    + {sanitiseValue(value)} +
    + ); + + if (disabled) return rendered; + + return ( + showPopoverCell(true)} + style={{ + width: "100%", + height: "100%", + font: "inherit", + color: "inherit !important", + letterSpacing: "inherit", + textAlign: "inherit", + justifyContent: "flex-start", + }} + tabIndex={tabIndex} + > + {rendered} + + + ); +} diff --git a/src/components/fields/SingleSelect/PopoverCell.tsx b/src/components/fields/SingleSelect/EditorCell.tsx similarity index 54% rename from src/components/fields/SingleSelect/PopoverCell.tsx rename to src/components/fields/SingleSelect/EditorCell.tsx index 4aafda6b..0fd1c317 100644 --- a/src/components/fields/SingleSelect/PopoverCell.tsx +++ b/src/components/fields/SingleSelect/EditorCell.tsx @@ -1,23 +1,24 @@ -import { IPopoverCellProps } from "@src/components/fields/types"; +import { IEditorCellProps } from "@src/components/fields/types"; -import MultiSelect_ from "@rowy/multiselect"; +import MultiSelectComponent from "@rowy/multiselect"; import { sanitiseValue } from "./utils"; export default function SingleSelect({ value, + onChange, onSubmit, column, parentRef, showPopoverCell, disabled, -}: IPopoverCellProps) { +}: IEditorCellProps) { const config = column.config ?? {}; return ( - showPopoverCell(false)} + onClose={() => { + showPopoverCell(false); + onSubmit(); + }} /> ); } diff --git a/src/components/fields/SingleSelect/InlineCell.tsx b/src/components/fields/SingleSelect/InlineCell.tsx deleted file mode 100644 index d133b1cc..00000000 --- a/src/components/fields/SingleSelect/InlineCell.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import { forwardRef } from "react"; -import { IPopoverInlineCellProps } from "@src/components/fields/types"; - -import { ButtonBase } from "@mui/material"; -import { ChevronDown } from "@src/assets/icons"; - -import { sanitiseValue } from "./utils"; - -export const SingleSelect = forwardRef(function SingleSelect( - { value, showPopoverCell, disabled }: IPopoverInlineCellProps, - ref: React.Ref -) { - return ( - showPopoverCell(true)} - ref={ref} - disabled={disabled} - className="cell-collapse-padding" - style={{ - padding: "var(--cell-padding)", - paddingRight: 0, - height: "100%", - - font: "inherit", - color: "inherit !important", - letterSpacing: "inherit", - textAlign: "inherit", - justifyContent: "flex-start", - }} - > -
    - {sanitiseValue(value)} -
    - - {!disabled && ( - - )} -
    - ); -}); - -export default SingleSelect; diff --git a/src/components/fields/SingleSelect/index.tsx b/src/components/fields/SingleSelect/index.tsx index 9d396280..187be997 100644 --- a/src/components/fields/SingleSelect/index.tsx +++ b/src/components/fields/SingleSelect/index.tsx @@ -1,17 +1,12 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withPopoverCell from "@src/components/fields/_withTableCell/withPopoverCell"; +import withTableCell from "@src/components/Table/withTableCell"; import { SingleSelect as SingleSelectIcon } from "@src/assets/icons"; -import BasicCell from "@src/components/fields/_BasicCell/BasicCellNull"; -import InlineCell from "./InlineCell"; -import NullEditor from "@src/components/Table/editors/NullEditor"; +import DisplayCell from "./DisplayCell"; +import EditorCell from "./EditorCell"; import { filterOperators } from "@src/components/fields/ShortText/Filter"; -const PopoverCell = lazy( - () => - import("./PopoverCell" /* webpackChunkName: "PopoverCell-SingleSelect" */) -); const SideDrawerField = lazy( () => import( @@ -32,11 +27,10 @@ export const config: IFieldConfig = { icon: , description: "Single value from predefined options. Options are searchable and users can optionally input custom values.", - TableCell: withPopoverCell(BasicCell, InlineCell, PopoverCell, { - anchorOrigin: { horizontal: "left", vertical: "bottom" }, - transparent: true, + TableCell: withTableCell(DisplayCell, EditorCell, "popover", { + disablePadding: true, + transparentPopover: true, }), - TableEditor: NullEditor as any, SideDrawerField, settings: Settings, filter: { operators: filterOperators }, diff --git a/src/components/fields/Status/DisplayCell.tsx b/src/components/fields/Status/DisplayCell.tsx new file mode 100644 index 00000000..9717a19c --- /dev/null +++ b/src/components/fields/Status/DisplayCell.tsx @@ -0,0 +1,71 @@ +import { forwardRef, useMemo } from "react"; +import { IDisplayCellProps } from "@src/components/fields/types"; + +import { ButtonBase } from "@mui/material"; +import { ChevronDown } from "@src/assets/icons"; +import getLabel from "./utils/getLabelHelper"; + +export const StatusSingleSelect = forwardRef(function StatusSingleSelect({ + column, + value, + showPopoverCell, + disabled, + tabIndex, +}: IDisplayCellProps) { + const conditions = column.config?.conditions; + + const rendered = useMemo(() => { + const lowPriorityOperator = ["<", "<=", ">=", ">"]; + const otherOperator = (conditions ?? []).filter( + (c: any) => !lowPriorityOperator.includes(c.operator) + ); + + /**Revisit this */ + const sortLowPriorityList = (conditions ?? []) + .filter((c: any) => { + return lowPriorityOperator.includes(c.operator); + }) + .sort((a: any, b: any) => { + const aDistFromValue = Math.abs(value - a.value); + const bDistFromValue = Math.abs(value - b.value); + //return the smallest distance + return aDistFromValue - bDistFromValue; + }); + const sortedConditions = [...otherOperator, ...sortLowPriorityList]; + + return ( +
    + {getLabel(value, sortedConditions)} +
    + ); + }, [value, conditions]); + + if (disabled) return rendered; + + return ( + showPopoverCell(true)} + style={{ + width: "100%", + height: "100%", + font: "inherit", + color: "inherit !important", + letterSpacing: "inherit", + textAlign: "inherit", + justifyContent: "flex-start", + }} + tabIndex={tabIndex} + > + {rendered} + + + ); +}); + +export default StatusSingleSelect; diff --git a/src/components/fields/Status/PopoverCell.tsx b/src/components/fields/Status/EditorCell.tsx similarity index 67% rename from src/components/fields/Status/PopoverCell.tsx rename to src/components/fields/Status/EditorCell.tsx index 8ca1a63e..538aa4fc 100644 --- a/src/components/fields/Status/PopoverCell.tsx +++ b/src/components/fields/Status/EditorCell.tsx @@ -1,14 +1,15 @@ -import { IPopoverCellProps } from "@src/components/fields/types"; -import MultiSelect_ from "@rowy/multiselect"; +import { IEditorCellProps } from "@src/components/fields/types"; +import MultiSelectComponent from "@rowy/multiselect"; export default function StatusSingleSelect({ value, + onChange, onSubmit, column, parentRef, showPopoverCell, disabled, -}: IPopoverCellProps) { +}: IEditorCellProps) { const config = column.config ?? {}; const conditions = config.conditions ?? []; /**Revisit eventually, can we abstract or use a helper function to clean this? */ @@ -22,9 +23,9 @@ export default function StatusSingleSelect({ }); return ( // eslint-disable-next-line react/jsx-pascal-case - onSubmit(v)} + onChange={(v) => onChange(v)} options={conditions.length >= 1 ? reMappedConditions : []} // this handles when conditions are deleted multiple={false} freeText={config.freeText} @@ -37,12 +38,18 @@ export default function StatusSingleSelect({ open: true, MenuProps: { anchorEl: parentRef, - anchorOrigin: { vertical: "bottom", horizontal: "left" }, - transformOrigin: { vertical: "top", horizontal: "left" }, + anchorOrigin: { vertical: "bottom", horizontal: "center" }, + transformOrigin: { vertical: "top", horizontal: "center" }, + sx: { + "& .MuiPaper-root": { minWidth: `${column.width}px !important` }, + }, }, }, }} - onClose={() => showPopoverCell(false)} + onClose={() => { + showPopoverCell(false); + onSubmit(); + }} /> ); } diff --git a/src/components/fields/Status/InlineCell.tsx b/src/components/fields/Status/InlineCell.tsx deleted file mode 100644 index 35176e3d..00000000 --- a/src/components/fields/Status/InlineCell.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import { forwardRef, useMemo } from "react"; -import { IPopoverInlineCellProps } from "@src/components/fields/types"; - -import { ButtonBase } from "@mui/material"; -import { ChevronDown } from "@src/assets/icons"; -import getLabel from "./utils/getLabelHelper"; - -export const StatusSingleSelect = forwardRef(function StatusSingleSelect( - { column, value, showPopoverCell, disabled }: IPopoverInlineCellProps, - ref: React.Ref -) { - const conditions = column.config?.conditions ?? []; - const lowPriorityOperator = ["<", "<=", ">=", ">"]; - const otherOperator = conditions.filter( - (c: any) => !lowPriorityOperator.includes(c.operator) - ); - - /**Revisit this */ - const sortLowPriorityList = conditions - .filter((c: any) => { - return lowPriorityOperator.includes(c.operator); - }) - .sort((a: any, b: any) => { - const aDistFromValue = Math.abs(value - a.value); - const bDistFromValue = Math.abs(value - b.value); - //return the smallest distance - return aDistFromValue - bDistFromValue; - }); - const sortedConditions = [...otherOperator, ...sortLowPriorityList]; - const label = useMemo( - () => getLabel(value, sortedConditions), - [value, sortedConditions] - ); - return ( - showPopoverCell(true)} - ref={ref} - disabled={disabled} - className="cell-collapse-padding" - style={{ - padding: "var(--cell-padding)", - paddingRight: 0, - height: "100%", - font: "inherit", - color: "inherit !important", - letterSpacing: "inherit", - textAlign: "inherit", - justifyContent: "flex-start", - }} - > -
    {label}
    - - {!disabled && ( - - )} -
    - ); -}); - -export default StatusSingleSelect; diff --git a/src/components/fields/Status/index.tsx b/src/components/fields/Status/index.tsx index 16b1ecf8..d4d0e978 100644 --- a/src/components/fields/Status/index.tsx +++ b/src/components/fields/Status/index.tsx @@ -1,13 +1,11 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import { Status as StatusIcon } from "@src/assets/icons"; -import NullEditor from "@src/components/Table/editors/NullEditor"; +import withTableCell from "@src/components/Table/withTableCell"; +import { Status as StatusIcon } from "@src/assets/icons"; +import DisplayCell from "./DisplayCell"; +import EditorCell from "./EditorCell"; import { filterOperators } from "./Filter"; -import BasicCell from "@src/components/fields/_BasicCell/BasicCellNull"; -import PopoverCell from "./PopoverCell"; -import InlineCell from "./InlineCell"; -import withPopoverCell from "@src/components/fields/_withTableCell/withPopoverCell"; const SideDrawerField = lazy( () => @@ -25,12 +23,11 @@ export const config: IFieldConfig = { initialValue: undefined, initializable: true, icon: , - description: "Displays field value as custom status text. Read-only. ", - TableCell: withPopoverCell(BasicCell, InlineCell, PopoverCell, { - anchorOrigin: { horizontal: "left", vertical: "bottom" }, - transparent: true, + description: "Displays field value as custom status text.", + TableCell: withTableCell(DisplayCell, EditorCell, "popover", { + disablePadding: true, + transparentPopover: true, }), - TableEditor: NullEditor as any, settings: Settings, SideDrawerField, requireConfiguration: true, diff --git a/src/components/fields/SubTable/TableCell.tsx b/src/components/fields/SubTable/DisplayCell.tsx similarity index 60% rename from src/components/fields/SubTable/TableCell.tsx rename to src/components/fields/SubTable/DisplayCell.tsx index 72c2df42..f9c9c3e7 100644 --- a/src/components/fields/SubTable/TableCell.tsx +++ b/src/components/fields/SubTable/DisplayCell.tsx @@ -1,27 +1,31 @@ -import { IHeavyCellProps } from "@src/components/fields/types"; +import { IDisplayCellProps } from "@src/components/fields/types"; import { Link } from "react-router-dom"; import { Stack, IconButton } from "@mui/material"; -import LaunchIcon from "@mui/icons-material/Launch"; +import OpenIcon from "@mui/icons-material/OpenInBrowser"; import { useSubTableData } from "./utils"; -export default function SubTable({ column, row }: IHeavyCellProps) { +export default function SubTable({ + column, + row, + _rowy_ref, + tabIndex, +}: IDisplayCellProps) { const { documentCount, label, subTablePath } = useSubTableData( column as any, row, - row._rowy_ref + _rowy_ref ); - if (!row._rowy_ref) return null; + if (!_rowy_ref) return null; return (
    {documentCount} {column.name as string}: {label} @@ -30,12 +34,12 @@ export default function SubTable({ column, row }: IHeavyCellProps) { - + ); diff --git a/src/components/fields/SubTable/SideDrawerField.tsx b/src/components/fields/SubTable/SideDrawerField.tsx index 32f2b1f8..abf8e1e0 100644 --- a/src/components/fields/SubTable/SideDrawerField.tsx +++ b/src/components/fields/SubTable/SideDrawerField.tsx @@ -6,7 +6,7 @@ import { ISideDrawerFieldProps } from "@src/components/fields/types"; import { Link } from "react-router-dom"; import { Box, Stack, IconButton } from "@mui/material"; -import LaunchIcon from "@mui/icons-material/Launch"; +import OpenIcon from "@mui/icons-material/OpenInBrowser"; import { tableScope, tableRowsAtom } from "@src/atoms/tableScope"; import { fieldSx, getFieldId } from "@src/components/SideDrawer/utils"; @@ -46,7 +46,7 @@ export default function SubTable({ column, _rowy_ref }: ISideDrawerFieldProps) { sx={{ ml: 1 }} disabled={!subTablePath} > - + ); diff --git a/src/components/fields/SubTable/index.tsx b/src/components/fields/SubTable/index.tsx index b7ce171e..84df815d 100644 --- a/src/components/fields/SubTable/index.tsx +++ b/src/components/fields/SubTable/index.tsx @@ -1,14 +1,10 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withHeavyCell from "@src/components/fields/_withTableCell/withHeavyCell"; +import withTableCell from "@src/components/Table/withTableCell"; import { SubTable as SubTableIcon } from "@src/assets/icons"; -import BasicCell from "@src/components/fields/_BasicCell/BasicCellName"; -import NullEditor from "@src/components/Table/editors/NullEditor"; +import DisplayCell from "./DisplayCell"; -const TableCell = lazy( - () => import("./TableCell" /* webpackChunkName: "TableCell-SubTable" */) -); const SideDrawerField = lazy( () => import( @@ -28,8 +24,10 @@ export const config: IFieldConfig = { settings: Settings, description: "Connects to a sub-table in the current row. Also displays number of rows inside the sub-table. Max sub-table depth: 100.", - TableCell: withHeavyCell(BasicCell, TableCell), - TableEditor: NullEditor as any, + TableCell: withTableCell(DisplayCell, null, "focus", { + usesRowData: true, + disablePadding: true, + }), SideDrawerField, initializable: false, requireConfiguration: true, diff --git a/src/hooks/useFirebaseStorageUploader.tsx b/src/hooks/useFirebaseStorageUploader.tsx index 16fbd521..ae0681fd 100644 --- a/src/hooks/useFirebaseStorageUploader.tsx +++ b/src/hooks/useFirebaseStorageUploader.tsx @@ -1,7 +1,6 @@ import { useReducer } from "react"; import { useAtom } from "jotai"; import { useSnackbar } from "notistack"; -import type { DocumentReference } from "firebase/firestore"; import { ref, uploadBytesResumable, @@ -15,7 +14,7 @@ import InlineOpenInNewIcon from "@src/components/InlineOpenInNewIcon"; import { projectScope } from "@src/atoms/projectScope"; import { firebaseStorageAtom } from "@src/sources/ProjectSourceFirebase"; import { WIKI_LINKS } from "@src/constants/externalLinks"; -import { FileValue } from "@src/types/table"; +import { FileValue, TableRowRef } from "@src/types/table"; export type UploaderState = { progress: number; @@ -30,7 +29,7 @@ const uploadReducer = ( ) => ({ ...prevState, ...newProps }); export type UploadProps = { - docRef: DocumentReference; + docRef: TableRowRef; fieldName: string; files: File[]; previousValue?: FileValue[]; From 06049830ecc85d1ca90c91cc61c0f67c029b5548 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Fri, 11 Nov 2022 15:49:55 +1100 Subject: [PATCH 251/309] remove unused code --- .../BasicCellContextMenuActions.tsx | 0 src/components/Table/editors/NullEditor.tsx | 25 --- src/components/Table/editors/styles.ts | 9 -- .../Table/editors/withNullEditor.tsx | 44 ----- .../Table/editors/withSideDrawerEditor.tsx | 53 ------ src/components/fields/Email/index.tsx | 4 +- src/components/fields/LongText/index.tsx | 2 +- src/components/fields/Number/index.tsx | 2 +- src/components/fields/Percentage/index.tsx | 2 +- src/components/fields/Phone/index.tsx | 4 +- src/components/fields/RichText/index.tsx | 2 +- .../fields/ShortText/DisplayCell.tsx | 6 + src/components/fields/ShortText/index.tsx | 6 +- src/components/fields/Url/index.tsx | 2 +- .../fields/_BasicCell/BasicCellName.tsx | 5 - .../fields/_BasicCell/BasicCellNull.tsx | 3 - .../fields/_BasicCell/BasicCellValue.tsx | 6 - .../fields/_withTableCell/withBasicCell.tsx | 29 ---- .../fields/_withTableCell/withHeavyCell.tsx | 83 ---------- .../fields/_withTableCell/withPopoverCell.tsx | 151 ------------------ src/components/fields/types.ts | 25 --- 21 files changed, 18 insertions(+), 445 deletions(-) rename src/components/{fields/_BasicCell => Table/ContextMenu}/BasicCellContextMenuActions.tsx (100%) delete mode 100644 src/components/Table/editors/NullEditor.tsx delete mode 100644 src/components/Table/editors/styles.ts delete mode 100644 src/components/Table/editors/withNullEditor.tsx delete mode 100644 src/components/Table/editors/withSideDrawerEditor.tsx create mode 100644 src/components/fields/ShortText/DisplayCell.tsx delete mode 100644 src/components/fields/_BasicCell/BasicCellName.tsx delete mode 100644 src/components/fields/_BasicCell/BasicCellNull.tsx delete mode 100644 src/components/fields/_BasicCell/BasicCellValue.tsx delete mode 100644 src/components/fields/_withTableCell/withBasicCell.tsx delete mode 100644 src/components/fields/_withTableCell/withHeavyCell.tsx delete mode 100644 src/components/fields/_withTableCell/withPopoverCell.tsx diff --git a/src/components/fields/_BasicCell/BasicCellContextMenuActions.tsx b/src/components/Table/ContextMenu/BasicCellContextMenuActions.tsx similarity index 100% rename from src/components/fields/_BasicCell/BasicCellContextMenuActions.tsx rename to src/components/Table/ContextMenu/BasicCellContextMenuActions.tsx diff --git a/src/components/Table/editors/NullEditor.tsx b/src/components/Table/editors/NullEditor.tsx deleted file mode 100644 index 58a91fd1..00000000 --- a/src/components/Table/editors/NullEditor.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import React from "react"; -import { EditorProps } from "react-data-grid"; -import { GlobalStyles } from "tss-react"; - -/** - * Allow the cell to be editable, but disable react-data-grid’s default - * text editor to show. - * - * Hides the editor container so the cell below remains editable inline. - * - * Use for cells that have inline editing and don’t need to be double-clicked. - * - * TODO: fix NullEditor overwriting the formatter component - */ -export default class NullEditor extends React.Component> { - getInputNode = () => null; - getValue = () => null; - render = () => ( - - ); -} diff --git a/src/components/Table/editors/styles.ts b/src/components/Table/editors/styles.ts deleted file mode 100644 index 0eb31315..00000000 --- a/src/components/Table/editors/styles.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { createStyles } from "@mui/material"; - -export const styles = createStyles({ - "@global": { - ".rdg-editor-container": { display: "none" }, - }, -}); - -export default styles; diff --git a/src/components/Table/editors/withNullEditor.tsx b/src/components/Table/editors/withNullEditor.tsx deleted file mode 100644 index 7d8ed000..00000000 --- a/src/components/Table/editors/withNullEditor.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import { get } from "lodash-es"; -import { EditorProps } from "react-data-grid"; -import { IHeavyCellProps } from "@src/components/fields/types"; - -/** - * Allow the cell to be editable, but disable react-data-grid’s default - * text editor to show. - * - * Hides the editor container so the cell below remains editable inline. - * - * Use for cells that have inline editing and don’t need to be double-clicked. - */ -export default function withNullEditor( - HeavyCell?: React.ComponentType -) { - return function NullEditor(props: EditorProps) { - const { row, column } = props; - - return HeavyCell ? ( -
    - {}} - disabled={props.column.editable === false} - /> -
    - ) : null; - }; -} diff --git a/src/components/Table/editors/withSideDrawerEditor.tsx b/src/components/Table/editors/withSideDrawerEditor.tsx deleted file mode 100644 index e7522f7e..00000000 --- a/src/components/Table/editors/withSideDrawerEditor.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import { useEffect } from "react"; -import { useSetAtom } from "jotai"; -import { EditorProps } from "react-data-grid"; -import { get } from "lodash-es"; - -import { tableScope, sideDrawerOpenAtom } from "@src/atoms/tableScope"; -import { IHeavyCellProps } from "@src/components/fields/types"; - -/** - * Allow the cell to be editable, but disable react-data-grid’s default - * text editor to show. Opens the side drawer in the appropriate position. - * - * Displays the current HeavyCell or HeavyCell since it overwrites cell contents. - * - * Use for cells that do not support any type of in-cell editing. - */ -export default function withSideDrawerEditor( - HeavyCell?: React.ComponentType -) { - return function SideDrawerEditor(props: EditorProps) { - const { row, column } = props; - - const setSideDrawerOpen = useSetAtom(sideDrawerOpenAtom, tableScope); - useEffect(() => { - setSideDrawerOpen(true); - }, [setSideDrawerOpen]); - - return HeavyCell ? ( -
    - {}} - disabled={props.column.editable === false} - /> -
    - ) : null; - }; -} diff --git a/src/components/fields/Email/index.tsx b/src/components/fields/Email/index.tsx index d8a461ac..1450f513 100644 --- a/src/components/fields/Email/index.tsx +++ b/src/components/fields/Email/index.tsx @@ -3,10 +3,10 @@ import { IFieldConfig, FieldType } from "@src/components/fields/types"; import withTableCell from "@src/components/Table/withTableCell"; import EmailIcon from "@mui/icons-material/MailOutlined"; -import DisplayCell from "@src/components/fields/_BasicCell/BasicCellValue"; +import DisplayCell from "@src/components/fields/ShortText/DisplayCell"; import EditorCell from "./EditorCell"; import { filterOperators } from "@src/components/fields/ShortText/Filter"; -import BasicContextMenuActions from "@src/components/fields/_BasicCell/BasicCellContextMenuActions"; +import BasicContextMenuActions from "@src/components/Table/ContextMenu/BasicCellContextMenuActions"; const SideDrawerField = lazy( () => diff --git a/src/components/fields/LongText/index.tsx b/src/components/fields/LongText/index.tsx index 6685d26c..00c79f31 100644 --- a/src/components/fields/LongText/index.tsx +++ b/src/components/fields/LongText/index.tsx @@ -7,7 +7,7 @@ import DisplayCell from "./DisplayCell"; import EditorCell from "./EditorCell"; import { filterOperators } from "./Filter"; -import BasicContextMenuActions from "@src/components/fields/_BasicCell/BasicCellContextMenuActions"; +import BasicContextMenuActions from "@src/components/Table/ContextMenu/BasicCellContextMenuActions"; const SideDrawerField = lazy( () => diff --git a/src/components/fields/Number/index.tsx b/src/components/fields/Number/index.tsx index 7bed8e43..0a25fca8 100644 --- a/src/components/fields/Number/index.tsx +++ b/src/components/fields/Number/index.tsx @@ -6,7 +6,7 @@ import { Number as NumberIcon } from "@src/assets/icons"; import DisplayCell from "./DisplayCell"; import EditorCell from "./EditorCell"; import { filterOperators } from "./Filter"; -import BasicContextMenuActions from "@src/components/fields/_BasicCell/BasicCellContextMenuActions"; +import BasicContextMenuActions from "@src/components/Table/ContextMenu/BasicCellContextMenuActions"; const SideDrawerField = lazy( () => import("./SideDrawerField" /* webpackChunkName: "SideDrawerField-Number" */) diff --git a/src/components/fields/Percentage/index.tsx b/src/components/fields/Percentage/index.tsx index 99239f7c..86ff6fe6 100644 --- a/src/components/fields/Percentage/index.tsx +++ b/src/components/fields/Percentage/index.tsx @@ -6,7 +6,7 @@ import { Percentage as PercentageIcon } from "@src/assets/icons"; import DisplayCell from "./DisplayCell"; import EditorCell from "./EditorCell"; import { filterOperators } from "@src/components/fields/Number/Filter"; -import BasicContextMenuActions from "@src/components/fields/_BasicCell/BasicCellContextMenuActions"; +import BasicContextMenuActions from "@src/components/Table/ContextMenu/BasicCellContextMenuActions"; const SideDrawerField = lazy( () => diff --git a/src/components/fields/Phone/index.tsx b/src/components/fields/Phone/index.tsx index 9e5c1ebe..ec8792a6 100644 --- a/src/components/fields/Phone/index.tsx +++ b/src/components/fields/Phone/index.tsx @@ -3,10 +3,10 @@ import { IFieldConfig, FieldType } from "@src/components/fields/types"; import withTableCell from "@src/components/Table/withTableCell"; import PhoneIcon from "@mui/icons-material/PhoneOutlined"; -import DisplayCell from "@src/components/fields/_BasicCell/BasicCellValue"; +import DisplayCell from "@src/components/fields/ShortText/DisplayCell"; import EditorCell from "./EditorCell"; import { filterOperators } from "@src/components/fields/ShortText/Filter"; -import BasicContextMenuActions from "@src/components/fields/_BasicCell/BasicCellContextMenuActions"; +import BasicContextMenuActions from "@src/components/Table/ContextMenu/BasicCellContextMenuActions"; const SideDrawerField = lazy( () => diff --git a/src/components/fields/RichText/index.tsx b/src/components/fields/RichText/index.tsx index 80202a98..bd53d610 100644 --- a/src/components/fields/RichText/index.tsx +++ b/src/components/fields/RichText/index.tsx @@ -4,7 +4,7 @@ import withTableCell from "@src/components/Table/withTableCell"; import RichTextIcon from "@mui/icons-material/TextFormat"; import DisplayCell from "./DisplayCell"; -import BasicContextMenuActions from "@src/components/fields/_BasicCell/BasicCellContextMenuActions"; +import BasicContextMenuActions from "@src/components/Table/ContextMenu/BasicCellContextMenuActions"; const SideDrawerField = lazy( () => diff --git a/src/components/fields/ShortText/DisplayCell.tsx b/src/components/fields/ShortText/DisplayCell.tsx new file mode 100644 index 00000000..f29adca6 --- /dev/null +++ b/src/components/fields/ShortText/DisplayCell.tsx @@ -0,0 +1,6 @@ +import { IDisplayCellProps } from "@src/components/fields/types"; + +export default function DisplayCellValue({ value }: IDisplayCellProps) { + if (typeof value !== "string") return null; + return <>{value}; +} diff --git a/src/components/fields/ShortText/index.tsx b/src/components/fields/ShortText/index.tsx index 7bd36ddc..0160a64a 100644 --- a/src/components/fields/ShortText/index.tsx +++ b/src/components/fields/ShortText/index.tsx @@ -3,11 +3,11 @@ import { IFieldConfig, FieldType } from "@src/components/fields/types"; import withTableCell from "@src/components/Table/withTableCell"; import ShortTextIcon from "@mui/icons-material/ShortText"; -import BasicCell from "@src/components/fields/_BasicCell/BasicCellValue"; +import DisplayCell from "@src/components/fields/ShortText/DisplayCell"; import EditorCell from "./EditorCell"; import { filterOperators } from "./Filter"; -import BasicContextMenuActions from "@src/components/fields/_BasicCell/BasicCellContextMenuActions"; +import BasicContextMenuActions from "@src/components/Table/ContextMenu/BasicCellContextMenuActions"; const SideDrawerField = lazy( () => @@ -30,7 +30,7 @@ export const config: IFieldConfig = { icon: , description: "Text displayed on a single line.", contextMenuActions: BasicContextMenuActions, - TableCell: withTableCell(BasicCell, EditorCell), + TableCell: withTableCell(DisplayCell, EditorCell), SideDrawerField, settings: Settings, filter: { diff --git a/src/components/fields/Url/index.tsx b/src/components/fields/Url/index.tsx index c6fb3fd7..612423d0 100644 --- a/src/components/fields/Url/index.tsx +++ b/src/components/fields/Url/index.tsx @@ -6,7 +6,7 @@ import UrlIcon from "@mui/icons-material/Link"; import DisplayCell from "./DisplayCell"; import EditorCell from "./EditorCell"; import { filterOperators } from "@src/components/fields/ShortText/Filter"; -import BasicContextMenuActions from "@src/components/fields/_BasicCell/BasicCellContextMenuActions"; +import BasicContextMenuActions from "@src/components/Table/ContextMenu/BasicCellContextMenuActions"; const SideDrawerField = lazy( () => diff --git a/src/components/fields/_BasicCell/BasicCellName.tsx b/src/components/fields/_BasicCell/BasicCellName.tsx deleted file mode 100644 index 5d93cd7b..00000000 --- a/src/components/fields/_BasicCell/BasicCellName.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { IBasicCellProps } from "@src/components/fields/types"; - -export default function BasicCellName({ name }: IBasicCellProps) { - return <>{name}; -} diff --git a/src/components/fields/_BasicCell/BasicCellNull.tsx b/src/components/fields/_BasicCell/BasicCellNull.tsx deleted file mode 100644 index 6b8471b3..00000000 --- a/src/components/fields/_BasicCell/BasicCellNull.tsx +++ /dev/null @@ -1,3 +0,0 @@ -export default function BasicCellNull(props: any) { - return
    ; -} diff --git a/src/components/fields/_BasicCell/BasicCellValue.tsx b/src/components/fields/_BasicCell/BasicCellValue.tsx deleted file mode 100644 index 8d8b0445..00000000 --- a/src/components/fields/_BasicCell/BasicCellValue.tsx +++ /dev/null @@ -1,6 +0,0 @@ -import { IBasicCellProps } from "@src/components/fields/types"; - -export default function BasicCellValue({ value }: IBasicCellProps) { - if (typeof value !== "string") return null; - return <>{value}; -} diff --git a/src/components/fields/_withTableCell/withBasicCell.tsx b/src/components/fields/_withTableCell/withBasicCell.tsx deleted file mode 100644 index a268bf2e..00000000 --- a/src/components/fields/_withTableCell/withBasicCell.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import type { TableCellProps } from "@src/components/Table"; -import { ErrorBoundary } from "react-error-boundary"; -import { IBasicCellProps } from "@src/components/fields/types"; - -import { InlineErrorFallback } from "@src/components/ErrorFallback"; -import CellValidation from "@src/components/Table/CellValidation"; - -/** - * HOC to wrap around table cell components. - * Renders read-only BasicCell only. - * @param BasicCellComponent - The light cell component to display at all times - */ -export default function withBasicCell( - BasicCellComponent: React.ComponentType -) { - return function BasicCell({ row, column, getValue }: TableCellProps) { - const columnConfig = column.columnDef.meta!; - const { name } = columnConfig; - const value = getValue(); - - return ( - - ); - }; -} diff --git a/src/components/fields/_withTableCell/withHeavyCell.tsx b/src/components/fields/_withTableCell/withHeavyCell.tsx deleted file mode 100644 index 64c612fb..00000000 --- a/src/components/fields/_withTableCell/withHeavyCell.tsx +++ /dev/null @@ -1,83 +0,0 @@ -import { Suspense, useState, useEffect, startTransition } from "react"; -import { useSetAtom } from "jotai"; -import { get } from "lodash-es"; -import type { TableCellProps } from "@src/components/Table"; -import { IBasicCellProps, IHeavyCellProps } from "@src/components/fields/types"; - -import { tableScope, updateFieldAtom } from "@src/atoms/tableScope"; -import { FieldType } from "@src/constants/fields"; - -/** - * HOC to wrap table cell components. - * Renders read-only BasicCell while scrolling for better scroll performance. - * @param BasicCellComponent - The lighter cell component to display while scrolling - * @param HeavyCellComponent - The read/write cell component to display - * @param readOnly - Prevent the component from updating the cell value - */ -export default function withHeavyCell( - BasicCellComponent: React.ComponentType, - HeavyCellComponent: React.ComponentType, - readOnly: boolean = false -) { - return function HeavyCell({ row, column, getValue }: TableCellProps) { - const updateField = useSetAtom(updateFieldAtom, tableScope); - - // const displayedComponent = "heavy"; - // Initially display BasicCell to improve scroll performance - const [displayedComponent, setDisplayedComponent] = useState< - "basic" | "heavy" - >("basic"); - // Then switch to HeavyCell once completed - useEffect(() => { - startTransition(() => { - setDisplayedComponent("heavy"); - }); - }, []); - - // TODO: Investigate if this still needs to be a state - const value = getValue(); - const [localValue, setLocalValue] = useState(value); - useEffect(() => { - setLocalValue(value); - }, [value]); - - // Declare basicCell here so props can be reused by HeavyCellComponent - const basicCellProps = { - value: localValue, - name: column.columnDef.meta!.name, - type: column.columnDef.meta!.type, - onMouseOver: () => setDisplayedComponent("heavy"), - onMouseLeave: () => setDisplayedComponent("basic"), - }; - const basicCell = ; - - if (displayedComponent === "basic") return basicCell; - - const handleSubmit = (value: any) => { - if (readOnly) return; - updateField({ - path: row.original._rowy_ref.path, - fieldName: column.id, - value, - }); - setLocalValue(value); - }; - - if (displayedComponent === "heavy") - return ( - - - - ); - - // Should not reach this line - return null; - }; -} diff --git a/src/components/fields/_withTableCell/withPopoverCell.tsx b/src/components/fields/_withTableCell/withPopoverCell.tsx deleted file mode 100644 index 8a1f6b20..00000000 --- a/src/components/fields/_withTableCell/withPopoverCell.tsx +++ /dev/null @@ -1,151 +0,0 @@ -import { Suspense, useState, useEffect, useRef } from "react"; -import { useSetAtom } from "jotai"; -import { get } from "lodash-es"; -import type { TableCellProps } from "@src/components/Table"; -import { - IBasicCellProps, - IPopoverInlineCellProps, - IPopoverCellProps, -} from "@src/components/fields/types"; - -import { Popover, PopoverProps } from "@mui/material"; - -import { tableScope, updateFieldAtom } from "@src/atoms/tableScope"; -import { FieldType } from "@src/constants/fields"; - -export interface IPopoverCellOptions extends Partial { - transparent?: boolean; - readOnly?: boolean; -} - -/** - * HOC to wrap around table cell formatters. - * Renders read-only BasicCell while scrolling for better scroll performance. - * When the user clicks the heavier inline cell, it displays PopoverCell. - * @param BasicCellComponent - The lighter cell component to display while scrolling - * @param InlineCellComponent - The heavier cell component to display inline - * @param PopoverCellComponent - The heavy read/write cell component to display in Popover - * @param options - {@link IPopoverCellOptions} - */ -export default function withPopoverCell( - BasicCellComponent: React.ComponentType, - InlineCellComponent: React.ForwardRefExoticComponent< - IPopoverInlineCellProps & React.RefAttributes - >, - PopoverCellComponent: React.ComponentType, - options?: IPopoverCellOptions -) { - return function PopoverCell({ row, column, getValue }: TableCellProps) { - const { transparent, ...popoverProps } = options ?? {}; - - const updateField = useSetAtom(updateFieldAtom, tableScope); - - // Initially display BasicCell to improve scroll performance - const [displayedComponent, setDisplayedComponent] = useState< - "basic" | "inline" | "popover" - >("inline"); - // Then switch to heavier InlineCell once completed - // useEffect(() => { - // setTimeout(() => { - // setDisplayedComponent("inline"); - // }); - // }, []); - - // Store Popover open state here so we can add delay for close transition - const [popoverOpen, setPopoverOpen] = useState(false); - - // Store ref to rendered InlineCell here to get positioning for PopoverCell - const inlineCellRef = useRef(null); - - // TODO: Investigate if this still needs to be a state - const value = getValue(); - const [localValue, setLocalValue] = useState(value); - useEffect(() => { - setLocalValue(value); - }, [value]); - - // Declare basicCell here so props can be reused by HeavyCellComponent - const basicCellProps = { - value: localValue, - name: column.columnDef.meta!.name, - type: column.columnDef.meta!.type, - }; - - if (displayedComponent === "basic") - return ; - - // This is where we update the documents - const handleSubmit = (value: any) => { - if (options?.readOnly) return; - updateField({ - path: row.original._rowy_ref.path, - fieldName: column.id, - value, - deleteField: value === undefined, - }); - setLocalValue(value); - }; - const showPopoverCell: any = (popover: boolean) => { - if (popover) { - setPopoverOpen(true); - setDisplayedComponent("popover"); - } else { - setPopoverOpen(false); - setTimeout(() => setDisplayedComponent("inline"), 300); - } - }; - - // Declare inlineCell and props here so it can be reused later - const commonCellProps = { - ...basicCellProps, - row: row.original, - column: column.columnDef.meta!, - onSubmit: handleSubmit, - disabled: column.columnDef.meta!.editable === false, - docRef: row.original._rowy_ref, - showPopoverCell, - ref: inlineCellRef, - }; - const inlineCell = ( - - ); - - if (displayedComponent === "inline") return inlineCell; - - const parentRef = inlineCellRef.current?.parentElement; - - if (displayedComponent === "popover") - return ( - <> - {inlineCell} - - - showPopoverCell(false)} - {...popoverProps} - sx={ - transparent - ? { - "& .MuiPopover-paper": { backgroundColor: "transparent" }, - } - : {} - } - onClick={(e) => e.stopPropagation()} - onDoubleClick={(e) => e.stopPropagation()} - onKeyDown={(e) => e.stopPropagation()} - > - - - - - ); - - // Should not reach this line - return null; - }; -} diff --git a/src/components/fields/types.ts b/src/components/fields/types.ts index 95e57c68..8897e003 100644 --- a/src/components/fields/types.ts +++ b/src/components/fields/types.ts @@ -30,8 +30,6 @@ export interface IFieldConfig { reset: () => void ) => IContextMenuItem[]; TableCell: React.ComponentType; - /** @deprecated TODO: REMOVE */ - TableEditor?: React.ComponentType>; SideDrawerField: React.ComponentType; settings?: React.ComponentType; settingsValidator?: (config: Record) => Record; @@ -46,29 +44,6 @@ export interface IFieldConfig { csvImportParser?: (value: string, config?: any) => any; } -/** @deprecated TODO: REMOVE */ -export interface IBasicCellProps { - value: any; - type: FieldType; - name: string; -} -/** @deprecated TODO: REMOVE */ -export interface IHeavyCellProps extends IBasicCellProps { - row: TableRow; - column: ColumnConfig; - onSubmit: (value: any) => void; - docRef: TableRowRef; - disabled: boolean; -} -/** @deprecated TODO: REMOVE */ -export interface IPopoverInlineCellProps extends IHeavyCellProps { - showPopoverCell: React.Dispatch>; -} -/** @deprecated TODO: REMOVE */ -export interface IPopoverCellProps extends IPopoverInlineCellProps { - parentRef: PopoverProps["anchorEl"]; -} - export interface IDisplayCellProps { value: T; type: FieldType; From 69226d69108d6055ee4e565a855580fb1c55fe10 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Fri, 11 Nov 2022 15:50:10 +1100 Subject: [PATCH 252/309] ButtonBase: show ripple on focus by default --- src/theme/components.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/theme/components.tsx b/src/theme/components.tsx index 4b4f9a0d..2bc4b2e5 100644 --- a/src/theme/components.tsx +++ b/src/theme/components.tsx @@ -680,6 +680,12 @@ export const components = (theme: Theme): ThemeOptions => { }, }, + MuiButtonBase: { + defaultProps: { + focusRipple: true, + }, + }, + MuiButton: { defaultProps: { variant: "outlined", From 6321e17c954461ac06f919bcc563d83910400a03 Mon Sep 17 00:00:00 2001 From: Ganesh Mani Date: Sat, 12 Nov 2022 17:38:50 +0530 Subject: [PATCH 253/309] fix: log snack collapse by default --- .../TableModals/CloudLogsModal/BuildLogs/BuildLogsSnack.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/TableModals/CloudLogsModal/BuildLogs/BuildLogsSnack.tsx b/src/components/TableModals/CloudLogsModal/BuildLogs/BuildLogsSnack.tsx index 9cc98650..209cd2bc 100644 --- a/src/components/TableModals/CloudLogsModal/BuildLogs/BuildLogsSnack.tsx +++ b/src/components/TableModals/CloudLogsModal/BuildLogs/BuildLogsSnack.tsx @@ -94,7 +94,7 @@ export default function BuildLogsSnack({ borderRadius: 1, zIndex: 1, transition: (theme) => theme.transitions.create("height"), - height: expanded ? "calc(100% - 300px)" : 300, + height: expanded ? "calc(100% - 300px)" : 50, }} > @@ -165,7 +165,7 @@ export default function BuildLogsSnack({ height={"calc(100% - 25px)"} id="live-stream-scroll-box-snack" > - {latestActiveLog && ( + {latestActiveLog && expanded && ( <> {logs?.map((log: any, index: number) => ( From 0b75d60813ecd91e0d644c9efcae7b6dfee87e26 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Mon, 14 Nov 2022 13:01:09 +1100 Subject: [PATCH 254/309] fix JSON side drawer field crashing if value is a firestore ref --- src/components/fields/Json/SideDrawerField.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/fields/Json/SideDrawerField.tsx b/src/components/fields/Json/SideDrawerField.tsx index d6b15595..42c161b6 100644 --- a/src/components/fields/Json/SideDrawerField.tsx +++ b/src/components/fields/Json/SideDrawerField.tsx @@ -40,13 +40,14 @@ export default function Json({ const [editor, setEditor] = useAtom(jsonEditorAtom, projectScope); const [codeValid, setCodeValid] = useState(true); - const sanitizedValue = + const baseValue = value !== undefined && isValidJson(value) ? value : column.config?.isArray ? [] : {}; - const formattedJson = stringify(sanitizedValue, { space: 2 }); + const formattedJson = stringify(baseValue, { space: 2 }); + const sanitizedValue = JSON.parse(formattedJson); if (disabled) return ( From e9bc4a5a9b84b42ec5fa88ba5fa98a43d817fdc0 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Mon, 14 Nov 2022 16:09:01 +1100 Subject: [PATCH 255/309] Merge branch 'develop' into feature/rowy-706-table-upgrade --- .github/workflows/deploy-preview.yml | 4 +- src/atoms/tableScope/columnActions.ts | 43 ++- src/components/ColumnMenu/ColumnMenu.tsx | 80 ++++- src/components/ErrorFallback.tsx | 58 ++-- .../TableInformationDrawer/Details.tsx | 294 ++++++++++++------ .../ExportModal/ModalContentsDownload.tsx | 6 +- .../ExtensionsModal/ExtensionsModal.tsx | 80 +++-- .../ExtensionsModal/RuntimeOptions.tsx | 117 +++++++ .../TableModals/ExtensionsModal/utils.ts | 6 + .../TableSettingsDialog/TableDetails.tsx | 23 +- .../TableToolbar/TableToolbarButton.tsx | 41 ++- src/components/fields/Action/EditorCell.tsx | 11 +- src/components/fields/Action/Settings.tsx | 50 ++- .../fields/Action/SideDrawerField.tsx | 3 +- src/components/fields/Color/filters.ts | 21 ++ src/components/fields/Color/index.tsx | 5 + .../fields/Json/SideDrawerField.tsx | 5 +- src/components/fields/Rating/DisplayCell.tsx | 24 +- src/components/fields/Rating/Icon.tsx | 31 ++ src/components/fields/Rating/Settings.tsx | 33 +- .../fields/Rating/SideDrawerField.tsx | 6 +- src/constants/externalLinks.ts | 4 +- src/hooks/useFirestoreCollectionWithAtom.ts | 12 +- src/index.tsx | 10 +- src/pages/Table/ProvidedTablePage.tsx | 50 ++- src/theme/components.tsx | 3 +- src/types/table.d.ts | 16 +- 27 files changed, 789 insertions(+), 247 deletions(-) create mode 100644 src/components/TableModals/ExtensionsModal/RuntimeOptions.tsx create mode 100644 src/components/fields/Color/filters.ts create mode 100644 src/components/fields/Rating/Icon.tsx diff --git a/.github/workflows/deploy-preview.yml b/.github/workflows/deploy-preview.yml index ed7b8fd7..9ca97e44 100644 --- a/.github/workflows/deploy-preview.yml +++ b/.github/workflows/deploy-preview.yml @@ -8,7 +8,7 @@ on: env: REACT_APP_FIREBASE_PROJECT_ID: rowyio REACT_APP_FIREBASE_PROJECT_WEB_API_KEY: - "${{ secrets.FIREBASE_WEB_API_KEY_ROWYIO }}" + "${{ secrets.FIREBASE_WEB_API_KEY_TRYROWY }}" CI: "" jobs: build_and_preview: @@ -27,6 +27,6 @@ jobs: with: repoToken: "${{ secrets.GITHUB_TOKEN }}" firebaseServiceAccount: - "${{ secrets.FIREBASE_SERVICE_ACCOUNT_ROWYIO }}" + "${{ secrets.FIREBASE_SERVICE_ACCOUNT_TRYROWY }}" expires: 14d projectId: rowyio diff --git a/src/atoms/tableScope/columnActions.ts b/src/atoms/tableScope/columnActions.ts index 96a37d2a..2f3926e8 100644 --- a/src/atoms/tableScope/columnActions.ts +++ b/src/atoms/tableScope/columnActions.ts @@ -1,10 +1,12 @@ import { atom } from "jotai"; import { findIndex } from "lodash-es"; +import { FieldType } from "@src/constants/fields"; import { tableColumnsOrderedAtom, tableColumnsReducer, updateTableSchemaAtom, + tableSchemaAtom, } from "./table"; import { ColumnConfig } from "@src/types/table"; @@ -14,6 +16,7 @@ export interface IAddColumnOptions { /** Index to add column at. If undefined, adds to end */ index?: number; } + /** * Set function adds a column to tableSchema, to the end or by index. * Also fixes any issues with column indexes, so they go from 0 to length - 1 @@ -52,6 +55,7 @@ export interface IUpdateColumnOptions { /** If passed, reorders the column to the index */ index?: number; } + /** * Set function updates a column in tableSchema * @throws Error if column not found @@ -110,13 +114,50 @@ export const updateColumnAtom = atom( * ``` */ export const deleteColumnAtom = atom(null, async (get, _set, key: string) => { + const tableSchema = get(tableSchemaAtom); const tableColumnsOrdered = [...get(tableColumnsOrderedAtom)]; const updateTableSchema = get(updateTableSchemaAtom); if (!updateTableSchema) throw new Error("Cannot update table schema"); const updatedColumns = tableColumnsOrdered .filter((c) => c.key !== key) + .map((c) => { + // remove column from derivatives listener fields + if (c.type === FieldType.derivative) { + return { + ...c, + config: { + ...c.config, + listenerFields: + c.config?.listenerFields?.filter((f) => f !== key) ?? [], + }, + }; + } else if (c.type === FieldType.action) { + return { + ...c, + config: { + ...c.config, + requiredFields: + c.config?.requiredFields?.filter((f) => f !== key) ?? [], + }, + }; + } else { + return c; + } + }) .reduce(tableColumnsReducer, {}); - await updateTableSchema({ columns: updatedColumns }, [`columns.${key}`]); + const updatedExtensionObjects = tableSchema?.extensionObjects?.map( + (extension) => { + return { + ...extension, + requiredFields: extension.requiredFields.filter((f) => f !== key), + }; + } + ); + + await updateTableSchema( + { columns: updatedColumns, extensionObjects: updatedExtensionObjects }, + [`columns.${key}`] + ); }); diff --git a/src/components/ColumnMenu/ColumnMenu.tsx b/src/components/ColumnMenu/ColumnMenu.tsx index 9d193179..54f6e0c3 100644 --- a/src/components/ColumnMenu/ColumnMenu.tsx +++ b/src/components/ColumnMenu/ColumnMenu.tsx @@ -7,6 +7,7 @@ import { ListItemIcon, ListItemText, Typography, + Divider, } from "@mui/material"; import FilterIcon from "@mui/icons-material/FilterList"; import LockOpenIcon from "@mui/icons-material/LockOpen"; @@ -50,12 +51,18 @@ import { columnModalAtom, tableFiltersPopoverAtom, tableNextPageAtom, + tableSchemaAtom, } from "@src/atoms/tableScope"; import { FieldType } from "@src/constants/fields"; import { getFieldProp } from "@src/components/fields"; import { analytics, logEvent } from "@src/analytics"; -import { formatSubTableName, getTableSchemaPath } from "@src/utils/table"; +import { + formatSubTableName, + getTableBuildFunctionPathname, + getTableSchemaPath, +} from "@src/utils/table"; import { runRoutes } from "@src/constants/runRoutes"; +import { useSnackLogContext } from "@src/contexts/SnackLogContext"; export interface IMenuModalProps { name: string; @@ -91,6 +98,8 @@ export default function ColumnMenu() { tableScope ); const [tableNextPage] = useAtom(tableNextPageAtom, tableScope); + const [tableSchema] = useAtom(tableSchemaAtom, tableScope); + const snackLogContext = useSnackLogContext(); const [altPress] = useAtom(altPressAtom, projectScope); const { enqueueSnackbar, closeSnackbar } = useSnackbar(); @@ -117,8 +126,42 @@ export default function ColumnMenu() { const userDocHiddenFields = userSettings.tables?.[formatSubTableName(tableId)]?.hiddenFields ?? []; + let referencedColumns: string[] = []; + let referencedExtensions: string[] = []; + Object.entries(tableSchema?.columns ?? {}).forEach(([key, c], index) => { + if ( + c.config?.listenerFields?.includes(column.key) || + c.config?.requiredFields?.includes(column.key) + ) { + referencedColumns.push(c.name); + } + }); + tableSchema?.extensionObjects?.forEach((extension) => { + if (extension.requiredFields.includes(column.key)) { + referencedExtensions.push(extension.name); + } + }); + const requireRebuild = + referencedColumns.length || referencedExtensions.length; + const handleDeleteColumn = () => { deleteColumn(column.key); + if (requireRebuild) { + snackLogContext.requestSnackLog(); + rowyRun({ + route: runRoutes.buildFunction, + body: { + tablePath: tableSettings.collection, + // pathname must match old URL format + pathname: getTableBuildFunctionPathname( + tableSettings.id, + tableSettings.tableType + ), + tableConfigPath: getTableSchemaPath(tableSettings), + }, + }); + logEvent(analytics, "deployed_extensions"); + } logEvent(analytics, "delete_column", { type: column.type }); handleClose(); }; @@ -360,8 +403,8 @@ export default function ColumnMenu() { icon: , onClick: altPress ? handleDeleteColumn - : () => - confirm({ + : () => { + return confirm({ title: "Delete column?", body: ( <> @@ -373,12 +416,39 @@ export default function ColumnMenu() { Key: {column.key} + {requireRebuild ? ( + <> + + {referencedColumns.length ? ( + + This column will be removed as a dependency of the + following columns:{" "} + + {referencedColumns.join(", ")} + + + ) : null} + {referencedExtensions.length ? ( + + This column will be removed as a dependency from the + following Extensions:{" "} + + {referencedExtensions.join(", ")} + + + ) : null} + + You need to re-deploy this table’s cloud function. + + + ) : null} ), - confirm: "Delete", + confirm: requireRebuild ? "Delete & re-deploy" : "Delete", confirmColor: "error", handleConfirm: handleDeleteColumn, - }), + }); + }, color: "error" as "error", }, ]; diff --git a/src/components/ErrorFallback.tsx b/src/components/ErrorFallback.tsx index 83f8fb7a..3d7f130a 100644 --- a/src/components/ErrorFallback.tsx +++ b/src/components/ErrorFallback.tsx @@ -1,21 +1,17 @@ import { useState, useEffect } from "react"; import { FallbackProps } from "react-error-boundary"; -import { useLocation, Link } from "react-router-dom"; +import { useLocation } from "react-router-dom"; import useOffline from "@src/hooks/useOffline"; import { Typography, Button } from "@mui/material"; import ReloadIcon from "@mui/icons-material/Refresh"; import InlineOpenInNewIcon from "@src/components/InlineOpenInNewIcon"; import OfflineIcon from "@mui/icons-material/CloudOff"; -import { Tables as TablesIcon } from "@src/assets/icons"; import EmptyState, { IEmptyStateProps } from "@src/components/EmptyState"; import AccessDenied from "@src/components/AccessDenied"; -import { ROUTES } from "@src/constants/routes"; -import meta from "@root/package.json"; - -export const ERROR_TABLE_NOT_FOUND = "Table not found"; +import { EXTERNAL_LINKS } from "@src/constants/externalLinks"; export interface IErrorFallbackProps extends FallbackProps, IEmptyStateProps {} @@ -43,9 +39,22 @@ export function ErrorFallbackContents({ - - ), - }; - } - } - if (error.message.startsWith("Loading chunk")) { if (isOffline) { renderProps = { Icon: OfflineIcon, message: "You’re offline" }; diff --git a/src/components/TableInformationDrawer/Details.tsx b/src/components/TableInformationDrawer/Details.tsx index 3f93721b..78dd0236 100644 --- a/src/components/TableInformationDrawer/Details.tsx +++ b/src/components/TableInformationDrawer/Details.tsx @@ -1,134 +1,244 @@ -import { useMemo } from "react"; +import { useMemo, useState } from "react"; import { format } from "date-fns"; -import { find } from "lodash-es"; +import { find, isEqual } from "lodash-es"; import MDEditor from "@uiw/react-md-editor"; -import { Box, IconButton, Stack, Typography } from "@mui/material"; +import { + Box, + IconButton, + Stack, + TextField, + Typography, + useTheme, +} from "@mui/material"; import EditIcon from "@mui/icons-material/EditOutlined"; +import EditOffIcon from "@mui/icons-material/EditOffOutlined"; import { tableScope, tableSettingsAtom } from "@src/atoms/tableScope"; -import { useAtom, useSetAtom } from "jotai"; +import { useAtom } from "jotai"; import { projectScope, tablesAtom, - tableSettingsDialogAtom, + updateTableAtom, userRolesAtom, } from "@src/atoms/projectScope"; import { DATE_TIME_FORMAT } from "@src/constants/dates"; +import SaveState from "@src/components/SideDrawer/SaveState"; export default function Details() { const [userRoles] = useAtom(userRolesAtom, projectScope); const [tableSettings] = useAtom(tableSettingsAtom, tableScope); const [tables] = useAtom(tablesAtom, projectScope); - const openTableSettingsDialog = useSetAtom( - tableSettingsDialogAtom, - projectScope - ); + const [updateTable] = useAtom(updateTableAtom, projectScope); + const theme = useTheme(); const settings = useMemo( () => find(tables, ["id", tableSettings.id]), [tables, tableSettings.id] ); + const { description, details, _createdBy } = settings ?? {}; + + const [editDescription, setEditDescription] = useState(false); + const [localDescription, setLocalDescription] = useState(description ?? ""); + const [localDetails, setLocalDetails] = useState(details ?? ""); + const [editDetails, setEditDetails] = useState(false); + const [mdFullScreen, setMdFullScreen] = useState(false); + + const [saveState, setSaveState] = useState< + "" | "unsaved" | "saving" | "saved" + >(""); + if (!settings) { return null; } - const editButton = userRoles.includes("ADMIN") && ( - - openTableSettingsDialog({ - mode: "update", - data: settings, - }) - } - disabled={!openTableSettingsDialog || settings.id.includes("/")} - > - - - ); + const handleSave = async () => { + setSaveState("saving"); + await updateTable!({ + ...settings, + description: localDescription, + details: localDetails, + }); + setSaveState("saved"); + }; - const { description, details, _createdBy } = settings; + const isAdmin = userRoles.includes("ADMIN"); return ( - .MuiGrid-root": { - position: "relative", - }, - }} - > - {/* Description */} - - - - Description - - {editButton} + <> + + + + + {/* Description */} + + + + Description + + {isAdmin && ( + { + setEditDescription(!editDescription); + }} + sx={{ top: 4 }} + > + {editDescription ? : } + + )} + + {editDescription ? ( + { + setLocalDescription(e.target.value); + saveState !== "unsaved" && setSaveState("unsaved"); + }} + onBlur={() => + isEqual(description, localDescription) + ? setSaveState("") + : handleSave() + } + rows={2} + minRows={2} + /> + ) : ( + + {localDescription ? localDescription : "No description"} + + )} - - {description ? description : "No description"} - - - - {/* Details */} - - - - Details - - {editButton} - - {!details ? ( - - No details - - ) : ( + {/* Details */} + + + + Details + + {isAdmin && ( + { + setEditDetails(!editDetails); + }} + sx={{ top: 4 }} + > + {editDetails ? : } + + )} + ul": { + display: "flex", + alignItems: "center", + }, + "& .w-md-editor-toolbar > ul:first-of-type": { + overflowX: "auto", + marginRight: theme.spacing(1), + }, + "& :is(h1, h2, h3, h4, h5, h6)": { + marginY: `${theme.spacing(1.5)} !important`, + borderBottom: "none !important", + }, + "& details summary": { + marginBottom: theme.spacing(1), + }, }} > - + {editDetails ? ( + { + if (command.name === "fullscreen") { + command.execute = () => setMdFullScreen(!mdFullScreen); + } + return command; + }} + textareaProps={{ + autoFocus: true, + onChange: (e) => { + setLocalDetails(e.target.value ?? ""); + saveState !== "unsaved" && setSaveState("unsaved"); + }, + onBlur: () => + isEqual(details, localDetails) + ? setSaveState("") + : handleSave(), + }} + /> + ) : !localDetails ? ( + No details + ) : ( + + )} + + {/* Table Audits */} + {_createdBy && ( + + + Created by{" "} + + {_createdBy.displayName} + {" "} + on{" "} + + {format(_createdBy.timestamp.toDate(), DATE_TIME_FORMAT)} + + + )} - - {/* Table Audits */} - {_createdBy && ( - - - Created by{" "} - - {_createdBy.displayName} - {" "} - on{" "} - - {format(_createdBy.timestamp.toDate(), DATE_TIME_FORMAT)} - - - - )} - + ); } diff --git a/src/components/TableModals/ExportModal/ModalContentsDownload.tsx b/src/components/TableModals/ExportModal/ModalContentsDownload.tsx index 468d52cc..8b6690dd 100644 --- a/src/components/TableModals/ExportModal/ModalContentsDownload.tsx +++ b/src/components/TableModals/ExportModal/ModalContentsDownload.tsx @@ -137,7 +137,11 @@ export default function Export({ x.key)} onChange={handleChange(setColumns)} - filterColumns={(column) => DOWNLOADABLE_COLUMNS.includes(column.type)} + filterColumns={(column) => + column.type === FieldType.derivative + ? DOWNLOADABLE_COLUMNS.includes(column.config?.renderFieldType) + : DOWNLOADABLE_COLUMNS.includes(column.type) + } label="Columns to export" labelPlural="columns" TextFieldProps={{ diff --git a/src/components/TableModals/ExtensionsModal/ExtensionsModal.tsx b/src/components/TableModals/ExtensionsModal/ExtensionsModal.tsx index 57f6fbee..71146804 100644 --- a/src/components/TableModals/ExtensionsModal/ExtensionsModal.tsx +++ b/src/components/TableModals/ExtensionsModal/ExtensionsModal.tsx @@ -1,6 +1,6 @@ import { useEffect, useState } from "react"; import { useAtom, useSetAtom } from "jotai"; -import { isEqual } from "lodash-es"; +import { isEqual, isUndefined } from "lodash-es"; import { ITableModalProps } from "@src/components/TableModals"; import Modal from "@src/components/Modal"; @@ -23,7 +23,6 @@ import { } from "@src/atoms/tableScope"; import { useSnackLogContext } from "@src/contexts/SnackLogContext"; -import { emptyExtensionObject, IExtension, ExtensionType } from "./utils"; import { runRoutes } from "@src/constants/runRoutes"; import { analytics, logEvent } from "@src/analytics"; import { @@ -31,6 +30,14 @@ import { getTableBuildFunctionPathname, } from "@src/utils/table"; +import { + emptyExtensionObject, + IExtension, + ExtensionType, + IRuntimeOptions, +} from "./utils"; +import RuntimeOptions from "./RuntimeOptions"; + export default function ExtensionsModal({ onClose }: ITableModalProps) { const [currentUser] = useAtom(currentUserAtom, projectScope); const [rowyRun] = useAtom(rowyRunAtom, projectScope); @@ -39,12 +46,25 @@ export default function ExtensionsModal({ onClose }: ITableModalProps) { const [tableSchema] = useAtom(tableSchemaAtom, tableScope); const [updateTableSchema] = useAtom(updateTableSchemaAtom, tableScope); - const currentExtensionObjects = (tableSchema.extensionObjects ?? - []) as IExtension[]; const [localExtensionsObjects, setLocalExtensionsObjects] = useState( - currentExtensionObjects + tableSchema.extensionObjects ?? [] ); + const [localRuntimeOptions, setLocalRuntimeOptions] = useState( + tableSchema.runtimeOptions ?? {} + ); + + const errors = { + runtimeOptions: { + timeoutSeconds: + !isUndefined(localRuntimeOptions.timeoutSeconds) && + !( + localRuntimeOptions.timeoutSeconds! > 0 && + localRuntimeOptions.timeoutSeconds! <= 540 + ), + }, + }; + const [openMigrationGuide, setOpenMigrationGuide] = useState(false); useEffect(() => { if (tableSchema.sparks) setOpenMigrationGuide(true); @@ -57,7 +77,9 @@ export default function ExtensionsModal({ onClose }: ITableModalProps) { } | null>(null); const snackLogContext = useSnackLogContext(); - const edited = !isEqual(currentExtensionObjects, localExtensionsObjects); + const edited = + !isEqual(tableSchema.extensionObjects ?? [], localExtensionsObjects) || + !isEqual(tableSchema.runtimeOptions ?? {}, localRuntimeOptions); const handleClose = ( _setOpen: React.Dispatch> @@ -70,7 +92,8 @@ export default function ExtensionsModal({ onClose }: ITableModalProps) { cancel: "Keep", handleConfirm: () => { _setOpen(false); - setLocalExtensionsObjects(currentExtensionObjects); + setLocalExtensionsObjects(tableSchema.extensionObjects ?? []); + setLocalRuntimeOptions(tableSchema.runtimeOptions ?? {}); onClose(); }, }); @@ -79,15 +102,18 @@ export default function ExtensionsModal({ onClose }: ITableModalProps) { } }; - const handleSaveExtensions = async (callback?: Function) => { + const handleSave = async (callback?: Function) => { if (updateTableSchema) - await updateTableSchema({ extensionObjects: localExtensionsObjects }); + await updateTableSchema({ + extensionObjects: localExtensionsObjects, + runtimeOptions: localRuntimeOptions, + }); if (callback) callback(); onClose(); }; const handleSaveDeploy = async () => { - handleSaveExtensions(() => { + handleSave(() => { try { snackLogContext.requestSnackLog(); rowyRun({ @@ -132,6 +158,13 @@ export default function ExtensionsModal({ onClose }: ITableModalProps) { setExtensionModal(null); }; + const handleUpdateRuntimeOptions = (update: IRuntimeOptions) => { + setLocalRuntimeOptions((runtimeOptions) => ({ + ...runtimeOptions, + ...update, + })); + }; + const handleUpdateActive = (index: number, active: boolean) => { setLocalExtensionsObjects( localExtensionsObjects.map((extensionObject, i) => { @@ -217,24 +250,31 @@ export default function ExtensionsModal({ onClose }: ITableModalProps) { /> } children={ - + <> + + + } actions={{ primary: { children: "Save & Deploy", onClick: handleSaveDeploy, - disabled: !edited, + disabled: !edited || errors.runtimeOptions.timeoutSeconds, }, secondary: { children: "Save", - onClick: () => handleSaveExtensions(), - disabled: !edited, + onClick: () => handleSave(), + disabled: !edited || errors.runtimeOptions.timeoutSeconds, }, }} /> diff --git a/src/components/TableModals/ExtensionsModal/RuntimeOptions.tsx b/src/components/TableModals/ExtensionsModal/RuntimeOptions.tsx new file mode 100644 index 00000000..90ca584c --- /dev/null +++ b/src/components/TableModals/ExtensionsModal/RuntimeOptions.tsx @@ -0,0 +1,117 @@ +import { useState } from "react"; +import { useAtom, useSetAtom } from "jotai"; + +import { + Accordion, + AccordionDetails, + AccordionSummary, + Button, + Grid, + InputAdornment, + TextField, + Typography, +} from "@mui/material"; +import { ChevronDown } from "@src/assets/icons"; +import MultiSelect from "@rowy/multiselect"; + +import { + compatibleRowyRunVersionAtom, + projectScope, + rowyRunModalAtom, +} from "@src/atoms/projectScope"; + +import { IRuntimeOptions } from "./utils"; + +export default function RuntimeOptions({ + runtimeOptions, + handleUpdate, + errors, +}: { + runtimeOptions: IRuntimeOptions; + handleUpdate: (runtimeOptions: IRuntimeOptions) => void; + errors: { timeoutSeconds: boolean }; +}) { + const [compatibleRowyRunVersion] = useAtom( + compatibleRowyRunVersionAtom, + projectScope + ); + const openRowyRunModal = useSetAtom(rowyRunModalAtom, projectScope); + + const [expanded, setExpanded] = useState(false); + + const isCompatibleRowyRun = compatibleRowyRunVersion({ minVersion: "1.6.4" }); + + return ( + + + ) : ( + + ) + } + onClick={() => + isCompatibleRowyRun + ? setExpanded(!expanded) + : openRowyRunModal({ + version: "1.6.4", + feature: "Runtime options", + }) + } + > + Runtime options + + + + + handleUpdate({ memory: value ?? "256MB" })} + multiple={false} + options={["128MB", "256MB", "512MB", "1GB", "2GB", "4GB", "8GB"]} + /> + + + + seconds + ), + }} + onChange={(e) => + !isNaN(Number(e.target.value)) && + handleUpdate({ + timeoutSeconds: Number(e.target.value), + }) + } + inputProps={{ + inputMode: "numeric", + }} + error={errors.timeoutSeconds} + helperText={ + errors.timeoutSeconds + ? "Timeout must be an integer between 1 and 540" + : "The maximum timeout that can be specified is 9 mins (540 seconds)" + } + /> + + + + + ); +} diff --git a/src/components/TableModals/ExtensionsModal/utils.ts b/src/components/TableModals/ExtensionsModal/utils.ts index 117ef381..28d24fda 100644 --- a/src/components/TableModals/ExtensionsModal/utils.ts +++ b/src/components/TableModals/ExtensionsModal/utils.ts @@ -52,6 +52,12 @@ export interface IExtension { trackedFields?: string[]; } +// https://firebase.google.com/docs/functions/manage-functions#set_runtime_options +export interface IRuntimeOptions { + memory?: "128MB" | "256MB" | "512MB" | "1GB" | "2GB" | "4GB" | "8GB"; + timeoutSeconds?: number; +} + export const triggerTypes: ExtensionTrigger[] = ["create", "update", "delete"]; const extensionBodyTemplate = { diff --git a/src/components/TableSettingsDialog/TableDetails.tsx b/src/components/TableSettingsDialog/TableDetails.tsx index 705233b8..c4cdbe05 100644 --- a/src/components/TableSettingsDialog/TableDetails.tsx +++ b/src/components/TableSettingsDialog/TableDetails.tsx @@ -14,19 +14,40 @@ export default function TableDetails({ ...props }) { {props.label ?? ""} ul": { + display: "flex", + alignItems: "center", + }, + "& .w-md-editor-toolbar > ul:first-of-type": { + overflowX: "auto", + marginRight: theme.spacing(1), + }, + "& :is(h1, h2, h3, h4, h5, h6)": { + marginY: `${theme.spacing(1.5)} !important`, + borderBottom: "none !important", + }, + "& details summary": { + marginBottom: theme.spacing(1), + }, }} > { title: string; icon: React.ReactNode; + tooltip?: string; } export const TableToolbarButton = forwardRef(function TableToolbarButton_( - { title, icon, ...props }: ITableToolbarButtonProps, + { title, icon, tooltip, ...props }: ITableToolbarButtonProps, ref: React.Ref ) { + // https://mui.com/material-ui/react-tooltip/#accessibility + const tooltipIsDescription = Boolean(tooltip); + + const button = ( + + ); + return ( - - - - + + {props.disabled ? {button} : button} ); }); diff --git a/src/components/fields/Action/EditorCell.tsx b/src/components/fields/Action/EditorCell.tsx index 1706c4e2..2f458e86 100644 --- a/src/components/fields/Action/EditorCell.tsx +++ b/src/components/fields/Action/EditorCell.tsx @@ -4,6 +4,15 @@ import { Stack } from "@mui/material"; import ActionFab from "./ActionFab"; import { sanitiseCallableName, isUrl } from "./utils"; +import { get } from "lodash-es"; + +export const getActionName = (column: any) => { + const config = get(column, "config"); + if (!get(config, "customName.enabled")) { + return get(column, "name"); + } + return get(config, "customName.actionName") || get(column, "name"); +}; export default function Action({ column, @@ -28,7 +37,7 @@ export default function Action({ ) : hasRan ? ( value.status ) : ( - sanitiseCallableName(column.key) + sanitiseCallableName(getActionName(column)) )}
    diff --git a/src/components/fields/Action/Settings.tsx b/src/components/fields/Action/Settings.tsx index 0c0655b1..a40a3c54 100644 --- a/src/components/fields/Action/Settings.tsx +++ b/src/components/fields/Action/Settings.tsx @@ -559,20 +559,46 @@ const Settings = ({ config, onChange, fieldName }: ISettingsProps) => { title: "Customization", content: ( <> - + + onChange("customName.enabled")(e.target.checked) + } + name="customName.enabled" + /> + } + label="Customize label for action" + style={{ marginLeft: -11 }} + /> + {config.customName?.enabled && ( + - onChange("customIcons.enabled")(e.target.checked) + onChange("customName.actionName")(e.target.value) } - name="customIcons.enabled" - /> - } - label="Customize button icons with emoji" - style={{ marginLeft: -11 }} - /> - + label="Action name:" + className="labelHorizontal" + inputProps={{ style: { width: "10ch" } }} + > + )} + + onChange("customIcons.enabled")(e.target.checked) + } + name="customIcons.enabled" + /> + } + label="Customize button icons with emoji" + style={{ marginLeft: -11 }} + /> + {config.customIcons?.enabled && ( diff --git a/src/components/fields/Action/SideDrawerField.tsx b/src/components/fields/Action/SideDrawerField.tsx index f17dcb7e..1f13e6d4 100644 --- a/src/components/fields/Action/SideDrawerField.tsx +++ b/src/components/fields/Action/SideDrawerField.tsx @@ -10,6 +10,7 @@ import ActionFab from "./ActionFab"; import { tableScope, tableRowsAtom } from "@src/atoms/tableScope"; import { fieldSx, getFieldId } from "@src/components/SideDrawer/utils"; import { sanitiseCallableName, isUrl } from "./utils"; +import { getActionName } from "./TableCell"; export default function Action({ column, @@ -58,7 +59,7 @@ export default function Action({ ) : hasRan ? ( value.status ) : ( - sanitiseCallableName(column.key) + sanitiseCallableName(getActionName(column)) )} diff --git a/src/components/fields/Color/filters.ts b/src/components/fields/Color/filters.ts new file mode 100644 index 00000000..0a2732be --- /dev/null +++ b/src/components/fields/Color/filters.ts @@ -0,0 +1,21 @@ +import { IFilterOperator } from "@src/components/fields/types"; + +export const filterOperators: IFilterOperator[] = [ + { + label: "is", + secondaryLabel: "==", + value: "color-equal", + }, + { + label: "is not", + secondaryLabel: "!=", + value: "color-not-equal", + }, +]; + +export const valueFormatter = (value: any) => { + if (value && value.hex) { + return value.hex.toString(); + } + return ""; +}; diff --git a/src/components/fields/Color/index.tsx b/src/components/fields/Color/index.tsx index cb266301..140593a3 100644 --- a/src/components/fields/Color/index.tsx +++ b/src/components/fields/Color/index.tsx @@ -5,6 +5,7 @@ import { toColor } from "react-color-palette"; import ColorIcon from "@mui/icons-material/Colorize"; import DisplayCell from "./DisplayCell"; +import { filterOperators, valueFormatter } from "./filters"; const EditorCell = lazy( () => import("./EditorCell" /* webpackChunkName: "EditorCell-Color" */) @@ -28,6 +29,10 @@ export const config: IFieldConfig = { disablePadding: true, }), SideDrawerField, + filter: { + operators: filterOperators, + valueFormatter, + }, csvImportParser: (value: string) => { try { const obj = JSON.parse(value); diff --git a/src/components/fields/Json/SideDrawerField.tsx b/src/components/fields/Json/SideDrawerField.tsx index 89ddbc1e..4c0fbc96 100644 --- a/src/components/fields/Json/SideDrawerField.tsx +++ b/src/components/fields/Json/SideDrawerField.tsx @@ -40,13 +40,14 @@ export default function Json({ const [editor, setEditor] = useAtom(jsonEditorAtom, projectScope); const [codeValid, setCodeValid] = useState(true); - const sanitizedValue = + const baseValue = value !== undefined && isValidJson(value) ? value : column.config?.isArray ? [] : {}; - const formattedJson = stringify(sanitizedValue, { space: 2 }); + const formattedJson = stringify(baseValue, { space: 2 }); + const sanitizedValue = JSON.parse(formattedJson); if (disabled) return ( diff --git a/src/components/fields/Rating/DisplayCell.tsx b/src/components/fields/Rating/DisplayCell.tsx index 1e539ad4..b5d28471 100644 --- a/src/components/fields/Rating/DisplayCell.tsx +++ b/src/components/fields/Rating/DisplayCell.tsx @@ -2,24 +2,7 @@ import React, { forwardRef } from "react"; import { IDisplayCellProps } from "@src/components/fields/types"; import MuiRating, { RatingProps as MuiRatingProps } from "@mui/material/Rating"; -import RatingIcon from "@mui/icons-material/Star"; -import RatingOutlineIcon from "@mui/icons-material/StarBorder"; -import { get } from "lodash-es"; - -export const getStateIcon = (config: any) => { - // only use the config to get the custom rating icon if enabled via toggle - if (!get(config, "customIcons.enabled")) { - return ; - } - return get(config, "customIcons.rating") || ; -}; - -export const getStateOutline = (config: any) => { - if (!get(config, "customIcons.enabled")) { - return ; - } - return get(config, "customIcons.rating") || ; -}; +import Icon from "./Icon"; export const Rating = forwardRef(function Rating( { @@ -55,14 +38,15 @@ export const Rating = forwardRef(function Rating( if (["ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown"].includes(e.key)) e.stopPropagation(); }} - icon={getStateIcon(column.config)} + icon={} + emptyIcon={} size="small" readOnly={disabled} - emptyIcon={getStateOutline(column.config)} max={max} precision={precision} sx={{ mx: -0.25 }} /> ); }); + export default Rating; diff --git a/src/components/fields/Rating/Icon.tsx b/src/components/fields/Rating/Icon.tsx new file mode 100644 index 00000000..e65b8f3d --- /dev/null +++ b/src/components/fields/Rating/Icon.tsx @@ -0,0 +1,31 @@ +import RatingIcon from "@mui/icons-material/Star"; +import RatingOutlineIcon from "@mui/icons-material/StarBorder"; +import { get } from "lodash-es"; + +export interface IIconProps { + config: any; + isEmpty: boolean; +} + +export default function Icon({ config, isEmpty }: IIconProps) { + if (isEmpty) { + return getStateOutline(config); + } else { + return getStateIcon(config); + } +} + +const getStateIcon = (config: any) => { + // only use the config to get the custom rating icon if enabled via toggle + if (!get(config, "customIcons.enabled")) { + return ; + } + console.log(get(config, "customIcons.rating")); + return get(config, "customIcons.rating") || ; +}; +const getStateOutline = (config: any) => { + if (!get(config, "customIcons.enabled")) { + return ; + } + return get(config, "customIcons.rating") || ; +}; diff --git a/src/components/fields/Rating/Settings.tsx b/src/components/fields/Rating/Settings.tsx index 6134b530..7bf99d5b 100644 --- a/src/components/fields/Rating/Settings.tsx +++ b/src/components/fields/Rating/Settings.tsx @@ -1,11 +1,17 @@ import { ISettingsProps } from "@src/components/fields/types"; -import RatingIcon from "@mui/icons-material/Star"; -import RatingOutlineIcon from "@mui/icons-material/StarBorder" -import { InputLabel, TextField, Grid, FormControlLabel, Checkbox, Stack } from "@mui/material"; +import { + InputLabel, + TextField, + Grid, + FormControlLabel, + Checkbox, + Stack, +} from "@mui/material"; import ToggleButton from "@mui/material/ToggleButton"; import ToggleButtonGroup from "@mui/material/ToggleButtonGroup"; import MuiRating from "@mui/material/Rating"; import { get } from "lodash-es"; +import Icon from "./Icon"; export default function Settings({ onChange, config }: ISettingsProps) { return ( @@ -18,10 +24,13 @@ export default function Settings({ onChange, config }: ISettingsProps) { fullWidth error={false} onChange={(e) => { - let input = parseInt(e.target.value) || 0 - if (input > 20) { input = 20 } + let input = parseInt(e.target.value) || 0; + if (input > 20) { + input = 20; + } onChange("max")(input); }} + inputProps={{ min: 1, max: 20 }} /> @@ -68,28 +77,26 @@ export default function Settings({ onChange, config }: ISettingsProps) { - onChange("customIcons.rating")(e.target.value) - } + onChange={(e) => onChange("customIcons.rating")(e.target.value)} label="Custom icon preview:" className="labelHorizontal" inputProps={{ style: { width: "2ch" } }} /> - e.stopPropagation()} - icon={get(config, "customIcons.rating") || } + icon={} size="small" - emptyIcon={get(config, "customIcons.rating") || } + emptyIcon={} max={get(config, "max")} precision={get(config, "precision")} sx={{ pt: 0.5 }} /> - )} ); -} \ No newline at end of file +} diff --git a/src/components/fields/Rating/SideDrawerField.tsx b/src/components/fields/Rating/SideDrawerField.tsx index 389d3211..ea69325e 100644 --- a/src/components/fields/Rating/SideDrawerField.tsx +++ b/src/components/fields/Rating/SideDrawerField.tsx @@ -3,8 +3,8 @@ import { ISideDrawerFieldProps } from "@src/components/fields/types"; import { Grid } from "@mui/material"; import { Rating as MuiRating } from "@mui/material"; import "@mui/lab"; -import { getStateIcon, getStateOutline } from "./DisplayCell"; import { fieldSx } from "@src/components/SideDrawer/utils"; +import Icon from "./Icon"; export default function Rating({ column, @@ -27,8 +27,8 @@ export default function Rating({ onChange(newValue); onSubmit(); }} - icon={getStateIcon(column.config)} - emptyIcon={getStateOutline(column.config)} + icon={} + emptyIcon={} size="small" max={max} precision={precision} diff --git a/src/constants/externalLinks.ts b/src/constants/externalLinks.ts index bf2f41ab..4625d6ba 100644 --- a/src/constants/externalLinks.ts +++ b/src/constants/externalLinks.ts @@ -15,8 +15,8 @@ export const EXTERNAL_LINKS = { twitter: "https://twitter.com/rowyio", productHunt: "https://www.producthunt.com/products/rowy-2", - rowyRun: meta.repository.url.replace(".git", "Run"), - rowyRunGitHub: meta.repository.url.replace(".git", "Run"), + rowyRun: meta.repository.url.replace("rowy.git", "backend"), + rowyRunGitHub: meta.repository.url.replace("rowy.git", "backend"), // prettier-ignore rowyRunDeploy: `https://deploy.cloud.run/?git_repo=${meta.repository.url.replace(".git", "Run")}.git`, diff --git a/src/hooks/useFirestoreCollectionWithAtom.ts b/src/hooks/useFirestoreCollectionWithAtom.ts index 43f7165a..cf5d648c 100644 --- a/src/hooks/useFirestoreCollectionWithAtom.ts +++ b/src/hooks/useFirestoreCollectionWithAtom.ts @@ -376,12 +376,20 @@ export const tableFiltersToFirestoreFilters = (filters: TableFilter[]) => { } else if (filter.operator === "id-equal") { firestoreFilters.push(where(documentId(), "==", filter.value)); continue; + } else if (filter.operator === "color-equal") { + firestoreFilters.push( + where(filter.key.concat(".hex"), "==", filter.value.hex.toString()) + ); + continue; + } else if (filter.operator === "color-not-equal") { + firestoreFilters.push( + where(filter.key.concat(".hex"), "!=", filter.value.hex.toString()) + ); + continue; } - firestoreFilters.push( where(filter.key, filter.operator as WhereFilterOp, filter.value) ); } - return firestoreFilters; }; diff --git a/src/index.tsx b/src/index.tsx index 5d545f47..f4d7b2c9 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -8,11 +8,11 @@ import reportWebVitals from "./reportWebVitals"; const container = document.getElementById("root")!; const root = createRoot(container); root.render( - - - - - + // + + + + // ); // If you want to start measuring performance in your app, pass a function diff --git a/src/pages/Table/ProvidedTablePage.tsx b/src/pages/Table/ProvidedTablePage.tsx index ab2b7614..8f86be90 100644 --- a/src/pages/Table/ProvidedTablePage.tsx +++ b/src/pages/Table/ProvidedTablePage.tsx @@ -1,16 +1,20 @@ import { lazy, Suspense } from "react"; import { useAtom, Provider } from "jotai"; import { DebugAtoms } from "@src/atoms/utils"; -import { useParams, useOutlet } from "react-router-dom"; +import { useParams, useOutlet, Link } from "react-router-dom"; import { ErrorBoundary } from "react-error-boundary"; import { find, isEmpty } from "lodash-es"; +import useOffline from "@src/hooks/useOffline"; -import ErrorFallback, { - ERROR_TABLE_NOT_FOUND, -} from "@src/components/ErrorFallback"; +import { Typography, Button } from "@mui/material"; + +import ErrorFallback from "@src/components/ErrorFallback"; import TableSourceFirestore from "@src/sources/TableSourceFirestore"; import TableToolbarSkeleton from "@src/components/TableToolbar/TableToolbarSkeleton"; import TableSkeleton from "@src/components/Table/TableSkeleton"; +import EmptyState from "@src/components/EmptyState"; +import OfflineIcon from "@mui/icons-material/CloudOff"; +import { Tables as TablesIcon } from "@src/assets/icons"; import { projectScope, @@ -25,6 +29,7 @@ import { tableSettingsAtom, } from "@src/atoms/tableScope"; import { SyncAtomValue } from "@src/atoms/utils"; +import { ROUTES } from "@src/constants/routes"; import useDocumentTitle from "@src/hooks/useDocumentTitle"; // prettier-ignore @@ -41,6 +46,7 @@ export default function ProvidedTablePage() { const [currentUser] = useAtom(currentUserAtom, projectScope); const [projectSettings] = useAtom(projectSettingsAtom, projectScope); const [tables] = useAtom(tablesAtom, projectScope); + const isOffline = useOffline(); const tableSettings = find(tables, ["id", id]); useDocumentTitle(projectId, tableSettings ? tableSettings.name : "Not found"); @@ -54,7 +60,41 @@ export default function ProvidedTablePage() { ); } else { - throw new Error(ERROR_TABLE_NOT_FOUND + ": " + id); + if (isOffline) { + return ( + + ); + } else { + return ( + + + Make sure you have the right ID + + {id} + + + } + /> + ); + } } } diff --git a/src/theme/components.tsx b/src/theme/components.tsx index 2bc4b2e5..374dc25b 100644 --- a/src/theme/components.tsx +++ b/src/theme/components.tsx @@ -1381,11 +1381,12 @@ export const components = (theme: Theme): ThemeOptions => { MuiRating: { styleOverrides: { - iconFilled: { color: theme.palette.text.secondary }, icon: { // https://github.com/mui/material-ui/issues/32557 "& .MuiSvgIcon-root": { pointerEvents: "auto" }, + color: theme.palette.text.secondary, }, + iconEmpty: { opacity: 0.38 }, }, }, diff --git a/src/types/table.d.ts b/src/types/table.d.ts index 5b54b9be..b9753c41 100644 --- a/src/types/table.d.ts +++ b/src/types/table.d.ts @@ -4,7 +4,10 @@ import type { DocumentData, DocumentReference, } from "firebase/firestore"; -import { IExtension } from "@src/components/TableModals/ExtensionsModal/utils"; +import { + IExtension, + IRuntimeOptions, +} from "@src/components/TableModals/ExtensionsModal/utils"; import { IWebhook } from "@src/components/TableModals/WebhooksModal/utils"; /** @@ -104,6 +107,7 @@ export type TableSchema = { extensionObjects?: IExtension[]; compiledExtension?: string; webhooks?: IWebhook[]; + runtimeOptions?: IRuntimeOptions; /** @deprecated Migrate to Extensions */ sparks?: string; @@ -146,7 +150,11 @@ export type ColumnConfig = { /** Regex used in CellValidation */ validationRegex: string; /** FieldType to render for Derivative fields */ - renderFieldType: FieldType; + renderFieldType?: FieldType; + /** Used in Derivative fields */ + listenerFields?: string[]; + /** Used in Derivative and Action fields */ + requiredFields?: string[]; /** For sub-table fields */ parentLabel: string[]; @@ -167,7 +175,9 @@ export type TableFilter = { | "date-before-equal" | "date-after-equal" | "time-minute-equal" - | "id-equal"; + | "id-equal" + | "color-equal" + | "color-not-equal"; value: any; }; From 282268989703516a63137b88ac86e53c8b2526ea Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Mon, 14 Nov 2022 16:11:34 +1100 Subject: [PATCH 256/309] move Action getActionName util fn to DisplayCell.tsx --- src/components/fields/Action/DisplayCell.tsx | 13 +++++++++++-- src/components/fields/Action/EditorCell.tsx | 10 +--------- src/components/fields/Action/SideDrawerField.tsx | 2 +- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/components/fields/Action/DisplayCell.tsx b/src/components/fields/Action/DisplayCell.tsx index f852ce6b..78871401 100644 --- a/src/components/fields/Action/DisplayCell.tsx +++ b/src/components/fields/Action/DisplayCell.tsx @@ -1,5 +1,14 @@ import { IDisplayCellProps } from "@src/components/fields/types"; +import { get } from "lodash-es"; -export default function Action({ name, value }: IDisplayCellProps) { - return <>{value ? value.status : name}; +export const getActionName = (column: IDisplayCellProps["column"]) => { + const config = get(column, "config"); + if (!get(config, "customName.enabled")) { + return get(column, "name"); + } + return get(config, "customName.actionName") || get(column, "name"); +}; + +export default function Action({ value, column }: IDisplayCellProps) { + return <>{value ? value.status : getActionName(column)}; } diff --git a/src/components/fields/Action/EditorCell.tsx b/src/components/fields/Action/EditorCell.tsx index 2f458e86..35a04cb6 100644 --- a/src/components/fields/Action/EditorCell.tsx +++ b/src/components/fields/Action/EditorCell.tsx @@ -4,15 +4,7 @@ import { Stack } from "@mui/material"; import ActionFab from "./ActionFab"; import { sanitiseCallableName, isUrl } from "./utils"; -import { get } from "lodash-es"; - -export const getActionName = (column: any) => { - const config = get(column, "config"); - if (!get(config, "customName.enabled")) { - return get(column, "name"); - } - return get(config, "customName.actionName") || get(column, "name"); -}; +import { getActionName } from "./DisplayCell"; export default function Action({ column, diff --git a/src/components/fields/Action/SideDrawerField.tsx b/src/components/fields/Action/SideDrawerField.tsx index 1f13e6d4..200fc05f 100644 --- a/src/components/fields/Action/SideDrawerField.tsx +++ b/src/components/fields/Action/SideDrawerField.tsx @@ -10,7 +10,7 @@ import ActionFab from "./ActionFab"; import { tableScope, tableRowsAtom } from "@src/atoms/tableScope"; import { fieldSx, getFieldId } from "@src/components/SideDrawer/utils"; import { sanitiseCallableName, isUrl } from "./utils"; -import { getActionName } from "./TableCell"; +import { getActionName } from "./DisplayCell"; export default function Action({ column, From f5754af73f99a2b7e1d582382879011e77849d35 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Mon, 14 Nov 2022 16:11:46 +1100 Subject: [PATCH 257/309] Rating: remove expensive @mui/lab import --- src/components/fields/Rating/SideDrawerField.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/fields/Rating/SideDrawerField.tsx b/src/components/fields/Rating/SideDrawerField.tsx index ea69325e..24f1a8d6 100644 --- a/src/components/fields/Rating/SideDrawerField.tsx +++ b/src/components/fields/Rating/SideDrawerField.tsx @@ -2,7 +2,6 @@ import { ISideDrawerFieldProps } from "@src/components/fields/types"; import { Grid } from "@mui/material"; import { Rating as MuiRating } from "@mui/material"; -import "@mui/lab"; import { fieldSx } from "@src/components/SideDrawer/utils"; import Icon from "./Icon"; From 315f3c7d29456127bb63355ed254418bf4439ee8 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Mon, 14 Nov 2022 17:04:14 +1100 Subject: [PATCH 258/309] improve visual affordance for column drag reorder --- src/assets/icons/index.ts | 3 ++ .../Table/ColumnHeader/ColumnHeader.tsx | 5 ++- src/components/Table/Table.tsx | 40 ++++++++++++++++--- 3 files changed, 40 insertions(+), 8 deletions(-) diff --git a/src/assets/icons/index.ts b/src/assets/icons/index.ts index 3503e99b..372af8ff 100644 --- a/src/assets/icons/index.ts +++ b/src/assets/icons/index.ts @@ -103,6 +103,9 @@ export { FileTableBoxOutline as Project }; import { TableColumn } from "mdi-material-ui"; export { TableColumn }; +import { DragVertical } from "mdi-material-ui"; +export { DragVertical }; + export * from "./AddRow"; export * from "./AddRowTop"; export * from "./ChevronDown"; diff --git a/src/components/Table/ColumnHeader/ColumnHeader.tsx b/src/components/Table/ColumnHeader/ColumnHeader.tsx index 1a01c9dd..345e856b 100644 --- a/src/components/Table/ColumnHeader/ColumnHeader.tsx +++ b/src/components/Table/ColumnHeader/ColumnHeader.tsx @@ -166,13 +166,13 @@ export const ColumnHeader = forwardRef(function ColumnHeader( placement="bottom-start" disableInteractive TransitionComponent={Fade} + sx={{ "& .MuiTooltip-tooltip": { marginTop: "-28px !important" } }} > diff --git a/src/components/Table/Table.tsx b/src/components/Table/Table.tsx index ad26cb42..5271e90d 100644 --- a/src/components/Table/Table.tsx +++ b/src/components/Table/Table.tsx @@ -16,6 +16,7 @@ import { } from "react-beautiful-dnd"; import { get } from "lodash-es"; import { ErrorBoundary } from "react-error-boundary"; +import { DragVertical } from "@src/assets/icons"; import StyledTable from "./Styled/StyledTable"; import StyledRow from "./Styled/StyledRow"; @@ -44,12 +45,9 @@ import { selectedCellAtom, contextMenuTargetAtom, } from "@src/atoms/tableScope"; -import { COLLECTION_PAGE_SIZE } from "@src/config/db"; import { getFieldType, getFieldProp } from "@src/components/fields"; -import { FieldType } from "@src/constants/fields"; import { TableRow, ColumnConfig } from "@src/types/table"; -import { StyledCell } from "./Styled/StyledCell"; import { useKeyboardNavigation } from "./useKeyboardNavigation"; import { useSaveColumnSizing } from "./useSaveColumnSizing"; import useVirtualization from "./useVirtualization"; @@ -89,7 +87,6 @@ export default function Table({ hiddenColumns, emptyState, }: ITableProps) { - const [tableSettings] = useAtom(tableSettingsAtom, tableScope); const [tableSchema] = useAtom(tableSchemaAtom, tableScope); const [tableColumnsOrdered] = useAtom(tableColumnsOrderedAtom, tableScope); const [tableRows] = useAtom(tableRowsAtom, tableScope); @@ -100,7 +97,6 @@ export default function Table({ const focusInsideCell = selectedCell?.focusInside ?? false; const updateColumn = useSetAtom(updateColumnAtom, tableScope); - const updateField = useSetAtom(updateFieldAtom, tableScope); const containerRef = useRef(null); const gridRef = useRef(null); @@ -365,8 +361,40 @@ export default function Table({ position: "absolute", inset: 0, zIndex: 0, + display: "flex", + alignItems: "center", + outline: "none", }} - /> + className="column-drag-handle" + > + + theme.transitions.create(["opacity"]), + "[role='columnheader']:hover &, [role='columnheader']:focus-within &": + { + opacity: 0.5, + }, + ".column-drag-handle:hover &": { + opacity: 1, + }, + ".column-drag-handle:active &": { + opacity: 1, + color: "primary.main", + }, + ".column-drag-handle:focus &": { + opacity: 1, + color: "primary.main", + outline: "2px solid", + outlineColor: "primary.main", + }, + }} + style={{ width: 8 }} + preserveAspectRatio="xMidYMid slice" + /> +
    {header.column.getCanResize() && ( Date: Tue, 15 Nov 2022 08:30:43 +0300 Subject: [PATCH 259/309] enable multi files for image&file fields --- src/atoms/tableScope/rowActions.ts | 42 ++- .../SideDrawer/SideDrawerFields.tsx | 15 +- .../fields/File/SideDrawerField.tsx | 68 ++--- src/components/fields/File/TableCell.tsx | 70 ++--- src/components/fields/File/useFileUpload.ts | 61 +++++ .../fields/Image/SideDrawerField.tsx | 116 ++++---- src/components/fields/Image/TableCell.tsx | 87 +++--- src/hooks/useFirebaseStorageUploader.tsx | 256 ++++++++++-------- 8 files changed, 402 insertions(+), 313 deletions(-) create mode 100644 src/components/fields/File/useFileUpload.ts diff --git a/src/atoms/tableScope/rowActions.ts b/src/atoms/tableScope/rowActions.ts index 37d1f9de..eb462498 100644 --- a/src/atoms/tableScope/rowActions.ts +++ b/src/atoms/tableScope/rowActions.ts @@ -6,6 +6,7 @@ import { set as _set, isEqual, unset, + filter, } from "lodash-es"; import { currentUserAtom } from "@src/atoms/projectScope"; @@ -29,6 +30,7 @@ import { updateRowData, omitRowyFields, } from "@src/utils/table"; +import { arrayRemove, arrayUnion } from "firebase/firestore"; export interface IAddRowOptions { /** The row or array of rows to add */ @@ -306,6 +308,10 @@ export interface IUpdateFieldOptions { ignoreRequiredFields?: boolean; /** Optionally, disable checking if the updated value is equal to the current value. By default, we skip the update if they’re equal. */ disableCheckEquality?: boolean; + /** Optionally, uses firestore's arrayUnion with the given value. Appends given value items to the existing array */ + useArrayUnion?: boolean; + /** Optionally, uses firestore's arrayRemove with the given value. Removes given value items from the existing array */ + useArrayRemove?: boolean; } /** * Set function updates or deletes a field in a row. @@ -331,6 +337,8 @@ export const updateFieldAtom = atom( deleteField, ignoreRequiredFields, disableCheckEquality, + useArrayUnion, + useArrayRemove, }: IUpdateFieldOptions ) => { const updateRowDb = get(_updateRowDbAtom); @@ -367,8 +375,36 @@ export const updateFieldAtom = atom( _set(update, fieldName, value); } + const localUpdate = cloneDeep(update); + const dbUpdate = cloneDeep(update); + // apply arrayUnion + if (useArrayUnion) { + if (!Array.isArray(update[fieldName])) + throw new Error("Field must be an array"); + + // use basic array merge on local row value + localUpdate[fieldName] = [ + ...(row[fieldName] ?? []), + ...localUpdate[fieldName], + ]; + dbUpdate[fieldName] = arrayUnion(...dbUpdate[fieldName]); + } + + //apply arrayRemove + if (useArrayRemove) { + if (!Array.isArray(update[fieldName])) + throw new Error("Field must be an array"); + + // use basic array filter on local row value + localUpdate[fieldName] = filter( + row[fieldName] ?? [], + (el) => !find(localUpdate[fieldName], el) + ); + dbUpdate[fieldName] = arrayRemove(...dbUpdate[fieldName]); + } + // Check for required fields - const newRowValues = updateRowData(cloneDeep(row), update); + const newRowValues = updateRowData(cloneDeep(row), dbUpdate); const requiredFields = ignoreRequiredFields ? [] : tableColumnsOrdered @@ -383,7 +419,7 @@ export const updateFieldAtom = atom( set(tableRowsLocalAtom, { type: "update", path, - row: update, + row: localUpdate, deleteFields: deleteField ? [fieldName] : [], }); @@ -403,7 +439,7 @@ export const updateFieldAtom = atom( else { await updateRowDb( row._rowy_ref.path, - omitRowyFields(update), + omitRowyFields(dbUpdate), deleteField ? [fieldName] : [] ); } diff --git a/src/components/SideDrawer/SideDrawerFields.tsx b/src/components/SideDrawer/SideDrawerFields.tsx index 7b6a6578..937d5b44 100644 --- a/src/components/SideDrawer/SideDrawerFields.tsx +++ b/src/components/SideDrawer/SideDrawerFields.tsx @@ -23,7 +23,8 @@ import { sideDrawerShowHiddenFieldsAtom, } from "@src/atoms/tableScope"; import { formatSubTableName } from "@src/utils/table"; -import { TableRow } from "@src/types/table"; +import { ColumnConfig, TableRow } from "@src/types/table"; +import { FieldType } from "@src/components/fields/types"; export interface ISideDrawerFieldsProps { row: TableRow; @@ -66,7 +67,17 @@ export default function SideDrawerFields({ row }: ISideDrawerFieldsProps) { setSaveState("saving"); try { - await updateField({ path: selectedCell!.path, fieldName, value }); + const { type } = tableColumnsOrdered.find( + (c) => c.key === selectedCell.columnKey + ) as ColumnConfig; + const useArrayUnion = [FieldType.file, FieldType.image].includes(type); + + await updateField({ + path: selectedCell!.path, + fieldName, + value, + useArrayUnion, + }); setSaveState("saved"); } catch (e) { enqueueSnackbar((e as Error).message, { variant: "error" }); diff --git a/src/components/fields/File/SideDrawerField.tsx b/src/components/fields/File/SideDrawerField.tsx index cad34d9b..af3f6168 100644 --- a/src/components/fields/File/SideDrawerField.tsx +++ b/src/components/fields/File/SideDrawerField.tsx @@ -1,10 +1,9 @@ -import { useCallback, useState } from "react"; +import { useState } from "react"; import { ISideDrawerFieldProps } from "@src/components/fields/types"; import { useSetAtom } from "jotai"; import { format } from "date-fns"; import { useDropzone } from "react-dropzone"; -import useUploader from "@src/hooks/useFirebaseStorageUploader"; import { alpha, @@ -23,52 +22,30 @@ import { DATE_TIME_FORMAT } from "@src/constants/dates"; import { fieldSx, getFieldId } from "@src/components/SideDrawer/utils"; import { projectScope, confirmDialogAtom } from "@src/atoms/projectScope"; import { FileValue } from "@src/types/table"; -import { arrayUnion } from "firebase/firestore"; +import useFileUpload from "./useFileUpload"; export default function File_({ column, _rowy_ref, value, - onChange, - onSubmit, disabled, }: ISideDrawerFieldProps) { const confirm = useSetAtom(confirmDialogAtom, projectScope); - - const { uploaderState, upload, deleteUpload } = useUploader(); - - // Store a preview image locally while uploading - const [localFiles, setLocalFiles] = useState([]); - - const onDrop = useCallback( - (acceptedFiles: File[]) => { - if (_rowy_ref && acceptedFiles.length > 0) { - upload({ - docRef: _rowy_ref! as any, - fieldName: column.key, - files: acceptedFiles, - onComplete: (newUploads) => { - onChange(arrayUnion(newUploads)); - onSubmit(); - setLocalFiles([]); - }, - }); - setLocalFiles(acceptedFiles.map((file) => file.name)); - } - }, - [_rowy_ref, value] + const { loading, progress, handleUpload, handleDelete } = useFileUpload( + _rowy_ref, + column.key ); - const handleDelete = (index: number) => { - const newValue = [...value]; - const toBeDeleted = newValue.splice(index, 1); - toBeDeleted.length && deleteUpload(toBeDeleted[0]); - onChange(newValue); - onSubmit(); - }; + const [localFiles, setLocalFiles] = useState([]); const { getRootProps, getInputProps, isDragActive } = useDropzone({ - onDrop, + onDrop: async (acceptedFiles: File[]) => { + if (acceptedFiles.length > 0) { + setLocalFiles(acceptedFiles); + await handleUpload(acceptedFiles); + setLocalFiles([]); + } + }, multiple: true, }); @@ -76,6 +53,7 @@ export default function File_({ <> {!disabled && ( Click to upload or drop file here - + {loading ? ( + + ) : ( + + )} )} {Array.isArray(value) && - value.map((file: FileValue, i) => ( + value.map((file: FileValue) => ( handleDelete(i), + handleConfirm: () => handleDelete(file), }) : undefined } @@ -137,11 +123,11 @@ export default function File_({ ))} {localFiles && - localFiles.map((fileName) => ( + localFiles.map((file) => ( } - label={fileName} + label={file.name} deleteIcon={ } diff --git a/src/components/fields/File/TableCell.tsx b/src/components/fields/File/TableCell.tsx index a4f96c0a..eee9a330 100644 --- a/src/components/fields/File/TableCell.tsx +++ b/src/components/fields/File/TableCell.tsx @@ -1,7 +1,6 @@ -import { useCallback, useState } from "react"; +import { useState } from "react"; import { IHeavyCellProps } from "@src/components/fields/types"; import { useSetAtom } from "jotai"; -import { findIndex } from "lodash-es"; import { useDropzone } from "react-dropzone"; import { format } from "date-fns"; @@ -12,58 +11,33 @@ import ChipList from "@src/components/Table/formatters/ChipList"; import CircularProgressOptical from "@src/components/CircularProgressOptical"; import { projectScope, confirmDialogAtom } from "@src/atoms/projectScope"; -import { tableScope, updateFieldAtom } from "@src/atoms/tableScope"; -import useUploader from "@src/hooks/useFirebaseStorageUploader"; import { FileIcon } from "."; import { DATE_TIME_FORMAT } from "@src/constants/dates"; import { FileValue } from "@src/types/table"; -import { arrayUnion } from "firebase/firestore"; +import useFileUpload from "./useFileUpload"; export default function File_({ column, - row, value, - onSubmit, disabled, docRef, }: IHeavyCellProps) { const confirm = useSetAtom(confirmDialogAtom, projectScope); - const updateField = useSetAtom(updateFieldAtom, tableScope); - const [localFiles, setLocalFiles] = useState([]); - const { uploaderState, upload, deleteUpload } = useUploader(); - const { progress, isLoading } = uploaderState; - const onDrop = useCallback( - (acceptedFiles: File[]) => { - if (acceptedFiles.length > 0) { - upload({ - docRef: docRef! as any, - fieldName: column.key, - files: acceptedFiles, - onComplete: (newUploads) => { - updateField({ - path: docRef.path, - fieldName: column.key, - value: arrayUnion(newUploads), - }); - setLocalFiles([]); - }, - }); - setLocalFiles(acceptedFiles.map((file) => file.name)); - } - }, - [value] + const [localFiles, setLocalFiles] = useState([]); + + const { loading, progress, handleUpload, handleDelete } = useFileUpload( + docRef, + column.key ); - const handleDelete = (ref: string) => { - const newValue = [...value]; - const index = findIndex(newValue, ["ref", ref]); - const toBeDeleted = newValue.splice(index, 1); - toBeDeleted.length && deleteUpload(toBeDeleted[0]); - onSubmit(newValue); - }; - const { getRootProps, getInputProps, isDragActive } = useDropzone({ - onDrop, + onDrop: async (acceptedFiles: File[]) => { + if (acceptedFiles.length > 0) { + setLocalFiles(acceptedFiles); + await handleUpload(acceptedFiles); + setLocalFiles([]); + } + }, multiple: true, }); @@ -111,8 +85,13 @@ export default function File_({ )}`} > } label={file.name} + icon={} + sx={{ + "& .MuiChip-label": { + lineHeight: 5 / 3, + }, + }} onClick={(e) => { window.open(file.downloadURL); e.stopPropagation(); @@ -122,24 +101,23 @@ export default function File_({ ? undefined : () => confirm({ - handleConfirm: () => handleDelete(file.ref), + handleConfirm: () => handleDelete(file), title: "Delete file?", body: "This file cannot be recovered after", confirm: "Delete", confirmColor: "error", }) } - style={{ width: "100%" }} /> ))} {localFiles && - localFiles.map((fileName) => ( + localFiles.map((file) => ( } - label={fileName} + label={file.name} deleteIcon={ } @@ -148,7 +126,7 @@ export default function File_({ ))} - {!isLoading ? ( + {!loading ? ( !disabled && ( 0 + ? uploadingFiles.reduce((sum, fileName) => { + const fileState = uploaderState[fileName]; + return sum + fileState.progress; + }, 0) / uploadingFiles.length + : 0; + + const loading = some( + uploadingFiles, + (fileName) => uploaderState[fileName].loading + ); + + const handleUpload = useCallback( + async (files: File[]) => { + const { uploads, failures } = await upload({ + docRef, + fieldName, + files, + }); + updateField({ + path: docRef.path, + fieldName, + value: uploads, + useArrayUnion: true, + }); + return { uploads, failures }; + }, + [docRef, fieldName, updateField, upload] + ); + + const handleDelete = useCallback( + (file: FileValue) => { + updateField({ + path: docRef.path, + fieldName, + value: [file], + useArrayRemove: true, + disableCheckEquality: true, + }); + deleteUpload(file); + }, + [deleteUpload, docRef, fieldName, updateField] + ); + + return { progress, loading, uploaderState, handleUpload, handleDelete }; +} diff --git a/src/components/fields/Image/SideDrawerField.tsx b/src/components/fields/Image/SideDrawerField.tsx index 304e0555..531ba7e7 100644 --- a/src/components/fields/Image/SideDrawerField.tsx +++ b/src/components/fields/Image/SideDrawerField.tsx @@ -1,10 +1,9 @@ import { ISideDrawerFieldProps } from "@src/components/fields/types"; -import { useCallback, useState } from "react"; +import { useState } from "react"; import { useSetAtom } from "jotai"; +import { assignIn } from "lodash-es"; import { useDropzone } from "react-dropzone"; -// TODO: GENERALIZE -import useUploader from "@src/hooks/useFirebaseStorageUploader"; import { alpha, @@ -20,13 +19,14 @@ import AddIcon from "@mui/icons-material/AddAPhotoOutlined"; import DeleteIcon from "@mui/icons-material/DeleteOutlined"; import OpenIcon from "@mui/icons-material/OpenInNewOutlined"; +import { FileValue } from "@src/types/table"; import Thumbnail from "@src/components/Thumbnail"; import CircularProgressOptical from "@src/components/CircularProgressOptical"; import { projectScope, confirmDialogAtom } from "@src/atoms/projectScope"; -import { IMAGE_MIME_TYPES } from "."; import { fieldSx, getFieldId } from "@src/components/SideDrawer/utils"; -import { arrayUnion } from "firebase/firestore"; +import useFileUpload from "@src/components/fields/File/useFileUpload"; +import { IMAGE_MIME_TYPES } from "."; const imgSx = { position: "relative", @@ -85,46 +85,29 @@ export default function Image_({ column, _rowy_ref, value, - onChange, - onSubmit, disabled, }: ISideDrawerFieldProps) { const confirm = useSetAtom(confirmDialogAtom, projectScope); - const { uploaderState, upload, deleteUpload } = useUploader(); - const { progress } = uploaderState; - // Store a preview image locally while uploading - const [localImages, setLocalImages] = useState([]); + const { loading, progress, handleUpload, handleDelete, uploaderState } = + useFileUpload(_rowy_ref, column.key); - const onDrop = useCallback( - (acceptedFiles: File[]) => { - if (_rowy_ref && acceptedFiles.length > 0) { - upload({ - docRef: _rowy_ref! as any, - fieldName: column.key, - files: acceptedFiles, - onComplete: (newUploads) => { - onChange(arrayUnion(newUploads)); - onSubmit(); - setLocalImages([]); - }, - }); - setLocalImages(acceptedFiles.map((file) => URL.createObjectURL(file))); - } - }, - [_rowy_ref, value] - ); - - const handleDelete = (index: number) => { - const newValue = [...value]; - const toBeDeleted = newValue.splice(index, 1); - toBeDeleted.length && deleteUpload(toBeDeleted[0]); - onChange(newValue); - onSubmit(); - }; + const [localImages, setLocalImages] = useState< + (File & { localURL: string })[] + >([]); const { getRootProps, getInputProps, isDragActive } = useDropzone({ - onDrop, + onDrop: async (acceptedFiles: File[]) => { + if (acceptedFiles.length > 0) { + setLocalImages( + acceptedFiles.map((file) => + assignIn(file, { localURL: URL.createObjectURL(file) }) + ) + ); + await handleUpload(acceptedFiles); + setLocalImages([]); + } + }, multiple: true, accept: IMAGE_MIME_TYPES, }); @@ -133,6 +116,7 @@ export default function Image_({ <> {!disabled && ( - + {loading ? ( + + ) : ( + + )} )} {Array.isArray(value) && - value.map((image, i) => ( - + value.map((image: FileValue) => ( + {disabled ? ( handleDelete(i), + handleConfirm: () => handleDelete(image), }) } > @@ -236,26 +228,34 @@ export default function Image_({ ))} {localImages && - localImages.map((image, i) => ( - + localImages.map((image) => ( + - - - + {uploaderState[image.name] && ( + + + + )} ))} diff --git a/src/components/fields/Image/TableCell.tsx b/src/components/fields/Image/TableCell.tsx index 471a6f37..f8f31861 100644 --- a/src/components/fields/Image/TableCell.tsx +++ b/src/components/fields/Image/TableCell.tsx @@ -1,8 +1,7 @@ -import { useCallback, useState } from "react"; +import { useState } from "react"; import { IHeavyCellProps } from "@src/components/fields/types"; import { useAtom, useSetAtom } from "jotai"; -import { findIndex } from "lodash-es"; - +import { assignIn } from "lodash-es"; import { useDropzone } from "react-dropzone"; import { @@ -23,16 +22,11 @@ import Thumbnail from "@src/components/Thumbnail"; import CircularProgressOptical from "@src/components/CircularProgressOptical"; import { projectScope, confirmDialogAtom } from "@src/atoms/projectScope"; -import { - tableSchemaAtom, - tableScope, - updateFieldAtom, -} from "@src/atoms/tableScope"; -import useUploader from "@src/hooks/useFirebaseStorageUploader"; -import { IMAGE_MIME_TYPES } from "./index"; +import { tableSchemaAtom, tableScope } from "@src/atoms/tableScope"; import { DEFAULT_ROW_HEIGHT } from "@src/components/Table"; import { FileValue } from "@src/types/table"; -import { arrayUnion } from "firebase/firestore"; +import useFileUpload from "@src/components/fields/File/useFileUpload"; +import { IMAGE_MIME_TYPES } from "./index"; // MULTIPLE const imgSx = (rowHeight: number) => ({ @@ -89,50 +83,33 @@ const deleteImgHoverSx = { export default function Image_({ column, value, - onSubmit, disabled, docRef, }: IHeavyCellProps) { const confirm = useSetAtom(confirmDialogAtom, projectScope); - const updateField = useSetAtom(updateFieldAtom, tableScope); const [tableSchema] = useAtom(tableSchemaAtom, tableScope); - const { uploaderState, upload, deleteUpload } = useUploader(); - const { progress, isLoading } = uploaderState; - // Store a preview image locally while uploading - const [localImages, setLocalImages] = useState([]); - - const onDrop = useCallback( - (acceptedFiles: File[]) => { - if (acceptedFiles.length > 0) { - upload({ - docRef: docRef! as any, - fieldName: column.key, - files: acceptedFiles, - onComplete: (newUploads) => { - updateField({ - path: docRef.path, - fieldName: column.key, - value: arrayUnion(newUploads), - }); - setLocalImages([]); - }, - }); - setLocalImages(acceptedFiles.map((file) => URL.createObjectURL(file))); - } - }, - [value] + const { loading, progress, handleUpload, handleDelete } = useFileUpload( + docRef, + column.key ); - const handleDelete = (index: number) => () => { - const newValue = [...value]; - const toBeDeleted = newValue.splice(index, 1); - toBeDeleted.length && deleteUpload(toBeDeleted[0]); - onSubmit(newValue); - }; + const [localImages, setLocalImages] = useState< + (File & { localURL: string })[] + >([]); const { getRootProps, getInputProps, isDragActive } = useDropzone({ - onDrop, + onDrop: async (acceptedFiles: File[]) => { + if (acceptedFiles.length > 0) { + setLocalImages( + acceptedFiles.map((file) => + assignIn(file, { localURL: URL.createObjectURL(file) }) + ) + ); + await handleUpload(acceptedFiles); + setLocalImages([]); + } + }, multiple: true, accept: IMAGE_MIME_TYPES, }); @@ -181,17 +158,17 @@ export default function Image_({ > {Array.isArray(value) && - value.map((file: FileValue, i) => ( - + value.map((image: FileValue) => ( + {disabled ? ( window.open(file.downloadURL, "_blank")} + onClick={() => window.open(image.downloadURL, "_blank")} > handleDelete(image), }); }} > ( + localImages.map((image) => ( ))}
    - {!isLoading ? ( + {!loading ? ( !disabled && ( -) => ({ ...prevState, ...newProps }); + action: { + type: "reset" | "file_update"; + data?: { fileName: string; newProps: Partial }; + } +) => { + switch (action.type) { + case "reset": + return {}; + case "file_update": + const { fileName, newProps } = action.data!; + const nextState = { ...prevState }; + nextState[fileName] = { + ...nextState[fileName], + ...newProps, + }; + return nextState; + } +}; export type UploadProps = { docRef: DocumentReference; fieldName: string; files: File[]; - onComplete?: (value: FileValue) => void; + onComplete?: ({ + uploads, + failures, + }: { + uploads: FileValue[]; + failures: string[]; + }) => void; }; // TODO: GENERALIZE INTO ATOM @@ -41,116 +66,129 @@ const useFirebaseStorageUploader = () => { const [firebaseStorage] = useAtom(firebaseStorageAtom, projectScope); const { enqueueSnackbar } = useSnackbar(); - const [uploaderState, uploaderDispatch] = useReducer(uploadReducer, { - ...initialState, - }); + const [uploaderState, uploaderDispatch] = useReducer(uploadReducer, {}); - const upload = ({ docRef, fieldName, files, onComplete }: UploadProps) => { - uploaderDispatch({ isLoading: true }); + const upload = ({ docRef, fieldName, files }: UploadProps) => { + const uploads = [] as FileValue[]; + const failures = [] as string[]; + const isCompleted = () => uploads.length + failures.length === files.length; - files.forEach((file) => { - const storageRef = ref( - firebaseStorage, - `${docRef.path}/${fieldName}/${file.name}` - ); - const uploadTask = uploadBytesResumable(storageRef, file, { - cacheControl: "public, max-age=31536000", - }); - uploadTask.on( - // event - "state_changed", - // observer - (snapshot) => { - // Get task progress, including the number of bytes uploaded and the total number of bytes to be uploaded - const progress = - (snapshot.bytesTransferred / snapshot.totalBytes) * 100; - uploaderDispatch({ progress }); - console.log("Upload is " + progress + "% done"); + return new Promise((resolve) => + files.forEach((file) => { + uploaderDispatch({ + type: "file_update", + data: { + fileName: file.name, + newProps: { loading: true, progress: 0 }, + }, + }); - switch (snapshot.state) { - case "paused": - console.log("Upload is paused"); - break; - case "running": - console.log("Upload is running"); - break; - } - }, + const storageRef = ref( + firebaseStorage, + `${docRef.path}/${fieldName}/${file.name}` + ); + const uploadTask = uploadBytesResumable(storageRef, file, { + cacheControl: "public, max-age=31536000", + }); + uploadTask.on( + // event + "state_changed", + // observer + (snapshot) => { + // Get task progress, including the number of bytes uploaded and the total number of bytes to be uploaded + const progress = + (snapshot.bytesTransferred / snapshot.totalBytes) * 100; + uploaderDispatch({ + type: "file_update", + data: { fileName: file.name, newProps: { progress } }, + }); + }, - // error – must be any to access error.code - (error: any) => { - // A full list of error codes is available at - // https://firebase.google.com/docs/storage/web/handle-errors - switch (error.code) { - case "storage/unknown": - // Unknown error occurred, inspect error.serverResponse - enqueueSnackbar("Unknown error occurred", { variant: "error" }); - uploaderDispatch({ error: error.serverResponse }); - break; + // error – must be any to access error.code + (error: any) => { + // A full list of error codes is available at + // https://firebase.google.com/docs/storage/web/handle-errors + const errorAction = { + fileName: file.name, + newProps: { loading: false } as Partial, + }; + switch (error.code) { + case "storage/unknown": + // Unknown error occurred, inspect error.serverResponse + enqueueSnackbar("Unknown error occurred", { variant: "error" }); + errorAction.newProps.error = error.serverResponse; + break; - case "storage/unauthorized": - // User doesn't have permission to access the object - enqueueSnackbar("You don’t have permissions to upload files", { - variant: "error", - action: ( - - - - ), - }); - uploaderDispatch({ error: error.code }); - break; + case "storage/unauthorized": + // User doesn't have permission to access the object + enqueueSnackbar("You don’t have permissions to upload files", { + variant: "error", + action: ( + + + + ), + }); + errorAction.newProps.error = error.code; + break; - case "storage/canceled": - // User canceled the upload - uploaderDispatch({ error: error.code }); - break; - - default: - uploaderDispatch({ error: error.code }); - // Unknown error occurred, inspect error.serverResponse - break; - } - - uploaderDispatch({ isLoading: false }); - }, - - // complete - () => { - uploaderDispatch({ isLoading: false }); - - // Upload completed successfully, now we can get the download URL - getDownloadURL(uploadTask.snapshot.ref).then( - (downloadURL: string) => { - // STore in the document if docRef provided - // if (docRef && docRef.update)docRef.update({ [fieldName]: newValue }); - // Also call callback if it exists - // IMPORTANT: SideDrawer form may not update its local values after this - // function updates the doc, so you MUST update it manually - // using this callback - const obj = { - ref: uploadTask.snapshot.ref.fullPath, - downloadURL, - name: file.name, - type: file.type, - lastModifiedTS: file.lastModified, - }; - if (onComplete) onComplete(obj); + case "storage/canceled": + default: + errorAction.newProps.error = error.code; + break; } - ); - } - ); + failures.push(file.name); + uploaderDispatch({ type: "file_update", data: errorAction }); + if (isCompleted()) resolve(true); + }, + + // complete + () => { + uploaderDispatch({ + type: "file_update", + data: { + fileName: file.name, + newProps: { loading: false }, + }, + }); + + // Upload completed successfully, now we can get the download URL + getDownloadURL(uploadTask.snapshot.ref).then( + (downloadURL: string) => { + // Store in the document if docRef provided + // if (docRef && docRef.update)docRef.update({ [fieldName]: newValue }); + // Also call callback if it exists + // IMPORTANT: SideDrawer form may not update its local values after this + // function updates the doc, so you MUST update it manually + // using this callback + const obj = { + ref: uploadTask.snapshot.ref.fullPath, + downloadURL, + name: file.name, + type: file.type, + lastModifiedTS: file.lastModified, + }; + uploads.push(obj); + if (isCompleted()) resolve(true); + } + ); + } + ); + }) + ).then(() => { + uploaderDispatch({ type: "reset" }); + return { uploads, failures }; }); }; From bdfce19af0afbaf7363e97fc76b1eb6bd62d0952 Mon Sep 17 00:00:00 2001 From: Han Tuerker Date: Tue, 15 Nov 2022 08:35:25 +0300 Subject: [PATCH 260/309] remove unneccessary arrayUnion flag --- src/components/SideDrawer/SideDrawerFields.tsx | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/src/components/SideDrawer/SideDrawerFields.tsx b/src/components/SideDrawer/SideDrawerFields.tsx index 937d5b44..7b6a6578 100644 --- a/src/components/SideDrawer/SideDrawerFields.tsx +++ b/src/components/SideDrawer/SideDrawerFields.tsx @@ -23,8 +23,7 @@ import { sideDrawerShowHiddenFieldsAtom, } from "@src/atoms/tableScope"; import { formatSubTableName } from "@src/utils/table"; -import { ColumnConfig, TableRow } from "@src/types/table"; -import { FieldType } from "@src/components/fields/types"; +import { TableRow } from "@src/types/table"; export interface ISideDrawerFieldsProps { row: TableRow; @@ -67,17 +66,7 @@ export default function SideDrawerFields({ row }: ISideDrawerFieldsProps) { setSaveState("saving"); try { - const { type } = tableColumnsOrdered.find( - (c) => c.key === selectedCell.columnKey - ) as ColumnConfig; - const useArrayUnion = [FieldType.file, FieldType.image].includes(type); - - await updateField({ - path: selectedCell!.path, - fieldName, - value, - useArrayUnion, - }); + await updateField({ path: selectedCell!.path, fieldName, value }); setSaveState("saved"); } catch (e) { enqueueSnackbar((e as Error).message, { variant: "error" }); From 059c6164146de40c7929c4b7f8ed18b06d7fcf28 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Tue, 15 Nov 2022 16:53:20 +1100 Subject: [PATCH 261/309] memoize more components --- src/components/Table/CellValidation.tsx | 186 ++++++++--- .../Table/FinalColumn/FinalColumn.tsx | 4 +- .../Table/FinalColumn/FinalColumnHeader.tsx | 4 +- src/components/Table/Table.tsx | 298 ++---------------- src/components/Table/TableHeaderGroup.tsx | 193 ++++++++++++ src/components/Table/formatters/ChipList.tsx | 13 +- .../Table/useKeyboardNavigation.tsx | 205 ++++++------ src/components/Table/useSaveColumnSizing.tsx | 6 +- src/components/Table/withTableCell.tsx | 23 +- .../fields/ConnectService/DisplayCell.tsx | 3 +- .../fields/ConnectTable/DisplayCell.tsx | 3 +- .../fields/Connector/DisplayCell.tsx | 3 +- src/components/fields/File/DisplayCell.tsx | 8 +- src/components/fields/File/EditorCell.tsx | 3 +- src/components/fields/Id/DisplayCell.tsx | 4 +- .../fields/MultiSelect/DisplayCell.tsx | 3 +- src/components/fields/SubTable/utils.ts | 4 +- src/components/fields/types.ts | 17 +- src/pages/Table/TablePage.tsx | 12 +- 19 files changed, 535 insertions(+), 457 deletions(-) create mode 100644 src/components/Table/TableHeaderGroup.tsx diff --git a/src/components/Table/CellValidation.tsx b/src/components/Table/CellValidation.tsx index 02284cb3..e19dde1b 100644 --- a/src/components/Table/CellValidation.tsx +++ b/src/components/Table/CellValidation.tsx @@ -1,11 +1,25 @@ import { memo } from "react"; +import { useAtom, useSetAtom } from "jotai"; +import { ErrorBoundary } from "react-error-boundary"; +import { flexRender } from "@tanstack/react-table"; +import type { Row, Cell } from "@tanstack/react-table"; + import { styled } from "@mui/material/styles"; import ErrorIcon from "@mui/icons-material/ErrorOutline"; import WarningIcon from "@mui/icons-material/WarningAmber"; import StyledCell from "./Styled/StyledCell"; +import { InlineErrorFallback } from "@src/components/ErrorFallback"; import RichTooltip from "@src/components/RichTooltip"; +import { + tableScope, + selectedCellAtom, + contextMenuTargetAtom, +} from "@src/atoms/tableScope"; +import { TABLE_PADDING } from "./Table"; +import type { TableRow } from "@src/types/table"; + const Dot = styled("div")(({ theme }) => ({ position: "absolute", right: -5, @@ -25,55 +39,147 @@ const Dot = styled("div")(({ theme }) => ({ }, })); -export interface ICellValidationProps - extends React.DetailedHTMLProps< - React.HTMLAttributes, - HTMLDivElement - > { - value: any; - required?: boolean; - validationRegex?: string; +export interface ICellValidationProps { + row: Row; + cell: Cell; + index: number; + isSelectedCell: boolean; + isReadOnlyCell: boolean; + canEditCells: boolean; + rowHeight: number; + lastFrozen?: string; + left?: number; } export const CellValidation = memo(function MemoizedCellValidation({ - value, - required, - validationRegex, - children, - ...props + row, + cell, + index, + isSelectedCell, + isReadOnlyCell, + canEditCells, + rowHeight, + lastFrozen, + left, }: ICellValidationProps) { + const [selectedCell, setSelectedCell] = useAtom(selectedCellAtom, tableScope); + const focusInsideCell = selectedCell?.focusInside ?? false; + const setContextMenuTarget = useSetAtom(contextMenuTargetAtom, tableScope); + + const value = cell.getValue(); + const required = cell.column.columnDef.meta?.config?.required; + const validationRegex = cell.column.columnDef.meta?.config?.validationRegex; + const isInvalid = validationRegex && !new RegExp(validationRegex).test(value); const isMissing = required && value === undefined; - if (isInvalid) - return ( - - } - title="Invalid data" - message="This row will not be saved until all the required fields contain valid data" - placement="right" - render={({ openTooltip }) => } - /> - {children} - - ); + const renderedCell = ( + + {flexRender(cell.column.columnDef.cell, { + ...cell.getContext(), + focusInsideCell: isSelectedCell && focusInsideCell, + setFocusInsideCell: (focusInside: boolean) => + setSelectedCell({ + path: row.original._rowy_ref.path, + columnKey: cell.column.id, + focusInside, + }), + disabled: + !canEditCells || cell.column.columnDef.meta?.editable === false, + rowHeight, + })} + + ); - if (isMissing) - return ( - - } - title="Required field" - message="This row will not be saved until all the required fields contain valid data" - placement="right" - render={({ openTooltip }) => } - /> - {children} - - ); + // if (isInvalid) + // return ( + // + // } + // title="Invalid data" + // message="This row will not be saved until all the required fields contain valid data" + // placement="right" + // render={({ openTooltip }) => } + // /> + // {children} + // + // ); - return {children}; + // if (isMissing) + // return ( + // + // } + // title="Required field" + // message="This row will not be saved until all the required fields contain valid data" + // placement="right" + // render={({ openTooltip }) => } + // /> + // {children} + // + // ); + + return ( + { + setSelectedCell({ + path: row.original._rowy_ref.path, + columnKey: cell.column.id, + focusInside: false, + }); + (e.target as HTMLDivElement).focus(); + }} + onDoubleClick={(e) => { + setSelectedCell({ + path: row.original._rowy_ref.path, + columnKey: cell.column.id, + focusInside: true, + }); + (e.target as HTMLDivElement).focus(); + }} + onContextMenu={(e) => { + e.preventDefault(); + setSelectedCell({ + path: row.original._rowy_ref.path, + columnKey: cell.column.id, + focusInside: false, + }); + (e.target as HTMLDivElement).focus(); + setContextMenuTarget(e.target as HTMLElement); + }} + > + {renderedCell} + + ); }); export default CellValidation; diff --git a/src/components/Table/FinalColumn/FinalColumn.tsx b/src/components/Table/FinalColumn/FinalColumn.tsx index 4b7c8bd0..6f058eda 100644 --- a/src/components/Table/FinalColumn/FinalColumn.tsx +++ b/src/components/Table/FinalColumn/FinalColumn.tsx @@ -1,6 +1,6 @@ import { memo } from "react"; import { useAtom, useSetAtom } from "jotai"; -import type { TableCellProps } from "@src/components/Table"; +import type { ITableCellProps } from "@src/components/Table/withTableCell"; import { Stack, Tooltip, IconButton, alpha } from "@mui/material"; import { CopyCells as CopyCellsIcon } from "@src/assets/icons"; @@ -25,7 +25,7 @@ import { export const FinalColumn = memo(function FinalColumn({ row, focusInsideCell, -}: TableCellProps) { +}: ITableCellProps) { const [userRoles] = useAtom(userRolesAtom, projectScope); const [addRowIdType] = useAtom(tableAddRowIdTypeAtom, projectScope); const confirm = useSetAtom(confirmDialogAtom, projectScope); diff --git a/src/components/Table/FinalColumn/FinalColumnHeader.tsx b/src/components/Table/FinalColumn/FinalColumnHeader.tsx index 416cab5c..a1989f53 100644 --- a/src/components/Table/FinalColumn/FinalColumnHeader.tsx +++ b/src/components/Table/FinalColumn/FinalColumnHeader.tsx @@ -9,12 +9,12 @@ import { spreadSx } from "@src/utils/ui"; export interface IFinalColumnHeaderProps extends Partial { focusInsideCell: boolean; - canAddColumn: boolean; + canAddColumns: boolean; } export default function FinalColumnHeader({ focusInsideCell, - canAddColumn, + canAddColumns, ...props }: IFinalColumnHeaderProps) { const [userRoles] = useAtom(userRolesAtom, projectScope); diff --git a/src/components/Table/Table.tsx b/src/components/Table/Table.tsx index 5271e90d..74c14a40 100644 --- a/src/components/Table/Table.tsx +++ b/src/components/Table/Table.tsx @@ -20,6 +20,7 @@ import { DragVertical } from "@src/assets/icons"; import StyledTable from "./Styled/StyledTable"; import StyledRow from "./Styled/StyledRow"; +import TableHeaderGroup from "./TableHeaderGroup"; import ColumnHeader from "./ColumnHeader"; import StyledResizer from "./Styled/StyledResizer"; import FinalColumnHeader from "./FinalColumn/FinalColumnHeader"; @@ -59,12 +60,6 @@ export const TABLE_PADDING = 16; export const OUT_OF_ORDER_MARGIN = 8; export const DEBOUNCE_DELAY = 500; -export type TableCellProps = CellContext & { - focusInsideCell: boolean; - setFocusInsideCell: (focusInside: boolean) => void; - disabled: boolean; -}; - declare module "@tanstack/table-core" { interface ColumnMeta extends ColumnConfig {} } @@ -73,17 +68,17 @@ const columnHelper = createColumnHelper(); const getRowId = (row: TableRow) => row._rowy_ref.path || row._rowy_ref.id; export interface ITableProps { - canAddColumn: boolean; - canEditColumn: boolean; - canEditCell: boolean; + canAddColumns: boolean; + canEditColumns: boolean; + canEditCells: boolean; hiddenColumns?: string[]; emptyState?: React.ReactNode; } export default function Table({ - canAddColumn, - canEditColumn, - canEditCell, + canAddColumns, + canEditColumns, + canEditCells, hiddenColumns, emptyState, }: ITableProps) { @@ -118,7 +113,7 @@ export default function Table({ }) ); - if (canAddColumn || canEditCell) { + if (canAddColumns || canEditCells) { _columns.push( columnHelper.display({ id: "_rowy_column_actions", @@ -128,7 +123,7 @@ export default function Table({ } return _columns; - }, [tableColumnsOrdered, canAddColumn, canEditCell]); + }, [tableColumnsOrdered, canAddColumns, canEditCells]); // Get user’s hidden columns from props and memoize into a VisibilityState const columnVisibility = useMemo(() => { @@ -183,7 +178,7 @@ export default function Table({ paddingLeft, paddingRight, } = useVirtualization(containerRef, leafColumns); - useSaveColumnSizing(columnSizing, canEditColumn); + useSaveColumnSizing(columnSizing, canEditColumns); const handleDropColumn = useCallback( (result: DropResult) => { @@ -227,7 +222,7 @@ export default function Table({ - - {table.getHeaderGroups().map((headerGroup) => ( - - {(provided) => ( - - {headerGroup.headers.map((header) => { - const isSelectedCell = - (!selectedCell && header.index === 0) || - (selectedCell?.path === "_rowy_header" && - selectedCell?.columnKey === header.id); - - if (header.id === "_rowy_column_actions") - return ( - - ); - - if (!header.column.columnDef.meta) return null; - - return ( - - {(provided, snapshot) => ( - { - setSelectedCell({ - path: "_rowy_header", - columnKey: header.id, - focusInside: false, - }); - (e.target as HTMLDivElement).focus(); - }} - onDoubleClick={(e) => { - setSelectedCell({ - path: "_rowy_header", - columnKey: header.id, - focusInside: true, - }); - (e.target as HTMLDivElement).focus(); - }} - focusInsideCell={ - isSelectedCell && focusInsideCell - } - > -
    - - theme.transitions.create(["opacity"]), - "[role='columnheader']:hover &, [role='columnheader']:focus-within &": - { - opacity: 0.5, - }, - ".column-drag-handle:hover &": { - opacity: 1, - }, - ".column-drag-handle:active &": { - opacity: 1, - color: "primary.main", - }, - ".column-drag-handle:focus &": { - opacity: 1, - color: "primary.main", - outline: "2px solid", - outlineColor: "primary.main", - }, - }} - style={{ width: 8 }} - preserveAspectRatio="xMidYMid slice" - /> -
    - - {header.column.getCanResize() && ( - - )} -
    - )} -
    - ); - })} - {provided.placeholder} -
    - )} -
    - ))} -
    +
    @@ -464,95 +301,20 @@ export default function Table({ return ( { - setSelectedCell({ - path: row.original._rowy_ref.path, - columnKey: cell.column.id, - focusInside: false, - }); - (e.target as HTMLDivElement).focus(); - }} - onDoubleClick={(e) => { - setSelectedCell({ - path: row.original._rowy_ref.path, - columnKey: cell.column.id, - focusInside: true, - }); - (e.target as HTMLDivElement).focus(); - }} - onContextMenu={(e) => { - e.preventDefault(); - setSelectedCell({ - path: row.original._rowy_ref.path, - columnKey: cell.column.id, - focusInside: false, - }); - (e.target as HTMLDivElement).focus(); - setContextMenuTarget(e.target as HTMLElement); - }} - value={cell.getValue()} - required={cell.column.columnDef.meta?.config?.required} - validationRegex={ - cell.column.columnDef.meta?.config?.validationRegex - } - > - - {flexRender(cell.column.columnDef.cell, { - ...cell.getContext(), - focusInsideCell: isSelectedCell && focusInsideCell, - setFocusInsideCell: (focusInside: boolean) => - setSelectedCell({ - path: row.original._rowy_ref.path, - columnKey: cell.column.id, - focusInside, - }), - disabled: - !canEditCell || - cell.column.columnDef.meta?.editable === false, - })} - - + isSelectedCell={isSelectedCell} + isReadOnlyCell={isReadOnlyCell} + canEditCells={canEditCells} + lastFrozen={lastFrozen} + rowHeight={tableSchema.rowHeight || DEFAULT_ROW_HEIGHT} + /> ); })} diff --git a/src/components/Table/TableHeaderGroup.tsx b/src/components/Table/TableHeaderGroup.tsx new file mode 100644 index 00000000..9f2e0a23 --- /dev/null +++ b/src/components/Table/TableHeaderGroup.tsx @@ -0,0 +1,193 @@ +import { memo } from "react"; +import { useAtom } from "jotai"; +import { DragDropContext, Droppable, Draggable } from "react-beautiful-dnd"; +import type { DropResult } from "react-beautiful-dnd"; +import type { HeaderGroup } from "@tanstack/react-table"; +import type { TableRow } from "@src/types/table"; + +import StyledRow from "./Styled/StyledRow"; +import ColumnHeader from "./ColumnHeader"; +import StyledResizer from "./Styled/StyledResizer"; +import FinalColumnHeader from "./FinalColumn/FinalColumnHeader"; +import { DragVertical } from "@src/assets/icons"; + +import { tableScope, selectedCellAtom } from "@src/atoms/tableScope"; +import { DEFAULT_ROW_HEIGHT, TABLE_PADDING } from "@src/components/Table"; + +export interface ITableHeaderGroupProps { + headerGroups: HeaderGroup[]; + handleDropColumn: (result: DropResult) => void; + canAddColumns: boolean; + canEditColumns: boolean; + lastFrozen?: string; +} + +export const TableHeaderGroup = memo(function TableHeaderGroup({ + headerGroups, + handleDropColumn, + canAddColumns, + canEditColumns, + lastFrozen, +}: ITableHeaderGroupProps) { + const [selectedCell, setSelectedCell] = useAtom(selectedCellAtom, tableScope); + const focusInsideCell = selectedCell?.focusInside ?? false; + + return ( + + {headerGroups.map((headerGroup) => ( + + {(provided) => ( + + {headerGroup.headers.map((header) => { + const isSelectedCell = + (!selectedCell && header.index === 0) || + (selectedCell?.path === "_rowy_header" && + selectedCell?.columnKey === header.id); + + if (header.id === "_rowy_column_actions") + return ( + + ); + + if (!header.column.columnDef.meta) return null; + + return ( + + {(provided, snapshot) => ( + { + setSelectedCell({ + path: "_rowy_header", + columnKey: header.id, + focusInside: false, + }); + (e.target as HTMLDivElement).focus(); + }} + onDoubleClick={(e) => { + setSelectedCell({ + path: "_rowy_header", + columnKey: header.id, + focusInside: true, + }); + (e.target as HTMLDivElement).focus(); + }} + focusInsideCell={isSelectedCell && focusInsideCell} + > +
    + + theme.transitions.create(["opacity"]), + "[role='columnheader']:hover &, [role='columnheader']:focus-within &": + { + opacity: 0.5, + }, + ".column-drag-handle:hover &": { + opacity: 1, + }, + ".column-drag-handle:active &": { + opacity: 1, + color: "primary.main", + }, + ".column-drag-handle:focus &": { + opacity: 1, + color: "primary.main", + outline: "2px solid", + outlineColor: "primary.main", + }, + }} + style={{ width: 8 }} + preserveAspectRatio="xMidYMid slice" + /> +
    + + {header.column.getCanResize() && ( + + )} +
    + )} +
    + ); + })} + {provided.placeholder} +
    + )} +
    + ))} +
    + ); +}); + +export default TableHeaderGroup; diff --git a/src/components/Table/formatters/ChipList.tsx b/src/components/Table/formatters/ChipList.tsx index 5a6945d2..42f06264 100644 --- a/src/components/Table/formatters/ChipList.tsx +++ b/src/components/Table/formatters/ChipList.tsx @@ -1,14 +1,9 @@ -import { useAtom } from "jotai"; - import { Grid } from "@mui/material"; -import { tableScope, tableSchemaAtom } from "@src/atoms/tableScope"; -import { DEFAULT_ROW_HEIGHT } from "@src/components/Table"; - -export default function ChipList({ children }: React.PropsWithChildren<{}>) { - const [tableSchema] = useAtom(tableSchemaAtom, tableScope); - - const rowHeight = tableSchema.rowHeight ?? DEFAULT_ROW_HEIGHT; +export default function ChipList({ + children, + rowHeight, +}: React.PropsWithChildren<{ rowHeight: number }>) { const canWrap = rowHeight > 24 * 2 + 4; return ( diff --git a/src/components/Table/useKeyboardNavigation.tsx b/src/components/Table/useKeyboardNavigation.tsx index 57c8829c..3353d23f 100644 --- a/src/components/Table/useKeyboardNavigation.tsx +++ b/src/components/Table/useKeyboardNavigation.tsx @@ -1,3 +1,4 @@ +import { useCallback } from "react"; import { useSetAtom } from "jotai"; import { Column } from "@tanstack/react-table"; @@ -23,123 +24,129 @@ export function useKeyboardNavigation({ }: IUseKeyboardNavigationProps) { const setSelectedCell = useSetAtom(selectedCellAtom, tableScope); - const handleKeyDown = (e: React.KeyboardEvent) => { - // Block default browser behavior for arrow keys (scroll) and other keys - const LISTENED_KEYS = [ - "ArrowUp", - "ArrowDown", - "ArrowLeft", - "ArrowRight", - "Enter", - "Escape", - "Home", - "End", - "PageUp", - "PageDown", - ]; - if (LISTENED_KEYS.includes(e.key)) e.preventDefault(); + const handleKeyDown = useCallback( + (e: React.KeyboardEvent) => { + // Block default browser behavior for arrow keys (scroll) and other keys + const LISTENED_KEYS = [ + "ArrowUp", + "ArrowDown", + "ArrowLeft", + "ArrowRight", + "Enter", + "Escape", + "Home", + "End", + "PageUp", + "PageDown", + ]; + if (LISTENED_KEYS.includes(e.key)) e.preventDefault(); - // Esc: exit cell - if (e.key === "Escape") { - setSelectedCell((c) => ({ ...c!, focusInside: false })); - ( - gridRef.current?.querySelector("[aria-selected=true]") as HTMLDivElement - )?.focus(); - return; - } + // Esc: exit cell + if (e.key === "Escape") { + setSelectedCell((c) => ({ ...c!, focusInside: false })); + ( + gridRef.current?.querySelector( + "[aria-selected=true]" + ) as HTMLDivElement + )?.focus(); + return; + } - // If event target is not a cell, ignore - const target = e.target as HTMLDivElement; - if ( - target.getAttribute("role") !== "columnheader" && - target.getAttribute("role") !== "gridcell" - ) - return; + // If event target is not a cell, ignore + const target = e.target as HTMLDivElement; + if ( + target.getAttribute("role") !== "columnheader" && + target.getAttribute("role") !== "gridcell" + ) + return; - // If Tab, ignore so we can exit the table - if (e.key === "Tab") return; + // If Tab, ignore so we can exit the table + if (e.key === "Tab") return; - // Enter: enter cell - if (e.key === "Enter") { - setSelectedCell((c) => ({ ...c!, focusInside: true })); - (target.querySelector("[tabindex]") as HTMLElement)?.focus(); - return; - } + // Enter: enter cell + if (e.key === "Enter") { + setSelectedCell((c) => ({ ...c!, focusInside: true })); + (target.querySelector("[tabindex]") as HTMLElement)?.focus(); + return; + } - const colIndex = Number(target.getAttribute("aria-colindex")) - 1; - const rowIndex = - Number(target.parentElement!.getAttribute("aria-rowindex")) - 2; + const colIndex = Number(target.getAttribute("aria-colindex")) - 1; + const rowIndex = + Number(target.parentElement!.getAttribute("aria-rowindex")) - 2; - let newColIndex = colIndex; - let newRowIndex = rowIndex; + let newColIndex = colIndex; + let newRowIndex = rowIndex; - switch (e.key) { - case "ArrowUp": - if (e.ctrlKey || e.metaKey) newRowIndex = -1; - else if (rowIndex > -1) newRowIndex = rowIndex - 1; - break; + switch (e.key) { + case "ArrowUp": + if (e.ctrlKey || e.metaKey) newRowIndex = -1; + else if (rowIndex > -1) newRowIndex = rowIndex - 1; + break; - case "ArrowDown": - if (e.ctrlKey || e.metaKey) newRowIndex = tableRows.length - 1; - else if (rowIndex < tableRows.length - 1) newRowIndex = rowIndex + 1; - break; + case "ArrowDown": + if (e.ctrlKey || e.metaKey) newRowIndex = tableRows.length - 1; + else if (rowIndex < tableRows.length - 1) newRowIndex = rowIndex + 1; + break; - case "ArrowLeft": - if (e.ctrlKey || e.metaKey) newColIndex = 0; - else if (colIndex > 0) newColIndex = colIndex - 1; - break; + case "ArrowLeft": + if (e.ctrlKey || e.metaKey) newColIndex = 0; + else if (colIndex > 0) newColIndex = colIndex - 1; + break; - case "ArrowRight": - if (e.ctrlKey || e.metaKey) newColIndex = leafColumns.length - 1; - else if (colIndex < leafColumns.length - 1) newColIndex = colIndex + 1; - break; + case "ArrowRight": + if (e.ctrlKey || e.metaKey) newColIndex = leafColumns.length - 1; + else if (colIndex < leafColumns.length - 1) + newColIndex = colIndex + 1; + break; - case "PageUp": - newRowIndex = Math.max(0, rowIndex - COLLECTION_PAGE_SIZE); - break; + case "PageUp": + newRowIndex = Math.max(0, rowIndex - COLLECTION_PAGE_SIZE); + break; - case "PageDown": - newRowIndex = Math.min( - tableRows.length - 1, - rowIndex + COLLECTION_PAGE_SIZE - ); - break; + case "PageDown": + newRowIndex = Math.min( + tableRows.length - 1, + rowIndex + COLLECTION_PAGE_SIZE + ); + break; - case "Home": - newColIndex = 0; - if (e.ctrlKey || e.metaKey) newRowIndex = -1; - break; + case "Home": + newColIndex = 0; + if (e.ctrlKey || e.metaKey) newRowIndex = -1; + break; - case "End": - newColIndex = leafColumns.length - 1; - if (e.ctrlKey || e.metaKey) newRowIndex = tableRows.length - 1; - break; - } + case "End": + newColIndex = leafColumns.length - 1; + if (e.ctrlKey || e.metaKey) newRowIndex = tableRows.length - 1; + break; + } - // Get `path` and `columnKey` from `tableRows` and `leafColumns` respectively - const newSelectedCell = { - path: - newRowIndex > -1 - ? tableRows[newRowIndex]._rowy_ref.path - : "_rowy_header", - columnKey: leafColumns[newColIndex].id! || leafColumns[0].id!, - // When selected cell changes, exit current cell - focusInside: false, - }; + // Get `path` and `columnKey` from `tableRows` and `leafColumns` respectively + const newSelectedCell = { + path: + newRowIndex > -1 + ? tableRows[newRowIndex]._rowy_ref.path + : "_rowy_header", + columnKey: leafColumns[newColIndex].id! || leafColumns[0].id!, + // When selected cell changes, exit current cell + focusInside: false, + }; - // Store in selectedCellAtom - setSelectedCell(newSelectedCell); + // Store in selectedCellAtom + setSelectedCell(newSelectedCell); - // Find matching DOM element for the cell - const newCellEl = gridRef.current?.querySelector( - `[aria-rowindex="${newRowIndex + 2}"] [aria-colindex="${ - newColIndex + 1 - }"]` - ); + // Find matching DOM element for the cell + const newCellEl = gridRef.current?.querySelector( + `[aria-rowindex="${newRowIndex + 2}"] [aria-colindex="${ + newColIndex + 1 + }"]` + ); - // Focus the cell - if (newCellEl) setTimeout(() => (newCellEl as HTMLDivElement).focus()); - }; + // Focus the cell + if (newCellEl) setTimeout(() => (newCellEl as HTMLDivElement).focus()); + }, + [gridRef, leafColumns, setSelectedCell, tableRows] + ); return { handleKeyDown } as const; } diff --git a/src/components/Table/useSaveColumnSizing.tsx b/src/components/Table/useSaveColumnSizing.tsx index 2ea940ac..d957ac14 100644 --- a/src/components/Table/useSaveColumnSizing.tsx +++ b/src/components/Table/useSaveColumnSizing.tsx @@ -19,7 +19,7 @@ import { ColumnSizingState } from "@tanstack/react-table"; /** Debounces columnSizing and asks admins if they want to save for all users */ export function useSaveColumnSizing( columnSizing: ColumnSizingState, - canEditColumn: boolean + canEditColumns: boolean ) { const { enqueueSnackbar, closeSnackbar } = useSnackbar(); const updateColumn = useSetAtom(updateColumnAtom, tableScope); @@ -30,7 +30,7 @@ export function useSaveColumnSizing( }); // Offer to save when column sizing changes useEffect(() => { - if (!canEditColumn || isEmpty(debouncedColumnSizing)) return; + if (!canEditColumns || isEmpty(debouncedColumnSizing)) return; const snackbarId = enqueueSnackbar("Save column sizes for all users?", { action: ( @@ -45,7 +45,7 @@ export function useSaveColumnSizing( return () => closeSnackbar(snackbarId); }, [ debouncedColumnSizing, - canEditColumn, + canEditColumns, enqueueSnackbar, closeSnackbar, updateColumn, diff --git a/src/components/Table/withTableCell.tsx b/src/components/Table/withTableCell.tsx index 28a7d3bd..bd5b4b41 100644 --- a/src/components/Table/withTableCell.tsx +++ b/src/components/Table/withTableCell.tsx @@ -9,16 +9,17 @@ import { import useStateRef from "react-usestateref"; import { useSetAtom } from "jotai"; import { get, isEqual } from "lodash-es"; -import type { TableCellProps } from "@src/components/Table"; -import { - IDisplayCellProps, - IEditorCellProps, -} from "@src/components/fields/types"; +import type { CellContext } from "@tanstack/react-table"; import { Popover, PopoverProps } from "@mui/material"; import { tableScope, updateFieldAtom } from "@src/atoms/tableScope"; import { spreadSx } from "@src/utils/ui"; +import type { TableRow } from "@src/types/table"; +import type { + IDisplayCellProps, + IEditorCellProps, +} from "@src/components/fields/types"; export interface ICellOptions { /** If the rest of the row’s data is used, set this to true for memoization */ @@ -31,6 +32,13 @@ export interface ICellOptions { popoverProps?: Partial; } +export interface ITableCellProps extends CellContext { + focusInsideCell: boolean; + setFocusInsideCell: (focusInside: boolean) => void; + disabled: boolean; + rowHeight: number; +} + /** * HOC to render table cells. * Renders read-only DisplayCell while scrolling for scroll performance. @@ -57,7 +65,8 @@ export default function withTableCell( focusInsideCell, setFocusInsideCell, disabled, - }: TableCellProps) { + rowHeight, + }: ITableCellProps) { const value = getValue(); // Store ref to rendered DisplayCell to get positioning for PopoverCell @@ -93,12 +102,12 @@ export default function withTableCell( type: column.columnDef.meta!.type, row: row.original, column: column.columnDef.meta!, - docRef: row.original._rowy_ref, _rowy_ref: row.original._rowy_ref, disabled: column.columnDef.meta!.editable === false, tabIndex: focusInsideCell ? 0 : -1, showPopoverCell, setFocusInsideCell, + rowHeight, }; // Show display cell, unless if editorMode is inline diff --git a/src/components/fields/ConnectService/DisplayCell.tsx b/src/components/fields/ConnectService/DisplayCell.tsx index e4d08055..e7d267c0 100644 --- a/src/components/fields/ConnectService/DisplayCell.tsx +++ b/src/components/fields/ConnectService/DisplayCell.tsx @@ -12,12 +12,13 @@ export default function ConnectService({ disabled, column, tabIndex, + rowHeight, }: IDisplayCellProps) { const config = column.config ?? {}; const displayKey = config.titleKey ?? config.primaryKey; const rendered = ( - + {Array.isArray(value) && value.map((snapshot) => ( diff --git a/src/components/fields/ConnectTable/DisplayCell.tsx b/src/components/fields/ConnectTable/DisplayCell.tsx index 75c0da2b..efde15bc 100644 --- a/src/components/fields/ConnectTable/DisplayCell.tsx +++ b/src/components/fields/ConnectTable/DisplayCell.tsx @@ -11,11 +11,12 @@ export default function ConnectTable({ disabled, column, tabIndex, + rowHeight, }: IDisplayCellProps) { const config = column.config ?? {}; const rendered = ( - + {Array.isArray(value) ? ( value.map((item: any) => ( diff --git a/src/components/fields/Connector/DisplayCell.tsx b/src/components/fields/Connector/DisplayCell.tsx index 8c6316bc..cd707d80 100644 --- a/src/components/fields/Connector/DisplayCell.tsx +++ b/src/components/fields/Connector/DisplayCell.tsx @@ -13,9 +13,10 @@ export default function Connector({ disabled, column, tabIndex, + rowHeight, }: IDisplayCellProps) { const rendered = ( - + {Array.isArray(value) && value.map((item) => ( diff --git a/src/components/fields/File/DisplayCell.tsx b/src/components/fields/File/DisplayCell.tsx index 73303ddf..ea3a6382 100644 --- a/src/components/fields/File/DisplayCell.tsx +++ b/src/components/fields/File/DisplayCell.tsx @@ -6,9 +6,13 @@ import ChipList from "@src/components/Table/formatters/ChipList"; import { FileIcon } from "."; import { FileValue } from "@src/types/table"; -export default function File_({ value, tabIndex }: IDisplayCellProps) { +export default function File_({ + value, + tabIndex, + rowHeight, +}: IDisplayCellProps) { return ( - + {Array.isArray(value) && value.map((file: FileValue) => ( - + {Array.isArray(value) && value.map((file: FileValue) => ( - {docRef?.id} + {_rowy_ref?.id} ); } diff --git a/src/components/fields/MultiSelect/DisplayCell.tsx b/src/components/fields/MultiSelect/DisplayCell.tsx index eb5e8267..b439c4b9 100644 --- a/src/components/fields/MultiSelect/DisplayCell.tsx +++ b/src/components/fields/MultiSelect/DisplayCell.tsx @@ -13,6 +13,7 @@ export default function MultiSelect({ showPopoverCell, disabled, tabIndex, + rowHeight, }: IDisplayCellProps) { const rendered = typeof value === "string" && value !== "" ? ( @@ -24,7 +25,7 @@ export default function MultiSelect({ {value}
    ) : ( - + {sanitiseValue(value).map( (item) => typeof item === "string" && ( diff --git a/src/components/fields/SubTable/utils.ts b/src/components/fields/SubTable/utils.ts index e62e0a45..6f6c7746 100644 --- a/src/components/fields/SubTable/utils.ts +++ b/src/components/fields/SubTable/utils.ts @@ -6,7 +6,7 @@ import { ColumnConfig, TableRow, TableRowRef } from "@src/types/table"; export const useSubTableData = ( column: ColumnConfig, row: TableRow, - docRef: TableRowRef + _rowy_ref: TableRowRef ) => { const label = (column.config?.parentLabel ?? []).reduce((acc, curr) => { if (acc !== "") return `${acc} - ${row[curr]}`; @@ -24,7 +24,7 @@ export const useSubTableData = ( let subTablePath = [ rootTablePath, ROUTES.subTable, - encodeURIComponent(docRef.path), + encodeURIComponent(_rowy_ref.path), column.key, ].join("/"); diff --git a/src/components/fields/types.ts b/src/components/fields/types.ts index 8897e003..e4084365 100644 --- a/src/components/fields/types.ts +++ b/src/components/fields/types.ts @@ -1,16 +1,14 @@ import { FieldType } from "@src/constants/fields"; -import type { TableCellProps } from "@src/components/Table"; -import { FormatterProps, EditorProps } from "react-data-grid"; -import { Control, UseFormReturn } from "react-hook-form"; -import { PopoverProps } from "@mui/material"; -import { +import type { ITableCellProps } from "@src/components/Table/withTableCell"; +import type { PopoverProps } from "@mui/material"; +import type { ColumnConfig, TableRow, TableRowRef, TableFilter, } from "@src/types/table"; -import { SelectedCell } from "@src/atoms/tableScope"; -import { IContextMenuItem } from "@src/components/Table/ContextMenu/ContextMenuItem"; +import type { SelectedCell } from "@src/atoms/tableScope"; +import type { IContextMenuItem } from "@src/components/Table/ContextMenu/ContextMenuItem"; export { FieldType }; @@ -29,7 +27,7 @@ export interface IFieldConfig { selectedCell: SelectedCell, reset: () => void ) => IContextMenuItem[]; - TableCell: React.ComponentType; + TableCell: React.ComponentType; SideDrawerField: React.ComponentType; settings?: React.ComponentType; settingsValidator?: (config: Record) => Record; @@ -50,14 +48,13 @@ export interface IDisplayCellProps { name: string; row: TableRow; column: ColumnConfig; - /** @deprecated */ - docRef: TableRowRef; /** The row’s _rowy_ref object */ _rowy_ref: TableRowRef; disabled: boolean; tabIndex: number; showPopoverCell: (value: boolean) => void; setFocusInsideCell: (focusInside: boolean) => void; + rowHeight: number; } export interface IEditorCellProps extends IDisplayCellProps { /** Call when the user has input but changes have not been saved */ diff --git a/src/pages/Table/TablePage.tsx b/src/pages/Table/TablePage.tsx index 234be866..da455666 100644 --- a/src/pages/Table/TablePage.tsx +++ b/src/pages/Table/TablePage.tsx @@ -70,9 +70,9 @@ export default function TablePage({ // Set permissions here so we can pass them to the Table component, which // shouldn’t access projectScope at all, to separate concerns. - const canAddColumn = userRoles.includes("ADMIN"); - const canEditColumn = userRoles.includes("ADMIN"); - const canEditCell = + const canAddColumns = userRoles.includes("ADMIN"); + const canEditColumns = userRoles.includes("ADMIN"); + const canEditCells = userRoles.includes("ADMIN") || (!tableSettings.readOnly && intersection(userRoles, tableSettings.roles).length > 0); @@ -135,9 +135,9 @@ export default function TablePage({ }} >
    Date: Tue, 15 Nov 2022 17:36:48 +1100 Subject: [PATCH 262/309] move ChipList.tsx --- src/components/Table/{formatters => }/ChipList.tsx | 0 src/components/fields/ConnectService/DisplayCell.tsx | 2 +- src/components/fields/ConnectTable/DisplayCell.tsx | 2 +- src/components/fields/Connector/DisplayCell.tsx | 2 +- src/components/fields/File/DisplayCell.tsx | 2 +- src/components/fields/File/EditorCell.tsx | 2 +- src/components/fields/MultiSelect/DisplayCell.tsx | 2 +- 7 files changed, 6 insertions(+), 6 deletions(-) rename src/components/Table/{formatters => }/ChipList.tsx (100%) diff --git a/src/components/Table/formatters/ChipList.tsx b/src/components/Table/ChipList.tsx similarity index 100% rename from src/components/Table/formatters/ChipList.tsx rename to src/components/Table/ChipList.tsx diff --git a/src/components/fields/ConnectService/DisplayCell.tsx b/src/components/fields/ConnectService/DisplayCell.tsx index e7d267c0..2dd91bd8 100644 --- a/src/components/fields/ConnectService/DisplayCell.tsx +++ b/src/components/fields/ConnectService/DisplayCell.tsx @@ -3,7 +3,7 @@ import { IDisplayCellProps } from "@src/components/fields/types"; import { ButtonBase, Grid, Chip } from "@mui/material"; import { ChevronDown } from "@src/assets/icons"; -import ChipList from "@src/components/Table/formatters/ChipList"; +import ChipList from "@src/components/Table/ChipList"; import { get } from "lodash-es"; export default function ConnectService({ diff --git a/src/components/fields/ConnectTable/DisplayCell.tsx b/src/components/fields/ConnectTable/DisplayCell.tsx index efde15bc..90ca35af 100644 --- a/src/components/fields/ConnectTable/DisplayCell.tsx +++ b/src/components/fields/ConnectTable/DisplayCell.tsx @@ -3,7 +3,7 @@ import { IDisplayCellProps } from "@src/components/fields/types"; import { ButtonBase, Grid, Chip } from "@mui/material"; import { ChevronDown } from "@src/assets/icons"; -import ChipList from "@src/components/Table/formatters/ChipList"; +import ChipList from "@src/components/Table/ChipList"; export default function ConnectTable({ value, diff --git a/src/components/fields/Connector/DisplayCell.tsx b/src/components/fields/Connector/DisplayCell.tsx index cd707d80..6576204a 100644 --- a/src/components/fields/Connector/DisplayCell.tsx +++ b/src/components/fields/Connector/DisplayCell.tsx @@ -3,7 +3,7 @@ import { IDisplayCellProps } from "@src/components/fields/types"; import { ButtonBase, Grid, Chip } from "@mui/material"; import { ChevronDown } from "@src/assets/icons"; -import ChipList from "@src/components/Table/formatters/ChipList"; +import ChipList from "@src/components/Table/ChipList"; import { get } from "lodash-es"; import { getLabel } from "./utils"; diff --git a/src/components/fields/File/DisplayCell.tsx b/src/components/fields/File/DisplayCell.tsx index ea3a6382..2183f902 100644 --- a/src/components/fields/File/DisplayCell.tsx +++ b/src/components/fields/File/DisplayCell.tsx @@ -1,7 +1,7 @@ import { IDisplayCellProps } from "@src/components/fields/types"; import { Grid, Chip } from "@mui/material"; -import ChipList from "@src/components/Table/formatters/ChipList"; +import ChipList from "@src/components/Table/ChipList"; import { FileIcon } from "."; import { FileValue } from "@src/types/table"; diff --git a/src/components/fields/File/EditorCell.tsx b/src/components/fields/File/EditorCell.tsx index 2b8692d3..ed5ba74b 100644 --- a/src/components/fields/File/EditorCell.tsx +++ b/src/components/fields/File/EditorCell.tsx @@ -8,7 +8,7 @@ import { format } from "date-fns"; import { alpha, Stack, Grid, Tooltip, Chip, IconButton } from "@mui/material"; import { Upload as UploadIcon } from "@src/assets/icons"; -import ChipList from "@src/components/Table/formatters/ChipList"; +import ChipList from "@src/components/Table/ChipList"; import CircularProgressOptical from "@src/components/CircularProgressOptical"; import { projectScope, confirmDialogAtom } from "@src/atoms/projectScope"; diff --git a/src/components/fields/MultiSelect/DisplayCell.tsx b/src/components/fields/MultiSelect/DisplayCell.tsx index b439c4b9..7554330a 100644 --- a/src/components/fields/MultiSelect/DisplayCell.tsx +++ b/src/components/fields/MultiSelect/DisplayCell.tsx @@ -5,7 +5,7 @@ import WarningIcon from "@mui/icons-material/WarningAmber"; import { ChevronDown } from "@src/assets/icons"; import { sanitiseValue } from "./utils"; -import ChipList from "@src/components/Table/formatters/ChipList"; +import ChipList from "@src/components/Table/ChipList"; import FormattedChip from "@src/components/FormattedChip"; export default function MultiSelect({ From 1b454de85a0edd33928dc1801da5ad8843f0a840 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Tue, 15 Nov 2022 17:36:58 +1100 Subject: [PATCH 263/309] extract TableBody out of Table --- src/components/Table/Table.tsx | 130 +++---------------- src/components/Table/TableBody.tsx | 125 ++++++++++++++++++ src/components/Table/useSaveColumnSizing.tsx | 4 +- 3 files changed, 143 insertions(+), 116 deletions(-) create mode 100644 src/components/Table/TableBody.tsx diff --git a/src/components/Table/Table.tsx b/src/components/Table/Table.tsx index 74c14a40..c7395447 100644 --- a/src/components/Table/Table.tsx +++ b/src/components/Table/Table.tsx @@ -3,55 +3,35 @@ import { useAtom, useSetAtom } from "jotai"; import { useThrottledCallback } from "use-debounce"; import { createColumnHelper, - flexRender, getCoreRowModel, useReactTable, - CellContext, } from "@tanstack/react-table"; -import { - DragDropContext, - DropResult, - Droppable, - Draggable, -} from "react-beautiful-dnd"; +import { DropResult } from "react-beautiful-dnd"; import { get } from "lodash-es"; -import { ErrorBoundary } from "react-error-boundary"; -import { DragVertical } from "@src/assets/icons"; import StyledTable from "./Styled/StyledTable"; -import StyledRow from "./Styled/StyledRow"; import TableHeaderGroup from "./TableHeaderGroup"; -import ColumnHeader from "./ColumnHeader"; -import StyledResizer from "./Styled/StyledResizer"; -import FinalColumnHeader from "./FinalColumn/FinalColumnHeader"; +import TableBody from "./TableBody"; import FinalColumn from "./FinalColumn/FinalColumn"; -import OutOfOrderIndicator from "./OutOfOrderIndicator"; import ContextMenu from "./ContextMenu"; -import CellValidation from "./CellValidation"; import EmptyState from "@src/components/EmptyState"; -import { InlineErrorFallback } from "@src/components/ErrorFallback"; // import BulkActions from "./BulkActions"; import { tableScope, - tableSettingsAtom, tableSchemaAtom, tableColumnsOrderedAtom, tableRowsAtom, tableNextPageAtom, tablePageAtom, updateColumnAtom, - updateFieldAtom, - selectedCellAtom, - contextMenuTargetAtom, } from "@src/atoms/tableScope"; import { getFieldType, getFieldProp } from "@src/components/fields"; import { TableRow, ColumnConfig } from "@src/types/table"; import { useKeyboardNavigation } from "./useKeyboardNavigation"; import { useSaveColumnSizing } from "./useSaveColumnSizing"; -import useVirtualization from "./useVirtualization"; export const DEFAULT_ROW_HEIGHT = 41; export const DEFAULT_COL_WIDTH = 150; @@ -61,6 +41,7 @@ export const OUT_OF_ORDER_MARGIN = 8; export const DEBOUNCE_DELAY = 500; declare module "@tanstack/table-core" { + /** The `column.meta` property contains the column config from tableSchema */ interface ColumnMeta extends ColumnConfig {} } @@ -87,9 +68,6 @@ export default function Table({ const [tableRows] = useAtom(tableRowsAtom, tableScope); const [tableNextPage] = useAtom(tableNextPageAtom, tableScope); const [tablePage, setTablePage] = useAtom(tablePageAtom, tableScope); - const [selectedCell, setSelectedCell] = useAtom(selectedCellAtom, tableScope); - const setContextMenuTarget = useSetAtom(contextMenuTargetAtom, tableScope); - const focusInsideCell = selectedCell?.focusInside ?? false; const updateColumn = useSetAtom(updateColumnAtom, tableScope); @@ -170,14 +148,7 @@ export default function Table({ tableRows, leafColumns, }); - const { - virtualRows, - virtualCols, - paddingTop, - paddingBottom, - paddingLeft, - paddingRight, - } = useVirtualization(containerRef, leafColumns); + useSaveColumnSizing(columnSizing, canEditColumns); const handleDropColumn = useCallback( @@ -253,88 +224,17 @@ export default function Table({ /> -
    - {paddingTop > 0 && ( -
    - )} - - {virtualRows.map((virtualRow) => { - const row = rows[virtualRow.index]; - const outOfOrder = row.original._rowy_outOfOrder; - - return ( - - {paddingLeft > 0 && ( -
    - )} - - {outOfOrder && } - - {virtualCols.map((virtualCell) => { - const cellIndex = virtualCell.index; - const cell = row.getVisibleCells()[cellIndex]; - - const isSelectedCell = - selectedCell?.path === row.original._rowy_ref.path && - selectedCell?.columnKey === cell.column.id; - - const fieldTypeGroup = getFieldProp( - "group", - cell.column.columnDef.meta?.type - ); - const isReadOnlyCell = - fieldTypeGroup === "Auditing" || - fieldTypeGroup === "Metadata"; - - return ( - - ); - })} - - {paddingRight > 0 && ( -
    - )} - - ); - })} - - {paddingBottom > 0 && ( -
    - )} - - {tableRows.length === 0 && - (emptyState ?? )} -
    + {tableRows.length === 0 ? ( + emptyState ?? + ) : ( + + )}
    ; + leafColumns: Column[]; + rows: Row[]; + + canEditCells: boolean; + lastFrozen?: string; +} + +export default function TableBody({ + containerRef, + leafColumns, + rows, + canEditCells, + lastFrozen, +}: ITableBodyProps) { + const [tableSchema] = useAtom(tableSchemaAtom, tableScope); + const [selectedCell] = useAtom(selectedCellAtom, tableScope); + + const { + virtualRows, + virtualCols, + paddingTop, + paddingBottom, + paddingLeft, + paddingRight, + } = useVirtualization(containerRef, leafColumns); + + return ( +
    + {paddingTop > 0 && ( +
    + )} + + {virtualRows.map((virtualRow) => { + const row = rows[virtualRow.index]; + const outOfOrder = row.original._rowy_outOfOrder; + + return ( + + {paddingLeft > 0 && ( +
    + )} + + {outOfOrder && } + + {virtualCols.map((virtualCell) => { + const cellIndex = virtualCell.index; + const cell = row.getVisibleCells()[cellIndex]; + + const isSelectedCell = + selectedCell?.path === row.original._rowy_ref.path && + selectedCell?.columnKey === cell.column.id; + + const fieldTypeGroup = getFieldProp( + "group", + cell.column.columnDef.meta?.type + ); + const isReadOnlyCell = + fieldTypeGroup === "Auditing" || fieldTypeGroup === "Metadata"; + + return ( + + ); + })} + + {paddingRight > 0 && ( +
    + )} + + ); + })} + + {paddingBottom > 0 && ( +
    + )} +
    + ); +} diff --git a/src/components/Table/useSaveColumnSizing.tsx b/src/components/Table/useSaveColumnSizing.tsx index d957ac14..2bcf9c59 100644 --- a/src/components/Table/useSaveColumnSizing.tsx +++ b/src/components/Table/useSaveColumnSizing.tsx @@ -16,7 +16,9 @@ import { import { DEBOUNCE_DELAY } from "./Table"; import { ColumnSizingState } from "@tanstack/react-table"; -/** Debounces columnSizing and asks admins if they want to save for all users */ +/** + * Debounces columnSizing and asks admins if they want to save for all users + */ export function useSaveColumnSizing( columnSizing: ColumnSizingState, canEditColumns: boolean From ea8019e1e3284dc2148c55f4df171307ccb9c02f Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Tue, 15 Nov 2022 18:02:30 +1100 Subject: [PATCH 264/309] render inline editor cell after timeout on mount to improve scroll performance --- src/components/Table/withTableCell.tsx | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/components/Table/withTableCell.tsx b/src/components/Table/withTableCell.tsx index bd5b4b41..d959e408 100644 --- a/src/components/Table/withTableCell.tsx +++ b/src/components/Table/withTableCell.tsx @@ -67,8 +67,17 @@ export default function withTableCell( disabled, rowHeight, }: ITableCellProps) { + // Get the latest value on every re-render of this component const value = getValue(); + // Render inline editor cell after timeout on mount + // to improve scroll performance + const [inlineEditorReady, setInlineEditorReady] = useState(false); + useEffect(() => { + if (editorMode === "inline") + setTimeout(() => setInlineEditorReady(true)); + }, []); + // Store ref to rendered DisplayCell to get positioning for PopoverCell const displayCellRef = useRef(null); const parentRef = displayCellRef.current?.parentElement; @@ -110,6 +119,9 @@ export default function withTableCell( rowHeight, }; + // If the inline editor cell is not ready to be rendered, display nothing + if (editorMode === "inline" && !inlineEditorReady) return null; + // Show display cell, unless if editorMode is inline const displayCell = (
    Date: Tue, 15 Nov 2022 18:14:44 +1100 Subject: [PATCH 265/309] re-enable cell validation tooltips --- src/components/Table/CellValidation.tsx | 85 +++++++++---------- src/components/Table/Table.tsx | 4 +- .../{TableHeaderGroup.tsx => TableHeader.tsx} | 8 +- 3 files changed, 45 insertions(+), 52 deletions(-) rename src/components/Table/{TableHeaderGroup.tsx => TableHeader.tsx} (97%) diff --git a/src/components/Table/CellValidation.tsx b/src/components/Table/CellValidation.tsx index e19dde1b..6e566487 100644 --- a/src/components/Table/CellValidation.tsx +++ b/src/components/Table/CellValidation.tsx @@ -17,7 +17,6 @@ import { selectedCellAtom, contextMenuTargetAtom, } from "@src/atoms/tableScope"; -import { TABLE_PADDING } from "./Table"; import type { TableRow } from "@src/types/table"; const Dot = styled("div")(({ theme }) => ({ @@ -73,51 +72,29 @@ export const CellValidation = memo(function MemoizedCellValidation({ const isInvalid = validationRegex && !new RegExp(validationRegex).test(value); const isMissing = required && value === undefined; - const renderedCell = ( - - {flexRender(cell.column.columnDef.cell, { - ...cell.getContext(), - focusInsideCell: isSelectedCell && focusInsideCell, - setFocusInsideCell: (focusInside: boolean) => - setSelectedCell({ - path: row.original._rowy_ref.path, - columnKey: cell.column.id, - focusInside, - }), - disabled: - !canEditCells || cell.column.columnDef.meta?.editable === false, - rowHeight, - })} - - ); + let renderedValidationTooltip = null; - // if (isInvalid) - // return ( - // - // } - // title="Invalid data" - // message="This row will not be saved until all the required fields contain valid data" - // placement="right" - // render={({ openTooltip }) => } - // /> - // {children} - // - // ); - - // if (isMissing) - // return ( - // - // } - // title="Required field" - // message="This row will not be saved until all the required fields contain valid data" - // placement="right" - // render={({ openTooltip }) => } - // /> - // {children} - // - // ); + if (isInvalid) { + renderedValidationTooltip = ( + } + title="Invalid data" + message="This row will not be saved until all the required fields contain valid data" + placement="right" + render={({ openTooltip }) => } + /> + ); + } else if (isMissing) { + renderedValidationTooltip = ( + } + title="Required field" + message="This row will not be saved until all the required fields contain valid data" + placement="right" + render={({ openTooltip }) => } + /> + ); + } return ( - {renderedCell} + {renderedValidationTooltip} + + {flexRender(cell.column.columnDef.cell, { + ...cell.getContext(), + focusInsideCell: isSelectedCell && focusInsideCell, + setFocusInsideCell: (focusInside: boolean) => + setSelectedCell({ + path: row.original._rowy_ref.path, + columnKey: cell.column.id, + focusInside, + }), + disabled: + !canEditCells || cell.column.columnDef.meta?.editable === false, + rowHeight, + })} + ); }); diff --git a/src/components/Table/Table.tsx b/src/components/Table/Table.tsx index c7395447..886fdcff 100644 --- a/src/components/Table/Table.tsx +++ b/src/components/Table/Table.tsx @@ -10,7 +10,7 @@ import { DropResult } from "react-beautiful-dnd"; import { get } from "lodash-es"; import StyledTable from "./Styled/StyledTable"; -import TableHeaderGroup from "./TableHeaderGroup"; +import TableHeader from "./TableHeader"; import TableBody from "./TableBody"; import FinalColumn from "./FinalColumn/FinalColumn"; import ContextMenu from "./ContextMenu"; @@ -215,7 +215,7 @@ export default function Table({ padding: `0 ${TABLE_PADDING}px`, }} > - []; handleDropColumn: (result: DropResult) => void; canAddColumns: boolean; @@ -22,13 +22,13 @@ export interface ITableHeaderGroupProps { lastFrozen?: string; } -export const TableHeaderGroup = memo(function TableHeaderGroup({ +export const TableHeader = memo(function TableHeader({ headerGroups, handleDropColumn, canAddColumns, canEditColumns, lastFrozen, -}: ITableHeaderGroupProps) { +}: ITableHeaderProps) { const [selectedCell, setSelectedCell] = useAtom(selectedCellAtom, tableScope); const focusInsideCell = selectedCell?.focusInside ?? false; @@ -190,4 +190,4 @@ export const TableHeaderGroup = memo(function TableHeaderGroup({ ); }); -export default TableHeaderGroup; +export default TableHeader; From d81b4fc3c81f994259dee7674244b3a6bd899abf Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Tue, 15 Nov 2022 18:23:57 +1100 Subject: [PATCH 266/309] display RowsSkeleton when loading next page --- src/components/Table/TableBody.tsx | 5 +++++ src/components/Table/TableSkeleton.tsx | 15 +++------------ 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/src/components/Table/TableBody.tsx b/src/components/Table/TableBody.tsx index 76a1d597..ae119011 100644 --- a/src/components/Table/TableBody.tsx +++ b/src/components/Table/TableBody.tsx @@ -4,11 +4,13 @@ import type { Column, Row } from "@tanstack/react-table"; import StyledRow from "./Styled/StyledRow"; import OutOfOrderIndicator from "./OutOfOrderIndicator"; import CellValidation from "./CellValidation"; +import { RowsSkeleton } from "./TableSkeleton"; import { tableScope, tableSchemaAtom, selectedCellAtom, + tableNextPageAtom, } from "@src/atoms/tableScope"; import { getFieldProp } from "@src/components/fields"; @@ -38,6 +40,7 @@ export default function TableBody({ }: ITableBodyProps) { const [tableSchema] = useAtom(tableSchemaAtom, tableScope); const [selectedCell] = useAtom(selectedCellAtom, tableScope); + const [tableNextPage] = useAtom(tableNextPageAtom, tableScope); const { virtualRows, @@ -117,6 +120,8 @@ export default function TableBody({ ); })} + {tableNextPage.loading && } + {paddingBottom > 0 && (
    )} diff --git a/src/components/Table/TableSkeleton.tsx b/src/components/Table/TableSkeleton.tsx index e264fde7..065770fc 100644 --- a/src/components/Table/TableSkeleton.tsx +++ b/src/components/Table/TableSkeleton.tsx @@ -13,7 +13,7 @@ import { tableSchemaAtom, tableColumnsOrderedAtom, } from "@src/atoms/tableScope"; -import { DEFAULT_ROW_HEIGHT, DEFAULT_COL_WIDTH } from "./Table"; +import { DEFAULT_ROW_HEIGHT, DEFAULT_COL_WIDTH, TABLE_PADDING } from "./Table"; import { COLLECTION_PAGE_SIZE } from "@src/config/db"; import { formatSubTableName } from "@src/utils/table"; @@ -129,17 +129,7 @@ export function RowsSkeleton() { div:first-of-type": { - borderBottomLeftRadius: (theme) => theme.shape.borderRadius, - }, - "&:last-of-type > div:last-of-type": { - borderBottomRightRadius: (theme) => theme.shape.borderRadius, - }, - }} + style={{ padding: `0 ${TABLE_PADDING}px`, marginTop: -1 }} > {columns.map((col, j) => ( Date: Tue, 15 Nov 2022 18:39:08 +1100 Subject: [PATCH 267/309] =?UTF-8?q?=F0=9F=8E=89=20remove=20react-data-grid?= =?UTF-8?q?=20dependency?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 1 - src/components/SideDrawer/SideDrawer.tsx | 46 ++---------------------- src/pages/Table/TablePage.tsx | 8 ++--- yarn.lock | 7 ---- 4 files changed, 4 insertions(+), 58 deletions(-) diff --git a/package.json b/package.json index baf6cda0..0ea80114 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,6 @@ "react": "^18.0.0", "react-beautiful-dnd": "^13.1.0", "react-color-palette": "^6.2.0", - "react-data-grid": "7.0.0-beta.5", "react-detect-offline": "^2.4.5", "react-div-100vh": "^0.7.0", "react-dnd": "^16.0.1", diff --git a/src/components/SideDrawer/SideDrawer.tsx b/src/components/SideDrawer/SideDrawer.tsx index 04f896bd..ef676bd1 100644 --- a/src/components/SideDrawer/SideDrawer.tsx +++ b/src/components/SideDrawer/SideDrawer.tsx @@ -1,10 +1,8 @@ import { useEffect } from "react"; -import useMemoValue from "use-memo-value"; import clsx from "clsx"; import { useAtom } from "jotai"; -import { find, findIndex, isEqual } from "lodash-es"; +import { find, findIndex } from "lodash-es"; import { ErrorBoundary } from "react-error-boundary"; -import { DataGridHandle } from "react-data-grid"; import { TransitionGroup } from "react-transition-group"; import { Fab, Fade } from "@mui/material"; @@ -16,34 +14,20 @@ import ErrorFallback from "@src/components/ErrorFallback"; import StyledDrawer from "./StyledDrawer"; import SideDrawerFields from "./SideDrawerFields"; -import { projectScope, userSettingsAtom } from "@src/atoms/projectScope"; import { tableScope, - tableIdAtom, - tableColumnsOrderedAtom, tableRowsAtom, sideDrawerOpenAtom, selectedCellAtom, } from "@src/atoms/tableScope"; import { analytics, logEvent } from "@src/analytics"; -import { formatSubTableName } from "@src/utils/table"; export const DRAWER_WIDTH = 512; export const DRAWER_COLLAPSED_WIDTH = 36; -export default function SideDrawer({ - dataGridRef, -}: { - dataGridRef?: React.MutableRefObject; -}) { - const [userSettings] = useAtom(userSettingsAtom, projectScope); - const [tableId] = useAtom(tableIdAtom, tableScope); - const [tableColumnsOrdered] = useAtom(tableColumnsOrderedAtom, tableScope); +export default function SideDrawer() { const [tableRows] = useAtom(tableRowsAtom, tableScope); - const userDocHiddenFields = - userSettings.tables?.[formatSubTableName(tableId)]?.hiddenFields ?? []; - const [cell, setCell] = useAtom(selectedCellAtom, tableScope); const [open, setOpen] = useAtom(sideDrawerOpenAtom, tableScope); const selectedRow = find(tableRows, ["_rowy_ref.path", cell?.path]); @@ -51,26 +35,6 @@ export default function SideDrawer({ "_rowy_ref.path", cell?.path, ]); - // Memo a list of visible column keys for useEffect dependencies - const visibleColumnKeys = useMemoValue( - tableColumnsOrdered - .filter((col) => !userDocHiddenFields.includes(col.key)) - .map((col) => col.key), - isEqual - ); - - // When side drawer is opened, select the cell in the table - // in case we’ve scrolled and selected cell was reset - useEffect(() => { - if (open) { - const columnIndex = visibleColumnKeys.indexOf(cell?.columnKey || ""); - if (columnIndex === -1 || selectedCellRowIndex === -1) return; - dataGridRef?.current?.selectCell( - { rowIdx: selectedCellRowIndex, idx: columnIndex }, - false - ); - } - }, [open, visibleColumnKeys, selectedCellRowIndex, cell, dataGridRef]); const handleNavigate = (direction: "up" | "down") => () => { if (!tableRows || !cell) return; @@ -84,12 +48,6 @@ export default function SideDrawer({ path: newPath, focusInside: false, })); - - const columnIndex = visibleColumnKeys.indexOf(cell!.columnKey || ""); - dataGridRef?.current?.selectCell( - { rowIdx: rowIndex, idx: columnIndex }, - false - ); }; // const [urlDocState, dispatchUrlDoc] = useDoc({}); diff --git a/src/pages/Table/TablePage.tsx b/src/pages/Table/TablePage.tsx index da455666..5959376e 100644 --- a/src/pages/Table/TablePage.tsx +++ b/src/pages/Table/TablePage.tsx @@ -1,6 +1,5 @@ -import { useRef, Suspense, lazy } from "react"; +import { Suspense, lazy } from "react"; import { useAtom } from "jotai"; -import { DataGridHandle } from "react-data-grid"; import { ErrorBoundary } from "react-error-boundary"; import { isEmpty, intersection } from "lodash-es"; @@ -81,9 +80,6 @@ export default function TablePage({ useBeforeUnload(columnModalAtom, tableScope); useBeforeUnload(tableModalAtom, tableScope); - // A ref to the data grid. Contains data grid functions - const dataGridRef = useRef(null); - if (!(tableSchema as any)._rowy_ref) return ( <> @@ -161,7 +157,7 @@ export default function TablePage({ - {!disableSideDrawer && } + {!disableSideDrawer && } diff --git a/yarn.lock b/yarn.lock index aa25b7ed..8f82ba40 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9970,13 +9970,6 @@ react-color-palette@^6.2.0: resolved "https://registry.yarnpkg.com/react-color-palette/-/react-color-palette-6.2.0.tgz#aa3be88f6953d57502c00f4433692129ffbad3e7" integrity sha512-9rIboaRJNoeF8aCI2f3J8wgMyhl74SnGmZLDjor3bKf0iDBhP2EBv0/jGmm0hrj6OackGCqtWl5ZvM89XUc3sg== -react-data-grid@7.0.0-beta.5: - version "7.0.0-beta.5" - resolved "https://registry.yarnpkg.com/react-data-grid/-/react-data-grid-7.0.0-beta.5.tgz#bc39ce45b7a7f42ebfb66840e0ec1c8619d60f10" - integrity sha512-rtN4wnePrQ80UN6lYF/zUQqVVJMT3HW5bTLx9nR5XOKQiG72cGzX2d2+b+e82vUh23zTFBicEnuWSlN9Fa/83Q== - dependencies: - clsx "^1.1.1" - react-detect-offline@^2.4.5: version "2.4.5" resolved "https://registry.yarnpkg.com/react-detect-offline/-/react-detect-offline-2.4.5.tgz#3c242516c37b6789cf89102881031f87e70b80e6" From 2d2cd424f349b948adc5447d38d27008b998a916 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Wed, 16 Nov 2022 16:14:40 +1100 Subject: [PATCH 268/309] fix table styles --- src/components/Table/Styled/StyledCell.tsx | 5 +++-- src/components/Table/TableHeader.tsx | 4 ++-- src/components/fields/MultiSelect/index.tsx | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/components/Table/Styled/StyledCell.tsx b/src/components/Table/Styled/StyledCell.tsx index c11fee62..5423e8e3 100644 --- a/src/components/Table/Styled/StyledCell.tsx +++ b/src/components/Table/Styled/StyledCell.tsx @@ -33,8 +33,9 @@ export const StyledCell = styled("div")(({ theme }) => ({ borderTop: `1px solid ${theme.palette.divider}`, }, - "&[aria-invalid='true']": { - boxShadow: `inset 0 0 0 2px ${theme.palette.error.main}`, + "&[aria-invalid='true'] .cell-contents": { + outline: `2px dotted ${theme.palette.error.main}`, + outlineOffset: -2, }, })); StyledCell.displayName = "StyledCell"; diff --git a/src/components/Table/TableHeader.tsx b/src/components/Table/TableHeader.tsx index 555b6d82..b90bf178 100644 --- a/src/components/Table/TableHeader.tsx +++ b/src/components/Table/TableHeader.tsx @@ -12,7 +12,7 @@ import FinalColumnHeader from "./FinalColumn/FinalColumnHeader"; import { DragVertical } from "@src/assets/icons"; import { tableScope, selectedCellAtom } from "@src/atoms/tableScope"; -import { DEFAULT_ROW_HEIGHT, TABLE_PADDING } from "@src/components/Table"; +import { DEFAULT_ROW_HEIGHT } from "@src/components/Table"; export interface ITableHeaderProps { headerGroups: HeaderGroup[]; @@ -93,7 +93,7 @@ export const TableHeader = memo(function TableHeader({ style={{ width: header.getSize(), left: header.column.getIsPinned() - ? header.column.getStart() - TABLE_PADDING + ? header.column.getStart() : undefined, ...provided.draggableProps.style, zIndex: header.column.getIsPinned() ? 11 : 10, diff --git a/src/components/fields/MultiSelect/index.tsx b/src/components/fields/MultiSelect/index.tsx index cdda43c0..f6400d1b 100644 --- a/src/components/fields/MultiSelect/index.tsx +++ b/src/components/fields/MultiSelect/index.tsx @@ -34,7 +34,7 @@ export const config: IFieldConfig = { "Multiple values from predefined options. Options are searchable and users can optionally input custom values.", TableCell: withTableCell(DisplayCell, EditorCell, "popover", { disablePadding: true, - transparentPopover: true, + transparentPopover: false, }), SideDrawerField, settings: Settings, From c7cca89622ebb5dba9faa515d98ea65585acb890 Mon Sep 17 00:00:00 2001 From: Miriam Shams-Rainey Date: Wed, 16 Nov 2022 01:09:59 -0500 Subject: [PATCH 269/309] Changed default Action to script from cloud func (#913) * Changed default Action to script from cloud func * Apply suggestions from code review Co-authored-by: Sidney Alcantara * Updated to use falsy undefined value Co-authored-by: Sidney Alcantara --- src/components/fields/Action/Settings.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/fields/Action/Settings.tsx b/src/components/fields/Action/Settings.tsx index 74e64aaa..9c2562a1 100644 --- a/src/components/fields/Action/Settings.tsx +++ b/src/components/fields/Action/Settings.tsx @@ -303,7 +303,7 @@ const Settings = ({ config, onChange, fieldName }: ISettingsProps) => { aria-label="Action will run" name="isActionScript" value={ - config.isActionScript ? "actionScript" : "cloudFunction" + config.isActionScript !== false ? "actionScript" : "cloudFunction" } onChange={(e) => onChange("isActionScript")( @@ -359,7 +359,7 @@ const Settings = ({ config, onChange, fieldName }: ISettingsProps) => { - {!config.isActionScript ? ( + {config.isActionScript === false ? ( { ), }, - config.isActionScript && + config.isActionScript !== false && get(config, "undo.enabled") && { id: "undo", title: "Undo action", From 47ebcfd6b38cb052cc218b186094d76add1c4046 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Nov 2022 06:21:10 +0000 Subject: [PATCH 270/309] Bump loader-utils from 2.0.0 to 2.0.4 Bumps [loader-utils](https://github.com/webpack/loader-utils) from 2.0.0 to 2.0.4. - [Release notes](https://github.com/webpack/loader-utils/releases) - [Changelog](https://github.com/webpack/loader-utils/blob/v2.0.4/CHANGELOG.md) - [Commits](https://github.com/webpack/loader-utils/compare/v2.0.0...v2.0.4) --- updated-dependencies: - dependency-name: loader-utils dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/yarn.lock b/yarn.lock index da7f9913..fd46ce16 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8697,7 +8697,7 @@ json2csv@^5.0.7: jsonparse "^1.3.1" lodash.get "^4.4.2" -json5@2.x, json5@^2.2.0, json5@^2.2.1: +json5@2.x, json5@^2.1.2, json5@^2.2.0, json5@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== @@ -8709,13 +8709,6 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.1.2: - 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" - jsonc-parser@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.0.0.tgz#abdd785701c7e7eaca8a9ec8cf070ca51a745a22" @@ -8958,9 +8951,9 @@ loader-runner@^4.2.0: integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== loader-utils@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" - integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== + version "2.0.4" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== dependencies: big.js "^5.2.2" emojis-list "^3.0.0" From b2747ddddf0ca3791bd2d4b90200d15cc6dbb6d7 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Wed, 16 Nov 2022 18:12:30 +1100 Subject: [PATCH 271/309] fix editorMode: inline cells waiting to render even when disabled --- src/components/Table/withTableCell.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/Table/withTableCell.tsx b/src/components/Table/withTableCell.tsx index d959e408..d91eda98 100644 --- a/src/components/Table/withTableCell.tsx +++ b/src/components/Table/withTableCell.tsx @@ -119,9 +119,6 @@ export default function withTableCell( rowHeight, }; - // If the inline editor cell is not ready to be rendered, display nothing - if (editorMode === "inline" && !inlineEditorReady) return null; - // Show display cell, unless if editorMode is inline const displayCell = (
    From a3d22474c9f6adbca39785c75ddc9224b691f2d8 Mon Sep 17 00:00:00 2001 From: Han Tuerker Date: Wed, 16 Nov 2022 11:07:05 +0300 Subject: [PATCH 272/309] extract localFiles and dropzoneState into useFileUploader --- .../fields/File/SideDrawerField.tsx | 27 +++--------- src/components/fields/File/TableCell.tsx | 22 ++-------- src/components/fields/File/useFileUpload.ts | 32 +++++++++++++-- .../fields/Image/SideDrawerField.tsx | 41 +++++++++---------- src/components/fields/Image/TableCell.tsx | 39 +++++++----------- 5 files changed, 70 insertions(+), 91 deletions(-) diff --git a/src/components/fields/File/SideDrawerField.tsx b/src/components/fields/File/SideDrawerField.tsx index af3f6168..00287c23 100644 --- a/src/components/fields/File/SideDrawerField.tsx +++ b/src/components/fields/File/SideDrawerField.tsx @@ -1,10 +1,6 @@ -import { useState } from "react"; -import { ISideDrawerFieldProps } from "@src/components/fields/types"; import { useSetAtom } from "jotai"; import { format } from "date-fns"; -import { useDropzone } from "react-dropzone"; - import { alpha, ButtonBase, @@ -14,15 +10,15 @@ import { Chip, } from "@mui/material"; import { Upload as UploadIcon } from "@src/assets/icons"; -import { FileIcon } from "."; +import { ISideDrawerFieldProps } from "@src/components/fields/types"; import CircularProgressOptical from "@src/components/CircularProgressOptical"; import { DATE_TIME_FORMAT } from "@src/constants/dates"; - import { fieldSx, getFieldId } from "@src/components/SideDrawer/utils"; import { projectScope, confirmDialogAtom } from "@src/atoms/projectScope"; import { FileValue } from "@src/types/table"; import useFileUpload from "./useFileUpload"; +import { FileIcon } from "."; export default function File_({ column, @@ -31,23 +27,10 @@ export default function File_({ disabled, }: ISideDrawerFieldProps) { const confirm = useSetAtom(confirmDialogAtom, projectScope); - const { loading, progress, handleUpload, handleDelete } = useFileUpload( - _rowy_ref, - column.key - ); + const { loading, progress, handleDelete, localFiles, dropzoneState } = + useFileUpload(_rowy_ref, column.key, { multiple: true }); - const [localFiles, setLocalFiles] = useState([]); - - const { getRootProps, getInputProps, isDragActive } = useDropzone({ - onDrop: async (acceptedFiles: File[]) => { - if (acceptedFiles.length > 0) { - setLocalFiles(acceptedFiles); - await handleUpload(acceptedFiles); - setLocalFiles([]); - } - }, - multiple: true, - }); + const { isDragActive, getRootProps, getInputProps } = dropzoneState; return ( <> diff --git a/src/components/fields/File/TableCell.tsx b/src/components/fields/File/TableCell.tsx index eee9a330..d35a8c6f 100644 --- a/src/components/fields/File/TableCell.tsx +++ b/src/components/fields/File/TableCell.tsx @@ -1,8 +1,6 @@ -import { useState } from "react"; import { IHeavyCellProps } from "@src/components/fields/types"; import { useSetAtom } from "jotai"; -import { useDropzone } from "react-dropzone"; import { format } from "date-fns"; import { alpha, Stack, Grid, Tooltip, Chip, IconButton } from "@mui/material"; @@ -23,26 +21,12 @@ export default function File_({ docRef, }: IHeavyCellProps) { const confirm = useSetAtom(confirmDialogAtom, projectScope); - const [localFiles, setLocalFiles] = useState([]); - const { loading, progress, handleUpload, handleDelete } = useFileUpload( - docRef, - column.key - ); - - const { getRootProps, getInputProps, isDragActive } = useDropzone({ - onDrop: async (acceptedFiles: File[]) => { - if (acceptedFiles.length > 0) { - setLocalFiles(acceptedFiles); - await handleUpload(acceptedFiles); - setLocalFiles([]); - } - }, - multiple: true, - }); + const { loading, progress, handleDelete, localFiles, dropzoneState } = + useFileUpload(docRef, column.key, { multiple: true }); + const { isDragActive, getRootProps, getInputProps } = dropzoneState; const dropzoneProps = getRootProps(); - return ( ([]); + + const dropzoneState = useDropzone({ + onDrop: async (acceptedFiles: File[]) => { + if (acceptedFiles.length > 0) { + setLocalFiles(acceptedFiles); + await handleUpload(acceptedFiles); + setLocalFiles([]); + } + }, + ...dropzoneOptions, + }); + const uploadingFiles = Object.keys(uploaderState); const progress = @@ -57,5 +75,13 @@ export default function useFileUpload(docRef: any, fieldName: string) { [deleteUpload, docRef, fieldName, updateField] ); - return { progress, loading, uploaderState, handleUpload, handleDelete }; + return { + localFiles, + progress, + loading, + uploaderState, + handleUpload, + handleDelete, + dropzoneState, + }; } diff --git a/src/components/fields/Image/SideDrawerField.tsx b/src/components/fields/Image/SideDrawerField.tsx index 531ba7e7..70c58b88 100644 --- a/src/components/fields/Image/SideDrawerField.tsx +++ b/src/components/fields/Image/SideDrawerField.tsx @@ -1,10 +1,8 @@ import { ISideDrawerFieldProps } from "@src/components/fields/types"; -import { useState } from "react"; +import { useMemo } from "react"; import { useSetAtom } from "jotai"; import { assignIn } from "lodash-es"; -import { useDropzone } from "react-dropzone"; - import { alpha, ButtonBase, @@ -89,29 +87,28 @@ export default function Image_({ }: ISideDrawerFieldProps) { const confirm = useSetAtom(confirmDialogAtom, projectScope); - const { loading, progress, handleUpload, handleDelete, uploaderState } = - useFileUpload(_rowy_ref, column.key); - - const [localImages, setLocalImages] = useState< - (File & { localURL: string })[] - >([]); - - const { getRootProps, getInputProps, isDragActive } = useDropzone({ - onDrop: async (acceptedFiles: File[]) => { - if (acceptedFiles.length > 0) { - setLocalImages( - acceptedFiles.map((file) => - assignIn(file, { localURL: URL.createObjectURL(file) }) - ) - ); - await handleUpload(acceptedFiles); - setLocalImages([]); - } - }, + const { + loading, + progress, + handleDelete, + uploaderState, + localFiles, + dropzoneState, + } = useFileUpload(_rowy_ref, column.key, { multiple: true, accept: IMAGE_MIME_TYPES, }); + const localImages = useMemo( + () => + localFiles.map((file) => + assignIn(file, { localURL: URL.createObjectURL(file) }) + ), + [localFiles] + ); + + const { getRootProps, getInputProps, isDragActive } = dropzoneState; + return ( <> {!disabled && ( diff --git a/src/components/fields/Image/TableCell.tsx b/src/components/fields/Image/TableCell.tsx index f8f31861..a903f955 100644 --- a/src/components/fields/Image/TableCell.tsx +++ b/src/components/fields/Image/TableCell.tsx @@ -1,8 +1,7 @@ -import { useState } from "react"; +import { useMemo } from "react"; import { IHeavyCellProps } from "@src/components/fields/types"; import { useAtom, useSetAtom } from "jotai"; import { assignIn } from "lodash-es"; -import { useDropzone } from "react-dropzone"; import { alpha, @@ -89,31 +88,21 @@ export default function Image_({ const confirm = useSetAtom(confirmDialogAtom, projectScope); const [tableSchema] = useAtom(tableSchemaAtom, tableScope); - const { loading, progress, handleUpload, handleDelete } = useFileUpload( - docRef, - column.key + const { loading, progress, handleDelete, localFiles, dropzoneState } = + useFileUpload(docRef, column.key, { + multiple: true, + accept: IMAGE_MIME_TYPES, + }); + + const localImages = useMemo( + () => + localFiles.map((file) => + assignIn(file, { localURL: URL.createObjectURL(file) }) + ), + [localFiles] ); - const [localImages, setLocalImages] = useState< - (File & { localURL: string })[] - >([]); - - const { getRootProps, getInputProps, isDragActive } = useDropzone({ - onDrop: async (acceptedFiles: File[]) => { - if (acceptedFiles.length > 0) { - setLocalImages( - acceptedFiles.map((file) => - assignIn(file, { localURL: URL.createObjectURL(file) }) - ) - ); - await handleUpload(acceptedFiles); - setLocalImages([]); - } - }, - multiple: true, - accept: IMAGE_MIME_TYPES, - }); - + const { getRootProps, getInputProps, isDragActive } = dropzoneState; const dropzoneProps = getRootProps(); const rowHeight = tableSchema.rowHeight ?? DEFAULT_ROW_HEIGHT; From 969809df8ba552ad366ebde86955ec2f8aaa27ee Mon Sep 17 00:00:00 2001 From: Han Tuerker Date: Wed, 16 Nov 2022 11:15:10 +0300 Subject: [PATCH 273/309] append generated id to file name --- src/hooks/useFirebaseStorageUploader.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/hooks/useFirebaseStorageUploader.tsx b/src/hooks/useFirebaseStorageUploader.tsx index 03e0503f..bad0ff46 100644 --- a/src/hooks/useFirebaseStorageUploader.tsx +++ b/src/hooks/useFirebaseStorageUploader.tsx @@ -16,6 +16,7 @@ import { projectScope } from "@src/atoms/projectScope"; import { firebaseStorageAtom } from "@src/sources/ProjectSourceFirebase"; import { WIKI_LINKS } from "@src/constants/externalLinks"; import { FileValue } from "@src/types/table"; +import { generateId } from "@src/utils/table"; export type UploadState = { progress: number; @@ -85,7 +86,7 @@ const useFirebaseStorageUploader = () => { const storageRef = ref( firebaseStorage, - `${docRef.path}/${fieldName}/${file.name}` + `${docRef.path}/${fieldName}/${generateId()}-${file.name}` ); const uploadTask = uploadBytesResumable(storageRef, file, { cacheControl: "public, max-age=31536000", From 5e4ae43155f7fc24189c57f644596b2b961d2d50 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Nov 2022 08:39:40 +0000 Subject: [PATCH 274/309] Bump loader-utils from 2.0.0 to 2.0.4 Bumps [loader-utils](https://github.com/webpack/loader-utils) from 2.0.0 to 2.0.4. - [Release notes](https://github.com/webpack/loader-utils/releases) - [Changelog](https://github.com/webpack/loader-utils/blob/v2.0.4/CHANGELOG.md) - [Commits](https://github.com/webpack/loader-utils/compare/v2.0.0...v2.0.4) --- updated-dependencies: - dependency-name: loader-utils dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/yarn.lock b/yarn.lock index da7f9913..fd46ce16 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8697,7 +8697,7 @@ json2csv@^5.0.7: jsonparse "^1.3.1" lodash.get "^4.4.2" -json5@2.x, json5@^2.2.0, json5@^2.2.1: +json5@2.x, json5@^2.1.2, json5@^2.2.0, json5@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== @@ -8709,13 +8709,6 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.1.2: - 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" - jsonc-parser@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.0.0.tgz#abdd785701c7e7eaca8a9ec8cf070ca51a745a22" @@ -8958,9 +8951,9 @@ loader-runner@^4.2.0: integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== loader-utils@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" - integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== + version "2.0.4" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== dependencies: big.js "^5.2.2" emojis-list "^3.0.0" From 5e8cff26e59752e39c7447101cd206e16e2d7018 Mon Sep 17 00:00:00 2001 From: Miriam Shams-Rainey Date: Wed, 16 Nov 2022 22:03:55 -0500 Subject: [PATCH 275/309] Enhancement/show total rows in db (#918) * Added customization for action name/label * Update Firebase version * Created doc count atom and used in table status UI * Improved syntax * Fixed linting error * Used query w/o limit for doc count * Add guard for optional SetServerDocCountAtom Co-authored-by: Sidney Alcantara --- package.json | 2 +- src/atoms/tableScope/table.ts | 3 + .../TableToolbar/LoadedRowsStatus.tsx | 8 +- src/hooks/useFirestoreCollectionWithAtom.ts | 18 +- .../TableSourceFirestore.tsx | 2 + yarn.lock | 529 +++++++++--------- 6 files changed, 291 insertions(+), 271 deletions(-) diff --git a/package.json b/package.json index fb029fc7..4783c433 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "date-fns": "^2.28.0", "dompurify": "^2.3.6", "file-saver": "^2.0.5", - "firebase": "^9.6.11", + "firebase": "^9.12.1", "firebaseui": "^6.0.1", "jotai": "^1.8.4", "json-stable-stringify-without-jsonify": "^1.0.1", diff --git a/src/atoms/tableScope/table.ts b/src/atoms/tableScope/table.ts index 0018202f..6681af87 100644 --- a/src/atoms/tableScope/table.ts +++ b/src/atoms/tableScope/table.ts @@ -238,3 +238,6 @@ export type AuditChangeFunction = ( * @param data - Optional additional data to log */ export const auditChangeAtom = atom(undefined); + +/** Store total number of rows in firestore collection */ +export const serverDocCountAtom = atom(0) \ No newline at end of file diff --git a/src/components/TableToolbar/LoadedRowsStatus.tsx b/src/components/TableToolbar/LoadedRowsStatus.tsx index f27531d9..c57ab80d 100644 --- a/src/components/TableToolbar/LoadedRowsStatus.tsx +++ b/src/components/TableToolbar/LoadedRowsStatus.tsx @@ -10,6 +10,7 @@ import { tableScope, tableRowsAtom, tableNextPageAtom, + serverDocCountAtom } from "@src/atoms/tableScope"; import { spreadSx } from "@src/utils/ui"; @@ -56,18 +57,21 @@ const loadingIcon = ( ); function LoadedRowsStatus() { - const [tableRows] = useAtom(tableRowsAtom, tableScope); const [tableNextPage] = useAtom(tableNextPageAtom, tableScope); + const [serverDocCount] = useAtom(serverDocCountAtom, tableScope) + const [tableRows] = useAtom(tableRowsAtom, tableScope) + if (tableNextPage.loading) return {loadingIcon}Loading more…; + return ( Loaded {!tableNextPage.available && "all "} - {tableRows.length} row{tableRows.length !== 1 && "s"} + {tableRows.length} {tableNextPage.available && `of ${serverDocCount}`} row{serverDocCount !== 1 && "s"} ); diff --git a/src/hooks/useFirestoreCollectionWithAtom.ts b/src/hooks/useFirestoreCollectionWithAtom.ts index f8dada5f..4896a609 100644 --- a/src/hooks/useFirestoreCollectionWithAtom.ts +++ b/src/hooks/useFirestoreCollectionWithAtom.ts @@ -22,6 +22,7 @@ import { QueryConstraint, WhereFilterOp, documentId, + getCountFromServer } from "firebase/firestore"; import { useErrorHandler } from "react-error-boundary"; @@ -62,6 +63,8 @@ interface IUseFirestoreCollectionWithAtomOptions { deleteDocAtom?: PrimitiveAtom; /** Update this atom when we’re loading the next page, and if there is a next page available. Uses same scope as `dataScope`. */ nextPageAtom?: PrimitiveAtom; + /** Set this atom's value to the number of docs in the collection on each new snapshot */ + serverDocCountAtom?: PrimitiveAtom | undefined; } /** @@ -93,6 +96,7 @@ export function useFirestoreCollectionWithAtom( updateDocAtom, deleteDocAtom, nextPageAtom, + serverDocCountAtom } = options || {}; const [firebaseDb] = useAtom(firebaseDbAtom, projectScope); @@ -116,9 +120,10 @@ export function useFirestoreCollectionWithAtom( void >(nextPageAtom || (dataAtom as any), dataScope); + const setServerDocCountAtom = useSetAtom(serverDocCountAtom || (dataAtom as any), dataScope) + // Store if we’re at the last page to prevent a new query from being created const [isLastPage, setIsLastPage] = useState(false); - // Create the query and memoize using Firestore’s queryEqual const memoizedQuery = useMemoValue( getQuery( @@ -190,6 +195,12 @@ export function useFirestoreCollectionWithAtom( available: docs.length >= memoizedQuery.limit, })); } + // on each new snapshot, use the query to get and set the document count from the server + if (serverDocCountAtom) { + getCountFromServer(memoizedQuery.unlimitedQuery).then((value) => { + setServerDocCountAtom(value.data().count) + }) + } } catch (error) { if (onError) onError(error as FirestoreError); else handleError(error); @@ -221,6 +232,7 @@ export function useFirestoreCollectionWithAtom( handleError, nextPageAtom, setNextPageAtom, + setServerDocCountAtom ]); // Create variable for validity of query to pass to useEffect dependencies @@ -313,14 +325,13 @@ const getQuery = ( } if (!collectionRef) return null; - const limit = (page + 1) * pageSize; const firestoreFilters = tableFiltersToFirestoreFilters(filters || []); return { query: query( collectionRef, - queryLimit((page + 1) * pageSize), + queryLimit(limit), ...firestoreFilters, ...(sorts?.map((order) => orderBy(order.key, order.direction)) || []) ), @@ -328,6 +339,7 @@ const getQuery = ( limit, firestoreFilters, sorts, + unlimitedQuery: query(collectionRef, ...firestoreFilters) }; } catch (e) { if (onError) onError(e as FirestoreError); diff --git a/src/sources/TableSourceFirestore/TableSourceFirestore.tsx b/src/sources/TableSourceFirestore/TableSourceFirestore.tsx index f028ab26..87949768 100644 --- a/src/sources/TableSourceFirestore/TableSourceFirestore.tsx +++ b/src/sources/TableSourceFirestore/TableSourceFirestore.tsx @@ -14,6 +14,7 @@ import { _updateRowDbAtom, _deleteRowDbAtom, tableNextPageAtom, + serverDocCountAtom } from "@src/atoms/tableScope"; import useFirestoreDocWithAtom from "@src/hooks/useFirestoreDocWithAtom"; import useFirestoreCollectionWithAtom from "@src/hooks/useFirestoreCollectionWithAtom"; @@ -77,6 +78,7 @@ export const TableSourceFirestore = memo(function TableSourceFirestore() { updateDocAtom: _updateRowDbAtom, deleteDocAtom: _deleteRowDbAtom, nextPageAtom: tableNextPageAtom, + serverDocCountAtom: serverDocCountAtom } ); diff --git a/yarn.lock b/yarn.lock index 0769f919..91bc54a8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1403,15 +1403,15 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@firebase/analytics-compat@0.1.9": - version "0.1.9" - resolved "https://registry.yarnpkg.com/@firebase/analytics-compat/-/analytics-compat-0.1.9.tgz#d4a724f78a7333abe8ee8b00f4a4d8b8c392b46c" - integrity sha512-HYKMAZvfU589WVvK5XKY9Pl+axXFISabouAFw2VHpJm/TO1mAXAy0+eIjqQ3j8z3L1OEfCeOV/oY9eh8rpJZ5w== +"@firebase/analytics-compat@0.1.16": + version "0.1.16" + resolved "https://registry.yarnpkg.com/@firebase/analytics-compat/-/analytics-compat-0.1.16.tgz#7a2c57c37a39efe52c476fa8878dd5a6b93b2155" + integrity sha512-mDAhE33WiyCrqSQZvzyZtQCCdf4ipn5tsEpTbIUruk7MbThQ1EbNAbPBiEk9NDLD3sUyLABZGFctvym/hc8H+w== dependencies: - "@firebase/analytics" "0.7.8" + "@firebase/analytics" "0.8.3" "@firebase/analytics-types" "0.7.0" - "@firebase/component" "0.5.13" - "@firebase/util" "1.5.2" + "@firebase/component" "0.5.20" + "@firebase/util" "1.7.2" tslib "^2.1.0" "@firebase/analytics-types@0.7.0": @@ -1419,27 +1419,27 @@ resolved "https://registry.yarnpkg.com/@firebase/analytics-types/-/analytics-types-0.7.0.tgz#91960e7c87ce8bf18cf8dd9e55ccbf5dc3989b5d" integrity sha512-DNE2Waiwy5+zZnCfintkDtBfaW6MjIG883474v6Z0K1XZIvl76cLND4iv0YUb48leyF+PJK1KO2XrgHb/KpmhQ== -"@firebase/analytics@0.7.8": - version "0.7.8" - resolved "https://registry.yarnpkg.com/@firebase/analytics/-/analytics-0.7.8.tgz#8f163437adb9b6b3f866e3744410aae931b97453" - integrity sha512-W38Zy/jf64LKpPi+mGNNETIjz4eq/YXBE0Uu2bzstqUwlhvFn1WlRBK4vzgtZMRaGW04CQp9FXYv6ZTRo/Xbyw== +"@firebase/analytics@0.8.3": + version "0.8.3" + resolved "https://registry.yarnpkg.com/@firebase/analytics/-/analytics-0.8.3.tgz#d8c6d71c3aa09d2ae5041db5b3778e4f66a832cb" + integrity sha512-viGhc57JW9zHp/0JKpLBUthdpOrEjbPETQFz8oNfaNma+cHA6FtIrtg4Sla52DgqatbATcE9aIDBiPCGrCtNjw== dependencies: - "@firebase/component" "0.5.13" - "@firebase/installations" "0.5.8" - "@firebase/logger" "0.3.2" - "@firebase/util" "1.5.2" + "@firebase/component" "0.5.20" + "@firebase/installations" "0.5.15" + "@firebase/logger" "0.3.3" + "@firebase/util" "1.7.2" tslib "^2.1.0" -"@firebase/app-check-compat@0.2.6": - version "0.2.6" - resolved "https://registry.yarnpkg.com/@firebase/app-check-compat/-/app-check-compat-0.2.6.tgz#34c4bd20d385909789a83c40815925176cc15fb1" - integrity sha512-DBzLHg/uuoNhDdwPEj8zQcqPaZSBFn8I0hATKyoX6SiAQKCi+4ugqeyQ6qGCyDpfNOyxL4PPxPMisXRhPzV2jw== +"@firebase/app-check-compat@0.2.15": + version "0.2.15" + resolved "https://registry.yarnpkg.com/@firebase/app-check-compat/-/app-check-compat-0.2.15.tgz#d61255996b23f3e91ffd8eab7391877a3a993dca" + integrity sha512-EgD1WEFwwq7aP7DxPSYuUpMt8eAhClA57976D3BaHDbH/IXEuw0DfaeT0LtBb+xJD7J8uxy+YKpudCC8gzUu8g== dependencies: - "@firebase/app-check" "0.5.6" + "@firebase/app-check" "0.5.15" "@firebase/app-check-types" "0.4.0" - "@firebase/component" "0.5.13" - "@firebase/logger" "0.3.2" - "@firebase/util" "1.5.2" + "@firebase/component" "0.5.20" + "@firebase/logger" "0.3.3" + "@firebase/util" "1.7.2" tslib "^2.1.0" "@firebase/app-check-interop-types@0.1.0": @@ -1452,53 +1452,54 @@ resolved "https://registry.yarnpkg.com/@firebase/app-check-types/-/app-check-types-0.4.0.tgz#7007a9d1d720db20bcf466fe6785c96feaa0a82d" integrity sha512-SsWafqMABIOu7zLgWbmwvHGOeQQVQlwm42kwwubsmfLmL4Sf5uGpBfDhQ0CAkpi7bkJ/NwNFKafNDL9prRNP0Q== -"@firebase/app-check@0.5.6": - version "0.5.6" - resolved "https://registry.yarnpkg.com/@firebase/app-check/-/app-check-0.5.6.tgz#e3b6d4d352875078ee32757d0adb125f3cc13a26" - integrity sha512-wdR/DCSdSDM0ka4nvMlGSiaknFxJO/gBuwn7G0iHO2vwj/2oSqjyG+QdJnoiIe1P1vOdqGNLxb1j10LPkR3TQQ== +"@firebase/app-check@0.5.15": + version "0.5.15" + resolved "https://registry.yarnpkg.com/@firebase/app-check/-/app-check-0.5.15.tgz#a57830b00864f792eddf45d581d256b1513643ab" + integrity sha512-ifQalGXkXMwGR3F8Glmo1XtDg0UjkwCmI/ff05mxnKGMfs5ZDyw8DikQfna//a/KdYuOBqxlBwS2BhHiobqUUg== dependencies: - "@firebase/component" "0.5.13" - "@firebase/logger" "0.3.2" - "@firebase/util" "1.5.2" + "@firebase/component" "0.5.20" + "@firebase/logger" "0.3.3" + "@firebase/util" "1.7.2" tslib "^2.1.0" -"@firebase/app-compat@0.1.22": - version "0.1.22" - resolved "https://registry.yarnpkg.com/@firebase/app-compat/-/app-compat-0.1.22.tgz#7190c50f3fd5d794e508bfcebe42a9b159f73890" - integrity sha512-InzQWdIKXsioZb6Ll/uynvopFbq9k3Qpi3gEUq+f8q0yr8/KQVuH2lIDmN70z11LRKXlsziU49qRwtV9tcEYhA== +"@firebase/app-compat@0.1.37": + version "0.1.37" + resolved "https://registry.yarnpkg.com/@firebase/app-compat/-/app-compat-0.1.37.tgz#338fead261344529ad7fcedd5ca014d463d6679b" + integrity sha512-doTKYGlVc8ZiQNOl66rpkU/YItRyOxCgMp4YWThXkPM4T/pTi4a9IMCe8K88gVNeYWd8sKW4vSnxjcOG5hQXEA== dependencies: - "@firebase/app" "0.7.21" - "@firebase/component" "0.5.13" - "@firebase/logger" "0.3.2" - "@firebase/util" "1.5.2" + "@firebase/app" "0.8.2" + "@firebase/component" "0.5.20" + "@firebase/logger" "0.3.3" + "@firebase/util" "1.7.2" tslib "^2.1.0" -"@firebase/app-types@0.7.0": - version "0.7.0" - resolved "https://registry.yarnpkg.com/@firebase/app-types/-/app-types-0.7.0.tgz#c9e16d1b8bed1a991840b8d2a725fb58d0b5899f" - integrity sha512-6fbHQwDv2jp/v6bXhBw2eSRbNBpxHcd1NBF864UksSMVIqIyri9qpJB1Mn6sGZE+bnDsSQBC5j2TbMxYsJQkQg== +"@firebase/app-types@0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@firebase/app-types/-/app-types-0.8.0.tgz#50a539a0a20bef8c50494d0615592fe2a384851f" + integrity sha512-Lec3VVquUwXPn2UReGSsfTxuMBVRmzGIwA/CJnF0LQuPgv9kOmXk9mVqsDMfHxHtqjai0n6wWHR2TqjdVV/bYA== -"@firebase/app@0.7.21": - version "0.7.21" - resolved "https://registry.yarnpkg.com/@firebase/app/-/app-0.7.21.tgz#c31077bd4c61f130eb00b6546835ed9cf8da69ab" - integrity sha512-b1COyw4HwajJ4zQCtL7w+d4GCQDmEaVO957eLLlBwz4QuDlx3eQIirpQhzkkPH17BJFZ6x0qyYEt6Wbhakn0kg== +"@firebase/app@0.8.2": + version "0.8.2" + resolved "https://registry.yarnpkg.com/@firebase/app/-/app-0.8.2.tgz#705fcbdd82d4720038a2eb9af7277c73ebd9e9d5" + integrity sha512-ByNDCe8h9O/szO3XVTrS484MtqBOKriVaNCQC7Y7KgZSaiA0OOWmIY5vwi63mBTYetqMNN5VGiG/6ZSmGIZyoQ== dependencies: - "@firebase/component" "0.5.13" - "@firebase/logger" "0.3.2" - "@firebase/util" "1.5.2" + "@firebase/component" "0.5.20" + "@firebase/logger" "0.3.3" + "@firebase/util" "1.7.2" + idb "7.0.1" tslib "^2.1.0" -"@firebase/auth-compat@0.2.12": - version "0.2.12" - resolved "https://registry.yarnpkg.com/@firebase/auth-compat/-/auth-compat-0.2.12.tgz#a13bd42c4ee36ddbf764ae24958cf4c64ddba5b5" - integrity sha512-LKeKylktRj03xgW5ilSOW1c4AsMig15ogf5hDKa820t6Bp6MNabj8yq2TV0/Q4SP4Ox/yrTISJGVvk+TJuBecQ== +"@firebase/auth-compat@0.2.23": + version "0.2.23" + resolved "https://registry.yarnpkg.com/@firebase/auth-compat/-/auth-compat-0.2.23.tgz#72a2d5163f4688bd85b0db58ded13db68f34b0a2" + integrity sha512-r9YEXaL7YKoFOWHRvVoQ6d5klP+hkSsAtt21UIvP3/BxDDU+yLXN5vVvFHr38apuUeMGN34M7zkY6SihnLutIQ== dependencies: - "@firebase/auth" "0.19.12" + "@firebase/auth" "0.20.10" "@firebase/auth-types" "0.11.0" - "@firebase/component" "0.5.13" - "@firebase/util" "1.5.2" + "@firebase/component" "0.5.20" + "@firebase/util" "1.7.2" node-fetch "2.6.7" - selenium-webdriver "^4.0.0-beta.2" + selenium-webdriver "4.1.2" tslib "^2.1.0" "@firebase/auth-interop-types@0.1.6": @@ -1511,67 +1512,67 @@ resolved "https://registry.yarnpkg.com/@firebase/auth-types/-/auth-types-0.11.0.tgz#b9c73c60ca07945b3bbd7a097633e5f78fa9e886" integrity sha512-q7Bt6cx+ySj9elQHTsKulwk3+qDezhzRBFC9zlQ1BjgMueUOnGMcvqmU0zuKlQ4RhLSH7MNAdBV2znVaoN3Vxw== -"@firebase/auth@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@firebase/auth/-/auth-0.19.12.tgz#df201b456bfb2c846b22513fc5798476e0730adc" - integrity sha512-39/eJBmq5Ne+HoCJuQXlhaOH2e8qySxYUa5Z25mhcam8nmAMrBh7Ph1yZjUeSfLsSJiSXANMHK5dnVE+1TROXw== +"@firebase/auth@0.20.10": + version "0.20.10" + resolved "https://registry.yarnpkg.com/@firebase/auth/-/auth-0.20.10.tgz#4dbd6cb24906e11f78bf65100a71b45b028b607b" + integrity sha512-uAZypmVv/4nijaPVtR/ipjKBmSDPLQ7sNScLHs2DVhdvCklgUUF5+zsEdPlMfKDIfmVQHFwHbUgeKyXDYSRMwQ== dependencies: - "@firebase/component" "0.5.13" - "@firebase/logger" "0.3.2" - "@firebase/util" "1.5.2" + "@firebase/component" "0.5.20" + "@firebase/logger" "0.3.3" + "@firebase/util" "1.7.2" node-fetch "2.6.7" - selenium-webdriver "4.0.0-rc-1" + selenium-webdriver "4.1.2" tslib "^2.1.0" -"@firebase/component@0.5.13": - version "0.5.13" - resolved "https://registry.yarnpkg.com/@firebase/component/-/component-0.5.13.tgz#65a382e83bddd109380c9aa1f280791b1b4567c4" - integrity sha512-hxhJtpD8Ppf/VU2Rlos6KFCEV77TGIGD5bJlkPK1+B/WUe0mC6dTjW7KhZtXTc+qRBp9nFHWcsIORnT8liHP9w== +"@firebase/component@0.5.20": + version "0.5.20" + resolved "https://registry.yarnpkg.com/@firebase/component/-/component-0.5.20.tgz#52165b5f7d25c4ac9c679e4e48d6f7fa7bf722cf" + integrity sha512-wP51tQBlPFprfAWxWjzC/56hG4APhl43jFsgwuqCl3bhVbiKcr278QbrbGNmIXDeGKo4sGZLAnH9whl2apeCmA== dependencies: - "@firebase/util" "1.5.2" + "@firebase/util" "1.7.2" tslib "^2.1.0" -"@firebase/database-compat@0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@firebase/database-compat/-/database-compat-0.1.8.tgz#ab627f2bdbe94367f515d5bded880c86886bbd28" - integrity sha512-dhXr5CSieBuKNdU96HgeewMQCT9EgOIkfF1GNy+iRrdl7BWLxmlKuvLfK319rmIytSs/vnCzcD9uqyxTeU/A3A== +"@firebase/database-compat@0.2.9": + version "0.2.9" + resolved "https://registry.yarnpkg.com/@firebase/database-compat/-/database-compat-0.2.9.tgz#a1b4ecf94e11eadfc21aa48121b3ba7ea18a57ae" + integrity sha512-zzyFM3+jW/qYtHojiQirHXGXYyElbqVngEEn/i2gXoSzcK0Y2AL5oHAqGYXLaaW0+t4Zwnssh3HnQJM8C1D0fw== dependencies: - "@firebase/component" "0.5.13" - "@firebase/database" "0.12.8" - "@firebase/database-types" "0.9.7" - "@firebase/logger" "0.3.2" - "@firebase/util" "1.5.2" + "@firebase/component" "0.5.20" + "@firebase/database" "0.13.9" + "@firebase/database-types" "0.9.16" + "@firebase/logger" "0.3.3" + "@firebase/util" "1.7.2" tslib "^2.1.0" -"@firebase/database-types@0.9.7": - version "0.9.7" - resolved "https://registry.yarnpkg.com/@firebase/database-types/-/database-types-0.9.7.tgz#c5ee0ea9bb2703a13c1c47fe880fc577d5ce7f33" - integrity sha512-EFhgL89Fz6DY3kkB8TzdHvdu8XaqqvzcF2DLVOXEnQ3Ms7L755p5EO42LfxXoJqb9jKFvgLpFmKicyJG25WFWw== +"@firebase/database-types@0.9.16": + version "0.9.16" + resolved "https://registry.yarnpkg.com/@firebase/database-types/-/database-types-0.9.16.tgz#4f7f612c00346641a641ac689005857190e91ebc" + integrity sha512-dK/uFgHisrVijSoHf9RLJ7NwvlOul2rO/z9ufOSbGd8/TqFVASXz+19mynhDIoSEnyQtJC/NTyBzSPfjz0w61w== dependencies: - "@firebase/app-types" "0.7.0" - "@firebase/util" "1.5.2" + "@firebase/app-types" "0.8.0" + "@firebase/util" "1.7.2" -"@firebase/database@0.12.8": - version "0.12.8" - resolved "https://registry.yarnpkg.com/@firebase/database/-/database-0.12.8.tgz#11a1b6752ba0614892af15c71958e00ce16f5824" - integrity sha512-JBQVfFLzfhxlQbl4OU6ov9fdsddkytBQdtSSR49cz48homj38ccltAhK6seum+BI7f28cV2LFHF9672lcN+qxA== +"@firebase/database@0.13.9": + version "0.13.9" + resolved "https://registry.yarnpkg.com/@firebase/database/-/database-0.13.9.tgz#8cf8c77fb837ed1a6fa85565ac8c28864b0957fb" + integrity sha512-raQEBgQQybaEoMloJL8wWHQywGQ9mF2VbitvHydsbSNn+KL/xRDjXeQZPuuSbRjkYV6mR8jvQB7gpnzQQNE8Qg== dependencies: "@firebase/auth-interop-types" "0.1.6" - "@firebase/component" "0.5.13" - "@firebase/logger" "0.3.2" - "@firebase/util" "1.5.2" + "@firebase/component" "0.5.20" + "@firebase/logger" "0.3.3" + "@firebase/util" "1.7.2" faye-websocket "0.11.4" tslib "^2.1.0" -"@firebase/firestore-compat@0.1.17": - version "0.1.17" - resolved "https://registry.yarnpkg.com/@firebase/firestore-compat/-/firestore-compat-0.1.17.tgz#8851d52717ac468b242fd9752706c2be12d15c30" - integrity sha512-hTLgq2WXUE6bb3/IqYlwY0Q6FdbZB2JwDoZHexIQmK69XuuK3j+JbE/NixV3mBo232tNSU+QeamfbAd6A1Agfw== +"@firebase/firestore-compat@0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@firebase/firestore-compat/-/firestore-compat-0.2.1.tgz#15fac47547e2c2fe2c4d3ddd8af63591009436af" + integrity sha512-XiiTpmUfyZ6QU3Dw9BCT4T+KPvqzada1GsUNX49HmriWHpIn3jTAjsagkigRAnmNDlxS3ki6Yzg9Cs60tpD0tw== dependencies: - "@firebase/component" "0.5.13" - "@firebase/firestore" "3.4.8" + "@firebase/component" "0.5.20" + "@firebase/firestore" "3.7.1" "@firebase/firestore-types" "2.5.0" - "@firebase/util" "1.5.2" + "@firebase/util" "1.7.2" tslib "^2.1.0" "@firebase/firestore-types@2.5.0": @@ -1579,29 +1580,29 @@ resolved "https://registry.yarnpkg.com/@firebase/firestore-types/-/firestore-types-2.5.0.tgz#16fca40b6980fdb000de86042d7a96635f2bcdd7" integrity sha512-I6c2m1zUhZ5SH0cWPmINabDyH5w0PPFHk2UHsjBpKdZllzJZ2TwTkXbDtpHUZNmnc/zAa0WNMNMvcvbb/xJLKA== -"@firebase/firestore@3.4.8": - version "3.4.8" - resolved "https://registry.yarnpkg.com/@firebase/firestore/-/firestore-3.4.8.tgz#ca7395c81929c79e30a28ff5d19a567713e27f77" - integrity sha512-qjrI22TrqSGsOVBkYpRcpY48eSFj+hvleWEaFn3bDxy+QNUiZS08cicSlBOxdosKi5LRMQVGyHKcqHExup02+A== +"@firebase/firestore@3.7.1": + version "3.7.1" + resolved "https://registry.yarnpkg.com/@firebase/firestore/-/firestore-3.7.1.tgz#68d6c35ba16702942577afe4607a5acf6d62d912" + integrity sha512-sDZ79cUf4cwCyRzN74zODgaeUvyt0lGA8YwaasVVqojgznwMG/bIz+/Tny4ZEnLZFrlniCqt2tStWsiC6s3u7g== dependencies: - "@firebase/component" "0.5.13" - "@firebase/logger" "0.3.2" - "@firebase/util" "1.5.2" - "@firebase/webchannel-wrapper" "0.6.1" + "@firebase/component" "0.5.20" + "@firebase/logger" "0.3.3" + "@firebase/util" "1.7.2" + "@firebase/webchannel-wrapper" "0.8.0" "@grpc/grpc-js" "^1.3.2" - "@grpc/proto-loader" "^0.6.0" + "@grpc/proto-loader" "^0.6.13" node-fetch "2.6.7" tslib "^2.1.0" -"@firebase/functions-compat@0.1.12": - version "0.1.12" - resolved "https://registry.yarnpkg.com/@firebase/functions-compat/-/functions-compat-0.1.12.tgz#b1e53630bf56816355f775216f34e24a2371ca8b" - integrity sha512-pKianAWF9vv3u9DazbRExYQFjEu/b9gxTWVCPjq+FiLK39xULT01dZz4Zrr2KzFnb54wHHbRmU1BAWNAkQTmmQ== +"@firebase/functions-compat@0.2.7": + version "0.2.7" + resolved "https://registry.yarnpkg.com/@firebase/functions-compat/-/functions-compat-0.2.7.tgz#fc43b1ab79f2c63209ea69db87b121f18b63a973" + integrity sha512-bcUst8ZDJHeVy2Wox4KEM5EizsrrqLzbwFIwJD7KkuSYP8XrlV2gaqJnCvIXXc0Nc4JRGvbXcvFFMXDjhsEp4Q== dependencies: - "@firebase/component" "0.5.13" - "@firebase/functions" "0.7.11" + "@firebase/component" "0.5.20" + "@firebase/functions" "0.8.7" "@firebase/functions-types" "0.5.0" - "@firebase/util" "1.5.2" + "@firebase/util" "1.7.2" tslib "^2.1.0" "@firebase/functions-types@0.5.0": @@ -1609,43 +1610,60 @@ resolved "https://registry.yarnpkg.com/@firebase/functions-types/-/functions-types-0.5.0.tgz#b50ba95ccce9e96f7cda453228ffe1684645625b" integrity sha512-qza0M5EwX+Ocrl1cYI14zoipUX4gI/Shwqv0C1nB864INAD42Dgv4v94BCyxGHBg2kzlWy8PNafdP7zPO8aJQA== -"@firebase/functions@0.7.11": - version "0.7.11" - resolved "https://registry.yarnpkg.com/@firebase/functions/-/functions-0.7.11.tgz#ab65a20503d7a4bfeb4bc571c976cc37dc781184" - integrity sha512-o9pmN1TWHDEpmB6IYbqeIIG6Wllcfw6jSNm8UZYnOYM8oDay1FW6OeN/fA0GlGmwF4cPdxA3oKXbLn3ObYFxXQ== +"@firebase/functions@0.8.7": + version "0.8.7" + resolved "https://registry.yarnpkg.com/@firebase/functions/-/functions-0.8.7.tgz#b5571c50b849a31f8825a08f535419b2c2f3e9d8" + integrity sha512-JHSKdAOzlFJ9NdKoOaq4x6S1q6B3GmYZDg13KIDsE6BC0E9o/eWxOWOjSFJRCP/lpfFwa0rYBRayfUvZxW3BLw== dependencies: "@firebase/app-check-interop-types" "0.1.0" "@firebase/auth-interop-types" "0.1.6" - "@firebase/component" "0.5.13" + "@firebase/component" "0.5.20" "@firebase/messaging-interop-types" "0.1.0" - "@firebase/util" "1.5.2" + "@firebase/util" "1.7.2" node-fetch "2.6.7" tslib "^2.1.0" -"@firebase/installations@0.5.8": - version "0.5.8" - resolved "https://registry.yarnpkg.com/@firebase/installations/-/installations-0.5.8.tgz#7a12c4367bc932303d4651f46196262e38aaae58" - integrity sha512-u/lAOVhgYFg1e38rNrVzFrWxdKzTOIromx574Hi2AccFA230hSlXFY7pRaCpgs11VDzmpt4lhhOrQOX7886cKw== +"@firebase/installations-compat@0.1.15": + version "0.1.15" + resolved "https://registry.yarnpkg.com/@firebase/installations-compat/-/installations-compat-0.1.15.tgz#95b13a2fa55ba1aa05094b8b54ccd09fc046cc11" + integrity sha512-m0atyudsVj6ekmM+djhhzzInMC3Y233YJky9vXUVt5MHQY0mHhqDds9+UIrCa6cpbl+ntI2fOuoYV7y01s3sfw== dependencies: - "@firebase/component" "0.5.13" - "@firebase/util" "1.5.2" + "@firebase/component" "0.5.20" + "@firebase/installations" "0.5.15" + "@firebase/installations-types" "0.4.0" + "@firebase/util" "1.7.2" tslib "^2.1.0" -"@firebase/logger@0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@firebase/logger/-/logger-0.3.2.tgz#5046ffa8295c577846d54b6ca95645a03809800e" - integrity sha512-lzLrcJp9QBWpo40OcOM9B8QEtBw2Fk1zOZQdvv+rWS6gKmhQBCEMc4SMABQfWdjsylBcDfniD1Q+fUX1dcBTXA== +"@firebase/installations-types@0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@firebase/installations-types/-/installations-types-0.4.0.tgz#256782ff9adfb390ac658c25bc32f89635ddce7c" + integrity sha512-nXxWKQDvBGctuvsizbUEJKfxXU9WAaDhon+j0jpjIfOJkvkj3YHqlLB/HeYjpUn85Pb22BjplpTnDn4Gm9pc3A== + +"@firebase/installations@0.5.15": + version "0.5.15" + resolved "https://registry.yarnpkg.com/@firebase/installations/-/installations-0.5.15.tgz#c037152c1b6a21e8ed54ecf7439ec50820962aa4" + integrity sha512-RVm2nc2d+bEDFzFzQDTTU1Z13fjAD0v88yDLjtRZuT2R7JwvAegQ4F7CupBvnnf7nftkd3kBwdOi8MhMthb3jQ== + dependencies: + "@firebase/component" "0.5.20" + "@firebase/util" "1.7.2" + idb "7.0.1" + tslib "^2.1.0" + +"@firebase/logger@0.3.3": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@firebase/logger/-/logger-0.3.3.tgz#0f724b1e0b166d17ac285aac5c8ec14d136beed4" + integrity sha512-POTJl07jOKTOevLXrTvJD/VZ0M6PnJXflbAh5J9VGkmtXPXNG6MdZ9fmRgqYhXKTaDId6AQenQ262uwgpdtO0Q== dependencies: tslib "^2.1.0" -"@firebase/messaging-compat@0.1.12": - version "0.1.12" - resolved "https://registry.yarnpkg.com/@firebase/messaging-compat/-/messaging-compat-0.1.12.tgz#239c1148f1cd5bf507613c431ff6fe7fc096ab3c" - integrity sha512-Cfv4ZQaxiMx4DcpDkFX1yKHFGQtnyMA6pcLplcC3uHkSVCyNRW6pFYSoO0/Uae03ixxIYNwle1ZVaVUZ2L5ddA== +"@firebase/messaging-compat@0.1.19": + version "0.1.19" + resolved "https://registry.yarnpkg.com/@firebase/messaging-compat/-/messaging-compat-0.1.19.tgz#4de2dcb0768846cd889e5ba89742dd5232afb8a5" + integrity sha512-h5tx4nxfSILeRquk5mKE8Onu7WtL6b7rfB6GKNJKecvkPs3nnq5Z4cp2Av4JUR2Wtt9UxCTfO0iRbbmtrt2bZQ== dependencies: - "@firebase/component" "0.5.13" - "@firebase/messaging" "0.9.12" - "@firebase/util" "1.5.2" + "@firebase/component" "0.5.20" + "@firebase/messaging" "0.9.19" + "@firebase/util" "1.7.2" tslib "^2.1.0" "@firebase/messaging-interop-types@0.1.0": @@ -1653,27 +1671,28 @@ resolved "https://registry.yarnpkg.com/@firebase/messaging-interop-types/-/messaging-interop-types-0.1.0.tgz#bdac02dd31edd5cb9eec37b1db698ea5e2c1a631" integrity sha512-DbvUl/rXAZpQeKBnwz0NYY5OCqr2nFA0Bj28Fmr3NXGqR4PAkfTOHuQlVtLO1Nudo3q0HxAYLa68ZDAcuv2uKQ== -"@firebase/messaging@0.9.12": - version "0.9.12" - resolved "https://registry.yarnpkg.com/@firebase/messaging/-/messaging-0.9.12.tgz#8ef7a76de17921eac68e79952006604d01dda138" - integrity sha512-qfLW7SZRZVKscI1GSyWc3WPtjAUDUk3gcEfPkdz9fzzQwj98V8xF++g4wL+9cuEuRzYf8ki2kCN/aqKRYUrxag== +"@firebase/messaging@0.9.19": + version "0.9.19" + resolved "https://registry.yarnpkg.com/@firebase/messaging/-/messaging-0.9.19.tgz#868916ed20e2bd3ecb58d13e1adb186714cfcbfa" + integrity sha512-xu99y/7/P+y3txGtgjsVJZyvx7T5/KdvFgDWS7oZwhKYG0o+DXFvvw3SBMK82LFGFOoyHlJUPqv45EyCPnOPCA== dependencies: - "@firebase/component" "0.5.13" - "@firebase/installations" "0.5.8" + "@firebase/component" "0.5.20" + "@firebase/installations" "0.5.15" "@firebase/messaging-interop-types" "0.1.0" - "@firebase/util" "1.5.2" + "@firebase/util" "1.7.2" + idb "7.0.1" tslib "^2.1.0" -"@firebase/performance-compat@0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@firebase/performance-compat/-/performance-compat-0.1.8.tgz#9a22286ee20b421b871ac2534223e01327df689a" - integrity sha512-lMLKFcOB99+tb6dVHJlJ8s19JFjxqpAqPGXCG8evTODPUW3BluBbfG4YS7JRESVA7wc/6kkuQIOx9q7l+bBZtQ== +"@firebase/performance-compat@0.1.15": + version "0.1.15" + resolved "https://registry.yarnpkg.com/@firebase/performance-compat/-/performance-compat-0.1.15.tgz#9ba68c6696a5ccd9ea5022ead43c1246017015bf" + integrity sha512-mryHr5eBEpWxBo8b3KM/53SwwVjMVahwdEnhfx1r+zAvmEPEzXUOGBzAC1l5WQ4DrwtDR87uMZ5soiQ/0jl9QQ== dependencies: - "@firebase/component" "0.5.13" - "@firebase/logger" "0.3.2" - "@firebase/performance" "0.5.8" + "@firebase/component" "0.5.20" + "@firebase/logger" "0.3.3" + "@firebase/performance" "0.5.15" "@firebase/performance-types" "0.1.0" - "@firebase/util" "1.5.2" + "@firebase/util" "1.7.2" tslib "^2.1.0" "@firebase/performance-types@0.1.0": @@ -1681,36 +1700,27 @@ resolved "https://registry.yarnpkg.com/@firebase/performance-types/-/performance-types-0.1.0.tgz#5e6efa9dc81860aee2cb7121b39ae8fa137e69fc" integrity sha512-6p1HxrH0mpx+622Ql6fcxFxfkYSBpE3LSuwM7iTtYU2nw91Hj6THC8Bc8z4nboIq7WvgsT/kOTYVVZzCSlXl8w== -"@firebase/performance@0.5.8": - version "0.5.8" - resolved "https://registry.yarnpkg.com/@firebase/performance/-/performance-0.5.8.tgz#c7e1c73122975d3364203829839a78d9371d9530" - integrity sha512-IN5MWdGRn0jglSdv1UHEDMklm1SOfF1IZ1pGNxVyO5CpF3a08I54I60fuwEfMUcsU6OAfzMl3zI+bnW5IgKdPg== +"@firebase/performance@0.5.15": + version "0.5.15" + resolved "https://registry.yarnpkg.com/@firebase/performance/-/performance-0.5.15.tgz#094856ab0b5799a81d57c4998cda6d363d315a07" + integrity sha512-YnnkUehXXzqQefNE5PlPEsXeJYSeY7cMWEdHYTj6u0/F5ntLSAhVZC8jl3Y0fTU1W8a9USQhml6NaXyWiVGmjQ== dependencies: - "@firebase/component" "0.5.13" - "@firebase/installations" "0.5.8" - "@firebase/logger" "0.3.2" - "@firebase/util" "1.5.2" + "@firebase/component" "0.5.20" + "@firebase/installations" "0.5.15" + "@firebase/logger" "0.3.3" + "@firebase/util" "1.7.2" tslib "^2.1.0" -"@firebase/polyfill@0.3.36": - version "0.3.36" - resolved "https://registry.yarnpkg.com/@firebase/polyfill/-/polyfill-0.3.36.tgz#c057cce6748170f36966b555749472b25efdb145" - integrity sha512-zMM9oSJgY6cT2jx3Ce9LYqb0eIpDE52meIzd/oe/y70F+v9u1LDqk5kUF5mf16zovGBWMNFmgzlsh6Wj0OsFtg== +"@firebase/remote-config-compat@0.1.15": + version "0.1.15" + resolved "https://registry.yarnpkg.com/@firebase/remote-config-compat/-/remote-config-compat-0.1.15.tgz#91343411085468a6c65b77acbbabc8791ea984f5" + integrity sha512-jGUrZXIxQRMeSrqEaCi3MtMF33NN12TNTQDZlbex2+T2+yTMI/sn3Mq52T/OccCo86DK17WVlXSWQCH1zCD13g== dependencies: - core-js "3.6.5" - promise-polyfill "8.1.3" - whatwg-fetch "2.0.4" - -"@firebase/remote-config-compat@0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@firebase/remote-config-compat/-/remote-config-compat-0.1.8.tgz#25c079fa8737d824add05337049dca17e078358f" - integrity sha512-lU9t7PMVpgE6q1vG8AuFenFhfUnx0H+eeiIQTi4dtuLDMx9BsI14c9VuiVjRIi7xC2DCDRNQCRL1kRD8bzgJNg== - dependencies: - "@firebase/component" "0.5.13" - "@firebase/logger" "0.3.2" - "@firebase/remote-config" "0.3.7" + "@firebase/component" "0.5.20" + "@firebase/logger" "0.3.3" + "@firebase/remote-config" "0.3.14" "@firebase/remote-config-types" "0.2.0" - "@firebase/util" "1.5.2" + "@firebase/util" "1.7.2" tslib "^2.1.0" "@firebase/remote-config-types@0.2.0": @@ -1718,26 +1728,26 @@ resolved "https://registry.yarnpkg.com/@firebase/remote-config-types/-/remote-config-types-0.2.0.tgz#1e2759fc01f20b58c564db42196f075844c3d1fd" integrity sha512-hqK5sCPeZvcHQ1D6VjJZdW6EexLTXNMJfPdTwbD8NrXUw6UjWC4KWhLK/TSlL0QPsQtcKRkaaoP+9QCgKfMFPw== -"@firebase/remote-config@0.3.7": - version "0.3.7" - resolved "https://registry.yarnpkg.com/@firebase/remote-config/-/remote-config-0.3.7.tgz#743fcb00501b9eca24728cf4caabea974ba3396b" - integrity sha512-gQaGzQCBOkS35b/aXC5Y9/zsPenqs6+axnChYYyfU7CqMG5FGfNbVi2rezYwB4G3+fH4rGO1s6xqcI535Fvy/A== +"@firebase/remote-config@0.3.14": + version "0.3.14" + resolved "https://registry.yarnpkg.com/@firebase/remote-config/-/remote-config-0.3.14.tgz#44b2e6174b82b9729ab0893ab80eadcc7b3c830c" + integrity sha512-wEOz3Tasxhr5lCGioe0WNZwDOoQhNZK2qGAm5+AlHAPaAhWIWvqUTkKsk3nFRztyRZzj3r9k5Gc2OSpEcQKP1A== dependencies: - "@firebase/component" "0.5.13" - "@firebase/installations" "0.5.8" - "@firebase/logger" "0.3.2" - "@firebase/util" "1.5.2" + "@firebase/component" "0.5.20" + "@firebase/installations" "0.5.15" + "@firebase/logger" "0.3.3" + "@firebase/util" "1.7.2" tslib "^2.1.0" -"@firebase/storage-compat@0.1.13": - version "0.1.13" - resolved "https://registry.yarnpkg.com/@firebase/storage-compat/-/storage-compat-0.1.13.tgz#e7a985ee01336df40682add37a2d0055e83c9a3a" - integrity sha512-MdubKh+xe3Xpi34WaXBKtim8H2aauO5sqqmATTc2WgSmSAqTmNSjQfNqIdf139Mp9ZCnpZAxiwiwzQtfckLYWg== +"@firebase/storage-compat@0.1.20": + version "0.1.20" + resolved "https://registry.yarnpkg.com/@firebase/storage-compat/-/storage-compat-0.1.20.tgz#ec24fd62332d39460db6e7d62770de57e72fe690" + integrity sha512-8vruwltKdvEPhYbPXA/otb5fAD7MGsBHpCzktJWvF7eIALa4sUlYt+jJxG5Nwk2FoT1NrwLQ7TtI7zvm6/NinA== dependencies: - "@firebase/component" "0.5.13" - "@firebase/storage" "0.9.5" + "@firebase/component" "0.5.20" + "@firebase/storage" "0.9.12" "@firebase/storage-types" "0.6.0" - "@firebase/util" "1.5.2" + "@firebase/util" "1.7.2" tslib "^2.1.0" "@firebase/storage-types@0.6.0": @@ -1745,27 +1755,27 @@ resolved "https://registry.yarnpkg.com/@firebase/storage-types/-/storage-types-0.6.0.tgz#0b1af64a2965af46fca138e5b70700e9b7e6312a" integrity sha512-1LpWhcCb1ftpkP/akhzjzeFxgVefs6eMD2QeKiJJUGH1qOiows2w5o0sKCUSQrvrRQS1lz3SFGvNR1Ck/gqxeA== -"@firebase/storage@0.9.5": - version "0.9.5" - resolved "https://registry.yarnpkg.com/@firebase/storage/-/storage-0.9.5.tgz#f74c905c7fbc40c1fef02c9191d2bffcf2898b4e" - integrity sha512-+nCDNIT2pNovlHnLOQPofn8jdOyJ4akUWPGn4ydAoFrfVt1/lINx5Qe+jS3/tKLROfYabqBYxfFUjHQKZBYwvg== +"@firebase/storage@0.9.12": + version "0.9.12" + resolved "https://registry.yarnpkg.com/@firebase/storage/-/storage-0.9.12.tgz#5631893a1ae9f7b0426948ab9910cd58782f9183" + integrity sha512-XIAmje0ufvRrxrUU/9tvGCuUIy7WSJf3XM8Y8OV9EW2Dg1w4f8IpraLiUdlirdtFM0UAnO2kDQHoiVQYhRrADQ== dependencies: - "@firebase/component" "0.5.13" - "@firebase/util" "1.5.2" + "@firebase/component" "0.5.20" + "@firebase/util" "1.7.2" node-fetch "2.6.7" tslib "^2.1.0" -"@firebase/util@1.5.2": - version "1.5.2" - resolved "https://registry.yarnpkg.com/@firebase/util/-/util-1.5.2.tgz#bdd2bc11c956a8a6a0fa25fbd752a13e033558bc" - integrity sha512-YvBH2UxFcdWG2HdFnhxZptPl2eVFlpOyTH66iDo13JPEYraWzWToZ5AMTtkyRHVmu7sssUpQlU9igy1KET7TOw== +"@firebase/util@1.7.2": + version "1.7.2" + resolved "https://registry.yarnpkg.com/@firebase/util/-/util-1.7.2.tgz#dbdb259f141b5025a7faaaa38e2ea5df0be36ff5" + integrity sha512-P3aTihYEMoz2QQlcn0T7av7HLEK9gsTc1ZiN9VA8wnUtEJscUNemCmTmP3RRysqEb3Z+tVVoycztY8f6R36rRw== dependencies: tslib "^2.1.0" -"@firebase/webchannel-wrapper@0.6.1": - version "0.6.1" - resolved "https://registry.yarnpkg.com/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.6.1.tgz#0c74724ba6e9ea6ad25a391eab60a79eaba4c556" - integrity sha512-9FqhNjKQWpQ3fGnSOCovHOm+yhhiorKEqYLAfd525jWavunDJcx8rOW6i6ozAh+FbwcYMkL7b+3j4UR/30MpoQ== +"@firebase/webchannel-wrapper@0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.8.0.tgz#88dfc717fb950276fd0fdee879fad2c041e33475" + integrity sha512-Q8erQds5LuAUgNuFOt/tu/abffYUHYxN+Ogp2V5EOssfFG7Ja4ce324Sqyq41u/vB5CSr+tfYS3JzTDrDxCvdw== "@grpc/grpc-js@^1.3.2": version "1.3.6" @@ -1774,16 +1784,16 @@ dependencies: "@types/node" ">=12.12.47" -"@grpc/proto-loader@^0.6.0": - version "0.6.4" - resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.6.4.tgz#5438c0d771e92274e77e631babdc14456441cbdc" - integrity sha512-7xvDvW/vJEcmLUltCUGOgWRPM8Oofv0eCFSVMuKqaqWJaXSzmB+m9hiyqe34QofAl4WAzIKUZZlinIF9FOHyTQ== +"@grpc/proto-loader@^0.6.13": + version "0.6.13" + resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.6.13.tgz#008f989b72a40c60c96cd4088522f09b05ac66bc" + integrity sha512-FjxPYDRTn6Ec3V0arm1FtSpmP6V50wuph2yILpyvTKzjc76oDdoihXqM1DzOW5ubvCC8GivfCnNtfaRE8myJ7g== dependencies: "@types/long" "^4.0.1" lodash.camelcase "^4.3.0" long "^4.0.0" - protobufjs "^6.10.0" - yargs "^16.1.1" + protobufjs "^6.11.3" + yargs "^16.2.0" "@hookform/resolvers@^2.6.0": version "2.8.8" @@ -4628,11 +4638,6 @@ core-js-pure@^3.20.2, core-js-pure@^3.8.1: resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.21.1.tgz#8c4d1e78839f5f46208de7230cebfb72bc3bdb51" integrity sha512-12VZfFIu+wyVbBebyHmRTuEE/tZrB4tJToWcwAMcsp3h4+sHR+fMJWbKpYiCRWlhFBq+KNyO8rIV9rTkeVmznQ== -core-js@3.6.5: - version "3.6.5" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a" - integrity sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA== - core-js@^3.19.2: version "3.21.1" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.21.1.tgz#f2e0ddc1fc43da6f904706e8e955bc19d06a0d94" @@ -6028,37 +6033,37 @@ find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" -firebase@^9.6.11: - version "9.6.11" - resolved "https://registry.yarnpkg.com/firebase/-/firebase-9.6.11.tgz#ec198b3bd646d0028b5d6240261cd89b200a590d" - integrity sha512-Zdmag/wGNkA4IAek+2yQoWrF2vyqIowu+2eOcSaE6jE2hDZYA3nHNutsQ+jquSxE3SeJk3Dh1OEsffqgunBy/w== +firebase@^9.12.1: + version "9.12.1" + resolved "https://registry.yarnpkg.com/firebase/-/firebase-9.12.1.tgz#f2ef2560a3a122bcf82dee09d5ae3a3805bb890a" + integrity sha512-sBp4rvkCC7TUnGeneRNs6GVcajO+iSXmYjxqXN4FsrBzldJ5/AOnDXf4bi9OUZtQSl+EHDgUWShBieht15ijgQ== dependencies: - "@firebase/analytics" "0.7.8" - "@firebase/analytics-compat" "0.1.9" - "@firebase/app" "0.7.21" - "@firebase/app-check" "0.5.6" - "@firebase/app-check-compat" "0.2.6" - "@firebase/app-compat" "0.1.22" - "@firebase/app-types" "0.7.0" - "@firebase/auth" "0.19.12" - "@firebase/auth-compat" "0.2.12" - "@firebase/database" "0.12.8" - "@firebase/database-compat" "0.1.8" - "@firebase/firestore" "3.4.8" - "@firebase/firestore-compat" "0.1.17" - "@firebase/functions" "0.7.11" - "@firebase/functions-compat" "0.1.12" - "@firebase/installations" "0.5.8" - "@firebase/messaging" "0.9.12" - "@firebase/messaging-compat" "0.1.12" - "@firebase/performance" "0.5.8" - "@firebase/performance-compat" "0.1.8" - "@firebase/polyfill" "0.3.36" - "@firebase/remote-config" "0.3.7" - "@firebase/remote-config-compat" "0.1.8" - "@firebase/storage" "0.9.5" - "@firebase/storage-compat" "0.1.13" - "@firebase/util" "1.5.2" + "@firebase/analytics" "0.8.3" + "@firebase/analytics-compat" "0.1.16" + "@firebase/app" "0.8.2" + "@firebase/app-check" "0.5.15" + "@firebase/app-check-compat" "0.2.15" + "@firebase/app-compat" "0.1.37" + "@firebase/app-types" "0.8.0" + "@firebase/auth" "0.20.10" + "@firebase/auth-compat" "0.2.23" + "@firebase/database" "0.13.9" + "@firebase/database-compat" "0.2.9" + "@firebase/firestore" "3.7.1" + "@firebase/firestore-compat" "0.2.1" + "@firebase/functions" "0.8.7" + "@firebase/functions-compat" "0.2.7" + "@firebase/installations" "0.5.15" + "@firebase/installations-compat" "0.1.15" + "@firebase/messaging" "0.9.19" + "@firebase/messaging-compat" "0.1.19" + "@firebase/performance" "0.5.15" + "@firebase/performance-compat" "0.1.15" + "@firebase/remote-config" "0.3.14" + "@firebase/remote-config-compat" "0.1.15" + "@firebase/storage" "0.9.12" + "@firebase/storage-compat" "0.1.20" + "@firebase/util" "1.7.2" firebaseui@^6.0.1: version "6.0.1" @@ -6709,6 +6714,11 @@ icss-utils@^5.0.0, icss-utils@^5.1.0: resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== +idb@7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/idb/-/idb-7.0.1.tgz#d2875b3a2f205d854ee307f6d196f246fea590a7" + integrity sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg== + idb@^6.1.4: version "6.1.5" resolved "https://registry.yarnpkg.com/idb/-/idb-6.1.5.tgz#dbc53e7adf1ac7c59f9b2bf56e00b4ea4fce8c7b" @@ -9736,11 +9746,6 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -promise-polyfill@8.1.3: - version "8.1.3" - resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-8.1.3.tgz#8c99b3cf53f3a91c68226ffde7bde81d7f904116" - integrity sha512-MG5r82wBzh7pSKDRa9y+vllNHz3e3d4CNj1PQE4BQYxLme0gKYYBm9YENq+UkEikyZ0XbiGWxYlVw3Rl9O/U8g== - promise@^7.1.1: version "7.3.1" resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" @@ -9782,7 +9787,7 @@ property-information@^6.0.0: resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.1.1.tgz#5ca85510a3019726cb9afed4197b7b8ac5926a22" integrity sha512-hrzC564QIl0r0vy4l6MvRLhafmUowhO/O3KgVSoXIbbA2Sz4j8HGpJc6T2cubRVwMwpdiG/vKGfhT4IixmKN9w== -protobufjs@^6.10.0: +protobufjs@^6.11.3: version "6.11.3" resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.3.tgz#637a527205a35caa4f3e2a9a4a13ddffe0e7af74" integrity sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg== @@ -10811,13 +10816,12 @@ select-hose@^2.0.0: resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= -selenium-webdriver@4.0.0-rc-1, selenium-webdriver@^4.0.0-beta.2: - version "4.0.0-rc-1" - resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.0.0-rc-1.tgz#b1e7e5821298c8a071e988518dd6b759f0c41281" - integrity sha512-bcrwFPRax8fifRP60p7xkWDGSJJoMkPAzufMlk5K2NyLPht/YZzR2WcIk1+3gR8VOCLlst1P2PI+MXACaFzpIw== +selenium-webdriver@4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.1.2.tgz#d463b4335632d2ea41a9e988e435a55dc41f5314" + integrity sha512-e4Ap8vQvhipgBB8Ry9zBiKGkU6kHKyNnWiavGGLKkrdW81Zv7NVMtFOL/j3yX0G8QScM7XIXijKssNd4EUxSOw== dependencies: jszip "^3.6.0" - rimraf "^3.0.2" tmp "^0.2.1" ws ">=7.4.6" @@ -12344,11 +12348,6 @@ whatwg-encoding@^1.0.5: dependencies: iconv-lite "0.4.24" -whatwg-fetch@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" - integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng== - whatwg-fetch@>=0.10.0, whatwg-fetch@^3.6.2: version "3.6.2" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" @@ -12667,7 +12666,7 @@ yargs-parser@^20.2.2, yargs-parser@^20.x: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== -yargs@^16.1.1, yargs@^16.2.0: +yargs@^16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== From 6f8dd8cdc576ea5f2e05f51098e46d54abcaa568 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Thu, 17 Nov 2022 15:50:26 +1100 Subject: [PATCH 276/309] fix cells not re-rendering when there's a new value from db --- src/components/Table/CellValidation.tsx | 29 ++++++++++++----------- src/components/Table/withTableCell.tsx | 31 +++++++++++++++---------- 2 files changed, 35 insertions(+), 25 deletions(-) diff --git a/src/components/Table/CellValidation.tsx b/src/components/Table/CellValidation.tsx index 6e566487..c7589786 100644 --- a/src/components/Table/CellValidation.tsx +++ b/src/components/Table/CellValidation.tsx @@ -18,6 +18,7 @@ import { contextMenuTargetAtom, } from "@src/atoms/tableScope"; import type { TableRow } from "@src/types/table"; +import type { ITableCellProps } from "./withTableCell"; const Dot = styled("div")(({ theme }) => ({ position: "absolute", @@ -96,6 +97,20 @@ export const CellValidation = memo(function MemoizedCellValidation({ ); } + const tableCellComponentProps: ITableCellProps = { + ...cell.getContext(), + value, + focusInsideCell: isSelectedCell && focusInsideCell, + setFocusInsideCell: (focusInside: boolean) => + setSelectedCell({ + path: row.original._rowy_ref.path, + columnKey: cell.column.id, + focusInside, + }), + disabled: !canEditCells || cell.column.columnDef.meta?.editable === false, + rowHeight, + }; + return ( {renderedValidationTooltip} - {flexRender(cell.column.columnDef.cell, { - ...cell.getContext(), - focusInsideCell: isSelectedCell && focusInsideCell, - setFocusInsideCell: (focusInside: boolean) => - setSelectedCell({ - path: row.original._rowy_ref.path, - columnKey: cell.column.id, - focusInside, - }), - disabled: - !canEditCells || cell.column.columnDef.meta?.editable === false, - rowHeight, - })} + {flexRender(cell.column.columnDef.cell, tableCellComponentProps)} ); diff --git a/src/components/Table/withTableCell.tsx b/src/components/Table/withTableCell.tsx index d91eda98..c281423d 100644 --- a/src/components/Table/withTableCell.tsx +++ b/src/components/Table/withTableCell.tsx @@ -8,7 +8,7 @@ import { } from "react"; import useStateRef from "react-usestateref"; import { useSetAtom } from "jotai"; -import { get, isEqual } from "lodash-es"; +import { isEqual } from "lodash-es"; import type { CellContext } from "@tanstack/react-table"; import { Popover, PopoverProps } from "@mui/material"; @@ -32,7 +32,9 @@ export interface ICellOptions { popoverProps?: Partial; } -export interface ITableCellProps extends CellContext { +export interface ITableCellProps + extends CellContext { + value: TValue; focusInsideCell: boolean; setFocusInsideCell: (focusInside: boolean) => void; disabled: boolean; @@ -61,15 +63,12 @@ export default function withTableCell( function TableCell({ row, column, - getValue, + value, focusInsideCell, setFocusInsideCell, disabled, rowHeight, }: ITableCellProps) { - // Get the latest value on every re-render of this component - const value = getValue(); - // Render inline editor cell after timeout on mount // to improve scroll performance const [inlineEditorReady, setInlineEditorReady] = useState(false); @@ -203,10 +202,7 @@ export default function withTableCell( return null; }, (prev, next) => { - const valueEqual = isEqual( - get(prev.row.original, prev.column.columnDef.meta!.fieldName), - get(next.row.original, next.column.columnDef.meta!.fieldName) - ); + const valueEqual = isEqual(prev.value, next.value); const columnEqual = isEqual( prev.column.columnDef.meta, next.column.columnDef.meta @@ -234,12 +230,23 @@ interface IEditorCellManagerProps extends IDisplayCellProps { function EditorCellManager({ EditorCellComponent, saveOnUnmount, + value, ...props }: IEditorCellManagerProps) { - const [localValue, setLocalValue, localValueRef] = useStateRef(props.value); - const [, setIsDirty, isDirtyRef] = useStateRef(false); + // Store local value so we don’t immediately write to db when the user + // types in a textbox, for example + const [localValue, setLocalValue, localValueRef] = useStateRef(value); + // Mark if the user has interacted with this cell and hasn’t saved yet + const [isDirty, setIsDirty, isDirtyRef] = useStateRef(false); const updateField = useSetAtom(updateFieldAtom, tableScope); + // When this cell’s data has updated, update the local value if + // it’s not dirty and the value is different + useEffect(() => { + if (!isDirty && !isEqual(value, localValueRef.current)) + setLocalValue(value); + }, [isDirty, localValueRef, setLocalValue, value]); + // This is where we update the documents const handleSubmit = () => { if (props.disabled || !isDirtyRef.current) return; From 7c6c035fb048f87f3a43eb627d9ad81b40ac37c4 Mon Sep 17 00:00:00 2001 From: Bobby Wang Date: Thu, 17 Nov 2022 12:57:28 +0800 Subject: [PATCH 277/309] fix diff editor dark theme ui (#955) --- src/components/CodeEditor/DiffEditor.tsx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/components/CodeEditor/DiffEditor.tsx b/src/components/CodeEditor/DiffEditor.tsx index 64a9a55f..08569167 100644 --- a/src/components/CodeEditor/DiffEditor.tsx +++ b/src/components/CodeEditor/DiffEditor.tsx @@ -15,6 +15,8 @@ import useMonacoCustomizations, { } from "./useMonacoCustomizations"; import FullScreenButton from "@src/components/FullScreenButton"; import { spreadSx } from "@src/utils/ui"; +import githubLightTheme from "@src/components/CodeEditor/github-light-default.json"; +import githubDarkTheme from "@src/components/CodeEditor/github-dark-default.json"; export interface IDiffEditorProps extends Partial, @@ -73,7 +75,12 @@ export default function DiffEditor({ loading={} className="editor" {...props} + beforeMount={(monaco) => { + monaco.editor.defineTheme("github-light", githubLightTheme as any); + monaco.editor.defineTheme("github-dark", githubDarkTheme as any); + }} onMount={handleEditorMount} + theme={`github-${theme.palette.mode}`} options={ { readOnly: disabled, From 6f0873ff7de12f663986b937c551fe073725084a Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Thu, 17 Nov 2022 18:17:43 +1100 Subject: [PATCH 278/309] improve Table code organization & fix memo issues --- src/components/ColumnMenu/ColumnMenu.tsx | 2 +- .../{ => Breadcrumbs}/BreadcrumbsSubTable.tsx | 0 .../BreadcrumbsTableRoot.tsx | 2 +- .../Table/ColumnHeader/ColumnHeader.tsx | 294 +++++++++++------- .../ColumnHeader/ColumnHeaderDragHandle.tsx | 58 ++++ .../ColumnHeaderResizer.tsx} | 12 +- .../Table/ColumnHeader/ColumnHeaderSort.tsx | 16 +- .../Table/FinalColumn/FinalColumn.tsx | 4 +- src/components/Table/{ => Mock}/Cell.tsx | 0 src/components/Table/{ => Mock}/Column.tsx | 1 - src/components/Table/Table.tsx | 2 + src/components/Table/TableBody.tsx | 18 +- .../Table/{ => TableCell}/ChipList.tsx | 0 .../{ => TableCell}/EditorCellTextField.tsx | 0 .../TableCell.tsx} | 33 +- src/components/Table/TableCell/index.ts | 2 + .../withRenderTableCell.tsx} | 6 +- src/components/Table/TableHeader.tsx | 118 +------ src/components/Table/TableSkeleton.tsx | 2 +- .../ImportAirtableWizard/Step1Columns.tsx | 4 +- .../ImportAirtableWizard/Step2NewColumns.tsx | 4 +- .../ImportAirtableWizard/Step3Preview.tsx | 4 +- .../ImportCsvWizard/Step1Columns.tsx | 4 +- .../ImportCsvWizard/Step2NewColumns.tsx | 4 +- .../ImportCsvWizard/Step3Preview.tsx | 4 +- .../ImportExistingWizard/Step1Columns.tsx | 2 +- .../ImportExistingWizard/Step2Rename.tsx | 4 +- .../ImportExistingWizard/Step3Types.tsx | 4 +- .../ImportExistingWizard/Step4Preview.tsx | 4 +- src/components/fields/Action/index.tsx | 4 +- src/components/fields/Checkbox/index.tsx | 4 +- src/components/fields/Code/index.tsx | 4 +- src/components/fields/Color/index.tsx | 4 +- .../fields/ConnectService/DisplayCell.tsx | 2 +- .../fields/ConnectService/index.tsx | 4 +- .../fields/ConnectTable/DisplayCell.tsx | 2 +- src/components/fields/ConnectTable/index.tsx | 4 +- .../fields/Connector/DisplayCell.tsx | 2 +- src/components/fields/Connector/index.tsx | 4 +- src/components/fields/CreatedAt/index.tsx | 4 +- src/components/fields/CreatedBy/index.tsx | 4 +- src/components/fields/Date/index.tsx | 4 +- src/components/fields/DateTime/index.tsx | 4 +- src/components/fields/Derivative/index.tsx | 4 +- src/components/fields/Duration/index.tsx | 4 +- src/components/fields/Email/EditorCell.tsx | 2 +- src/components/fields/Email/index.tsx | 4 +- src/components/fields/File/DisplayCell.tsx | 2 +- src/components/fields/File/EditorCell.tsx | 2 +- src/components/fields/File/index.tsx | 4 +- src/components/fields/GeoPoint/index.tsx | 4 +- src/components/fields/Id/index.tsx | 4 +- src/components/fields/Image/index.tsx | 4 +- src/components/fields/Json/index.tsx | 4 +- src/components/fields/LongText/EditorCell.tsx | 2 +- src/components/fields/LongText/index.tsx | 4 +- src/components/fields/Markdown/index.tsx | 4 +- .../fields/MultiSelect/DisplayCell.tsx | 2 +- src/components/fields/MultiSelect/index.tsx | 4 +- src/components/fields/Number/EditorCell.tsx | 2 +- src/components/fields/Number/index.tsx | 4 +- .../fields/Percentage/EditorCell.tsx | 2 +- src/components/fields/Percentage/index.tsx | 4 +- src/components/fields/Phone/EditorCell.tsx | 2 +- src/components/fields/Phone/index.tsx | 4 +- src/components/fields/Rating/index.tsx | 4 +- .../fields/Reference/EditorCell.tsx | 2 +- src/components/fields/Reference/index.tsx | 4 +- src/components/fields/RichText/index.tsx | 4 +- .../fields/ShortText/EditorCell.tsx | 2 +- src/components/fields/ShortText/index.tsx | 4 +- src/components/fields/SingleSelect/index.tsx | 4 +- src/components/fields/Slider/index.tsx | 4 +- src/components/fields/Status/index.tsx | 4 +- src/components/fields/SubTable/index.tsx | 4 +- src/components/fields/UpdatedAt/index.tsx | 4 +- src/components/fields/UpdatedBy/index.tsx | 4 +- src/components/fields/Url/EditorCell.tsx | 2 +- src/components/fields/Url/index.tsx | 4 +- src/components/fields/User/index.tsx | 4 +- src/components/fields/types.ts | 4 +- src/constants/routes.tsx | 2 +- src/pages/Table/ProvidedSubTablePage.tsx | 2 +- 83 files changed, 420 insertions(+), 372 deletions(-) rename src/components/Table/{ => Breadcrumbs}/BreadcrumbsSubTable.tsx (100%) rename src/components/Table/{ => Breadcrumbs}/BreadcrumbsTableRoot.tsx (97%) create mode 100644 src/components/Table/ColumnHeader/ColumnHeaderDragHandle.tsx rename src/components/Table/{Styled/StyledResizer.tsx => ColumnHeader/ColumnHeaderResizer.tsx} (79%) rename src/components/Table/{ => Mock}/Cell.tsx (100%) rename src/components/Table/{ => Mock}/Column.tsx (99%) rename src/components/Table/{ => TableCell}/ChipList.tsx (100%) rename src/components/Table/{ => TableCell}/EditorCellTextField.tsx (100%) rename src/components/Table/{CellValidation.tsx => TableCell/TableCell.tsx} (87%) create mode 100644 src/components/Table/TableCell/index.ts rename src/components/Table/{withTableCell.tsx => TableCell/withRenderTableCell.tsx} (98%) diff --git a/src/components/ColumnMenu/ColumnMenu.tsx b/src/components/ColumnMenu/ColumnMenu.tsx index 54f6e0c3..72b1b765 100644 --- a/src/components/ColumnMenu/ColumnMenu.tsx +++ b/src/components/ColumnMenu/ColumnMenu.tsx @@ -29,7 +29,7 @@ import SettingsIcon from "@mui/icons-material/SettingsOutlined"; import EvalIcon from "@mui/icons-material/PlayCircleOutline"; import MenuContents, { IMenuContentsProps } from "./MenuContents"; -import ColumnHeader from "@src/components/Table/Column"; +import ColumnHeader from "@src/components/Table/Mock/Column"; import { projectScope, diff --git a/src/components/Table/BreadcrumbsSubTable.tsx b/src/components/Table/Breadcrumbs/BreadcrumbsSubTable.tsx similarity index 100% rename from src/components/Table/BreadcrumbsSubTable.tsx rename to src/components/Table/Breadcrumbs/BreadcrumbsSubTable.tsx diff --git a/src/components/Table/BreadcrumbsTableRoot.tsx b/src/components/Table/Breadcrumbs/BreadcrumbsTableRoot.tsx similarity index 97% rename from src/components/Table/BreadcrumbsTableRoot.tsx rename to src/components/Table/Breadcrumbs/BreadcrumbsTableRoot.tsx index dd15526d..676408e3 100644 --- a/src/components/Table/BreadcrumbsTableRoot.tsx +++ b/src/components/Table/Breadcrumbs/BreadcrumbsTableRoot.tsx @@ -1,5 +1,5 @@ import { useAtom } from "jotai"; -import { useLocation, useParams, Link as RouterLink } from "react-router-dom"; +import { useParams, Link as RouterLink } from "react-router-dom"; import { find, camelCase, uniq } from "lodash-es"; import { diff --git a/src/components/Table/ColumnHeader/ColumnHeader.tsx b/src/components/Table/ColumnHeader/ColumnHeader.tsx index 345e856b..84239a40 100644 --- a/src/components/Table/ColumnHeader/ColumnHeader.tsx +++ b/src/components/Table/ColumnHeader/ColumnHeader.tsx @@ -1,5 +1,10 @@ -import { forwardRef, useRef } from "react"; +import { memo, useRef } from "react"; import { useAtom, useSetAtom } from "jotai"; +import type { Header } from "@tanstack/react-table"; +import type { + DraggableProvided, + DraggableStateSnapshot, +} from "react-beautiful-dnd"; import { styled, @@ -7,8 +12,8 @@ import { TooltipProps, tooltipClasses, Fade, - Grid, - GridProps, + Stack, + StackProps, IconButton, Typography, } from "@mui/material"; @@ -16,21 +21,58 @@ import DropdownIcon from "@mui/icons-material/MoreHoriz"; import LockIcon from "@mui/icons-material/LockOutlined"; import ColumnHeaderSort, { SORT_STATES } from "./ColumnHeaderSort"; +import ColumnHeaderDragHandle from "./ColumnHeaderDragHandle"; +import ColumnHeaderResizer from "./ColumnHeaderResizer"; import { projectScope, altPressAtom } from "@src/atoms/projectScope"; import { tableScope, + selectedCellAtom, columnMenuAtom, tableSortsAtom, } from "@src/atoms/tableScope"; import { getFieldProp } from "@src/components/fields"; -import { COLUMN_HEADER_HEIGHT } from "@src/components/Table/Column"; -import { ColumnConfig } from "@src/types/table"; import { FieldType } from "@src/constants/fields"; -import { spreadSx } from "@src/utils/ui"; +import { COLUMN_HEADER_HEIGHT } from "@src/components/Table/Mock/Column"; +import type { ColumnConfig } from "@src/types/table"; +import type { TableRow } from "@src/types/table"; export { COLUMN_HEADER_HEIGHT }; +const StyledColumnHeader = styled(Stack)(({ theme }) => ({ + position: "relative", + height: "100%", + border: `1px solid ${theme.palette.divider}`, + "& + &": { borderLeftStyle: "none" }, + + flexDirection: "row", + alignItems: "center", + padding: theme.spacing(0, 0.5, 0, 1), + "& svg, & button": { display: "block", zIndex: 1 }, + + backgroundColor: theme.palette.background.default, + color: theme.palette.text.secondary, + transition: theme.transitions.create("color", { + duration: theme.transitions.duration.short, + }), + "&:hover": { color: theme.palette.text.primary }, + + "& .MuiIconButton-root": { + color: theme.palette.text.disabled, + transition: theme.transitions.create( + ["background-color", "opacity", "color"], + { duration: theme.transitions.duration.short } + ), + }, + [`&:hover .MuiIconButton-root, + &:focus .MuiIconButton-root, + &:focus-within .MuiIconButton-root, + .MuiIconButton-root:focus`]: { + color: theme.palette.text.primary, + opacity: 1, + }, +})); + const LightTooltip = styled(({ className, ...props }: TooltipProps) => ( ))(({ theme }) => ({ @@ -44,18 +86,34 @@ const LightTooltip = styled(({ className, ...props }: TooltipProps) => ( }, })); -export interface IColumnHeaderProps extends Partial { +export interface IColumnHeaderProps + extends Partial> { + header: Header; column: ColumnConfig; + + provided: DraggableProvided; + snapshot: DraggableStateSnapshot; + width: number; + isSelectedCell: boolean; focusInsideCell: boolean; - children: React.ReactNode; + canEditColumns: boolean; + isLastFrozen: boolean; } -export const ColumnHeader = forwardRef(function ColumnHeader( - { column, width, focusInsideCell, children, ...props }: IColumnHeaderProps, - ref: React.Ref -) { +export const ColumnHeader = memo(function ColumnHeader({ + header, + column, + provided, + snapshot, + width, + isSelectedCell, + focusInsideCell, + canEditColumns, + isLastFrozen, +}: IColumnHeaderProps) { const openColumnMenu = useSetAtom(columnMenuAtom, tableScope); + const setSelectedCell = useSetAtom(selectedCellAtom, tableScope); const [altPress] = useAtom(altPressAtom, projectScope); const [tableSorts] = useAtom(tableSortsAtom, tableScope); @@ -74,11 +132,19 @@ export const ColumnHeader = forwardRef(function ColumnHeader( : tableSorts[0]?.direction || "none"; return ( - `1px solid ${theme.palette.divider}`, - - backgroundColor: "background.default", - color: "text.secondary", - transition: (theme) => - theme.transitions.create("color", { - duration: theme.transitions.duration.short, - }), - "&:hover": { color: "text.primary" }, - - position: "relative", - - py: 0, - pr: 0.5, - pl: 1, - width: "100%", - }, - ...spreadSx(props.sx), - ]} + onClick={(e) => { + setSelectedCell({ + path: "_rowy_header", + columnKey: header.id, + focusInside: false, + }); + (e.target as HTMLDivElement).focus(); + }} + onDoubleClick={(e) => { + setSelectedCell({ + path: "_rowy_header", + columnKey: header.id, + focusInside: true, + }); + (e.target as HTMLDivElement).focus(); + }} > + {provided.dragHandleProps && ( + + )} + {width > 140 && ( - { navigator.clipboard.writeText(column.key); }} @@ -139,96 +210,87 @@ export const ColumnHeader = forwardRef(function ColumnHeader( ) : ( getFieldProp("icon", (column as any).type) )} - +
    )} - - - {column.name as string} - - } - enterDelay={1000} - placement="bottom-start" - disableInteractive - TransitionComponent={Fade} - sx={{ "& .MuiTooltip-tooltip": { marginTop: "-28px !important" } }} - > + - {altPress ? ( - <> - {column.index} {column.fieldName} - - ) : ( - column.name - )} + {column.name as string} - - + } + enterDelay={1000} + placement="bottom-start" + disableInteractive + TransitionComponent={Fade} + sx={{ "& .MuiTooltip-tooltip": { marginTop: "-28px !important" } }} + > + + {altPress ? ( + <> + {column.index} {column.fieldName} + + ) : ( + column.name + )} + + {column.type !== FieldType.id && ( - - - + )} - - - - theme.transitions.create("color", { - duration: theme.transitions.duration.short, - }), + + + + + - color: "text.disabled", - "[role='columnheader']:hover &, [role='columnheader']:focus &, [role='columnheader']:focus-within &, &:focus": - { color: "text.primary" }, - }} - > - - - - - - {children} - + {header.column.getCanResize() && ( + + )} + ); }); diff --git a/src/components/Table/ColumnHeader/ColumnHeaderDragHandle.tsx b/src/components/Table/ColumnHeader/ColumnHeaderDragHandle.tsx new file mode 100644 index 00000000..a7ae1da9 --- /dev/null +++ b/src/components/Table/ColumnHeader/ColumnHeaderDragHandle.tsx @@ -0,0 +1,58 @@ +import type { DraggableProvidedDragHandleProps } from "react-beautiful-dnd"; +import { DragVertical } from "@src/assets/icons"; + +export interface IColumnHeaderDragHandleProps { + dragHandleProps: DraggableProvidedDragHandleProps; + tabIndex: number; +} + +export default function ColumnHeaderDragHandle({ + dragHandleProps, + tabIndex, +}: IColumnHeaderDragHandleProps) { + return ( +
    -1 ? dragHandleProps["aria-describedby"] : undefined + } + style={{ + position: "absolute", + inset: 0, + zIndex: 0, + display: "flex", + alignItems: "center", + outline: "none", + }} + className="column-drag-handle" + > + theme.transitions.create(["opacity"]), + "[role='columnheader']:hover &, [role='columnheader']:focus-within &": + { + opacity: 0.5, + }, + ".column-drag-handle:hover &": { + opacity: 1, + }, + ".column-drag-handle:active &": { + opacity: 1, + color: "primary.main", + }, + ".column-drag-handle:focus &": { + opacity: 1, + color: "primary.main", + outline: "2px solid", + outlineColor: "primary.main", + }, + }} + style={{ width: 8 }} + preserveAspectRatio="xMidYMid slice" + /> +
    + ); +} diff --git a/src/components/Table/Styled/StyledResizer.tsx b/src/components/Table/ColumnHeader/ColumnHeaderResizer.tsx similarity index 79% rename from src/components/Table/Styled/StyledResizer.tsx rename to src/components/Table/ColumnHeader/ColumnHeaderResizer.tsx index 7f23f1da..88b65232 100644 --- a/src/components/Table/Styled/StyledResizer.tsx +++ b/src/components/Table/ColumnHeader/ColumnHeaderResizer.tsx @@ -1,13 +1,13 @@ import { styled } from "@mui/material"; -export interface IStyledResizerProps { +export interface IColumnHeaderResizerProps { isResizing: boolean; } -export const StyledResizer = styled("div", { - name: "StyledResizer", +export const ColumnHeaderResizer = styled("div", { + name: "ColumnHeaderResizer", shouldForwardProp: (prop) => prop !== "isResizing", -})(({ theme, isResizing }) => ({ +})(({ theme, isResizing }) => ({ position: "absolute", zIndex: 5, right: 0, @@ -51,6 +51,6 @@ export const StyledResizer = styled("div", { transform: isResizing ? "scaleY(1.5) !important" : undefined, }, })); -StyledResizer.displayName = "StyledResizer"; +ColumnHeaderResizer.displayName = "ColumnHeaderResizer"; -export default StyledResizer; +export default ColumnHeaderResizer; diff --git a/src/components/Table/ColumnHeader/ColumnHeaderSort.tsx b/src/components/Table/ColumnHeader/ColumnHeaderSort.tsx index c8c4878f..0a5bc049 100644 --- a/src/components/Table/ColumnHeader/ColumnHeaderSort.tsx +++ b/src/components/Table/ColumnHeader/ColumnHeaderSort.tsx @@ -1,3 +1,4 @@ +import { memo } from "react"; import { useSetAtom } from "jotai"; import { colord } from "colord"; @@ -17,7 +18,7 @@ export interface IColumnHeaderSortProps { tabIndex?: number; } -export default function ColumnHeaderSort({ +export const ColumnHeaderSort = memo(function ColumnHeaderSort({ sortKey, currentSort, tabIndex, @@ -34,7 +35,7 @@ export default function ColumnHeaderSort({ return ( - theme.transitions.create(["background-color", "opacity"], { - duration: theme.transitions.duration.short, - }), "& .arrow": { transition: (theme) => @@ -108,4 +102,6 @@ export default function ColumnHeaderSort({ ); -} +}); + +export default ColumnHeaderSort; diff --git a/src/components/Table/FinalColumn/FinalColumn.tsx b/src/components/Table/FinalColumn/FinalColumn.tsx index 6f058eda..28b584e6 100644 --- a/src/components/Table/FinalColumn/FinalColumn.tsx +++ b/src/components/Table/FinalColumn/FinalColumn.tsx @@ -1,6 +1,6 @@ import { memo } from "react"; import { useAtom, useSetAtom } from "jotai"; -import type { ITableCellProps } from "@src/components/Table/withTableCell"; +import type { IRenderedTableCellProps } from "@src/components/Table/TableCell/withRenderTableCell"; import { Stack, Tooltip, IconButton, alpha } from "@mui/material"; import { CopyCells as CopyCellsIcon } from "@src/assets/icons"; @@ -25,7 +25,7 @@ import { export const FinalColumn = memo(function FinalColumn({ row, focusInsideCell, -}: ITableCellProps) { +}: IRenderedTableCellProps) { const [userRoles] = useAtom(userRolesAtom, projectScope); const [addRowIdType] = useAtom(tableAddRowIdTypeAtom, projectScope); const confirm = useSetAtom(confirmDialogAtom, projectScope); diff --git a/src/components/Table/Cell.tsx b/src/components/Table/Mock/Cell.tsx similarity index 100% rename from src/components/Table/Cell.tsx rename to src/components/Table/Mock/Cell.tsx diff --git a/src/components/Table/Column.tsx b/src/components/Table/Mock/Column.tsx similarity index 99% rename from src/components/Table/Column.tsx rename to src/components/Table/Mock/Column.tsx index bc841fc0..fc831d1d 100644 --- a/src/components/Table/Column.tsx +++ b/src/components/Table/Mock/Column.tsx @@ -105,7 +105,6 @@ export const Column = forwardRef(function Column( ml: 0.5, }} - aria-hidden > {label} diff --git a/src/components/Table/Table.tsx b/src/components/Table/Table.tsx index 886fdcff..fe1447c4 100644 --- a/src/components/Table/Table.tsx +++ b/src/components/Table/Table.tsx @@ -221,6 +221,7 @@ export default function Table({ canAddColumns={canAddColumns} canEditColumns={canEditColumns} lastFrozen={lastFrozen} + columnSizing={columnSizing} />
    @@ -233,6 +234,7 @@ export default function Table({ rows={rows} canEditCells={canEditCells} lastFrozen={lastFrozen} + columnSizing={columnSizing} /> )} diff --git a/src/components/Table/TableBody.tsx b/src/components/Table/TableBody.tsx index ae119011..674d8d96 100644 --- a/src/components/Table/TableBody.tsx +++ b/src/components/Table/TableBody.tsx @@ -1,9 +1,10 @@ +import { memo } from "react"; import { useAtom } from "jotai"; -import type { Column, Row } from "@tanstack/react-table"; +import type { Column, Row, ColumnSizingState } from "@tanstack/react-table"; import StyledRow from "./Styled/StyledRow"; import OutOfOrderIndicator from "./OutOfOrderIndicator"; -import CellValidation from "./CellValidation"; +import CellValidation from "./TableCell"; import { RowsSkeleton } from "./TableSkeleton"; import { @@ -29,9 +30,12 @@ export interface ITableBodyProps { canEditCells: boolean; lastFrozen?: string; + + /** Re-render when local column sizing changes */ + columnSizing: ColumnSizingState; } -export default function TableBody({ +export const TableBody = memo(function TableBody({ containerRef, leafColumns, rows, @@ -105,9 +109,11 @@ export default function TableBody({ : undefined } isSelectedCell={isSelectedCell} + focusInsideCell={isSelectedCell && selectedCell?.focusInside} isReadOnlyCell={isReadOnlyCell} canEditCells={canEditCells} - lastFrozen={lastFrozen} + isLastFrozen={lastFrozen === cell.column.id} + width={cell.column.getSize()} rowHeight={tableSchema.rowHeight || DEFAULT_ROW_HEIGHT} /> ); @@ -127,4 +133,6 @@ export default function TableBody({ )}
    ); -} +}); + +export default TableBody; diff --git a/src/components/Table/ChipList.tsx b/src/components/Table/TableCell/ChipList.tsx similarity index 100% rename from src/components/Table/ChipList.tsx rename to src/components/Table/TableCell/ChipList.tsx diff --git a/src/components/Table/EditorCellTextField.tsx b/src/components/Table/TableCell/EditorCellTextField.tsx similarity index 100% rename from src/components/Table/EditorCellTextField.tsx rename to src/components/Table/TableCell/EditorCellTextField.tsx diff --git a/src/components/Table/CellValidation.tsx b/src/components/Table/TableCell/TableCell.tsx similarity index 87% rename from src/components/Table/CellValidation.tsx rename to src/components/Table/TableCell/TableCell.tsx index c7589786..48fb7b93 100644 --- a/src/components/Table/CellValidation.tsx +++ b/src/components/Table/TableCell/TableCell.tsx @@ -1,5 +1,5 @@ import { memo } from "react"; -import { useAtom, useSetAtom } from "jotai"; +import { useSetAtom } from "jotai"; import { ErrorBoundary } from "react-error-boundary"; import { flexRender } from "@tanstack/react-table"; import type { Row, Cell } from "@tanstack/react-table"; @@ -8,7 +8,7 @@ import { styled } from "@mui/material/styles"; import ErrorIcon from "@mui/icons-material/ErrorOutline"; import WarningIcon from "@mui/icons-material/WarningAmber"; -import StyledCell from "./Styled/StyledCell"; +import StyledCell from "@src/components/Table/Styled/StyledCell"; import { InlineErrorFallback } from "@src/components/ErrorFallback"; import RichTooltip from "@src/components/RichTooltip"; @@ -18,7 +18,7 @@ import { contextMenuTargetAtom, } from "@src/atoms/tableScope"; import type { TableRow } from "@src/types/table"; -import type { ITableCellProps } from "./withTableCell"; +import type { IRenderedTableCellProps } from "./withRenderTableCell"; const Dot = styled("div")(({ theme }) => ({ position: "absolute", @@ -39,31 +39,34 @@ const Dot = styled("div")(({ theme }) => ({ }, })); -export interface ICellValidationProps { +export interface ITableCellProps { row: Row; cell: Cell; index: number; isSelectedCell: boolean; + focusInsideCell: boolean; isReadOnlyCell: boolean; canEditCells: boolean; rowHeight: number; - lastFrozen?: string; + isLastFrozen: boolean; + width: number; left?: number; } -export const CellValidation = memo(function MemoizedCellValidation({ +export const TableCell = memo(function TableCell({ row, cell, index, isSelectedCell, + focusInsideCell, isReadOnlyCell, canEditCells, rowHeight, - lastFrozen, + isLastFrozen, + width, left, -}: ICellValidationProps) { - const [selectedCell, setSelectedCell] = useAtom(selectedCellAtom, tableScope); - const focusInsideCell = selectedCell?.focusInside ?? false; +}: ITableCellProps) { + const setSelectedCell = useSetAtom(selectedCellAtom, tableScope); const setContextMenuTarget = useSetAtom(contextMenuTargetAtom, tableScope); const value = cell.getValue(); @@ -97,10 +100,10 @@ export const CellValidation = memo(function MemoizedCellValidation({ ); } - const tableCellComponentProps: ITableCellProps = { + const tableCellComponentProps: IRenderedTableCellProps = { ...cell.getContext(), value, - focusInsideCell: isSelectedCell && focusInsideCell, + focusInsideCell, setFocusInsideCell: (focusInside: boolean) => setSelectedCell({ path: row.original._rowy_ref.path, @@ -117,7 +120,7 @@ export const CellValidation = memo(function MemoizedCellValidation({ data-row-id={row.id} data-col-id={cell.column.id} data-frozen={cell.column.getIsPinned() || undefined} - data-frozen-last={lastFrozen === cell.column.id || undefined} + data-frozen-last={isLastFrozen || undefined} role="gridcell" tabIndex={isSelectedCell && !focusInsideCell ? 0 : -1} aria-colindex={index + 1} @@ -133,7 +136,7 @@ export const CellValidation = memo(function MemoizedCellValidation({ } aria-invalid={isInvalid || isMissing} style={{ - width: cell.column.getSize(), + width, height: rowHeight, left, backgroundColor: @@ -178,4 +181,4 @@ export const CellValidation = memo(function MemoizedCellValidation({ ); }); -export default CellValidation; +export default TableCell; diff --git a/src/components/Table/TableCell/index.ts b/src/components/Table/TableCell/index.ts new file mode 100644 index 00000000..f876b4de --- /dev/null +++ b/src/components/Table/TableCell/index.ts @@ -0,0 +1,2 @@ +export { default } from "./TableCell"; +export * from "./TableCell"; diff --git a/src/components/Table/withTableCell.tsx b/src/components/Table/TableCell/withRenderTableCell.tsx similarity index 98% rename from src/components/Table/withTableCell.tsx rename to src/components/Table/TableCell/withRenderTableCell.tsx index c281423d..3a4d2d5f 100644 --- a/src/components/Table/withTableCell.tsx +++ b/src/components/Table/TableCell/withRenderTableCell.tsx @@ -32,7 +32,7 @@ export interface ICellOptions { popoverProps?: Partial; } -export interface ITableCellProps +export interface IRenderedTableCellProps extends CellContext { value: TValue; focusInsideCell: boolean; @@ -60,7 +60,7 @@ export default function withTableCell( options: ICellOptions = {} ) { return memo( - function TableCell({ + function RenderedTableCell({ row, column, value, @@ -68,7 +68,7 @@ export default function withTableCell( setFocusInsideCell, disabled, rowHeight, - }: ITableCellProps) { + }: IRenderedTableCellProps) { // Render inline editor cell after timeout on mount // to improve scroll performance const [inlineEditorReady, setInlineEditorReady] = useState(false); diff --git a/src/components/Table/TableHeader.tsx b/src/components/Table/TableHeader.tsx index b90bf178..ac93d566 100644 --- a/src/components/Table/TableHeader.tsx +++ b/src/components/Table/TableHeader.tsx @@ -2,14 +2,12 @@ import { memo } from "react"; import { useAtom } from "jotai"; import { DragDropContext, Droppable, Draggable } from "react-beautiful-dnd"; import type { DropResult } from "react-beautiful-dnd"; -import type { HeaderGroup } from "@tanstack/react-table"; +import type { ColumnSizingState, HeaderGroup } from "@tanstack/react-table"; import type { TableRow } from "@src/types/table"; import StyledRow from "./Styled/StyledRow"; import ColumnHeader from "./ColumnHeader"; -import StyledResizer from "./Styled/StyledResizer"; import FinalColumnHeader from "./FinalColumn/FinalColumnHeader"; -import { DragVertical } from "@src/assets/icons"; import { tableScope, selectedCellAtom } from "@src/atoms/tableScope"; import { DEFAULT_ROW_HEIGHT } from "@src/components/Table"; @@ -20,6 +18,9 @@ export interface ITableHeaderProps { canAddColumns: boolean; canEditColumns: boolean; lastFrozen?: string; + + /** Re-render when local column sizing changes */ + columnSizing: ColumnSizingState; } export const TableHeader = memo(function TableHeader({ @@ -29,8 +30,8 @@ export const TableHeader = memo(function TableHeader({ canEditColumns, lastFrozen, }: ITableHeaderProps) { - const [selectedCell, setSelectedCell] = useAtom(selectedCellAtom, tableScope); - const focusInsideCell = selectedCell?.focusInside ?? false; + const [selectedCell] = useAtom(selectedCellAtom, tableScope); + const focusInside = selectedCell?.focusInside ?? false; return ( @@ -58,7 +59,7 @@ export const TableHeader = memo(function TableHeader({ data-row-id={"_rowy_header"} data-col-id={header.id} tabIndex={isSelectedCell ? 0 : -1} - focusInsideCell={isSelectedCell && focusInsideCell} + focusInsideCell={isSelectedCell && focusInside} aria-colindex={header.index + 1} aria-readonly={!canEditColumns} aria-selected={isSelectedCell} @@ -78,105 +79,16 @@ export const TableHeader = memo(function TableHeader({ > {(provided, snapshot) => ( { - setSelectedCell({ - path: "_rowy_header", - columnKey: header.id, - focusInside: false, - }); - (e.target as HTMLDivElement).focus(); - }} - onDoubleClick={(e) => { - setSelectedCell({ - path: "_rowy_header", - columnKey: header.id, - focusInside: true, - }); - (e.target as HTMLDivElement).focus(); - }} - focusInsideCell={isSelectedCell && focusInsideCell} - > -
    - - theme.transitions.create(["opacity"]), - "[role='columnheader']:hover &, [role='columnheader']:focus-within &": - { - opacity: 0.5, - }, - ".column-drag-handle:hover &": { - opacity: 1, - }, - ".column-drag-handle:active &": { - opacity: 1, - color: "primary.main", - }, - ".column-drag-handle:focus &": { - opacity: 1, - color: "primary.main", - outline: "2px solid", - outlineColor: "primary.main", - }, - }} - style={{ width: 8 }} - preserveAspectRatio="xMidYMid slice" - /> -
    - - {header.column.getCanResize() && ( - - )} -
    + isSelectedCell={isSelectedCell} + focusInsideCell={isSelectedCell && focusInside} + canEditColumns={canEditColumns} + isLastFrozen={lastFrozen === header.id} + /> )} ); diff --git a/src/components/Table/TableSkeleton.tsx b/src/components/Table/TableSkeleton.tsx index 065770fc..6bfaa051 100644 --- a/src/components/Table/TableSkeleton.tsx +++ b/src/components/Table/TableSkeleton.tsx @@ -4,7 +4,7 @@ import { colord } from "colord"; import { Fade, Stack, Skeleton, Button } from "@mui/material"; import { AddColumn as AddColumnIcon } from "@src/assets/icons"; -import Column from "./Column"; +import Column from "./Mock/Column"; import { projectScope, userSettingsAtom } from "@src/atoms/projectScope"; import { diff --git a/src/components/TableModals/ImportAirtableWizard/Step1Columns.tsx b/src/components/TableModals/ImportAirtableWizard/Step1Columns.tsx index ea86e2c4..06235545 100644 --- a/src/components/TableModals/ImportAirtableWizard/Step1Columns.tsx +++ b/src/components/TableModals/ImportAirtableWizard/Step1Columns.tsx @@ -22,7 +22,9 @@ import { TableColumn as TableColumnIcon } from "@src/assets/icons"; import { IStepProps } from "."; import { AirtableConfig } from "@src/components/TableModals/ImportAirtableWizard"; import FadeList from "@src/components/TableModals/ScrollableList"; -import Column, { COLUMN_HEADER_HEIGHT } from "@src/components/Table/Column"; +import Column, { + COLUMN_HEADER_HEIGHT, +} from "@src/components/Table/Mock/Column"; import ColumnSelect from "@src/components/Table/ColumnSelect"; import { diff --git a/src/components/TableModals/ImportAirtableWizard/Step2NewColumns.tsx b/src/components/TableModals/ImportAirtableWizard/Step2NewColumns.tsx index e3b81ece..105d6f58 100644 --- a/src/components/TableModals/ImportAirtableWizard/Step2NewColumns.tsx +++ b/src/components/TableModals/ImportAirtableWizard/Step2NewColumns.tsx @@ -6,8 +6,8 @@ import ChevronRightIcon from "@mui/icons-material/ChevronRight"; import { IStepProps } from "."; import ScrollableList from "@src/components/TableModals/ScrollableList"; -import Column from "@src/components/Table/Column"; -import Cell from "@src/components/Table/Cell"; +import Column from "@src/components/Table/Mock/Column"; +import Cell from "@src/components/Table/Mock/Cell"; import FieldsDropdown from "@src/components/ColumnModals/FieldsDropdown"; import { FieldType } from "@src/constants/fields"; import { SELECTABLE_TYPES } from "@src/components/TableModals/ImportExistingWizard/utils"; diff --git a/src/components/TableModals/ImportAirtableWizard/Step3Preview.tsx b/src/components/TableModals/ImportAirtableWizard/Step3Preview.tsx index ae5c0ee8..fa9f4d4a 100644 --- a/src/components/TableModals/ImportAirtableWizard/Step3Preview.tsx +++ b/src/components/TableModals/ImportAirtableWizard/Step3Preview.tsx @@ -2,8 +2,8 @@ import { useAtom } from "jotai"; import { find } from "lodash-es"; import { styled, Grid } from "@mui/material"; -import Column from "@src/components/Table/Column"; -import Cell from "@src/components/Table/Cell"; +import Column from "@src/components/Table/Mock/Column"; +import Cell from "@src/components/Table/Mock/Cell"; import { IStepProps } from "."; import { tableScope, tableSchemaAtom } from "@src/atoms/tableScope"; diff --git a/src/components/TableModals/ImportCsvWizard/Step1Columns.tsx b/src/components/TableModals/ImportCsvWizard/Step1Columns.tsx index 3189cf3e..684584ec 100644 --- a/src/components/TableModals/ImportCsvWizard/Step1Columns.tsx +++ b/src/components/TableModals/ImportCsvWizard/Step1Columns.tsx @@ -26,7 +26,9 @@ import { TableColumn as TableColumnIcon } from "@src/assets/icons"; import { IStepProps } from "."; import { CsvConfig } from "@src/components/TableModals/ImportCsvWizard"; import FadeList from "@src/components/TableModals/ScrollableList"; -import Column, { COLUMN_HEADER_HEIGHT } from "@src/components/Table/Column"; +import Column, { + COLUMN_HEADER_HEIGHT, +} from "@src/components/Table/Mock/Column"; import ColumnSelect from "@src/components/Table/ColumnSelect"; import { diff --git a/src/components/TableModals/ImportCsvWizard/Step2NewColumns.tsx b/src/components/TableModals/ImportCsvWizard/Step2NewColumns.tsx index b47f6afe..6bd3a264 100644 --- a/src/components/TableModals/ImportCsvWizard/Step2NewColumns.tsx +++ b/src/components/TableModals/ImportCsvWizard/Step2NewColumns.tsx @@ -7,8 +7,8 @@ import ChevronRightIcon from "@mui/icons-material/ChevronRight"; import { IStepProps } from "."; import ScrollableList from "@src/components/TableModals/ScrollableList"; -import Column from "@src/components/Table/Column"; -import Cell from "@src/components/Table/Cell"; +import Column from "@src/components/Table/Mock/Column"; +import Cell from "@src/components/Table/Mock/Cell"; import FieldsDropdown from "@src/components/ColumnModals/FieldsDropdown"; import { FieldType } from "@src/constants/fields"; diff --git a/src/components/TableModals/ImportCsvWizard/Step3Preview.tsx b/src/components/TableModals/ImportCsvWizard/Step3Preview.tsx index 8c1addb3..c17608fc 100644 --- a/src/components/TableModals/ImportCsvWizard/Step3Preview.tsx +++ b/src/components/TableModals/ImportCsvWizard/Step3Preview.tsx @@ -3,8 +3,8 @@ import { find } from "lodash-es"; import { parseJSON } from "date-fns"; import { styled, Grid } from "@mui/material"; -import Column from "@src/components/Table/Column"; -import Cell from "@src/components/Table/Cell"; +import Column from "@src/components/Table/Mock/Column"; +import Cell from "@src/components/Table/Mock/Cell"; import { IStepProps } from "."; import { tableScope, tableSchemaAtom } from "@src/atoms/tableScope"; diff --git a/src/components/TableModals/ImportExistingWizard/Step1Columns.tsx b/src/components/TableModals/ImportExistingWizard/Step1Columns.tsx index 97563c10..29d5903f 100644 --- a/src/components/TableModals/ImportExistingWizard/Step1Columns.tsx +++ b/src/components/TableModals/ImportExistingWizard/Step1Columns.tsx @@ -20,7 +20,7 @@ import DragHandleIcon from "@mui/icons-material/DragHandle"; import { AddColumn as AddColumnIcon } from "@src/assets/icons"; import ScrollableList from "@src/components/TableModals/ScrollableList"; -import Column from "@src/components/Table/Column"; +import Column from "@src/components/Table/Mock/Column"; import EmptyState from "@src/components/EmptyState"; import { tableScope, tableRowsAtom } from "@src/atoms/tableScope"; diff --git a/src/components/TableModals/ImportExistingWizard/Step2Rename.tsx b/src/components/TableModals/ImportExistingWizard/Step2Rename.tsx index 0b13ed11..d4bf3faf 100644 --- a/src/components/TableModals/ImportExistingWizard/Step2Rename.tsx +++ b/src/components/TableModals/ImportExistingWizard/Step2Rename.tsx @@ -14,7 +14,9 @@ import DoneIcon from "@mui/icons-material/Done"; import { IStepProps } from "."; import ScrollableList from "@src/components/TableModals/ScrollableList"; -import Column, { COLUMN_HEADER_HEIGHT } from "@src/components/Table/Column"; +import Column, { + COLUMN_HEADER_HEIGHT, +} from "@src/components/Table/Mock/Column"; export default function Step2Rename({ config, diff --git a/src/components/TableModals/ImportExistingWizard/Step3Types.tsx b/src/components/TableModals/ImportExistingWizard/Step3Types.tsx index 2cebf092..f4c9be37 100644 --- a/src/components/TableModals/ImportExistingWizard/Step3Types.tsx +++ b/src/components/TableModals/ImportExistingWizard/Step3Types.tsx @@ -6,8 +6,8 @@ import ChevronRightIcon from "@mui/icons-material/ChevronRight"; import { IStepProps } from "."; import ScrollableList from "@src/components/TableModals/ScrollableList"; -import Column from "@src/components/Table/Column"; -import Cell from "@src/components/Table/Cell"; +import Column from "@src/components/Table/Mock/Column"; +import Cell from "@src/components/Table/Mock/Cell"; import FieldsDropdown from "@src/components/ColumnModals/FieldsDropdown"; import { tableScope, tableRowsAtom } from "@src/atoms/tableScope"; diff --git a/src/components/TableModals/ImportExistingWizard/Step4Preview.tsx b/src/components/TableModals/ImportExistingWizard/Step4Preview.tsx index 3852f8a5..8fb9be9e 100644 --- a/src/components/TableModals/ImportExistingWizard/Step4Preview.tsx +++ b/src/components/TableModals/ImportExistingWizard/Step4Preview.tsx @@ -2,8 +2,8 @@ import { useAtom } from "jotai"; import { IStepProps } from "."; import { styled, Grid } from "@mui/material"; -import Column from "@src/components/Table/Column"; -import Cell from "@src/components/Table/Cell"; +import Column from "@src/components/Table/Mock/Column"; +import Cell from "@src/components/Table/Mock/Cell"; import { tableScope, tableRowsAtom } from "@src/atoms/tableScope"; diff --git a/src/components/fields/Action/index.tsx b/src/components/fields/Action/index.tsx index 0677e7e4..e2e8c1bd 100644 --- a/src/components/fields/Action/index.tsx +++ b/src/components/fields/Action/index.tsx @@ -1,6 +1,6 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withTableCell from "@src/components/Table/withTableCell"; +import withRenderTableCell from "@src/components/Table/TableCell/withRenderTableCell"; import ActionIcon from "@mui/icons-material/TouchAppOutlined"; import DisplayCell from "./DisplayCell"; @@ -24,7 +24,7 @@ export const config: IFieldConfig = { icon: , description: "Button with pre-defined action script or triggers a Cloud Function. Optionally supports Undo and Redo.", - TableCell: withTableCell(DisplayCell, EditorCell, "inline", { + TableCell: withRenderTableCell(DisplayCell, EditorCell, "inline", { disablePadding: true, }), SideDrawerField, diff --git a/src/components/fields/Checkbox/index.tsx b/src/components/fields/Checkbox/index.tsx index 291d074c..24039351 100644 --- a/src/components/fields/Checkbox/index.tsx +++ b/src/components/fields/Checkbox/index.tsx @@ -1,6 +1,6 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withTableCell from "@src/components/Table/withTableCell"; +import withRenderTableCell from "@src/components/Table/TableCell/withRenderTableCell"; import CheckboxIcon from "@mui/icons-material/ToggleOnOutlined"; import DisplayCell from "./DisplayCell"; @@ -24,7 +24,7 @@ export const config: IFieldConfig = { initializable: true, icon: , description: "True/false value. Default: false.", - TableCell: withTableCell(DisplayCell, EditorCell, "inline", { + TableCell: withRenderTableCell(DisplayCell, EditorCell, "inline", { usesRowData: true, }), csvImportParser: (value: string) => { diff --git a/src/components/fields/Code/index.tsx b/src/components/fields/Code/index.tsx index 72738586..d3ca01ec 100644 --- a/src/components/fields/Code/index.tsx +++ b/src/components/fields/Code/index.tsx @@ -1,6 +1,6 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withTableCell from "@src/components/Table/withTableCell"; +import withRenderTableCell from "@src/components/Table/TableCell/withRenderTableCell"; import CodeIcon from "@mui/icons-material/Code"; import DisplayCell from "./DisplayCell"; @@ -23,7 +23,7 @@ export const config: IFieldConfig = { initializable: true, icon: , description: "Raw code edited with the Monaco Editor.", - TableCell: withTableCell(DisplayCell, SideDrawerField, "popover", { + TableCell: withRenderTableCell(DisplayCell, SideDrawerField, "popover", { popoverProps: { anchorOrigin: { vertical: "top", horizontal: "center" }, PaperProps: { sx: { borderRadius: 1 } }, diff --git a/src/components/fields/Color/index.tsx b/src/components/fields/Color/index.tsx index 140593a3..ad626bd5 100644 --- a/src/components/fields/Color/index.tsx +++ b/src/components/fields/Color/index.tsx @@ -1,6 +1,6 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withTableCell from "@src/components/Table/withTableCell"; +import withRenderTableCell from "@src/components/Table/TableCell/withRenderTableCell"; import { toColor } from "react-color-palette"; import ColorIcon from "@mui/icons-material/Colorize"; @@ -25,7 +25,7 @@ export const config: IFieldConfig = { icon: , description: "Color stored as Hex, RGB, and HSV. Edited with a visual picker.", - TableCell: withTableCell(DisplayCell, EditorCell, "popover", { + TableCell: withRenderTableCell(DisplayCell, EditorCell, "popover", { disablePadding: true, }), SideDrawerField, diff --git a/src/components/fields/ConnectService/DisplayCell.tsx b/src/components/fields/ConnectService/DisplayCell.tsx index 2dd91bd8..9e8177bf 100644 --- a/src/components/fields/ConnectService/DisplayCell.tsx +++ b/src/components/fields/ConnectService/DisplayCell.tsx @@ -3,7 +3,7 @@ import { IDisplayCellProps } from "@src/components/fields/types"; import { ButtonBase, Grid, Chip } from "@mui/material"; import { ChevronDown } from "@src/assets/icons"; -import ChipList from "@src/components/Table/ChipList"; +import ChipList from "@src/components/Table/TableCell/ChipList"; import { get } from "lodash-es"; export default function ConnectService({ diff --git a/src/components/fields/ConnectService/index.tsx b/src/components/fields/ConnectService/index.tsx index 2495b867..f58219ca 100644 --- a/src/components/fields/ConnectService/index.tsx +++ b/src/components/fields/ConnectService/index.tsx @@ -1,6 +1,6 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withTableCell from "@src/components/Table/withTableCell"; +import withRenderTableCell from "@src/components/Table/TableCell/withRenderTableCell"; import ConnectServiceIcon from "@mui/icons-material/Http"; import DisplayCell from "./DisplayCell"; @@ -28,7 +28,7 @@ export const config: IFieldConfig = { icon: , description: "Connects to an external web service to fetch a list of results.", - TableCell: withTableCell(DisplayCell, EditorCell, "popover", { + TableCell: withRenderTableCell(DisplayCell, EditorCell, "popover", { disablePadding: true, transparentPopover: true, }), diff --git a/src/components/fields/ConnectTable/DisplayCell.tsx b/src/components/fields/ConnectTable/DisplayCell.tsx index 90ca35af..de750aa8 100644 --- a/src/components/fields/ConnectTable/DisplayCell.tsx +++ b/src/components/fields/ConnectTable/DisplayCell.tsx @@ -3,7 +3,7 @@ import { IDisplayCellProps } from "@src/components/fields/types"; import { ButtonBase, Grid, Chip } from "@mui/material"; import { ChevronDown } from "@src/assets/icons"; -import ChipList from "@src/components/Table/ChipList"; +import ChipList from "@src/components/Table/TableCell/ChipList"; export default function ConnectTable({ value, diff --git a/src/components/fields/ConnectTable/index.tsx b/src/components/fields/ConnectTable/index.tsx index e5cd002b..f4a0ca38 100644 --- a/src/components/fields/ConnectTable/index.tsx +++ b/src/components/fields/ConnectTable/index.tsx @@ -1,6 +1,6 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withTableCell from "@src/components/Table/withTableCell"; +import withRenderTableCell from "@src/components/Table/TableCell/withRenderTableCell"; import { ConnectTable as ConnectTableIcon } from "@src/assets/icons"; import DisplayCell from "./DisplayCell"; @@ -28,7 +28,7 @@ export const config: IFieldConfig = { icon: , description: "Connects to an existing table to fetch a snapshot of values from a row. Requires Rowy Run and Algolia setup.", - TableCell: withTableCell(DisplayCell, EditorCell, "popover", { + TableCell: withRenderTableCell(DisplayCell, EditorCell, "popover", { disablePadding: true, transparentPopover: true, }), diff --git a/src/components/fields/Connector/DisplayCell.tsx b/src/components/fields/Connector/DisplayCell.tsx index 6576204a..e31e3d18 100644 --- a/src/components/fields/Connector/DisplayCell.tsx +++ b/src/components/fields/Connector/DisplayCell.tsx @@ -3,7 +3,7 @@ import { IDisplayCellProps } from "@src/components/fields/types"; import { ButtonBase, Grid, Chip } from "@mui/material"; import { ChevronDown } from "@src/assets/icons"; -import ChipList from "@src/components/Table/ChipList"; +import ChipList from "@src/components/Table/TableCell/ChipList"; import { get } from "lodash-es"; import { getLabel } from "./utils"; diff --git a/src/components/fields/Connector/index.tsx b/src/components/fields/Connector/index.tsx index 7946e82b..a0e239d1 100644 --- a/src/components/fields/Connector/index.tsx +++ b/src/components/fields/Connector/index.tsx @@ -1,6 +1,6 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withTableCell from "@src/components/Table/withTableCell"; +import withRenderTableCell from "@src/components/Table/TableCell/withRenderTableCell"; import ConnectorIcon from "@mui/icons-material/Cable"; import DisplayCell from "./DisplayCell"; @@ -29,7 +29,7 @@ export const config: IFieldConfig = { icon: , description: "Connects to any table or API to fetch a list of results based on a text query or row data.", - TableCell: withTableCell(DisplayCell, EditorCell, "popover", { + TableCell: withRenderTableCell(DisplayCell, EditorCell, "popover", { disablePadding: true, }), SideDrawerField, diff --git a/src/components/fields/CreatedAt/index.tsx b/src/components/fields/CreatedAt/index.tsx index 151466fe..cffa0ea8 100644 --- a/src/components/fields/CreatedAt/index.tsx +++ b/src/components/fields/CreatedAt/index.tsx @@ -1,6 +1,6 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withTableCell from "@src/components/Table/withTableCell"; +import withRenderTableCell from "@src/components/Table/TableCell/withRenderTableCell"; import { CreatedAt as CreatedAtIcon } from "@src/assets/icons"; import DisplayCell from "./DisplayCell"; @@ -24,7 +24,7 @@ export const config: IFieldConfig = { initialValue: null, icon: , description: "Displays the timestamp of when the row was created. Read-only.", - TableCell: withTableCell(DisplayCell, null), + TableCell: withRenderTableCell(DisplayCell, null), SideDrawerField, settings: Settings, }; diff --git a/src/components/fields/CreatedBy/index.tsx b/src/components/fields/CreatedBy/index.tsx index 8bb0329c..98fe8cb6 100644 --- a/src/components/fields/CreatedBy/index.tsx +++ b/src/components/fields/CreatedBy/index.tsx @@ -1,6 +1,6 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withTableCell from "@src/components/Table/withTableCell"; +import withRenderTableCell from "@src/components/Table/TableCell/withRenderTableCell"; import { CreatedBy as CreatedByIcon } from "@src/assets/icons"; import DisplayCell from "./DisplayCell"; @@ -25,7 +25,7 @@ export const config: IFieldConfig = { icon: , description: "Displays the user that created the row and timestamp. Read-only.", - TableCell: withTableCell(DisplayCell, null), + TableCell: withRenderTableCell(DisplayCell, null), SideDrawerField, settings: Settings, }; diff --git a/src/components/fields/Date/index.tsx b/src/components/fields/Date/index.tsx index 1ff9b01a..7078e1f1 100644 --- a/src/components/fields/Date/index.tsx +++ b/src/components/fields/Date/index.tsx @@ -1,6 +1,6 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withTableCell from "@src/components/Table/withTableCell"; +import withRenderTableCell from "@src/components/Table/TableCell/withRenderTableCell"; import { parse, format } from "date-fns"; import { DATE_FORMAT } from "@src/constants/dates"; @@ -28,7 +28,7 @@ export const config: IFieldConfig = { initializable: true, icon: , description: `Formatted date. Format is configurable, default: ${DATE_FORMAT}. Edited with a visual picker.`, - TableCell: withTableCell(DisplayCell, EditorCell, "focus", { + TableCell: withRenderTableCell(DisplayCell, EditorCell, "focus", { disablePadding: true, }), SideDrawerField, diff --git a/src/components/fields/DateTime/index.tsx b/src/components/fields/DateTime/index.tsx index cc247b97..d414fb6e 100644 --- a/src/components/fields/DateTime/index.tsx +++ b/src/components/fields/DateTime/index.tsx @@ -1,6 +1,6 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withTableCell from "@src/components/Table/withTableCell"; +import withRenderTableCell from "@src/components/Table/TableCell/withRenderTableCell"; import { parseJSON, format } from "date-fns"; import { DATE_TIME_FORMAT } from "@src/constants/dates"; @@ -36,7 +36,7 @@ export const config: IFieldConfig = { initializable: true, icon: , description: `Formatted date & time. Format is configurable, default: ${DATE_TIME_FORMAT}. Edited with a visual picker.`, - TableCell: withTableCell(DisplayCell, EditorCell, "focus", { + TableCell: withRenderTableCell(DisplayCell, EditorCell, "focus", { disablePadding: true, }), SideDrawerField, diff --git a/src/components/fields/Derivative/index.tsx b/src/components/fields/Derivative/index.tsx index f37897ed..d046b4d3 100644 --- a/src/components/fields/Derivative/index.tsx +++ b/src/components/fields/Derivative/index.tsx @@ -1,5 +1,5 @@ import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withTableCell from "@src/components/Table/withTableCell"; +import withRenderTableCell from "@src/components/Table/TableCell/withRenderTableCell"; import { Derivative as DerivativeIcon } from "@src/assets/icons"; import Settings, { settingsValidator } from "./Settings"; @@ -15,7 +15,7 @@ export const config: IFieldConfig = { icon: , description: "Value derived from the rest of the row’s values. Displayed using any other field type. Requires Rowy Run set up.", - TableCell: withTableCell(() => null, null), + TableCell: withRenderTableCell(() => null, null), SideDrawerField: () => null as any, contextMenuActions: ContextMenuActions, settings: Settings, diff --git a/src/components/fields/Duration/index.tsx b/src/components/fields/Duration/index.tsx index 56f05132..225906ba 100644 --- a/src/components/fields/Duration/index.tsx +++ b/src/components/fields/Duration/index.tsx @@ -1,6 +1,6 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withTableCell from "@src/components/Table/withTableCell"; +import withRenderTableCell from "@src/components/Table/TableCell/withRenderTableCell"; import DurationIcon from "@mui/icons-material/TimerOutlined"; import DisplayCell from "./DisplayCell"; @@ -20,7 +20,7 @@ export const config: IFieldConfig = { initialValue: {}, icon: , description: "Duration calculated from two timestamps.", - TableCell: withTableCell(DisplayCell, SideDrawerField, "popover", { + TableCell: withRenderTableCell(DisplayCell, SideDrawerField, "popover", { popoverProps: { PaperProps: { sx: { p: 1 } } }, }), SideDrawerField, diff --git a/src/components/fields/Email/EditorCell.tsx b/src/components/fields/Email/EditorCell.tsx index c14a114a..bdc0d823 100644 --- a/src/components/fields/Email/EditorCell.tsx +++ b/src/components/fields/Email/EditorCell.tsx @@ -1,5 +1,5 @@ import type { IEditorCellProps } from "@src/components/fields/types"; -import EditorCellTextField from "@src/components/Table/EditorCellTextField"; +import EditorCellTextField from "@src/components/Table/TableCell/EditorCellTextField"; export default function Email(props: IEditorCellProps) { return ; diff --git a/src/components/fields/Email/index.tsx b/src/components/fields/Email/index.tsx index 1450f513..3ea395d8 100644 --- a/src/components/fields/Email/index.tsx +++ b/src/components/fields/Email/index.tsx @@ -1,6 +1,6 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withTableCell from "@src/components/Table/withTableCell"; +import withRenderTableCell from "@src/components/Table/TableCell/withRenderTableCell"; import EmailIcon from "@mui/icons-material/MailOutlined"; import DisplayCell from "@src/components/fields/ShortText/DisplayCell"; @@ -23,7 +23,7 @@ export const config: IFieldConfig = { icon: , description: "Email address. Not validated.", contextMenuActions: BasicContextMenuActions, - TableCell: withTableCell(DisplayCell, EditorCell), + TableCell: withRenderTableCell(DisplayCell, EditorCell), SideDrawerField, filter: { operators: filterOperators, diff --git a/src/components/fields/File/DisplayCell.tsx b/src/components/fields/File/DisplayCell.tsx index 2183f902..36d82d64 100644 --- a/src/components/fields/File/DisplayCell.tsx +++ b/src/components/fields/File/DisplayCell.tsx @@ -1,7 +1,7 @@ import { IDisplayCellProps } from "@src/components/fields/types"; import { Grid, Chip } from "@mui/material"; -import ChipList from "@src/components/Table/ChipList"; +import ChipList from "@src/components/Table/TableCell/ChipList"; import { FileIcon } from "."; import { FileValue } from "@src/types/table"; diff --git a/src/components/fields/File/EditorCell.tsx b/src/components/fields/File/EditorCell.tsx index ed5ba74b..c738f9d4 100644 --- a/src/components/fields/File/EditorCell.tsx +++ b/src/components/fields/File/EditorCell.tsx @@ -8,7 +8,7 @@ import { format } from "date-fns"; import { alpha, Stack, Grid, Tooltip, Chip, IconButton } from "@mui/material"; import { Upload as UploadIcon } from "@src/assets/icons"; -import ChipList from "@src/components/Table/ChipList"; +import ChipList from "@src/components/Table/TableCell/ChipList"; import CircularProgressOptical from "@src/components/CircularProgressOptical"; import { projectScope, confirmDialogAtom } from "@src/atoms/projectScope"; diff --git a/src/components/fields/File/index.tsx b/src/components/fields/File/index.tsx index 2f883954..33ab5021 100644 --- a/src/components/fields/File/index.tsx +++ b/src/components/fields/File/index.tsx @@ -1,6 +1,6 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withTableCell from "@src/components/Table/withTableCell"; +import withRenderTableCell from "@src/components/Table/TableCell/withRenderTableCell"; import FileIcon from "@mui/icons-material/AttachFile"; import DisplayCell from "./DisplayCell"; @@ -22,7 +22,7 @@ export const config: IFieldConfig = { initialValue: [], icon: , description: "File uploaded to Firebase Storage. Supports any file type.", - TableCell: withTableCell(DisplayCell, EditorCell, "inline", { + TableCell: withRenderTableCell(DisplayCell, EditorCell, "inline", { disablePadding: true, }), SideDrawerField, diff --git a/src/components/fields/GeoPoint/index.tsx b/src/components/fields/GeoPoint/index.tsx index 481198f6..17dc20fb 100644 --- a/src/components/fields/GeoPoint/index.tsx +++ b/src/components/fields/GeoPoint/index.tsx @@ -1,7 +1,7 @@ import { lazy } from "react"; import { GeoPoint } from "firebase/firestore"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withTableCell from "@src/components/Table/withTableCell"; +import withRenderTableCell from "@src/components/Table/TableCell/withRenderTableCell"; import GeoPointIcon from "@mui/icons-material/PinDropOutlined"; import DisplayCell from "./DisplayCell"; @@ -21,7 +21,7 @@ export const config: IFieldConfig = { initialValue: {}, icon: , description: "Geo point is represented as latitude/longitude pair.", - TableCell: withTableCell(DisplayCell, SideDrawerField, "popover", { + TableCell: withRenderTableCell(DisplayCell, SideDrawerField, "popover", { popoverProps: { PaperProps: { sx: { p: 1, pt: 0 } } }, }), SideDrawerField, diff --git a/src/components/fields/Id/index.tsx b/src/components/fields/Id/index.tsx index 0b2a5b85..0215e7fe 100644 --- a/src/components/fields/Id/index.tsx +++ b/src/components/fields/Id/index.tsx @@ -1,6 +1,6 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withTableCell from "@src/components/Table/withTableCell"; +import withRenderTableCell from "@src/components/Table/TableCell/withRenderTableCell"; import DisplayCell from "./DisplayCell"; import { Id as IdIcon } from "@src/assets/icons"; @@ -17,7 +17,7 @@ export const config: IFieldConfig = { initialValue: "", icon: , description: "Displays the row’s ID. Read-only. Cannot be sorted.", - TableCell: withTableCell(DisplayCell, null), + TableCell: withRenderTableCell(DisplayCell, null), SideDrawerField, }; export default config; diff --git a/src/components/fields/Image/index.tsx b/src/components/fields/Image/index.tsx index 1dbcde26..71d5a32d 100644 --- a/src/components/fields/Image/index.tsx +++ b/src/components/fields/Image/index.tsx @@ -1,6 +1,6 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withTableCell from "@src/components/Table/withTableCell"; +import withRenderTableCell from "@src/components/Table/TableCell/withRenderTableCell"; import { Image as ImageIcon } from "@src/assets/icons"; import DisplayCell from "./DisplayCell"; @@ -23,7 +23,7 @@ export const config: IFieldConfig = { icon: , description: "Image file uploaded to Firebase Storage. Supports JPEG, PNG, SVG, GIF, WebP, AVIF, JPEG XL.", - TableCell: withTableCell(DisplayCell, EditorCell, "inline", { + TableCell: withRenderTableCell(DisplayCell, EditorCell, "inline", { disablePadding: true, }), SideDrawerField, diff --git a/src/components/fields/Json/index.tsx b/src/components/fields/Json/index.tsx index a847f009..6804b7c6 100644 --- a/src/components/fields/Json/index.tsx +++ b/src/components/fields/Json/index.tsx @@ -1,6 +1,6 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withTableCell from "@src/components/Table/withTableCell"; +import withRenderTableCell from "@src/components/Table/TableCell/withRenderTableCell"; import { Json as JsonIcon } from "@src/assets/icons"; import DisplayCell from "./DisplayCell"; @@ -24,7 +24,7 @@ export const config: IFieldConfig = { initializable: true, icon: , description: "Object edited with a visual JSON editor.", - TableCell: withTableCell(DisplayCell, SideDrawerField, "popover", { + TableCell: withRenderTableCell(DisplayCell, SideDrawerField, "popover", { popoverProps: { PaperProps: { sx: { p: 1 } } }, }), csvImportParser: (value) => { diff --git a/src/components/fields/LongText/EditorCell.tsx b/src/components/fields/LongText/EditorCell.tsx index ba2824bd..581ce96a 100644 --- a/src/components/fields/LongText/EditorCell.tsx +++ b/src/components/fields/LongText/EditorCell.tsx @@ -1,5 +1,5 @@ import type { IEditorCellProps } from "@src/components/fields/types"; -import EditorCellTextField from "@src/components/Table/EditorCellTextField"; +import EditorCellTextField from "@src/components/Table/TableCell/EditorCellTextField"; export default function LongText(props: IEditorCellProps) { return ; diff --git a/src/components/fields/LongText/index.tsx b/src/components/fields/LongText/index.tsx index 00c79f31..6b926126 100644 --- a/src/components/fields/LongText/index.tsx +++ b/src/components/fields/LongText/index.tsx @@ -1,6 +1,6 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withTableCell from "@src/components/Table/withTableCell"; +import withRenderTableCell from "@src/components/Table/TableCell/withRenderTableCell"; import LongTextIcon from "@mui/icons-material/Notes"; import DisplayCell from "./DisplayCell"; @@ -29,7 +29,7 @@ export const config: IFieldConfig = { icon: , description: "Text displayed on multiple lines.", contextMenuActions: BasicContextMenuActions, - TableCell: withTableCell(DisplayCell, EditorCell), + TableCell: withRenderTableCell(DisplayCell, EditorCell), SideDrawerField, settings: Settings, filter: { diff --git a/src/components/fields/Markdown/index.tsx b/src/components/fields/Markdown/index.tsx index 23776019..26de107b 100644 --- a/src/components/fields/Markdown/index.tsx +++ b/src/components/fields/Markdown/index.tsx @@ -1,6 +1,6 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withTableCell from "@src/components/Table/withTableCell"; +import withRenderTableCell from "@src/components/Table/TableCell/withRenderTableCell"; import { Markdown as MarkdownIcon } from "@src/assets/icons"; import DisplayCell from "./DisplayCell"; @@ -21,7 +21,7 @@ export const config: IFieldConfig = { initializable: true, icon: , description: "Markdown editor with preview", - TableCell: withTableCell(DisplayCell, SideDrawerField, "popover"), + TableCell: withRenderTableCell(DisplayCell, SideDrawerField, "popover"), SideDrawerField, }; export default config; diff --git a/src/components/fields/MultiSelect/DisplayCell.tsx b/src/components/fields/MultiSelect/DisplayCell.tsx index 7554330a..fe7d6b87 100644 --- a/src/components/fields/MultiSelect/DisplayCell.tsx +++ b/src/components/fields/MultiSelect/DisplayCell.tsx @@ -5,7 +5,7 @@ import WarningIcon from "@mui/icons-material/WarningAmber"; import { ChevronDown } from "@src/assets/icons"; import { sanitiseValue } from "./utils"; -import ChipList from "@src/components/Table/ChipList"; +import ChipList from "@src/components/Table/TableCell/ChipList"; import FormattedChip from "@src/components/FormattedChip"; export default function MultiSelect({ diff --git a/src/components/fields/MultiSelect/index.tsx b/src/components/fields/MultiSelect/index.tsx index f6400d1b..19a5cecd 100644 --- a/src/components/fields/MultiSelect/index.tsx +++ b/src/components/fields/MultiSelect/index.tsx @@ -1,6 +1,6 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withTableCell from "@src/components/Table/withTableCell"; +import withRenderTableCell from "@src/components/Table/TableCell/withRenderTableCell"; import { MultiSelect as MultiSelectIcon } from "@src/assets/icons"; import DisplayCell from "./DisplayCell"; @@ -32,7 +32,7 @@ export const config: IFieldConfig = { icon: , description: "Multiple values from predefined options. Options are searchable and users can optionally input custom values.", - TableCell: withTableCell(DisplayCell, EditorCell, "popover", { + TableCell: withRenderTableCell(DisplayCell, EditorCell, "popover", { disablePadding: true, transparentPopover: false, }), diff --git a/src/components/fields/Number/EditorCell.tsx b/src/components/fields/Number/EditorCell.tsx index 5ae634a2..e3594eac 100644 --- a/src/components/fields/Number/EditorCell.tsx +++ b/src/components/fields/Number/EditorCell.tsx @@ -1,5 +1,5 @@ import type { IEditorCellProps } from "@src/components/fields/types"; -import EditorCellTextField from "@src/components/Table/EditorCellTextField"; +import EditorCellTextField from "@src/components/Table/TableCell/EditorCellTextField"; export default function Number_(props: IEditorCellProps) { return ( diff --git a/src/components/fields/Number/index.tsx b/src/components/fields/Number/index.tsx index 0a25fca8..2f04cadd 100644 --- a/src/components/fields/Number/index.tsx +++ b/src/components/fields/Number/index.tsx @@ -1,6 +1,6 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withTableCell from "@src/components/Table/withTableCell"; +import withRenderTableCell from "@src/components/Table/TableCell/withRenderTableCell"; import { Number as NumberIcon } from "@src/assets/icons"; import DisplayCell from "./DisplayCell"; @@ -22,7 +22,7 @@ export const config: IFieldConfig = { icon: , description: "Numeric value.", contextMenuActions: BasicContextMenuActions, - TableCell: withTableCell(DisplayCell, EditorCell), + TableCell: withRenderTableCell(DisplayCell, EditorCell), SideDrawerField, filter: { operators: filterOperators, diff --git a/src/components/fields/Percentage/EditorCell.tsx b/src/components/fields/Percentage/EditorCell.tsx index 16dd9a88..1e3a7e96 100644 --- a/src/components/fields/Percentage/EditorCell.tsx +++ b/src/components/fields/Percentage/EditorCell.tsx @@ -1,5 +1,5 @@ import type { IEditorCellProps } from "@src/components/fields/types"; -import EditorCellTextField from "@src/components/Table/EditorCellTextField"; +import EditorCellTextField from "@src/components/Table/TableCell/EditorCellTextField"; export default function Percentage(props: IEditorCellProps) { return ( diff --git a/src/components/fields/Percentage/index.tsx b/src/components/fields/Percentage/index.tsx index 86ff6fe6..b571b50f 100644 --- a/src/components/fields/Percentage/index.tsx +++ b/src/components/fields/Percentage/index.tsx @@ -1,6 +1,6 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withTableCell from "@src/components/Table/withTableCell"; +import withRenderTableCell from "@src/components/Table/TableCell/withRenderTableCell"; import { Percentage as PercentageIcon } from "@src/assets/icons"; import DisplayCell from "./DisplayCell"; @@ -30,7 +30,7 @@ export const config: IFieldConfig = { requireConfiguration: true, description: "Percentage stored as a number between 0 and 1.", contextMenuActions: BasicContextMenuActions, - TableCell: withTableCell(DisplayCell, EditorCell), + TableCell: withRenderTableCell(DisplayCell, EditorCell), SideDrawerField, settings: Settings, filter: { diff --git a/src/components/fields/Phone/EditorCell.tsx b/src/components/fields/Phone/EditorCell.tsx index 825fd00f..4db1bf0c 100644 --- a/src/components/fields/Phone/EditorCell.tsx +++ b/src/components/fields/Phone/EditorCell.tsx @@ -1,5 +1,5 @@ import type { IEditorCellProps } from "@src/components/fields/types"; -import EditorCellTextField from "@src/components/Table/EditorCellTextField"; +import EditorCellTextField from "@src/components/Table/TableCell/EditorCellTextField"; export default function Phone(props: IEditorCellProps) { return ; diff --git a/src/components/fields/Phone/index.tsx b/src/components/fields/Phone/index.tsx index ec8792a6..0d72c31a 100644 --- a/src/components/fields/Phone/index.tsx +++ b/src/components/fields/Phone/index.tsx @@ -1,6 +1,6 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withTableCell from "@src/components/Table/withTableCell"; +import withRenderTableCell from "@src/components/Table/TableCell/withRenderTableCell"; import PhoneIcon from "@mui/icons-material/PhoneOutlined"; import DisplayCell from "@src/components/fields/ShortText/DisplayCell"; @@ -23,7 +23,7 @@ export const config: IFieldConfig = { icon: , description: "Phone number stored as text. Not validated.", contextMenuActions: BasicContextMenuActions, - TableCell: withTableCell(DisplayCell, EditorCell), + TableCell: withRenderTableCell(DisplayCell, EditorCell), SideDrawerField, filter: { operators: filterOperators, diff --git a/src/components/fields/Rating/index.tsx b/src/components/fields/Rating/index.tsx index eac10ed3..3712ffe7 100644 --- a/src/components/fields/Rating/index.tsx +++ b/src/components/fields/Rating/index.tsx @@ -1,6 +1,6 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withTableCell from "@src/components/Table/withTableCell"; +import withRenderTableCell from "@src/components/Table/TableCell/withRenderTableCell"; import RatingIcon from "@mui/icons-material/StarBorder"; import DisplayCell from "./DisplayCell"; @@ -26,7 +26,7 @@ export const config: IFieldConfig = { requireConfiguration: true, description: "Rating displayed as stars. Max stars is configurable, default: 5 stars.", - TableCell: withTableCell(DisplayCell, EditorCell, "inline"), + TableCell: withRenderTableCell(DisplayCell, EditorCell, "inline"), settings: Settings, SideDrawerField, filter: { diff --git a/src/components/fields/Reference/EditorCell.tsx b/src/components/fields/Reference/EditorCell.tsx index 27232cff..07115fb8 100644 --- a/src/components/fields/Reference/EditorCell.tsx +++ b/src/components/fields/Reference/EditorCell.tsx @@ -3,7 +3,7 @@ import { useAtom } from "jotai"; import { doc, deleteField } from "firebase/firestore"; import type { IEditorCellProps } from "@src/components/fields/types"; -import EditorCellTextField from "@src/components/Table/EditorCellTextField"; +import EditorCellTextField from "@src/components/Table/TableCell/EditorCellTextField"; import { InputAdornment, Tooltip } from "@mui/material"; import ErrorIcon from "@mui/icons-material/ErrorOutline"; diff --git a/src/components/fields/Reference/index.tsx b/src/components/fields/Reference/index.tsx index fcf0345d..c4fdce52 100644 --- a/src/components/fields/Reference/index.tsx +++ b/src/components/fields/Reference/index.tsx @@ -1,6 +1,6 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withTableCell from "@src/components/Table/withTableCell"; +import withRenderTableCell from "@src/components/Table/TableCell/withRenderTableCell"; import { Reference } from "@src/assets/icons"; import DisplayCell from "./DisplayCell"; @@ -23,7 +23,7 @@ export const config: IFieldConfig = { initializable: true, icon: , description: "Firestore document reference", - TableCell: withTableCell(DisplayCell, EditorCell, "focus", { + TableCell: withRenderTableCell(DisplayCell, EditorCell, "focus", { disablePadding: true, }), SideDrawerField, diff --git a/src/components/fields/RichText/index.tsx b/src/components/fields/RichText/index.tsx index bd53d610..c9c1ddbe 100644 --- a/src/components/fields/RichText/index.tsx +++ b/src/components/fields/RichText/index.tsx @@ -1,6 +1,6 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withTableCell from "@src/components/Table/withTableCell"; +import withRenderTableCell from "@src/components/Table/TableCell/withRenderTableCell"; import RichTextIcon from "@mui/icons-material/TextFormat"; import DisplayCell from "./DisplayCell"; @@ -23,7 +23,7 @@ export const config: IFieldConfig = { icon: , description: "HTML edited with a rich text editor.", contextMenuActions: BasicContextMenuActions, - TableCell: withTableCell(DisplayCell, SideDrawerField, "popover"), + TableCell: withRenderTableCell(DisplayCell, SideDrawerField, "popover"), SideDrawerField, }; export default config; diff --git a/src/components/fields/ShortText/EditorCell.tsx b/src/components/fields/ShortText/EditorCell.tsx index 0e34e5a8..123d7892 100644 --- a/src/components/fields/ShortText/EditorCell.tsx +++ b/src/components/fields/ShortText/EditorCell.tsx @@ -1,5 +1,5 @@ import type { IEditorCellProps } from "@src/components/fields/types"; -import EditorCellTextField from "@src/components/Table/EditorCellTextField"; +import EditorCellTextField from "@src/components/Table/TableCell/EditorCellTextField"; export default function ShortText(props: IEditorCellProps) { return ; diff --git a/src/components/fields/ShortText/index.tsx b/src/components/fields/ShortText/index.tsx index 0160a64a..1288f9bb 100644 --- a/src/components/fields/ShortText/index.tsx +++ b/src/components/fields/ShortText/index.tsx @@ -1,6 +1,6 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withTableCell from "@src/components/Table/withTableCell"; +import withRenderTableCell from "@src/components/Table/TableCell/withRenderTableCell"; import ShortTextIcon from "@mui/icons-material/ShortText"; import DisplayCell from "@src/components/fields/ShortText/DisplayCell"; @@ -30,7 +30,7 @@ export const config: IFieldConfig = { icon: , description: "Text displayed on a single line.", contextMenuActions: BasicContextMenuActions, - TableCell: withTableCell(DisplayCell, EditorCell), + TableCell: withRenderTableCell(DisplayCell, EditorCell), SideDrawerField, settings: Settings, filter: { diff --git a/src/components/fields/SingleSelect/index.tsx b/src/components/fields/SingleSelect/index.tsx index 187be997..83a23e3e 100644 --- a/src/components/fields/SingleSelect/index.tsx +++ b/src/components/fields/SingleSelect/index.tsx @@ -1,6 +1,6 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withTableCell from "@src/components/Table/withTableCell"; +import withRenderTableCell from "@src/components/Table/TableCell/withRenderTableCell"; import { SingleSelect as SingleSelectIcon } from "@src/assets/icons"; import DisplayCell from "./DisplayCell"; @@ -27,7 +27,7 @@ export const config: IFieldConfig = { icon: , description: "Single value from predefined options. Options are searchable and users can optionally input custom values.", - TableCell: withTableCell(DisplayCell, EditorCell, "popover", { + TableCell: withRenderTableCell(DisplayCell, EditorCell, "popover", { disablePadding: true, transparentPopover: true, }), diff --git a/src/components/fields/Slider/index.tsx b/src/components/fields/Slider/index.tsx index 6d21dc9d..06f7bce0 100644 --- a/src/components/fields/Slider/index.tsx +++ b/src/components/fields/Slider/index.tsx @@ -1,6 +1,6 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withTableCell from "@src/components/Table/withTableCell"; +import withRenderTableCell from "@src/components/Table/TableCell/withRenderTableCell"; import { Slider as SliderIcon } from "@src/assets/icons"; import DisplayCell from "./DisplayCell"; @@ -24,7 +24,7 @@ export const config: IFieldConfig = { icon: , requireConfiguration: true, description: "Numeric value edited with a Slider. Range is configurable.", - TableCell: withTableCell(DisplayCell, SideDrawerField, "popover", { + TableCell: withRenderTableCell(DisplayCell, SideDrawerField, "popover", { popoverProps: { PaperProps: { sx: { p: 1, pt: 5 } } }, }), settings: Settings, diff --git a/src/components/fields/Status/index.tsx b/src/components/fields/Status/index.tsx index d4d0e978..420a5e11 100644 --- a/src/components/fields/Status/index.tsx +++ b/src/components/fields/Status/index.tsx @@ -1,6 +1,6 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withTableCell from "@src/components/Table/withTableCell"; +import withRenderTableCell from "@src/components/Table/TableCell/withRenderTableCell"; import { Status as StatusIcon } from "@src/assets/icons"; import DisplayCell from "./DisplayCell"; @@ -24,7 +24,7 @@ export const config: IFieldConfig = { initializable: true, icon: , description: "Displays field value as custom status text.", - TableCell: withTableCell(DisplayCell, EditorCell, "popover", { + TableCell: withRenderTableCell(DisplayCell, EditorCell, "popover", { disablePadding: true, transparentPopover: true, }), diff --git a/src/components/fields/SubTable/index.tsx b/src/components/fields/SubTable/index.tsx index 84df815d..7e153771 100644 --- a/src/components/fields/SubTable/index.tsx +++ b/src/components/fields/SubTable/index.tsx @@ -1,6 +1,6 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withTableCell from "@src/components/Table/withTableCell"; +import withRenderTableCell from "@src/components/Table/TableCell/withRenderTableCell"; import { SubTable as SubTableIcon } from "@src/assets/icons"; import DisplayCell from "./DisplayCell"; @@ -24,7 +24,7 @@ export const config: IFieldConfig = { settings: Settings, description: "Connects to a sub-table in the current row. Also displays number of rows inside the sub-table. Max sub-table depth: 100.", - TableCell: withTableCell(DisplayCell, null, "focus", { + TableCell: withRenderTableCell(DisplayCell, null, "focus", { usesRowData: true, disablePadding: true, }), diff --git a/src/components/fields/UpdatedAt/index.tsx b/src/components/fields/UpdatedAt/index.tsx index 9b7476eb..d6e5eb92 100644 --- a/src/components/fields/UpdatedAt/index.tsx +++ b/src/components/fields/UpdatedAt/index.tsx @@ -1,6 +1,6 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withTableCell from "@src/components/Table/withTableCell"; +import withRenderTableCell from "@src/components/Table/TableCell/withRenderTableCell"; import { UpdatedAt as UpdatedAtIcon } from "@src/assets/icons"; import DisplayCell from "./DisplayCell"; @@ -25,7 +25,7 @@ export const config: IFieldConfig = { icon: , description: "Displays the timestamp of the last update to the row. Read-only.", - TableCell: withTableCell(DisplayCell, null), + TableCell: withRenderTableCell(DisplayCell, null), SideDrawerField, settings: Settings, }; diff --git a/src/components/fields/UpdatedBy/index.tsx b/src/components/fields/UpdatedBy/index.tsx index 5ddfb877..4b1c3a42 100644 --- a/src/components/fields/UpdatedBy/index.tsx +++ b/src/components/fields/UpdatedBy/index.tsx @@ -1,6 +1,6 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withTableCell from "@src/components/Table/withTableCell"; +import withRenderTableCell from "@src/components/Table/TableCell/withRenderTableCell"; import { UpdatedBy as UpdatedByIcon } from "@src/assets/icons"; import DisplayCell from "./DisplayCell"; @@ -26,7 +26,7 @@ export const config: IFieldConfig = { icon: , description: "Displays the user that last updated the row, timestamp, and updated field key. Read-only.", - TableCell: withTableCell(DisplayCell, null), + TableCell: withRenderTableCell(DisplayCell, null), SideDrawerField, settings: Settings, }; diff --git a/src/components/fields/Url/EditorCell.tsx b/src/components/fields/Url/EditorCell.tsx index 6f39d2d9..d22c4880 100644 --- a/src/components/fields/Url/EditorCell.tsx +++ b/src/components/fields/Url/EditorCell.tsx @@ -1,5 +1,5 @@ import type { IEditorCellProps } from "@src/components/fields/types"; -import EditorCellTextField from "@src/components/Table/EditorCellTextField"; +import EditorCellTextField from "@src/components/Table/TableCell/EditorCellTextField"; export default function Url(props: IEditorCellProps) { return ; diff --git a/src/components/fields/Url/index.tsx b/src/components/fields/Url/index.tsx index 612423d0..be276388 100644 --- a/src/components/fields/Url/index.tsx +++ b/src/components/fields/Url/index.tsx @@ -1,6 +1,6 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withTableCell from "@src/components/Table/withTableCell"; +import withRenderTableCell from "@src/components/Table/TableCell/withRenderTableCell"; import UrlIcon from "@mui/icons-material/Link"; import DisplayCell from "./DisplayCell"; @@ -23,7 +23,7 @@ export const config: IFieldConfig = { icon: , description: "Web address. Not validated.", contextMenuActions: BasicContextMenuActions, - TableCell: withTableCell(DisplayCell, EditorCell, "focus", { + TableCell: withRenderTableCell(DisplayCell, EditorCell, "focus", { disablePadding: true, }), SideDrawerField, diff --git a/src/components/fields/User/index.tsx b/src/components/fields/User/index.tsx index 29f996d8..b06680df 100644 --- a/src/components/fields/User/index.tsx +++ b/src/components/fields/User/index.tsx @@ -1,6 +1,6 @@ import { lazy } from "react"; import { IFieldConfig, FieldType } from "@src/components/fields/types"; -import withTableCell from "@src/components/Table/withTableCell"; +import withRenderTableCell from "@src/components/Table/TableCell/withRenderTableCell"; import UserIcon from "@mui/icons-material/PersonOutlined"; import DisplayCell from "./DisplayCell"; @@ -23,7 +23,7 @@ export const config: IFieldConfig = { initialValue: null, icon: , description: "User information and optionally, timestamp. Read-only.", - TableCell: withTableCell(DisplayCell, null), + TableCell: withRenderTableCell(DisplayCell, null), SideDrawerField, settings: Settings, }; diff --git a/src/components/fields/types.ts b/src/components/fields/types.ts index e4084365..b43b6d82 100644 --- a/src/components/fields/types.ts +++ b/src/components/fields/types.ts @@ -1,5 +1,5 @@ import { FieldType } from "@src/constants/fields"; -import type { ITableCellProps } from "@src/components/Table/withTableCell"; +import type { IRenderedTableCellProps } from "@src/components/Table/TableCell/withRenderTableCell"; import type { PopoverProps } from "@mui/material"; import type { ColumnConfig, @@ -27,7 +27,7 @@ export interface IFieldConfig { selectedCell: SelectedCell, reset: () => void ) => IContextMenuItem[]; - TableCell: React.ComponentType; + TableCell: React.ComponentType; SideDrawerField: React.ComponentType; settings?: React.ComponentType; settingsValidator?: (config: Record) => Record; diff --git a/src/constants/routes.tsx b/src/constants/routes.tsx index 4b59b687..af23e2cd 100644 --- a/src/constants/routes.tsx +++ b/src/constants/routes.tsx @@ -1,5 +1,5 @@ import Logo from "@src/assets/Logo"; -import BreadcrumbsTableRoot from "@src/components/Table/BreadcrumbsTableRoot"; +import BreadcrumbsTableRoot from "@src/components/Table/Breadcrumbs/BreadcrumbsTableRoot"; import { FadeProps, Typography } from "@mui/material"; export enum ROUTES { diff --git a/src/pages/Table/ProvidedSubTablePage.tsx b/src/pages/Table/ProvidedSubTablePage.tsx index 58380d27..0769d445 100644 --- a/src/pages/Table/ProvidedSubTablePage.tsx +++ b/src/pages/Table/ProvidedSubTablePage.tsx @@ -7,7 +7,7 @@ import { useLocation, useNavigate, useParams } from "react-router-dom"; import { find, isEqual } from "lodash-es"; import Modal from "@src/components/Modal"; -import BreadcrumbsSubTable from "@src/components/Table/BreadcrumbsSubTable"; +import BreadcrumbsSubTable from "@src/components/Table/Breadcrumbs/BreadcrumbsSubTable"; import ErrorFallback from "@src/components/ErrorFallback"; import TableSourceFirestore from "@src/sources/TableSourceFirestore"; import TableToolbarSkeleton from "@src/components/TableToolbar/TableToolbarSkeleton"; From 86b2004215043652f2e8918996a01583f11b554e Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Fri, 18 Nov 2022 14:27:08 +1100 Subject: [PATCH 279/309] fix disabled cell styles --- .../Table/TableCell/EditorCellTextField.tsx | 3 ++- .../Table/TableCell/withRenderTableCell.tsx | 2 +- src/components/fields/Action/DisplayCell.tsx | 17 ++++++++++++++++- src/components/fields/Checkbox/DisplayCell.tsx | 13 ++++++++++++- src/components/fields/Code/DisplayCell.tsx | 2 +- src/components/fields/File/DisplayCell.tsx | 12 +++++++----- src/components/fields/File/EditorCell.tsx | 12 +++++++----- src/components/fields/Json/DisplayCell.tsx | 2 +- src/components/fields/LongText/DisplayCell.tsx | 2 +- src/components/fields/Status/DisplayCell.tsx | 1 + 10 files changed, 49 insertions(+), 17 deletions(-) diff --git a/src/components/Table/TableCell/EditorCellTextField.tsx b/src/components/Table/TableCell/EditorCellTextField.tsx index 3d89d8be..1f3cb155 100644 --- a/src/components/Table/TableCell/EditorCellTextField.tsx +++ b/src/components/Table/TableCell/EditorCellTextField.tsx @@ -55,6 +55,7 @@ export default function EditorCellTextField({ width: "100%", height: "calc(100% - 1px)", marginTop: "1px", + padding: 0, paddingBottom: "1px", backgroundColor: "var(--cell-background-color)", @@ -70,7 +71,7 @@ export default function EditorCellTextField({ lineHeight: (theme) => theme.typography.body2.lineHeight, maxHeight: "100%", boxSizing: "border-box", - py: 3 / 8, + py: 2 / 8, }, }, ...spreadSx(InputProps.sx), diff --git a/src/components/Table/TableCell/withRenderTableCell.tsx b/src/components/Table/TableCell/withRenderTableCell.tsx index 3a4d2d5f..a8f10f83 100644 --- a/src/components/Table/TableCell/withRenderTableCell.tsx +++ b/src/components/Table/TableCell/withRenderTableCell.tsx @@ -111,7 +111,7 @@ export default function withTableCell( row: row.original, column: column.columnDef.meta!, _rowy_ref: row.original._rowy_ref, - disabled: column.columnDef.meta!.editable === false, + disabled, tabIndex: focusInsideCell ? 0 : -1, showPopoverCell, setFocusInsideCell, diff --git a/src/components/fields/Action/DisplayCell.tsx b/src/components/fields/Action/DisplayCell.tsx index 78871401..264f55be 100644 --- a/src/components/fields/Action/DisplayCell.tsx +++ b/src/components/fields/Action/DisplayCell.tsx @@ -1,5 +1,6 @@ import { IDisplayCellProps } from "@src/components/fields/types"; import { get } from "lodash-es"; +import { sanitiseCallableName, isUrl } from "./utils"; export const getActionName = (column: IDisplayCellProps["column"]) => { const config = get(column, "config"); @@ -10,5 +11,19 @@ export const getActionName = (column: IDisplayCellProps["column"]) => { }; export default function Action({ value, column }: IDisplayCellProps) { - return <>{value ? value.status : getActionName(column)}; + const hasRan = value && ![null, undefined].includes(value.status); + + return ( +
    + {hasRan && isUrl(value.status) ? ( + + {value.status} + + ) : hasRan ? ( + value.status + ) : ( + sanitiseCallableName(getActionName(column)) + )} +
    + ); } diff --git a/src/components/fields/Checkbox/DisplayCell.tsx b/src/components/fields/Checkbox/DisplayCell.tsx index 67943586..65af2709 100644 --- a/src/components/fields/Checkbox/DisplayCell.tsx +++ b/src/components/fields/Checkbox/DisplayCell.tsx @@ -6,7 +6,16 @@ export default function Checkbox({ column, value }: IDisplayCellProps) { return ( + } label={column.name as string} labelPlacement="start" @@ -15,6 +24,8 @@ export default function Checkbox({ column, value }: IDisplayCellProps) { width: "100%", alignItems: "center", + cursor: "default", + "& .MuiFormControlLabel-label": { font: "inherit", letterSpacing: "inherit", diff --git a/src/components/fields/Code/DisplayCell.tsx b/src/components/fields/Code/DisplayCell.tsx index 215266f2..dc9b5bd1 100644 --- a/src/components/fields/Code/DisplayCell.tsx +++ b/src/components/fields/Code/DisplayCell.tsx @@ -12,7 +12,7 @@ export default function Code({ value }: IDisplayCellProps) { style={{ width: "100%", maxHeight: "100%", - padding: theme.spacing(1, 0), + padding: "3px 0", whiteSpace: "pre-wrap", lineHeight: theme.typography.body2.lineHeight, diff --git a/src/components/fields/File/DisplayCell.tsx b/src/components/fields/File/DisplayCell.tsx index 36d82d64..f92d21e6 100644 --- a/src/components/fields/File/DisplayCell.tsx +++ b/src/components/fields/File/DisplayCell.tsx @@ -26,11 +26,13 @@ export default function File_({ } label={file.name} - onClick={(e) => { - window.open(file.downloadURL); - e.stopPropagation(); - }} - style={{ width: "100%" }} + onClick={(e: any) => e.stopPropagation()} + component="a" + href={file.downloadURL} + target="_blank" + rel="noopener noreferrer" + clickable + style={{ width: "100%", cursor: "pointer" }} tabIndex={tabIndex} /> diff --git a/src/components/fields/File/EditorCell.tsx b/src/components/fields/File/EditorCell.tsx index c738f9d4..adcea801 100644 --- a/src/components/fields/File/EditorCell.tsx +++ b/src/components/fields/File/EditorCell.tsx @@ -117,10 +117,12 @@ export default function File_({ } label={file.name} - onClick={(e) => { - window.open(file.downloadURL); - e.stopPropagation(); - }} + onClick={(e: any) => e.stopPropagation()} + component="a" + href={file.downloadURL} + target="_blank" + rel="noopener noreferrer" + clickable onDelete={ disabled ? undefined @@ -134,7 +136,7 @@ export default function File_({ }) } tabIndex={tabIndex} - style={{ width: "100%" }} + style={{ width: "100%", cursor: "pointer" }} /> diff --git a/src/components/fields/Json/DisplayCell.tsx b/src/components/fields/Json/DisplayCell.tsx index 82a1eea1..bc97afa0 100644 --- a/src/components/fields/Json/DisplayCell.tsx +++ b/src/components/fields/Json/DisplayCell.tsx @@ -15,7 +15,7 @@ export default function Json({ value }: IDisplayCellProps) { style={{ width: "100%", maxHeight: "100%", - padding: theme.spacing(1, 0), + padding: "3px 0", whiteSpace: "pre-wrap", lineHeight: theme.typography.body2.lineHeight, diff --git a/src/components/fields/LongText/DisplayCell.tsx b/src/components/fields/LongText/DisplayCell.tsx index 1e8e0fc2..cc285625 100644 --- a/src/components/fields/LongText/DisplayCell.tsx +++ b/src/components/fields/LongText/DisplayCell.tsx @@ -9,7 +9,7 @@ export default function LongText({ value }: IDisplayCellProps) {
    + {value} {getLabel(value, sortedConditions)}
    ); From c6b10d337897c7c7b89797d8dbf52ddab8e02803 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Fri, 18 Nov 2022 14:27:23 +1100 Subject: [PATCH 280/309] fix sub-table opening appearing to crash the page --- src/App.tsx | 17 ++++++++++++++++- src/pages/Table/ProvidedSubTablePage.tsx | 1 + 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/App.tsx b/src/App.tsx index 79162f2d..ea283a01 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -2,6 +2,7 @@ import { lazy, Suspense } from "react"; import { Routes, Route, Navigate } from "react-router-dom"; import { useAtom } from "jotai"; +import { Backdrop } from "@mui/material"; import Loading from "@src/components/Loading"; import ProjectSourceFirebase from "@src/sources/ProjectSourceFirebase"; import MembersSourceFirebase from "@src/sources/MembersSourceFirebase"; @@ -116,7 +117,21 @@ export default function App() { } /> } + element={ + + + + } + > + + + } /> diff --git a/src/pages/Table/ProvidedSubTablePage.tsx b/src/pages/Table/ProvidedSubTablePage.tsx index 0769d445..860748c2 100644 --- a/src/pages/Table/ProvidedSubTablePage.tsx +++ b/src/pages/Table/ProvidedSubTablePage.tsx @@ -110,6 +110,7 @@ export default function ProvidedSubTablePage() { disableBottomDivider: true, style: { "--dialog-spacing": 0, "--dialog-contents-spacing": 0 } as any, }} + BackdropProps={{ key: "sub-table-modal-backdrop" }} > Date: Fri, 18 Nov 2022 16:53:45 +1100 Subject: [PATCH 281/309] ColumnMenu: get user permissions as props instead of checking userRolesAtom --- src/components/ColumnMenu/ColumnMenu.tsx | 21 +++++++++++++++++---- src/pages/Table/TablePage.tsx | 16 +++++++++++----- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/components/ColumnMenu/ColumnMenu.tsx b/src/components/ColumnMenu/ColumnMenu.tsx index 72b1b765..cf025217 100644 --- a/src/components/ColumnMenu/ColumnMenu.tsx +++ b/src/components/ColumnMenu/ColumnMenu.tsx @@ -33,7 +33,6 @@ import ColumnHeader from "@src/components/Table/Mock/Column"; import { projectScope, - userRolesAtom, userSettingsAtom, updateUserSettingsAtom, confirmDialogAtom, @@ -80,8 +79,17 @@ export interface IMenuModalProps { ) => void; } -export default function ColumnMenu() { - const [userRoles] = useAtom(userRolesAtom, projectScope); +export interface IColumnMenuProps { + canAddColumns: boolean; + canEditColumns: boolean; + canDeleteColumns: boolean; +} + +export default function ColumnMenu({ + canAddColumns, + canEditColumns, + canDeleteColumns, +}: IColumnMenuProps) { const [userSettings] = useAtom(userSettingsAtom, projectScope); const [updateUserSettings] = useAtom(updateUserSettingsAtom, projectScope); const confirm = useSetAtom(confirmDialogAtom, projectScope); @@ -387,6 +395,7 @@ export default function ColumnMenu() { openColumnModal({ type: "new", index: column.index - 1 }); handleClose(); }, + disabled: !canAddColumns, }, { label: "Insert to the right…", @@ -396,6 +405,7 @@ export default function ColumnMenu() { openColumnModal({ type: "new", index: column.index + 1 }); handleClose(); }, + disabled: !canAddColumns, }, { label: `Delete column${altPress ? "" : "…"}`, @@ -450,16 +460,19 @@ export default function ColumnMenu() { }); }, color: "error" as "error", + disabled: !canDeleteColumns, }, ]; let menuItems = [...localViewActions]; - if (userRoles.includes("ADMIN") || userRoles.includes("OPS")) { + if (canEditColumns) { menuItems.push.apply(menuItems, configActions); if (column.type === FieldType.derivative) { menuItems.push.apply(menuItems, derivativeActions); } + } + if (canAddColumns || canDeleteColumns) { menuItems.push.apply(menuItems, columnActions); } diff --git a/src/pages/Table/TablePage.tsx b/src/pages/Table/TablePage.tsx index 5959376e..3dce7445 100644 --- a/src/pages/Table/TablePage.tsx +++ b/src/pages/Table/TablePage.tsx @@ -67,10 +67,12 @@ export default function TablePage({ const [tableSchema] = useAtom(tableSchemaAtom, tableScope); const snackLogContext = useSnackLogContext(); - // Set permissions here so we can pass them to the Table component, which - // shouldn’t access projectScope at all, to separate concerns. - const canAddColumns = userRoles.includes("ADMIN"); - const canEditColumns = userRoles.includes("ADMIN"); + // Set permissions here so we can pass them to the `Table` component, which + // shouldn’t access `projectScope` at all, to separate concerns. + const canAddColumns = + userRoles.includes("ADMIN") || userRoles.includes("OPS"); + const canEditColumns = canAddColumns; + const canDeleteColumns = canAddColumns; const canEditCells = userRoles.includes("ADMIN") || (!tableSettings.readOnly && @@ -170,7 +172,11 @@ export default function TablePage({ {!disableModals && ( - + From edb70164cf6b1639f9db96da9c029cd0cb853c7f Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Fri, 18 Nov 2022 17:31:03 +1100 Subject: [PATCH 282/309] add code comments & explanations --- .../Table/ColumnHeader/ColumnHeader.tsx | 71 +++------ .../Table/ColumnHeader/ColumnHeaderSort.tsx | 4 + .../Table/Styled/StyledColumnHeader.tsx | 58 +++++++ src/components/Table/Styled/StyledDot.tsx | 22 +++ src/components/Table/Table.tsx | 33 +++- src/components/Table/TableBody.tsx | 21 ++- .../Table/TableCell/EditorCellController.tsx | 90 +++++++++++ src/components/Table/TableCell/TableCell.tsx | 58 ++++--- .../Table/TableCell/withRenderTableCell.tsx | 145 ++++++++---------- src/components/Table/TableHeader.tsx | 16 +- src/components/Table/useSaveColumnSizing.tsx | 3 +- src/components/fields/types.ts | 6 + src/pages/Table/ProvidedSubTablePage.tsx | 7 +- src/pages/Table/ProvidedTablePage.tsx | 7 + src/pages/Table/TablePage.tsx | 14 +- 15 files changed, 380 insertions(+), 175 deletions(-) create mode 100644 src/components/Table/Styled/StyledColumnHeader.tsx create mode 100644 src/components/Table/Styled/StyledDot.tsx create mode 100644 src/components/Table/TableCell/EditorCellController.tsx diff --git a/src/components/Table/ColumnHeader/ColumnHeader.tsx b/src/components/Table/ColumnHeader/ColumnHeader.tsx index 84239a40..40e5c5a1 100644 --- a/src/components/Table/ColumnHeader/ColumnHeader.tsx +++ b/src/components/Table/ColumnHeader/ColumnHeader.tsx @@ -7,12 +7,8 @@ import type { } from "react-beautiful-dnd"; import { - styled, Tooltip, - TooltipProps, - tooltipClasses, Fade, - Stack, StackProps, IconButton, Typography, @@ -20,6 +16,10 @@ import { import DropdownIcon from "@mui/icons-material/MoreHoriz"; import LockIcon from "@mui/icons-material/LockOutlined"; +import { + StyledColumnHeader, + StyledColumnHeaderNameTooltip, +} from "@src/components/Table/Styled/StyledColumnHeader"; import ColumnHeaderSort, { SORT_STATES } from "./ColumnHeaderSort"; import ColumnHeaderDragHandle from "./ColumnHeaderDragHandle"; import ColumnHeaderResizer from "./ColumnHeaderResizer"; @@ -39,53 +39,6 @@ import type { TableRow } from "@src/types/table"; export { COLUMN_HEADER_HEIGHT }; -const StyledColumnHeader = styled(Stack)(({ theme }) => ({ - position: "relative", - height: "100%", - border: `1px solid ${theme.palette.divider}`, - "& + &": { borderLeftStyle: "none" }, - - flexDirection: "row", - alignItems: "center", - padding: theme.spacing(0, 0.5, 0, 1), - "& svg, & button": { display: "block", zIndex: 1 }, - - backgroundColor: theme.palette.background.default, - color: theme.palette.text.secondary, - transition: theme.transitions.create("color", { - duration: theme.transitions.duration.short, - }), - "&:hover": { color: theme.palette.text.primary }, - - "& .MuiIconButton-root": { - color: theme.palette.text.disabled, - transition: theme.transitions.create( - ["background-color", "opacity", "color"], - { duration: theme.transitions.duration.short } - ), - }, - [`&:hover .MuiIconButton-root, - &:focus .MuiIconButton-root, - &:focus-within .MuiIconButton-root, - .MuiIconButton-root:focus`]: { - color: theme.palette.text.primary, - opacity: 1, - }, -})); - -const LightTooltip = styled(({ className, ...props }: TooltipProps) => ( - -))(({ theme }) => ({ - [`& .${tooltipClasses.tooltip}`]: { - backgroundColor: theme.palette.background.default, - color: theme.palette.text.primary, - - margin: `-${COLUMN_HEADER_HEIGHT - 1 - 2}px 0 0 !important`, - padding: 0, - paddingRight: theme.spacing(1.5), - }, -})); - export interface IColumnHeaderProps extends Partial> { header: Header; @@ -101,6 +54,18 @@ export interface IColumnHeaderProps isLastFrozen: boolean; } +/** + * Renders UI components for each column header, including accessibility + * attributes. Memoized to prevent re-render when resizing or reordering other + * columns. + * + * Renders: + * - Drag handle (accessible) + * - Field type icon + click to copy field key + * - Field name + hover to view full name if cut off + * - Sort button + * - Resize handle (not accessible) + */ export const ColumnHeader = memo(function ColumnHeader({ header, column, @@ -214,7 +179,7 @@ export const ColumnHeader = memo(function ColumnHeader({ )} - - + {column.type !== FieldType.id && ( ({ + position: "relative", + height: "100%", + border: `1px solid ${theme.palette.divider}`, + "& + &": { borderLeftStyle: "none" }, + + flexDirection: "row", + alignItems: "center", + padding: theme.spacing(0, 0.5, 0, 1), + "& svg, & button": { display: "block", zIndex: 1 }, + + backgroundColor: theme.palette.background.default, + color: theme.palette.text.secondary, + transition: theme.transitions.create("color", { + duration: theme.transitions.duration.short, + }), + "&:hover": { color: theme.palette.text.primary }, + + "& .MuiIconButton-root": { + color: theme.palette.text.disabled, + transition: theme.transitions.create( + ["background-color", "opacity", "color"], + { duration: theme.transitions.duration.short } + ), + }, + [`&:hover .MuiIconButton-root, + &:focus .MuiIconButton-root, + &:focus-within .MuiIconButton-root, + .MuiIconButton-root:focus`]: { + color: theme.palette.text.primary, + opacity: 1, + }, +})); +export default StyledColumnHeader; + +export const StyledColumnHeaderNameTooltip = styled( + ({ className, ...props }: TooltipProps) => ( + + ) +)(({ theme }) => ({ + [`& .${tooltipClasses.tooltip}`]: { + backgroundColor: theme.palette.background.default, + color: theme.palette.text.primary, + + margin: `-${COLUMN_HEADER_HEIGHT - 1 - 2}px 0 0 !important`, + padding: 0, + paddingRight: theme.spacing(1.5), + }, +})); diff --git a/src/components/Table/Styled/StyledDot.tsx b/src/components/Table/Styled/StyledDot.tsx new file mode 100644 index 00000000..bd942a8f --- /dev/null +++ b/src/components/Table/Styled/StyledDot.tsx @@ -0,0 +1,22 @@ +import { styled } from "@mui/material"; + +export const StyledDot = styled("div")(({ theme }) => ({ + position: "absolute", + right: -5, + top: "50%", + transform: "translateY(-50%)", + zIndex: 1, + + width: 12, + height: 12, + + borderRadius: "50%", + backgroundColor: theme.palette.error.main, + + boxShadow: `0 0 0 4px var(--cell-background-color)`, + "[role='row']:hover &": { + boxShadow: `0 0 0 4px var(--row-hover-background-color)`, + }, +})); + +export default StyledDot; diff --git a/src/components/Table/Table.tsx b/src/components/Table/Table.tsx index fe1447c4..2d412787 100644 --- a/src/components/Table/Table.tsx +++ b/src/components/Table/Table.tsx @@ -49,13 +49,34 @@ const columnHelper = createColumnHelper(); const getRowId = (row: TableRow) => row._rowy_ref.path || row._rowy_ref.id; export interface ITableProps { + /** Determines if “Add column” button is displayed */ canAddColumns: boolean; + /** Determines if columns can be rearranged */ canEditColumns: boolean; + /** + * Determines if any cell can be edited. + * If false, `Table` only ever renders `EditorCell`. + */ canEditCells: boolean; + /** The hidden columns saved to user settings */ hiddenColumns?: string[]; + /** + * Displayed when `tableRows` is empty. + * Loading state handled by Suspense in parent component. + */ emptyState?: React.ReactNode; } +/** + * Takes table schema and row data from `tableScope` and makes it compatible + * with TanStack Table. Renders table children and cell context menu. + * + * - Calls `useKeyboardNavigation` hook + * - Handles rearranging columns + * - Handles infinite scrolling + * - Stores local state for resizing columns, and asks admins if they want to + * save to table schema for all users + */ export default function Table({ canAddColumns, canEditColumns, @@ -75,7 +96,7 @@ export default function Table({ const gridRef = useRef(null); // Get column defs from table schema - // Also add end column for admins + // Also add end column for admins (canAddColumns || canEditCells) const columns = useMemo(() => { const _columns = tableColumnsOrdered // Hide column for all users using table schema @@ -103,13 +124,13 @@ export default function Table({ return _columns; }, [tableColumnsOrdered, canAddColumns, canEditCells]); - // Get user’s hidden columns from props and memoize into a VisibilityState + // Get user’s hidden columns from props and memoize into a `VisibilityState` const columnVisibility = useMemo(() => { if (!Array.isArray(hiddenColumns)) return {}; return hiddenColumns.reduce((a, c) => ({ ...a, [c]: false }), {}); }, [hiddenColumns]); - // Get frozen columns + // Get frozen columns and memoize into a `ColumnPinningState` const columnPinning = useMemo( () => ({ left: columns.filter((c) => c.meta?.fixed && c.id).map((c) => c.id!), @@ -128,7 +149,7 @@ export default function Table({ columnResizeMode: "onChange", }); - // Store local columnSizing state so we can save it to table schema + // Store local `columnSizing` state so we can save it to table schema // in `useSaveColumnSizing`. This could be generalized by storing the // entire table state. const [columnSizing, setColumnSizing] = useState( @@ -139,16 +160,18 @@ export default function Table({ state: { ...prev.state, columnVisibility, columnPinning, columnSizing }, onColumnSizingChange: setColumnSizing, })); - + // Get rows and columns for virtualization const { rows } = table.getRowModel(); const leafColumns = table.getVisibleLeafColumns(); + // Handle keyboard navigation const { handleKeyDown } = useKeyboardNavigation({ gridRef, tableRows, leafColumns, }); + // Handle prompt to save local column sizes if user `canEditColumns` useSaveColumnSizing(columnSizing, canEditColumns); const handleDropColumn = useCallback( diff --git a/src/components/Table/TableBody.tsx b/src/components/Table/TableBody.tsx index 674d8d96..45eef9a3 100644 --- a/src/components/Table/TableBody.tsx +++ b/src/components/Table/TableBody.tsx @@ -4,7 +4,7 @@ import type { Column, Row, ColumnSizingState } from "@tanstack/react-table"; import StyledRow from "./Styled/StyledRow"; import OutOfOrderIndicator from "./OutOfOrderIndicator"; -import CellValidation from "./TableCell"; +import TableCell from "./TableCell"; import { RowsSkeleton } from "./TableSkeleton"; import { @@ -24,17 +24,28 @@ import { } from "./Table"; export interface ITableBodyProps { + /** Used in `useVirtualization` */ containerRef: React.RefObject; + /** Used in `useVirtualization` */ leafColumns: Column[]; + /** Current table rows with context from TanStack Table state */ rows: Row[]; - + /** Determines if EditorCell can be displayed */ canEditCells: boolean; + /** If specified, renders a shadow in the last frozen column */ lastFrozen?: string; - - /** Re-render when local column sizing changes */ + /** + * Must pass this prop so that it re-renders when local column sizing changes */ columnSizing: ColumnSizingState; } +/** + * Renders table body & data rows. + * Handles virtualization of rows & columns via `useVirtualization`. + * + * - Renders row out of order indicator + * - Renders next page loading UI (`RowsSkeleton`) + */ export const TableBody = memo(function TableBody({ containerRef, leafColumns, @@ -98,7 +109,7 @@ export const TableBody = memo(function TableBody({ fieldTypeGroup === "Auditing" || fieldTypeGroup === "Metadata"; return ( - ; + parentRef: IEditorCellProps["parentRef"]; + saveOnUnmount: boolean; +} + +/** + * Stores a local state for the cell’s value, so that `EditorCell` doesn’t + * immediately update the database when the user quickly makes changes to the + * cell’s value (e.g. text input). + * + * Extracted from `withRenderTableCell()` so when the `DisplayCell` is + * rendered, an unnecessary extra state is not created. + * + * - Defines function to update the field in db + * - Tracks when the user has made the input “dirty” + * - By default, saves to db when the component is unmounted and the input + * is dirty + * - Has an effect to change the local value state when it receives an update + * from db and the field is not dirty. This is required to make inline + * `EditorCell` work when they haven’t been interacted with, but prevent the + * value changing while someone is editing a field, like Long Text. + */ +export default function EditorCellController({ + EditorCellComponent, + saveOnUnmount, + value, + ...props +}: IEditorCellControllerProps) { + // Store local value so we don’t immediately write to db when the user + // types in a textbox, for example + const [localValue, setLocalValue, localValueRef] = useStateRef(value); + // Mark if the user has interacted with this cell and hasn’t saved yet + const [isDirty, setIsDirty, isDirtyRef] = useStateRef(false); + const updateField = useSetAtom(updateFieldAtom, tableScope); + + // When this cell’s data has updated, update the local value if + // it’s not dirty and the value is different + useEffect(() => { + if (!isDirty && !isEqual(value, localValueRef.current)) + setLocalValue(value); + }, [isDirty, localValueRef, setLocalValue, value]); + + // This is where we update the documents + const handleSubmit = () => { + // props.disabled should always be false as withRenderTableCell would + // render DisplayCell instead of EditorCell + if (props.disabled || !isDirtyRef.current) return; + + updateField({ + path: props._rowy_ref.path, + fieldName: props.column.fieldName, + value: localValueRef.current, + deleteField: localValueRef.current === undefined, + }); + }; + + useLayoutEffect(() => { + return () => { + if (saveOnUnmount) handleSubmit(); + }; + // Warns that `saveOnUnmount` and `handleSubmit` should be included, but + // those don’t change across re-renders. We only want to run this on unmount + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ( + setIsDirty(dirty ?? true)} + onChange={(v) => { + setIsDirty(true); + setLocalValue(v); + }} + onSubmit={handleSubmit} + /> + ); +} diff --git a/src/components/Table/TableCell/TableCell.tsx b/src/components/Table/TableCell/TableCell.tsx index 48fb7b93..1842602b 100644 --- a/src/components/Table/TableCell/TableCell.tsx +++ b/src/components/Table/TableCell/TableCell.tsx @@ -4,13 +4,13 @@ import { ErrorBoundary } from "react-error-boundary"; import { flexRender } from "@tanstack/react-table"; import type { Row, Cell } from "@tanstack/react-table"; -import { styled } from "@mui/material/styles"; import ErrorIcon from "@mui/icons-material/ErrorOutline"; import WarningIcon from "@mui/icons-material/WarningAmber"; import StyledCell from "@src/components/Table/Styled/StyledCell"; import { InlineErrorFallback } from "@src/components/ErrorFallback"; import RichTooltip from "@src/components/RichTooltip"; +import StyledDot from "@src/components/Table/Styled/StyledDot"; import { tableScope, @@ -20,39 +20,53 @@ import { import type { TableRow } from "@src/types/table"; import type { IRenderedTableCellProps } from "./withRenderTableCell"; -const Dot = styled("div")(({ theme }) => ({ - position: "absolute", - right: -5, - top: "50%", - transform: "translateY(-50%)", - zIndex: 1, - - width: 12, - height: 12, - - borderRadius: "50%", - backgroundColor: theme.palette.error.main, - - boxShadow: `0 0 0 4px var(--cell-background-color)`, - "[role='row']:hover &": { - boxShadow: `0 0 0 4px var(--row-hover-background-color)`, - }, -})); - export interface ITableCellProps { + /** Current row with context from TanStack Table state */ row: Row; + /** Current cell with context from TanStack Table state */ cell: Cell; + /** Virtual cell index (column index) */ index: number; + /** User has clicked or navigated to this cell */ isSelectedCell: boolean; + /** User has double-clicked or pressed Enter and this cell is selected */ focusInsideCell: boolean; + /** + * Used to disable `aria-description` that says “Press Enter to edit” + * for Auditing and Metadata cells. Need to find another way to do this. + */ isReadOnlyCell: boolean; + /** Determines if EditorCell can be displayed */ canEditCells: boolean; + /** + * Pass current row height as a prop so we don’t access `tableSchema` here. + * If that atom is listened to here, all table cells will re-render whenever + * `tableSchema` changes, which is unnecessary. + */ rowHeight: number; + /** If true, renders a shadow */ isLastFrozen: boolean; + /** Pass width as a prop to get local column sizing state */ width: number; + /** + * If provided, cell is pinned/frozen, and this value is used for + * `position: sticky`. + */ left?: number; } +/** + * Renders the container div for each cell with accessibility attributes for + * keyboard navigation. + * + * - Performs regex & missing value check and renders associated UI + * - Provides children with value from `cell.getValue()` so they can work with + * memoization + * - Provides helpers as props to aid with memoization, so children components + * don’t have to read atoms, which may cause unnecessary re-renders of many + * cell components + * - Renders `ErrorBoundary` + */ export const TableCell = memo(function TableCell({ row, cell, @@ -85,7 +99,7 @@ export const TableCell = memo(function TableCell({ title="Invalid data" message="This row will not be saved until all the required fields contain valid data" placement="right" - render={({ openTooltip }) => } + render={({ openTooltip }) => } /> ); } else if (isMissing) { @@ -95,7 +109,7 @@ export const TableCell = memo(function TableCell({ title="Required field" message="This row will not be saved until all the required fields contain valid data" placement="right" - render={({ openTooltip }) => } + render={({ openTooltip }) => } /> ); } diff --git a/src/components/Table/TableCell/withRenderTableCell.tsx b/src/components/Table/TableCell/withRenderTableCell.tsx index a8f10f83..0d215b19 100644 --- a/src/components/Table/TableCell/withRenderTableCell.tsx +++ b/src/components/Table/TableCell/withRenderTableCell.tsx @@ -1,19 +1,11 @@ -import { - memo, - Suspense, - useState, - useEffect, - useRef, - useLayoutEffect, -} from "react"; -import useStateRef from "react-usestateref"; -import { useSetAtom } from "jotai"; +import { memo, Suspense, useState, useEffect, useRef } from "react"; import { isEqual } from "lodash-es"; import type { CellContext } from "@tanstack/react-table"; import { Popover, PopoverProps } from "@mui/material"; -import { tableScope, updateFieldAtom } from "@src/atoms/tableScope"; +import EditorCellController from "./EditorCellController"; + import { spreadSx } from "@src/utils/ui"; import type { TableRow } from "@src/types/table"; import type { @@ -32,6 +24,7 @@ export interface ICellOptions { popoverProps?: Partial; } +/** Received from `TableCell` */ export interface IRenderedTableCellProps extends CellContext { value: TValue; @@ -42,18 +35,61 @@ export interface IRenderedTableCellProps } /** - * HOC to render table cells. - * Renders read-only DisplayCell while scrolling for scroll performance. - * Defers render for inline EditorCell. - * @param DisplayCellComponent - The lighter cell component to display values - * @param EditorCellComponent - The heavier cell component to edit inline - * @param editorMode - When to display the EditorCell - * - "focus" (default) - when the cell is focused (Enter or double-click) - * - "inline" - inline with deferred render - * - "popover" - as a popover - * @param options - {@link ICellOptions} + * Higher-order component to render each field type’s cell components. + * Handles when to render read-only `DisplayCell` and `EditorCell`. + * + * Memoized to re-render when value, column, focus, or disabled states change. + * Optionally re-renders when entire row updates. + * + * - Renders inline `EditorCell` after a timeout to improve scroll performance + * - Handles popovers + * - Renders Suspense for lazy-loaded `EditorCell` + * - Provides a `tabIndex` prop, so that interactive cell children (like + * buttons) cannot be interacted with unless the user has focused in the + * cell. Required for accessibility. + * + * @param DisplayCellComponent + * - The lighter cell component to display values. Also displayed when the + * column is disabled/read-only. + * + * - Keep these components lightweight, i.e. use base HTML or simple MUI + * components. Avoid `Tooltip`, which is heavy. + * - Avoid displaying disabled states (e.g. do not reduce opacity/grey out + * toggles). This improves the experience of read-only tables for non-admins + * - ⚠️ Make sure the disabled state does not render the buttons to open a + * popover `EditorCell` (like Single/Multi Select). + * - ⚠️ Make sure to use the `tabIndex` prop for buttons and other interactive + * elements. + * - {@link IDisplayCellProps} + * + * @param EditorCellComponent + * - The heavier cell component to edit values + * + * - `EditorCell` should use the `value` and `onChange` props for the + * rendered inputs. Avoid creating another local state here. + * - `onSubmit` is available if `saveOnUnmount` does not work or if you want + * to submit to the db before unmount. + * - ✨ You can reuse your `SideDrawerField` as they take the same props. It + * should probably be displayed in a popover. + * - You can pass `null` to `withRenderTableCell()` to always display the + * `DisplayCell`. + * - ⚠️ Make sure to use the `tabIndex` prop for buttons, text fields, and + * other interactive elements. + * - {@link IEditorCellProps} + * + * @param editorMode + * - When to display the `EditorCell` + * 1. **focus** (default): the user has focused on the cell by pressing Enter or + * double-clicking, + * 2. **inline**: always displayed if the cell is editable, or + * 3. **popover**: inside a popover when a user has focused on the cell + * (as above) or clicked a button rendered by `DisplayCell` + * + * @param options + * - Note this is OK to pass as an object since it’s not defined in runtime + * - {@link ICellOptions} */ -export default function withTableCell( +export default function withRenderTableCell( DisplayCellComponent: React.ComponentType, EditorCellComponent: React.ComponentType | null, editorMode: "focus" | "inline" | "popover" = "focus", @@ -137,7 +173,7 @@ export default function withTableCell( // Show displayCell as a fallback if intentionally null const editorCell = EditorCellComponent ? ( - { const valueEqual = isEqual(prev.value, next.value); const columnEqual = isEqual( @@ -220,65 +257,3 @@ export default function withTableCell( } ); } - -interface IEditorCellManagerProps extends IDisplayCellProps { - EditorCellComponent: React.ComponentType; - parentRef: IEditorCellProps["parentRef"]; - saveOnUnmount: boolean; -} - -function EditorCellManager({ - EditorCellComponent, - saveOnUnmount, - value, - ...props -}: IEditorCellManagerProps) { - // Store local value so we don’t immediately write to db when the user - // types in a textbox, for example - const [localValue, setLocalValue, localValueRef] = useStateRef(value); - // Mark if the user has interacted with this cell and hasn’t saved yet - const [isDirty, setIsDirty, isDirtyRef] = useStateRef(false); - const updateField = useSetAtom(updateFieldAtom, tableScope); - - // When this cell’s data has updated, update the local value if - // it’s not dirty and the value is different - useEffect(() => { - if (!isDirty && !isEqual(value, localValueRef.current)) - setLocalValue(value); - }, [isDirty, localValueRef, setLocalValue, value]); - - // This is where we update the documents - const handleSubmit = () => { - if (props.disabled || !isDirtyRef.current) return; - - updateField({ - path: props._rowy_ref.path, - fieldName: props.column.fieldName, - value: localValueRef.current, - deleteField: localValueRef.current === undefined, - }); - }; - - useLayoutEffect(() => { - return () => { - if (saveOnUnmount) { - console.log("unmount", props._rowy_ref.path, props.column.fieldName); - handleSubmit(); - } - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - return ( - setIsDirty(dirty ?? true)} - onChange={(v) => { - setIsDirty(true); - setLocalValue(v); - }} - onSubmit={handleSubmit} - /> - ); -} diff --git a/src/components/Table/TableHeader.tsx b/src/components/Table/TableHeader.tsx index ac93d566..43eb8833 100644 --- a/src/components/Table/TableHeader.tsx +++ b/src/components/Table/TableHeader.tsx @@ -13,16 +13,27 @@ import { tableScope, selectedCellAtom } from "@src/atoms/tableScope"; import { DEFAULT_ROW_HEIGHT } from "@src/components/Table"; export interface ITableHeaderProps { + /** Headers with context from TanStack Table state */ headerGroups: HeaderGroup[]; + /** Called when a header is dropped in a new position */ handleDropColumn: (result: DropResult) => void; + /** Passed to `FinalColumnHeader` */ canAddColumns: boolean; + /** Determines if columns can be re-ordered */ canEditColumns: boolean; + /** If specified, renders a shadow in the last frozen column */ lastFrozen?: string; - - /** Re-render when local column sizing changes */ + /** + * Must pass this prop so that it re-renders when local column sizing changes */ columnSizing: ColumnSizingState; } +/** + * Renders table header row. Memoized to only re-render when column definitions + * and sizes change. + * + * - Renders drag & drop components + */ export const TableHeader = memo(function TableHeader({ headerGroups, handleDropColumn, @@ -93,6 +104,7 @@ export const TableHeader = memo(function TableHeader({ ); })} + {/* Required by react-beautiful-dnd */} {provided.placeholder} )} diff --git a/src/components/Table/useSaveColumnSizing.tsx b/src/components/Table/useSaveColumnSizing.tsx index 2bcf9c59..af1a6e37 100644 --- a/src/components/Table/useSaveColumnSizing.tsx +++ b/src/components/Table/useSaveColumnSizing.tsx @@ -17,7 +17,8 @@ import { DEBOUNCE_DELAY } from "./Table"; import { ColumnSizingState } from "@tanstack/react-table"; /** - * Debounces columnSizing and asks admins if they want to save for all users + * Debounces `columnSizing` and asks user if they want to save for all users, + * if they have the `canEditColumns` permission */ export function useSaveColumnSizing( columnSizing: ColumnSizingState, diff --git a/src/components/fields/types.ts b/src/components/fields/types.ts index b43b6d82..50a05f8a 100644 --- a/src/components/fields/types.ts +++ b/src/components/fields/types.ts @@ -42,6 +42,7 @@ export interface IFieldConfig { csvImportParser?: (value: string, config?: any) => any; } +/** See {@link IRenderedTableCellProps | `withRenderTableCell` } for guidance */ export interface IDisplayCellProps { value: T; type: FieldType; @@ -51,11 +52,16 @@ export interface IDisplayCellProps { /** The row’s _rowy_ref object */ _rowy_ref: TableRowRef; disabled: boolean; + /** + * ⚠️ Make sure to use the `tabIndex` prop for buttons and other interactive + * elements. + */ tabIndex: number; showPopoverCell: (value: boolean) => void; setFocusInsideCell: (focusInside: boolean) => void; rowHeight: number; } +/** See {@link IRenderedTableCellProps | `withRenderTableCell` } for guidance */ export interface IEditorCellProps extends IDisplayCellProps { /** Call when the user has input but changes have not been saved */ onDirty: (dirty?: boolean) => void; diff --git a/src/pages/Table/ProvidedSubTablePage.tsx b/src/pages/Table/ProvidedSubTablePage.tsx index 860748c2..e4659d33 100644 --- a/src/pages/Table/ProvidedSubTablePage.tsx +++ b/src/pages/Table/ProvidedSubTablePage.tsx @@ -28,7 +28,12 @@ import { TABLE_TOOLBAR_HEIGHT } from "@src/components/TableToolbar"; const TablePage = lazy(() => import("./TablePage" /* webpackChunkName: "TablePage" */)); /** - * Wraps `TablePage` with the data for a top-level table. + * Wraps `TablePage` with the data for a sub-table. + * + * Differences to `ProvidedTablePage`: + * - Renders a `Modal` + * - When this is a child of `ProvidedTablePage`, the `TablePage` rendered for + * the root table has its modals disabled */ export default function ProvidedSubTablePage() { const location = useLocation(); diff --git a/src/pages/Table/ProvidedTablePage.tsx b/src/pages/Table/ProvidedTablePage.tsx index 8f86be90..cdb7d19c 100644 --- a/src/pages/Table/ProvidedTablePage.tsx +++ b/src/pages/Table/ProvidedTablePage.tsx @@ -38,6 +38,13 @@ const TablePage = lazy(() => import("./TablePage" /* webpackChunkName: "TablePag /** * Wraps `TablePage` with the data for a top-level table. * `SubTablePage` is inserted in the outlet, alongside `TablePage`. + * + * Interfaces with `projectScope` atoms to find the correct table (or sub-table) + * settings and schema. + * + * - Renders the Jotai `Provider` with `tableScope` + * - Renders `TableSourceFirestore`, which queries Firestore and stores data in + * atoms in `tableScope` */ export default function ProvidedTablePage() { const { id } = useParams(); diff --git a/src/pages/Table/TablePage.tsx b/src/pages/Table/TablePage.tsx index 3dce7445..6008c835 100644 --- a/src/pages/Table/TablePage.tsx +++ b/src/pages/Table/TablePage.tsx @@ -46,7 +46,10 @@ import { formatSubTableName } from "@src/utils/table"; const BuildLogsSnack = lazy(() => import("@src/components/TableModals/CloudLogsModal/BuildLogs/BuildLogsSnack" /* webpackChunkName: "TableModals-BuildLogsSnack" */)); export interface ITablePageProps { - /** Disable modals on this table when a sub-table is open and it’s listening to URL state */ + /** + * Disable modals on this table when a sub-table is open and it’s listening + * to URL state + */ disableModals?: boolean; /** Disable side drawer */ disableSideDrawer?: boolean; @@ -55,6 +58,15 @@ export interface ITablePageProps { /** * TablePage renders all the UI for the table. * Must be wrapped by either `ProvidedTablePage` or `ProvidedSubTablePage`. + * + * Renders `Table`, `TableToolbar`, `SideDrawer`, `TableModals`, `ColumnMenu`, + * Suspense fallback UI. These components are all independent of each other. + * + * - Renders empty state if no columns + * - Defines empty state if no rows + * - Defines permissions `canAddColumns`, `canEditColumns`, `canEditCells` + * for `Table` using `userRolesAtom` in `projectScope` + * - Provides `Table` with hidden columns array from user settings */ export default function TablePage({ disableModals, From dd3f5553ab2ab9c6ea5b39937aa2f882089ee710 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Fri, 18 Nov 2022 18:36:41 +1100 Subject: [PATCH 283/309] fix Rating cells not saving to db & add warning in comments --- src/components/Table/TableCell/withRenderTableCell.tsx | 8 ++++---- src/components/fields/Rating/EditorCell.tsx | 6 +++++- src/components/fields/types.ts | 2 +- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/components/Table/TableCell/withRenderTableCell.tsx b/src/components/Table/TableCell/withRenderTableCell.tsx index 0d215b19..60935e07 100644 --- a/src/components/Table/TableCell/withRenderTableCell.tsx +++ b/src/components/Table/TableCell/withRenderTableCell.tsx @@ -67,12 +67,12 @@ export interface IRenderedTableCellProps * * - `EditorCell` should use the `value` and `onChange` props for the * rendered inputs. Avoid creating another local state here. - * - `onSubmit` is available if `saveOnUnmount` does not work or if you want - * to submit to the db before unmount. - * - ✨ You can reuse your `SideDrawerField` as they take the same props. It - * should probably be displayed in a popover. * - You can pass `null` to `withRenderTableCell()` to always display the * `DisplayCell`. + * - ⚠️ If it’s displayed inline, you must call `onSubmit` to save the value + * to the database, because it never unmounts. + * - ✨ You can reuse your `SideDrawerField` as they take the same props. It + * should probably be displayed in a popover. * - ⚠️ Make sure to use the `tabIndex` prop for buttons, text fields, and * other interactive elements. * - {@link IEditorCellProps} diff --git a/src/components/fields/Rating/EditorCell.tsx b/src/components/fields/Rating/EditorCell.tsx index 4d3c0c23..89a48f2d 100644 --- a/src/components/fields/Rating/EditorCell.tsx +++ b/src/components/fields/Rating/EditorCell.tsx @@ -4,6 +4,7 @@ import DisplayCell from "./DisplayCell"; export default function Rating({ onChange, + onSubmit, tabIndex, ...props }: IEditorCellProps) { @@ -20,7 +21,10 @@ export default function Rating({ onChange(newValue)} + onChange={(_, newValue) => { + onChange(newValue); + onSubmit(); + }} ref={ref} /> ); diff --git a/src/components/fields/types.ts b/src/components/fields/types.ts index 50a05f8a..63374d81 100644 --- a/src/components/fields/types.ts +++ b/src/components/fields/types.ts @@ -1,5 +1,5 @@ import { FieldType } from "@src/constants/fields"; -import type { IRenderedTableCellProps } from "@src/components/Table/TableCell/withRenderTableCell"; +import { IRenderedTableCellProps } from "@src/components/Table/TableCell/withRenderTableCell"; import type { PopoverProps } from "@mui/material"; import type { ColumnConfig, From 763c0a20d0a2b191411ae2d5c0263dd2e7cd8d02 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Mon, 21 Nov 2022 14:17:42 +1100 Subject: [PATCH 284/309] Rating Icon: remove console.log --- src/components/fields/Rating/Icon.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/fields/Rating/Icon.tsx b/src/components/fields/Rating/Icon.tsx index e65b8f3d..a34bdc24 100644 --- a/src/components/fields/Rating/Icon.tsx +++ b/src/components/fields/Rating/Icon.tsx @@ -20,7 +20,6 @@ const getStateIcon = (config: any) => { if (!get(config, "customIcons.enabled")) { return ; } - console.log(get(config, "customIcons.rating")); return get(config, "customIcons.rating") || ; }; const getStateOutline = (config: any) => { From 9829fdebc1938a65dabfe0a92b85ace7f2c85939 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Mon, 21 Nov 2022 17:16:32 +1100 Subject: [PATCH 285/309] fix virtualization occasionally not detecting scroll --- src/components/Table/Table.tsx | 17 ++++++++++++++--- src/components/Table/TableBody.tsx | 6 ++++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/components/Table/Table.tsx b/src/components/Table/Table.tsx index 2d412787..412e0535 100644 --- a/src/components/Table/Table.tsx +++ b/src/components/Table/Table.tsx @@ -1,4 +1,5 @@ import { useMemo, useRef, useState, useEffect, useCallback } from "react"; +import useStateRef from "react-usestateref"; import { useAtom, useSetAtom } from "jotai"; import { useThrottledCallback } from "use-debounce"; import { @@ -92,7 +93,11 @@ export default function Table({ const updateColumn = useSetAtom(updateColumnAtom, tableScope); - const containerRef = useRef(null); + // Store a **state** and reference to the container element + // so the state can re-render `TableBody`, preventing virtualization + // not detecting scroll if the container element was initially `null` + const [containerEl, setContainerEl, containerRef] = + useStateRef(null); const gridRef = useRef(null); // Get column defs from table schema @@ -205,11 +210,16 @@ export default function Table({ // for large screen heights useEffect(() => { fetchMoreOnBottomReached(containerRef.current); - }, [fetchMoreOnBottomReached, tablePage, tableNextPage.loading]); + }, [ + fetchMoreOnBottomReached, + tablePage, + tableNextPage.loading, + containerRef, + ]); return (
    setContainerEl(el)} onScroll={(e) => fetchMoreOnBottomReached(e.target as HTMLDivElement)} style={{ overflow: "auto", width: "100%", height: "100%" }} > @@ -252,6 +262,7 @@ export default function Table({ emptyState ?? ) : ( ; /** Used in `useVirtualization` */ From 74cdae7195649509902602f00a61dfa4a1c87a54 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Mon, 21 Nov 2022 18:13:33 +1100 Subject: [PATCH 286/309] fix frozen columns disappearing when scrolled right --- src/components/Table/TableBody.tsx | 29 ++++++-------------- src/components/Table/TableCell/TableCell.tsx | 8 ++++-- src/components/Table/useVirtualization.tsx | 18 +++++++++++- 3 files changed, 32 insertions(+), 23 deletions(-) diff --git a/src/components/Table/TableBody.tsx b/src/components/Table/TableBody.tsx index 118dbece..74efe194 100644 --- a/src/components/Table/TableBody.tsx +++ b/src/components/Table/TableBody.tsx @@ -17,11 +17,7 @@ import { import { getFieldProp } from "@src/components/fields"; import type { TableRow } from "@src/types/table"; import useVirtualization from "./useVirtualization"; -import { - TABLE_PADDING, - DEFAULT_ROW_HEIGHT, - OUT_OF_ORDER_MARGIN, -} from "./Table"; +import { DEFAULT_ROW_HEIGHT, OUT_OF_ORDER_MARGIN } from "./Table"; export interface ITableBodyProps { /** @@ -72,6 +68,8 @@ export const TableBody = memo(function TableBody({ paddingRight, } = useVirtualization(containerRef, leafColumns); + const rowHeight = tableSchema.rowHeight || DEFAULT_ROW_HEIGHT; + return (
    {paddingTop > 0 && ( @@ -88,15 +86,13 @@ export const TableBody = memo(function TableBody({ role="row" aria-rowindex={row.index + 2} style={{ - height: "auto", + height: rowHeight, marginBottom: outOfOrder ? OUT_OF_ORDER_MARGIN : 0, + paddingLeft, + paddingRight, }} data-out-of-order={outOfOrder || undefined} > - {paddingLeft > 0 && ( -
    - )} - {outOfOrder && } {virtualCols.map((virtualCell) => { @@ -120,25 +116,18 @@ export const TableBody = memo(function TableBody({ row={row} cell={cell} index={cellIndex} - left={ - cell.column.getIsPinned() - ? virtualCell.start - TABLE_PADDING - : undefined - } isSelectedCell={isSelectedCell} focusInsideCell={isSelectedCell && selectedCell?.focusInside} isReadOnlyCell={isReadOnlyCell} canEditCells={canEditCells} isLastFrozen={lastFrozen === cell.column.id} width={cell.column.getSize()} - rowHeight={tableSchema.rowHeight || DEFAULT_ROW_HEIGHT} + rowHeight={rowHeight} + left={virtualCell.start} + isPinned={cell.column.getIsPinned() === "left"} /> ); })} - - {paddingRight > 0 && ( -
    - )} ); })} diff --git a/src/components/Table/TableCell/TableCell.tsx b/src/components/Table/TableCell/TableCell.tsx index 1842602b..4ea51433 100644 --- a/src/components/Table/TableCell/TableCell.tsx +++ b/src/components/Table/TableCell/TableCell.tsx @@ -17,6 +17,7 @@ import { selectedCellAtom, contextMenuTargetAtom, } from "@src/atoms/tableScope"; +import { TABLE_PADDING } from "@src/components/Table"; import type { TableRow } from "@src/types/table"; import type { IRenderedTableCellProps } from "./withRenderTableCell"; @@ -52,7 +53,8 @@ export interface ITableCellProps { * If provided, cell is pinned/frozen, and this value is used for * `position: sticky`. */ - left?: number; + left: number; + isPinned: boolean; } /** @@ -79,6 +81,7 @@ export const TableCell = memo(function TableCell({ isLastFrozen, width, left, + isPinned, }: ITableCellProps) { const setSelectedCell = useSetAtom(selectedCellAtom, tableScope); const setContextMenuTarget = useSetAtom(contextMenuTargetAtom, tableScope); @@ -152,7 +155,8 @@ export const TableCell = memo(function TableCell({ style={{ width, height: rowHeight, - left, + position: isPinned ? "sticky" : "absolute", + left: left - (isPinned ? TABLE_PADDING : 0), backgroundColor: cell.column.id === "_rowy_column_actions" ? "transparent" : undefined, borderBottomWidth: diff --git a/src/components/Table/useVirtualization.tsx b/src/components/Table/useVirtualization.tsx index b9b3ca55..90df0329 100644 --- a/src/components/Table/useVirtualization.tsx +++ b/src/components/Table/useVirtualization.tsx @@ -1,6 +1,7 @@ import { useEffect, useCallback } from "react"; import { useAtom } from "jotai"; -import { useVirtual } from "react-virtual"; +import { useVirtual, defaultRangeExtractor } from "react-virtual"; +import type { Range } from "react-virtual"; import { tableScope, @@ -69,6 +70,21 @@ export function useVirtualization( ), [leafColumns] ), + rangeExtractor: useCallback( + (range: Range) => { + const defaultRange = defaultRangeExtractor(range); + const frozenColumns = leafColumns + .filter((c) => c.getIsPinned()) + .map((c) => c.getPinnedIndex()); + + const combinedRange = Array.from( + new Set([...defaultRange, ...frozenColumns]) + ).sort((a, b) => a - b); + + return combinedRange; + }, + [leafColumns] + ), }); // Scroll to selected cell From e2bed9e4b0f1c8581edcd8c9867bb7f39a5efb89 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Tue, 22 Nov 2022 14:59:02 +1100 Subject: [PATCH 287/309] temp fix vercel builds breaking on node 18 ``` The prop value with an expression type of JSXFragment could not be resolved. Please file an issue ( https://github.com/jsx-eslint/jsx-ast-utils/issues/new ) to get this fixed immediately. Error: error:0308010C:digital envelope routines::unsupported at String.replace () ``` --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0ea80114..4b331667 100644 --- a/package.json +++ b/package.json @@ -92,7 +92,7 @@ "typedoc": "typedoc src/atoms/tableScope/index.ts src/atoms/globalScope/index.ts --out typedoc" }, "engines": { - "node": ">=16" + "node": "^16" }, "eslintConfig": { "plugins": [ From 9a7b225afae509a281f957e15a42c4aa75bd63c2 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Tue, 22 Nov 2022 16:20:10 +1100 Subject: [PATCH 288/309] fix final column header appearing to be draggable --- src/components/Table/TableHeader.tsx | 45 ++++++++++++++++++---------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/src/components/Table/TableHeader.tsx b/src/components/Table/TableHeader.tsx index 43eb8833..ab813275 100644 --- a/src/components/Table/TableHeader.tsx +++ b/src/components/Table/TableHeader.tsx @@ -1,4 +1,4 @@ -import { memo } from "react"; +import { memo, Fragment } from "react"; import { useAtom } from "jotai"; import { DragDropContext, Droppable, Draggable } from "react-beautiful-dnd"; import type { DropResult } from "react-beautiful-dnd"; @@ -57,30 +57,36 @@ export const TableHeader = memo(function TableHeader({ {...provided.droppableProps} ref={provided.innerRef} > - {headerGroup.headers.map((header) => { + {headerGroup.headers.map((header, i) => { const isSelectedCell = (!selectedCell && header.index === 0) || (selectedCell?.path === "_rowy_header" && selectedCell?.columnKey === header.id); + const isLastHeader = i === headerGroup.headers.length - 1; + + // Render later, after the drag & drop placeholder if (header.id === "_rowy_column_actions") return ( - + + {provided.placeholder} + + ); if (!header.column.columnDef.meta) return null; - return ( + const draggableHeader = ( ); + + if (isLastHeader) + return ( + + {draggableHeader} + {provided.placeholder} + + ); + else return draggableHeader; })} - {/* Required by react-beautiful-dnd */} - {provided.placeholder} )} From 3115a9c917344dbf22e36522600e65ba890292fc Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Tue, 22 Nov 2022 16:24:46 +1100 Subject: [PATCH 289/309] fix table spacing when side drawer is opened --- src/pages/Table/TablePage.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/pages/Table/TablePage.tsx b/src/pages/Table/TablePage.tsx index 6008c835..75f1fc28 100644 --- a/src/pages/Table/TablePage.tsx +++ b/src/pages/Table/TablePage.tsx @@ -13,7 +13,7 @@ import TableSkeleton from "@src/components/Table/TableSkeleton"; import EmptyTable from "@src/components/Table/EmptyTable"; import TableToolbar from "@src/components/TableToolbar"; import Table from "@src/components/Table"; -import SideDrawer from "@src/components/SideDrawer"; +import SideDrawer, { DRAWER_WIDTH } from "@src/components/SideDrawer"; import ColumnMenu from "@src/components/ColumnMenu"; import ColumnModals from "@src/components/ColumnModals"; import TableModals from "@src/components/TableModals"; @@ -140,7 +140,9 @@ export default function TablePage({ '& [role="grid"]': { marginBottom: `env(safe-area-inset-bottom)`, marginLeft: `env(safe-area-inset-left)`, - marginRight: `env(safe-area-inset-right)`, + // Ensure there’s enough space so that all columns are + // still visible when the side drawer is open + marginRight: `max(env(safe-area-inset-right), ${DRAWER_WIDTH}px)`, }, }} > From 6a30220b94f0e74af225a75d59761583460be691 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Tue, 22 Nov 2022 17:07:36 +1100 Subject: [PATCH 290/309] fix out of order & missing field rows being added twice to tableRowsLocalAtom --- src/atoms/tableScope/rowActions.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/atoms/tableScope/rowActions.ts b/src/atoms/tableScope/rowActions.ts index 37d1f9de..fd90fe3d 100644 --- a/src/atoms/tableScope/rowActions.ts +++ b/src/atoms/tableScope/rowActions.ts @@ -129,9 +129,9 @@ export const addRowAtom = atom( }); } - // Also add to rowsLocal if any required fields are missing + // Also add to rowsLocal if any required fields are missing // (not out of order since those cases are handled above) - if (missingRequiredFields.length > 0) { + else if (missingRequiredFields.length > 0) { set(tableRowsLocalAtom, { type: "add", row: { ...rowValues, _rowy_outOfOrder: false }, From e3831d716abf5cbbc7a21627fa143c7651554211 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Tue, 22 Nov 2022 17:36:17 +1100 Subject: [PATCH 291/309] =?UTF-8?q?fix=20serverDocCountAtom=20loading=20st?= =?UTF-8?q?ate=20displaying=20=E2=80=9Cof=200=20rows=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/atoms/tableScope/table.ts | 7 ++-- .../TableToolbar/LoadedRowsStatus.tsx | 12 +++---- src/hooks/useFirestoreCollectionWithAtom.ts | 32 ++++++++++++------- 3 files changed, 31 insertions(+), 20 deletions(-) diff --git a/src/atoms/tableScope/table.ts b/src/atoms/tableScope/table.ts index 6681af87..fdf8820c 100644 --- a/src/atoms/tableScope/table.ts +++ b/src/atoms/tableScope/table.ts @@ -239,5 +239,8 @@ export type AuditChangeFunction = ( */ export const auditChangeAtom = atom(undefined); -/** Store total number of rows in firestore collection */ -export const serverDocCountAtom = atom(0) \ No newline at end of file +/** + * Store total number of rows in the table, respecting current filters. + * If `undefined`, the query hasn’t loaded yet. + */ +export const serverDocCountAtom = atom(undefined); diff --git a/src/components/TableToolbar/LoadedRowsStatus.tsx b/src/components/TableToolbar/LoadedRowsStatus.tsx index c57ab80d..6a1465fa 100644 --- a/src/components/TableToolbar/LoadedRowsStatus.tsx +++ b/src/components/TableToolbar/LoadedRowsStatus.tsx @@ -10,7 +10,7 @@ import { tableScope, tableRowsAtom, tableNextPageAtom, - serverDocCountAtom + serverDocCountAtom, } from "@src/atoms/tableScope"; import { spreadSx } from "@src/utils/ui"; @@ -58,20 +58,20 @@ const loadingIcon = ( function LoadedRowsStatus() { const [tableNextPage] = useAtom(tableNextPageAtom, tableScope); - const [serverDocCount] = useAtom(serverDocCountAtom, tableScope) - const [tableRows] = useAtom(tableRowsAtom, tableScope) - + const [serverDocCount] = useAtom(serverDocCountAtom, tableScope); + const [tableRows] = useAtom(tableRowsAtom, tableScope); if (tableNextPage.loading) return {loadingIcon}Loading more…; - return ( Loaded {!tableNextPage.available && "all "} - {tableRows.length} {tableNextPage.available && `of ${serverDocCount}`} row{serverDocCount !== 1 && "s"} + {tableRows.length} + {serverDocCount !== undefined && ` of ${serverDocCount}`} row + {(serverDocCount ?? tableRows.length) !== 1 && "s"} ); diff --git a/src/hooks/useFirestoreCollectionWithAtom.ts b/src/hooks/useFirestoreCollectionWithAtom.ts index 4896a609..fb4ec621 100644 --- a/src/hooks/useFirestoreCollectionWithAtom.ts +++ b/src/hooks/useFirestoreCollectionWithAtom.ts @@ -22,7 +22,7 @@ import { QueryConstraint, WhereFilterOp, documentId, - getCountFromServer + getCountFromServer, } from "firebase/firestore"; import { useErrorHandler } from "react-error-boundary"; @@ -64,7 +64,7 @@ interface IUseFirestoreCollectionWithAtomOptions { /** Update this atom when we’re loading the next page, and if there is a next page available. Uses same scope as `dataScope`. */ nextPageAtom?: PrimitiveAtom; /** Set this atom's value to the number of docs in the collection on each new snapshot */ - serverDocCountAtom?: PrimitiveAtom | undefined; + serverDocCountAtom?: PrimitiveAtom; } /** @@ -96,7 +96,7 @@ export function useFirestoreCollectionWithAtom( updateDocAtom, deleteDocAtom, nextPageAtom, - serverDocCountAtom + serverDocCountAtom, } = options || {}; const [firebaseDb] = useAtom(firebaseDbAtom, projectScope); @@ -120,7 +120,10 @@ export function useFirestoreCollectionWithAtom( void >(nextPageAtom || (dataAtom as any), dataScope); - const setServerDocCountAtom = useSetAtom(serverDocCountAtom || (dataAtom as any), dataScope) + const setServerDocCountAtom = useSetAtom( + serverDocCountAtom || (dataAtom as any), + dataScope + ); // Store if we’re at the last page to prevent a new query from being created const [isLastPage, setIsLastPage] = useState(false); @@ -198,8 +201,8 @@ export function useFirestoreCollectionWithAtom( // on each new snapshot, use the query to get and set the document count from the server if (serverDocCountAtom) { getCountFromServer(memoizedQuery.unlimitedQuery).then((value) => { - setServerDocCountAtom(value.data().count) - }) + setServerDocCountAtom(value.data().count); + }); } } catch (error) { if (onError) onError(error as FirestoreError); @@ -232,7 +235,8 @@ export function useFirestoreCollectionWithAtom( handleError, nextPageAtom, setNextPageAtom, - setServerDocCountAtom + serverDocCountAtom, + setServerDocCountAtom, ]); // Create variable for validity of query to pass to useEffect dependencies @@ -339,7 +343,7 @@ const getQuery = ( limit, firestoreFilters, sorts, - unlimitedQuery: query(collectionRef, ...firestoreFilters) + unlimitedQuery: query(collectionRef, ...firestoreFilters), }; } catch (e) { if (onError) onError(e as FirestoreError); @@ -389,11 +393,15 @@ export const tableFiltersToFirestoreFilters = (filters: TableFilter[]) => { firestoreFilters.push(where(documentId(), "==", filter.value)); continue; } else if (filter.operator === "color-equal") { - firestoreFilters.push(where(filter.key.concat(".hex"), "==", filter.value.hex.toString())) - continue + firestoreFilters.push( + where(filter.key.concat(".hex"), "==", filter.value.hex.toString()) + ); + continue; } else if (filter.operator === "color-not-equal") { - firestoreFilters.push(where(filter.key.concat(".hex"), "!=", filter.value.hex.toString())) - continue + firestoreFilters.push( + where(filter.key.concat(".hex"), "!=", filter.value.hex.toString()) + ); + continue; } firestoreFilters.push( where(filter.key, filter.operator as WhereFilterOp, filter.value) From c1d1f44a3270afbde5495cc74c9dad0a60806148 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Tue, 22 Nov 2022 17:38:52 +1100 Subject: [PATCH 292/309] fix typedoc paths --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4783c433..a3bceebf 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "env": "node createDotEnv", "target": "firebase target:apply hosting rowy", "deploy": "firebase deploy --only hosting", - "typedoc": "typedoc src/atoms/tableScope/index.ts src/atoms/globalScope/index.ts --out typedoc" + "typedoc": "typedoc src/atoms/projectScope/index.ts src/atoms/tableScope/index.ts --out typedoc" }, "engines": { "node": ">=16" From ad7c5fd99202cb94f87dc25b5beafed2dfe1043b Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Thu, 24 Nov 2022 17:11:14 +1100 Subject: [PATCH 293/309] update typedoc config --- package.json | 4 ++-- typedoc.json | 14 ++++++++++++++ yarn.lock | 50 +++++++++++++++++++------------------------------- 3 files changed, 35 insertions(+), 33 deletions(-) create mode 100644 typedoc.json diff --git a/package.json b/package.json index a3bceebf..eebc09e1 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "env": "node createDotEnv", "target": "firebase target:apply hosting rowy", "deploy": "firebase deploy --only hosting", - "typedoc": "typedoc src/atoms/projectScope/index.ts src/atoms/tableScope/index.ts --out typedoc" + "typedoc": "typedoc --options typedoc.json" }, "engines": { "node": ">=16" @@ -180,7 +180,7 @@ "raw-loader": "^4.0.2", "source-map-explorer": "^2.5.2", "ts-jest": "^28.0.2", - "typedoc": "^0.22.17" + "typedoc": "^0.23.21" }, "resolutions": { "@types/react": "^18" diff --git a/typedoc.json b/typedoc.json new file mode 100644 index 00000000..c050816f --- /dev/null +++ b/typedoc.json @@ -0,0 +1,14 @@ +{ + "plugin": "", + "entryPoints": ["src/atoms/projectScope/*.ts", "src/atoms/tableScope/*.ts"], + "includes": "src/types", + "exclude": ["**/*.test"], + "readme": "none", + "githubPages": false, + "hideInPageTOC": true, + "entryDocument": "index.md", + "name": "Rowy", + "includeVersion": true, + "publicPath": "", + "out": "typedoc" +} diff --git a/yarn.lock b/yarn.lock index 91bc54a8..12293512 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6269,17 +6269,6 @@ glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^8.0.3: - version "8.0.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.0.3.tgz#415c6eb2deed9e502c68fa44a272e6da6eeca42e" - integrity sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^5.0.1" - once "^1.3.0" - global-modules@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" @@ -8039,10 +8028,10 @@ markdown-table@^3.0.0: resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.2.tgz#9b59eb2c1b22fe71954a65ff512887065a7bb57c" integrity sha512-y8j3a5/DkJCmS5x4dMCQL+OR0+2EAq3DOtio1COSHsmW2BGXnNCK3v12hJt1LrUz5iZH5g0LmuYOjDdI+czghA== -marked@^4.0.16: - version "4.0.16" - resolved "https://registry.yarnpkg.com/marked/-/marked-4.0.16.tgz#9ec18fc1a723032eb28666100344d9428cf7a264" - integrity sha512-wahonIQ5Jnyatt2fn8KqF/nIqZM8mh3oRu2+l5EANGMhu6RFjiSG52QNE2eWzFMI94HqYSgN184NurgNG6CztA== +marked@^4.0.19: + version "4.2.3" + resolved "https://registry.yarnpkg.com/marked/-/marked-4.2.3.tgz#bd76a5eb510ff1d8421bc6c3b2f0b93488c15bea" + integrity sha512-slWRdJkbTZ+PjkyJnE30Uid64eHwbwa1Q25INCAYfZlK4o6ylagBy/Le9eWntqJFoFT93ikUKMv47GZ4gTwHkw== match-sorter@^6.3.1: version "6.3.1" @@ -10947,14 +10936,14 @@ shell-quote@^1.7.3: resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== -shiki@^0.10.1: - version "0.10.1" - resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.10.1.tgz#6f9a16205a823b56c072d0f1a0bcd0f2646bef14" - integrity sha512-VsY7QJVzU51j5o1+DguUd+6vmCmZ5v/6gYu4vyYAhzjuNQU6P/vmSy4uQaOhvje031qQMiW0d2BwgMH52vqMng== +shiki@^0.11.1: + version "0.11.1" + resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.11.1.tgz#df0f719e7ab592c484d8b73ec10e215a503ab8cc" + integrity sha512-EugY9VASFuDqOexOgXR18ZV+TbFrQHeCpEYaXamO+SZlsnT/2LxuLBX25GGtIrwaEVFXUAbUQ601SWE2rMwWHA== dependencies: jsonc-parser "^3.0.0" vscode-oniguruma "^1.6.1" - vscode-textmate "5.2.0" + vscode-textmate "^6.0.0" side-channel@^1.0.4: version "1.0.4" @@ -11807,16 +11796,15 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typedoc@^0.22.17: - version "0.22.17" - resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.22.17.tgz#bc51cc95f569040112504300831cdac4f8089b7b" - integrity sha512-h6+uXHVVCPDaANzjwzdsj9aePBjZiBTpiMpBBeyh1zcN2odVsDCNajz8zyKnixF93HJeGpl34j/70yoEE5BfNg== +typedoc@^0.23.21: + version "0.23.21" + resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.23.21.tgz#2a6b0e155f91ffa9689086706ad7e3e4bc11d241" + integrity sha512-VNE9Jv7BgclvyH9moi2mluneSviD43dCE9pY8RWkO88/DrEgJZk9KpUk7WO468c9WWs/+aG6dOnoH7ccjnErhg== dependencies: - glob "^8.0.3" lunr "^2.3.9" - marked "^4.0.16" + marked "^4.0.19" minimatch "^5.1.0" - shiki "^0.10.1" + shiki "^0.11.1" typescript@^4.6.3: version "4.6.3" @@ -12144,10 +12132,10 @@ vscode-oniguruma@^1.6.1: resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.6.2.tgz#aeb9771a2f1dbfc9083c8a7fdd9cccaa3f386607" integrity sha512-KH8+KKov5eS/9WhofZR8M8dMHWN2gTxjMsG4jd04YhpbPR91fUj7rYQ2/XjeHCJWbg7X++ApRIU9NUwM2vTvLA== -vscode-textmate@5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-5.2.0.tgz#01f01760a391e8222fe4f33fbccbd1ad71aed74e" - integrity sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ== +vscode-textmate@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-6.0.0.tgz#a3777197235036814ac9a92451492f2748589210" + integrity sha512-gu73tuZfJgu+mvCSy4UZwd2JXykjK9zAZsfmDeut5dx/1a7FeTk0XwJsSuqQn+cuMCGVbIBfl+s53X4T19DnzQ== w3c-hr-time@^1.0.2: version "1.0.2" From 511eed5ab74d050f532c5c6284d390c61605e8d9 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Thu, 24 Nov 2022 17:27:15 +1100 Subject: [PATCH 294/309] fix column widths not updating in virtualized cells --- src/components/Table/TableBody.tsx | 3 ++- src/components/Table/useVirtualization.tsx | 22 ++++++++++++++-------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/components/Table/TableBody.tsx b/src/components/Table/TableBody.tsx index 74efe194..8dd53d73 100644 --- a/src/components/Table/TableBody.tsx +++ b/src/components/Table/TableBody.tsx @@ -54,6 +54,7 @@ export const TableBody = memo(function TableBody({ rows, canEditCells, lastFrozen, + columnSizing, }: ITableBodyProps) { const [tableSchema] = useAtom(tableSchemaAtom, tableScope); const [selectedCell] = useAtom(selectedCellAtom, tableScope); @@ -66,7 +67,7 @@ export const TableBody = memo(function TableBody({ paddingBottom, paddingLeft, paddingRight, - } = useVirtualization(containerRef, leafColumns); + } = useVirtualization(containerRef, leafColumns, columnSizing); const rowHeight = tableSchema.rowHeight || DEFAULT_ROW_HEIGHT; diff --git a/src/components/Table/useVirtualization.tsx b/src/components/Table/useVirtualization.tsx index 90df0329..090c3b83 100644 --- a/src/components/Table/useVirtualization.tsx +++ b/src/components/Table/useVirtualization.tsx @@ -15,8 +15,8 @@ import { OUT_OF_ORDER_MARGIN, DEFAULT_COL_WIDTH, } from "./Table"; -import { TableRow } from "@src/types/table"; -import { Column } from "@tanstack/react-table"; +import type { TableRow } from "@src/types/table"; +import type { Column, ColumnSizingState } from "@tanstack/react-table"; import { MIN_COL_WIDTH } from "./Table"; @@ -26,7 +26,8 @@ import { MIN_COL_WIDTH } from "./Table"; */ export function useVirtualization( containerRef: React.RefObject, - leafColumns: Column[] + leafColumns: Column[], + columnSizing: ColumnSizingState ) { const [tableSchema] = useAtom(tableSchemaAtom, tableScope); const [tableRows] = useAtom(tableRowsAtom, tableScope); @@ -63,12 +64,17 @@ export function useVirtualization( paddingStart: TABLE_PADDING, paddingEnd: TABLE_PADDING, estimateSize: useCallback( - (index: number) => - Math.max( + (index: number) => { + const columnDef = leafColumns[index].columnDef; + const schemaWidth = columnDef.size; + const localWidth = columnSizing[columnDef.id || ""]; + + return Math.max( MIN_COL_WIDTH, - leafColumns[index].columnDef.size || DEFAULT_COL_WIDTH - ), - [leafColumns] + localWidth || schemaWidth || DEFAULT_COL_WIDTH + ); + }, + [leafColumns, columnSizing] ), rangeExtractor: useCallback( (range: Range) => { From 7942b58e64107d89bfb21441ff3a42a41d4bf3e6 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Thu, 24 Nov 2022 19:13:28 +1100 Subject: [PATCH 295/309] update contributing guide with links to new technical docs --- CONTRIBUTING.md | 61 +++++++++++++++++++++++++++++++++++++------------ 1 file changed, 46 insertions(+), 15 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b78c5926..69b69a45 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,42 +1,73 @@ # Contributing -We welcome any feedback and contributions from the community. Please read the following guidelines to contribute to Rowy. +We welcome any feedback and contributions from the community. Please read the +following guidelines to contribute to Rowy. ## Code of conduct -We want to have a welcoming and inclusive environment, towards this please read and follow our [our code of conduct](https://github.com/rowyio/rowy/blob/main/CODE_OF_CONDUCT.md). +We want to have a welcoming and inclusive environment, towards this please read +and follow our +[our code of conduct](https://github.com/rowyio/rowy/blob/main/CODE_OF_CONDUCT.md). ## Getting started -Read the documentation on getting started [here](http://docs.rowy.io/). To get familiar with the project, [good first issues](https://github.com/rowyio/rowy/projects/3) is a good place to start. +Read the documentation on setting up your local development environment +[here](https://docs.rowy.io/setup/install#option-2-manual-install). + +Read how to submit a pull request [here](https://docs.rowy.io/contributing). + +To get familiar with the project, +[good first issues](https://github.com/rowyio/rowy/projects/3) is a good place +to start. ## Working on existing issues -If you are working on an [issue](https://github.com/rowyio/rowy/issues), share that you are working on it by commenting on the issue and posting a message on #contributions channel in Rowy's [Discord](https://discord.com/invite/fjBugmvzZP). -This allows others in the community and the maintainers a chance to provide feedback and guidance before you spend time working on it. +If you are working on an [issue](https://github.com/rowyio/rowy/issues), share +that you are working on it by commenting on the issue and posting a message on +#contributions channel in Rowy's +[Discord](https://discord.com/invite/fjBugmvzZP). This allows others in the +community and the maintainers a chance to provide feedback and guidance before +you spend time working on it. ## File a feature request -If you have some interesting idea that will be a good addition to Rowy, then create a new issue using [Feature Request Template](https://github.com/rowyio/rowy/issues/new?assignees=&labels=&template=feature_request.md) -to share your idea. If you are working on this to contribute to the project, then let others in the community and project maintainers know by posting on #contributions channel in Rowy's [Discord](https://discord.com/invite/fjBugmvzZP). -This allows others in the community and the maintainers a chance to provide feedback and guidance before you spend time working on it. +If you have some interesting idea that will be a good addition to Rowy, then +create a new issue using +[Feature Request Template](https://github.com/rowyio/rowy/issues/new?assignees=&labels=&template=feature_request.md) +to share your idea. If you are working on this to contribute to the project, +then let others in the community and project maintainers know by posting on +#contributions channel in Rowy's +[Discord](https://discord.com/invite/fjBugmvzZP). This allows others in the +community and the maintainers a chance to provide feedback and guidance before +you spend time working on it. ## Report an issue -You can report all issues through using [Report A Bug](https://github.com/rowyio/rowy/issues/new?assignees=&labels=&template=bug_report.md) template. Please provide as much information as possible so that it can be resolved. +You can report all issues through using +[Report A Bug](https://github.com/rowyio/rowy/issues/new?assignees=&labels=&template=bug_report.md) +template. Please provide as much information as possible so that it can be +resolved. ## Review -All submissions, including code and copy changes, will require review by project maintainers. +All submissions, including code and copy changes, will require review by project +maintainers. ## Create a pull request -When making any pull requests to the repository, please follow these instructions: +When making any pull requests to the repository, please follow these +instructions: -- Submit your PR to the develop branch -- Add as much information as possible in your PR's description including link to any related issues. -- Ensure all your commits have clear commit message along with comments in the code as required +Make sure you’ve read our technical documentation +[here](https://docs.rowy.io/contributing). + +- Submit your PR to the `develop` branch +- Add as much information as possible in your PR's description including link to + any related issues. +- Ensure all your commits have clear commit message along with comments in the + code as required ## License -By contributing to Rowy, you agree that your contributions will be licensed with the same license that is specified in the repository you are contributing to. +By contributing to Rowy, you agree that your contributions will be licensed with +the same license that is specified in the repository you are contributing to. From 15e1254625909b738516a4bbd0ffc2ec9c2404f6 Mon Sep 17 00:00:00 2001 From: saravanan-inc <59250081+saravanan-inc@users.noreply.github.com> Date: Mon, 28 Nov 2022 09:49:50 +0530 Subject: [PATCH 296/309] Feat: Richtext field full screen mode, similar to markdown fieldtype (#972) * Feat: Richtext field full screen mode, similar to markdown fieldtype * Update src/components/RichTextEditor.tsx Co-authored-by: Sidney Alcantara --- CONTRIBUTING.md | 11 +++++------ src/components/RichTextEditor.tsx | 18 ++++++++++++++++-- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 69b69a45..691abaaa 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -22,12 +22,11 @@ to start. ## Working on existing issues -If you are working on an [issue](https://github.com/rowyio/rowy/issues), share -that you are working on it by commenting on the issue and posting a message on -#contributions channel in Rowy's -[Discord](https://discord.com/invite/fjBugmvzZP). This allows others in the -community and the maintainers a chance to provide feedback and guidance before -you spend time working on it. +If you are working on an [issue](https://github.com/rowyio/rowy/issues), share that you are working on it by commenting on the issue and posting a message on #contributions channel in Rowy's [Discord](https://discord.com/invite/fjBugmvzZP). +This allows others in the community and the maintainers a chance to provide feedback and guidance before you spend time working on it. +Before you get started working on an [issue](https://github.com/rowyio/rowy/issues), please make sure to share that you are working on it by commenting on the issue and posting a message on #contributions channel in Rowy's [Discord](https://discord.com/invite/fjBugmvzZP). The maintainers will then assign the issue to you after making sure any relevant information or context in addition is provided before you can start on the task. + +Once you are assigned a task, please provide periodic updates or share any questions or roadblocks on either discord or the Github issue, so that the commmunity or the project maintainers can provide you any feedback or guidance as needed. If you are inactive for more than 1-2 week on a issue that was assigned to you, then we will assume you have stopped working on it and we will unassign it from you - so that we can give a chance to others in the community to work on it. ## File a feature request diff --git a/src/components/RichTextEditor.tsx b/src/components/RichTextEditor.tsx index a8e9179a..93c8c4d4 100644 --- a/src/components/RichTextEditor.tsx +++ b/src/components/RichTextEditor.tsx @@ -28,6 +28,7 @@ import "tinymce/plugins/image"; import "tinymce/plugins/paste"; import "tinymce/plugins/help"; import "tinymce/plugins/code"; +import "tinymce/plugins/fullscreen"; const Styles = styled("div", { shouldForwardProp: (prop) => prop !== "focus", @@ -120,6 +121,10 @@ const Styles = styled("div", { 0 0 0 1px ${theme.palette.action.inputOutline} inset`, } : {}, + "& .tox-tinymce.tox-fullscreen": { + zIndex: theme.zIndex.modal, + backgroundColor: theme.palette.background.paper, + }, }, })); @@ -149,6 +154,9 @@ export default function RichTextEditor({ Date: Mon, 28 Nov 2022 11:00:10 +0530 Subject: [PATCH 297/309] #562: Add accessible reorder option in column menu [new] (#984) * added reordering feature to the hidden fields menu * added comment * HiddenFields2 to HiddenFields * Update src/components/TableToolbar/HiddenFields.tsx Co-authored-by: Sidney Alcantara --- src/components/TableToolbar/HiddenFields.tsx | 186 ++++++++++++++----- 1 file changed, 143 insertions(+), 43 deletions(-) diff --git a/src/components/TableToolbar/HiddenFields.tsx b/src/components/TableToolbar/HiddenFields.tsx index 8015f6f5..0a537713 100644 --- a/src/components/TableToolbar/HiddenFields.tsx +++ b/src/components/TableToolbar/HiddenFields.tsx @@ -1,12 +1,26 @@ -import { useEffect, useRef, useMemo, useState } from "react"; -import { useAtom } from "jotai"; +import { + useEffect, + useRef, + useMemo, + useState, + forwardRef, + ChangeEvent, +} from "react"; +import { useAtom, useSetAtom } from "jotai"; import { isEqual } from "lodash-es"; import { colord } from "colord"; +import { + DragDropContext, + Droppable, + Draggable, + DropResult, +} from "react-beautiful-dnd"; import { Box, AutocompleteProps, Theme } from "@mui/material"; import VisibilityIcon from "@mui/icons-material/VisibilityOutlined"; import VisibilityOffIcon from "@mui/icons-material/VisibilityOffOutlined"; import IconSlash from "@src/components/IconSlash"; +import DragIndicatorOutlinedIcon from "@mui/icons-material/DragIndicatorOutlined"; import ColumnSelect, { ColumnItem } from "@src/components/Table/ColumnSelect"; import ButtonWithStatus from "@src/components/ButtonWithStatus"; @@ -16,7 +30,11 @@ import { userSettingsAtom, updateUserSettingsAtom, } from "@src/atoms/projectScope"; -import { tableScope, tableIdAtom } from "@src/atoms/tableScope"; +import { + tableScope, + tableIdAtom, + updateColumnAtom, +} from "@src/atoms/tableScope"; import { formatSubTableName } from "@src/utils/table"; export default function HiddenFields() { @@ -57,6 +75,9 @@ export default function HiddenFields() { } setOpen(false); }; + + // disable drag if search box is not empty + const [disableDrag, setDisableDrag] = useState(false); const renderOption: AutocompleteProps< any, true, @@ -67,49 +88,119 @@ export default function HiddenFields() { colord(theme.palette.background.paper) .mix("#fff", theme.palette.mode === "dark" ? 0.16 : 0) .alpha(1); - return ( -
  • - - + {(provided) => ( +
  • + + + disableDrag ? theme.palette.action.disabledOpacity : 1, }, - ]} - > - - slashColor(theme).toHslString(), - }, - ".Mui-focused & .icon-slash-mask": { - stroke: (theme) => - slashColor(theme) - .mix( - theme.palette.primary.main, - theme.palette.action.selectedOpacity + - theme.palette.action.hoverOpacity - ) - .alpha(1) - .toHslString(), - }, - }, - selected ? { strokeDashoffset: 0 } : {}, - ]} - /> - - -
  • + ]} + /> + + + + + slashColor(theme).toHslString(), + }, + ".Mui-focused & .icon-slash-mask": { + stroke: (theme) => + slashColor(theme) + .mix( + theme.palette.primary.main, + theme.palette.action.selectedOpacity + + theme.palette.action.hoverOpacity + ) + .alpha(1) + .toHslString(), + }, + }, + selected ? { strokeDashoffset: 0 } : {}, + ]} + /> + + + + )} +
    ); }; + const updateColumn = useSetAtom(updateColumnAtom, tableScope); + + // updates column on drag end + function handleOnDragEnd(result: DropResult) { + if (!result.destination) return; + updateColumn({ + key: result.draggableId, + config: {}, + index: result.destination.index, + }); + } + + // checks whether to disable reordering when search filter is applied + function checkToDisableDrag(e: ChangeEvent) { + setDisableDrag(e.target.value !== ""); + } + + const ListboxComponent = forwardRef(function ListboxComponent( + props: React.HTMLAttributes, + ulRef: any /*React.ForwardedRef*/ + ) { + const { children, ...other } = props; + + return ( + + + {(provided) => ( +
      { + provided.innerRef(ref); + if (ulRef !== null) { + ulRef(ref); + } + }} + > + {props.children} + {provided.placeholder} +
    + )} +
    +
    + ); + }); + return ( <> { + setHiddenFields(updates); + setDisableDrag(false); + }} onClose={handleSave} clearText="Show all" selectAllText="Hide all" From 1f28a8cb5bc0444e020982d35baa31e166f0124e Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Mon, 28 Nov 2022 18:18:26 +1100 Subject: [PATCH 298/309] fix table infinite loop if user doesn't have read permissions --- src/hooks/useFirestoreCollectionWithAtom.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hooks/useFirestoreCollectionWithAtom.ts b/src/hooks/useFirestoreCollectionWithAtom.ts index fb4ec621..a49ec98a 100644 --- a/src/hooks/useFirestoreCollectionWithAtom.ts +++ b/src/hooks/useFirestoreCollectionWithAtom.ts @@ -215,7 +215,7 @@ export function useFirestoreCollectionWithAtom( setDataAtom([]); suspended = false; } - if (nextPageAtom) setNextPageAtom({ loading: false, available: true }); + if (nextPageAtom) setNextPageAtom({ loading: false, available: false }); if (onError) onError(error); else handleError(error); } From ca72c656d60fea61aa9e4bdf19088cba48e9de03 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Mon, 28 Nov 2022 18:31:14 +1100 Subject: [PATCH 299/309] ROWY-791 fix virtualization not handling minimum width correctly --- src/components/Table/useVirtualization.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/Table/useVirtualization.tsx b/src/components/Table/useVirtualization.tsx index 090c3b83..cd50acc6 100644 --- a/src/components/Table/useVirtualization.tsx +++ b/src/components/Table/useVirtualization.tsx @@ -68,11 +68,11 @@ export function useVirtualization( const columnDef = leafColumns[index].columnDef; const schemaWidth = columnDef.size; const localWidth = columnSizing[columnDef.id || ""]; + const definedWidth = localWidth || schemaWidth; - return Math.max( - MIN_COL_WIDTH, - localWidth || schemaWidth || DEFAULT_COL_WIDTH - ); + if (definedWidth === undefined) return DEFAULT_COL_WIDTH; + if (definedWidth < MIN_COL_WIDTH) return MIN_COL_WIDTH; + return definedWidth; }, [leafColumns, columnSizing] ), From 3fb60102ef243f4a2f5a5c6967771142b6a1e1a3 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Mon, 28 Nov 2022 18:33:58 +1100 Subject: [PATCH 300/309] ROWY-706 fix build logs snackbar appearing under frozen columns --- .../TableModals/CloudLogsModal/BuildLogs/BuildLogsSnack.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/TableModals/CloudLogsModal/BuildLogs/BuildLogsSnack.tsx b/src/components/TableModals/CloudLogsModal/BuildLogs/BuildLogsSnack.tsx index 563eb599..ffc2f2e8 100644 --- a/src/components/TableModals/CloudLogsModal/BuildLogs/BuildLogsSnack.tsx +++ b/src/components/TableModals/CloudLogsModal/BuildLogs/BuildLogsSnack.tsx @@ -105,7 +105,7 @@ export default function BuildLogsSnack({ p: 2, pt: 1, borderRadius: 1, - zIndex: 1, + zIndex: (theme) => theme.zIndex.snackbar, transition: (theme) => theme.transitions.create("height"), height: expanded ? "calc(100% - 300px)" : 50, }} From 672f0b4d964cd068d2cdd941198bcc1804c13bd1 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Mon, 28 Nov 2022 18:42:44 +1100 Subject: [PATCH 301/309] fix lastFrozen column being incorrect if it's hidden --- src/components/Table/Table.tsx | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/components/Table/Table.tsx b/src/components/Table/Table.tsx index 412e0535..092ff0ab 100644 --- a/src/components/Table/Table.tsx +++ b/src/components/Table/Table.tsx @@ -7,6 +7,10 @@ import { getCoreRowModel, useReactTable, } from "@tanstack/react-table"; +import type { + ColumnPinningState, + VisibilityState, +} from "@tanstack/react-table"; import { DropResult } from "react-beautiful-dnd"; import { get } from "lodash-es"; @@ -15,7 +19,6 @@ import TableHeader from "./TableHeader"; import TableBody from "./TableBody"; import FinalColumn from "./FinalColumn/FinalColumn"; import ContextMenu from "./ContextMenu"; - import EmptyState from "@src/components/EmptyState"; // import BulkActions from "./BulkActions"; @@ -28,11 +31,10 @@ import { tablePageAtom, updateColumnAtom, } from "@src/atoms/tableScope"; - import { getFieldType, getFieldProp } from "@src/components/fields"; -import { TableRow, ColumnConfig } from "@src/types/table"; import { useKeyboardNavigation } from "./useKeyboardNavigation"; import { useSaveColumnSizing } from "./useSaveColumnSizing"; +import type { TableRow, ColumnConfig } from "@src/types/table"; export const DEFAULT_ROW_HEIGHT = 41; export const DEFAULT_COL_WIDTH = 150; @@ -130,20 +132,24 @@ export default function Table({ }, [tableColumnsOrdered, canAddColumns, canEditCells]); // Get user’s hidden columns from props and memoize into a `VisibilityState` - const columnVisibility = useMemo(() => { + const columnVisibility: VisibilityState = useMemo(() => { if (!Array.isArray(hiddenColumns)) return {}; return hiddenColumns.reduce((a, c) => ({ ...a, [c]: false }), {}); }, [hiddenColumns]); // Get frozen columns and memoize into a `ColumnPinningState` - const columnPinning = useMemo( + const columnPinning: ColumnPinningState = useMemo( () => ({ - left: columns.filter((c) => c.meta?.fixed && c.id).map((c) => c.id!), + left: columns + .filter( + (c) => c.meta?.fixed && c.id && columnVisibility[c.id] !== false + ) + .map((c) => c.id!), }), - [columns] + [columns, columnVisibility] ); const lastFrozen: string | undefined = - columnPinning.left[columnPinning.left.length - 1]; + columnPinning.left![columnPinning.left!.length - 1]; // Call TanStack Table const table = useReactTable({ From 093463793d949b78eb1f40ef4e293fdc83ec9a27 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Mon, 28 Nov 2022 19:09:44 +1100 Subject: [PATCH 302/309] fix typedoc config - remove markdown plugin --- typedoc.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/typedoc.json b/typedoc.json index c050816f..169e59de 100644 --- a/typedoc.json +++ b/typedoc.json @@ -1,14 +1,10 @@ { - "plugin": "", "entryPoints": ["src/atoms/projectScope/*.ts", "src/atoms/tableScope/*.ts"], "includes": "src/types", "exclude": ["**/*.test"], "readme": "none", "githubPages": false, - "hideInPageTOC": true, - "entryDocument": "index.md", "name": "Rowy", "includeVersion": true, - "publicPath": "", "out": "typedoc" } From a474e42d50a404b8669ffb49a0540a0e505497e5 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Tue, 29 Nov 2022 11:01:34 +1100 Subject: [PATCH 303/309] fix RichTextEditor full screen styles (#972) --- src/components/RichTextEditor.tsx | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/components/RichTextEditor.tsx b/src/components/RichTextEditor.tsx index 93c8c4d4..039347da 100644 --- a/src/components/RichTextEditor.tsx +++ b/src/components/RichTextEditor.tsx @@ -49,6 +49,11 @@ const Styles = styled("div", { boxShadow: `0 -1px 0 0 ${theme.palette.text.primary} inset, 0 0 0 1px ${theme.palette.action.inputOutline} inset`, }, + + "&.tox-fullscreen": { + zIndex: theme.zIndex.modal, + backgroundColor: theme.palette.background.paper, + }, }, "& .tox-toolbar-overlord, & .tox-edit-area__iframe, & .tox-toolbar__primary": @@ -121,10 +126,6 @@ const Styles = styled("div", { 0 0 0 1px ${theme.palette.action.inputOutline} inset`, } : {}, - "& .tox-tinymce.tox-fullscreen": { - zIndex: theme.zIndex.modal, - backgroundColor: theme.palette.background.paper, - }, }, })); @@ -154,9 +155,6 @@ export default function RichTextEditor({ Date: Tue, 29 Nov 2022 11:32:00 +1100 Subject: [PATCH 304/309] ROWY-796 fix action fields showing value and label --- src/components/fields/Status/DisplayCell.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/fields/Status/DisplayCell.tsx b/src/components/fields/Status/DisplayCell.tsx index 34e8dc7b..9717a19c 100644 --- a/src/components/fields/Status/DisplayCell.tsx +++ b/src/components/fields/Status/DisplayCell.tsx @@ -41,7 +41,6 @@ export const StatusSingleSelect = forwardRef(function StatusSingleSelect({ paddingLeft: "var(--cell-padding)", }} > - {value} {getLabel(value, sortedConditions)}
    ); From 402334ee208c661bf04ad3cf48aa92afd44a1ab8 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Tue, 29 Nov 2022 16:47:53 +1100 Subject: [PATCH 305/309] upgrade dependencies, fix node 18 build, migrate date pickers from mui/lab to mui/x --- .../{yarn-1.22.5.cjs => yarn-1.22.19.cjs} | 15599 ++++++++-------- .yarnrc.yml | 1 + package.json | 39 +- src/Providers.tsx | 4 +- .../TableSettingsDialog.tsx | 16 +- src/components/fields/Date/EditorCell.tsx | 5 +- .../fields/Date/SideDrawerField.tsx | 3 +- src/components/fields/DateTime/EditorCell.tsx | 5 +- .../fields/DateTime/SideDrawerField.tsx | 6 +- .../fields/Duration/SideDrawerField.tsx | 30 +- src/hooks/useFirestoreCollectionWithAtom.ts | 5 +- src/theme/components.tsx | 34 +- yarn.lock | 7343 ++++---- 13 files changed, 11841 insertions(+), 11249 deletions(-) rename .yarn/releases/{yarn-1.22.5.cjs => yarn-1.22.19.cjs} (99%) create mode 100644 .yarnrc.yml diff --git a/.yarn/releases/yarn-1.22.5.cjs b/.yarn/releases/yarn-1.22.19.cjs similarity index 99% rename from .yarn/releases/yarn-1.22.5.cjs rename to .yarn/releases/yarn-1.22.19.cjs index 7e3b13da..0fefc258 100755 --- a/.yarn/releases/yarn-1.22.5.cjs +++ b/.yarn/releases/yarn-1.22.19.cjs @@ -65,7 +65,7 @@ module.exports = /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 549); +/******/ return __webpack_require__(__webpack_require__.s = 517); /******/ }) /************************************************************************/ /******/ ([ @@ -98,192 +98,192 @@ module.exports = require("path"); /* unused harmony export __makeTemplateObject */ /* unused harmony export __importStar */ /* unused harmony export __importDefault */ -/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at http://www.apache.org/licenses/LICENSE-2.0 - -THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED -WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, -MERCHANTABLITY OR NON-INFRINGEMENT. - -See the Apache Version 2.0 License for specific language governing permissions -and limitations under the License. -***************************************************************************** */ -/* global Reflect, Promise */ - -var extendStatics = function(d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); -}; - -function __extends(d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -} - -var __assign = function() { - __assign = Object.assign || function __assign(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; - } - return t; - } - return __assign.apply(this, arguments); -} - -function __rest(s, e) { - var t = {}; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) - t[p] = s[p]; - if (s != null && typeof Object.getOwnPropertySymbols === "function") - for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0) - t[p[i]] = s[p[i]]; - return t; -} - -function __decorate(decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -} - -function __param(paramIndex, decorator) { - return function (target, key) { decorator(target, key, paramIndex); } -} - -function __metadata(metadataKey, metadataValue) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue); -} - -function __awaiter(thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -} - -function __generator(thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -} - -function __exportStar(m, exports) { - for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; -} - -function __values(o) { - var m = typeof Symbol === "function" && o[Symbol.iterator], i = 0; - if (m) return m.call(o); - return { - next: function () { - if (o && i >= o.length) o = void 0; - return { value: o && o[i++], done: !o }; - } - }; -} - -function __read(o, n) { - var m = typeof Symbol === "function" && o[Symbol.iterator]; - if (!m) return o; - var i = m.call(o), r, ar = [], e; - try { - while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); - } - catch (error) { e = { error: error }; } - finally { - try { - if (r && !r.done && (m = i["return"])) m.call(i); - } - finally { if (e) throw e.error; } - } - return ar; -} - -function __spread() { - for (var ar = [], i = 0; i < arguments.length; i++) - ar = ar.concat(__read(arguments[i])); - return ar; -} - -function __await(v) { - return this instanceof __await ? (this.v = v, this) : new __await(v); -} - -function __asyncGenerator(thisArg, _arguments, generator) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var g = generator.apply(thisArg, _arguments || []), i, q = []; - return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i; - function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; } - function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } } - function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); } - function fulfill(value) { resume("next", value); } - function reject(value) { resume("throw", value); } - function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); } -} - -function __asyncDelegator(o) { - var i, p; - return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i; - function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; } -} - -function __asyncValues(o) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var m = o[Symbol.asyncIterator], i; - return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); - function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } - function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); } -} - -function __makeTemplateObject(cooked, raw) { - if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; } - return cooked; -}; - -function __importStar(mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; - result.default = mod; - return result; -} - -function __importDefault(mod) { - return (mod && mod.__esModule) ? mod : { default: mod }; -} +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. All rights reserved. +Licensed under the Apache License, Version 2.0 (the "License"); you may not use +this file except in compliance with the License. You may obtain a copy of the +License at http://www.apache.org/licenses/LICENSE-2.0 + +THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED +WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, +MERCHANTABLITY OR NON-INFRINGEMENT. + +See the Apache Version 2.0 License for specific language governing permissions +and limitations under the License. +***************************************************************************** */ +/* global Reflect, Promise */ + +var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); +}; + +function __extends(d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +} + +var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + } + return __assign.apply(this, arguments); +} + +function __rest(s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0) + t[p[i]] = s[p[i]]; + return t; +} + +function __decorate(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +} + +function __param(paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +} + +function __metadata(metadataKey, metadataValue) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue); +} + +function __awaiter(thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +} + +function __generator(thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +} + +function __exportStar(m, exports) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} + +function __values(o) { + var m = typeof Symbol === "function" && o[Symbol.iterator], i = 0; + if (m) return m.call(o); + return { + next: function () { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + } + }; +} + +function __read(o, n) { + var m = typeof Symbol === "function" && o[Symbol.iterator]; + if (!m) return o; + var i = m.call(o), r, ar = [], e; + try { + while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); + } + catch (error) { e = { error: error }; } + finally { + try { + if (r && !r.done && (m = i["return"])) m.call(i); + } + finally { if (e) throw e.error; } + } + return ar; +} + +function __spread() { + for (var ar = [], i = 0; i < arguments.length; i++) + ar = ar.concat(__read(arguments[i])); + return ar; +} + +function __await(v) { + return this instanceof __await ? (this.v = v, this) : new __await(v); +} + +function __asyncGenerator(thisArg, _arguments, generator) { + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); + var g = generator.apply(thisArg, _arguments || []), i, q = []; + return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i; + function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; } + function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } } + function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); } + function fulfill(value) { resume("next", value); } + function reject(value) { resume("throw", value); } + function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); } +} + +function __asyncDelegator(o) { + var i, p; + return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i; + function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; } +} + +function __asyncValues(o) { + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); + var m = o[Symbol.asyncIterator], i; + return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); + function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } + function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); } +} + +function __makeTemplateObject(cooked, raw) { + if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; } + return cooked; +}; + +function __importStar(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; + result.default = mod; + return result; +} + +function __importDefault(mod) { + return (mod && mod.__esModule) ? mod : { default: mod }; +} /***/ }), @@ -295,7 +295,7 @@ function __importDefault(mod) { exports.__esModule = true; -var _promise = __webpack_require__(227); +var _promise = __webpack_require__(224); var _promise2 = _interopRequireDefault(_promise); @@ -338,6 +338,12 @@ module.exports = require("util"); /***/ }), /* 4 */ +/***/ (function(module, exports) { + +module.exports = require("fs"); + +/***/ }), +/* 5 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1393,7 +1399,7 @@ exports.normalizeOS = normalizeOS; var _fs; function _load_fs() { - return _fs = _interopRequireDefault(__webpack_require__(5)); + return _fs = _interopRequireDefault(__webpack_require__(4)); } var _glob; @@ -1423,13 +1429,13 @@ function _load_blockingQueue() { var _promise; function _load_promise() { - return _promise = _interopRequireWildcard(__webpack_require__(50)); + return _promise = _interopRequireWildcard(__webpack_require__(51)); } var _promise2; function _load_promise2() { - return _promise2 = __webpack_require__(50); + return _promise2 = __webpack_require__(51); } var _map; @@ -1441,7 +1447,7 @@ function _load_map() { var _fsNormalized; function _load_fsNormalized() { - return _fsNormalized = __webpack_require__(218); + return _fsNormalized = __webpack_require__(216); } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } @@ -1516,12 +1522,6 @@ function normalizeOS(body) { const cr = '\r'.charCodeAt(0); const lf = '\n'.charCodeAt(0); -/***/ }), -/* 5 */ -/***/ (function(module, exports) { - -module.exports = require("fs"); - /***/ }), /* 6 */ /***/ (function(module, exports, __webpack_require__) { @@ -1565,7 +1565,13 @@ class ResponseError extends Error { } exports.ResponseError = ResponseError; -class OneTimePasswordError extends Error {} +class OneTimePasswordError extends Error { + constructor(notice) { + super(); + this.notice = notice; + } + +} exports.OneTimePasswordError = OneTimePasswordError; /***/ }), @@ -1580,7 +1586,7 @@ exports.OneTimePasswordError = OneTimePasswordError; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Observer__ = __webpack_require__(420); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Subscription__ = __webpack_require__(25); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__internal_symbol_rxSubscriber__ = __webpack_require__(321); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__config__ = __webpack_require__(185); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__config__ = __webpack_require__(186); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__util_hostReportError__ = __webpack_require__(323); /** PURE_IMPORTS_START tslib,_util_isFunction,_Observer,_Subscription,_internal_symbol_rxSubscriber,_config,_util_hostReportError PURE_IMPORTS_END */ @@ -1836,7 +1842,7 @@ const os = __webpack_require__(46); const path = __webpack_require__(0); const userHome = __webpack_require__(67).default; -var _require = __webpack_require__(225); +var _require = __webpack_require__(222); const getCacheDir = _require.getCacheDir, getConfigDir = _require.getConfigDir, @@ -2027,7 +2033,7 @@ module.exports = invariant; "use strict"; -var YAMLException = __webpack_require__(54); +var YAMLException = __webpack_require__(55); var TYPE_CONSTRUCTOR_OPTIONS = [ 'kind', @@ -2102,9 +2108,9 @@ module.exports = require("crypto"); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Observable; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__util_canReportError__ = __webpack_require__(322); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_toSubscriber__ = __webpack_require__(932); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__internal_symbol_observable__ = __webpack_require__(117); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__internal_symbol_observable__ = __webpack_require__(118); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_pipe__ = __webpack_require__(324); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__config__ = __webpack_require__(185); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__config__ = __webpack_require__(186); /** PURE_IMPORTS_START _util_canReportError,_util_toSubscriber,_internal_symbol_observable,_util_pipe,_config PURE_IMPORTS_END */ @@ -2610,7 +2616,7 @@ exports.hyphenate = hyphenate; exports.camelCase = camelCase; exports.compareSortedArrays = compareSortedArrays; exports.sleep = sleep; -const _camelCase = __webpack_require__(230); +const _camelCase = __webpack_require__(227); function sortAlpha(a, b) { // sort alphabetically in a deterministic way @@ -2718,7 +2724,7 @@ function _load_asyncToGenerator() { var _parse; function _load_parse() { - return _parse = __webpack_require__(105); + return _parse = __webpack_require__(106); } Object.defineProperty(exports, 'parse', { @@ -2731,7 +2737,7 @@ Object.defineProperty(exports, 'parse', { var _stringify; function _load_stringify() { - return _stringify = __webpack_require__(199); + return _stringify = __webpack_require__(200); } Object.defineProperty(exports, 'stringify', { @@ -2758,7 +2764,7 @@ function _load_normalizePattern() { var _parse2; function _load_parse2() { - return _parse2 = _interopRequireDefault(__webpack_require__(105)); + return _parse2 = _interopRequireDefault(__webpack_require__(106)); } var _constants; @@ -2770,7 +2776,7 @@ function _load_constants() { var _fs; function _load_fs() { - return _fs = _interopRequireWildcard(__webpack_require__(4)); + return _fs = _interopRequireWildcard(__webpack_require__(5)); } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } @@ -2994,29 +3000,12 @@ exports.default = Lockfile; /* 20 */ /***/ (function(module, exports, __webpack_require__) { -var store = __webpack_require__(133)('wks'); -var uid = __webpack_require__(137); -var Symbol = __webpack_require__(17).Symbol; -var USE_SYMBOL = typeof Symbol == 'function'; - -var $exports = module.exports = function (name) { - return store[name] || (store[name] = - USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name)); -}; - -$exports.store = store; - - -/***/ }), -/* 21 */ -/***/ (function(module, exports, __webpack_require__) { - "use strict"; exports.__esModule = true; -var _assign = __webpack_require__(591); +var _assign = __webpack_require__(559); var _assign2 = _interopRequireDefault(_assign); @@ -3036,6 +3025,23 @@ exports.default = _assign2.default || function (target) { return target; }; +/***/ }), +/* 21 */ +/***/ (function(module, exports, __webpack_require__) { + +var store = __webpack_require__(133)('wks'); +var uid = __webpack_require__(137); +var Symbol = __webpack_require__(17).Symbol; +var USE_SYMBOL = typeof Symbol == 'function'; + +var $exports = module.exports = function (name) { + return store[name] || (store[name] = + USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name)); +}; + +$exports.store = store; + + /***/ }), /* 22 */ /***/ (function(module, exports) { @@ -4387,7 +4393,7 @@ module.exports = require("url"); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__util_isArray__ = __webpack_require__(41); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_isObject__ = __webpack_require__(444); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_isFunction__ = __webpack_require__(154); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_tryCatch__ = __webpack_require__(56); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_tryCatch__ = __webpack_require__(57); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__util_errorObject__ = __webpack_require__(48); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__util_UnsubscriptionError__ = __webpack_require__(441); /** PURE_IMPORTS_START _util_isArray,_util_isObject,_util_isFunction,_util_tryCatch,_util_errorObject,_util_UnsubscriptionError PURE_IMPORTS_END */ @@ -4954,7 +4960,7 @@ formats['pkcs1'] = __webpack_require__(327); formats['pkcs8'] = __webpack_require__(157); formats['rfc4253'] = __webpack_require__(103); formats['ssh'] = __webpack_require__(456); -formats['ssh-private'] = __webpack_require__(192); +formats['ssh-private'] = __webpack_require__(193); formats['openssh'] = formats['ssh-private']; formats['dnssec'] = __webpack_require__(326); @@ -5255,11 +5261,11 @@ function nullify(obj = {}) { "use strict"; -const escapeStringRegexp = __webpack_require__(388); -const ansiStyles = __webpack_require__(506); -const stdoutColor = __webpack_require__(598).stdout; +const escapeStringRegexp = __webpack_require__(382); +const ansiStyles = __webpack_require__(474); +const stdoutColor = __webpack_require__(566).stdout; -const template = __webpack_require__(599); +const template = __webpack_require__(567); const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm'); @@ -5707,7 +5713,7 @@ formats['pem'] = __webpack_require__(86); formats['pkcs1'] = __webpack_require__(327); formats['pkcs8'] = __webpack_require__(157); formats['rfc4253'] = __webpack_require__(103); -formats['ssh-private'] = __webpack_require__(192); +formats['ssh-private'] = __webpack_require__(193); formats['openssh'] = formats['ssh-private']; formats['ssh'] = formats['ssh-private']; formats['dnssec'] = __webpack_require__(326); @@ -5940,7 +5946,7 @@ exports.wrapLifecycle = exports.run = exports.install = exports.Install = undefi var _extends2; function _load_extends() { - return _extends2 = _interopRequireDefault(__webpack_require__(21)); + return _extends2 = _interopRequireDefault(__webpack_require__(20)); } var _asyncToGenerator2; @@ -6041,13 +6047,13 @@ function _load_objectPath() { var _hooks; function _load_hooks() { - return _hooks = __webpack_require__(374); + return _hooks = __webpack_require__(368); } var _index; function _load_index() { - return _index = _interopRequireDefault(__webpack_require__(220)); + return _index = _interopRequireDefault(__webpack_require__(218)); } var _errors; @@ -6059,7 +6065,7 @@ function _load_errors() { var _integrityChecker; function _load_integrityChecker() { - return _integrityChecker = _interopRequireDefault(__webpack_require__(208)); + return _integrityChecker = _interopRequireDefault(__webpack_require__(206)); } var _lockfile; @@ -6077,37 +6083,37 @@ function _load_lockfile2() { var _packageFetcher; function _load_packageFetcher() { - return _packageFetcher = _interopRequireWildcard(__webpack_require__(210)); + return _packageFetcher = _interopRequireWildcard(__webpack_require__(208)); } var _packageInstallScripts; function _load_packageInstallScripts() { - return _packageInstallScripts = _interopRequireDefault(__webpack_require__(557)); + return _packageInstallScripts = _interopRequireDefault(__webpack_require__(525)); } var _packageCompatibility; function _load_packageCompatibility() { - return _packageCompatibility = _interopRequireWildcard(__webpack_require__(209)); + return _packageCompatibility = _interopRequireWildcard(__webpack_require__(207)); } var _packageResolver; function _load_packageResolver() { - return _packageResolver = _interopRequireDefault(__webpack_require__(366)); + return _packageResolver = _interopRequireDefault(__webpack_require__(360)); } var _packageLinker; function _load_packageLinker() { - return _packageLinker = _interopRequireDefault(__webpack_require__(211)); + return _packageLinker = _interopRequireDefault(__webpack_require__(209)); } var _index2; function _load_index2() { - return _index2 = __webpack_require__(57); + return _index2 = __webpack_require__(58); } var _index3; @@ -6119,7 +6125,7 @@ function _load_index3() { var _autoclean; function _load_autoclean() { - return _autoclean = __webpack_require__(354); + return _autoclean = __webpack_require__(348); } var _constants; @@ -6137,7 +6143,7 @@ function _load_normalizePattern() { var _fs; function _load_fs() { - return _fs = _interopRequireWildcard(__webpack_require__(4)); + return _fs = _interopRequireWildcard(__webpack_require__(5)); } var _map; @@ -6149,13 +6155,13 @@ function _load_map() { var _yarnVersion; function _load_yarnVersion() { - return _yarnVersion = __webpack_require__(120); + return _yarnVersion = __webpack_require__(105); } var _generatePnpMap; function _load_generatePnpMap() { - return _generatePnpMap = __webpack_require__(579); + return _generatePnpMap = __webpack_require__(547); } var _workspaceLayout; @@ -6167,7 +6173,7 @@ function _load_workspaceLayout() { var _resolutionMap; function _load_resolutionMap() { - return _resolutionMap = _interopRequireDefault(__webpack_require__(214)); + return _resolutionMap = _interopRequireDefault(__webpack_require__(212)); } var _guessName; @@ -6179,20 +6185,20 @@ function _load_guessName() { var _audit; function _load_audit() { - return _audit = _interopRequireDefault(__webpack_require__(353)); + return _audit = _interopRequireDefault(__webpack_require__(347)); } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -const deepEqual = __webpack_require__(631); +const deepEqual = __webpack_require__(599); const emoji = __webpack_require__(302); const invariant = __webpack_require__(9); const path = __webpack_require__(0); const semver = __webpack_require__(22); -const uuid = __webpack_require__(119); +const uuid = __webpack_require__(120); const ssri = __webpack_require__(65); const ONE_DAY = 1000 * 60 * 60 * 24; @@ -7485,7 +7491,7 @@ function setFlags(commander) { /* 35 */ /***/ (function(module, exports, __webpack_require__) { -var isObject = __webpack_require__(52); +var isObject = __webpack_require__(53); module.exports = function (it) { if (!isObject(it)) throw TypeError(it + ' is not an object!'); return it; @@ -7504,7 +7510,7 @@ module.exports = function (it) { /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Observable__ = __webpack_require__(12); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Subscriber__ = __webpack_require__(7); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Subscription__ = __webpack_require__(25); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__util_ObjectUnsubscribedError__ = __webpack_require__(189); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__util_ObjectUnsubscribedError__ = __webpack_require__(190); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__SubjectSubscription__ = __webpack_require__(422); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__internal_symbol_rxSubscriber__ = __webpack_require__(321); /** PURE_IMPORTS_START tslib,_Observable,_Subscriber,_Subscription,_util_ObjectUnsubscribedError,_SubjectSubscription,_internal_symbol_rxSubscriber PURE_IMPORTS_END */ @@ -24882,7 +24888,7 @@ var isArray = Array.isArray || (function (x) { return x && typeof x.length === ' var dP = __webpack_require__(72); var createDesc = __webpack_require__(132); -module.exports = __webpack_require__(51) ? function (object, key, value) { +module.exports = __webpack_require__(52) ? function (object, key, value) { return dP.f(object, key, createDesc(1, value)); } : function (object, key, value) { object[key] = value; @@ -24966,7 +24972,7 @@ module.exports.extend = extend; /*eslint-disable max-len*/ var common = __webpack_require__(43); -var YAMLException = __webpack_require__(54); +var YAMLException = __webpack_require__(55); var Type = __webpack_require__(10); @@ -25232,6 +25238,223 @@ function isScheduler(value) { "use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.exec = exports.queue = undefined; +exports.forkp = forkp; +exports.spawnp = spawnp; +exports.forwardSignalToSpawnedProcesses = forwardSignalToSpawnedProcesses; +exports.spawn = spawn; + +var _constants; + +function _load_constants() { + return _constants = _interopRequireWildcard(__webpack_require__(8)); +} + +var _blockingQueue; + +function _load_blockingQueue() { + return _blockingQueue = _interopRequireDefault(__webpack_require__(110)); +} + +var _errors; + +function _load_errors() { + return _errors = __webpack_require__(6); +} + +var _promise; + +function _load_promise() { + return _promise = __webpack_require__(51); +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +/* global child_process$spawnOpts */ + +const child = __webpack_require__(331); +const fs = __webpack_require__(4); +const path = __webpack_require__(0); + +const queue = exports.queue = new (_blockingQueue || _load_blockingQueue()).default('child', (_constants || _load_constants()).CHILD_CONCURRENCY); + +// TODO: this uid check is kinda whack +let uid = 0; + +const exec = exports.exec = (0, (_promise || _load_promise()).promisify)(child.exec); + +function validate(program, opts = {}) { + if (program.match(/[\\\/]/)) { + return; + } + + if (process.platform === 'win32' && process.env.PATHEXT) { + const cwd = opts.cwd || process.cwd(); + const pathext = process.env.PATHEXT; + + for (var _iterator = pathext.split(';'), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref = _i.value; + } + + const ext = _ref; + + const candidate = path.join(cwd, `${program}${ext}`); + if (fs.existsSync(candidate)) { + throw new Error(`Potentially dangerous call to "${program}" in ${cwd}`); + } + } + } +} + +function forkp(program, args, opts) { + validate(program, opts); + const key = String(++uid); + return new Promise((resolve, reject) => { + const proc = child.fork(program, args, opts); + spawnedProcesses[key] = proc; + + proc.on('error', error => { + reject(error); + }); + + proc.on('close', exitCode => { + resolve(exitCode); + }); + }); +} + +function spawnp(program, args, opts) { + validate(program, opts); + const key = String(++uid); + return new Promise((resolve, reject) => { + const proc = child.spawn(program, args, opts); + spawnedProcesses[key] = proc; + + proc.on('error', error => { + reject(error); + }); + + proc.on('close', exitCode => { + resolve(exitCode); + }); + }); +} + +const spawnedProcesses = {}; + +function forwardSignalToSpawnedProcesses(signal) { + for (var _iterator2 = Object.keys(spawnedProcesses), _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { + var _ref2; + + if (_isArray2) { + if (_i2 >= _iterator2.length) break; + _ref2 = _iterator2[_i2++]; + } else { + _i2 = _iterator2.next(); + if (_i2.done) break; + _ref2 = _i2.value; + } + + const key = _ref2; + + spawnedProcesses[key].kill(signal); + } +} + +function spawn(program, args, opts = {}, onData) { + const key = opts.cwd || String(++uid); + return queue.push(key, () => new Promise((resolve, reject) => { + validate(program, opts); + + const proc = child.spawn(program, args, opts); + spawnedProcesses[key] = proc; + + let processingDone = false; + let processClosed = false; + let err = null; + + let stdout = ''; + + proc.on('error', err => { + if (err.code === 'ENOENT') { + reject(new (_errors || _load_errors()).ProcessSpawnError(`Couldn't find the binary ${program}`, err.code, program)); + } else { + reject(err); + } + }); + + function updateStdout(chunk) { + stdout += chunk; + if (onData) { + onData(chunk); + } + } + + function finish() { + delete spawnedProcesses[key]; + if (err) { + reject(err); + } else { + resolve(stdout.trim()); + } + } + + if (typeof opts.process === 'function') { + opts.process(proc, updateStdout, reject, function () { + if (processClosed) { + finish(); + } else { + processingDone = true; + } + }); + } else { + if (proc.stderr) { + proc.stderr.on('data', updateStdout); + } + + if (proc.stdout) { + proc.stdout.on('data', updateStdout); + } + + processingDone = true; + } + + proc.on('close', (code, signal) => { + if (signal || code >= 1) { + err = new (_errors || _load_errors()).ProcessTermError(['Command failed.', signal ? `Exit signal: ${signal}` : `Exit code: ${code}`, `Command: ${program}`, `Arguments: ${args.join(' ')}`, `Directory: ${opts.cwd || process.cwd()}`, `Output:\n${stdout.trim()}`].join('\n')); + err.EXIT_SIGNAL = signal; + err.EXIT_CODE = code; + } + + if (processingDone || err) { + finish(); + } else { + processClosed = true; + } + }); + })); +} + +/***/ }), +/* 51 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + Object.defineProperty(exports, "__esModule", { value: true }); @@ -25309,7 +25532,7 @@ function queue(arr, promiseProducer, concurrency = Infinity) { } /***/ }), -/* 51 */ +/* 52 */ /***/ (function(module, exports, __webpack_require__) { // Thank's IE8 for his funny defineProperty @@ -25319,7 +25542,7 @@ module.exports = !__webpack_require__(112)(function () { /***/ }), -/* 52 */ +/* 53 */ /***/ (function(module, exports) { module.exports = function (it) { @@ -25328,14 +25551,14 @@ module.exports = function (it) { /***/ }), -/* 53 */ +/* 54 */ /***/ (function(module, exports) { module.exports = {}; /***/ }), -/* 54 */ +/* 55 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -25385,7 +25608,7 @@ module.exports = YAMLException; /***/ }), -/* 55 */ +/* 56 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -25420,7 +25643,7 @@ module.exports = new Schema({ /***/ }), -/* 56 */ +/* 57 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -25446,7 +25669,7 @@ function tryCatch(fn) { /***/ }), -/* 57 */ +/* 58 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -25460,7 +25683,7 @@ exports.registryNames = exports.registries = undefined; var _yarnRegistry; function _load_yarnRegistry() { - return _yarnRegistry = _interopRequireDefault(__webpack_require__(559)); + return _yarnRegistry = _interopRequireDefault(__webpack_require__(527)); } var _npmRegistry; @@ -25478,182 +25701,6 @@ const registries = exports.registries = { const registryNames = exports.registryNames = Object.keys(registries); -/***/ }), -/* 58 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.exec = exports.queue = undefined; -exports.forkp = forkp; -exports.spawnp = spawnp; -exports.forwardSignalToSpawnedProcesses = forwardSignalToSpawnedProcesses; -exports.spawn = spawn; - -var _constants; - -function _load_constants() { - return _constants = _interopRequireWildcard(__webpack_require__(8)); -} - -var _blockingQueue; - -function _load_blockingQueue() { - return _blockingQueue = _interopRequireDefault(__webpack_require__(110)); -} - -var _errors; - -function _load_errors() { - return _errors = __webpack_require__(6); -} - -var _promise; - -function _load_promise() { - return _promise = __webpack_require__(50); -} - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - -/* global child_process$spawnOpts */ - -const child = __webpack_require__(331); - -const queue = exports.queue = new (_blockingQueue || _load_blockingQueue()).default('child', (_constants || _load_constants()).CHILD_CONCURRENCY); - -// TODO: this uid check is kinda whack -let uid = 0; - -const exec = exports.exec = (0, (_promise || _load_promise()).promisify)(child.exec); - -function forkp(program, args, opts) { - return new Promise((resolve, reject) => { - const proc = child.fork(program, args, opts); - - proc.on('error', error => { - reject(error); - }); - - proc.on('close', exitCode => { - resolve(exitCode); - }); - }); -} - -function spawnp(program, args, opts) { - return new Promise((resolve, reject) => { - const proc = child.spawn(program, args, opts); - - proc.on('error', error => { - reject(error); - }); - - proc.on('close', exitCode => { - resolve(exitCode); - }); - }); -} - -const spawnedProcesses = {}; - -function forwardSignalToSpawnedProcesses(signal) { - for (var _iterator = Object.keys(spawnedProcesses), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { - var _ref; - - if (_isArray) { - if (_i >= _iterator.length) break; - _ref = _iterator[_i++]; - } else { - _i = _iterator.next(); - if (_i.done) break; - _ref = _i.value; - } - - const key = _ref; - - spawnedProcesses[key].kill(signal); - } -} - -function spawn(program, args, opts = {}, onData) { - const key = opts.cwd || String(++uid); - return queue.push(key, () => new Promise((resolve, reject) => { - const proc = child.spawn(program, args, opts); - spawnedProcesses[key] = proc; - - let processingDone = false; - let processClosed = false; - let err = null; - - let stdout = ''; - - proc.on('error', err => { - if (err.code === 'ENOENT') { - reject(new (_errors || _load_errors()).ProcessSpawnError(`Couldn't find the binary ${program}`, err.code, program)); - } else { - reject(err); - } - }); - - function updateStdout(chunk) { - stdout += chunk; - if (onData) { - onData(chunk); - } - } - - function finish() { - delete spawnedProcesses[key]; - if (err) { - reject(err); - } else { - resolve(stdout.trim()); - } - } - - if (typeof opts.process === 'function') { - opts.process(proc, updateStdout, reject, function () { - if (processClosed) { - finish(); - } else { - processingDone = true; - } - }); - } else { - if (proc.stderr) { - proc.stderr.on('data', updateStdout); - } - - if (proc.stdout) { - proc.stdout.on('data', updateStdout); - } - - processingDone = true; - } - - proc.on('close', (code, signal) => { - if (signal || code >= 1) { - err = new (_errors || _load_errors()).ProcessTermError(['Command failed.', signal ? `Exit signal: ${signal}` : `Exit code: ${code}`, `Command: ${program}`, `Arguments: ${args.join(' ')}`, `Directory: ${opts.cwd || process.cwd()}`, `Output:\n${stdout.trim()}`].join('\n')); - err.EXIT_SIGNAL = signal; - err.EXIT_CODE = code; - } - - if (processingDone || err) { - finish(); - } else { - processClosed = true; - } - }); - })); -} - /***/ }), /* 59 */ /***/ (function(module, exports, __webpack_require__) { @@ -25980,7 +26027,7 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "mergeScan", function() { return __WEBPACK_IMPORTED_MODULE_47__internal_operators_mergeScan__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_48__internal_operators_min__ = __webpack_require__(875); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "min", function() { return __WEBPACK_IMPORTED_MODULE_48__internal_operators_min__["a"]; }); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_49__internal_operators_multicast__ = __webpack_require__(116); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_49__internal_operators_multicast__ = __webpack_require__(117); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "multicast", function() { return __WEBPACK_IMPORTED_MODULE_49__internal_operators_multicast__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_50__internal_operators_observeOn__ = __webpack_require__(434); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "observeOn", function() { return __WEBPACK_IMPORTED_MODULE_50__internal_operators_observeOn__["b"]; }); @@ -26002,7 +26049,7 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "publishReplay", function() { return __WEBPACK_IMPORTED_MODULE_58__internal_operators_publishReplay__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_59__internal_operators_race__ = __webpack_require__(884); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "race", function() { return __WEBPACK_IMPORTED_MODULE_59__internal_operators_race__["a"]; }); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_60__internal_operators_reduce__ = __webpack_require__(187); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_60__internal_operators_reduce__ = __webpack_require__(188); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "reduce", function() { return __WEBPACK_IMPORTED_MODULE_60__internal_operators_reduce__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_61__internal_operators_repeat__ = __webpack_require__(885); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "repeat", function() { return __WEBPACK_IMPORTED_MODULE_61__internal_operators_repeat__["a"]; }); @@ -26060,7 +26107,7 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "throttle", function() { return __WEBPACK_IMPORTED_MODULE_87__internal_operators_throttle__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_88__internal_operators_throttleTime__ = __webpack_require__(905); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "throttleTime", function() { return __WEBPACK_IMPORTED_MODULE_88__internal_operators_throttleTime__["a"]; }); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_89__internal_operators_throwIfEmpty__ = __webpack_require__(188); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_89__internal_operators_throwIfEmpty__ = __webpack_require__(189); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "throwIfEmpty", function() { return __WEBPACK_IMPORTED_MODULE_89__internal_operators_throwIfEmpty__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_90__internal_operators_timeInterval__ = __webpack_require__(906); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "timeInterval", function() { return __WEBPACK_IMPORTED_MODULE_90__internal_operators_timeInterval__["a"]; }); @@ -26597,7 +26644,7 @@ function getPrioritizedHash (algo1, algo2) { // If you have no idea what ASN.1 or BER is, see this: // ftp://ftp.rsa.com/pub/pkcs/ascii/layman.asc -var Ber = __webpack_require__(514); +var Ber = __webpack_require__(482); @@ -26629,7 +26676,7 @@ exports.home = undefined; var _rootUser; function _load_rootUser() { - return _rootUser = _interopRequireDefault(__webpack_require__(223)); + return _rootUser = _interopRequireDefault(__webpack_require__(221)); } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -26704,11 +26751,11 @@ module.exports = function (it, key) { /***/ (function(module, exports, __webpack_require__) { var anObject = __webpack_require__(35); -var IE8_DOM_DEFINE = __webpack_require__(238); -var toPrimitive = __webpack_require__(255); +var IE8_DOM_DEFINE = __webpack_require__(235); +var toPrimitive = __webpack_require__(252); var dP = Object.defineProperty; -exports.f = __webpack_require__(51) ? Object.defineProperty : function defineProperty(O, P, Attributes) { +exports.f = __webpack_require__(52) ? Object.defineProperty : function defineProperty(O, P, Attributes) { anObject(O); P = toPrimitive(P, true); anObject(Attributes); @@ -26743,7 +26790,7 @@ var Schema = __webpack_require__(44); module.exports = Schema.DEFAULT = new Schema({ include: [ - __webpack_require__(55) + __webpack_require__(56) ], explicit: [ __webpack_require__(290), @@ -29586,13 +29633,13 @@ function _load_baseResolver() { var _npmResolver; function _load_npmResolver() { - return _npmResolver = _interopRequireDefault(__webpack_require__(217)); + return _npmResolver = _interopRequireDefault(__webpack_require__(215)); } var _yarnResolver; function _load_yarnResolver() { - return _yarnResolver = _interopRequireDefault(__webpack_require__(576)); + return _yarnResolver = _interopRequireDefault(__webpack_require__(544)); } var _gitResolver; @@ -29604,43 +29651,43 @@ function _load_gitResolver() { var _tarballResolver; function _load_tarballResolver() { - return _tarballResolver = _interopRequireDefault(__webpack_require__(574)); + return _tarballResolver = _interopRequireDefault(__webpack_require__(542)); } var _githubResolver; function _load_githubResolver() { - return _githubResolver = _interopRequireDefault(__webpack_require__(367)); + return _githubResolver = _interopRequireDefault(__webpack_require__(361)); } var _fileResolver; function _load_fileResolver() { - return _fileResolver = _interopRequireDefault(__webpack_require__(215)); + return _fileResolver = _interopRequireDefault(__webpack_require__(213)); } var _linkResolver; function _load_linkResolver() { - return _linkResolver = _interopRequireDefault(__webpack_require__(368)); + return _linkResolver = _interopRequireDefault(__webpack_require__(362)); } var _gitlabResolver; function _load_gitlabResolver() { - return _gitlabResolver = _interopRequireDefault(__webpack_require__(572)); + return _gitlabResolver = _interopRequireDefault(__webpack_require__(540)); } var _gistResolver; function _load_gistResolver() { - return _gistResolver = _interopRequireDefault(__webpack_require__(216)); + return _gistResolver = _interopRequireDefault(__webpack_require__(214)); } var _bitbucketResolver; function _load_bitbucketResolver() { - return _bitbucketResolver = _interopRequireDefault(__webpack_require__(571)); + return _bitbucketResolver = _interopRequireDefault(__webpack_require__(539)); } var _hostedGitResolver; @@ -29652,7 +29699,7 @@ function _load_hostedGitResolver() { var _registryResolver; function _load_registryResolver() { - return _registryResolver = _interopRequireDefault(__webpack_require__(573)); + return _registryResolver = _interopRequireDefault(__webpack_require__(541)); } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -29730,7 +29777,7 @@ for (const key in registries) { var _ = __webpack_require__(38); var chalk = __webpack_require__(30); -var runAsync = __webpack_require__(181); +var runAsync = __webpack_require__(182); var { filter, flatMap, share, take, takeUntil } = __webpack_require__(63); var Choices = __webpack_require__(686); var ScreenManager = __webpack_require__(697); @@ -29878,7 +29925,7 @@ module.exports = Prompt; "use strict"; -var { fromEvent } = __webpack_require__(182); +var { fromEvent } = __webpack_require__(183); var { filter, map, share } = __webpack_require__(63); function normalizeKeypressEvents(value, key) { @@ -31308,7 +31355,7 @@ try { } catch (er) {} var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {} -var expand = __webpack_require__(229) +var expand = __webpack_require__(226) var plTypes = { '!': { open: '(?:(?!(?:', close: '))[^/]*?)'}, @@ -32370,7 +32417,7 @@ var PrivateKey = __webpack_require__(33); var pkcs1 = __webpack_require__(327); var pkcs8 = __webpack_require__(157); -var sshpriv = __webpack_require__(192); +var sshpriv = __webpack_require__(193); var rfc4253 = __webpack_require__(103); var errors = __webpack_require__(74); @@ -32567,7 +32614,7 @@ exports.SCOPE_SEPARATOR = undefined; var _extends2; function _load_extends() { - return _extends2 = _interopRequireDefault(__webpack_require__(21)); + return _extends2 = _interopRequireDefault(__webpack_require__(20)); } var _asyncToGenerator2; @@ -32585,25 +32632,25 @@ function _load_constants() { var _fs; function _load_fs() { - return _fs = _interopRequireWildcard(__webpack_require__(4)); + return _fs = _interopRequireWildcard(__webpack_require__(5)); } var _npmResolver; function _load_npmResolver() { - return _npmResolver = _interopRequireDefault(__webpack_require__(217)); + return _npmResolver = _interopRequireDefault(__webpack_require__(215)); } var _envReplace; function _load_envReplace() { - return _envReplace = _interopRequireDefault(__webpack_require__(577)); + return _envReplace = _interopRequireDefault(__webpack_require__(545)); } var _baseRegistry; function _load_baseRegistry() { - return _baseRegistry = _interopRequireDefault(__webpack_require__(558)); + return _baseRegistry = _interopRequireDefault(__webpack_require__(526)); } var _misc; @@ -32615,7 +32662,7 @@ function _load_misc() { var _path; function _load_path() { - return _path = __webpack_require__(377); + return _path = __webpack_require__(371); } var _normalizeUrl; @@ -32751,7 +32798,7 @@ class NpmRegistry extends (_baseRegistry || _load_baseRegistry()).default { let resolved = pathname; if (!REGEX_REGISTRY_PREFIX.test(pathname)) { - resolved = (_url || _load_url()).default.resolve((0, (_misc || _load_misc()).addSuffix)(registry, '/'), pathname); + resolved = (_url || _load_url()).default.resolve((0, (_misc || _load_misc()).addSuffix)(registry, '/'), `./${pathname}`); } if (REGEX_REGISTRY_ENFORCED_HTTPS.test(resolved)) { @@ -32826,6 +32873,10 @@ class NpmRegistry extends (_baseRegistry || _load_baseRegistry()).default { } _this.reporter.info(_this.reporter.lang('twoFactorAuthenticationEnabled')); + if (error.notice) { + _this.reporter.info(error.notice); + } + _this.otp = yield (0, (_login || _load_login()).getOneTimePassword)(_this.reporter); _this.requestManager.clearCache(); @@ -33225,7 +33276,7 @@ module.exports = function (it) { /* 92 */ /***/ (function(module, exports, __webpack_require__) { -var isObject = __webpack_require__(52); +var isObject = __webpack_require__(53); var document = __webpack_require__(17).document; // typeof document.createElement is 'object' in old IE var is = isObject(document) && isObject(document.createElement); @@ -33272,7 +33323,7 @@ module.exports.f = function (C) { var def = __webpack_require__(72).f; var has = __webpack_require__(71); -var TAG = __webpack_require__(20)('toStringTag'); +var TAG = __webpack_require__(21)('toStringTag'); module.exports = function (it, tag, stat) { if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag }); @@ -33307,7 +33358,7 @@ module.exports = function (it) { /***/ (function(module, exports, __webpack_require__) { // to indexed object, toObject with fallback for non-array-like ES3 strings -var IObject = __webpack_require__(170); +var IObject = __webpack_require__(171); var defined = __webpack_require__(91); module.exports = function (it) { return IObject(defined(it)); @@ -33360,7 +33411,7 @@ module.exports = function (it) { module.exports = glob -var fs = __webpack_require__(5) +var fs = __webpack_require__(4) var rp = __webpack_require__(140) var minimatch = __webpack_require__(82) var Minimatch = minimatch.Minimatch @@ -33369,7 +33420,7 @@ var EE = __webpack_require__(77).EventEmitter var path = __webpack_require__(0) var assert = __webpack_require__(28) var isAbsolute = __webpack_require__(101) -var globSync = __webpack_require__(272) +var globSync = __webpack_require__(269) var common = __webpack_require__(141) var alphasort = common.alphasort var alphasorti = common.alphasorti @@ -34180,7 +34231,7 @@ if (process.env.READABLE_STREAM === 'disable' && Stream) { exports.Stream = Stream || exports; exports.Readable = exports; exports.Writable = __webpack_require__(408); - exports.Duplex = __webpack_require__(115); + exports.Duplex = __webpack_require__(116); exports.Transform = __webpack_require__(407); exports.PassThrough = __webpack_require__(792); } @@ -34371,6 +34422,85 @@ module.exports = require("tty"); "use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.getInstallationMethod = exports.version = undefined; + +var _asyncToGenerator2; + +function _load_asyncToGenerator() { + return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2)); +} + +let getInstallationMethod = exports.getInstallationMethod = (() => { + var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + let installationMethod = originalInstallationMethod; + + // If there's a package.json in the parent directory, it could have an + // override for the installation method, so we should prefer that over + // whatever was originally in Yarn's package.json. This is the case with + // systems such as Homebrew, which take the tarball and modify the + // installation method so we're aware of the fact that Yarn was installed via + // Homebrew (so things like update notifications can point out the correct + // command to upgrade). + try { + const manifestPath = (_path || _load_path()).default.join(__dirname, '..', 'package.json'); + if ((_fs2 || _load_fs2()).default.existsSync(manifestPath)) { + // non-async version is deprecated + const manifest = yield (0, (_fs || _load_fs()).readJson)(manifestPath); + if (manifest.installationMethod) { + installationMethod = manifest.installationMethod; + } + } + } catch (e) { + // Ignore any errors; this is not critical functionality. + } + return installationMethod; + }); + + return function getInstallationMethod() { + return _ref.apply(this, arguments); + }; +})(); + +var _fs; + +function _load_fs() { + return _fs = __webpack_require__(5); +} + +var _fs2; + +function _load_fs2() { + return _fs2 = _interopRequireDefault(__webpack_require__(4)); +} + +var _path; + +function _load_path() { + return _path = _interopRequireDefault(__webpack_require__(0)); +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +// This will be bundled directly in the .js file for production builds +var _require = __webpack_require__(195); /** + * Determines the current version of Yarn itself. + * + */ + +const version = _require.version, + originalInstallationMethod = _require.installationMethod; +exports.version = version; + +/***/ }), +/* 106 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + Object.defineProperty(exports, "__esModule", { value: true }); @@ -34846,280 +34976,6 @@ function parseWithConflict(str, fileLoc) { } } -/***/ }), -/* 106 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - - -module.exports = { - copy: copy, - checkDataType: checkDataType, - checkDataTypes: checkDataTypes, - coerceToTypes: coerceToTypes, - toHash: toHash, - getProperty: getProperty, - escapeQuotes: escapeQuotes, - equal: __webpack_require__(204), - ucs2length: __webpack_require__(480), - varOccurences: varOccurences, - varReplace: varReplace, - cleanUpCode: cleanUpCode, - finalCleanUpCode: finalCleanUpCode, - schemaHasRules: schemaHasRules, - schemaHasRulesExcept: schemaHasRulesExcept, - toQuotedString: toQuotedString, - getPathExpr: getPathExpr, - getPath: getPath, - getData: getData, - unescapeFragment: unescapeFragment, - unescapeJsonPointer: unescapeJsonPointer, - escapeFragment: escapeFragment, - escapeJsonPointer: escapeJsonPointer -}; - - -function copy(o, to) { - to = to || {}; - for (var key in o) to[key] = o[key]; - return to; -} - - -function checkDataType(dataType, data, negate) { - var EQUAL = negate ? ' !== ' : ' === ' - , AND = negate ? ' || ' : ' && ' - , OK = negate ? '!' : '' - , NOT = negate ? '' : '!'; - switch (dataType) { - case 'null': return data + EQUAL + 'null'; - case 'array': return OK + 'Array.isArray(' + data + ')'; - case 'object': return '(' + OK + data + AND + - 'typeof ' + data + EQUAL + '"object"' + AND + - NOT + 'Array.isArray(' + data + '))'; - case 'integer': return '(typeof ' + data + EQUAL + '"number"' + AND + - NOT + '(' + data + ' % 1)' + - AND + data + EQUAL + data + ')'; - default: return 'typeof ' + data + EQUAL + '"' + dataType + '"'; - } -} - - -function checkDataTypes(dataTypes, data) { - switch (dataTypes.length) { - case 1: return checkDataType(dataTypes[0], data, true); - default: - var code = ''; - var types = toHash(dataTypes); - if (types.array && types.object) { - code = types.null ? '(': '(!' + data + ' || '; - code += 'typeof ' + data + ' !== "object")'; - delete types.null; - delete types.array; - delete types.object; - } - if (types.number) delete types.integer; - for (var t in types) - code += (code ? ' && ' : '' ) + checkDataType(t, data, true); - - return code; - } -} - - -var COERCE_TO_TYPES = toHash([ 'string', 'number', 'integer', 'boolean', 'null' ]); -function coerceToTypes(optionCoerceTypes, dataTypes) { - if (Array.isArray(dataTypes)) { - var types = []; - for (var i=0; i= lvl) throw new Error('Cannot access property/index ' + up + ' levels up, current level is ' + lvl); - return paths[lvl - up]; - } - - if (up > lvl) throw new Error('Cannot access data ' + up + ' levels up, current level is ' + lvl); - data = 'data' + ((lvl - up) || ''); - if (!jsonPointer) return data; - } - - var expr = data; - var segments = jsonPointer.split('/'); - for (var i=0; i= lvl) throw new Error('Cannot access property/index ' + up + ' levels up, current level is ' + lvl); + return paths[lvl - up]; + } + + if (up > lvl) throw new Error('Cannot access data ' + up + ' levels up, current level is ' + lvl); + data = 'data' + ((lvl - up) || ''); + if (!jsonPointer) return data; + } + + var expr = data; + var segments = jsonPointer.split('/'); + for (var i=0; i * @@ -37114,7 +37244,7 @@ module.exports = micromatch; /***/ }), -/* 115 */ +/* 116 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -37148,7 +37278,7 @@ module.exports = micromatch; /**/ -var pna = __webpack_require__(180); +var pna = __webpack_require__(181); /**/ /**/ @@ -37251,7 +37381,7 @@ Duplex.prototype._destroy = function (err, cb) { }; /***/ }), -/* 116 */ +/* 117 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -37299,7 +37429,7 @@ var MulticastOperator = /*@__PURE__*/ (function () { /***/ }), -/* 117 */ +/* 118 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -37310,7 +37440,7 @@ var observable = typeof Symbol === 'function' && Symbol.observable || '@@observa /***/ }), -/* 118 */ +/* 119 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -37323,7 +37453,7 @@ function identity(x) { /***/ }), -/* 119 */ +/* 120 */ /***/ (function(module, exports, __webpack_require__) { var v1 = __webpack_require__(957); @@ -37336,85 +37466,6 @@ uuid.v4 = v4; module.exports = uuid; -/***/ }), -/* 120 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.getInstallationMethod = exports.version = undefined; - -var _asyncToGenerator2; - -function _load_asyncToGenerator() { - return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2)); -} - -let getInstallationMethod = exports.getInstallationMethod = (() => { - var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { - let installationMethod = originalInstallationMethod; - - // If there's a package.json in the parent directory, it could have an - // override for the installation method, so we should prefer that over - // whatever was originally in Yarn's package.json. This is the case with - // systems such as Homebrew, which take the tarball and modify the - // installation method so we're aware of the fact that Yarn was installed via - // Homebrew (so things like update notifications can point out the correct - // command to upgrade). - try { - const manifestPath = (_path || _load_path()).default.join(__dirname, '..', 'package.json'); - if ((_fs2 || _load_fs2()).default.existsSync(manifestPath)) { - // non-async version is deprecated - const manifest = yield (0, (_fs || _load_fs()).readJson)(manifestPath); - if (manifest.installationMethod) { - installationMethod = manifest.installationMethod; - } - } - } catch (e) { - // Ignore any errors; this is not critical functionality. - } - return installationMethod; - }); - - return function getInstallationMethod() { - return _ref.apply(this, arguments); - }; -})(); - -var _fs; - -function _load_fs() { - return _fs = __webpack_require__(4); -} - -var _fs2; - -function _load_fs2() { - return _fs2 = _interopRequireDefault(__webpack_require__(5)); -} - -var _path; - -function _load_path() { - return _path = _interopRequireDefault(__webpack_require__(0)); -} - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -// This will be bundled directly in the .js file for production builds -var _require = __webpack_require__(194); /** - * Determines the current version of Yarn itself. - * - */ - -const version = _require.version, - originalInstallationMethod = _require.installationMethod; -exports.version = version; - /***/ }), /* 121 */ /***/ (function(module, exports, __webpack_require__) { @@ -37707,7 +37758,7 @@ function _load_errors() { var _index; function _load_index() { - return _index = __webpack_require__(57); + return _index = __webpack_require__(58); } var _baseReporter; @@ -37743,25 +37794,25 @@ function _load_add() { var _remove; function _load_remove() { - return _remove = __webpack_require__(359); + return _remove = __webpack_require__(353); } var _upgrade; function _load_upgrade() { - return _upgrade = __webpack_require__(207); + return _upgrade = __webpack_require__(205); } var _upgradeInteractive; function _load_upgradeInteractive() { - return _upgradeInteractive = __webpack_require__(362); + return _upgradeInteractive = __webpack_require__(356); } var _packageLinker; function _load_packageLinker() { - return _packageLinker = __webpack_require__(211); + return _packageLinker = __webpack_require__(209); } var _constants; @@ -37773,7 +37824,7 @@ function _load_constants() { var _fs; function _load_fs() { - return _fs = _interopRequireWildcard(__webpack_require__(4)); + return _fs = _interopRequireWildcard(__webpack_require__(5)); } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } @@ -37981,7 +38032,7 @@ function _load_lockfile() { var _packageReference; function _load_packageReference() { - return _packageReference = _interopRequireDefault(__webpack_require__(365)); + return _packageReference = _interopRequireDefault(__webpack_require__(359)); } var _index; @@ -38005,19 +38056,19 @@ function _load_constants() { var _version; function _load_version() { - return _version = _interopRequireWildcard(__webpack_require__(226)); + return _version = _interopRequireWildcard(__webpack_require__(223)); } var _workspaceResolver; function _load_workspaceResolver() { - return _workspaceResolver = _interopRequireDefault(__webpack_require__(570)); + return _workspaceResolver = _interopRequireDefault(__webpack_require__(538)); } var _fs; function _load_fs() { - return _fs = _interopRequireWildcard(__webpack_require__(4)); + return _fs = _interopRequireWildcard(__webpack_require__(5)); } var _normalizePattern4; @@ -38030,7 +38081,7 @@ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -const micromatch = __webpack_require__(114); +const micromatch = __webpack_require__(115); class PackageRequest { constructor(req, resolver) { @@ -38577,7 +38628,7 @@ function _load_misc() { var _version; function _load_version() { - return _version = _interopRequireWildcard(__webpack_require__(226)); + return _version = _interopRequireWildcard(__webpack_require__(223)); } var _guessName; @@ -38589,7 +38640,7 @@ function _load_guessName() { var _index2; function _load_index2() { - return _index2 = __webpack_require__(57); + return _index2 = __webpack_require__(58); } var _exoticResolver; @@ -38601,7 +38652,7 @@ function _load_exoticResolver() { var _git; function _load_git() { - return _git = _interopRequireDefault(__webpack_require__(219)); + return _git = _interopRequireDefault(__webpack_require__(217)); } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } @@ -38858,13 +38909,13 @@ function _load_errors() { var _util; function _load_util() { - return _util = __webpack_require__(221); + return _util = __webpack_require__(219); } var _typos; function _load_typos() { - return _typos = _interopRequireDefault(__webpack_require__(587)); + return _typos = _interopRequireDefault(__webpack_require__(555)); } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -39022,7 +39073,7 @@ function cleanDependencies(info, isRoot, reporter, warn) { // getting tag from 19.1.3.6 Object.prototype.toString() var cof = __webpack_require__(69); -var TAG = __webpack_require__(20)('toStringTag'); +var TAG = __webpack_require__(21)('toStringTag'); // ES3 wrong here var ARG = cof(function () { return arguments; }()) == 'Arguments'; @@ -39071,13 +39122,13 @@ module.exports = document && document.documentElement; var LIBRARY = __webpack_require__(93); var $export = __webpack_require__(60); -var redefine = __webpack_require__(251); +var redefine = __webpack_require__(248); var hide = __webpack_require__(42); -var Iterators = __webpack_require__(53); -var $iterCreate = __webpack_require__(242); +var Iterators = __webpack_require__(54); +var $iterCreate = __webpack_require__(239); var setToStringTag = __webpack_require__(95); -var getPrototypeOf = __webpack_require__(248); -var ITERATOR = __webpack_require__(20)('iterator'); +var getPrototypeOf = __webpack_require__(245); +var ITERATOR = __webpack_require__(21)('iterator'); var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next` var FF_ITERATOR = '@@iterator'; var KEYS = 'keys'; @@ -39157,7 +39208,7 @@ module.exports = function (exec) { /***/ (function(module, exports, __webpack_require__) { var anObject = __webpack_require__(35); -var isObject = __webpack_require__(52); +var isObject = __webpack_require__(53); var newPromiseCapability = __webpack_require__(94); module.exports = function (C, x) { @@ -39209,7 +39260,7 @@ var store = global[SHARED] || (global[SHARED] = {}); // 7.3.20 SpeciesConstructor(O, defaultConstructor) var anObject = __webpack_require__(35); var aFunction = __webpack_require__(68); -var SPECIES = __webpack_require__(20)('species'); +var SPECIES = __webpack_require__(21)('species'); module.exports = function (O, D) { var C = anObject(O).constructor; var S; @@ -39222,7 +39273,7 @@ module.exports = function (O, D) { /***/ (function(module, exports, __webpack_require__) { var ctx = __webpack_require__(70); -var invoke = __webpack_require__(239); +var invoke = __webpack_require__(236); var html = __webpack_require__(128); var cel = __webpack_require__(92); var global = __webpack_require__(17); @@ -40139,13 +40190,13 @@ realpath.realpathSync = realpathSync realpath.monkeypatch = monkeypatch realpath.unmonkeypatch = unmonkeypatch -var fs = __webpack_require__(5) +var fs = __webpack_require__(4) var origRealpath = fs.realpath var origRealpathSync = fs.realpathSync var version = process.version var ok = /^v[0-5]\./.test(version) -var old = __webpack_require__(271) +var old = __webpack_require__(268) function newError (er) { return er && er.syscall === 'realpath' && ( @@ -40520,7 +40571,7 @@ module.exports = new Schema({ /***/ (function(module, exports, __webpack_require__) { var path = __webpack_require__(0); -var fs = __webpack_require__(5); +var fs = __webpack_require__(4); var _0777 = parseInt('0777', 8); module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP; @@ -42772,7 +42823,7 @@ Object.defineProperty(exports, "__esModule", { var _extends2; function _load_extends() { - return _extends2 = _interopRequireDefault(__webpack_require__(21)); + return _extends2 = _interopRequireDefault(__webpack_require__(20)); } var _asyncToGenerator2; @@ -42792,7 +42843,7 @@ function _load_executeLifecycleScript() { var _path; function _load_path() { - return _path = __webpack_require__(377); + return _path = __webpack_require__(371); } var _conversion; @@ -42804,7 +42855,7 @@ function _load_conversion() { var _index; function _load_index() { - return _index = _interopRequireDefault(__webpack_require__(220)); + return _index = _interopRequireDefault(__webpack_require__(218)); } var _errors; @@ -42816,7 +42867,7 @@ function _load_errors() { var _fs; function _load_fs() { - return _fs = _interopRequireWildcard(__webpack_require__(4)); + return _fs = _interopRequireWildcard(__webpack_require__(5)); } var _constants; @@ -42828,25 +42879,25 @@ function _load_constants() { var _packageConstraintResolver; function _load_packageConstraintResolver() { - return _packageConstraintResolver = _interopRequireDefault(__webpack_require__(555)); + return _packageConstraintResolver = _interopRequireDefault(__webpack_require__(523)); } var _requestManager; function _load_requestManager() { - return _requestManager = _interopRequireDefault(__webpack_require__(378)); + return _requestManager = _interopRequireDefault(__webpack_require__(372)); } var _index2; function _load_index2() { - return _index2 = __webpack_require__(57); + return _index2 = __webpack_require__(58); } var _index3; function _load_index3() { - return _index3 = __webpack_require__(200); + return _index3 = __webpack_require__(201); } var _map; @@ -42860,10 +42911,10 @@ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const crypto = __webpack_require__(11); -const detectIndent = __webpack_require__(635); +const detectIndent = __webpack_require__(603); const invariant = __webpack_require__(9); const path = __webpack_require__(0); -const micromatch = __webpack_require__(114); +const micromatch = __webpack_require__(115); const isCi = __webpack_require__(397); function sortObject(object) { @@ -43901,28 +43952,28 @@ function extractWorkspaces(manifest) { /* 163 */ /***/ (function(module, exports) { -module.exports = function(module) { - if(!module.webpackPolyfill) { - module.deprecate = function() {}; - module.paths = []; - // module.parent = undefined by default - if(!module.children) module.children = []; - Object.defineProperty(module, "loaded", { - enumerable: true, - get: function() { - return module.l; - } - }); - Object.defineProperty(module, "id", { - enumerable: true, - get: function() { - return module.i; - } - }); - module.webpackPolyfill = 1; - } - return module; -}; +module.exports = function(module) { + if(!module.webpackPolyfill) { + module.deprecate = function() {}; + module.paths = []; + // module.parent = undefined by default + if(!module.children) module.children = []; + Object.defineProperty(module, "loaded", { + enumerable: true, + get: function() { + return module.l; + } + }); + Object.defineProperty(module, "id", { + enumerable: true, + get: function() { + return module.i; + } + }); + module.webpackPolyfill = 1; + } + return module; +}; /***/ }), @@ -43952,7 +44003,7 @@ function _load_asyncToGenerator() { var _extends2; function _load_extends() { - return _extends2 = _interopRequireDefault(__webpack_require__(21)); + return _extends2 = _interopRequireDefault(__webpack_require__(20)); } let run = exports.run = (() => { @@ -44004,7 +44055,7 @@ function _load_index() { var _list; function _load_list() { - return _list = __webpack_require__(358); + return _list = __webpack_require__(352); } var _install; @@ -44028,7 +44079,7 @@ function _load_constants() { var _fs; function _load_fs() { - return _fs = _interopRequireWildcard(__webpack_require__(4)); + return _fs = _interopRequireWildcard(__webpack_require__(5)); } var _invariant; @@ -44622,13 +44673,13 @@ exports.hasWrapper = hasWrapper; var _fs; function _load_fs() { - return _fs = _interopRequireWildcard(__webpack_require__(4)); + return _fs = _interopRequireWildcard(__webpack_require__(5)); } var _filter; function _load_filter() { - return _filter = __webpack_require__(372); + return _filter = __webpack_require__(366); } var _errors; @@ -44641,10 +44692,10 @@ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -const zlib = __webpack_require__(198); +const zlib = __webpack_require__(199); const path = __webpack_require__(0); -const tar = __webpack_require__(193); -const fs2 = __webpack_require__(5); +const tar = __webpack_require__(194); +const fs2 = __webpack_require__(4); const depsFor = __webpack_require__(678); const FOLDERS_IGNORE = [ @@ -44703,7 +44754,7 @@ function _load_asyncToGenerator() { var _index; function _load_index() { - return _index = _interopRequireDefault(__webpack_require__(220)); + return _index = _interopRequireDefault(__webpack_require__(218)); } var _constants; @@ -44715,13 +44766,13 @@ function _load_constants() { var _fs; function _load_fs() { - return _fs = _interopRequireWildcard(__webpack_require__(4)); + return _fs = _interopRequireWildcard(__webpack_require__(5)); } var _mutex; function _load_mutex() { - return _mutex = _interopRequireDefault(__webpack_require__(375)); + return _mutex = _interopRequireDefault(__webpack_require__(369)); } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } @@ -44730,7 +44781,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de /* eslint no-unused-vars: 0 */ -const cmdShim = __webpack_require__(201); +const cmdShim = __webpack_require__(202); const path = __webpack_require__(0); class BaseFetcher { @@ -44967,6 +45018,139 @@ function guessName(source) { /* 170 */ /***/ (function(module, exports, __webpack_require__) { +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.satisfiesWithPrereleases = satisfiesWithPrereleases; +exports.diffWithUnstable = diffWithUnstable; + +var _semver; + +function _load_semver() { + return _semver = _interopRequireDefault(__webpack_require__(22)); +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Returns whether the given semver version satisfies the given range. Notably this supports + * prerelease versions so that "2.0.0-rc.0" satisfies the range ">=1.0.0", for example. + */ + +function satisfiesWithPrereleases(version, range, loose = false) { + let semverRange; + try { + // $FlowFixMe: Add a definition for the Range class + semverRange = new (_semver || _load_semver()).default.Range(range, loose); + } catch (err) { + return false; + } + + if (!version) { + return false; + } + let semverVersion; + try { + semverVersion = new (_semver || _load_semver()).default.SemVer(version, semverRange.loose); + } catch (err) { + return false; + } + + // A range has multiple sets of comparators. A version must satisfy all comparators in a set + // and at least one set to satisfy the range. + return semverRange.set.some(comparatorSet => { + // node-semver converts ~ and ^ ranges into pairs of >= and < ranges but the upper bounds don't + // properly exclude prerelease versions. For example, "^1.0.0" is converted to ">=1.0.0 <2.0.0", + // which includes "2.0.0-pre" since prerelease versions are lower than their non-prerelease + // counterparts. As a practical workaround we make upper-bound ranges exclude prereleases and + // convert "<2.0.0" to "<2.0.0-0", for example. + comparatorSet = comparatorSet.map(comparator => { + if (comparator.operator !== '<' || !comparator.value || comparator.semver.prerelease.length) { + return comparator; + } + + // "0" is the lowest prerelease version + comparator.semver.inc('pre', 0); + + const comparatorString = comparator.operator + comparator.semver.version; + // $FlowFixMe: Add a definition for the Comparator class + return new (_semver || _load_semver()).default.Comparator(comparatorString, comparator.loose); + }); + + return !comparatorSet.some(comparator => !comparator.test(semverVersion)); + }); +} + +const PRE_RELEASES = { + major: 'premajor', + minor: 'preminor', + patch: 'prepatch' +}; + +/** + * Returns the difference between two versions as a semantic string representation. + * Similar to the `diff` method in node-semver, but it also accounts for unstable versions, + * like 0.x.x or 0.0.x. + */ + +function diffWithUnstable(version1, version2) { + if ((_semver || _load_semver()).default.eq(version1, version2) === false) { + const v1 = (_semver || _load_semver()).default.parse(version1); + const v2 = (_semver || _load_semver()).default.parse(version2); + + if (v1 != null && v2 != null) { + const isPreRelease = v1.prerelease.length > 0 || v2.prerelease.length > 0; + const preMajor = v1.major === 0 || v2.major === 0; + const preMinor = preMajor && (v1.minor === 0 || v2.minor === 0); + + let diff = null; + + if (v1.major !== v2.major) { + diff = 'major'; + } else if (v1.minor !== v2.minor) { + if (preMajor) { + // If the major version number is zero (0.x.x), treat a change + // of the minor version number as a major change. + diff = 'major'; + } else { + diff = 'minor'; + } + } else if (v1.patch !== v2.patch) { + if (preMinor) { + // If the major & minor version numbers are zero (0.0.x), treat a change + // of the patch version number as a major change. + diff = 'major'; + } else if (preMajor) { + // If the major version number is zero (0.x.x), treat a change + // of the patch version number as a minor change. + diff = 'minor'; + } else { + diff = 'patch'; + } + } + + if (isPreRelease) { + if (diff != null) { + diff = PRE_RELEASES[diff]; + } else { + diff = 'prerelease'; + } + } + + return diff; + } + } + + return null; +} + +/***/ }), +/* 171 */ +/***/ (function(module, exports, __webpack_require__) { + // fallback for non-array-like ES3 and non-enumerable old V8 strings var cof = __webpack_require__(69); // eslint-disable-next-line no-prototype-builtins @@ -44976,11 +45160,11 @@ module.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) { /***/ }), -/* 171 */ +/* 172 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.2.14 / 15.2.3.14 Object.keys(O) -var $keys = __webpack_require__(249); +var $keys = __webpack_require__(246); var enumBugKeys = __webpack_require__(127); module.exports = Object.keys || function keys(O) { @@ -44989,7 +45173,7 @@ module.exports = Object.keys || function keys(O) { /***/ }), -/* 172 */ +/* 173 */ /***/ (function(module, exports, __webpack_require__) { // 7.1.13 ToObject(argument) @@ -45000,7 +45184,7 @@ module.exports = function (it) { /***/ }), -/* 173 */ +/* 174 */ /***/ (function(module, exports, __webpack_require__) { var once = __webpack_require__(83); @@ -45093,7 +45277,7 @@ module.exports = eos; /***/ }), -/* 174 */ +/* 175 */ /***/ (function(module, exports, __webpack_require__) { // Copyright 2012 Joyent, Inc. All rights reserved. @@ -45211,13 +45395,13 @@ module.exports = { /***/ }), -/* 175 */ +/* 176 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var chalk = __webpack_require__(30); -var figures = __webpack_require__(270); +var figures = __webpack_require__(267); /** * Separator object @@ -45255,7 +45439,7 @@ module.exports = Separator; /***/ }), -/* 176 */ +/* 177 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -45315,7 +45499,7 @@ module.exports = Paginator; /***/ }), -/* 177 */ +/* 178 */ /***/ (function(module, exports) { /*! @@ -45332,7 +45516,7 @@ module.exports = function isExtglob(str) { /***/ }), -/* 178 */ +/* 179 */ /***/ (function(module, exports, __webpack_require__) { /*! @@ -45342,7 +45526,7 @@ module.exports = function isExtglob(str) { * Licensed under the MIT License. */ -var isExtglob = __webpack_require__(177); +var isExtglob = __webpack_require__(178); module.exports = function isGlob(str) { return typeof str === 'string' @@ -45351,7 +45535,7 @@ module.exports = function isGlob(str) { }; /***/ }), -/* 179 */ +/* 180 */ /***/ (function(module, exports, __webpack_require__) { var isBuffer = __webpack_require__(729); @@ -45473,7 +45657,7 @@ module.exports = function kindOf(val) { /***/ }), -/* 180 */ +/* 181 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -45524,7 +45708,7 @@ function nextTick(fn, arg1, arg2, arg3) { /***/ }), -/* 181 */ +/* 182 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -45592,7 +45776,7 @@ runAsync.cb = function (func, cb) { /***/ }), -/* 182 */ +/* 183 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -45603,7 +45787,7 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "ConnectableObservable", function() { return __WEBPACK_IMPORTED_MODULE_1__internal_observable_ConnectableObservable__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__internal_operators_groupBy__ = __webpack_require__(433); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "GroupedObservable", function() { return __WEBPACK_IMPORTED_MODULE_2__internal_operators_groupBy__["a"]; }); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__internal_symbol_observable__ = __webpack_require__(117); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__internal_symbol_observable__ = __webpack_require__(118); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "observable", function() { return __WEBPACK_IMPORTED_MODULE_3__internal_symbol_observable__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__internal_Subject__ = __webpack_require__(36); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Subject", function() { return __WEBPACK_IMPORTED_MODULE_4__internal_Subject__["a"]; }); @@ -45611,7 +45795,7 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "BehaviorSubject", function() { return __WEBPACK_IMPORTED_MODULE_5__internal_BehaviorSubject__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__internal_ReplaySubject__ = __webpack_require__(308); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "ReplaySubject", function() { return __WEBPACK_IMPORTED_MODULE_6__internal_ReplaySubject__["a"]; }); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__internal_AsyncSubject__ = __webpack_require__(183); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__internal_AsyncSubject__ = __webpack_require__(184); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "AsyncSubject", function() { return __WEBPACK_IMPORTED_MODULE_7__internal_AsyncSubject__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__internal_scheduler_asap__ = __webpack_require__(438); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "asapScheduler", function() { return __WEBPACK_IMPORTED_MODULE_8__internal_scheduler_asap__["a"]; }); @@ -45630,13 +45814,13 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Subscription", function() { return __WEBPACK_IMPORTED_MODULE_14__internal_Subscription__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_15__internal_Subscriber__ = __webpack_require__(7); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Subscriber", function() { return __WEBPACK_IMPORTED_MODULE_15__internal_Subscriber__["a"]; }); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_16__internal_Notification__ = __webpack_require__(184); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_16__internal_Notification__ = __webpack_require__(185); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Notification", function() { return __WEBPACK_IMPORTED_MODULE_16__internal_Notification__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_17__internal_util_pipe__ = __webpack_require__(324); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "pipe", function() { return __WEBPACK_IMPORTED_MODULE_17__internal_util_pipe__["a"]; }); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_18__internal_util_noop__ = __webpack_require__(191); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_18__internal_util_noop__ = __webpack_require__(192); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "noop", function() { return __WEBPACK_IMPORTED_MODULE_18__internal_util_noop__["a"]; }); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_19__internal_util_identity__ = __webpack_require__(118); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_19__internal_util_identity__ = __webpack_require__(119); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "identity", function() { return __WEBPACK_IMPORTED_MODULE_19__internal_util_identity__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_20__internal_util_isObservable__ = __webpack_require__(930); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "isObservable", function() { return __WEBPACK_IMPORTED_MODULE_20__internal_util_isObservable__["a"]; }); @@ -45644,7 +45828,7 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "ArgumentOutOfRangeError", function() { return __WEBPACK_IMPORTED_MODULE_21__internal_util_ArgumentOutOfRangeError__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_22__internal_util_EmptyError__ = __webpack_require__(153); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "EmptyError", function() { return __WEBPACK_IMPORTED_MODULE_22__internal_util_EmptyError__["a"]; }); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_23__internal_util_ObjectUnsubscribedError__ = __webpack_require__(189); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_23__internal_util_ObjectUnsubscribedError__ = __webpack_require__(190); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "ObjectUnsubscribedError", function() { return __WEBPACK_IMPORTED_MODULE_23__internal_util_ObjectUnsubscribedError__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_24__internal_util_UnsubscriptionError__ = __webpack_require__(441); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "UnsubscriptionError", function() { return __WEBPACK_IMPORTED_MODULE_24__internal_util_UnsubscriptionError__["a"]; }); @@ -45656,7 +45840,7 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "bindNodeCallback", function() { return __WEBPACK_IMPORTED_MODULE_27__internal_observable_bindNodeCallback__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_28__internal_observable_combineLatest__ = __webpack_require__(309); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "combineLatest", function() { return __WEBPACK_IMPORTED_MODULE_28__internal_observable_combineLatest__["a"]; }); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_29__internal_observable_concat__ = __webpack_require__(186); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_29__internal_observable_concat__ = __webpack_require__(187); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "concat", function() { return __WEBPACK_IMPORTED_MODULE_29__internal_observable_concat__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_30__internal_observable_defer__ = __webpack_require__(310); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "defer", function() { return __WEBPACK_IMPORTED_MODULE_30__internal_observable_defer__["a"]; }); @@ -45700,7 +45884,7 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "zip", function() { return __WEBPACK_IMPORTED_MODULE_49__internal_observable_zip__["a"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "EMPTY", function() { return __WEBPACK_IMPORTED_MODULE_31__internal_observable_empty__["b"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "NEVER", function() { return __WEBPACK_IMPORTED_MODULE_40__internal_observable_never__["b"]; }); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_50__internal_config__ = __webpack_require__(185); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_50__internal_config__ = __webpack_require__(186); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "config", function() { return __WEBPACK_IMPORTED_MODULE_50__internal_config__["a"]; }); /** PURE_IMPORTS_START PURE_IMPORTS_END */ @@ -45760,7 +45944,7 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); /***/ }), -/* 183 */ +/* 184 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -45818,7 +46002,7 @@ var AsyncSubject = /*@__PURE__*/ (function (_super) { /***/ }), -/* 184 */ +/* 185 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -45899,7 +46083,7 @@ var Notification = /*@__PURE__*/ (function () { /***/ }), -/* 185 */ +/* 186 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -45926,7 +46110,7 @@ var config = { /***/ }), -/* 186 */ +/* 187 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -45954,7 +46138,7 @@ function concat() { /***/ }), -/* 187 */ +/* 188 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -45982,7 +46166,7 @@ function reduce(accumulator, seed) { /***/ }), -/* 188 */ +/* 189 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -46013,7 +46197,7 @@ function defaultErrorFactory() { /***/ }), -/* 189 */ +/* 190 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -46031,7 +46215,7 @@ var ObjectUnsubscribedError = ObjectUnsubscribedErrorImpl; /***/ }), -/* 190 */ +/* 191 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -46046,7 +46230,7 @@ function isNumeric(val) { /***/ }), -/* 191 */ +/* 192 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -46057,7 +46241,7 @@ function noop() { } /***/ }), -/* 192 */ +/* 193 */ /***/ (function(module, exports, __webpack_require__) { // Copyright 2015 Joyent, Inc. @@ -46129,7 +46313,7 @@ function readSSHPrivate(type, buf, options) { var rounds = kdfOptsBuf.readInt(); var cinf = utils.opensshCipherInfo(cipher); if (bcrypt === undefined) { - bcrypt = __webpack_require__(379); + bcrypt = __webpack_require__(373); } if (typeof (options.passphrase) === 'string') { @@ -46250,7 +46434,7 @@ function write(key, options) { kdfopts = kdfssh.toBuffer(); if (bcrypt === undefined) { - bcrypt = __webpack_require__(379); + bcrypt = __webpack_require__(373); } var pass = new Uint8Array(passphrase); var salti = new Uint8Array(salt); @@ -46325,14 +46509,14 @@ function write(key, options) { /***/ }), -/* 193 */ +/* 194 */ /***/ (function(module, exports, __webpack_require__) { -var chownr = __webpack_require__(600) +var chownr = __webpack_require__(568) var tar = __webpack_require__(460) var pump = __webpack_require__(781) var mkdirp = __webpack_require__(145) -var fs = __webpack_require__(5) +var fs = __webpack_require__(4) var path = __webpack_require__(0) var os = __webpack_require__(46) @@ -46675,38 +46859,38 @@ function mkdirfix (name, opts, cb) { } -/***/ }), -/* 194 */ -/***/ (function(module, exports) { - -module.exports = {"name":"yarn","installationMethod":"unknown","version":"1.22.5","license":"BSD-2-Clause","preferGlobal":true,"description":"📦🐈 Fast, reliable, and secure dependency management.","dependencies":{"@zkochan/cmd-shim":"^3.1.0","babel-runtime":"^6.26.0","bytes":"^3.0.0","camelcase":"^4.0.0","chalk":"^2.1.0","cli-table3":"^0.4.0","commander":"^2.9.0","death":"^1.0.0","debug":"^3.0.0","deep-equal":"^1.0.1","detect-indent":"^5.0.0","dnscache":"^1.0.1","glob":"^7.1.1","gunzip-maybe":"^1.4.0","hash-for-dep":"^1.2.3","imports-loader":"^0.8.0","ini":"^1.3.4","inquirer":"^6.2.0","invariant":"^2.2.0","is-builtin-module":"^2.0.0","is-ci":"^1.0.10","is-webpack-bundle":"^1.0.0","js-yaml":"^3.13.1","leven":"^2.0.0","loud-rejection":"^1.2.0","micromatch":"^2.3.11","mkdirp":"^0.5.1","node-emoji":"^1.6.1","normalize-url":"^2.0.0","npm-logical-tree":"^1.2.1","object-path":"^0.11.2","proper-lockfile":"^2.0.0","puka":"^1.0.0","read":"^1.0.7","request":"^2.87.0","request-capture-har":"^1.2.2","rimraf":"^2.5.0","semver":"^5.1.0","ssri":"^5.3.0","strip-ansi":"^4.0.0","strip-bom":"^3.0.0","tar-fs":"^1.16.0","tar-stream":"^1.6.1","uuid":"^3.0.1","v8-compile-cache":"^2.0.0","validate-npm-package-license":"^3.0.4","yn":"^2.0.0"},"devDependencies":{"babel-core":"^6.26.0","babel-eslint":"^7.2.3","babel-loader":"^6.2.5","babel-plugin-array-includes":"^2.0.3","babel-plugin-inline-import":"^3.0.0","babel-plugin-transform-builtin-extend":"^1.1.2","babel-plugin-transform-inline-imports-commonjs":"^1.0.0","babel-plugin-transform-runtime":"^6.4.3","babel-preset-env":"^1.6.0","babel-preset-flow":"^6.23.0","babel-preset-stage-0":"^6.0.0","babylon":"^6.5.0","commitizen":"^2.9.6","cz-conventional-changelog":"^2.0.0","eslint":"^4.3.0","eslint-config-fb-strict":"^22.0.0","eslint-plugin-babel":"^5.0.0","eslint-plugin-flowtype":"^2.35.0","eslint-plugin-jasmine":"^2.6.2","eslint-plugin-jest":"^21.0.0","eslint-plugin-jsx-a11y":"^6.0.2","eslint-plugin-prefer-object-spread":"^1.2.1","eslint-plugin-prettier":"^2.1.2","eslint-plugin-react":"^7.1.0","eslint-plugin-relay":"^0.0.28","eslint-plugin-yarn-internal":"file:scripts/eslint-rules","execa":"^0.11.0","fancy-log":"^1.3.2","flow-bin":"^0.66.0","git-release-notes":"^3.0.0","gulp":"^4.0.0","gulp-babel":"^7.0.0","gulp-if":"^2.0.1","gulp-newer":"^1.0.0","gulp-plumber":"^1.0.1","gulp-sourcemaps":"^2.2.0","jest":"^22.4.4","jsinspect":"^0.12.6","minimatch":"^3.0.4","mock-stdin":"^0.3.0","prettier":"^1.5.2","string-replace-loader":"^2.1.1","temp":"^0.8.3","webpack":"^2.1.0-beta.25","yargs":"^6.3.0"},"resolutions":{"sshpk":"^1.14.2"},"engines":{"node":">=4.0.0"},"repository":"yarnpkg/yarn","bin":{"yarn":"./bin/yarn.js","yarnpkg":"./bin/yarn.js"},"scripts":{"build":"gulp build","build-bundle":"node ./scripts/build-webpack.js","build-chocolatey":"powershell ./scripts/build-chocolatey.ps1","build-deb":"./scripts/build-deb.sh","build-dist":"bash ./scripts/build-dist.sh","build-win-installer":"scripts\\build-windows-installer.bat","changelog":"git-release-notes $(git describe --tags --abbrev=0 $(git describe --tags --abbrev=0)^)..$(git describe --tags --abbrev=0) scripts/changelog.md","dupe-check":"yarn jsinspect ./src","lint":"eslint . && flow check","pkg-tests":"yarn --cwd packages/pkg-tests jest yarn.test.js","prettier":"eslint src __tests__ --fix","release-branch":"./scripts/release-branch.sh","test":"yarn lint && yarn test-only","test-only":"node --max_old_space_size=4096 node_modules/jest/bin/jest.js --verbose","test-only-debug":"node --inspect-brk --max_old_space_size=4096 node_modules/jest/bin/jest.js --runInBand --verbose","test-coverage":"node --max_old_space_size=4096 node_modules/jest/bin/jest.js --coverage --verbose","watch":"gulp watch","commit":"git-cz"},"jest":{"collectCoverageFrom":["src/**/*.js"],"testEnvironment":"node","modulePathIgnorePatterns":["__tests__/fixtures/","packages/pkg-tests/pkg-tests-fixtures","dist/"],"testPathIgnorePatterns":["__tests__/(fixtures|__mocks__)/","updates/","_(temp|mock|install|init|helpers).js$","packages/pkg-tests"]},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}}} - /***/ }), /* 195 */ /***/ (function(module, exports) { -module.exports = require("https"); +module.exports = {"name":"yarn","installationMethod":"unknown","version":"1.22.19","packageManager":"yarn@1.22.17","license":"BSD-2-Clause","preferGlobal":true,"description":"📦🐈 Fast, reliable, and secure dependency management.","dependencies":{"@zkochan/cmd-shim":"^3.1.0","babel-runtime":"^6.26.0","bytes":"^3.0.0","camelcase":"^4.0.0","chalk":"^2.1.0","cli-table3":"^0.4.0","commander":"^2.9.0","death":"^1.0.0","debug":"^3.0.0","deep-equal":"^1.0.1","detect-indent":"^5.0.0","dnscache":"^1.0.1","glob":"^7.1.1","gunzip-maybe":"^1.4.0","hash-for-dep":"^1.2.3","imports-loader":"^0.8.0","ini":"^1.3.4","inquirer":"^6.2.0","invariant":"^2.2.0","is-builtin-module":"^2.0.0","is-ci":"^1.0.10","is-webpack-bundle":"^1.0.0","js-yaml":"^3.13.1","leven":"^2.0.0","loud-rejection":"^1.2.0","micromatch":"^2.3.11","mkdirp":"^0.5.1","node-emoji":"^1.6.1","normalize-url":"^2.0.0","npm-logical-tree":"^1.2.1","object-path":"^0.11.2","proper-lockfile":"^2.0.0","puka":"^1.0.0","read":"^1.0.7","request":"^2.87.0","request-capture-har":"^1.2.2","rimraf":"^2.5.0","semver":"^5.1.0","ssri":"^5.3.0","strip-ansi":"^4.0.0","strip-bom":"^3.0.0","tar-fs":"^1.16.0","tar-stream":"^1.6.1","uuid":"^3.0.1","v8-compile-cache":"^2.0.0","validate-npm-package-license":"^3.0.4","yn":"^2.0.0"},"devDependencies":{"babel-core":"^6.26.0","babel-eslint":"^7.2.3","babel-loader":"^6.2.5","babel-plugin-array-includes":"^2.0.3","babel-plugin-inline-import":"^3.0.0","babel-plugin-transform-builtin-extend":"^1.1.2","babel-plugin-transform-inline-imports-commonjs":"^1.0.0","babel-plugin-transform-runtime":"^6.4.3","babel-preset-env":"^1.6.0","babel-preset-flow":"^6.23.0","babel-preset-stage-0":"^6.0.0","babylon":"^6.5.0","commitizen":"^2.9.6","cz-conventional-changelog":"^2.0.0","eslint":"^4.3.0","eslint-config-fb-strict":"^22.0.0","eslint-plugin-babel":"^5.0.0","eslint-plugin-flowtype":"^2.35.0","eslint-plugin-jasmine":"^2.6.2","eslint-plugin-jest":"^21.0.0","eslint-plugin-jsx-a11y":"^6.0.2","eslint-plugin-prefer-object-spread":"^1.2.1","eslint-plugin-prettier":"^2.1.2","eslint-plugin-react":"^7.1.0","eslint-plugin-relay":"^0.0.28","eslint-plugin-yarn-internal":"file:scripts/eslint-rules","execa":"^0.11.0","fancy-log":"^1.3.2","flow-bin":"^0.66.0","git-release-notes":"^3.0.0","gulp":"^4.0.0","gulp-babel":"^7.0.0","gulp-if":"^2.0.1","gulp-newer":"^1.0.0","gulp-plumber":"^1.0.1","gulp-sourcemaps":"^2.2.0","jest":"^22.4.4","jsinspect":"^0.12.6","minimatch":"^3.0.4","mock-stdin":"^0.3.0","prettier":"^1.5.2","string-replace-loader":"^2.1.1","temp":"^0.8.3","webpack":"^2.1.0-beta.25","yargs":"^6.3.0"},"resolutions":{"sshpk":"^1.14.2"},"engines":{"node":">=4.0.0"},"repository":"yarnpkg/yarn","bin":{"yarn":"./bin/yarn.js","yarnpkg":"./bin/yarn.js"},"scripts":{"build":"gulp build","build-bundle":"node ./scripts/build-webpack.js","build-chocolatey":"powershell ./scripts/build-chocolatey.ps1","build-deb":"./scripts/build-deb.sh","build-dist":"bash ./scripts/build-dist.sh","build-win-installer":"scripts\\build-windows-installer.bat","changelog":"git-release-notes $(git describe --tags --abbrev=0 $(git describe --tags --abbrev=0)^)..$(git describe --tags --abbrev=0) scripts/changelog.md","dupe-check":"yarn jsinspect ./src","lint":"eslint . && flow check","pkg-tests":"yarn --cwd packages/pkg-tests jest yarn.test.js","prettier":"eslint src __tests__ --fix","release-branch":"./scripts/release-branch.sh","test":"yarn lint && yarn test-only","test-only":"node --max_old_space_size=4096 node_modules/jest/bin/jest.js --verbose","test-only-debug":"node --inspect-brk --max_old_space_size=4096 node_modules/jest/bin/jest.js --runInBand --verbose","test-coverage":"node --max_old_space_size=4096 node_modules/jest/bin/jest.js --coverage --verbose","watch":"gulp watch","commit":"git-cz"},"jest":{"collectCoverageFrom":["src/**/*.js"],"testEnvironment":"node","modulePathIgnorePatterns":["__tests__/fixtures/","packages/pkg-tests/pkg-tests-fixtures","dist/"],"testPathIgnorePatterns":["__tests__/(fixtures|__mocks__)/","updates/","_(temp|mock|install|init|helpers).js$","packages/pkg-tests"]},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}}} /***/ }), /* 196 */ /***/ (function(module, exports) { -module.exports = require("querystring"); +module.exports = require("https"); /***/ }), /* 197 */ /***/ (function(module, exports) { -module.exports = require("readline"); +module.exports = require("querystring"); /***/ }), /* 198 */ /***/ (function(module, exports) { -module.exports = require("zlib"); +module.exports = require("readline"); /***/ }), /* 199 */ +/***/ (function(module, exports) { + +module.exports = require("zlib"); + +/***/ }), +/* 200 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -46732,7 +46916,7 @@ function _load_constants() { var _package; function _load_package() { - return _package = __webpack_require__(194); + return _package = __webpack_require__(195); } const NODE_VERSION = process.version; @@ -46840,7 +47024,7 @@ function stringify(obj, noHeader, enableVersions) { } /***/ }), -/* 200 */ +/* 201 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -46853,7 +47037,7 @@ Object.defineProperty(exports, "__esModule", { var _consoleReporter; function _load_consoleReporter() { - return _consoleReporter = __webpack_require__(561); + return _consoleReporter = __webpack_require__(529); } Object.defineProperty(exports, 'ConsoleReporter', { @@ -46866,7 +47050,7 @@ Object.defineProperty(exports, 'ConsoleReporter', { var _bufferReporter; function _load_bufferReporter() { - return _bufferReporter = __webpack_require__(560); + return _bufferReporter = __webpack_require__(528); } Object.defineProperty(exports, 'BufferReporter', { @@ -46879,7 +47063,7 @@ Object.defineProperty(exports, 'BufferReporter', { var _eventReporter; function _load_eventReporter() { - return _eventReporter = __webpack_require__(565); + return _eventReporter = __webpack_require__(533); } Object.defineProperty(exports, 'EventReporter', { @@ -46892,7 +47076,7 @@ Object.defineProperty(exports, 'EventReporter', { var _jsonReporter; function _load_jsonReporter() { - return _jsonReporter = __webpack_require__(213); + return _jsonReporter = __webpack_require__(211); } Object.defineProperty(exports, 'JSONReporter', { @@ -46905,7 +47089,7 @@ Object.defineProperty(exports, 'JSONReporter', { var _noopReporter; function _load_noopReporter() { - return _noopReporter = __webpack_require__(569); + return _noopReporter = __webpack_require__(537); } Object.defineProperty(exports, 'NoopReporter', { @@ -46931,7 +47115,7 @@ Object.defineProperty(exports, 'Reporter', { function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 201 */ +/* 202 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -47203,389 +47387,8 @@ function normalizePathEnvVar (nodePath) { } -/***/ }), -/* 202 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var resolve = __webpack_require__(203); - -module.exports = { - Validation: errorSubclass(ValidationError), - MissingRef: errorSubclass(MissingRefError) -}; - - -function ValidationError(errors) { - this.message = 'validation failed'; - this.errors = errors; - this.ajv = this.validation = true; -} - - -MissingRefError.message = function (baseId, ref) { - return 'can\'t resolve reference ' + ref + ' from id ' + baseId; -}; - - -function MissingRefError(baseId, ref, message) { - this.message = message || MissingRefError.message(baseId, ref); - this.missingRef = resolve.url(baseId, ref); - this.missingSchema = resolve.normalizeId(resolve.fullPath(this.missingRef)); -} - - -function errorSubclass(Subclass) { - Subclass.prototype = Object.create(Error.prototype); - Subclass.prototype.constructor = Subclass; - return Subclass; -} - - /***/ }), /* 203 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var url = __webpack_require__(24) - , equal = __webpack_require__(204) - , util = __webpack_require__(106) - , SchemaObject = __webpack_require__(339) - , traverse = __webpack_require__(503); - -module.exports = resolve; - -resolve.normalizeId = normalizeId; -resolve.fullPath = getFullPath; -resolve.url = resolveUrl; -resolve.ids = resolveIds; -resolve.inlineRef = inlineRef; -resolve.schema = resolveSchema; - -/** - * [resolve and compile the references ($ref)] - * @this Ajv - * @param {Function} compile reference to schema compilation funciton (localCompile) - * @param {Object} root object with information about the root schema for the current schema - * @param {String} ref reference to resolve - * @return {Object|Function} schema object (if the schema can be inlined) or validation function - */ -function resolve(compile, root, ref) { - /* jshint validthis: true */ - var refVal = this._refs[ref]; - if (typeof refVal == 'string') { - if (this._refs[refVal]) refVal = this._refs[refVal]; - else return resolve.call(this, compile, root, refVal); - } - - refVal = refVal || this._schemas[ref]; - if (refVal instanceof SchemaObject) { - return inlineRef(refVal.schema, this._opts.inlineRefs) - ? refVal.schema - : refVal.validate || this._compile(refVal); - } - - var res = resolveSchema.call(this, root, ref); - var schema, v, baseId; - if (res) { - schema = res.schema; - root = res.root; - baseId = res.baseId; - } - - if (schema instanceof SchemaObject) { - v = schema.validate || compile.call(this, schema.schema, root, undefined, baseId); - } else if (schema !== undefined) { - v = inlineRef(schema, this._opts.inlineRefs) - ? schema - : compile.call(this, schema, root, undefined, baseId); - } - - return v; -} - - -/** - * Resolve schema, its root and baseId - * @this Ajv - * @param {Object} root root object with properties schema, refVal, refs - * @param {String} ref reference to resolve - * @return {Object} object with properties schema, root, baseId - */ -function resolveSchema(root, ref) { - /* jshint validthis: true */ - var p = url.parse(ref, false, true) - , refPath = _getFullPath(p) - , baseId = getFullPath(this._getId(root.schema)); - if (refPath !== baseId) { - var id = normalizeId(refPath); - var refVal = this._refs[id]; - if (typeof refVal == 'string') { - return resolveRecursive.call(this, root, refVal, p); - } else if (refVal instanceof SchemaObject) { - if (!refVal.validate) this._compile(refVal); - root = refVal; - } else { - refVal = this._schemas[id]; - if (refVal instanceof SchemaObject) { - if (!refVal.validate) this._compile(refVal); - if (id == normalizeId(ref)) - return { schema: refVal, root: root, baseId: baseId }; - root = refVal; - } else { - return; - } - } - if (!root.schema) return; - baseId = getFullPath(this._getId(root.schema)); - } - return getJsonPointer.call(this, p, baseId, root.schema, root); -} - - -/* @this Ajv */ -function resolveRecursive(root, ref, parsedRef) { - /* jshint validthis: true */ - var res = resolveSchema.call(this, root, ref); - if (res) { - var schema = res.schema; - var baseId = res.baseId; - root = res.root; - var id = this._getId(schema); - if (id) baseId = resolveUrl(baseId, id); - return getJsonPointer.call(this, parsedRef, baseId, schema, root); - } -} - - -var PREVENT_SCOPE_CHANGE = util.toHash(['properties', 'patternProperties', 'enum', 'dependencies', 'definitions']); -/* @this Ajv */ -function getJsonPointer(parsedRef, baseId, schema, root) { - /* jshint validthis: true */ - parsedRef.hash = parsedRef.hash || ''; - if (parsedRef.hash.slice(0,2) != '#/') return; - var parts = parsedRef.hash.split('/'); - - for (var i = 1; i < parts.length; i++) { - var part = parts[i]; - if (part) { - part = util.unescapeFragment(part); - schema = schema[part]; - if (schema === undefined) break; - var id; - if (!PREVENT_SCOPE_CHANGE[part]) { - id = this._getId(schema); - if (id) baseId = resolveUrl(baseId, id); - if (schema.$ref) { - var $ref = resolveUrl(baseId, schema.$ref); - var res = resolveSchema.call(this, root, $ref); - if (res) { - schema = res.schema; - root = res.root; - baseId = res.baseId; - } - } - } - } - } - if (schema !== undefined && schema !== root.schema) - return { schema: schema, root: root, baseId: baseId }; -} - - -var SIMPLE_INLINED = util.toHash([ - 'type', 'format', 'pattern', - 'maxLength', 'minLength', - 'maxProperties', 'minProperties', - 'maxItems', 'minItems', - 'maximum', 'minimum', - 'uniqueItems', 'multipleOf', - 'required', 'enum' -]); -function inlineRef(schema, limit) { - if (limit === false) return false; - if (limit === undefined || limit === true) return checkNoRef(schema); - else if (limit) return countKeys(schema) <= limit; -} - - -function checkNoRef(schema) { - var item; - if (Array.isArray(schema)) { - for (var i=0; i All rights reserved. @@ -47604,7 +47407,7 @@ module.exports = { /***/ }), -/* 206 */ +/* 204 */ /***/ (function(module, exports) { // Copyright 2011 Mark Cavage All rights reserved. @@ -47646,7 +47449,7 @@ module.exports = { /***/ }), -/* 207 */ +/* 205 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -47926,7 +47729,7 @@ function hasWrapper(commander, args) { const requireLockfile = exports.requireLockfile = true; /***/ }), -/* 208 */ +/* 206 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -47940,7 +47743,7 @@ exports.integrityErrors = undefined; var _extends2; function _load_extends() { - return _extends2 = _interopRequireDefault(__webpack_require__(21)); + return _extends2 = _interopRequireDefault(__webpack_require__(20)); } var _asyncToGenerator2; @@ -47958,7 +47761,7 @@ function _load_constants() { var _fs; function _load_fs() { - return _fs = _interopRequireWildcard(__webpack_require__(4)); + return _fs = _interopRequireWildcard(__webpack_require__(5)); } var _misc; @@ -47970,7 +47773,7 @@ function _load_misc() { var _packageNameUtils; function _load_packageNameUtils() { - return _packageNameUtils = __webpack_require__(222); + return _packageNameUtils = __webpack_require__(220); } var _workspaceLayout; @@ -48548,7 +48351,7 @@ class InstallationIntegrityChecker { exports.default = InstallationIntegrityChecker; /***/ }), -/* 209 */ +/* 207 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -48583,13 +48386,13 @@ function _load_misc() { var _yarnVersion; function _load_yarnVersion() { - return _yarnVersion = __webpack_require__(120); + return _yarnVersion = __webpack_require__(105); } var _semver; function _load_semver() { - return _semver = __webpack_require__(224); + return _semver = __webpack_require__(170); } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -48720,9 +48523,7 @@ function checkOne(info, config, ignoreEngines) { ref.ignore = true; ref.incompatible = true; - reporter.info(`${human}: ${msg}`); if (!didIgnore) { - reporter.info(reporter.lang('optionalCompatibilityExcluded', human)); didIgnore = true; } } else { @@ -48817,7 +48618,7 @@ function shouldCheck(manifest, options) { } /***/ }), -/* 210 */ +/* 208 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -48944,19 +48745,19 @@ function _load_errors() { var _index; function _load_index() { - return _index = _interopRequireWildcard(__webpack_require__(552)); + return _index = _interopRequireWildcard(__webpack_require__(520)); } var _fs; function _load_fs() { - return _fs = _interopRequireWildcard(__webpack_require__(4)); + return _fs = _interopRequireWildcard(__webpack_require__(5)); } var _promise; function _load_promise() { - return _promise = _interopRequireWildcard(__webpack_require__(50)); + return _promise = _interopRequireWildcard(__webpack_require__(51)); } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } @@ -49043,7 +48844,7 @@ function fetch(pkgs, config) { } /***/ }), -/* 211 */ +/* 209 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -49084,7 +48885,7 @@ let linkBin = exports.linkBin = (() => { var _packageHoister; function _load_packageHoister() { - return _packageHoister = _interopRequireDefault(__webpack_require__(556)); + return _packageHoister = _interopRequireDefault(__webpack_require__(524)); } var _constants; @@ -49096,7 +48897,7 @@ function _load_constants() { var _promise; function _load_promise() { - return _promise = _interopRequireWildcard(__webpack_require__(50)); + return _promise = _interopRequireWildcard(__webpack_require__(51)); } var _normalizePattern2; @@ -49114,19 +48915,19 @@ function _load_misc() { var _fs; function _load_fs() { - return _fs = _interopRequireWildcard(__webpack_require__(4)); + return _fs = _interopRequireWildcard(__webpack_require__(5)); } var _mutex; function _load_mutex() { - return _mutex = _interopRequireDefault(__webpack_require__(375)); + return _mutex = _interopRequireDefault(__webpack_require__(369)); } var _semver; function _load_semver() { - return _semver = __webpack_require__(224); + return _semver = __webpack_require__(170); } var _workspaceLayout; @@ -49141,7 +48942,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de const invariant = __webpack_require__(9); -const cmdShim = __webpack_require__(201); +const cmdShim = __webpack_require__(202); const path = __webpack_require__(0); const semver = __webpack_require__(22); // Concurrency for creating bin links disabled because of the issue #1961 @@ -50183,7 +49984,7 @@ class PackageLinker { exports.default = PackageLinker; /***/ }), -/* 212 */ +/* 210 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -50205,7 +50006,7 @@ function _load_tty() { function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -const readline = __webpack_require__(197); +const readline = __webpack_require__(198); var _require = __webpack_require__(30); @@ -50274,7 +50075,7 @@ function clearNthLine(stdout, n) { } /***/ }), -/* 213 */ +/* 211 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -50287,7 +50088,7 @@ Object.defineProperty(exports, "__esModule", { var _extends2; function _load_extends() { - return _extends2 = _interopRequireDefault(__webpack_require__(21)); + return _extends2 = _interopRequireDefault(__webpack_require__(20)); } var _baseReporter; @@ -50468,7 +50269,7 @@ class JSONReporter extends (_baseReporter || _load_baseReporter()).default { exports.default = JSONReporter; /***/ }), -/* 214 */ +/* 212 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -50506,13 +50307,13 @@ function _load_normalizePattern() { var _parsePackagePath; function _load_parsePackagePath() { - return _parsePackagePath = _interopRequireDefault(__webpack_require__(376)); + return _parsePackagePath = _interopRequireDefault(__webpack_require__(370)); } var _parsePackagePath2; function _load_parsePackagePath2() { - return _parsePackagePath2 = __webpack_require__(376); + return _parsePackagePath2 = __webpack_require__(370); } var _resolvers; @@ -50616,7 +50417,7 @@ const shouldUpdateLockfile = exports.shouldUpdateLockfile = (lockfileEntry, reso }; /***/ }), -/* 215 */ +/* 213 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -50648,7 +50449,7 @@ function _load_invariant() { var _uuid; function _load_uuid() { - return _uuid = _interopRequireDefault(__webpack_require__(119)); + return _uuid = _interopRequireDefault(__webpack_require__(120)); } var _errors; @@ -50672,7 +50473,7 @@ function _load_misc() { var _fs; function _load_fs() { - return _fs = _interopRequireWildcard(__webpack_require__(4)); + return _fs = _interopRequireWildcard(__webpack_require__(5)); } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } @@ -50754,7 +50555,7 @@ FileResolver.protocol = 'file'; FileResolver.prefixMatcher = /^\.{1,2}\//; /***/ }), -/* 216 */ +/* 214 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -50830,7 +50631,7 @@ exports.default = GistResolver; GistResolver.protocol = 'gist'; /***/ }), -/* 217 */ +/* 215 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -50849,7 +50650,7 @@ function _load_asyncToGenerator() { var _cache; function _load_cache() { - return _cache = __webpack_require__(355); + return _cache = __webpack_require__(349); } var _errors; @@ -50861,7 +50662,7 @@ function _load_errors() { var _registryResolver; function _load_registryResolver() { - return _registryResolver = _interopRequireDefault(__webpack_require__(575)); + return _registryResolver = _interopRequireDefault(__webpack_require__(543)); } var _npmRegistry; @@ -50879,7 +50680,7 @@ function _load_map() { var _fs; function _load_fs() { - return _fs = _interopRequireWildcard(__webpack_require__(4)); + return _fs = _interopRequireWildcard(__webpack_require__(5)); } var _constants; @@ -50891,7 +50692,7 @@ function _load_constants() { var _packageNameUtils; function _load_packageNameUtils() { - return _packageNameUtils = __webpack_require__(222); + return _packageNameUtils = __webpack_require__(220); } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } @@ -51119,7 +50920,7 @@ exports.default = NpmResolver; NpmResolver.registry = NPM_REGISTRY_ID; /***/ }), -/* 218 */ +/* 216 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -51199,19 +51000,19 @@ let fixTimes = (() => { var _fs; function _load_fs() { - return _fs = _interopRequireDefault(__webpack_require__(5)); + return _fs = _interopRequireDefault(__webpack_require__(4)); } var _promise; function _load_promise() { - return _promise = __webpack_require__(50); + return _promise = __webpack_require__(51); } var _fs2; function _load_fs2() { - return _fs2 = __webpack_require__(4); + return _fs2 = __webpack_require__(5); } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -51317,7 +51118,7 @@ const copyWithBuffer = (() => { }; /***/ }), -/* 219 */ +/* 217 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -51336,7 +51137,7 @@ function _load_asyncToGenerator() { var _extends2; function _load_extends() { - return _extends2 = _interopRequireDefault(__webpack_require__(21)); + return _extends2 = _interopRequireDefault(__webpack_require__(20)); } var _invariant; @@ -51354,7 +51155,7 @@ function _load_string_decoder() { var _tarFs; function _load_tarFs() { - return _tarFs = _interopRequireDefault(__webpack_require__(193)); + return _tarFs = _interopRequireDefault(__webpack_require__(194)); } var _tarStream; @@ -51372,7 +51173,7 @@ function _load_url() { var _fs; function _load_fs() { - return _fs = __webpack_require__(5); + return _fs = __webpack_require__(4); } var _errors; @@ -51384,13 +51185,13 @@ function _load_errors() { var _gitSpawn; function _load_gitSpawn() { - return _gitSpawn = __webpack_require__(373); + return _gitSpawn = __webpack_require__(367); } var _gitRefResolver; function _load_gitRefResolver() { - return _gitRefResolver = __webpack_require__(581); + return _gitRefResolver = __webpack_require__(549); } var _crypto; @@ -51402,7 +51203,7 @@ function _load_crypto() { var _fs2; function _load_fs2() { - return _fs2 = _interopRequireWildcard(__webpack_require__(4)); + return _fs2 = _interopRequireWildcard(__webpack_require__(5)); } var _map; @@ -51961,7 +51762,7 @@ class Git { exports.default = Git; /***/ }), -/* 220 */ +/* 218 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -51980,7 +51781,7 @@ function _load_asyncToGenerator() { var _resolveRelative; function _load_resolveRelative() { - return _resolveRelative = _interopRequireDefault(__webpack_require__(586)); + return _resolveRelative = _interopRequireDefault(__webpack_require__(554)); } var _validate; @@ -51992,7 +51793,7 @@ function _load_validate() { var _fix; function _load_fix() { - return _fix = _interopRequireDefault(__webpack_require__(583)); + return _fix = _interopRequireDefault(__webpack_require__(551)); } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -52048,7 +51849,7 @@ exports.default = (() => { })(); /***/ }), -/* 221 */ +/* 219 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -52177,7 +51978,7 @@ function extractRepositoryUrl(repository) { } /***/ }), -/* 222 */ +/* 220 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -52201,7 +52002,7 @@ function getSystemParams() { } /***/ }), -/* 223 */ +/* 221 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -52229,140 +52030,7 @@ function isRootUser(uid) { } /***/ }), -/* 224 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.satisfiesWithPrereleases = satisfiesWithPrereleases; -exports.diffWithUnstable = diffWithUnstable; - -var _semver; - -function _load_semver() { - return _semver = _interopRequireDefault(__webpack_require__(22)); -} - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Returns whether the given semver version satisfies the given range. Notably this supports - * prerelease versions so that "2.0.0-rc.0" satisfies the range ">=1.0.0", for example. - */ - -function satisfiesWithPrereleases(version, range, loose = false) { - let semverRange; - try { - // $FlowFixMe: Add a definition for the Range class - semverRange = new (_semver || _load_semver()).default.Range(range, loose); - } catch (err) { - return false; - } - - if (!version) { - return false; - } - let semverVersion; - try { - semverVersion = new (_semver || _load_semver()).default.SemVer(version, semverRange.loose); - } catch (err) { - return false; - } - - // A range has multiple sets of comparators. A version must satisfy all comparators in a set - // and at least one set to satisfy the range. - return semverRange.set.some(comparatorSet => { - // node-semver converts ~ and ^ ranges into pairs of >= and < ranges but the upper bounds don't - // properly exclude prerelease versions. For example, "^1.0.0" is converted to ">=1.0.0 <2.0.0", - // which includes "2.0.0-pre" since prerelease versions are lower than their non-prerelease - // counterparts. As a practical workaround we make upper-bound ranges exclude prereleases and - // convert "<2.0.0" to "<2.0.0-0", for example. - comparatorSet = comparatorSet.map(comparator => { - if (comparator.operator !== '<' || !comparator.value || comparator.semver.prerelease.length) { - return comparator; - } - - // "0" is the lowest prerelease version - comparator.semver.inc('pre', 0); - - const comparatorString = comparator.operator + comparator.semver.version; - // $FlowFixMe: Add a definition for the Comparator class - return new (_semver || _load_semver()).default.Comparator(comparatorString, comparator.loose); - }); - - return !comparatorSet.some(comparator => !comparator.test(semverVersion)); - }); -} - -const PRE_RELEASES = { - major: 'premajor', - minor: 'preminor', - patch: 'prepatch' -}; - -/** - * Returns the difference between two versions as a semantic string representation. - * Similar to the `diff` method in node-semver, but it also accounts for unstable versions, - * like 0.x.x or 0.0.x. - */ - -function diffWithUnstable(version1, version2) { - if ((_semver || _load_semver()).default.eq(version1, version2) === false) { - const v1 = (_semver || _load_semver()).default.parse(version1); - const v2 = (_semver || _load_semver()).default.parse(version2); - - if (v1 != null && v2 != null) { - const isPreRelease = v1.prerelease.length > 0 || v2.prerelease.length > 0; - const preMajor = v1.major === 0 || v2.major === 0; - const preMinor = preMajor && (v1.minor === 0 || v2.minor === 0); - - let diff = null; - - if (v1.major !== v2.major) { - diff = 'major'; - } else if (v1.minor !== v2.minor) { - if (preMajor) { - // If the major version number is zero (0.x.x), treat a change - // of the minor version number as a major change. - diff = 'major'; - } else { - diff = 'minor'; - } - } else if (v1.patch !== v2.patch) { - if (preMinor) { - // If the major & minor version numbers are zero (0.0.x), treat a change - // of the patch version number as a major change. - diff = 'major'; - } else if (preMajor) { - // If the major version number is zero (0.x.x), treat a change - // of the patch version number as a minor change. - diff = 'minor'; - } else { - diff = 'patch'; - } - } - - if (isPreRelease) { - if (diff != null) { - diff = PRE_RELEASES[diff]; - } else { - diff = 'prerelease'; - } - } - - return diff; - } - } - - return null; -} - -/***/ }), -/* 225 */ +/* 222 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -52428,7 +52096,7 @@ function getLocalAppDataDir() { } /***/ }), -/* 226 */ +/* 223 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -52448,13 +52116,13 @@ function explodeHashedUrl(url) { } /***/ }), -/* 227 */ +/* 224 */ /***/ (function(module, exports, __webpack_require__) { -module.exports = { "default": __webpack_require__(233), __esModule: true }; +module.exports = { "default": __webpack_require__(230), __esModule: true }; /***/ }), -/* 228 */ +/* 225 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -52520,11 +52188,11 @@ function range(a, b, str) { /***/ }), -/* 229 */ +/* 226 */ /***/ (function(module, exports, __webpack_require__) { -var concatMap = __webpack_require__(232); -var balanced = __webpack_require__(228); +var concatMap = __webpack_require__(229); +var balanced = __webpack_require__(225); module.exports = expandTop; @@ -52727,7 +52395,7 @@ function expand(str, isTop) { /***/ }), -/* 230 */ +/* 227 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -52798,7 +52466,7 @@ module.exports = function (str) { /***/ }), -/* 231 */ +/* 228 */ /***/ (function(module, exports) { function Caseless (dict) { @@ -52871,7 +52539,7 @@ module.exports.httpify = function (resp, headers) { /***/ }), -/* 232 */ +/* 229 */ /***/ (function(module, exports) { module.exports = function (xs, fn) { @@ -52890,27 +52558,27 @@ var isArray = Array.isArray || function (xs) { /***/ }), -/* 233 */ +/* 230 */ /***/ (function(module, exports, __webpack_require__) { -__webpack_require__(259); +__webpack_require__(256); +__webpack_require__(258); __webpack_require__(261); -__webpack_require__(264); +__webpack_require__(257); +__webpack_require__(259); __webpack_require__(260); -__webpack_require__(262); -__webpack_require__(263); module.exports = __webpack_require__(31).Promise; /***/ }), -/* 234 */ +/* 231 */ /***/ (function(module, exports) { module.exports = function () { /* empty */ }; /***/ }), -/* 235 */ +/* 232 */ /***/ (function(module, exports) { module.exports = function (it, Constructor, name, forbiddenField) { @@ -52921,14 +52589,14 @@ module.exports = function (it, Constructor, name, forbiddenField) { /***/ }), -/* 236 */ +/* 233 */ /***/ (function(module, exports, __webpack_require__) { // false -> Array#indexOf // true -> Array#includes var toIObject = __webpack_require__(98); var toLength = __webpack_require__(136); -var toAbsoluteIndex = __webpack_require__(254); +var toAbsoluteIndex = __webpack_require__(251); module.exports = function (IS_INCLUDES) { return function ($this, el, fromIndex) { var O = toIObject($this); @@ -52950,15 +52618,15 @@ module.exports = function (IS_INCLUDES) { /***/ }), -/* 237 */ +/* 234 */ /***/ (function(module, exports, __webpack_require__) { var ctx = __webpack_require__(70); -var call = __webpack_require__(241); -var isArrayIter = __webpack_require__(240); +var call = __webpack_require__(238); +var isArrayIter = __webpack_require__(237); var anObject = __webpack_require__(35); var toLength = __webpack_require__(136); -var getIterFn = __webpack_require__(257); +var getIterFn = __webpack_require__(254); var BREAK = {}; var RETURN = {}; var exports = module.exports = function (iterable, entries, fn, that, ITERATOR) { @@ -52981,16 +52649,16 @@ exports.RETURN = RETURN; /***/ }), -/* 238 */ +/* 235 */ /***/ (function(module, exports, __webpack_require__) { -module.exports = !__webpack_require__(51) && !__webpack_require__(112)(function () { +module.exports = !__webpack_require__(52) && !__webpack_require__(112)(function () { return Object.defineProperty(__webpack_require__(92)('div'), 'a', { get: function () { return 7; } }).a != 7; }); /***/ }), -/* 239 */ +/* 236 */ /***/ (function(module, exports) { // fast apply, http://jsperf.lnkit.com/fast-apply/5 @@ -53012,12 +52680,12 @@ module.exports = function (fn, args, that) { /***/ }), -/* 240 */ +/* 237 */ /***/ (function(module, exports, __webpack_require__) { // check on default Array iterator -var Iterators = __webpack_require__(53); -var ITERATOR = __webpack_require__(20)('iterator'); +var Iterators = __webpack_require__(54); +var ITERATOR = __webpack_require__(21)('iterator'); var ArrayProto = Array.prototype; module.exports = function (it) { @@ -53026,7 +52694,7 @@ module.exports = function (it) { /***/ }), -/* 241 */ +/* 238 */ /***/ (function(module, exports, __webpack_require__) { // call something on iterator step with safe closing on error @@ -53044,18 +52712,18 @@ module.exports = function (iterator, fn, value, entries) { /***/ }), -/* 242 */ +/* 239 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var create = __webpack_require__(246); +var create = __webpack_require__(243); var descriptor = __webpack_require__(132); var setToStringTag = __webpack_require__(95); var IteratorPrototype = {}; // 25.1.2.1.1 %IteratorPrototype%[@@iterator]() -__webpack_require__(42)(IteratorPrototype, __webpack_require__(20)('iterator'), function () { return this; }); +__webpack_require__(42)(IteratorPrototype, __webpack_require__(21)('iterator'), function () { return this; }); module.exports = function (Constructor, NAME, next) { Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) }); @@ -53064,10 +52732,10 @@ module.exports = function (Constructor, NAME, next) { /***/ }), -/* 243 */ +/* 240 */ /***/ (function(module, exports, __webpack_require__) { -var ITERATOR = __webpack_require__(20)('iterator'); +var ITERATOR = __webpack_require__(21)('iterator'); var SAFE_CLOSING = false; try { @@ -53092,7 +52760,7 @@ module.exports = function (exec, skipClosing) { /***/ }), -/* 244 */ +/* 241 */ /***/ (function(module, exports) { module.exports = function (done, value) { @@ -53101,7 +52769,7 @@ module.exports = function (done, value) { /***/ }), -/* 245 */ +/* 242 */ /***/ (function(module, exports, __webpack_require__) { var global = __webpack_require__(17); @@ -53176,12 +52844,12 @@ module.exports = function () { /***/ }), -/* 246 */ +/* 243 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) var anObject = __webpack_require__(35); -var dPs = __webpack_require__(247); +var dPs = __webpack_require__(244); var enumBugKeys = __webpack_require__(127); var IE_PROTO = __webpack_require__(96)('IE_PROTO'); var Empty = function () { /* empty */ }; @@ -53223,14 +52891,14 @@ module.exports = Object.create || function create(O, Properties) { /***/ }), -/* 247 */ +/* 244 */ /***/ (function(module, exports, __webpack_require__) { var dP = __webpack_require__(72); var anObject = __webpack_require__(35); -var getKeys = __webpack_require__(171); +var getKeys = __webpack_require__(172); -module.exports = __webpack_require__(51) ? Object.defineProperties : function defineProperties(O, Properties) { +module.exports = __webpack_require__(52) ? Object.defineProperties : function defineProperties(O, Properties) { anObject(O); var keys = getKeys(Properties); var length = keys.length; @@ -53242,12 +52910,12 @@ module.exports = __webpack_require__(51) ? Object.defineProperties : function de /***/ }), -/* 248 */ +/* 245 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O) var has = __webpack_require__(71); -var toObject = __webpack_require__(172); +var toObject = __webpack_require__(173); var IE_PROTO = __webpack_require__(96)('IE_PROTO'); var ObjectProto = Object.prototype; @@ -53261,12 +52929,12 @@ module.exports = Object.getPrototypeOf || function (O) { /***/ }), -/* 249 */ +/* 246 */ /***/ (function(module, exports, __webpack_require__) { var has = __webpack_require__(71); var toIObject = __webpack_require__(98); -var arrayIndexOf = __webpack_require__(236)(false); +var arrayIndexOf = __webpack_require__(233)(false); var IE_PROTO = __webpack_require__(96)('IE_PROTO'); module.exports = function (object, names) { @@ -53284,7 +52952,7 @@ module.exports = function (object, names) { /***/ }), -/* 250 */ +/* 247 */ /***/ (function(module, exports, __webpack_require__) { var hide = __webpack_require__(42); @@ -53297,14 +52965,14 @@ module.exports = function (target, src, safe) { /***/ }), -/* 251 */ +/* 248 */ /***/ (function(module, exports, __webpack_require__) { module.exports = __webpack_require__(42); /***/ }), -/* 252 */ +/* 249 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -53312,8 +52980,8 @@ module.exports = __webpack_require__(42); var global = __webpack_require__(17); var core = __webpack_require__(31); var dP = __webpack_require__(72); -var DESCRIPTORS = __webpack_require__(51); -var SPECIES = __webpack_require__(20)('species'); +var DESCRIPTORS = __webpack_require__(52); +var SPECIES = __webpack_require__(21)('species'); module.exports = function (KEY) { var C = typeof core[KEY] == 'function' ? core[KEY] : global[KEY]; @@ -53325,7 +52993,7 @@ module.exports = function (KEY) { /***/ }), -/* 253 */ +/* 250 */ /***/ (function(module, exports, __webpack_require__) { var toInteger = __webpack_require__(97); @@ -53348,7 +53016,7 @@ module.exports = function (TO_STRING) { /***/ }), -/* 254 */ +/* 251 */ /***/ (function(module, exports, __webpack_require__) { var toInteger = __webpack_require__(97); @@ -53361,11 +53029,11 @@ module.exports = function (index, length) { /***/ }), -/* 255 */ +/* 252 */ /***/ (function(module, exports, __webpack_require__) { // 7.1.1 ToPrimitive(input [, PreferredType]) -var isObject = __webpack_require__(52); +var isObject = __webpack_require__(53); // instead of the ES6 spec version, we didn't implement @@toPrimitive case // and the second argument - flag - preferred type is a string module.exports = function (it, S) { @@ -53379,7 +53047,7 @@ module.exports = function (it, S) { /***/ }), -/* 256 */ +/* 253 */ /***/ (function(module, exports, __webpack_require__) { var global = __webpack_require__(17); @@ -53389,12 +53057,12 @@ module.exports = navigator && navigator.userAgent || ''; /***/ }), -/* 257 */ +/* 254 */ /***/ (function(module, exports, __webpack_require__) { var classof = __webpack_require__(126); -var ITERATOR = __webpack_require__(20)('iterator'); -var Iterators = __webpack_require__(53); +var ITERATOR = __webpack_require__(21)('iterator'); +var Iterators = __webpack_require__(54); module.exports = __webpack_require__(31).getIteratorMethod = function (it) { if (it != undefined) return it[ITERATOR] || it['@@iterator'] @@ -53403,14 +53071,14 @@ module.exports = __webpack_require__(31).getIteratorMethod = function (it) { /***/ }), -/* 258 */ +/* 255 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var addToUnscopables = __webpack_require__(234); -var step = __webpack_require__(244); -var Iterators = __webpack_require__(53); +var addToUnscopables = __webpack_require__(231); +var step = __webpack_require__(241); +var Iterators = __webpack_require__(54); var toIObject = __webpack_require__(98); // 22.1.3.4 Array.prototype.entries() @@ -53444,13 +53112,13 @@ addToUnscopables('entries'); /***/ }), -/* 259 */ +/* 256 */ /***/ (function(module, exports) { /***/ }), -/* 260 */ +/* 257 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -53460,16 +53128,16 @@ var global = __webpack_require__(17); var ctx = __webpack_require__(70); var classof = __webpack_require__(126); var $export = __webpack_require__(60); -var isObject = __webpack_require__(52); +var isObject = __webpack_require__(53); var aFunction = __webpack_require__(68); -var anInstance = __webpack_require__(235); -var forOf = __webpack_require__(237); +var anInstance = __webpack_require__(232); +var forOf = __webpack_require__(234); var speciesConstructor = __webpack_require__(134); var task = __webpack_require__(135).set; -var microtask = __webpack_require__(245)(); +var microtask = __webpack_require__(242)(); var newPromiseCapabilityModule = __webpack_require__(94); var perform = __webpack_require__(130); -var userAgent = __webpack_require__(256); +var userAgent = __webpack_require__(253); var promiseResolve = __webpack_require__(131); var PROMISE = 'Promise'; var TypeError = global.TypeError; @@ -53486,7 +53154,7 @@ var USE_NATIVE = !!function () { try { // correct subclassing with @@species support var promise = $Promise.resolve(1); - var FakePromise = (promise.constructor = {})[__webpack_require__(20)('species')] = function (exec) { + var FakePromise = (promise.constructor = {})[__webpack_require__(21)('species')] = function (exec) { exec(empty, empty); }; // unhandled rejections tracking support, NodeJS Promise without it fails @@species test @@ -53645,7 +53313,7 @@ if (!USE_NATIVE) { this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled this._n = false; // <- notify }; - Internal.prototype = __webpack_require__(250)($Promise.prototype, { + Internal.prototype = __webpack_require__(247)($Promise.prototype, { // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected) then: function then(onFulfilled, onRejected) { var reaction = newPromiseCapability(speciesConstructor(this, $Promise)); @@ -53677,7 +53345,7 @@ if (!USE_NATIVE) { $export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise }); __webpack_require__(95)($Promise, PROMISE); -__webpack_require__(252)(PROMISE); +__webpack_require__(249)(PROMISE); Wrapper = __webpack_require__(31)[PROMISE]; // statics @@ -53696,7 +53364,7 @@ $export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, { return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x); } }); -$export($export.S + $export.F * !(USE_NATIVE && __webpack_require__(243)(function (iter) { +$export($export.S + $export.F * !(USE_NATIVE && __webpack_require__(240)(function (iter) { $Promise.all(iter)['catch'](empty); })), PROMISE, { // 25.4.4.1 Promise.all(iterable) @@ -53743,12 +53411,12 @@ $export($export.S + $export.F * !(USE_NATIVE && __webpack_require__(243)(functio /***/ }), -/* 261 */ +/* 258 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var $at = __webpack_require__(253)(true); +var $at = __webpack_require__(250)(true); // 21.1.3.27 String.prototype[@@iterator]() __webpack_require__(129)(String, 'String', function (iterated) { @@ -53767,7 +53435,7 @@ __webpack_require__(129)(String, 'String', function (iterated) { /***/ }), -/* 262 */ +/* 259 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -53794,7 +53462,7 @@ $export($export.P + $export.R, 'Promise', { 'finally': function (onFinally) { /***/ }), -/* 263 */ +/* 260 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -53813,14 +53481,14 @@ $export($export.S, 'Promise', { 'try': function (callbackfn) { /***/ }), -/* 264 */ +/* 261 */ /***/ (function(module, exports, __webpack_require__) { -__webpack_require__(258); +__webpack_require__(255); var global = __webpack_require__(17); var hide = __webpack_require__(42); -var Iterators = __webpack_require__(53); -var TO_STRING_TAG = __webpack_require__(20)('toStringTag'); +var Iterators = __webpack_require__(54); +var TO_STRING_TAG = __webpack_require__(21)('toStringTag'); var DOMIterables = ('CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,' + 'DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,' + @@ -53838,7 +53506,7 @@ for (var i = 0; i < DOMIterables.length; i++) { /***/ }), -/* 265 */ +/* 262 */ /***/ (function(module, exports, __webpack_require__) { /** @@ -54039,7 +53707,7 @@ function localstorage() { /***/ }), -/* 266 */ +/* 263 */ /***/ (function(module, exports, __webpack_require__) { /** @@ -54048,14 +53716,14 @@ function localstorage() { */ if (typeof process === 'undefined' || process.type === 'renderer') { - module.exports = __webpack_require__(265); + module.exports = __webpack_require__(262); } else { - module.exports = __webpack_require__(267); + module.exports = __webpack_require__(264); } /***/ }), -/* 267 */ +/* 264 */ /***/ (function(module, exports, __webpack_require__) { /** @@ -54247,7 +53915,7 @@ exports.enable(load()); /***/ }), -/* 268 */ +/* 265 */ /***/ (function(module, exports, __webpack_require__) { (function webpackUniversalModuleDefinition(root, factory) { @@ -60961,7 +60629,7 @@ return /******/ (function(modules) { // webpackBootstrap ; /***/ }), -/* 269 */ +/* 266 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -61085,12 +60753,12 @@ module.exports = function extend() { /***/ }), -/* 270 */ +/* 267 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const escapeStringRegexp = __webpack_require__(388); +const escapeStringRegexp = __webpack_require__(382); const platform = process.platform; @@ -61239,7 +60907,7 @@ module.exports = Object.assign(fn, figures); /***/ }), -/* 271 */ +/* 268 */ /***/ (function(module, exports, __webpack_require__) { // Copyright Joyent, Inc. and other Node contributors. @@ -61265,7 +60933,7 @@ module.exports = Object.assign(fn, figures); var pathModule = __webpack_require__(0); var isWindows = process.platform === 'win32'; -var fs = __webpack_require__(5); +var fs = __webpack_require__(4); // JavaScript implementation of realpath, ported from node pre-v6 @@ -61548,13 +61216,13 @@ exports.realpath = function realpath(p, cache, cb) { /***/ }), -/* 272 */ +/* 269 */ /***/ (function(module, exports, __webpack_require__) { module.exports = globSync globSync.GlobSync = GlobSync -var fs = __webpack_require__(5) +var fs = __webpack_require__(4) var rp = __webpack_require__(140) var minimatch = __webpack_require__(82) var Minimatch = minimatch.Minimatch @@ -62039,6 +61707,387 @@ GlobSync.prototype._makeAbs = function (f) { } +/***/ }), +/* 270 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var resolve = __webpack_require__(271); + +module.exports = { + Validation: errorSubclass(ValidationError), + MissingRef: errorSubclass(MissingRefError) +}; + + +function ValidationError(errors) { + this.message = 'validation failed'; + this.errors = errors; + this.ajv = this.validation = true; +} + + +MissingRefError.message = function (baseId, ref) { + return 'can\'t resolve reference ' + ref + ' from id ' + baseId; +}; + + +function MissingRefError(baseId, ref, message) { + this.message = message || MissingRefError.message(baseId, ref); + this.missingRef = resolve.url(baseId, ref); + this.missingSchema = resolve.normalizeId(resolve.fullPath(this.missingRef)); +} + + +function errorSubclass(Subclass) { + Subclass.prototype = Object.create(Error.prototype); + Subclass.prototype.constructor = Subclass; + return Subclass; +} + + +/***/ }), +/* 271 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var url = __webpack_require__(24) + , equal = __webpack_require__(272) + , util = __webpack_require__(114) + , SchemaObject = __webpack_require__(386) + , traverse = __webpack_require__(677); + +module.exports = resolve; + +resolve.normalizeId = normalizeId; +resolve.fullPath = getFullPath; +resolve.url = resolveUrl; +resolve.ids = resolveIds; +resolve.inlineRef = inlineRef; +resolve.schema = resolveSchema; + +/** + * [resolve and compile the references ($ref)] + * @this Ajv + * @param {Function} compile reference to schema compilation funciton (localCompile) + * @param {Object} root object with information about the root schema for the current schema + * @param {String} ref reference to resolve + * @return {Object|Function} schema object (if the schema can be inlined) or validation function + */ +function resolve(compile, root, ref) { + /* jshint validthis: true */ + var refVal = this._refs[ref]; + if (typeof refVal == 'string') { + if (this._refs[refVal]) refVal = this._refs[refVal]; + else return resolve.call(this, compile, root, refVal); + } + + refVal = refVal || this._schemas[ref]; + if (refVal instanceof SchemaObject) { + return inlineRef(refVal.schema, this._opts.inlineRefs) + ? refVal.schema + : refVal.validate || this._compile(refVal); + } + + var res = resolveSchema.call(this, root, ref); + var schema, v, baseId; + if (res) { + schema = res.schema; + root = res.root; + baseId = res.baseId; + } + + if (schema instanceof SchemaObject) { + v = schema.validate || compile.call(this, schema.schema, root, undefined, baseId); + } else if (schema !== undefined) { + v = inlineRef(schema, this._opts.inlineRefs) + ? schema + : compile.call(this, schema, root, undefined, baseId); + } + + return v; +} + + +/** + * Resolve schema, its root and baseId + * @this Ajv + * @param {Object} root root object with properties schema, refVal, refs + * @param {String} ref reference to resolve + * @return {Object} object with properties schema, root, baseId + */ +function resolveSchema(root, ref) { + /* jshint validthis: true */ + var p = url.parse(ref, false, true) + , refPath = _getFullPath(p) + , baseId = getFullPath(this._getId(root.schema)); + if (refPath !== baseId) { + var id = normalizeId(refPath); + var refVal = this._refs[id]; + if (typeof refVal == 'string') { + return resolveRecursive.call(this, root, refVal, p); + } else if (refVal instanceof SchemaObject) { + if (!refVal.validate) this._compile(refVal); + root = refVal; + } else { + refVal = this._schemas[id]; + if (refVal instanceof SchemaObject) { + if (!refVal.validate) this._compile(refVal); + if (id == normalizeId(ref)) + return { schema: refVal, root: root, baseId: baseId }; + root = refVal; + } else { + return; + } + } + if (!root.schema) return; + baseId = getFullPath(this._getId(root.schema)); + } + return getJsonPointer.call(this, p, baseId, root.schema, root); +} + + +/* @this Ajv */ +function resolveRecursive(root, ref, parsedRef) { + /* jshint validthis: true */ + var res = resolveSchema.call(this, root, ref); + if (res) { + var schema = res.schema; + var baseId = res.baseId; + root = res.root; + var id = this._getId(schema); + if (id) baseId = resolveUrl(baseId, id); + return getJsonPointer.call(this, parsedRef, baseId, schema, root); + } +} + + +var PREVENT_SCOPE_CHANGE = util.toHash(['properties', 'patternProperties', 'enum', 'dependencies', 'definitions']); +/* @this Ajv */ +function getJsonPointer(parsedRef, baseId, schema, root) { + /* jshint validthis: true */ + parsedRef.hash = parsedRef.hash || ''; + if (parsedRef.hash.slice(0,2) != '#/') return; + var parts = parsedRef.hash.split('/'); + + for (var i = 1; i < parts.length; i++) { + var part = parts[i]; + if (part) { + part = util.unescapeFragment(part); + schema = schema[part]; + if (schema === undefined) break; + var id; + if (!PREVENT_SCOPE_CHANGE[part]) { + id = this._getId(schema); + if (id) baseId = resolveUrl(baseId, id); + if (schema.$ref) { + var $ref = resolveUrl(baseId, schema.$ref); + var res = resolveSchema.call(this, root, $ref); + if (res) { + schema = res.schema; + root = res.root; + baseId = res.baseId; + } + } + } + } + } + if (schema !== undefined && schema !== root.schema) + return { schema: schema, root: root, baseId: baseId }; +} + + +var SIMPLE_INLINED = util.toHash([ + 'type', 'format', 'pattern', + 'maxLength', 'minLength', + 'maxProperties', 'minProperties', + 'maxItems', 'minItems', + 'maximum', 'minimum', + 'uniqueItems', 'multipleOf', + 'required', 'enum' +]); +function inlineRef(schema, limit) { + if (limit === false) return false; + if (limit === undefined || limit === true) return checkNoRef(schema); + else if (limit) return countKeys(schema) <= limit; +} + + +function checkNoRef(schema) { + var item; + if (Array.isArray(schema)) { + for (var i=0; i', - $notOp = $isMax ? '>' : '<', - $errorKeyword = undefined; - if ($isDataExcl) { - var $schemaValueExcl = it.util.getData($schemaExcl.$data, $dataLvl, it.dataPathArr), - $exclusive = 'exclusive' + $lvl, - $exclType = 'exclType' + $lvl, - $exclIsNumber = 'exclIsNumber' + $lvl, - $opExpr = 'op' + $lvl, - $opStr = '\' + ' + $opExpr + ' + \''; - out += ' var schemaExcl' + ($lvl) + ' = ' + ($schemaValueExcl) + '; '; - $schemaValueExcl = 'schemaExcl' + $lvl; - out += ' var ' + ($exclusive) + '; var ' + ($exclType) + ' = typeof ' + ($schemaValueExcl) + '; if (' + ($exclType) + ' != \'boolean\' && ' + ($exclType) + ' != \'undefined\' && ' + ($exclType) + ' != \'number\') { '; - var $errorKeyword = $exclusiveKeyword; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || '_exclusiveLimit') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; - if (it.opts.messages !== false) { - out += ' , message: \'' + ($exclusiveKeyword) + ' should be boolean\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } else if ( '; - if ($isData) { - out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; - } - out += ' ' + ($exclType) + ' == \'number\' ? ( (' + ($exclusive) + ' = ' + ($schemaValue) + ' === undefined || ' + ($schemaValueExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ') ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValueExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) : ( (' + ($exclusive) + ' = ' + ($schemaValueExcl) + ' === true) ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValue) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { var op' + ($lvl) + ' = ' + ($exclusive) + ' ? \'' + ($op) + '\' : \'' + ($op) + '=\';'; - } else { - var $exclIsNumber = typeof $schemaExcl == 'number', - $opStr = $op; - if ($exclIsNumber && $isData) { - var $opExpr = '\'' + $opStr + '\''; - out += ' if ( '; - if ($isData) { - out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; - } - out += ' ( ' + ($schemaValue) + ' === undefined || ' + ($schemaExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ' ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { '; - } else { - if ($exclIsNumber && $schema === undefined) { - $exclusive = true; - $errorKeyword = $exclusiveKeyword; - $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword; - $schemaValue = $schemaExcl; - $notOp += '='; - } else { - if ($exclIsNumber) $schemaValue = Math[$isMax ? 'min' : 'max']($schemaExcl, $schema); - if ($schemaExcl === ($exclIsNumber ? $schemaValue : true)) { - $exclusive = true; - $errorKeyword = $exclusiveKeyword; - $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword; - $notOp += '='; - } else { - $exclusive = false; - $opStr += '='; - } - } - var $opExpr = '\'' + $opStr + '\''; - out += ' if ( '; - if ($isData) { - out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; - } - out += ' ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' || ' + ($data) + ' !== ' + ($data) + ') { '; - } - } - $errorKeyword = $errorKeyword || $keyword; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || '_limit') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { comparison: ' + ($opExpr) + ', limit: ' + ($schemaValue) + ', exclusive: ' + ($exclusive) + ' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should be ' + ($opStr) + ' '; - if ($isData) { - out += '\' + ' + ($schemaValue); - } else { - out += '' + ($schemaValue) + '\''; - } - } - if (it.opts.verbose) { - out += ' , schema: '; - if ($isData) { - out += 'validate.schema' + ($schemaPath); - } else { - out += '' + ($schema); - } - out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } '; - if ($breakOnError) { - out += ' else { '; - } - return out; -} - - -/***/ }), -/* 341 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -module.exports = function generate__limitItems(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $errorKeyword; - var $data = 'data' + ($dataLvl || ''); - var $isData = it.opts.$data && $schema && $schema.$data, - $schemaValue; - if ($isData) { - out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; - $schemaValue = 'schema' + $lvl; - } else { - $schemaValue = $schema; - } - var $op = $keyword == 'maxItems' ? '>' : '<'; - out += 'if ( '; - if ($isData) { - out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; - } - out += ' ' + ($data) + '.length ' + ($op) + ' ' + ($schemaValue) + ') { '; - var $errorKeyword = $keyword; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || '_limitItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should NOT have '; - if ($keyword == 'maxItems') { - out += 'more'; - } else { - out += 'less'; - } - out += ' than '; - if ($isData) { - out += '\' + ' + ($schemaValue) + ' + \''; - } else { - out += '' + ($schema); - } - out += ' items\' '; - } - if (it.opts.verbose) { - out += ' , schema: '; - if ($isData) { - out += 'validate.schema' + ($schemaPath); - } else { - out += '' + ($schema); - } - out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += '} '; - if ($breakOnError) { - out += ' else { '; - } - return out; -} - - -/***/ }), -/* 342 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -module.exports = function generate__limitLength(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $errorKeyword; - var $data = 'data' + ($dataLvl || ''); - var $isData = it.opts.$data && $schema && $schema.$data, - $schemaValue; - if ($isData) { - out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; - $schemaValue = 'schema' + $lvl; - } else { - $schemaValue = $schema; - } - var $op = $keyword == 'maxLength' ? '>' : '<'; - out += 'if ( '; - if ($isData) { - out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; - } - if (it.opts.unicode === false) { - out += ' ' + ($data) + '.length '; - } else { - out += ' ucs2length(' + ($data) + ') '; - } - out += ' ' + ($op) + ' ' + ($schemaValue) + ') { '; - var $errorKeyword = $keyword; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || '_limitLength') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should NOT be '; - if ($keyword == 'maxLength') { - out += 'longer'; - } else { - out += 'shorter'; - } - out += ' than '; - if ($isData) { - out += '\' + ' + ($schemaValue) + ' + \''; - } else { - out += '' + ($schema); - } - out += ' characters\' '; - } - if (it.opts.verbose) { - out += ' , schema: '; - if ($isData) { - out += 'validate.schema' + ($schemaPath); - } else { - out += '' + ($schema); - } - out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += '} '; - if ($breakOnError) { - out += ' else { '; - } - return out; -} - - -/***/ }), -/* 343 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -module.exports = function generate__limitProperties(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $errorKeyword; - var $data = 'data' + ($dataLvl || ''); - var $isData = it.opts.$data && $schema && $schema.$data, - $schemaValue; - if ($isData) { - out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; - $schemaValue = 'schema' + $lvl; - } else { - $schemaValue = $schema; - } - var $op = $keyword == 'maxProperties' ? '>' : '<'; - out += 'if ( '; - if ($isData) { - out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; - } - out += ' Object.keys(' + ($data) + ').length ' + ($op) + ' ' + ($schemaValue) + ') { '; - var $errorKeyword = $keyword; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || '_limitProperties') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should NOT have '; - if ($keyword == 'maxProperties') { - out += 'more'; - } else { - out += 'less'; - } - out += ' than '; - if ($isData) { - out += '\' + ' + ($schemaValue) + ' + \''; - } else { - out += '' + ($schema); - } - out += ' properties\' '; - } - if (it.opts.verbose) { - out += ' , schema: '; - if ($isData) { - out += 'validate.schema' + ($schemaPath); - } else { - out += '' + ($schema); - } - out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += '} '; - if ($breakOnError) { - out += ' else { '; - } - return out; -} - - -/***/ }), -/* 344 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -module.exports = function generate_validate(it, $keyword, $ruleType) { - var out = ''; - var $async = it.schema.$async === true, - $refKeywords = it.util.schemaHasRulesExcept(it.schema, it.RULES.all, '$ref'), - $id = it.self._getId(it.schema); - if (it.isTop) { - if ($async) { - it.async = true; - var $es7 = it.opts.async == 'es7'; - it.yieldAwait = $es7 ? 'await' : 'yield'; - } - out += ' var validate = '; - if ($async) { - if ($es7) { - out += ' (async function '; - } else { - if (it.opts.async != '*') { - out += 'co.wrap'; - } - out += '(function* '; - } - } else { - out += ' (function '; - } - out += ' (data, dataPath, parentData, parentDataProperty, rootData) { \'use strict\'; '; - if ($id && (it.opts.sourceCode || it.opts.processCode)) { - out += ' ' + ('/\*# sourceURL=' + $id + ' */') + ' '; - } - } - if (typeof it.schema == 'boolean' || !($refKeywords || it.schema.$ref)) { - var $keyword = 'false schema'; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $errorKeyword; - var $data = 'data' + ($dataLvl || ''); - var $valid = 'valid' + $lvl; - if (it.schema === false) { - if (it.isTop) { - $breakOnError = true; - } else { - out += ' var ' + ($valid) + ' = false; '; - } - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || 'false schema') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; - if (it.opts.messages !== false) { - out += ' , message: \'boolean schema is false\' '; - } - if (it.opts.verbose) { - out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - } else { - if (it.isTop) { - if ($async) { - out += ' return data; '; - } else { - out += ' validate.errors = null; return true; '; - } - } else { - out += ' var ' + ($valid) + ' = true; '; - } - } - if (it.isTop) { - out += ' }); return validate; '; - } - return out; - } - if (it.isTop) { - var $top = it.isTop, - $lvl = it.level = 0, - $dataLvl = it.dataLevel = 0, - $data = 'data'; - it.rootId = it.resolve.fullPath(it.self._getId(it.root.schema)); - it.baseId = it.baseId || it.rootId; - delete it.isTop; - it.dataPathArr = [undefined]; - out += ' var vErrors = null; '; - out += ' var errors = 0; '; - out += ' if (rootData === undefined) rootData = data; '; - } else { - var $lvl = it.level, - $dataLvl = it.dataLevel, - $data = 'data' + ($dataLvl || ''); - if ($id) it.baseId = it.resolve.url(it.baseId, $id); - if ($async && !it.async) throw new Error('async schema in sync schema'); - out += ' var errs_' + ($lvl) + ' = errors;'; - } - var $valid = 'valid' + $lvl, - $breakOnError = !it.opts.allErrors, - $closingBraces1 = '', - $closingBraces2 = ''; - var $errorKeyword; - var $typeSchema = it.schema.type, - $typeIsArray = Array.isArray($typeSchema); - if ($typeIsArray && $typeSchema.length == 1) { - $typeSchema = $typeSchema[0]; - $typeIsArray = false; - } - if (it.schema.$ref && $refKeywords) { - if (it.opts.extendRefs == 'fail') { - throw new Error('$ref: validation keywords used in schema at path "' + it.errSchemaPath + '" (see option extendRefs)'); - } else if (it.opts.extendRefs !== true) { - $refKeywords = false; - it.logger.warn('$ref: keywords ignored in schema at path "' + it.errSchemaPath + '"'); - } - } - if ($typeSchema) { - if (it.opts.coerceTypes) { - var $coerceToTypes = it.util.coerceToTypes(it.opts.coerceTypes, $typeSchema); - } - var $rulesGroup = it.RULES.types[$typeSchema]; - if ($coerceToTypes || $typeIsArray || $rulesGroup === true || ($rulesGroup && !$shouldUseGroup($rulesGroup))) { - var $schemaPath = it.schemaPath + '.type', - $errSchemaPath = it.errSchemaPath + '/type'; - var $schemaPath = it.schemaPath + '.type', - $errSchemaPath = it.errSchemaPath + '/type', - $method = $typeIsArray ? 'checkDataTypes' : 'checkDataType'; - out += ' if (' + (it.util[$method]($typeSchema, $data, true)) + ') { '; - if ($coerceToTypes) { - var $dataType = 'dataType' + $lvl, - $coerced = 'coerced' + $lvl; - out += ' var ' + ($dataType) + ' = typeof ' + ($data) + '; '; - if (it.opts.coerceTypes == 'array') { - out += ' if (' + ($dataType) + ' == \'object\' && Array.isArray(' + ($data) + ')) ' + ($dataType) + ' = \'array\'; '; - } - out += ' var ' + ($coerced) + ' = undefined; '; - var $bracesCoercion = ''; - var arr1 = $coerceToTypes; - if (arr1) { - var $type, $i = -1, - l1 = arr1.length - 1; - while ($i < l1) { - $type = arr1[$i += 1]; - if ($i) { - out += ' if (' + ($coerced) + ' === undefined) { '; - $bracesCoercion += '}'; - } - if (it.opts.coerceTypes == 'array' && $type != 'array') { - out += ' if (' + ($dataType) + ' == \'array\' && ' + ($data) + '.length == 1) { ' + ($coerced) + ' = ' + ($data) + ' = ' + ($data) + '[0]; ' + ($dataType) + ' = typeof ' + ($data) + '; } '; - } - if ($type == 'string') { - out += ' if (' + ($dataType) + ' == \'number\' || ' + ($dataType) + ' == \'boolean\') ' + ($coerced) + ' = \'\' + ' + ($data) + '; else if (' + ($data) + ' === null) ' + ($coerced) + ' = \'\'; '; - } else if ($type == 'number' || $type == 'integer') { - out += ' if (' + ($dataType) + ' == \'boolean\' || ' + ($data) + ' === null || (' + ($dataType) + ' == \'string\' && ' + ($data) + ' && ' + ($data) + ' == +' + ($data) + ' '; - if ($type == 'integer') { - out += ' && !(' + ($data) + ' % 1)'; - } - out += ')) ' + ($coerced) + ' = +' + ($data) + '; '; - } else if ($type == 'boolean') { - out += ' if (' + ($data) + ' === \'false\' || ' + ($data) + ' === 0 || ' + ($data) + ' === null) ' + ($coerced) + ' = false; else if (' + ($data) + ' === \'true\' || ' + ($data) + ' === 1) ' + ($coerced) + ' = true; '; - } else if ($type == 'null') { - out += ' if (' + ($data) + ' === \'\' || ' + ($data) + ' === 0 || ' + ($data) + ' === false) ' + ($coerced) + ' = null; '; - } else if (it.opts.coerceTypes == 'array' && $type == 'array') { - out += ' if (' + ($dataType) + ' == \'string\' || ' + ($dataType) + ' == \'number\' || ' + ($dataType) + ' == \'boolean\' || ' + ($data) + ' == null) ' + ($coerced) + ' = [' + ($data) + ']; '; - } - } - } - out += ' ' + ($bracesCoercion) + ' if (' + ($coerced) + ' === undefined) { '; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \''; - if ($typeIsArray) { - out += '' + ($typeSchema.join(",")); - } else { - out += '' + ($typeSchema); - } - out += '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should be '; - if ($typeIsArray) { - out += '' + ($typeSchema.join(",")); - } else { - out += '' + ($typeSchema); - } - out += '\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } else { '; - var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData', - $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty'; - out += ' ' + ($data) + ' = ' + ($coerced) + '; '; - if (!$dataLvl) { - out += 'if (' + ($parentData) + ' !== undefined)'; - } - out += ' ' + ($parentData) + '[' + ($parentDataProperty) + '] = ' + ($coerced) + '; } '; - } else { - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \''; - if ($typeIsArray) { - out += '' + ($typeSchema.join(",")); - } else { - out += '' + ($typeSchema); - } - out += '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should be '; - if ($typeIsArray) { - out += '' + ($typeSchema.join(",")); - } else { - out += '' + ($typeSchema); - } - out += '\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - } - out += ' } '; - } - } - if (it.schema.$ref && !$refKeywords) { - out += ' ' + (it.RULES.all.$ref.code(it, '$ref')) + ' '; - if ($breakOnError) { - out += ' } if (errors === '; - if ($top) { - out += '0'; - } else { - out += 'errs_' + ($lvl); - } - out += ') { '; - $closingBraces2 += '}'; - } - } else { - if (it.opts.v5 && it.schema.patternGroups) { - it.logger.warn('keyword "patternGroups" is deprecated and disabled. Use option patternGroups: true to enable.'); - } - var arr2 = it.RULES; - if (arr2) { - var $rulesGroup, i2 = -1, - l2 = arr2.length - 1; - while (i2 < l2) { - $rulesGroup = arr2[i2 += 1]; - if ($shouldUseGroup($rulesGroup)) { - if ($rulesGroup.type) { - out += ' if (' + (it.util.checkDataType($rulesGroup.type, $data)) + ') { '; - } - if (it.opts.useDefaults && !it.compositeRule) { - if ($rulesGroup.type == 'object' && it.schema.properties) { - var $schema = it.schema.properties, - $schemaKeys = Object.keys($schema); - var arr3 = $schemaKeys; - if (arr3) { - var $propertyKey, i3 = -1, - l3 = arr3.length - 1; - while (i3 < l3) { - $propertyKey = arr3[i3 += 1]; - var $sch = $schema[$propertyKey]; - if ($sch.default !== undefined) { - var $passData = $data + it.util.getProperty($propertyKey); - out += ' if (' + ($passData) + ' === undefined) ' + ($passData) + ' = '; - if (it.opts.useDefaults == 'shared') { - out += ' ' + (it.useDefault($sch.default)) + ' '; - } else { - out += ' ' + (JSON.stringify($sch.default)) + ' '; - } - out += '; '; - } - } - } - } else if ($rulesGroup.type == 'array' && Array.isArray(it.schema.items)) { - var arr4 = it.schema.items; - if (arr4) { - var $sch, $i = -1, - l4 = arr4.length - 1; - while ($i < l4) { - $sch = arr4[$i += 1]; - if ($sch.default !== undefined) { - var $passData = $data + '[' + $i + ']'; - out += ' if (' + ($passData) + ' === undefined) ' + ($passData) + ' = '; - if (it.opts.useDefaults == 'shared') { - out += ' ' + (it.useDefault($sch.default)) + ' '; - } else { - out += ' ' + (JSON.stringify($sch.default)) + ' '; - } - out += '; '; - } - } - } - } - } - var arr5 = $rulesGroup.rules; - if (arr5) { - var $rule, i5 = -1, - l5 = arr5.length - 1; - while (i5 < l5) { - $rule = arr5[i5 += 1]; - if ($shouldUseRule($rule)) { - var $code = $rule.code(it, $rule.keyword, $rulesGroup.type); - if ($code) { - out += ' ' + ($code) + ' '; - if ($breakOnError) { - $closingBraces1 += '}'; - } - } - } - } - } - if ($breakOnError) { - out += ' ' + ($closingBraces1) + ' '; - $closingBraces1 = ''; - } - if ($rulesGroup.type) { - out += ' } '; - if ($typeSchema && $typeSchema === $rulesGroup.type && !$coerceToTypes) { - out += ' else { '; - var $schemaPath = it.schemaPath + '.type', - $errSchemaPath = it.errSchemaPath + '/type'; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \''; - if ($typeIsArray) { - out += '' + ($typeSchema.join(",")); - } else { - out += '' + ($typeSchema); - } - out += '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should be '; - if ($typeIsArray) { - out += '' + ($typeSchema.join(",")); - } else { - out += '' + ($typeSchema); - } - out += '\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } '; - } - } - if ($breakOnError) { - out += ' if (errors === '; - if ($top) { - out += '0'; - } else { - out += 'errs_' + ($lvl); - } - out += ') { '; - $closingBraces2 += '}'; - } - } - } - } - } - if ($breakOnError) { - out += ' ' + ($closingBraces2) + ' '; - } - if ($top) { - if ($async) { - out += ' if (errors === 0) return data; '; - out += ' else throw new ValidationError(vErrors); '; - } else { - out += ' validate.errors = vErrors; '; - out += ' return errors === 0; '; - } - out += ' }); return validate;'; - } else { - out += ' var ' + ($valid) + ' = errors === errs_' + ($lvl) + ';'; - } - out = it.util.cleanUpCode(out); - if ($top) { - out = it.util.finalCleanUpCode(out, $async); - } - - function $shouldUseGroup($rulesGroup) { - var rules = $rulesGroup.rules; - for (var i = 0; i < rules.length; i++) - if ($shouldUseRule(rules[i])) return true; - } - - function $shouldUseRule($rule) { - return it.schema[$rule.keyword] !== undefined || ($rule.implements && $ruleImplementsSomeKeyword($rule)); - } - - function $ruleImplementsSomeKeyword($rule) { - var impl = $rule.implements; - for (var i = 0; i < impl.length; i++) - if (it.schema[impl[i]] !== undefined) return true; - } - return out; -} - - -/***/ }), -/* 345 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = __webpack_require__(509)().Promise - - -/***/ }), -/* 346 */ /***/ (function(module, exports) { // API @@ -72239,10 +71397,10 @@ function clean(key) /***/ }), -/* 347 */ +/* 341 */ /***/ (function(module, exports, __webpack_require__) { -var defer = __webpack_require__(518); +var defer = __webpack_require__(486); // API module.exports = async; @@ -72279,11 +71437,11 @@ function async(callback) /***/ }), -/* 348 */ +/* 342 */ /***/ (function(module, exports, __webpack_require__) { -var async = __webpack_require__(347) - , abort = __webpack_require__(346) +var async = __webpack_require__(341) + , abort = __webpack_require__(340) ; // API @@ -72360,7 +71518,7 @@ function runJob(iterator, key, item, callback) /***/ }), -/* 349 */ +/* 343 */ /***/ (function(module, exports) { // API @@ -72403,11 +71561,11 @@ function state(list, sortMethod) /***/ }), -/* 350 */ +/* 344 */ /***/ (function(module, exports, __webpack_require__) { -var abort = __webpack_require__(346) - , async = __webpack_require__(347) +var abort = __webpack_require__(340) + , async = __webpack_require__(341) ; // API @@ -72438,12 +71596,12 @@ function terminator(callback) /***/ }), -/* 351 */ +/* 345 */ /***/ (function(module, exports, __webpack_require__) { -var iterate = __webpack_require__(348) - , initState = __webpack_require__(349) - , terminator = __webpack_require__(350) +var iterate = __webpack_require__(342) + , initState = __webpack_require__(343) + , terminator = __webpack_require__(344) ; // Public API @@ -72519,7 +71677,7 @@ function descending(a, b) /***/ }), -/* 352 */ +/* 346 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -72534,7 +71692,7 @@ exports.default = { }; /***/ }), -/* 353 */ +/* 347 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -72602,19 +71760,19 @@ exports.hasWrapper = hasWrapper; var _promise; function _load_promise() { - return _promise = __webpack_require__(50); + return _promise = __webpack_require__(51); } var _hoistedTreeBuilder; function _load_hoistedTreeBuilder() { - return _hoistedTreeBuilder = __webpack_require__(554); + return _hoistedTreeBuilder = __webpack_require__(522); } var _getTransitiveDevDependencies; function _load_getTransitiveDevDependencies() { - return _getTransitiveDevDependencies = __webpack_require__(580); + return _getTransitiveDevDependencies = __webpack_require__(548); } var _install; @@ -72637,7 +71795,7 @@ function _load_constants() { function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -const zlib = __webpack_require__(198); +const zlib = __webpack_require__(199); const gzip = (0, (_promise || _load_promise()).promisify)(zlib.gzip); @@ -72851,7 +72009,7 @@ class Audit { exports.default = Audit; /***/ }), -/* 354 */ +/* 348 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -73087,13 +72245,13 @@ exports.hasWrapper = hasWrapper; var _index; function _load_index() { - return _index = __webpack_require__(57); + return _index = __webpack_require__(58); } var _filter; function _load_filter() { - return _filter = __webpack_require__(372); + return _filter = __webpack_require__(366); } var _constants; @@ -73105,7 +72263,7 @@ function _load_constants() { var _fs; function _load_fs() { - return _fs = _interopRequireWildcard(__webpack_require__(4)); + return _fs = _interopRequireWildcard(__webpack_require__(5)); } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } @@ -73178,7 +72336,7 @@ function hasWrapper(commander) { } /***/ }), -/* 355 */ +/* 349 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -73378,7 +72536,7 @@ function _load_buildSubCommands() { var _fs; function _load_fs() { - return _fs = _interopRequireWildcard(__webpack_require__(4)); + return _fs = _interopRequireWildcard(__webpack_require__(5)); } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } @@ -73387,7 +72545,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de const invariant = __webpack_require__(9); const path = __webpack_require__(0); -const micromatch = __webpack_require__(114); +const micromatch = __webpack_require__(115); function hasWrapper(flags, args) { return args[0] !== 'dir'; @@ -73426,7 +72584,7 @@ function setFlags(commander) { } /***/ }), -/* 356 */ +/* 350 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -73895,13 +73053,13 @@ function _load_errors() { var _integrityChecker; function _load_integrityChecker() { - return _integrityChecker = _interopRequireDefault(__webpack_require__(208)); + return _integrityChecker = _interopRequireDefault(__webpack_require__(206)); } var _integrityChecker2; function _load_integrityChecker2() { - return _integrityChecker2 = __webpack_require__(208); + return _integrityChecker2 = __webpack_require__(206); } var _lockfile; @@ -73913,7 +73071,7 @@ function _load_lockfile() { var _fs; function _load_fs() { - return _fs = _interopRequireWildcard(__webpack_require__(4)); + return _fs = _interopRequireWildcard(__webpack_require__(5)); } var _install; @@ -73949,7 +73107,7 @@ function setFlags(commander) { } /***/ }), -/* 357 */ +/* 351 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -74078,7 +73236,7 @@ function _load_errors() { var _fs; function _load_fs() { - return _fs = _interopRequireWildcard(__webpack_require__(4)); + return _fs = _interopRequireWildcard(__webpack_require__(5)); } var _global; @@ -74093,7 +73251,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de const invariant = __webpack_require__(9); -const cmdShim = __webpack_require__(201); +const cmdShim = __webpack_require__(202); const path = __webpack_require__(0); function hasWrapper(commander, args) { @@ -74105,7 +73263,7 @@ function setFlags(commander) { } /***/ }), -/* 358 */ +/* 352 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -74378,7 +73536,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de const invariant = __webpack_require__(9); -const micromatch = __webpack_require__(114); +const micromatch = __webpack_require__(115); const requireLockfile = exports.requireLockfile = true; @@ -74455,7 +73613,7 @@ function getDevDeps(manifest) { } /***/ }), -/* 359 */ +/* 353 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -74469,7 +73627,7 @@ exports.run = exports.requireLockfile = undefined; var _extends2; function _load_extends() { - return _extends2 = _interopRequireDefault(__webpack_require__(21)); + return _extends2 = _interopRequireDefault(__webpack_require__(20)); } var _asyncToGenerator2; @@ -74622,7 +73780,7 @@ function _load_lockfile() { var _index; function _load_index() { - return _index = __webpack_require__(57); + return _index = __webpack_require__(58); } var _install; @@ -74640,13 +73798,13 @@ function _load_errors() { var _index2; function _load_index2() { - return _index2 = __webpack_require__(200); + return _index2 = __webpack_require__(201); } var _fs; function _load_fs() { - return _fs = _interopRequireWildcard(__webpack_require__(4)); + return _fs = _interopRequireWildcard(__webpack_require__(5)); } var _constants; @@ -74676,7 +73834,7 @@ function hasWrapper(commander, args) { } /***/ }), -/* 360 */ +/* 354 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -75014,13 +74172,13 @@ function _load_executeLifecycleScript() { var _dynamicRequire; function _load_dynamicRequire() { - return _dynamicRequire = __webpack_require__(371); + return _dynamicRequire = __webpack_require__(365); } var _hooks; function _load_hooks() { - return _hooks = __webpack_require__(374); + return _hooks = __webpack_require__(368); } var _errors; @@ -75032,13 +74190,13 @@ function _load_errors() { var _packageCompatibility; function _load_packageCompatibility() { - return _packageCompatibility = __webpack_require__(209); + return _packageCompatibility = __webpack_require__(207); } var _fs; function _load_fs() { - return _fs = _interopRequireWildcard(__webpack_require__(4)); + return _fs = _interopRequireWildcard(__webpack_require__(5)); } var _constants; @@ -75097,7 +74255,7 @@ function hasWrapper(commander, args) { } /***/ }), -/* 361 */ +/* 355 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -75328,7 +74486,7 @@ exports.hasWrapper = hasWrapper; exports.examples = examples; /***/ }), -/* 362 */ +/* 356 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -75342,7 +74500,7 @@ exports.run = exports.requireLockfile = undefined; var _extends2; function _load_extends() { - return _extends2 = _interopRequireDefault(__webpack_require__(21)); + return _extends2 = _interopRequireDefault(__webpack_require__(20)); } var _asyncToGenerator2; @@ -75577,19 +74735,19 @@ function _load_add() { var _upgrade; function _load_upgrade() { - return _upgrade = __webpack_require__(207); + return _upgrade = __webpack_require__(205); } var _colorForVersions; function _load_colorForVersions() { - return _colorForVersions = _interopRequireDefault(__webpack_require__(369)); + return _colorForVersions = _interopRequireDefault(__webpack_require__(363)); } var _colorizeDiff; function _load_colorizeDiff() { - return _colorizeDiff = _interopRequireDefault(__webpack_require__(370)); + return _colorizeDiff = _interopRequireDefault(__webpack_require__(364)); } var _install; @@ -75619,7 +74777,7 @@ function hasWrapper(commander, args) { } /***/ }), -/* 363 */ +/* 357 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -75839,7 +74997,7 @@ exports.hasWrapper = hasWrapper; var _index; function _load_index() { - return _index = __webpack_require__(57); + return _index = __webpack_require__(58); } var _executeLifecycleScript; @@ -75857,13 +75015,13 @@ function _load_errors() { var _gitSpawn; function _load_gitSpawn() { - return _gitSpawn = __webpack_require__(373); + return _gitSpawn = __webpack_require__(367); } var _fs; function _load_fs() { - return _fs = _interopRequireWildcard(__webpack_require__(4)); + return _fs = _interopRequireWildcard(__webpack_require__(5)); } var _map; @@ -75906,7 +75064,7 @@ function hasWrapper(commander, args) { } /***/ }), -/* 364 */ +/* 358 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -75920,7 +75078,7 @@ exports.LocalTarballFetcher = undefined; var _extends2; function _load_extends() { - return _extends2 = _interopRequireDefault(__webpack_require__(21)); + return _extends2 = _interopRequireDefault(__webpack_require__(20)); } var _asyncToGenerator2; @@ -75950,7 +75108,7 @@ function _load_baseFetcher() { var _fs; function _load_fs() { - return _fs = _interopRequireWildcard(__webpack_require__(4)); + return _fs = _interopRequireWildcard(__webpack_require__(5)); } var _misc; @@ -75971,11 +75129,11 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de const crypto = __webpack_require__(11); const path = __webpack_require__(0); -const tarFs = __webpack_require__(193); +const tarFs = __webpack_require__(194); const url = __webpack_require__(24); -const fs = __webpack_require__(5); +const fs = __webpack_require__(4); const stream = __webpack_require__(23); -const gunzip = __webpack_require__(656); +const gunzip = __webpack_require__(624); const invariant = __webpack_require__(9); const ssri = __webpack_require__(65); @@ -76063,7 +75221,7 @@ class TarballFetcher extends (_baseFetcher || _load_baseFetcher()).default { const now = new Date(); - const fs = __webpack_require__(5); + const fs = __webpack_require__(4); const patchedFs = Object.assign({}, fs, { utimes: (path, atime, mtime, cb) => { fs.stat(path, (err, stat) => { @@ -76350,7 +75508,7 @@ function urlParts(requestUrl) { } /***/ }), -/* 365 */ +/* 359 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -76490,7 +75648,7 @@ class PackageReference { exports.default = PackageReference; /***/ }), -/* 366 */ +/* 360 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -76527,7 +75685,7 @@ function _load_normalizePattern() { var _requestManager; function _load_requestManager() { - return _requestManager = _interopRequireDefault(__webpack_require__(378)); + return _requestManager = _interopRequireDefault(__webpack_require__(372)); } var _blockingQueue; @@ -76557,13 +75715,13 @@ function _load_workspaceLayout() { var _resolutionMap; function _load_resolutionMap() { - return _resolutionMap = _interopRequireDefault(__webpack_require__(214)); + return _resolutionMap = _interopRequireDefault(__webpack_require__(212)); } var _resolutionMap2; function _load_resolutionMap2() { - return _resolutionMap2 = __webpack_require__(214); + return _resolutionMap2 = __webpack_require__(212); } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -77424,7 +76582,7 @@ class PackageResolver { exports.default = PackageResolver; /***/ }), -/* 367 */ +/* 361 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -77483,7 +76641,7 @@ GitHubResolver.protocol = 'github'; GitHubResolver.hostname = 'github.com'; /***/ }), -/* 368 */ +/* 362 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -77515,7 +76673,7 @@ function _load_misc() { var _fs; function _load_fs() { - return _fs = _interopRequireWildcard(__webpack_require__(4)); + return _fs = _interopRequireWildcard(__webpack_require__(5)); } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } @@ -77563,7 +76721,7 @@ exports.default = LinkResolver; LinkResolver.protocol = 'link'; /***/ }), -/* 369 */ +/* 363 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -77592,7 +76750,7 @@ function _load_semver() { var _semver2; function _load_semver2() { - return _semver2 = __webpack_require__(224); + return _semver2 = __webpack_require__(170); } var _constants; @@ -77604,7 +76762,7 @@ function _load_constants() { function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/* 370 */ +/* 364 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -77628,7 +76786,7 @@ exports.default = function (from, to, reporter) { }; /***/ }), -/* 371 */ +/* 365 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -77638,7 +76796,7 @@ exports.default = function (from, to, reporter) { exports.dynamicRequire = true ? require : require; // eslint-disable-line /***/ }), -/* 372 */ +/* 366 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -77658,7 +76816,7 @@ function _load_misc() { return _misc = __webpack_require__(18); } -const mm = __webpack_require__(114); +const mm = __webpack_require__(115); const path = __webpack_require__(0); const WHITESPACE_RE = /^\s+$/; @@ -77880,7 +77038,7 @@ function filterOverridenGitignores(files) { } /***/ }), -/* 373 */ +/* 367 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -77894,7 +77052,7 @@ exports.spawn = undefined; var _extends2; function _load_extends() { - return _extends2 = _interopRequireDefault(__webpack_require__(21)); + return _extends2 = _interopRequireDefault(__webpack_require__(20)); } var _path; @@ -77906,7 +77064,7 @@ function _load_path() { var _child; function _load_child() { - return _child = _interopRequireWildcard(__webpack_require__(58)); + return _child = _interopRequireWildcard(__webpack_require__(50)); } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } @@ -77938,7 +77096,7 @@ const spawn = exports.spawn = (args, opts = {}) => { }; /***/ }), -/* 374 */ +/* 368 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -77971,7 +77129,7 @@ function callThroughHook(type, fn, context) { } /***/ }), -/* 375 */ +/* 369 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -77999,7 +77157,7 @@ exports.default = key => { }; /***/ }), -/* 376 */ +/* 370 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -78026,7 +77184,7 @@ function isValidPackagePath(input) { } /***/ }), -/* 377 */ +/* 371 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -78060,7 +77218,7 @@ function resolveWithHome(path) { } /***/ }), -/* 378 */ +/* 372 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -78073,7 +77231,7 @@ Object.defineProperty(exports, "__esModule", { var _fs; function _load_fs() { - return _fs = _interopRequireDefault(__webpack_require__(5)); + return _fs = _interopRequireDefault(__webpack_require__(4)); } var _http; @@ -78091,7 +77249,7 @@ function _load_url() { var _dnscache; function _load_dnscache() { - return _dnscache = _interopRequireDefault(__webpack_require__(637)); + return _dnscache = _interopRequireDefault(__webpack_require__(605)); } var _invariant; @@ -78507,9 +77665,8 @@ class RequestManager { if (res.statusCode === 401 && res.headers['www-authenticate']) { const authMethods = res.headers['www-authenticate'].split(/,\s*/).map(s => s.toLowerCase()); - if (authMethods.indexOf('otp') !== -1) { - reject(new (_errors || _load_errors()).OneTimePasswordError()); + reject(new (_errors || _load_errors()).OneTimePasswordError(res.headers['npm-notice'])); return; } } @@ -78621,7 +77778,7 @@ class RequestManager { exports.default = RequestManager; /***/ }), -/* 379 */ +/* 373 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -79184,11 +78341,11 @@ module.exports = { /***/ }), -/* 380 */ +/* 374 */ /***/ (function(module, exports, __webpack_require__) { -var bufferFill = __webpack_require__(594) -var allocUnsafe = __webpack_require__(593) +var bufferFill = __webpack_require__(562) +var allocUnsafe = __webpack_require__(561) module.exports = function alloc (size, fill, encoding) { if (typeof size !== 'number') { @@ -79222,7 +78379,7 @@ module.exports = function alloc (size, fill, encoding) { /***/ }), -/* 381 */ +/* 375 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -79268,7 +78425,7 @@ exports.toggle = (force, stream) => { /***/ }), -/* 382 */ +/* 376 */ /***/ (function(module, exports, __webpack_require__) { var objectAssign = __webpack_require__(303); @@ -79578,7 +78735,7 @@ module.exports = { /***/ }), -/* 383 */ +/* 377 */ /***/ (function(module, exports) { @@ -79821,11 +78978,11 @@ function isObject(val) { /***/ }), -/* 384 */ +/* 378 */ /***/ (function(module, exports, __webpack_require__) { /* MIT license */ -var cssKeywords = __webpack_require__(610); +var cssKeywords = __webpack_require__(578); // NOTE: conversions should only return primitive values (i.e. arrays, or // values that give correct `typeof` results). @@ -80695,13 +79852,13 @@ convert.rgb.gray = function (rgb) { /***/ }), -/* 385 */ +/* 379 */ /***/ (function(module, exports, __webpack_require__) { var util = __webpack_require__(3); var Stream = __webpack_require__(23).Stream; -var DelayedStream = __webpack_require__(634); -var defer = __webpack_require__(622); +var DelayedStream = __webpack_require__(602); +var defer = __webpack_require__(590); module.exports = CombinedStream; function CombinedStream() { @@ -80890,11 +80047,11 @@ CombinedStream.prototype._emitError = function(err) { /***/ }), -/* 386 */ +/* 380 */ /***/ (function(module, exports, __webpack_require__) { var stream = __webpack_require__(102) -var eos = __webpack_require__(173) +var eos = __webpack_require__(174) var inherits = __webpack_require__(61) var shift = __webpack_require__(942) @@ -81131,14 +80288,14 @@ module.exports = Duplexify /***/ }), -/* 387 */ +/* 381 */ /***/ (function(module, exports, __webpack_require__) { var crypto = __webpack_require__(11); var BigInteger = __webpack_require__(81).BigInteger; var ECPointFp = __webpack_require__(139).ECPointFp; var Buffer = __webpack_require__(15).Buffer; -exports.ECCurves = __webpack_require__(638); +exports.ECCurves = __webpack_require__(606); // zero prepad function unstupid(hex,len) @@ -81195,7 +80352,7 @@ exports.ECKey = function(curve, key, isPublic) /***/ }), -/* 388 */ +/* 382 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -81213,7 +80370,7 @@ module.exports = function (str) { /***/ }), -/* 389 */ +/* 383 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -81279,13 +80436,13 @@ module.exports = function (data, opts) { /***/ }), -/* 390 */ +/* 384 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var fs = __webpack_require__(5) +var fs = __webpack_require__(4) module.exports = clone(fs) @@ -81307,12 +80464,12 @@ function clone (obj) { /***/ }), -/* 391 */ +/* 385 */ /***/ (function(module, exports, __webpack_require__) { -var fs = __webpack_require__(5) -var polyfills = __webpack_require__(655) -var legacy = __webpack_require__(654) +var fs = __webpack_require__(4) +var polyfills = __webpack_require__(623) +var legacy = __webpack_require__(622) var queue = [] var util = __webpack_require__(3) @@ -81336,7 +80493,7 @@ if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) { }) } -module.exports = patch(__webpack_require__(390)) +module.exports = patch(__webpack_require__(384)) if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH) { module.exports = patch(fs) } @@ -81574,6 +80731,897 @@ function retry () { } +/***/ }), +/* 386 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var util = __webpack_require__(114); + +module.exports = SchemaObject; + +function SchemaObject(obj) { + util.copy(obj, this); +} + + +/***/ }), +/* 387 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +module.exports = function generate__limit(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $errorKeyword; + var $data = 'data' + ($dataLvl || ''); + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + var $isMax = $keyword == 'maximum', + $exclusiveKeyword = $isMax ? 'exclusiveMaximum' : 'exclusiveMinimum', + $schemaExcl = it.schema[$exclusiveKeyword], + $isDataExcl = it.opts.$data && $schemaExcl && $schemaExcl.$data, + $op = $isMax ? '<' : '>', + $notOp = $isMax ? '>' : '<', + $errorKeyword = undefined; + if ($isDataExcl) { + var $schemaValueExcl = it.util.getData($schemaExcl.$data, $dataLvl, it.dataPathArr), + $exclusive = 'exclusive' + $lvl, + $exclType = 'exclType' + $lvl, + $exclIsNumber = 'exclIsNumber' + $lvl, + $opExpr = 'op' + $lvl, + $opStr = '\' + ' + $opExpr + ' + \''; + out += ' var schemaExcl' + ($lvl) + ' = ' + ($schemaValueExcl) + '; '; + $schemaValueExcl = 'schemaExcl' + $lvl; + out += ' var ' + ($exclusive) + '; var ' + ($exclType) + ' = typeof ' + ($schemaValueExcl) + '; if (' + ($exclType) + ' != \'boolean\' && ' + ($exclType) + ' != \'undefined\' && ' + ($exclType) + ' != \'number\') { '; + var $errorKeyword = $exclusiveKeyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || '_exclusiveLimit') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'' + ($exclusiveKeyword) + ' should be boolean\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } else if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + out += ' ' + ($exclType) + ' == \'number\' ? ( (' + ($exclusive) + ' = ' + ($schemaValue) + ' === undefined || ' + ($schemaValueExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ') ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValueExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) : ( (' + ($exclusive) + ' = ' + ($schemaValueExcl) + ' === true) ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValue) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { var op' + ($lvl) + ' = ' + ($exclusive) + ' ? \'' + ($op) + '\' : \'' + ($op) + '=\';'; + } else { + var $exclIsNumber = typeof $schemaExcl == 'number', + $opStr = $op; + if ($exclIsNumber && $isData) { + var $opExpr = '\'' + $opStr + '\''; + out += ' if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + out += ' ( ' + ($schemaValue) + ' === undefined || ' + ($schemaExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ' ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { '; + } else { + if ($exclIsNumber && $schema === undefined) { + $exclusive = true; + $errorKeyword = $exclusiveKeyword; + $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword; + $schemaValue = $schemaExcl; + $notOp += '='; + } else { + if ($exclIsNumber) $schemaValue = Math[$isMax ? 'min' : 'max']($schemaExcl, $schema); + if ($schemaExcl === ($exclIsNumber ? $schemaValue : true)) { + $exclusive = true; + $errorKeyword = $exclusiveKeyword; + $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword; + $notOp += '='; + } else { + $exclusive = false; + $opStr += '='; + } + } + var $opExpr = '\'' + $opStr + '\''; + out += ' if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + out += ' ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' || ' + ($data) + ' !== ' + ($data) + ') { '; + } + } + $errorKeyword = $errorKeyword || $keyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || '_limit') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { comparison: ' + ($opExpr) + ', limit: ' + ($schemaValue) + ', exclusive: ' + ($exclusive) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be ' + ($opStr) + ' '; + if ($isData) { + out += '\' + ' + ($schemaValue); + } else { + out += '' + ($schemaValue) + '\''; + } + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} + + +/***/ }), +/* 388 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +module.exports = function generate__limitItems(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $errorKeyword; + var $data = 'data' + ($dataLvl || ''); + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + var $op = $keyword == 'maxItems' ? '>' : '<'; + out += 'if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + out += ' ' + ($data) + '.length ' + ($op) + ' ' + ($schemaValue) + ') { '; + var $errorKeyword = $keyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || '_limitItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT have '; + if ($keyword == 'maxItems') { + out += 'more'; + } else { + out += 'less'; + } + out += ' than '; + if ($isData) { + out += '\' + ' + ($schemaValue) + ' + \''; + } else { + out += '' + ($schema); + } + out += ' items\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += '} '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} + + +/***/ }), +/* 389 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +module.exports = function generate__limitLength(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $errorKeyword; + var $data = 'data' + ($dataLvl || ''); + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + var $op = $keyword == 'maxLength' ? '>' : '<'; + out += 'if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + if (it.opts.unicode === false) { + out += ' ' + ($data) + '.length '; + } else { + out += ' ucs2length(' + ($data) + ') '; + } + out += ' ' + ($op) + ' ' + ($schemaValue) + ') { '; + var $errorKeyword = $keyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || '_limitLength') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT be '; + if ($keyword == 'maxLength') { + out += 'longer'; + } else { + out += 'shorter'; + } + out += ' than '; + if ($isData) { + out += '\' + ' + ($schemaValue) + ' + \''; + } else { + out += '' + ($schema); + } + out += ' characters\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += '} '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} + + +/***/ }), +/* 390 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +module.exports = function generate__limitProperties(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $errorKeyword; + var $data = 'data' + ($dataLvl || ''); + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + var $op = $keyword == 'maxProperties' ? '>' : '<'; + out += 'if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + out += ' Object.keys(' + ($data) + ').length ' + ($op) + ' ' + ($schemaValue) + ') { '; + var $errorKeyword = $keyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || '_limitProperties') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT have '; + if ($keyword == 'maxProperties') { + out += 'more'; + } else { + out += 'less'; + } + out += ' than '; + if ($isData) { + out += '\' + ' + ($schemaValue) + ' + \''; + } else { + out += '' + ($schema); + } + out += ' properties\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += '} '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} + + +/***/ }), +/* 391 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +module.exports = function generate_validate(it, $keyword, $ruleType) { + var out = ''; + var $async = it.schema.$async === true, + $refKeywords = it.util.schemaHasRulesExcept(it.schema, it.RULES.all, '$ref'), + $id = it.self._getId(it.schema); + if (it.isTop) { + if ($async) { + it.async = true; + var $es7 = it.opts.async == 'es7'; + it.yieldAwait = $es7 ? 'await' : 'yield'; + } + out += ' var validate = '; + if ($async) { + if ($es7) { + out += ' (async function '; + } else { + if (it.opts.async != '*') { + out += 'co.wrap'; + } + out += '(function* '; + } + } else { + out += ' (function '; + } + out += ' (data, dataPath, parentData, parentDataProperty, rootData) { \'use strict\'; '; + if ($id && (it.opts.sourceCode || it.opts.processCode)) { + out += ' ' + ('/\*# sourceURL=' + $id + ' */') + ' '; + } + } + if (typeof it.schema == 'boolean' || !($refKeywords || it.schema.$ref)) { + var $keyword = 'false schema'; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $errorKeyword; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + if (it.schema === false) { + if (it.isTop) { + $breakOnError = true; + } else { + out += ' var ' + ($valid) + ' = false; '; + } + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || 'false schema') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'boolean schema is false\' '; + } + if (it.opts.verbose) { + out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + } else { + if (it.isTop) { + if ($async) { + out += ' return data; '; + } else { + out += ' validate.errors = null; return true; '; + } + } else { + out += ' var ' + ($valid) + ' = true; '; + } + } + if (it.isTop) { + out += ' }); return validate; '; + } + return out; + } + if (it.isTop) { + var $top = it.isTop, + $lvl = it.level = 0, + $dataLvl = it.dataLevel = 0, + $data = 'data'; + it.rootId = it.resolve.fullPath(it.self._getId(it.root.schema)); + it.baseId = it.baseId || it.rootId; + delete it.isTop; + it.dataPathArr = [undefined]; + out += ' var vErrors = null; '; + out += ' var errors = 0; '; + out += ' if (rootData === undefined) rootData = data; '; + } else { + var $lvl = it.level, + $dataLvl = it.dataLevel, + $data = 'data' + ($dataLvl || ''); + if ($id) it.baseId = it.resolve.url(it.baseId, $id); + if ($async && !it.async) throw new Error('async schema in sync schema'); + out += ' var errs_' + ($lvl) + ' = errors;'; + } + var $valid = 'valid' + $lvl, + $breakOnError = !it.opts.allErrors, + $closingBraces1 = '', + $closingBraces2 = ''; + var $errorKeyword; + var $typeSchema = it.schema.type, + $typeIsArray = Array.isArray($typeSchema); + if ($typeIsArray && $typeSchema.length == 1) { + $typeSchema = $typeSchema[0]; + $typeIsArray = false; + } + if (it.schema.$ref && $refKeywords) { + if (it.opts.extendRefs == 'fail') { + throw new Error('$ref: validation keywords used in schema at path "' + it.errSchemaPath + '" (see option extendRefs)'); + } else if (it.opts.extendRefs !== true) { + $refKeywords = false; + it.logger.warn('$ref: keywords ignored in schema at path "' + it.errSchemaPath + '"'); + } + } + if ($typeSchema) { + if (it.opts.coerceTypes) { + var $coerceToTypes = it.util.coerceToTypes(it.opts.coerceTypes, $typeSchema); + } + var $rulesGroup = it.RULES.types[$typeSchema]; + if ($coerceToTypes || $typeIsArray || $rulesGroup === true || ($rulesGroup && !$shouldUseGroup($rulesGroup))) { + var $schemaPath = it.schemaPath + '.type', + $errSchemaPath = it.errSchemaPath + '/type'; + var $schemaPath = it.schemaPath + '.type', + $errSchemaPath = it.errSchemaPath + '/type', + $method = $typeIsArray ? 'checkDataTypes' : 'checkDataType'; + out += ' if (' + (it.util[$method]($typeSchema, $data, true)) + ') { '; + if ($coerceToTypes) { + var $dataType = 'dataType' + $lvl, + $coerced = 'coerced' + $lvl; + out += ' var ' + ($dataType) + ' = typeof ' + ($data) + '; '; + if (it.opts.coerceTypes == 'array') { + out += ' if (' + ($dataType) + ' == \'object\' && Array.isArray(' + ($data) + ')) ' + ($dataType) + ' = \'array\'; '; + } + out += ' var ' + ($coerced) + ' = undefined; '; + var $bracesCoercion = ''; + var arr1 = $coerceToTypes; + if (arr1) { + var $type, $i = -1, + l1 = arr1.length - 1; + while ($i < l1) { + $type = arr1[$i += 1]; + if ($i) { + out += ' if (' + ($coerced) + ' === undefined) { '; + $bracesCoercion += '}'; + } + if (it.opts.coerceTypes == 'array' && $type != 'array') { + out += ' if (' + ($dataType) + ' == \'array\' && ' + ($data) + '.length == 1) { ' + ($coerced) + ' = ' + ($data) + ' = ' + ($data) + '[0]; ' + ($dataType) + ' = typeof ' + ($data) + '; } '; + } + if ($type == 'string') { + out += ' if (' + ($dataType) + ' == \'number\' || ' + ($dataType) + ' == \'boolean\') ' + ($coerced) + ' = \'\' + ' + ($data) + '; else if (' + ($data) + ' === null) ' + ($coerced) + ' = \'\'; '; + } else if ($type == 'number' || $type == 'integer') { + out += ' if (' + ($dataType) + ' == \'boolean\' || ' + ($data) + ' === null || (' + ($dataType) + ' == \'string\' && ' + ($data) + ' && ' + ($data) + ' == +' + ($data) + ' '; + if ($type == 'integer') { + out += ' && !(' + ($data) + ' % 1)'; + } + out += ')) ' + ($coerced) + ' = +' + ($data) + '; '; + } else if ($type == 'boolean') { + out += ' if (' + ($data) + ' === \'false\' || ' + ($data) + ' === 0 || ' + ($data) + ' === null) ' + ($coerced) + ' = false; else if (' + ($data) + ' === \'true\' || ' + ($data) + ' === 1) ' + ($coerced) + ' = true; '; + } else if ($type == 'null') { + out += ' if (' + ($data) + ' === \'\' || ' + ($data) + ' === 0 || ' + ($data) + ' === false) ' + ($coerced) + ' = null; '; + } else if (it.opts.coerceTypes == 'array' && $type == 'array') { + out += ' if (' + ($dataType) + ' == \'string\' || ' + ($dataType) + ' == \'number\' || ' + ($dataType) + ' == \'boolean\' || ' + ($data) + ' == null) ' + ($coerced) + ' = [' + ($data) + ']; '; + } + } + } + out += ' ' + ($bracesCoercion) + ' if (' + ($coerced) + ' === undefined) { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \''; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be '; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } else { '; + var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData', + $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty'; + out += ' ' + ($data) + ' = ' + ($coerced) + '; '; + if (!$dataLvl) { + out += 'if (' + ($parentData) + ' !== undefined)'; + } + out += ' ' + ($parentData) + '[' + ($parentDataProperty) + '] = ' + ($coerced) + '; } '; + } else { + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \''; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be '; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + } + out += ' } '; + } + } + if (it.schema.$ref && !$refKeywords) { + out += ' ' + (it.RULES.all.$ref.code(it, '$ref')) + ' '; + if ($breakOnError) { + out += ' } if (errors === '; + if ($top) { + out += '0'; + } else { + out += 'errs_' + ($lvl); + } + out += ') { '; + $closingBraces2 += '}'; + } + } else { + if (it.opts.v5 && it.schema.patternGroups) { + it.logger.warn('keyword "patternGroups" is deprecated and disabled. Use option patternGroups: true to enable.'); + } + var arr2 = it.RULES; + if (arr2) { + var $rulesGroup, i2 = -1, + l2 = arr2.length - 1; + while (i2 < l2) { + $rulesGroup = arr2[i2 += 1]; + if ($shouldUseGroup($rulesGroup)) { + if ($rulesGroup.type) { + out += ' if (' + (it.util.checkDataType($rulesGroup.type, $data)) + ') { '; + } + if (it.opts.useDefaults && !it.compositeRule) { + if ($rulesGroup.type == 'object' && it.schema.properties) { + var $schema = it.schema.properties, + $schemaKeys = Object.keys($schema); + var arr3 = $schemaKeys; + if (arr3) { + var $propertyKey, i3 = -1, + l3 = arr3.length - 1; + while (i3 < l3) { + $propertyKey = arr3[i3 += 1]; + var $sch = $schema[$propertyKey]; + if ($sch.default !== undefined) { + var $passData = $data + it.util.getProperty($propertyKey); + out += ' if (' + ($passData) + ' === undefined) ' + ($passData) + ' = '; + if (it.opts.useDefaults == 'shared') { + out += ' ' + (it.useDefault($sch.default)) + ' '; + } else { + out += ' ' + (JSON.stringify($sch.default)) + ' '; + } + out += '; '; + } + } + } + } else if ($rulesGroup.type == 'array' && Array.isArray(it.schema.items)) { + var arr4 = it.schema.items; + if (arr4) { + var $sch, $i = -1, + l4 = arr4.length - 1; + while ($i < l4) { + $sch = arr4[$i += 1]; + if ($sch.default !== undefined) { + var $passData = $data + '[' + $i + ']'; + out += ' if (' + ($passData) + ' === undefined) ' + ($passData) + ' = '; + if (it.opts.useDefaults == 'shared') { + out += ' ' + (it.useDefault($sch.default)) + ' '; + } else { + out += ' ' + (JSON.stringify($sch.default)) + ' '; + } + out += '; '; + } + } + } + } + } + var arr5 = $rulesGroup.rules; + if (arr5) { + var $rule, i5 = -1, + l5 = arr5.length - 1; + while (i5 < l5) { + $rule = arr5[i5 += 1]; + if ($shouldUseRule($rule)) { + var $code = $rule.code(it, $rule.keyword, $rulesGroup.type); + if ($code) { + out += ' ' + ($code) + ' '; + if ($breakOnError) { + $closingBraces1 += '}'; + } + } + } + } + } + if ($breakOnError) { + out += ' ' + ($closingBraces1) + ' '; + $closingBraces1 = ''; + } + if ($rulesGroup.type) { + out += ' } '; + if ($typeSchema && $typeSchema === $rulesGroup.type && !$coerceToTypes) { + out += ' else { '; + var $schemaPath = it.schemaPath + '.type', + $errSchemaPath = it.errSchemaPath + '/type'; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \''; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be '; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } '; + } + } + if ($breakOnError) { + out += ' if (errors === '; + if ($top) { + out += '0'; + } else { + out += 'errs_' + ($lvl); + } + out += ') { '; + $closingBraces2 += '}'; + } + } + } + } + } + if ($breakOnError) { + out += ' ' + ($closingBraces2) + ' '; + } + if ($top) { + if ($async) { + out += ' if (errors === 0) return data; '; + out += ' else throw new ValidationError(vErrors); '; + } else { + out += ' validate.errors = vErrors; '; + out += ' return errors === 0; '; + } + out += ' }); return validate;'; + } else { + out += ' var ' + ($valid) + ' = errors === errs_' + ($lvl) + ';'; + } + out = it.util.cleanUpCode(out); + if ($top) { + out = it.util.finalCleanUpCode(out, $async); + } + + function $shouldUseGroup($rulesGroup) { + var rules = $rulesGroup.rules; + for (var i = 0; i < rules.length; i++) + if ($shouldUseRule(rules[i])) return true; + } + + function $shouldUseRule($rule) { + return it.schema[$rule.keyword] !== undefined || ($rule.implements && $ruleImplementsSomeKeyword($rule)); + } + + function $ruleImplementsSomeKeyword($rule) { + var impl = $rule.implements; + for (var i = 0; i < impl.length; i++) + if (it.schema[impl[i]] !== undefined) return true; + } + return out; +} + + /***/ }), /* 392 */ /***/ (function(module, exports, __webpack_require__) { @@ -81699,7 +81747,7 @@ module.exports = InputPrompt; var _ = __webpack_require__(38); var MuteStream = __webpack_require__(401); -var readline = __webpack_require__(197); +var readline = __webpack_require__(198); /** * Base interface class other can inherits from @@ -81786,7 +81834,7 @@ module.exports = UI; "use strict"; -var ansiEscapes = __webpack_require__(504); +var ansiEscapes = __webpack_require__(472); /** * Move cursor left by `x` @@ -81857,7 +81905,7 @@ module.exports = [["a140","",62],["a180","",32],["a240","",62],["a280", "use strict"; -module.exports = __webpack_require__(601).isCI +module.exports = __webpack_require__(569).isCI /***/ }), @@ -82713,7 +82761,7 @@ module.exports = { /**/ -var pna = __webpack_require__(180); +var pna = __webpack_require__(181); /**/ module.exports = Readable; @@ -82789,7 +82837,7 @@ function prependListener(emitter, event, fn) { } function ReadableState(options, stream) { - Duplex = Duplex || __webpack_require__(115); + Duplex = Duplex || __webpack_require__(116); options = options || {}; @@ -82866,7 +82914,7 @@ function ReadableState(options, stream) { } function Readable(options) { - Duplex = Duplex || __webpack_require__(115); + Duplex = Duplex || __webpack_require__(116); if (!(this instanceof Readable)) return new Readable(options); @@ -83780,7 +83828,7 @@ function indexOf(xs, x) { module.exports = Transform; -var Duplex = __webpack_require__(115); +var Duplex = __webpack_require__(116); /**/ var util = __webpack_require__(113); @@ -83962,7 +84010,7 @@ function done(stream, er, data) { /**/ -var pna = __webpack_require__(180); +var pna = __webpack_require__(181); /**/ module.exports = Writable; @@ -84033,7 +84081,7 @@ util.inherits(Writable, Stream); function nop() {} function WritableState(options, stream) { - Duplex = Duplex || __webpack_require__(115); + Duplex = Duplex || __webpack_require__(116); options = options || {}; @@ -84183,7 +84231,7 @@ if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.protot } function Writable(options) { - Duplex = Duplex || __webpack_require__(115); + Duplex = Duplex || __webpack_require__(116); // Writable ctor is applied to Duplexes, too. // `realHasInstance` is necessary because using plain `instanceof` @@ -84630,7 +84678,7 @@ Writable.prototype._destroy = function (err, cb) { /**/ -var pna = __webpack_require__(180); +var pna = __webpack_require__(181); /**/ // undocumented cb() API, needed for core, not for public API @@ -85111,7 +85159,7 @@ module.exports = function () { /***/ (function(module, exports, __webpack_require__) { var path = __webpack_require__(0); -var fs = __webpack_require__(5); +var fs = __webpack_require__(4); var parse = path.parse || __webpack_require__(774); module.exports = function nodeModulesPaths(start, opts) { @@ -85165,7 +85213,7 @@ module.exports = function nodeModulesPaths(start, opts) { /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return BehaviorSubject; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subject__ = __webpack_require__(36); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_ObjectUnsubscribedError__ = __webpack_require__(189); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_ObjectUnsubscribedError__ = __webpack_require__(190); /** PURE_IMPORTS_START tslib,_Subject,_util_ObjectUnsubscribedError PURE_IMPORTS_END */ @@ -85217,7 +85265,7 @@ var BehaviorSubject = /*@__PURE__*/ (function (_super) { "use strict"; /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return empty; }); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__config__ = __webpack_require__(185); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__config__ = __webpack_require__(186); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_hostReportError__ = __webpack_require__(323); /** PURE_IMPORTS_START _config,_util_hostReportError PURE_IMPORTS_END */ @@ -85513,7 +85561,7 @@ function merge() { /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return NEVER; }); /* harmony export (immutable) */ __webpack_exports__["a"] = never; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Observable__ = __webpack_require__(12); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_noop__ = __webpack_require__(191); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_noop__ = __webpack_require__(192); /** PURE_IMPORTS_START _Observable,_util_noop PURE_IMPORTS_END */ @@ -85625,7 +85673,7 @@ var RaceSubscriber = /*@__PURE__*/ (function (_super) { /* harmony export (immutable) */ __webpack_exports__["a"] = timer; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Observable__ = __webpack_require__(12); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__scheduler_async__ = __webpack_require__(40); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_isNumeric__ = __webpack_require__(190); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_isNumeric__ = __webpack_require__(191); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_isScheduler__ = __webpack_require__(49); /** PURE_IMPORTS_START _Observable,_scheduler_async,_util_isNumeric,_util_isScheduler PURE_IMPORTS_END */ @@ -85677,7 +85725,7 @@ function dispatch(state) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = audit; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_tryCatch__ = __webpack_require__(56); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_tryCatch__ = __webpack_require__(57); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_errorObject__ = __webpack_require__(48); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__OuterSubscriber__ = __webpack_require__(13); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__util_subscribeToResult__ = __webpack_require__(14); @@ -85790,7 +85838,7 @@ function concatMap(project, resultSelector) { /* harmony export (immutable) */ __webpack_exports__["a"] = distinctUntilChanged; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_tryCatch__ = __webpack_require__(56); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_tryCatch__ = __webpack_require__(57); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_errorObject__ = __webpack_require__(48); /** PURE_IMPORTS_START tslib,_Subscriber,_util_tryCatch,_util_errorObject PURE_IMPORTS_END */ @@ -86131,7 +86179,7 @@ var InnerRefCountSubscription = /*@__PURE__*/ (function (_super) { /* unused harmony export ObserveOnMessage */ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Notification__ = __webpack_require__(184); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Notification__ = __webpack_require__(185); /** PURE_IMPORTS_START tslib,_Subscriber,_Notification PURE_IMPORTS_END */ @@ -86211,7 +86259,7 @@ var ObserveOnMessage = /*@__PURE__*/ (function () { /* harmony export (immutable) */ __webpack_exports__["a"] = tap; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_noop__ = __webpack_require__(191); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_noop__ = __webpack_require__(192); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_isFunction__ = __webpack_require__(154); /** PURE_IMPORTS_START tslib,_Subscriber,_util_noop,_util_isFunction PURE_IMPORTS_END */ @@ -86607,7 +86655,7 @@ function isPromise(value) { /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__isPromise__ = __webpack_require__(445); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__isObject__ = __webpack_require__(444); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__symbol_iterator__ = __webpack_require__(151); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__symbol_observable__ = __webpack_require__(117); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__symbol_observable__ = __webpack_require__(118); /** PURE_IMPORTS_START _Observable,_subscribeToArray,_subscribeToPromise,_subscribeToIterable,_subscribeToObservable,_isArrayLike,_isPromise,_isObject,_symbol_iterator,_symbol_observable PURE_IMPORTS_END */ @@ -86716,7 +86764,7 @@ var subscribeToIterable = function (iterable) { "use strict"; /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return subscribeToObservable; }); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__symbol_observable__ = __webpack_require__(117); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__symbol_observable__ = __webpack_require__(118); /** PURE_IMPORTS_START _symbol_observable PURE_IMPORTS_END */ var subscribeToObservable = function (obj) { @@ -87176,7 +87224,7 @@ var utils = __webpack_require__(26); var Key = __webpack_require__(27); var PrivateKey = __webpack_require__(33); -var sshpriv = __webpack_require__(192); +var sshpriv = __webpack_require__(193); /*JSSTYLED*/ var SSHKEY_RE = /^([a-z0-9-]+)[ \t]+([a-zA-Z0-9+\/]+[=]*)([ \t]+([^ \t][^\n]*[\n]*)?)?$/; @@ -88321,7 +88369,7 @@ function simpleEnd(buf) { /***/ (function(module, exports, __webpack_require__) { var toBuffer = __webpack_require__(462) -var alloc = __webpack_require__(380) +var alloc = __webpack_require__(374) var ZEROS = '0000000000000000000' var SEVENS = '7777777777777777777' @@ -88831,7 +88879,7 @@ exports.default = handleSignals; var _child; function _load_child() { - return _child = __webpack_require__(58); + return _child = __webpack_require__(50); } function forwardSignalAndExit(signal) { @@ -88925,7 +88973,7 @@ module.exports = function (arg) { var util = __webpack_require__(3); var onExit = __webpack_require__(451); -var currentlyUnhandled = __webpack_require__(629); +var currentlyUnhandled = __webpack_require__(597); var installed = false; @@ -88967,7 +89015,7 @@ module.exports = function (log) { "use strict"; -const fs = __webpack_require__(391); +const fs = __webpack_require__(385); const path = __webpack_require__(0); const retry = __webpack_require__(819); const syncFs = __webpack_require__(779); @@ -89353,4084 +89401,6 @@ module.exports.checkSync = checkSync; "use strict"; - -var KEYWORDS = [ - 'multipleOf', - 'maximum', - 'exclusiveMaximum', - 'minimum', - 'exclusiveMinimum', - 'maxLength', - 'minLength', - 'pattern', - 'additionalItems', - 'maxItems', - 'minItems', - 'uniqueItems', - 'maxProperties', - 'minProperties', - 'required', - 'additionalProperties', - 'enum', - 'format', - 'const' -]; - -module.exports = function (metaSchema, keywordsJsonPointers) { - for (var i=0; i} errors optional array of validation errors, if not passed errors from the instance are used. - * @param {Object} options optional options with properties `separator` and `dataVar`. - * @return {String} human readable string with all errors descriptions - */ -function errorsText(errors, options) { - errors = errors || this.errors; - if (!errors) return 'No errors'; - options = options || {}; - var separator = options.separator === undefined ? ', ' : options.separator; - var dataVar = options.dataVar === undefined ? 'data' : options.dataVar; - - var text = ''; - for (var i=0; i%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i; -// For the source: https://gist.github.com/dperini/729294 -// For test cases: https://mathiasbynens.be/demo/url-regex -// @todo Delete current URL in favour of the commented out URL rule when this issue is fixed https://github.com/eslint/eslint/issues/7983. -// var URL = /^(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u{00a1}-\u{ffff}0-9]+-?)*[a-z\u{00a1}-\u{ffff}0-9]+)(?:\.(?:[a-z\u{00a1}-\u{ffff}0-9]+-?)*[a-z\u{00a1}-\u{ffff}0-9]+)*(?:\.(?:[a-z\u{00a1}-\u{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/iu; -var URL = /^(?:(?:http[s\u017F]?|ftp):\/\/)(?:(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+(?::(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?@)?(?:(?!10(?:\.[0-9]{1,3}){3})(?!127(?:\.[0-9]{1,3}){3})(?!169\.254(?:\.[0-9]{1,3}){2})(?!192\.168(?:\.[0-9]{1,3}){2})(?!172\.(?:1[6-9]|2[0-9]|3[01])(?:\.[0-9]{1,3}){2})(?:[1-9][0-9]?|1[0-9][0-9]|2[01][0-9]|22[0-3])(?:\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){2}(?:\.(?:[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-4]))|(?:(?:(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-?)*(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)(?:\.(?:(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-?)*(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)*(?:\.(?:(?:[KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){2,})))(?::[0-9]{2,5})?(?:\/(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?$/i; -var UUID = /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i; -var JSON_POINTER = /^(?:\/(?:[^~/]|~0|~1)*)*$|^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i; -var RELATIVE_JSON_POINTER = /^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/; - - -module.exports = formats; - -function formats(mode) { - mode = mode == 'full' ? 'full' : 'fast'; - return util.copy(formats[mode]); -} - - -formats.fast = { - // date: http://tools.ietf.org/html/rfc3339#section-5.6 - date: /^\d\d\d\d-[0-1]\d-[0-3]\d$/, - // date-time: http://tools.ietf.org/html/rfc3339#section-5.6 - time: /^[0-2]\d:[0-5]\d:[0-5]\d(?:\.\d+)?(?:z|[+-]\d\d:\d\d)?$/i, - 'date-time': /^\d\d\d\d-[0-1]\d-[0-3]\d[t\s][0-2]\d:[0-5]\d:[0-5]\d(?:\.\d+)?(?:z|[+-]\d\d:\d\d)$/i, - // uri: https://github.com/mafintosh/is-my-json-valid/blob/master/formats.js - uri: /^(?:[a-z][a-z0-9+-.]*)(?::|\/)\/?[^\s]*$/i, - 'uri-reference': /^(?:(?:[a-z][a-z0-9+-.]*:)?\/\/)?[^\s]*$/i, - 'uri-template': URITEMPLATE, - url: URL, - // email (sources from jsen validator): - // http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address#answer-8829363 - // http://www.w3.org/TR/html5/forms.html#valid-e-mail-address (search for 'willful violation') - email: /^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i, - hostname: HOSTNAME, - // optimized https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html - ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/, - // optimized http://stackoverflow.com/questions/53497/regular-expression-that-matches-valid-ipv6-addresses - ipv6: /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i, - regex: regex, - // uuid: http://tools.ietf.org/html/rfc4122 - uuid: UUID, - // JSON-pointer: https://tools.ietf.org/html/rfc6901 - // uri fragment: https://tools.ietf.org/html/rfc3986#appendix-A - 'json-pointer': JSON_POINTER, - // relative JSON-pointer: http://tools.ietf.org/html/draft-luff-relative-json-pointer-00 - 'relative-json-pointer': RELATIVE_JSON_POINTER -}; - - -formats.full = { - date: date, - time: time, - 'date-time': date_time, - uri: uri, - 'uri-reference': URIREF, - 'uri-template': URITEMPLATE, - url: URL, - email: /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&''*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i, - hostname: hostname, - ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/, - ipv6: /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i, - regex: regex, - uuid: UUID, - 'json-pointer': JSON_POINTER, - 'relative-json-pointer': RELATIVE_JSON_POINTER -}; - - -function date(str) { - // full-date from http://tools.ietf.org/html/rfc3339#section-5.6 - var matches = str.match(DATE); - if (!matches) return false; - - var month = +matches[1]; - var day = +matches[2]; - return month >= 1 && month <= 12 && day >= 1 && day <= DAYS[month]; -} - - -function time(str, full) { - var matches = str.match(TIME); - if (!matches) return false; - - var hour = matches[1]; - var minute = matches[2]; - var second = matches[3]; - var timeZone = matches[5]; - return hour <= 23 && minute <= 59 && second <= 59 && (!full || timeZone); -} - - -var DATE_TIME_SEPARATOR = /t|\s/i; -function date_time(str) { - // http://tools.ietf.org/html/rfc3339#section-5.6 - var dateTime = str.split(DATE_TIME_SEPARATOR); - return dateTime.length == 2 && date(dateTime[0]) && time(dateTime[1], true); -} - - -function hostname(str) { - // https://tools.ietf.org/html/rfc1034#section-3.5 - // https://tools.ietf.org/html/rfc1123#section-2 - return str.length <= 255 && HOSTNAME.test(str); -} - - -var NOT_URI_FRAGMENT = /\/|:/; -function uri(str) { - // http://jmrware.com/articles/2009/uri_regexp/URI_regex.html + optional protocol + required "." - return NOT_URI_FRAGMENT.test(str) && URI.test(str); -} - - -var Z_ANCHOR = /[^\\]\\Z/; -function regex(str) { - if (Z_ANCHOR.test(str)) return false; - try { - new RegExp(str); - return true; - } catch(e) { - return false; - } -} - - -/***/ }), -/* 478 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var resolve = __webpack_require__(203) - , util = __webpack_require__(106) - , errorClasses = __webpack_require__(202) - , stableStringify = __webpack_require__(389); - -var validateGenerator = __webpack_require__(344); - -/** - * Functions below are used inside compiled validations function - */ - -var co = __webpack_require__(383); -var ucs2length = util.ucs2length; -var equal = __webpack_require__(204); - -// this error is thrown by async schemas to return validation errors via exception -var ValidationError = errorClasses.Validation; - -module.exports = compile; - - -/** - * Compiles schema to validation function - * @this Ajv - * @param {Object} schema schema object - * @param {Object} root object with information about the root schema for this schema - * @param {Object} localRefs the hash of local references inside the schema (created by resolve.id), used for inline resolution - * @param {String} baseId base ID for IDs in the schema - * @return {Function} validation function - */ -function compile(schema, root, localRefs, baseId) { - /* jshint validthis: true, evil: true */ - /* eslint no-shadow: 0 */ - var self = this - , opts = this._opts - , refVal = [ undefined ] - , refs = {} - , patterns = [] - , patternsHash = {} - , defaults = [] - , defaultsHash = {} - , customRules = []; - - root = root || { schema: schema, refVal: refVal, refs: refs }; - - var c = checkCompiling.call(this, schema, root, baseId); - var compilation = this._compilations[c.index]; - if (c.compiling) return (compilation.callValidate = callValidate); - - var formats = this._formats; - var RULES = this.RULES; - - try { - var v = localCompile(schema, root, localRefs, baseId); - compilation.validate = v; - var cv = compilation.callValidate; - if (cv) { - cv.schema = v.schema; - cv.errors = null; - cv.refs = v.refs; - cv.refVal = v.refVal; - cv.root = v.root; - cv.$async = v.$async; - if (opts.sourceCode) cv.source = v.source; - } - return v; - } finally { - endCompiling.call(this, schema, root, baseId); - } - - function callValidate() { - var validate = compilation.validate; - var result = validate.apply(null, arguments); - callValidate.errors = validate.errors; - return result; - } - - function localCompile(_schema, _root, localRefs, baseId) { - var isRoot = !_root || (_root && _root.schema == _schema); - if (_root.schema != root.schema) - return compile.call(self, _schema, _root, localRefs, baseId); - - var $async = _schema.$async === true; - - var sourceCode = validateGenerator({ - isTop: true, - schema: _schema, - isRoot: isRoot, - baseId: baseId, - root: _root, - schemaPath: '', - errSchemaPath: '#', - errorPath: '""', - MissingRefError: errorClasses.MissingRef, - RULES: RULES, - validate: validateGenerator, - util: util, - resolve: resolve, - resolveRef: resolveRef, - usePattern: usePattern, - useDefault: useDefault, - useCustomRule: useCustomRule, - opts: opts, - formats: formats, - logger: self.logger, - self: self - }); - - sourceCode = vars(refVal, refValCode) + vars(patterns, patternCode) - + vars(defaults, defaultCode) + vars(customRules, customRuleCode) - + sourceCode; - - if (opts.processCode) sourceCode = opts.processCode(sourceCode); - // console.log('\n\n\n *** \n', JSON.stringify(sourceCode)); - var validate; - try { - var makeValidate = new Function( - 'self', - 'RULES', - 'formats', - 'root', - 'refVal', - 'defaults', - 'customRules', - 'co', - 'equal', - 'ucs2length', - 'ValidationError', - sourceCode - ); - - validate = makeValidate( - self, - RULES, - formats, - root, - refVal, - defaults, - customRules, - co, - equal, - ucs2length, - ValidationError - ); - - refVal[0] = validate; - } catch(e) { - self.logger.error('Error compiling schema, function code:', sourceCode); - throw e; - } - - validate.schema = _schema; - validate.errors = null; - validate.refs = refs; - validate.refVal = refVal; - validate.root = isRoot ? validate : _root; - if ($async) validate.$async = true; - if (opts.sourceCode === true) { - validate.source = { - code: sourceCode, - patterns: patterns, - defaults: defaults - }; - } - - return validate; - } - - function resolveRef(baseId, ref, isRoot) { - ref = resolve.url(baseId, ref); - var refIndex = refs[ref]; - var _refVal, refCode; - if (refIndex !== undefined) { - _refVal = refVal[refIndex]; - refCode = 'refVal[' + refIndex + ']'; - return resolvedRef(_refVal, refCode); - } - if (!isRoot && root.refs) { - var rootRefId = root.refs[ref]; - if (rootRefId !== undefined) { - _refVal = root.refVal[rootRefId]; - refCode = addLocalRef(ref, _refVal); - return resolvedRef(_refVal, refCode); - } - } - - refCode = addLocalRef(ref); - var v = resolve.call(self, localCompile, root, ref); - if (v === undefined) { - var localSchema = localRefs && localRefs[ref]; - if (localSchema) { - v = resolve.inlineRef(localSchema, opts.inlineRefs) - ? localSchema - : compile.call(self, localSchema, root, localRefs, baseId); - } - } - - if (v === undefined) { - removeLocalRef(ref); - } else { - replaceLocalRef(ref, v); - return resolvedRef(v, refCode); - } - } - - function addLocalRef(ref, v) { - var refId = refVal.length; - refVal[refId] = v; - refs[ref] = refId; - return 'refVal' + refId; - } - - function removeLocalRef(ref) { - delete refs[ref]; - } - - function replaceLocalRef(ref, v) { - var refId = refs[ref]; - refVal[refId] = v; - } - - function resolvedRef(refVal, code) { - return typeof refVal == 'object' || typeof refVal == 'boolean' - ? { code: code, schema: refVal, inline: true } - : { code: code, $async: refVal && refVal.$async }; - } - - function usePattern(regexStr) { - var index = patternsHash[regexStr]; - if (index === undefined) { - index = patternsHash[regexStr] = patterns.length; - patterns[index] = regexStr; - } - return 'pattern' + index; - } - - function useDefault(value) { - switch (typeof value) { - case 'boolean': - case 'number': - return '' + value; - case 'string': - return util.toQuotedString(value); - case 'object': - if (value === null) return 'null'; - var valueStr = stableStringify(value); - var index = defaultsHash[valueStr]; - if (index === undefined) { - index = defaultsHash[valueStr] = defaults.length; - defaults[index] = value; - } - return 'default' + index; - } - } - - function useCustomRule(rule, schema, parentSchema, it) { - var validateSchema = rule.definition.validateSchema; - if (validateSchema && self._opts.validateSchema !== false) { - var valid = validateSchema(schema); - if (!valid) { - var message = 'keyword schema is invalid: ' + self.errorsText(validateSchema.errors); - if (self._opts.validateSchema == 'log') self.logger.error(message); - else throw new Error(message); - } - } - - var compile = rule.definition.compile - , inline = rule.definition.inline - , macro = rule.definition.macro; - - var validate; - if (compile) { - validate = compile.call(self, schema, parentSchema, it); - } else if (macro) { - validate = macro.call(self, schema, parentSchema, it); - if (opts.validateSchema !== false) self.validateSchema(validate, true); - } else if (inline) { - validate = inline.call(self, it, rule.keyword, schema, parentSchema); - } else { - validate = rule.definition.validate; - if (!validate) return; - } - - if (validate === undefined) - throw new Error('custom keyword "' + rule.keyword + '"failed to compile'); - - var index = customRules.length; - customRules[index] = validate; - - return { - code: 'customRule' + index, - validate: validate - }; - } -} - - -/** - * Checks if the schema is currently compiled - * @this Ajv - * @param {Object} schema schema to compile - * @param {Object} root root object - * @param {String} baseId base schema ID - * @return {Object} object with properties "index" (compilation index) and "compiling" (boolean) - */ -function checkCompiling(schema, root, baseId) { - /* jshint validthis: true */ - var index = compIndex.call(this, schema, root, baseId); - if (index >= 0) return { index: index, compiling: true }; - index = this._compilations.length; - this._compilations[index] = { - schema: schema, - root: root, - baseId: baseId - }; - return { index: index, compiling: false }; -} - - -/** - * Removes the schema from the currently compiled list - * @this Ajv - * @param {Object} schema schema to compile - * @param {Object} root root object - * @param {String} baseId base schema ID - */ -function endCompiling(schema, root, baseId) { - /* jshint validthis: true */ - var i = compIndex.call(this, schema, root, baseId); - if (i >= 0) this._compilations.splice(i, 1); -} - - -/** - * Index of schema compilation in the currently compiled list - * @this Ajv - * @param {Object} schema schema to compile - * @param {Object} root root object - * @param {String} baseId base schema ID - * @return {Integer} compilation index - */ -function compIndex(schema, root, baseId) { - /* jshint validthis: true */ - for (var i=0; i= 0xD800 && value <= 0xDBFF && pos < len) { - // high surrogate, and there is a next character - value = str.charCodeAt(pos); - if ((value & 0xFC00) == 0xDC00) pos++; // low surrogate - } - } - return length; -}; - - -/***/ }), -/* 481 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -module.exports = function generate_allOf(it, $keyword, $ruleType) { - var out = ' '; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $it = it.util.copy(it); - var $closingBraces = ''; - $it.level++; - var $nextValid = 'valid' + $it.level; - var $currentBaseId = $it.baseId, - $allSchemasEmpty = true; - var arr1 = $schema; - if (arr1) { - var $sch, $i = -1, - l1 = arr1.length - 1; - while ($i < l1) { - $sch = arr1[$i += 1]; - if (it.util.schemaHasRules($sch, it.RULES.all)) { - $allSchemasEmpty = false; - $it.schema = $sch; - $it.schemaPath = $schemaPath + '[' + $i + ']'; - $it.errSchemaPath = $errSchemaPath + '/' + $i; - out += ' ' + (it.validate($it)) + ' '; - $it.baseId = $currentBaseId; - if ($breakOnError) { - out += ' if (' + ($nextValid) + ') { '; - $closingBraces += '}'; - } - } - } - } - if ($breakOnError) { - if ($allSchemasEmpty) { - out += ' if (true) { '; - } else { - out += ' ' + ($closingBraces.slice(0, -1)) + ' '; - } - } - out = it.util.cleanUpCode(out); - return out; -} - - -/***/ }), -/* 482 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -module.exports = function generate_anyOf(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $valid = 'valid' + $lvl; - var $errs = 'errs__' + $lvl; - var $it = it.util.copy(it); - var $closingBraces = ''; - $it.level++; - var $nextValid = 'valid' + $it.level; - var $noEmptySchema = $schema.every(function($sch) { - return it.util.schemaHasRules($sch, it.RULES.all); - }); - if ($noEmptySchema) { - var $currentBaseId = $it.baseId; - out += ' var ' + ($errs) + ' = errors; var ' + ($valid) + ' = false; '; - var $wasComposite = it.compositeRule; - it.compositeRule = $it.compositeRule = true; - var arr1 = $schema; - if (arr1) { - var $sch, $i = -1, - l1 = arr1.length - 1; - while ($i < l1) { - $sch = arr1[$i += 1]; - $it.schema = $sch; - $it.schemaPath = $schemaPath + '[' + $i + ']'; - $it.errSchemaPath = $errSchemaPath + '/' + $i; - out += ' ' + (it.validate($it)) + ' '; - $it.baseId = $currentBaseId; - out += ' ' + ($valid) + ' = ' + ($valid) + ' || ' + ($nextValid) + '; if (!' + ($valid) + ') { '; - $closingBraces += '}'; - } - } - it.compositeRule = $it.compositeRule = $wasComposite; - out += ' ' + ($closingBraces) + ' if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('anyOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; - if (it.opts.messages !== false) { - out += ' , message: \'should match some schema in anyOf\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError(vErrors); '; - } else { - out += ' validate.errors = vErrors; return false; '; - } - } - out += ' } else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; - if (it.opts.allErrors) { - out += ' } '; - } - out = it.util.cleanUpCode(out); - } else { - if ($breakOnError) { - out += ' if (true) { '; - } - } - return out; -} - - -/***/ }), -/* 483 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -module.exports = function generate_const(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $valid = 'valid' + $lvl; - var $isData = it.opts.$data && $schema && $schema.$data, - $schemaValue; - if ($isData) { - out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; - $schemaValue = 'schema' + $lvl; - } else { - $schemaValue = $schema; - } - if (!$isData) { - out += ' var schema' + ($lvl) + ' = validate.schema' + ($schemaPath) + ';'; - } - out += 'var ' + ($valid) + ' = equal(' + ($data) + ', schema' + ($lvl) + '); if (!' + ($valid) + ') { '; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('const') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; - if (it.opts.messages !== false) { - out += ' , message: \'should be equal to constant\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' }'; - if ($breakOnError) { - out += ' else { '; - } - return out; -} - - -/***/ }), -/* 484 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -module.exports = function generate_contains(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $valid = 'valid' + $lvl; - var $errs = 'errs__' + $lvl; - var $it = it.util.copy(it); - var $closingBraces = ''; - $it.level++; - var $nextValid = 'valid' + $it.level; - var $idx = 'i' + $lvl, - $dataNxt = $it.dataLevel = it.dataLevel + 1, - $nextData = 'data' + $dataNxt, - $currentBaseId = it.baseId, - $nonEmptySchema = it.util.schemaHasRules($schema, it.RULES.all); - out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';'; - if ($nonEmptySchema) { - var $wasComposite = it.compositeRule; - it.compositeRule = $it.compositeRule = true; - $it.schema = $schema; - $it.schemaPath = $schemaPath; - $it.errSchemaPath = $errSchemaPath; - out += ' var ' + ($nextValid) + ' = false; for (var ' + ($idx) + ' = 0; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { '; - $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); - var $passData = $data + '[' + $idx + ']'; - $it.dataPathArr[$dataNxt] = $idx; - var $code = it.validate($it); - $it.baseId = $currentBaseId; - if (it.util.varOccurences($code, $nextData) < 2) { - out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; - } else { - out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; - } - out += ' if (' + ($nextValid) + ') break; } '; - it.compositeRule = $it.compositeRule = $wasComposite; - out += ' ' + ($closingBraces) + ' if (!' + ($nextValid) + ') {'; - } else { - out += ' if (' + ($data) + '.length == 0) {'; - } - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('contains') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; - if (it.opts.messages !== false) { - out += ' , message: \'should contain a valid item\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } else { '; - if ($nonEmptySchema) { - out += ' errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; - } - if (it.opts.allErrors) { - out += ' } '; - } - out = it.util.cleanUpCode(out); - return out; -} - - -/***/ }), -/* 485 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -module.exports = function generate_custom(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $errorKeyword; - var $data = 'data' + ($dataLvl || ''); - var $valid = 'valid' + $lvl; - var $errs = 'errs__' + $lvl; - var $isData = it.opts.$data && $schema && $schema.$data, - $schemaValue; - if ($isData) { - out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; - $schemaValue = 'schema' + $lvl; - } else { - $schemaValue = $schema; - } - var $rule = this, - $definition = 'definition' + $lvl, - $rDef = $rule.definition, - $closingBraces = ''; - var $compile, $inline, $macro, $ruleValidate, $validateCode; - if ($isData && $rDef.$data) { - $validateCode = 'keywordValidate' + $lvl; - var $validateSchema = $rDef.validateSchema; - out += ' var ' + ($definition) + ' = RULES.custom[\'' + ($keyword) + '\'].definition; var ' + ($validateCode) + ' = ' + ($definition) + '.validate;'; - } else { - $ruleValidate = it.useCustomRule($rule, $schema, it.schema, it); - if (!$ruleValidate) return; - $schemaValue = 'validate.schema' + $schemaPath; - $validateCode = $ruleValidate.code; - $compile = $rDef.compile; - $inline = $rDef.inline; - $macro = $rDef.macro; - } - var $ruleErrs = $validateCode + '.errors', - $i = 'i' + $lvl, - $ruleErr = 'ruleErr' + $lvl, - $asyncKeyword = $rDef.async; - if ($asyncKeyword && !it.async) throw new Error('async keyword in sync schema'); - if (!($inline || $macro)) { - out += '' + ($ruleErrs) + ' = null;'; - } - out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';'; - if ($isData && $rDef.$data) { - $closingBraces += '}'; - out += ' if (' + ($schemaValue) + ' === undefined) { ' + ($valid) + ' = true; } else { '; - if ($validateSchema) { - $closingBraces += '}'; - out += ' ' + ($valid) + ' = ' + ($definition) + '.validateSchema(' + ($schemaValue) + '); if (' + ($valid) + ') { '; - } - } - if ($inline) { - if ($rDef.statements) { - out += ' ' + ($ruleValidate.validate) + ' '; - } else { - out += ' ' + ($valid) + ' = ' + ($ruleValidate.validate) + '; '; - } - } else if ($macro) { - var $it = it.util.copy(it); - var $closingBraces = ''; - $it.level++; - var $nextValid = 'valid' + $it.level; - $it.schema = $ruleValidate.validate; - $it.schemaPath = ''; - var $wasComposite = it.compositeRule; - it.compositeRule = $it.compositeRule = true; - var $code = it.validate($it).replace(/validate\.schema/g, $validateCode); - it.compositeRule = $it.compositeRule = $wasComposite; - out += ' ' + ($code); - } else { - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; - out += ' ' + ($validateCode) + '.call( '; - if (it.opts.passContext) { - out += 'this'; - } else { - out += 'self'; - } - if ($compile || $rDef.schema === false) { - out += ' , ' + ($data) + ' '; - } else { - out += ' , ' + ($schemaValue) + ' , ' + ($data) + ' , validate.schema' + (it.schemaPath) + ' '; - } - out += ' , (dataPath || \'\')'; - if (it.errorPath != '""') { - out += ' + ' + (it.errorPath); - } - var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData', - $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty'; - out += ' , ' + ($parentData) + ' , ' + ($parentDataProperty) + ' , rootData ) '; - var def_callRuleValidate = out; - out = $$outStack.pop(); - if ($rDef.errors === false) { - out += ' ' + ($valid) + ' = '; - if ($asyncKeyword) { - out += '' + (it.yieldAwait); - } - out += '' + (def_callRuleValidate) + '; '; - } else { - if ($asyncKeyword) { - $ruleErrs = 'customErrors' + $lvl; - out += ' var ' + ($ruleErrs) + ' = null; try { ' + ($valid) + ' = ' + (it.yieldAwait) + (def_callRuleValidate) + '; } catch (e) { ' + ($valid) + ' = false; if (e instanceof ValidationError) ' + ($ruleErrs) + ' = e.errors; else throw e; } '; - } else { - out += ' ' + ($ruleErrs) + ' = null; ' + ($valid) + ' = ' + (def_callRuleValidate) + '; '; - } - } - } - if ($rDef.modifying) { - out += ' if (' + ($parentData) + ') ' + ($data) + ' = ' + ($parentData) + '[' + ($parentDataProperty) + '];'; - } - out += '' + ($closingBraces); - if ($rDef.valid) { - if ($breakOnError) { - out += ' if (true) { '; - } - } else { - out += ' if ( '; - if ($rDef.valid === undefined) { - out += ' !'; - if ($macro) { - out += '' + ($nextValid); - } else { - out += '' + ($valid); - } - } else { - out += ' ' + (!$rDef.valid) + ' '; - } - out += ') { '; - $errorKeyword = $rule.keyword; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || 'custom') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { keyword: \'' + ($rule.keyword) + '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should pass "' + ($rule.keyword) + '" keyword validation\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - var def_customError = out; - out = $$outStack.pop(); - if ($inline) { - if ($rDef.errors) { - if ($rDef.errors != 'full') { - out += ' for (var ' + ($i) + '=' + ($errs) + '; ' + ($i) + '= 0) { - if ($breakOnError) { - out += ' if (true) { '; - } - return out; - } else { - throw new Error('unknown format "' + $schema + '" is used in schema at path "' + it.errSchemaPath + '"'); - } - } - var $isObject = typeof $format == 'object' && !($format instanceof RegExp) && $format.validate; - var $formatType = $isObject && $format.type || 'string'; - if ($isObject) { - var $async = $format.async === true; - $format = $format.validate; - } - if ($formatType != $ruleType) { - if ($breakOnError) { - out += ' if (true) { '; - } - return out; - } - if ($async) { - if (!it.async) throw new Error('async format in sync schema'); - var $formatRef = 'formats' + it.util.getProperty($schema) + '.validate'; - out += ' if (!(' + (it.yieldAwait) + ' ' + ($formatRef) + '(' + ($data) + '))) { '; - } else { - out += ' if (! '; - var $formatRef = 'formats' + it.util.getProperty($schema); - if ($isObject) $formatRef += '.validate'; - if (typeof $format == 'function') { - out += ' ' + ($formatRef) + '(' + ($data) + ') '; - } else { - out += ' ' + ($formatRef) + '.test(' + ($data) + ') '; - } - out += ') { '; - } - } - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('format') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { format: '; - if ($isData) { - out += '' + ($schemaValue); - } else { - out += '' + (it.util.toQuotedString($schema)); - } - out += ' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should match format "'; - if ($isData) { - out += '\' + ' + ($schemaValue) + ' + \''; - } else { - out += '' + (it.util.escapeQuotes($schema)); - } - out += '"\' '; - } - if (it.opts.verbose) { - out += ' , schema: '; - if ($isData) { - out += 'validate.schema' + ($schemaPath); - } else { - out += '' + (it.util.toQuotedString($schema)); - } - out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } '; - if ($breakOnError) { - out += ' else { '; - } - return out; -} - - -/***/ }), -/* 489 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -module.exports = function generate_items(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $valid = 'valid' + $lvl; - var $errs = 'errs__' + $lvl; - var $it = it.util.copy(it); - var $closingBraces = ''; - $it.level++; - var $nextValid = 'valid' + $it.level; - var $idx = 'i' + $lvl, - $dataNxt = $it.dataLevel = it.dataLevel + 1, - $nextData = 'data' + $dataNxt, - $currentBaseId = it.baseId; - out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';'; - if (Array.isArray($schema)) { - var $additionalItems = it.schema.additionalItems; - if ($additionalItems === false) { - out += ' ' + ($valid) + ' = ' + ($data) + '.length <= ' + ($schema.length) + '; '; - var $currErrSchemaPath = $errSchemaPath; - $errSchemaPath = it.errSchemaPath + '/additionalItems'; - out += ' if (!' + ($valid) + ') { '; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('additionalItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schema.length) + ' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should NOT have more than ' + ($schema.length) + ' items\' '; - } - if (it.opts.verbose) { - out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } '; - $errSchemaPath = $currErrSchemaPath; - if ($breakOnError) { - $closingBraces += '}'; - out += ' else { '; - } - } - var arr1 = $schema; - if (arr1) { - var $sch, $i = -1, - l1 = arr1.length - 1; - while ($i < l1) { - $sch = arr1[$i += 1]; - if (it.util.schemaHasRules($sch, it.RULES.all)) { - out += ' ' + ($nextValid) + ' = true; if (' + ($data) + '.length > ' + ($i) + ') { '; - var $passData = $data + '[' + $i + ']'; - $it.schema = $sch; - $it.schemaPath = $schemaPath + '[' + $i + ']'; - $it.errSchemaPath = $errSchemaPath + '/' + $i; - $it.errorPath = it.util.getPathExpr(it.errorPath, $i, it.opts.jsonPointers, true); - $it.dataPathArr[$dataNxt] = $i; - var $code = it.validate($it); - $it.baseId = $currentBaseId; - if (it.util.varOccurences($code, $nextData) < 2) { - out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; - } else { - out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; - } - out += ' } '; - if ($breakOnError) { - out += ' if (' + ($nextValid) + ') { '; - $closingBraces += '}'; - } - } - } - } - if (typeof $additionalItems == 'object' && it.util.schemaHasRules($additionalItems, it.RULES.all)) { - $it.schema = $additionalItems; - $it.schemaPath = it.schemaPath + '.additionalItems'; - $it.errSchemaPath = it.errSchemaPath + '/additionalItems'; - out += ' ' + ($nextValid) + ' = true; if (' + ($data) + '.length > ' + ($schema.length) + ') { for (var ' + ($idx) + ' = ' + ($schema.length) + '; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { '; - $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); - var $passData = $data + '[' + $idx + ']'; - $it.dataPathArr[$dataNxt] = $idx; - var $code = it.validate($it); - $it.baseId = $currentBaseId; - if (it.util.varOccurences($code, $nextData) < 2) { - out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; - } else { - out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; - } - if ($breakOnError) { - out += ' if (!' + ($nextValid) + ') break; '; - } - out += ' } } '; - if ($breakOnError) { - out += ' if (' + ($nextValid) + ') { '; - $closingBraces += '}'; - } - } - } else if (it.util.schemaHasRules($schema, it.RULES.all)) { - $it.schema = $schema; - $it.schemaPath = $schemaPath; - $it.errSchemaPath = $errSchemaPath; - out += ' for (var ' + ($idx) + ' = ' + (0) + '; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { '; - $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); - var $passData = $data + '[' + $idx + ']'; - $it.dataPathArr[$dataNxt] = $idx; - var $code = it.validate($it); - $it.baseId = $currentBaseId; - if (it.util.varOccurences($code, $nextData) < 2) { - out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; - } else { - out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; - } - if ($breakOnError) { - out += ' if (!' + ($nextValid) + ') break; '; - } - out += ' }'; - } - if ($breakOnError) { - out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {'; - } - out = it.util.cleanUpCode(out); - return out; -} - - -/***/ }), -/* 490 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -module.exports = function generate_multipleOf(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $isData = it.opts.$data && $schema && $schema.$data, - $schemaValue; - if ($isData) { - out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; - $schemaValue = 'schema' + $lvl; - } else { - $schemaValue = $schema; - } - out += 'var division' + ($lvl) + ';if ('; - if ($isData) { - out += ' ' + ($schemaValue) + ' !== undefined && ( typeof ' + ($schemaValue) + ' != \'number\' || '; - } - out += ' (division' + ($lvl) + ' = ' + ($data) + ' / ' + ($schemaValue) + ', '; - if (it.opts.multipleOfPrecision) { - out += ' Math.abs(Math.round(division' + ($lvl) + ') - division' + ($lvl) + ') > 1e-' + (it.opts.multipleOfPrecision) + ' '; - } else { - out += ' division' + ($lvl) + ' !== parseInt(division' + ($lvl) + ') '; - } - out += ' ) '; - if ($isData) { - out += ' ) '; - } - out += ' ) { '; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('multipleOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { multipleOf: ' + ($schemaValue) + ' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should be multiple of '; - if ($isData) { - out += '\' + ' + ($schemaValue); - } else { - out += '' + ($schemaValue) + '\''; - } - } - if (it.opts.verbose) { - out += ' , schema: '; - if ($isData) { - out += 'validate.schema' + ($schemaPath); - } else { - out += '' + ($schema); - } - out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += '} '; - if ($breakOnError) { - out += ' else { '; - } - return out; -} - - -/***/ }), -/* 491 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -module.exports = function generate_not(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $errs = 'errs__' + $lvl; - var $it = it.util.copy(it); - $it.level++; - var $nextValid = 'valid' + $it.level; - if (it.util.schemaHasRules($schema, it.RULES.all)) { - $it.schema = $schema; - $it.schemaPath = $schemaPath; - $it.errSchemaPath = $errSchemaPath; - out += ' var ' + ($errs) + ' = errors; '; - var $wasComposite = it.compositeRule; - it.compositeRule = $it.compositeRule = true; - $it.createErrors = false; - var $allErrorsOption; - if ($it.opts.allErrors) { - $allErrorsOption = $it.opts.allErrors; - $it.opts.allErrors = false; - } - out += ' ' + (it.validate($it)) + ' '; - $it.createErrors = true; - if ($allErrorsOption) $it.opts.allErrors = $allErrorsOption; - it.compositeRule = $it.compositeRule = $wasComposite; - out += ' if (' + ($nextValid) + ') { '; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('not') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; - if (it.opts.messages !== false) { - out += ' , message: \'should NOT be valid\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; - if (it.opts.allErrors) { - out += ' } '; - } - } else { - out += ' var err = '; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('not') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; - if (it.opts.messages !== false) { - out += ' , message: \'should NOT be valid\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - if ($breakOnError) { - out += ' if (false) { '; - } - } - return out; -} - - -/***/ }), -/* 492 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -module.exports = function generate_oneOf(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $valid = 'valid' + $lvl; - var $errs = 'errs__' + $lvl; - var $it = it.util.copy(it); - var $closingBraces = ''; - $it.level++; - var $nextValid = 'valid' + $it.level; - out += 'var ' + ($errs) + ' = errors;var prevValid' + ($lvl) + ' = false;var ' + ($valid) + ' = false;'; - var $currentBaseId = $it.baseId; - var $wasComposite = it.compositeRule; - it.compositeRule = $it.compositeRule = true; - var arr1 = $schema; - if (arr1) { - var $sch, $i = -1, - l1 = arr1.length - 1; - while ($i < l1) { - $sch = arr1[$i += 1]; - if (it.util.schemaHasRules($sch, it.RULES.all)) { - $it.schema = $sch; - $it.schemaPath = $schemaPath + '[' + $i + ']'; - $it.errSchemaPath = $errSchemaPath + '/' + $i; - out += ' ' + (it.validate($it)) + ' '; - $it.baseId = $currentBaseId; - } else { - out += ' var ' + ($nextValid) + ' = true; '; - } - if ($i) { - out += ' if (' + ($nextValid) + ' && prevValid' + ($lvl) + ') ' + ($valid) + ' = false; else { '; - $closingBraces += '}'; - } - out += ' if (' + ($nextValid) + ') ' + ($valid) + ' = prevValid' + ($lvl) + ' = true;'; - } - } - it.compositeRule = $it.compositeRule = $wasComposite; - out += '' + ($closingBraces) + 'if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('oneOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; - if (it.opts.messages !== false) { - out += ' , message: \'should match exactly one schema in oneOf\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError(vErrors); '; - } else { - out += ' validate.errors = vErrors; return false; '; - } - } - out += '} else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; }'; - if (it.opts.allErrors) { - out += ' } '; - } - return out; -} - - -/***/ }), -/* 493 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -module.exports = function generate_pattern(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $isData = it.opts.$data && $schema && $schema.$data, - $schemaValue; - if ($isData) { - out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; - $schemaValue = 'schema' + $lvl; - } else { - $schemaValue = $schema; - } - var $regexp = $isData ? '(new RegExp(' + $schemaValue + '))' : it.usePattern($schema); - out += 'if ( '; - if ($isData) { - out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'string\') || '; - } - out += ' !' + ($regexp) + '.test(' + ($data) + ') ) { '; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('pattern') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { pattern: '; - if ($isData) { - out += '' + ($schemaValue); - } else { - out += '' + (it.util.toQuotedString($schema)); - } - out += ' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should match pattern "'; - if ($isData) { - out += '\' + ' + ($schemaValue) + ' + \''; - } else { - out += '' + (it.util.escapeQuotes($schema)); - } - out += '"\' '; - } - if (it.opts.verbose) { - out += ' , schema: '; - if ($isData) { - out += 'validate.schema' + ($schemaPath); - } else { - out += '' + (it.util.toQuotedString($schema)); - } - out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += '} '; - if ($breakOnError) { - out += ' else { '; - } - return out; -} - - -/***/ }), -/* 494 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -module.exports = function generate_properties(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $valid = 'valid' + $lvl; - var $errs = 'errs__' + $lvl; - var $it = it.util.copy(it); - var $closingBraces = ''; - $it.level++; - var $nextValid = 'valid' + $it.level; - var $key = 'key' + $lvl, - $idx = 'idx' + $lvl, - $dataNxt = $it.dataLevel = it.dataLevel + 1, - $nextData = 'data' + $dataNxt, - $dataProperties = 'dataProperties' + $lvl; - var $schemaKeys = Object.keys($schema || {}), - $pProperties = it.schema.patternProperties || {}, - $pPropertyKeys = Object.keys($pProperties), - $aProperties = it.schema.additionalProperties, - $someProperties = $schemaKeys.length || $pPropertyKeys.length, - $noAdditional = $aProperties === false, - $additionalIsSchema = typeof $aProperties == 'object' && Object.keys($aProperties).length, - $removeAdditional = it.opts.removeAdditional, - $checkAdditional = $noAdditional || $additionalIsSchema || $removeAdditional, - $ownProperties = it.opts.ownProperties, - $currentBaseId = it.baseId; - var $required = it.schema.required; - if ($required && !(it.opts.v5 && $required.$data) && $required.length < it.opts.loopRequired) var $requiredHash = it.util.toHash($required); - if (it.opts.patternGroups) { - var $pgProperties = it.schema.patternGroups || {}, - $pgPropertyKeys = Object.keys($pgProperties); - } - out += 'var ' + ($errs) + ' = errors;var ' + ($nextValid) + ' = true;'; - if ($ownProperties) { - out += ' var ' + ($dataProperties) + ' = undefined;'; - } - if ($checkAdditional) { - if ($ownProperties) { - out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; - } else { - out += ' for (var ' + ($key) + ' in ' + ($data) + ') { '; - } - if ($someProperties) { - out += ' var isAdditional' + ($lvl) + ' = !(false '; - if ($schemaKeys.length) { - if ($schemaKeys.length > 5) { - out += ' || validate.schema' + ($schemaPath) + '[' + ($key) + '] '; - } else { - var arr1 = $schemaKeys; - if (arr1) { - var $propertyKey, i1 = -1, - l1 = arr1.length - 1; - while (i1 < l1) { - $propertyKey = arr1[i1 += 1]; - out += ' || ' + ($key) + ' == ' + (it.util.toQuotedString($propertyKey)) + ' '; - } - } - } - } - if ($pPropertyKeys.length) { - var arr2 = $pPropertyKeys; - if (arr2) { - var $pProperty, $i = -1, - l2 = arr2.length - 1; - while ($i < l2) { - $pProperty = arr2[$i += 1]; - out += ' || ' + (it.usePattern($pProperty)) + '.test(' + ($key) + ') '; - } - } - } - if (it.opts.patternGroups && $pgPropertyKeys.length) { - var arr3 = $pgPropertyKeys; - if (arr3) { - var $pgProperty, $i = -1, - l3 = arr3.length - 1; - while ($i < l3) { - $pgProperty = arr3[$i += 1]; - out += ' || ' + (it.usePattern($pgProperty)) + '.test(' + ($key) + ') '; - } - } - } - out += ' ); if (isAdditional' + ($lvl) + ') { '; - } - if ($removeAdditional == 'all') { - out += ' delete ' + ($data) + '[' + ($key) + ']; '; - } else { - var $currentErrorPath = it.errorPath; - var $additionalProperty = '\' + ' + $key + ' + \''; - if (it.opts._errorDataPathProperty) { - it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); - } - if ($noAdditional) { - if ($removeAdditional) { - out += ' delete ' + ($data) + '[' + ($key) + ']; '; - } else { - out += ' ' + ($nextValid) + ' = false; '; - var $currErrSchemaPath = $errSchemaPath; - $errSchemaPath = it.errSchemaPath + '/additionalProperties'; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('additionalProperties') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { additionalProperty: \'' + ($additionalProperty) + '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should NOT have additional properties\' '; - } - if (it.opts.verbose) { - out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - $errSchemaPath = $currErrSchemaPath; - if ($breakOnError) { - out += ' break; '; - } - } - } else if ($additionalIsSchema) { - if ($removeAdditional == 'failing') { - out += ' var ' + ($errs) + ' = errors; '; - var $wasComposite = it.compositeRule; - it.compositeRule = $it.compositeRule = true; - $it.schema = $aProperties; - $it.schemaPath = it.schemaPath + '.additionalProperties'; - $it.errSchemaPath = it.errSchemaPath + '/additionalProperties'; - $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); - var $passData = $data + '[' + $key + ']'; - $it.dataPathArr[$dataNxt] = $key; - var $code = it.validate($it); - $it.baseId = $currentBaseId; - if (it.util.varOccurences($code, $nextData) < 2) { - out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; - } else { - out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; - } - out += ' if (!' + ($nextValid) + ') { errors = ' + ($errs) + '; if (validate.errors !== null) { if (errors) validate.errors.length = errors; else validate.errors = null; } delete ' + ($data) + '[' + ($key) + ']; } '; - it.compositeRule = $it.compositeRule = $wasComposite; - } else { - $it.schema = $aProperties; - $it.schemaPath = it.schemaPath + '.additionalProperties'; - $it.errSchemaPath = it.errSchemaPath + '/additionalProperties'; - $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); - var $passData = $data + '[' + $key + ']'; - $it.dataPathArr[$dataNxt] = $key; - var $code = it.validate($it); - $it.baseId = $currentBaseId; - if (it.util.varOccurences($code, $nextData) < 2) { - out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; - } else { - out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; - } - if ($breakOnError) { - out += ' if (!' + ($nextValid) + ') break; '; - } - } - } - it.errorPath = $currentErrorPath; - } - if ($someProperties) { - out += ' } '; - } - out += ' } '; - if ($breakOnError) { - out += ' if (' + ($nextValid) + ') { '; - $closingBraces += '}'; - } - } - var $useDefaults = it.opts.useDefaults && !it.compositeRule; - if ($schemaKeys.length) { - var arr4 = $schemaKeys; - if (arr4) { - var $propertyKey, i4 = -1, - l4 = arr4.length - 1; - while (i4 < l4) { - $propertyKey = arr4[i4 += 1]; - var $sch = $schema[$propertyKey]; - if (it.util.schemaHasRules($sch, it.RULES.all)) { - var $prop = it.util.getProperty($propertyKey), - $passData = $data + $prop, - $hasDefault = $useDefaults && $sch.default !== undefined; - $it.schema = $sch; - $it.schemaPath = $schemaPath + $prop; - $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($propertyKey); - $it.errorPath = it.util.getPath(it.errorPath, $propertyKey, it.opts.jsonPointers); - $it.dataPathArr[$dataNxt] = it.util.toQuotedString($propertyKey); - var $code = it.validate($it); - $it.baseId = $currentBaseId; - if (it.util.varOccurences($code, $nextData) < 2) { - $code = it.util.varReplace($code, $nextData, $passData); - var $useData = $passData; - } else { - var $useData = $nextData; - out += ' var ' + ($nextData) + ' = ' + ($passData) + '; '; - } - if ($hasDefault) { - out += ' ' + ($code) + ' '; - } else { - if ($requiredHash && $requiredHash[$propertyKey]) { - out += ' if ( ' + ($useData) + ' === undefined '; - if ($ownProperties) { - out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; - } - out += ') { ' + ($nextValid) + ' = false; '; - var $currentErrorPath = it.errorPath, - $currErrSchemaPath = $errSchemaPath, - $missingProperty = it.util.escapeQuotes($propertyKey); - if (it.opts._errorDataPathProperty) { - it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers); - } - $errSchemaPath = it.errSchemaPath + '/required'; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \''; - if (it.opts._errorDataPathProperty) { - out += 'is a required property'; - } else { - out += 'should have required property \\\'' + ($missingProperty) + '\\\''; - } - out += '\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - $errSchemaPath = $currErrSchemaPath; - it.errorPath = $currentErrorPath; - out += ' } else { '; - } else { - if ($breakOnError) { - out += ' if ( ' + ($useData) + ' === undefined '; - if ($ownProperties) { - out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; - } - out += ') { ' + ($nextValid) + ' = true; } else { '; - } else { - out += ' if (' + ($useData) + ' !== undefined '; - if ($ownProperties) { - out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; - } - out += ' ) { '; - } - } - out += ' ' + ($code) + ' } '; - } - } - if ($breakOnError) { - out += ' if (' + ($nextValid) + ') { '; - $closingBraces += '}'; - } - } - } - } - if ($pPropertyKeys.length) { - var arr5 = $pPropertyKeys; - if (arr5) { - var $pProperty, i5 = -1, - l5 = arr5.length - 1; - while (i5 < l5) { - $pProperty = arr5[i5 += 1]; - var $sch = $pProperties[$pProperty]; - if (it.util.schemaHasRules($sch, it.RULES.all)) { - $it.schema = $sch; - $it.schemaPath = it.schemaPath + '.patternProperties' + it.util.getProperty($pProperty); - $it.errSchemaPath = it.errSchemaPath + '/patternProperties/' + it.util.escapeFragment($pProperty); - if ($ownProperties) { - out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; - } else { - out += ' for (var ' + ($key) + ' in ' + ($data) + ') { '; - } - out += ' if (' + (it.usePattern($pProperty)) + '.test(' + ($key) + ')) { '; - $it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); - var $passData = $data + '[' + $key + ']'; - $it.dataPathArr[$dataNxt] = $key; - var $code = it.validate($it); - $it.baseId = $currentBaseId; - if (it.util.varOccurences($code, $nextData) < 2) { - out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; - } else { - out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; - } - if ($breakOnError) { - out += ' if (!' + ($nextValid) + ') break; '; - } - out += ' } '; - if ($breakOnError) { - out += ' else ' + ($nextValid) + ' = true; '; - } - out += ' } '; - if ($breakOnError) { - out += ' if (' + ($nextValid) + ') { '; - $closingBraces += '}'; - } - } - } - } - } - if (it.opts.patternGroups && $pgPropertyKeys.length) { - var arr6 = $pgPropertyKeys; - if (arr6) { - var $pgProperty, i6 = -1, - l6 = arr6.length - 1; - while (i6 < l6) { - $pgProperty = arr6[i6 += 1]; - var $pgSchema = $pgProperties[$pgProperty], - $sch = $pgSchema.schema; - if (it.util.schemaHasRules($sch, it.RULES.all)) { - $it.schema = $sch; - $it.schemaPath = it.schemaPath + '.patternGroups' + it.util.getProperty($pgProperty) + '.schema'; - $it.errSchemaPath = it.errSchemaPath + '/patternGroups/' + it.util.escapeFragment($pgProperty) + '/schema'; - out += ' var pgPropCount' + ($lvl) + ' = 0; '; - if ($ownProperties) { - out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; - } else { - out += ' for (var ' + ($key) + ' in ' + ($data) + ') { '; - } - out += ' if (' + (it.usePattern($pgProperty)) + '.test(' + ($key) + ')) { pgPropCount' + ($lvl) + '++; '; - $it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); - var $passData = $data + '[' + $key + ']'; - $it.dataPathArr[$dataNxt] = $key; - var $code = it.validate($it); - $it.baseId = $currentBaseId; - if (it.util.varOccurences($code, $nextData) < 2) { - out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; - } else { - out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; - } - if ($breakOnError) { - out += ' if (!' + ($nextValid) + ') break; '; - } - out += ' } '; - if ($breakOnError) { - out += ' else ' + ($nextValid) + ' = true; '; - } - out += ' } '; - if ($breakOnError) { - out += ' if (' + ($nextValid) + ') { '; - $closingBraces += '}'; - } - var $pgMin = $pgSchema.minimum, - $pgMax = $pgSchema.maximum; - if ($pgMin !== undefined || $pgMax !== undefined) { - out += ' var ' + ($valid) + ' = true; '; - var $currErrSchemaPath = $errSchemaPath; - if ($pgMin !== undefined) { - var $limit = $pgMin, - $reason = 'minimum', - $moreOrLess = 'less'; - out += ' ' + ($valid) + ' = pgPropCount' + ($lvl) + ' >= ' + ($pgMin) + '; '; - $errSchemaPath = it.errSchemaPath + '/patternGroups/minimum'; - out += ' if (!' + ($valid) + ') { '; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('patternGroups') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { reason: \'' + ($reason) + '\', limit: ' + ($limit) + ', pattern: \'' + (it.util.escapeQuotes($pgProperty)) + '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should NOT have ' + ($moreOrLess) + ' than ' + ($limit) + ' properties matching pattern "' + (it.util.escapeQuotes($pgProperty)) + '"\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } '; - if ($pgMax !== undefined) { - out += ' else '; - } - } - if ($pgMax !== undefined) { - var $limit = $pgMax, - $reason = 'maximum', - $moreOrLess = 'more'; - out += ' ' + ($valid) + ' = pgPropCount' + ($lvl) + ' <= ' + ($pgMax) + '; '; - $errSchemaPath = it.errSchemaPath + '/patternGroups/maximum'; - out += ' if (!' + ($valid) + ') { '; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('patternGroups') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { reason: \'' + ($reason) + '\', limit: ' + ($limit) + ', pattern: \'' + (it.util.escapeQuotes($pgProperty)) + '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should NOT have ' + ($moreOrLess) + ' than ' + ($limit) + ' properties matching pattern "' + (it.util.escapeQuotes($pgProperty)) + '"\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } '; - } - $errSchemaPath = $currErrSchemaPath; - if ($breakOnError) { - out += ' if (' + ($valid) + ') { '; - $closingBraces += '}'; - } - } - } - } - } - } - if ($breakOnError) { - out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {'; - } - out = it.util.cleanUpCode(out); - return out; -} - - -/***/ }), -/* 495 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -module.exports = function generate_propertyNames(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $errs = 'errs__' + $lvl; - var $it = it.util.copy(it); - var $closingBraces = ''; - $it.level++; - var $nextValid = 'valid' + $it.level; - if (it.util.schemaHasRules($schema, it.RULES.all)) { - $it.schema = $schema; - $it.schemaPath = $schemaPath; - $it.errSchemaPath = $errSchemaPath; - var $key = 'key' + $lvl, - $idx = 'idx' + $lvl, - $i = 'i' + $lvl, - $invalidName = '\' + ' + $key + ' + \'', - $dataNxt = $it.dataLevel = it.dataLevel + 1, - $nextData = 'data' + $dataNxt, - $dataProperties = 'dataProperties' + $lvl, - $ownProperties = it.opts.ownProperties, - $currentBaseId = it.baseId; - out += ' var ' + ($errs) + ' = errors; '; - if ($ownProperties) { - out += ' var ' + ($dataProperties) + ' = undefined; '; - } - if ($ownProperties) { - out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; - } else { - out += ' for (var ' + ($key) + ' in ' + ($data) + ') { '; - } - out += ' var startErrs' + ($lvl) + ' = errors; '; - var $passData = $key; - var $wasComposite = it.compositeRule; - it.compositeRule = $it.compositeRule = true; - var $code = it.validate($it); - $it.baseId = $currentBaseId; - if (it.util.varOccurences($code, $nextData) < 2) { - out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; - } else { - out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; - } - it.compositeRule = $it.compositeRule = $wasComposite; - out += ' if (!' + ($nextValid) + ') { for (var ' + ($i) + '=startErrs' + ($lvl) + '; ' + ($i) + '= it.opts.loopRequired, - $ownProperties = it.opts.ownProperties; - if ($breakOnError) { - out += ' var missing' + ($lvl) + '; '; - if ($loopRequired) { - if (!$isData) { - out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + '; '; - } - var $i = 'i' + $lvl, - $propertyPath = 'schema' + $lvl + '[' + $i + ']', - $missingProperty = '\' + ' + $propertyPath + ' + \''; - if (it.opts._errorDataPathProperty) { - it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers); - } - out += ' var ' + ($valid) + ' = true; '; - if ($isData) { - out += ' if (schema' + ($lvl) + ' === undefined) ' + ($valid) + ' = true; else if (!Array.isArray(schema' + ($lvl) + ')) ' + ($valid) + ' = false; else {'; - } - out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { ' + ($valid) + ' = ' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] !== undefined '; - if ($ownProperties) { - out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + ']) '; - } - out += '; if (!' + ($valid) + ') break; } '; - if ($isData) { - out += ' } '; - } - out += ' if (!' + ($valid) + ') { '; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \''; - if (it.opts._errorDataPathProperty) { - out += 'is a required property'; - } else { - out += 'should have required property \\\'' + ($missingProperty) + '\\\''; - } - out += '\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } else { '; - } else { - out += ' if ( '; - var arr2 = $required; - if (arr2) { - var $propertyKey, $i = -1, - l2 = arr2.length - 1; - while ($i < l2) { - $propertyKey = arr2[$i += 1]; - if ($i) { - out += ' || '; - } - var $prop = it.util.getProperty($propertyKey), - $useData = $data + $prop; - out += ' ( ( ' + ($useData) + ' === undefined '; - if ($ownProperties) { - out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; - } - out += ') && (missing' + ($lvl) + ' = ' + (it.util.toQuotedString(it.opts.jsonPointers ? $propertyKey : $prop)) + ') ) '; - } - } - out += ') { '; - var $propertyPath = 'missing' + $lvl, - $missingProperty = '\' + ' + $propertyPath + ' + \''; - if (it.opts._errorDataPathProperty) { - it.errorPath = it.opts.jsonPointers ? it.util.getPathExpr($currentErrorPath, $propertyPath, true) : $currentErrorPath + ' + ' + $propertyPath; - } - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \''; - if (it.opts._errorDataPathProperty) { - out += 'is a required property'; - } else { - out += 'should have required property \\\'' + ($missingProperty) + '\\\''; - } - out += '\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } else { '; - } - } else { - if ($loopRequired) { - if (!$isData) { - out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + '; '; - } - var $i = 'i' + $lvl, - $propertyPath = 'schema' + $lvl + '[' + $i + ']', - $missingProperty = '\' + ' + $propertyPath + ' + \''; - if (it.opts._errorDataPathProperty) { - it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers); - } - if ($isData) { - out += ' if (' + ($vSchema) + ' && !Array.isArray(' + ($vSchema) + ')) { var err = '; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \''; - if (it.opts._errorDataPathProperty) { - out += 'is a required property'; - } else { - out += 'should have required property \\\'' + ($missingProperty) + '\\\''; - } - out += '\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else if (' + ($vSchema) + ' !== undefined) { '; - } - out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { if (' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] === undefined '; - if ($ownProperties) { - out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + ']) '; - } - out += ') { var err = '; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \''; - if (it.opts._errorDataPathProperty) { - out += 'is a required property'; - } else { - out += 'should have required property \\\'' + ($missingProperty) + '\\\''; - } - out += '\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } '; - if ($isData) { - out += ' } '; - } - } else { - var arr3 = $required; - if (arr3) { - var $propertyKey, i3 = -1, - l3 = arr3.length - 1; - while (i3 < l3) { - $propertyKey = arr3[i3 += 1]; - var $prop = it.util.getProperty($propertyKey), - $missingProperty = it.util.escapeQuotes($propertyKey), - $useData = $data + $prop; - if (it.opts._errorDataPathProperty) { - it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers); - } - out += ' if ( ' + ($useData) + ' === undefined '; - if ($ownProperties) { - out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; - } - out += ') { var err = '; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \''; - if (it.opts._errorDataPathProperty) { - out += 'is a required property'; - } else { - out += 'should have required property \\\'' + ($missingProperty) + '\\\''; - } - out += '\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } '; - } - } - } - } - it.errorPath = $currentErrorPath; - } else if ($breakOnError) { - out += ' if (true) {'; - } - return out; -} - - -/***/ }), -/* 498 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -module.exports = function generate_uniqueItems(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $valid = 'valid' + $lvl; - var $isData = it.opts.$data && $schema && $schema.$data, - $schemaValue; - if ($isData) { - out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; - $schemaValue = 'schema' + $lvl; - } else { - $schemaValue = $schema; - } - if (($schema || $isData) && it.opts.uniqueItems !== false) { - if ($isData) { - out += ' var ' + ($valid) + '; if (' + ($schemaValue) + ' === false || ' + ($schemaValue) + ' === undefined) ' + ($valid) + ' = true; else if (typeof ' + ($schemaValue) + ' != \'boolean\') ' + ($valid) + ' = false; else { '; - } - out += ' var ' + ($valid) + ' = true; if (' + ($data) + '.length > 1) { var i = ' + ($data) + '.length, j; outer: for (;i--;) { for (j = i; j--;) { if (equal(' + ($data) + '[i], ' + ($data) + '[j])) { ' + ($valid) + ' = false; break outer; } } } } '; - if ($isData) { - out += ' } '; - } - out += ' if (!' + ($valid) + ') { '; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('uniqueItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { i: i, j: j } '; - if (it.opts.messages !== false) { - out += ' , message: \'should NOT have duplicate items (items ## \' + j + \' and \' + i + \' are identical)\' '; - } - if (it.opts.verbose) { - out += ' , schema: '; - if ($isData) { - out += 'validate.schema' + ($schemaPath); - } else { - out += '' + ($schema); - } - out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } '; - if ($breakOnError) { - out += ' else { '; - } - } else { - if ($breakOnError) { - out += ' if (true) { '; - } - } - return out; -} - - -/***/ }), -/* 499 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var IDENTIFIER = /^[a-z_$][a-z0-9_$-]*$/i; -var customRuleCode = __webpack_require__(485); - -module.exports = { - add: addKeyword, - get: getKeyword, - remove: removeKeyword -}; - -/** - * Define custom keyword - * @this Ajv - * @param {String} keyword custom keyword, should be unique (including different from all standard, custom and macro keywords). - * @param {Object} definition keyword definition object with properties `type` (type(s) which the keyword applies to), `validate` or `compile`. - * @return {Ajv} this for method chaining - */ -function addKeyword(keyword, definition) { - /* jshint validthis: true */ - /* eslint no-shadow: 0 */ - var RULES = this.RULES; - - if (RULES.keywords[keyword]) - throw new Error('Keyword ' + keyword + ' is already defined'); - - if (!IDENTIFIER.test(keyword)) - throw new Error('Keyword ' + keyword + ' is not a valid identifier'); - - if (definition) { - if (definition.macro && definition.valid !== undefined) - throw new Error('"valid" option cannot be used with macro keywords'); - - var dataType = definition.type; - if (Array.isArray(dataType)) { - var i, len = dataType.length; - for (i=0; i OSC + '50;CurrentDir=' + (cwd || process.cwd()) + BEL; /***/ }), -/* 505 */ +/* 473 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -93566,12 +89536,12 @@ module.exports = function () { /***/ }), -/* 506 */ +/* 474 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(module) { -const colorConvert = __webpack_require__(608); +const colorConvert = __webpack_require__(576); const wrapAnsi16 = (fn, offset) => function () { const code = fn.apply(colorConvert, arguments); @@ -93739,7 +89709,7 @@ Object.defineProperty(module, 'exports', { /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(163)(module))) /***/ }), -/* 507 */ +/* 475 */ /***/ (function(module, exports) { function webpackEmptyContext(req) { @@ -93748,10 +89718,10 @@ function webpackEmptyContext(req) { webpackEmptyContext.keys = function() { return []; }; webpackEmptyContext.resolve = webpackEmptyContext; module.exports = webpackEmptyContext; -webpackEmptyContext.id = 507; +webpackEmptyContext.id = 475; /***/ }), -/* 508 */ +/* 476 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -93836,12 +89806,12 @@ module.exports = function(root, loadImplementation){ /***/ }), -/* 509 */ +/* 477 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -module.exports = __webpack_require__(508)(global, loadImplementation); +module.exports = __webpack_require__(476)(global, loadImplementation); /** * Node.js version of loadImplementation. @@ -93937,7 +89907,7 @@ function tryAutoDetect(){ /***/ }), -/* 510 */ +/* 478 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -93966,7 +89936,7 @@ function flat(arr, res) { /***/ }), -/* 511 */ +/* 479 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -93998,13 +89968,13 @@ module.exports = function (arr, predicate, ctx) { /***/ }), -/* 512 */ +/* 480 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var rawAsap = __webpack_require__(513); +var rawAsap = __webpack_require__(481); var freeTasks = []; /** @@ -94070,7 +90040,7 @@ RawTask.prototype.call = function () { /***/ }), -/* 513 */ +/* 481 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -94178,16 +90148,16 @@ function requestFlush() { /***/ }), -/* 514 */ +/* 482 */ /***/ (function(module, exports, __webpack_require__) { // Copyright 2011 Mark Cavage All rights reserved. -var errors = __webpack_require__(205); -var types = __webpack_require__(206); +var errors = __webpack_require__(203); +var types = __webpack_require__(204); -var Reader = __webpack_require__(515); -var Writer = __webpack_require__(516); +var Reader = __webpack_require__(483); +var Writer = __webpack_require__(484); // --- Exports @@ -94211,7 +90181,7 @@ for (var e in errors) { /***/ }), -/* 515 */ +/* 483 */ /***/ (function(module, exports, __webpack_require__) { // Copyright 2011 Mark Cavage All rights reserved. @@ -94219,8 +90189,8 @@ for (var e in errors) { var assert = __webpack_require__(28); var Buffer = __webpack_require__(15).Buffer; -var ASN1 = __webpack_require__(206); -var errors = __webpack_require__(205); +var ASN1 = __webpack_require__(204); +var errors = __webpack_require__(203); // --- Globals @@ -94479,15 +90449,15 @@ module.exports = Reader; /***/ }), -/* 516 */ +/* 484 */ /***/ (function(module, exports, __webpack_require__) { // Copyright 2011 Mark Cavage All rights reserved. var assert = __webpack_require__(28); var Buffer = __webpack_require__(15).Buffer; -var ASN1 = __webpack_require__(206); -var errors = __webpack_require__(205); +var ASN1 = __webpack_require__(204); +var errors = __webpack_require__(203); // --- Globals @@ -94802,19 +90772,19 @@ module.exports = Writer; /***/ }), -/* 517 */ +/* 485 */ /***/ (function(module, exports, __webpack_require__) { module.exports = { - parallel : __webpack_require__(519), - serial : __webpack_require__(520), - serialOrdered : __webpack_require__(351) + parallel : __webpack_require__(487), + serial : __webpack_require__(488), + serialOrdered : __webpack_require__(345) }; /***/ }), -/* 518 */ +/* 486 */ /***/ (function(module, exports) { module.exports = defer; @@ -94846,12 +90816,12 @@ function defer(fn) /***/ }), -/* 519 */ +/* 487 */ /***/ (function(module, exports, __webpack_require__) { -var iterate = __webpack_require__(348) - , initState = __webpack_require__(349) - , terminator = __webpack_require__(350) +var iterate = __webpack_require__(342) + , initState = __webpack_require__(343) + , terminator = __webpack_require__(344) ; // Public API @@ -94895,10 +90865,10 @@ function parallel(list, iterator, callback) /***/ }), -/* 520 */ +/* 488 */ /***/ (function(module, exports, __webpack_require__) { -var serialOrdered = __webpack_require__(351); +var serialOrdered = __webpack_require__(345); // Public API module.exports = serial; @@ -94918,7 +90888,7 @@ function serial(list, iterator, callback) /***/ }), -/* 521 */ +/* 489 */ /***/ (function(module, exports, __webpack_require__) { @@ -95136,14 +91106,14 @@ module.exports.canonicalizeResource = canonicalizeResource /***/ }), -/* 522 */ +/* 490 */ /***/ (function(module, exports, __webpack_require__) { var aws4 = exports, url = __webpack_require__(24), - querystring = __webpack_require__(196), + querystring = __webpack_require__(197), crypto = __webpack_require__(11), - lru = __webpack_require__(523), + lru = __webpack_require__(491), credentialsCache = lru(1000) // http://docs.amazonwebservices.com/general/latest/gr/signature-version-4.html @@ -95474,7 +91444,7 @@ aws4.sign = function(request, credentials) { /***/ }), -/* 523 */ +/* 491 */ /***/ (function(module, exports) { module.exports = function(size) { @@ -95576,7 +91546,7 @@ function DoublyLinkedNode(key, val) { /***/ }), -/* 524 */ +/* 492 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -95604,7 +91574,7 @@ function _load_errors() { } /***/ }), -/* 525 */ +/* 493 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -95648,7 +91618,7 @@ exports.hasWrapper = hasWrapper; exports.examples = examples; /***/ }), -/* 526 */ +/* 494 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -95695,7 +91665,7 @@ exports.setFlags = setFlags; var _run; function _load_run() { - return _run = __webpack_require__(360); + return _run = __webpack_require__(354); } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -95711,7 +91681,7 @@ function setFlags(commander) { } /***/ }), -/* 527 */ +/* 495 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -95831,7 +91801,7 @@ exports.run = run; exports.examples = examples; /***/ }), -/* 528 */ +/* 496 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -95851,7 +91821,7 @@ function _load_asyncToGenerator() { var _extends2; function _load_extends() { - return _extends2 = _interopRequireDefault(__webpack_require__(21)); + return _extends2 = _interopRequireDefault(__webpack_require__(20)); } let run = exports.run = (() => { @@ -95903,7 +91873,7 @@ function _load_errors() { var _child; function _load_child() { - return _child = _interopRequireWildcard(__webpack_require__(58)); + return _child = _interopRequireWildcard(__webpack_require__(50)); } var _executeLifecycleScript; @@ -95915,7 +91885,7 @@ function _load_executeLifecycleScript() { var _fs; function _load_fs() { - return _fs = _interopRequireWildcard(__webpack_require__(4)); + return _fs = _interopRequireWildcard(__webpack_require__(5)); } var _global; @@ -95971,7 +91941,7 @@ function coerceCreatePackageName(str) { } /***/ }), -/* 529 */ +/* 497 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -96019,7 +91989,7 @@ function _load_errors() { var _child; function _load_child() { - return _child = _interopRequireWildcard(__webpack_require__(58)); + return _child = _interopRequireWildcard(__webpack_require__(50)); } var _executeLifecycleScript; @@ -96039,7 +92009,7 @@ function hasWrapper(commander, args) { } /***/ }), -/* 530 */ +/* 498 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -96121,7 +92091,7 @@ function setFlags(commander) { const examples = exports.examples = ['generate-lock-entry', 'generate-lock-entry --use-manifest ./package.json', 'generate-lock-entry --resolved local-file.tgz#hash']; /***/ }), -/* 531 */ +/* 499 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -96155,7 +92125,7 @@ function _load_misc() { var _aliases; function _load_aliases() { - return _aliases = _interopRequireDefault(__webpack_require__(352)); + return _aliases = _interopRequireDefault(__webpack_require__(346)); } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } @@ -96230,7 +92200,7 @@ function run(config, reporter, commander, args) { } /***/ }), -/* 532 */ +/* 500 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -96270,7 +92240,7 @@ function _load_install() { var _check; function _load_check() { - return _check = __webpack_require__(356); + return _check = __webpack_require__(350); } var _errors; @@ -96306,13 +92276,13 @@ function _load_hostedGitResolver2() { var _gistResolver; function _load_gistResolver() { - return _gistResolver = _interopRequireDefault(__webpack_require__(216)); + return _gistResolver = _interopRequireDefault(__webpack_require__(214)); } var _gistResolver2; function _load_gistResolver2() { - return _gistResolver2 = __webpack_require__(216); + return _gistResolver2 = __webpack_require__(214); } var _gitResolver; @@ -96324,13 +92294,13 @@ function _load_gitResolver() { var _fileResolver; function _load_fileResolver() { - return _fileResolver = _interopRequireDefault(__webpack_require__(215)); + return _fileResolver = _interopRequireDefault(__webpack_require__(213)); } var _packageResolver; function _load_packageResolver() { - return _packageResolver = _interopRequireDefault(__webpack_require__(366)); + return _packageResolver = _interopRequireDefault(__webpack_require__(360)); } var _packageRequest; @@ -96342,25 +92312,25 @@ function _load_packageRequest() { var _packageReference; function _load_packageReference() { - return _packageReference = _interopRequireDefault(__webpack_require__(365)); + return _packageReference = _interopRequireDefault(__webpack_require__(359)); } var _packageFetcher; function _load_packageFetcher() { - return _packageFetcher = _interopRequireWildcard(__webpack_require__(210)); + return _packageFetcher = _interopRequireWildcard(__webpack_require__(208)); } var _packageLinker; function _load_packageLinker() { - return _packageLinker = _interopRequireDefault(__webpack_require__(211)); + return _packageLinker = _interopRequireDefault(__webpack_require__(209)); } var _packageCompatibility; function _load_packageCompatibility() { - return _packageCompatibility = _interopRequireWildcard(__webpack_require__(209)); + return _packageCompatibility = _interopRequireWildcard(__webpack_require__(207)); } var _lockfile; @@ -96378,13 +92348,13 @@ function _load_normalizePattern() { var _logicalDependencyTree; function _load_logicalDependencyTree() { - return _logicalDependencyTree = __webpack_require__(582); + return _logicalDependencyTree = __webpack_require__(550); } var _fs; function _load_fs() { - return _fs = _interopRequireWildcard(__webpack_require__(4)); + return _fs = _interopRequireWildcard(__webpack_require__(5)); } var _misc; @@ -96411,7 +92381,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de const invariant = __webpack_require__(9); const path = __webpack_require__(0); -const uuid = __webpack_require__(119); +const uuid = __webpack_require__(120); const ssri = __webpack_require__(65); const nodeVersion = process.versions.node.split('-')[0]; @@ -96852,7 +92822,7 @@ function hasWrapper(commander, args) { } /***/ }), -/* 533 */ +/* 501 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -96942,7 +92912,7 @@ function _load_npmRegistry() { var _parsePackageName2; function _load_parsePackageName() { - return _parsePackageName2 = _interopRequireDefault(__webpack_require__(588)); + return _parsePackageName2 = _interopRequireDefault(__webpack_require__(556)); } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -96988,7 +92958,7 @@ function hasWrapper(commander, args) { } /***/ }), -/* 534 */ +/* 502 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -97008,20 +92978,28 @@ function _load_asyncToGenerator() { let run = exports.run = (() => { var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) { const installVersion = flags[`2`] ? `berry` : flags.install; + const forwardedArgs = process.argv.slice(process.argv.indexOf('init', 2) + 1); if (installVersion) { - const lockfilePath = path.resolve(config.cwd, 'yarn.lock'); - if (!(yield (_fs || _load_fs()).exists(lockfilePath))) { - yield (_fs || _load_fs()).writeFile(lockfilePath, ''); + if (flags[`2`] && process.env.COREPACK_ROOT) { + yield (_child || _load_child()).spawn((_constants || _load_constants()).NODE_BIN_PATH, [path.join(process.env.COREPACK_ROOT, 'dist/corepack.js'), `yarn@${flags.install || `stable`}`, `init`, ...forwardedArgs, `--install=self`], { + stdio: 'inherit', + cwd: config.cwd + }); + } else { + const lockfilePath = path.resolve(config.cwd, 'yarn.lock'); + if (!(yield (_fs || _load_fs()).exists(lockfilePath))) { + yield (_fs || _load_fs()).writeFile(lockfilePath, ''); + } + yield (_child || _load_child()).spawn((_constants || _load_constants()).NODE_BIN_PATH, [process.argv[1], 'policies', 'set-version', installVersion, '--silent'], { + stdio: 'inherit', + cwd: config.cwd + }); + yield (_child || _load_child()).spawn((_constants || _load_constants()).NODE_BIN_PATH, [process.argv[1], 'init', ...forwardedArgs], { + stdio: 'inherit', + cwd: config.cwd + }); } - yield (_child || _load_child()).spawn((_constants || _load_constants()).NODE_BIN_PATH, [process.argv[1], 'policies', 'set-version', installVersion], { - stdio: 'inherit', - cwd: config.cwd - }); - yield (_child || _load_child()).spawn((_constants || _load_constants()).NODE_BIN_PATH, [process.argv[1], 'init', ...(flags.yes ? ['-y'] : []), ...(flags.private ? ['-p'] : [])], { - stdio: 'inherit', - cwd: config.cwd - }); return; } @@ -97256,31 +93234,31 @@ exports.hasWrapper = hasWrapper; var _util; function _load_util() { - return _util = __webpack_require__(221); + return _util = __webpack_require__(219); } var _index; function _load_index() { - return _index = __webpack_require__(57); + return _index = __webpack_require__(58); } var _githubResolver; function _load_githubResolver() { - return _githubResolver = _interopRequireDefault(__webpack_require__(367)); + return _githubResolver = _interopRequireDefault(__webpack_require__(361)); } var _child; function _load_child() { - return _child = _interopRequireWildcard(__webpack_require__(58)); + return _child = _interopRequireWildcard(__webpack_require__(50)); } var _fs; function _load_fs() { - return _fs = _interopRequireWildcard(__webpack_require__(4)); + return _fs = _interopRequireWildcard(__webpack_require__(5)); } var _validate; @@ -97319,7 +93297,7 @@ function hasWrapper(commander, args) { const shouldRunInCurrentCwd = exports.shouldRunInCurrentCwd = true; /***/ }), -/* 535 */ +/* 503 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -97333,7 +93311,7 @@ exports.examples = exports.run = undefined; var _extends2; function _load_extends() { - return _extends2 = _interopRequireDefault(__webpack_require__(21)); + return _extends2 = _interopRequireDefault(__webpack_require__(20)); } var _asyncToGenerator2; @@ -97656,7 +93634,7 @@ exports.run = run; exports.examples = examples; /***/ }), -/* 536 */ +/* 504 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -97702,7 +93680,7 @@ function hasWrapper(commander, args) { } /***/ }), -/* 537 */ +/* 505 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -97716,7 +93694,7 @@ exports.run = undefined; var _extends2; function _load_extends() { - return _extends2 = _interopRequireDefault(__webpack_require__(21)); + return _extends2 = _interopRequireDefault(__webpack_require__(20)); } var _asyncToGenerator2; @@ -97756,13 +93734,13 @@ exports.hasWrapper = hasWrapper; var _child; function _load_child() { - return _child = _interopRequireWildcard(__webpack_require__(58)); + return _child = _interopRequireWildcard(__webpack_require__(50)); } var _fs; function _load_fs() { - return _fs = _interopRequireWildcard(__webpack_require__(4)); + return _fs = _interopRequireWildcard(__webpack_require__(5)); } var _constants; @@ -97786,7 +93764,7 @@ function hasWrapper(commander, args) { } /***/ }), -/* 538 */ +/* 506 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -97800,7 +93778,7 @@ exports.run = exports.requireLockfile = undefined; var _extends2; function _load_extends() { - return _extends2 = _interopRequireDefault(__webpack_require__(21)); + return _extends2 = _interopRequireDefault(__webpack_require__(20)); } var _asyncToGenerator2; @@ -97885,13 +93863,13 @@ function _load_install() { var _colorForVersions; function _load_colorForVersions() { - return _colorForVersions = _interopRequireDefault(__webpack_require__(369)); + return _colorForVersions = _interopRequireDefault(__webpack_require__(363)); } var _colorizeDiff; function _load_colorizeDiff() { - return _colorizeDiff = _interopRequireDefault(__webpack_require__(370)); + return _colorizeDiff = _interopRequireDefault(__webpack_require__(364)); } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -97908,7 +93886,7 @@ function hasWrapper(commander, args) { } /***/ }), -/* 539 */ +/* 507 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -98062,7 +94040,7 @@ function _load_validate() { var _tag; function _load_tag() { - return _tag = __webpack_require__(361); + return _tag = __webpack_require__(355); } var _login; @@ -98165,7 +94143,7 @@ exports.hasWrapper = hasWrapper; exports.examples = examples; /***/ }), -/* 540 */ +/* 508 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -98176,6 +94154,12 @@ Object.defineProperty(exports, "__esModule", { }); exports.examples = exports.setFlags = exports.run = undefined; +var _extends2; + +function _load_extends() { + return _extends2 = _interopRequireDefault(__webpack_require__(20)); +} + var _asyncToGenerator2; function _load_asyncToGenerator() { @@ -98186,6 +94170,7 @@ let fetchReleases = (() => { var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, { includePrereleases = false } = {}) { const token = process.env.GITHUB_TOKEN; const tokenUrlParameter = token ? `?access_token=${token}` : ''; + const request = yield config.requestManager.request({ url: `https://api.github.com/repos/yarnpkg/yarn/releases${tokenUrlParameter}`, json: true @@ -98229,6 +94214,18 @@ let fetchReleases = (() => { exports.hasWrapper = hasWrapper; +var _yarnVersion; + +function _load_yarnVersion() { + return _yarnVersion = __webpack_require__(105); +} + +var _child; + +function _load_child() { + return _child = _interopRequireWildcard(__webpack_require__(50)); +} + var _buildSubCommands2; function _load_buildSubCommands() { @@ -98244,7 +94241,7 @@ function _load_rc() { var _fs; function _load_fs() { - return _fs = _interopRequireWildcard(__webpack_require__(4)); + return _fs = _interopRequireWildcard(__webpack_require__(5)); } var _lockfile; @@ -98253,10 +94250,29 @@ function _load_lockfile() { return _lockfile = __webpack_require__(19); } +var _semver; + +function _load_semver() { + return _semver = __webpack_require__(170); +} + +var _constants; + +function _load_constants() { + return _constants = __webpack_require__(8); +} + function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +/* eslint-disable max-len */ + +const V2_NAMES = ['berry', 'stable', 'canary', 'v2', '2']; + +const isLocalFile = version => version.match(/^\.{0,2}[\\/]/) || path.isAbsolute(version); +const isV2Version = version => (0, (_semver || _load_semver()).satisfiesWithPrereleases)(version, '>=2.0.0'); + const chalk = __webpack_require__(30); const invariant = __webpack_require__(9); const path = __webpack_require__(0); @@ -98282,32 +94298,73 @@ function hasWrapper(flags, args) { var _buildSubCommands = (0, (_buildSubCommands2 || _load_buildSubCommands()).default)('policies', { setVersion(config, reporter, flags, args) { return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { - let range = args[0] || 'latest'; + const initialRange = args[0] || 'latest'; + let range = initialRange; + let allowRc = flags.rc; - reporter.log(`Resolving ${chalk.yellow(range)} to a url...`); - if (range === 'rc') { - range = 'latest'; + reporter.log(`${chalk.yellow(`Warning:`)} Your current Yarn binary is currently Yarn ${(_yarnVersion || _load_yarnVersion()).version}; to avoid potential breaking changes, 'set version rc' won't receive upgrades past the 1.22.x branch.\n To upgrade to the latest versions, run ${chalk.cyan(`yarn set version`)} ${chalk.yellow.underline(`canary`)} instead. Sorry for the inconvenience.\n`); + + range = '*'; allowRc = true; } if (range === 'latest') { + reporter.log(`${chalk.yellow(`Warning:`)} Your current Yarn binary is currently Yarn ${(_yarnVersion || _load_yarnVersion()).version}; to avoid potential breaking changes, 'set version latest' won't receive upgrades past the 1.22.x branch.\n To upgrade to the latest versions, run ${chalk.cyan(`yarn set version`)} ${chalk.yellow.underline(`stable`)} instead. Sorry for the inconvenience.\n`); + + range = '*'; + } + + if (range === 'classic') { range = '*'; } let bundleUrl; let bundleVersion; - let isV2 = false; + const isV2 = false; if (range === 'nightly' || range === 'nightlies') { + reporter.log(`${chalk.yellow(`Warning:`)} Nightlies only exist for Yarn 1.x; starting from 2.x onwards, you should use 'canary' instead`); + bundleUrl = 'https://nightly.yarnpkg.com/latest.js'; bundleVersion = 'nightly'; - } else if (range === 'berry' || range === 'v2' || range === '2') { - bundleUrl = 'https://github.com/yarnpkg/berry/raw/master/packages/berry-cli/bin/berry.js'; - bundleVersion = 'berry'; - isV2 = true; + } else if (V2_NAMES.includes(range) || isLocalFile(range) || isV2Version(range)) { + const normalizedRange = range === `canary` ? `canary` : `stable`; + + if (process.env.COREPACK_ROOT) { + yield (_child || _load_child()).spawn((_constants || _load_constants()).NODE_BIN_PATH, [path.join(process.env.COREPACK_ROOT, 'dist/corepack.js'), `yarn@${normalizedRange}`, `set`, `version`, normalizedRange], { + stdio: 'inherit', + cwd: config.cwd + }); + + return; + } else { + const bundle = yield fetchBundle(config, 'https://github.com/yarnpkg/berry/raw/master/packages/yarnpkg-cli/bin/yarn.js'); + + const yarnPath = path.resolve(config.lockfileFolder, `.yarn/releases/yarn-stable-temp.cjs`); + yield (_fs || _load_fs()).mkdirp(path.dirname(yarnPath)); + yield (_fs || _load_fs()).writeFile(yarnPath, bundle); + yield (_fs || _load_fs()).chmod(yarnPath, 0o755); + + try { + yield (_child || _load_child()).spawn((_constants || _load_constants()).NODE_BIN_PATH, [yarnPath, 'set', 'version', range], { + stdio: 'inherit', + cwd: config.lockfileFolder, + env: (0, (_extends2 || _load_extends()).default)({}, process.env, { + YARN_IGNORE_PATH: `1` + }) + }); + } catch (err) { + // eslint-disable-next-line no-process-exit + process.exit(1); + } + + return; + } } else { + reporter.log(`Resolving ${chalk.yellow(initialRange)} to a url...`); + let releases = []; try { @@ -98375,7 +94432,7 @@ exports.setFlags = setFlags; exports.examples = examples; /***/ }), -/* 541 */ +/* 509 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -98570,13 +94627,13 @@ function _load_errors() { var _version; function _load_version() { - return _version = __webpack_require__(363); + return _version = __webpack_require__(357); } var _fs; function _load_fs() { - return _fs = _interopRequireWildcard(__webpack_require__(4)); + return _fs = _interopRequireWildcard(__webpack_require__(5)); } var _pack; @@ -98605,7 +94662,7 @@ const invariant = __webpack_require__(9); const crypto = __webpack_require__(11); const url = __webpack_require__(24); -const fs2 = __webpack_require__(5); +const fs2 = __webpack_require__(4); const ssri = __webpack_require__(65); function setFlags(commander) { @@ -98621,7 +94678,7 @@ function hasWrapper(commander, args) { } /***/ }), -/* 542 */ +/* 510 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -98635,7 +94692,7 @@ exports.examples = exports.hasWrapper = exports.run = undefined; var _extends2; function _load_extends() { - return _extends2 = _interopRequireDefault(__webpack_require__(21)); + return _extends2 = _interopRequireDefault(__webpack_require__(20)); } var _asyncToGenerator2; @@ -98862,7 +94919,7 @@ exports.hasWrapper = hasWrapper; exports.examples = examples; /***/ }), -/* 543 */ +/* 511 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -98957,13 +95014,13 @@ function _load_errors() { var _fs; function _load_fs() { - return _fs = _interopRequireWildcard(__webpack_require__(4)); + return _fs = _interopRequireWildcard(__webpack_require__(5)); } var _link; function _load_link() { - return _link = __webpack_require__(357); + return _link = __webpack_require__(351); } var _global; @@ -98987,7 +95044,7 @@ function hasWrapper(commander, args) { } /***/ }), -/* 544 */ +/* 512 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -99147,7 +95204,7 @@ function _load_errors() { var _fs; function _load_fs() { - return _fs = _interopRequireWildcard(__webpack_require__(4)); + return _fs = _interopRequireWildcard(__webpack_require__(5)); } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } @@ -99168,7 +95225,7 @@ function setFlags(commander) { } /***/ }), -/* 545 */ +/* 513 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -99210,7 +95267,7 @@ exports.hasWrapper = hasWrapper; var _yarnVersion; function _load_yarnVersion() { - return _yarnVersion = __webpack_require__(120); + return _yarnVersion = __webpack_require__(105); } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -99224,7 +95281,7 @@ function hasWrapper(commander, args) { } /***/ }), -/* 546 */ +/* 514 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -99514,7 +95571,7 @@ function _load_constants() { var _fs; function _load_fs() { - return _fs = _interopRequireWildcard(__webpack_require__(4)); + return _fs = _interopRequireWildcard(__webpack_require__(5)); } var _lockfile; @@ -99536,7 +95593,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de const requireLockfile = exports.requireLockfile = true; const invariant = __webpack_require__(9); -const bytes = __webpack_require__(596); +const bytes = __webpack_require__(564); const emoji = __webpack_require__(302); const path = __webpack_require__(0); @@ -99657,7 +95714,7 @@ function queryWhy(pattern, hoisted) { } /***/ }), -/* 547 */ +/* 515 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -99734,7 +95791,7 @@ function _load_errors() { var _child; function _load_child() { - return _child = _interopRequireWildcard(__webpack_require__(58)); + return _child = _interopRequireWildcard(__webpack_require__(50)); } var _constants; @@ -99756,7 +95813,7 @@ function hasWrapper(commander, args) { } /***/ }), -/* 548 */ +/* 516 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -99936,7 +95993,7 @@ function _load_constants() { var _child; function _load_child() { - return _child = _interopRequireWildcard(__webpack_require__(58)); + return _child = _interopRequireWildcard(__webpack_require__(50)); } var _constants2; @@ -99979,7 +96036,7 @@ exports.setFlags = setFlags; exports.examples = examples; /***/ }), -/* 549 */ +/* 517 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -99993,7 +96050,7 @@ exports.autoRun = exports.main = undefined; var _extends2; function _load_extends() { - return _extends2 = _interopRequireDefault(__webpack_require__(21)); + return _extends2 = _interopRequireDefault(__webpack_require__(20)); } var _asyncToGenerator2; @@ -100604,6 +96661,8 @@ let start = (() => { // innermost process, whose end will cause our own to exit. }); + (0, (_signalHandler || _load_signalHandler()).default)(); + try { if (/\.[cm]?js$/.test(yarnPath)) { exitCode = yield (0, (_child || _load_child()).spawnp)(process.execPath, [yarnPath, ...argv], opts); @@ -100668,7 +96727,7 @@ function _load_commander() { var _fs; function _load_fs() { - return _fs = _interopRequireDefault(__webpack_require__(5)); + return _fs = _interopRequireDefault(__webpack_require__(4)); } var _invariant; @@ -100704,13 +96763,13 @@ function _load_semver() { var _index; function _load_index() { - return _index = __webpack_require__(200); + return _index = __webpack_require__(201); } var _index2; function _load_index2() { - return _index2 = __webpack_require__(57); + return _index2 = __webpack_require__(58); } var _index3; @@ -100752,13 +96811,13 @@ function _load_rc() { var _child; function _load_child() { - return _child = __webpack_require__(58); + return _child = __webpack_require__(50); } var _yarnVersion; function _load_yarnVersion() { - return _yarnVersion = __webpack_require__(120); + return _yarnVersion = __webpack_require__(105); } var _signalHandler; @@ -100820,7 +96879,7 @@ exports.default = start; /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(163)(module))) /***/ }), -/* 550 */ +/* 518 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -100845,7 +96904,7 @@ function _load_baseFetcher() { var _fs; function _load_fs() { - return _fs = _interopRequireWildcard(__webpack_require__(4)); + return _fs = _interopRequireWildcard(__webpack_require__(5)); } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } @@ -100868,7 +96927,7 @@ class CopyFetcher extends (_baseFetcher || _load_baseFetcher()).default { exports.default = CopyFetcher; /***/ }), -/* 551 */ +/* 519 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -100899,13 +96958,13 @@ function _load_baseFetcher() { var _git; function _load_git() { - return _git = _interopRequireDefault(__webpack_require__(219)); + return _git = _interopRequireDefault(__webpack_require__(217)); } var _fs; function _load_fs() { - return _fs = _interopRequireWildcard(__webpack_require__(4)); + return _fs = _interopRequireWildcard(__webpack_require__(5)); } var _constants; @@ -100948,10 +97007,10 @@ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -const tarFs = __webpack_require__(193); +const tarFs = __webpack_require__(194); const url = __webpack_require__(24); const path = __webpack_require__(0); -const fs = __webpack_require__(5); +const fs = __webpack_require__(4); const invariant = __webpack_require__(9); @@ -101216,7 +97275,7 @@ class GitFetcher extends (_baseFetcher || _load_baseFetcher()).default { exports.default = GitFetcher; /***/ }), -/* 552 */ +/* 520 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -101236,25 +97295,25 @@ function _load_baseFetcher() { var _copyFetcher; function _load_copyFetcher() { - return _copyFetcher = _interopRequireDefault(__webpack_require__(550)); + return _copyFetcher = _interopRequireDefault(__webpack_require__(518)); } var _gitFetcher; function _load_gitFetcher() { - return _gitFetcher = _interopRequireDefault(__webpack_require__(551)); + return _gitFetcher = _interopRequireDefault(__webpack_require__(519)); } var _tarballFetcher; function _load_tarballFetcher() { - return _tarballFetcher = _interopRequireDefault(__webpack_require__(364)); + return _tarballFetcher = _interopRequireDefault(__webpack_require__(358)); } var _workspaceFetcher; function _load_workspaceFetcher() { - return _workspaceFetcher = _interopRequireDefault(__webpack_require__(553)); + return _workspaceFetcher = _interopRequireDefault(__webpack_require__(521)); } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -101266,7 +97325,7 @@ exports.tarball = (_tarballFetcher || _load_tarballFetcher()).default; exports.workspace = (_workspaceFetcher || _load_workspaceFetcher()).default; /***/ }), -/* 553 */ +/* 521 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -101279,7 +97338,7 @@ Object.defineProperty(exports, "__esModule", { var _extends2; function _load_extends() { - return _extends2 = _interopRequireDefault(__webpack_require__(21)); + return _extends2 = _interopRequireDefault(__webpack_require__(20)); } var _asyncToGenerator2; @@ -101291,7 +97350,7 @@ function _load_asyncToGenerator() { var _packageFetcher; function _load_packageFetcher() { - return _packageFetcher = __webpack_require__(210); + return _packageFetcher = __webpack_require__(208); } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -101338,7 +97397,7 @@ class WorkspaceFetcher { exports.default = WorkspaceFetcher; /***/ }), -/* 554 */ +/* 522 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -101477,7 +97536,7 @@ function getParent(key, treesByKey) { } /***/ }), -/* 555 */ +/* 523 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -101510,7 +97569,7 @@ class PackageConstraintResolver { exports.default = PackageConstraintResolver; /***/ }), -/* 556 */ +/* 524 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -101524,7 +97583,7 @@ exports.NohoistResolver = exports.HoistManifest = undefined; var _extends2; function _load_extends() { - return _extends2 = _interopRequireDefault(__webpack_require__(21)); + return _extends2 = _interopRequireDefault(__webpack_require__(20)); } var _config; @@ -101542,7 +97601,7 @@ function _load_misc() { var _micromatch; function _load_micromatch() { - return _micromatch = _interopRequireDefault(__webpack_require__(114)); + return _micromatch = _interopRequireDefault(__webpack_require__(115)); } var _workspaceLayout2; @@ -102675,7 +98734,7 @@ class NohoistResolver { exports.NohoistResolver = NohoistResolver; /***/ }), -/* 557 */ +/* 525 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -102712,13 +98771,13 @@ function _load_crypto() { var _fs; function _load_fs() { - return _fs = _interopRequireWildcard(__webpack_require__(4)); + return _fs = _interopRequireWildcard(__webpack_require__(5)); } var _packageNameUtils; function _load_packageNameUtils() { - return _packageNameUtils = __webpack_require__(222); + return _packageNameUtils = __webpack_require__(220); } var _pack; @@ -102731,7 +98790,7 @@ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -const fs = __webpack_require__(5); +const fs = __webpack_require__(4); const invariant = __webpack_require__(9); const path = __webpack_require__(0); @@ -103268,7 +99327,7 @@ class PackageInstallScripts { exports.default = PackageInstallScripts; /***/ }), -/* 558 */ +/* 526 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -103287,7 +99346,7 @@ function _load_asyncToGenerator() { var _extends2; function _load_extends() { - return _extends2 = _interopRequireDefault(__webpack_require__(21)); + return _extends2 = _interopRequireDefault(__webpack_require__(20)); } var _misc; @@ -103465,7 +99524,7 @@ class BaseRegistry { exports.default = BaseRegistry; /***/ }), -/* 559 */ +/* 527 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -103503,13 +99562,13 @@ function _load_lockfile() { var _fs; function _load_fs() { - return _fs = _interopRequireWildcard(__webpack_require__(4)); + return _fs = _interopRequireWildcard(__webpack_require__(5)); } var _yarnVersion; function _load_yarnVersion() { - return _yarnVersion = __webpack_require__(120); + return _yarnVersion = __webpack_require__(105); } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } @@ -103678,7 +99737,7 @@ exports.default = YarnRegistry; YarnRegistry.filename = 'yarn.json'; /***/ }), -/* 560 */ +/* 528 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -103691,7 +99750,7 @@ Object.defineProperty(exports, "__esModule", { var _jsonReporter; function _load_jsonReporter() { - return _jsonReporter = _interopRequireDefault(__webpack_require__(213)); + return _jsonReporter = _interopRequireDefault(__webpack_require__(211)); } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -103725,7 +99784,7 @@ class BufferReporter extends (_jsonReporter || _load_jsonReporter()).default { exports.default = BufferReporter; /***/ }), -/* 561 */ +/* 529 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -103750,19 +99809,19 @@ function _load_baseReporter() { var _progressBar; function _load_progressBar() { - return _progressBar = _interopRequireDefault(__webpack_require__(563)); + return _progressBar = _interopRequireDefault(__webpack_require__(531)); } var _spinnerProgress; function _load_spinnerProgress() { - return _spinnerProgress = _interopRequireDefault(__webpack_require__(564)); + return _spinnerProgress = _interopRequireDefault(__webpack_require__(532)); } var _util; function _load_util() { - return _util = __webpack_require__(212); + return _util = __webpack_require__(210); } var _misc; @@ -103774,7 +99833,7 @@ function _load_misc() { var _treeHelper; function _load_treeHelper() { - return _treeHelper = __webpack_require__(562); + return _treeHelper = __webpack_require__(530); } var _inquirer; @@ -103786,7 +99845,7 @@ function _load_inquirer() { var _cliTable; function _load_cliTable() { - return _cliTable = _interopRequireDefault(__webpack_require__(602)); + return _cliTable = _interopRequireDefault(__webpack_require__(570)); } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -103795,7 +99854,7 @@ var _require = __webpack_require__(3); const inspect = _require.inspect; -const readline = __webpack_require__(197); +const readline = __webpack_require__(198); const chalk = __webpack_require__(30); const stripAnsi = __webpack_require__(329); const read = __webpack_require__(790); @@ -104382,7 +100441,7 @@ class ConsoleReporter extends (_baseReporter || _load_baseReporter()).default { exports.default = ConsoleReporter; /***/ }), -/* 562 */ +/* 530 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -104438,7 +100497,7 @@ function formatColor(color, strToFormat, formatter) { } /***/ }), -/* 563 */ +/* 531 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -104451,7 +100510,7 @@ Object.defineProperty(exports, "__esModule", { var _util; function _load_util() { - return _util = __webpack_require__(212); + return _util = __webpack_require__(210); } class ProgressBar { @@ -104523,7 +100582,7 @@ exports.default = ProgressBar; ProgressBar.bars = [['#', '-']]; /***/ }), -/* 564 */ +/* 532 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -104536,7 +100595,7 @@ Object.defineProperty(exports, "__esModule", { var _util; function _load_util() { - return _util = __webpack_require__(212); + return _util = __webpack_require__(210); } class Spinner { @@ -104585,7 +100644,7 @@ exports.default = Spinner; Spinner.spinners = ['|/-\\', '⠂-–—–-', '◐◓◑◒', '◴◷◶◵', '◰◳◲◱', '▖▘▝▗', '■□▪▫', '▌▀▐▄', '▉▊▋▌▍▎▏▎▍▌▋▊▉', '▁▃▄▅▆▇█▇▆▅▄▃', '←↖↑↗→↘↓↙', '┤┘┴└├┌┬┐', '◢◣◤◥', '.oO°Oo.', '.oO@*', '🌍🌎🌏', '◡◡ ⊙⊙ ◠◠', '☱☲☴', '⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏', '⠋⠙⠚⠞⠖⠦⠴⠲⠳⠓', '⠄⠆⠇⠋⠙⠸⠰⠠⠰⠸⠙⠋⠇⠆', '⠋⠙⠚⠒⠂⠂⠒⠲⠴⠦⠖⠒⠐⠐⠒⠓⠋', '⠁⠉⠙⠚⠒⠂⠂⠒⠲⠴⠤⠄⠄⠤⠴⠲⠒⠂⠂⠒⠚⠙⠉⠁', '⠈⠉⠋⠓⠒⠐⠐⠒⠖⠦⠤⠠⠠⠤⠦⠖⠒⠐⠐⠒⠓⠋⠉⠈', '⠁⠁⠉⠙⠚⠒⠂⠂⠒⠲⠴⠤⠄⠄⠤⠠⠠⠤⠦⠖⠒⠐⠐⠒⠓⠋⠉⠈⠈', '⢄⢂⢁⡁⡈⡐⡠', '⢹⢺⢼⣸⣇⡧⡗⡏', '⣾⣽⣻⢿⡿⣟⣯⣷', '⠁⠂⠄⡀⢀⠠⠐⠈']; /***/ }), -/* 565 */ +/* 533 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -104598,7 +100657,7 @@ Object.defineProperty(exports, "__esModule", { var _jsonReporter; function _load_jsonReporter() { - return _jsonReporter = _interopRequireDefault(__webpack_require__(213)); + return _jsonReporter = _interopRequireDefault(__webpack_require__(211)); } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -104624,7 +100683,7 @@ exports.default = EventReporter; Object.assign(EventReporter.prototype, EventEmitter.prototype); /***/ }), -/* 566 */ +/* 534 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -104658,7 +100717,7 @@ const defaultFormatter = exports.defaultFormatter = { }; /***/ }), -/* 567 */ +/* 535 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -105072,7 +101131,7 @@ const messages = { exports.default = messages; /***/ }), -/* 568 */ +/* 536 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -105086,7 +101145,7 @@ exports.en = undefined; var _en; function _load_en() { - return _en = _interopRequireDefault(__webpack_require__(567)); + return _en = _interopRequireDefault(__webpack_require__(535)); } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -105094,7 +101153,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de exports.en = (_en || _load_en()).default; /***/ }), -/* 569 */ +/* 537 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -105197,7 +101256,7 @@ class NoopReporter extends (_baseReporter || _load_baseReporter()).default { exports.default = NoopReporter; /***/ }), -/* 570 */ +/* 538 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -105210,7 +101269,7 @@ Object.defineProperty(exports, "__esModule", { var _extends2; function _load_extends() { - return _extends2 = _interopRequireDefault(__webpack_require__(21)); + return _extends2 = _interopRequireDefault(__webpack_require__(20)); } var _packageRequest; @@ -105290,7 +101349,7 @@ class WorkspaceResolver extends (_baseResolver || _load_baseResolver()).default exports.default = WorkspaceResolver; /***/ }), -/* 571 */ +/* 539 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -105359,7 +101418,7 @@ BitbucketResolver.hostname = 'bitbucket.org'; BitbucketResolver.protocol = 'bitbucket'; /***/ }), -/* 572 */ +/* 540 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -105404,7 +101463,7 @@ GitLabResolver.hostname = 'gitlab.com'; GitLabResolver.protocol = 'gitlab'; /***/ }), -/* 573 */ +/* 541 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -105451,7 +101510,7 @@ class RegistryResolver extends (_exoticResolver || _load_exoticResolver()).defau exports.default = RegistryResolver; /***/ }), -/* 574 */ +/* 542 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -105470,7 +101529,7 @@ function _load_asyncToGenerator() { var _tarballFetcher; function _load_tarballFetcher() { - return _tarballFetcher = _interopRequireDefault(__webpack_require__(364)); + return _tarballFetcher = _interopRequireDefault(__webpack_require__(358)); } var _exoticResolver; @@ -105494,7 +101553,7 @@ function _load_guessName() { var _version; function _load_version() { - return _version = _interopRequireWildcard(__webpack_require__(226)); + return _version = _interopRequireWildcard(__webpack_require__(223)); } var _crypto; @@ -105506,7 +101565,7 @@ function _load_crypto() { var _fs; function _load_fs() { - return _fs = _interopRequireWildcard(__webpack_require__(4)); + return _fs = _interopRequireWildcard(__webpack_require__(5)); } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } @@ -105619,7 +101678,7 @@ class TarballResolver extends (_exoticResolver || _load_exoticResolver()).defaul exports.default = TarballResolver; /***/ }), -/* 575 */ +/* 543 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -105650,7 +101709,7 @@ class RegistryResolver extends (_baseResolver || _load_baseResolver()).default { exports.default = RegistryResolver; /***/ }), -/* 576 */ +/* 544 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -105663,7 +101722,7 @@ Object.defineProperty(exports, "__esModule", { var _npmResolver; function _load_npmResolver() { - return _npmResolver = _interopRequireDefault(__webpack_require__(217)); + return _npmResolver = _interopRequireDefault(__webpack_require__(215)); } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -105672,7 +101731,7 @@ class YarnResolver extends (_npmResolver || _load_npmResolver()).default {} exports.default = YarnResolver; /***/ }), -/* 577 */ +/* 545 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -105701,7 +101760,7 @@ function envReplace(value, env = process.env) { } /***/ }), -/* 578 */ +/* 546 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -105742,7 +101801,7 @@ function fixCmdWinSlashes(cmd) { } /***/ }), -/* 579 */ +/* 547 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -106167,7 +102226,7 @@ let generatePnpMap = exports.generatePnpMap = (() => { var _fs; function _load_fs() { - return _fs = _interopRequireWildcard(__webpack_require__(4)); + return _fs = _interopRequireWildcard(__webpack_require__(5)); } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } @@ -106413,7 +102472,7 @@ function generateFindPackageLocator(packageInformationStores) { } /***/ }), -/* 580 */ +/* 548 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -106534,7 +102593,7 @@ function getTransitiveDevDependencies(packageManifest, workspaceLayout, lockfile } /***/ }), -/* 581 */ +/* 549 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -106775,7 +102834,7 @@ const parseRefs = exports.parseRefs = stdout => { }; /***/ }), -/* 582 */ +/* 550 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -106816,7 +102875,7 @@ class LogicalDependencyTree { exports.LogicalDependencyTree = LogicalDependencyTree; /***/ }), -/* 583 */ +/* 551 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -106841,7 +102900,7 @@ function _load_constants() { var _util; function _load_util() { - return _util = __webpack_require__(221); + return _util = __webpack_require__(219); } var _index; @@ -106853,13 +102912,13 @@ function _load_index() { var _inferLicense; function _load_inferLicense() { - return _inferLicense = _interopRequireDefault(__webpack_require__(584)); + return _inferLicense = _interopRequireDefault(__webpack_require__(552)); } var _fs; function _load_fs() { - return _fs = _interopRequireWildcard(__webpack_require__(4)); + return _fs = _interopRequireWildcard(__webpack_require__(5)); } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } @@ -107299,7 +103358,7 @@ exports.default = (() => { })(); /***/ }), -/* 584 */ +/* 552 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -107313,7 +103372,7 @@ exports.default = inferLicense; var _licenses; function _load_licenses() { - return _licenses = _interopRequireDefault(__webpack_require__(585)); + return _licenses = _interopRequireDefault(__webpack_require__(553)); } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -107367,7 +103426,7 @@ function inferLicense(license) { } /***/ }), -/* 585 */ +/* 553 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -107394,7 +103453,7 @@ exports.default = { }; /***/ }), -/* 586 */ +/* 554 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -107491,13 +103550,13 @@ function _load_constants() { var _fileResolver; function _load_fileResolver() { - return _fileResolver = __webpack_require__(215); + return _fileResolver = __webpack_require__(213); } var _linkResolver; function _load_linkResolver() { - return _linkResolver = __webpack_require__(368); + return _linkResolver = __webpack_require__(362); } var _invariant; @@ -107511,7 +103570,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de const path = __webpack_require__(0); /***/ }), -/* 587 */ +/* 555 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -107543,7 +103602,7 @@ exports.default = { }; /***/ }), -/* 588 */ +/* 556 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -107567,7 +103626,7 @@ function parsePackageName(input) { } /***/ }), -/* 589 */ +/* 557 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -107623,7 +103682,7 @@ exports.makePortableProxyScript = makePortableProxyScript; var _fs; function _load_fs() { - return _fs = _interopRequireWildcard(__webpack_require__(4)); + return _fs = _interopRequireWildcard(__webpack_require__(5)); } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } @@ -107639,7 +103698,7 @@ options = {}) { } /***/ }), -/* 590 */ +/* 558 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -107653,7 +103712,7 @@ exports.findRc = findRc; var _fs; function _load_fs() { - return _fs = __webpack_require__(5); + return _fs = __webpack_require__(4); } var _path; @@ -107747,13 +103806,13 @@ function findRc(name, cwd, parser) { } /***/ }), -/* 591 */ +/* 559 */ /***/ (function(module, exports, __webpack_require__) { -module.exports = { "default": __webpack_require__(623), __esModule: true }; +module.exports = { "default": __webpack_require__(591), __esModule: true }; /***/ }), -/* 592 */ +/* 560 */ /***/ (function(module, exports, __webpack_require__) { var DuplexStream = __webpack_require__(791) @@ -108040,7 +104099,7 @@ module.exports = BufferList /***/ }), -/* 593 */ +/* 561 */ /***/ (function(module, exports) { function allocUnsafe (size) { @@ -108063,7 +104122,7 @@ module.exports = allocUnsafe /***/ }), -/* 594 */ +/* 562 */ /***/ (function(module, exports) { /* Node.js 6.4.0 and up has full support */ @@ -108182,7 +104241,7 @@ module.exports = fill /***/ }), -/* 595 */ +/* 563 */ /***/ (function(module, exports) { var toString = Object.prototype.toString @@ -108257,7 +104316,7 @@ module.exports = bufferFrom /***/ }), -/* 596 */ +/* 564 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -108423,7 +104482,7 @@ function parse(val) { /***/ }), -/* 597 */ +/* 565 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -108438,13 +104497,13 @@ module.exports = (flag, argv) => { /***/ }), -/* 598 */ +/* 566 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const os = __webpack_require__(46); -const hasFlag = __webpack_require__(597); +const hasFlag = __webpack_require__(565); const env = process.env; @@ -108576,7 +104635,7 @@ module.exports = { /***/ }), -/* 599 */ +/* 567 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -108711,13 +104770,13 @@ module.exports = (chalk, tmp) => { /***/ }), -/* 600 */ +/* 568 */ /***/ (function(module, exports, __webpack_require__) { module.exports = chownr chownr.sync = chownrSync -var fs = __webpack_require__(5) +var fs = __webpack_require__(4) , path = __webpack_require__(0) function chownr (p, uid, gid, cb) { @@ -108769,7 +104828,7 @@ function chownrSync (p, uid, gid) { /***/ }), -/* 601 */ +/* 569 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -108824,17 +104883,17 @@ exports.isCI = !!( /***/ }), -/* 602 */ +/* 570 */ /***/ (function(module, exports, __webpack_require__) { -module.exports = __webpack_require__(605); +module.exports = __webpack_require__(573); /***/ }), -/* 603 */ +/* 571 */ /***/ (function(module, exports, __webpack_require__) { -var kindOf = __webpack_require__(179); -var utils = __webpack_require__(382); +var kindOf = __webpack_require__(180); +var utils = __webpack_require__(376); /** * A representation of a cell within the table. @@ -109025,7 +105084,7 @@ Cell.prototype._topLeftChar = function(offset){ Cell.prototype.wrapWithStyleColors = function(styleProperty,content){ if(this[styleProperty] && this[styleProperty].length){ try { - var colors = __webpack_require__(621); + var colors = __webpack_require__(589); for(var i = this[styleProperty].length - 1; i >= 0; i--){ colors = colors[this[styleProperty][i]]; } @@ -109207,12 +105266,12 @@ module.exports.RowSpanCell = RowSpanCell; /***/ }), -/* 604 */ +/* 572 */ /***/ (function(module, exports, __webpack_require__) { -var kindOf = __webpack_require__(179); +var kindOf = __webpack_require__(180); var objectAssign = __webpack_require__(303); -var Cell = __webpack_require__(603); +var Cell = __webpack_require__(571); var RowSpanCell = Cell.RowSpanCell; var ColSpanCell = Cell.ColSpanCell; @@ -109449,11 +105508,11 @@ function makeComputeWidths(colSpan,desiredWidth,x,forcedMin){ /***/ }), -/* 605 */ +/* 573 */ /***/ (function(module, exports, __webpack_require__) { -var utils = __webpack_require__(382); -var tableLayout = __webpack_require__(604); +var utils = __webpack_require__(376); +var tableLayout = __webpack_require__(572); function Table(options){ this.options = utils.mergeOptions(options); @@ -109531,7 +105590,7 @@ module.exports = Table; /***/ }), -/* 606 */ +/* 574 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -109587,7 +105646,7 @@ function cliWidth(options) { /***/ }), -/* 607 */ +/* 575 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -109626,11 +105685,11 @@ module.exports = function (str, pos) { /***/ }), -/* 608 */ +/* 576 */ /***/ (function(module, exports, __webpack_require__) { -var conversions = __webpack_require__(384); -var route = __webpack_require__(609); +var conversions = __webpack_require__(378); +var route = __webpack_require__(577); var convert = {}; @@ -109710,10 +105769,10 @@ module.exports = convert; /***/ }), -/* 609 */ +/* 577 */ /***/ (function(module, exports, __webpack_require__) { -var conversions = __webpack_require__(384); +var conversions = __webpack_require__(378); /* this function routes a model to all other models. @@ -109813,162 +105872,162 @@ module.exports = function (fromModel) { /***/ }), -/* 610 */ +/* 578 */ /***/ (function(module, exports) { -module.exports = { - "aliceblue": [240, 248, 255], - "antiquewhite": [250, 235, 215], - "aqua": [0, 255, 255], - "aquamarine": [127, 255, 212], - "azure": [240, 255, 255], - "beige": [245, 245, 220], - "bisque": [255, 228, 196], - "black": [0, 0, 0], - "blanchedalmond": [255, 235, 205], - "blue": [0, 0, 255], - "blueviolet": [138, 43, 226], - "brown": [165, 42, 42], - "burlywood": [222, 184, 135], - "cadetblue": [95, 158, 160], - "chartreuse": [127, 255, 0], - "chocolate": [210, 105, 30], - "coral": [255, 127, 80], - "cornflowerblue": [100, 149, 237], - "cornsilk": [255, 248, 220], - "crimson": [220, 20, 60], - "cyan": [0, 255, 255], - "darkblue": [0, 0, 139], - "darkcyan": [0, 139, 139], - "darkgoldenrod": [184, 134, 11], - "darkgray": [169, 169, 169], - "darkgreen": [0, 100, 0], - "darkgrey": [169, 169, 169], - "darkkhaki": [189, 183, 107], - "darkmagenta": [139, 0, 139], - "darkolivegreen": [85, 107, 47], - "darkorange": [255, 140, 0], - "darkorchid": [153, 50, 204], - "darkred": [139, 0, 0], - "darksalmon": [233, 150, 122], - "darkseagreen": [143, 188, 143], - "darkslateblue": [72, 61, 139], - "darkslategray": [47, 79, 79], - "darkslategrey": [47, 79, 79], - "darkturquoise": [0, 206, 209], - "darkviolet": [148, 0, 211], - "deeppink": [255, 20, 147], - "deepskyblue": [0, 191, 255], - "dimgray": [105, 105, 105], - "dimgrey": [105, 105, 105], - "dodgerblue": [30, 144, 255], - "firebrick": [178, 34, 34], - "floralwhite": [255, 250, 240], - "forestgreen": [34, 139, 34], - "fuchsia": [255, 0, 255], - "gainsboro": [220, 220, 220], - "ghostwhite": [248, 248, 255], - "gold": [255, 215, 0], - "goldenrod": [218, 165, 32], - "gray": [128, 128, 128], - "green": [0, 128, 0], - "greenyellow": [173, 255, 47], - "grey": [128, 128, 128], - "honeydew": [240, 255, 240], - "hotpink": [255, 105, 180], - "indianred": [205, 92, 92], - "indigo": [75, 0, 130], - "ivory": [255, 255, 240], - "khaki": [240, 230, 140], - "lavender": [230, 230, 250], - "lavenderblush": [255, 240, 245], - "lawngreen": [124, 252, 0], - "lemonchiffon": [255, 250, 205], - "lightblue": [173, 216, 230], - "lightcoral": [240, 128, 128], - "lightcyan": [224, 255, 255], - "lightgoldenrodyellow": [250, 250, 210], - "lightgray": [211, 211, 211], - "lightgreen": [144, 238, 144], - "lightgrey": [211, 211, 211], - "lightpink": [255, 182, 193], - "lightsalmon": [255, 160, 122], - "lightseagreen": [32, 178, 170], - "lightskyblue": [135, 206, 250], - "lightslategray": [119, 136, 153], - "lightslategrey": [119, 136, 153], - "lightsteelblue": [176, 196, 222], - "lightyellow": [255, 255, 224], - "lime": [0, 255, 0], - "limegreen": [50, 205, 50], - "linen": [250, 240, 230], - "magenta": [255, 0, 255], - "maroon": [128, 0, 0], - "mediumaquamarine": [102, 205, 170], - "mediumblue": [0, 0, 205], - "mediumorchid": [186, 85, 211], - "mediumpurple": [147, 112, 219], - "mediumseagreen": [60, 179, 113], - "mediumslateblue": [123, 104, 238], - "mediumspringgreen": [0, 250, 154], - "mediumturquoise": [72, 209, 204], - "mediumvioletred": [199, 21, 133], - "midnightblue": [25, 25, 112], - "mintcream": [245, 255, 250], - "mistyrose": [255, 228, 225], - "moccasin": [255, 228, 181], - "navajowhite": [255, 222, 173], - "navy": [0, 0, 128], - "oldlace": [253, 245, 230], - "olive": [128, 128, 0], - "olivedrab": [107, 142, 35], - "orange": [255, 165, 0], - "orangered": [255, 69, 0], - "orchid": [218, 112, 214], - "palegoldenrod": [238, 232, 170], - "palegreen": [152, 251, 152], - "paleturquoise": [175, 238, 238], - "palevioletred": [219, 112, 147], - "papayawhip": [255, 239, 213], - "peachpuff": [255, 218, 185], - "peru": [205, 133, 63], - "pink": [255, 192, 203], - "plum": [221, 160, 221], - "powderblue": [176, 224, 230], - "purple": [128, 0, 128], - "rebeccapurple": [102, 51, 153], - "red": [255, 0, 0], - "rosybrown": [188, 143, 143], - "royalblue": [65, 105, 225], - "saddlebrown": [139, 69, 19], - "salmon": [250, 128, 114], - "sandybrown": [244, 164, 96], - "seagreen": [46, 139, 87], - "seashell": [255, 245, 238], - "sienna": [160, 82, 45], - "silver": [192, 192, 192], - "skyblue": [135, 206, 235], - "slateblue": [106, 90, 205], - "slategray": [112, 128, 144], - "slategrey": [112, 128, 144], - "snow": [255, 250, 250], - "springgreen": [0, 255, 127], - "steelblue": [70, 130, 180], - "tan": [210, 180, 140], - "teal": [0, 128, 128], - "thistle": [216, 191, 216], - "tomato": [255, 99, 71], - "turquoise": [64, 224, 208], - "violet": [238, 130, 238], - "wheat": [245, 222, 179], - "white": [255, 255, 255], - "whitesmoke": [245, 245, 245], - "yellow": [255, 255, 0], - "yellowgreen": [154, 205, 50] +module.exports = { + "aliceblue": [240, 248, 255], + "antiquewhite": [250, 235, 215], + "aqua": [0, 255, 255], + "aquamarine": [127, 255, 212], + "azure": [240, 255, 255], + "beige": [245, 245, 220], + "bisque": [255, 228, 196], + "black": [0, 0, 0], + "blanchedalmond": [255, 235, 205], + "blue": [0, 0, 255], + "blueviolet": [138, 43, 226], + "brown": [165, 42, 42], + "burlywood": [222, 184, 135], + "cadetblue": [95, 158, 160], + "chartreuse": [127, 255, 0], + "chocolate": [210, 105, 30], + "coral": [255, 127, 80], + "cornflowerblue": [100, 149, 237], + "cornsilk": [255, 248, 220], + "crimson": [220, 20, 60], + "cyan": [0, 255, 255], + "darkblue": [0, 0, 139], + "darkcyan": [0, 139, 139], + "darkgoldenrod": [184, 134, 11], + "darkgray": [169, 169, 169], + "darkgreen": [0, 100, 0], + "darkgrey": [169, 169, 169], + "darkkhaki": [189, 183, 107], + "darkmagenta": [139, 0, 139], + "darkolivegreen": [85, 107, 47], + "darkorange": [255, 140, 0], + "darkorchid": [153, 50, 204], + "darkred": [139, 0, 0], + "darksalmon": [233, 150, 122], + "darkseagreen": [143, 188, 143], + "darkslateblue": [72, 61, 139], + "darkslategray": [47, 79, 79], + "darkslategrey": [47, 79, 79], + "darkturquoise": [0, 206, 209], + "darkviolet": [148, 0, 211], + "deeppink": [255, 20, 147], + "deepskyblue": [0, 191, 255], + "dimgray": [105, 105, 105], + "dimgrey": [105, 105, 105], + "dodgerblue": [30, 144, 255], + "firebrick": [178, 34, 34], + "floralwhite": [255, 250, 240], + "forestgreen": [34, 139, 34], + "fuchsia": [255, 0, 255], + "gainsboro": [220, 220, 220], + "ghostwhite": [248, 248, 255], + "gold": [255, 215, 0], + "goldenrod": [218, 165, 32], + "gray": [128, 128, 128], + "green": [0, 128, 0], + "greenyellow": [173, 255, 47], + "grey": [128, 128, 128], + "honeydew": [240, 255, 240], + "hotpink": [255, 105, 180], + "indianred": [205, 92, 92], + "indigo": [75, 0, 130], + "ivory": [255, 255, 240], + "khaki": [240, 230, 140], + "lavender": [230, 230, 250], + "lavenderblush": [255, 240, 245], + "lawngreen": [124, 252, 0], + "lemonchiffon": [255, 250, 205], + "lightblue": [173, 216, 230], + "lightcoral": [240, 128, 128], + "lightcyan": [224, 255, 255], + "lightgoldenrodyellow": [250, 250, 210], + "lightgray": [211, 211, 211], + "lightgreen": [144, 238, 144], + "lightgrey": [211, 211, 211], + "lightpink": [255, 182, 193], + "lightsalmon": [255, 160, 122], + "lightseagreen": [32, 178, 170], + "lightskyblue": [135, 206, 250], + "lightslategray": [119, 136, 153], + "lightslategrey": [119, 136, 153], + "lightsteelblue": [176, 196, 222], + "lightyellow": [255, 255, 224], + "lime": [0, 255, 0], + "limegreen": [50, 205, 50], + "linen": [250, 240, 230], + "magenta": [255, 0, 255], + "maroon": [128, 0, 0], + "mediumaquamarine": [102, 205, 170], + "mediumblue": [0, 0, 205], + "mediumorchid": [186, 85, 211], + "mediumpurple": [147, 112, 219], + "mediumseagreen": [60, 179, 113], + "mediumslateblue": [123, 104, 238], + "mediumspringgreen": [0, 250, 154], + "mediumturquoise": [72, 209, 204], + "mediumvioletred": [199, 21, 133], + "midnightblue": [25, 25, 112], + "mintcream": [245, 255, 250], + "mistyrose": [255, 228, 225], + "moccasin": [255, 228, 181], + "navajowhite": [255, 222, 173], + "navy": [0, 0, 128], + "oldlace": [253, 245, 230], + "olive": [128, 128, 0], + "olivedrab": [107, 142, 35], + "orange": [255, 165, 0], + "orangered": [255, 69, 0], + "orchid": [218, 112, 214], + "palegoldenrod": [238, 232, 170], + "palegreen": [152, 251, 152], + "paleturquoise": [175, 238, 238], + "palevioletred": [219, 112, 147], + "papayawhip": [255, 239, 213], + "peachpuff": [255, 218, 185], + "peru": [205, 133, 63], + "pink": [255, 192, 203], + "plum": [221, 160, 221], + "powderblue": [176, 224, 230], + "purple": [128, 0, 128], + "rebeccapurple": [102, 51, 153], + "red": [255, 0, 0], + "rosybrown": [188, 143, 143], + "royalblue": [65, 105, 225], + "saddlebrown": [139, 69, 19], + "salmon": [250, 128, 114], + "sandybrown": [244, 164, 96], + "seagreen": [46, 139, 87], + "seashell": [255, 245, 238], + "sienna": [160, 82, 45], + "silver": [192, 192, 192], + "skyblue": [135, 206, 235], + "slateblue": [106, 90, 205], + "slategray": [112, 128, 144], + "slategrey": [112, 128, 144], + "snow": [255, 250, 250], + "springgreen": [0, 255, 127], + "steelblue": [70, 130, 180], + "tan": [210, 180, 140], + "teal": [0, 128, 128], + "thistle": [216, 191, 216], + "tomato": [255, 99, 71], + "turquoise": [64, 224, 208], + "violet": [238, 130, 238], + "wheat": [245, 222, 179], + "white": [255, 255, 255], + "whitesmoke": [245, 245, 245], + "yellow": [255, 255, 0], + "yellowgreen": [154, 205, 50] }; /***/ }), -/* 611 */ +/* 579 */ /***/ (function(module, exports, __webpack_require__) { /* @@ -110007,11 +106066,11 @@ module['exports'] = colors; colors.themes = {}; var util = __webpack_require__(3); -var ansiStyles = colors.styles = __webpack_require__(618); +var ansiStyles = colors.styles = __webpack_require__(586); var defineProps = Object.defineProperties; var newLineRegex = new RegExp(/[\r\n]+/g); -colors.supportsColor = __webpack_require__(620).supportsColor; +colors.supportsColor = __webpack_require__(588).supportsColor; if (typeof colors.enabled === 'undefined') { colors.enabled = colors.supportsColor() !== false; @@ -110153,15 +106212,15 @@ var sequencer = function sequencer(map, str) { }; // custom formatter methods -colors.trap = __webpack_require__(612); -colors.zalgo = __webpack_require__(613); +colors.trap = __webpack_require__(580); +colors.zalgo = __webpack_require__(581); // maps colors.maps = {}; -colors.maps.america = __webpack_require__(614)(colors); -colors.maps.zebra = __webpack_require__(617)(colors); -colors.maps.rainbow = __webpack_require__(615)(colors); -colors.maps.random = __webpack_require__(616)(colors); +colors.maps.america = __webpack_require__(582)(colors); +colors.maps.zebra = __webpack_require__(585)(colors); +colors.maps.rainbow = __webpack_require__(583)(colors); +colors.maps.random = __webpack_require__(584)(colors); for (var map in colors.maps) { (function(map) { @@ -110175,7 +106234,7 @@ defineProps(colors, init()); /***/ }), -/* 612 */ +/* 580 */ /***/ (function(module, exports) { module['exports'] = function runTheTrap(text, options) { @@ -110227,7 +106286,7 @@ module['exports'] = function runTheTrap(text, options) { /***/ }), -/* 613 */ +/* 581 */ /***/ (function(module, exports) { // please no @@ -110343,7 +106402,7 @@ module['exports'] = function zalgo(text, options) { /***/ }), -/* 614 */ +/* 582 */ /***/ (function(module, exports) { module['exports'] = function(colors) { @@ -110359,7 +106418,7 @@ module['exports'] = function(colors) { /***/ }), -/* 615 */ +/* 583 */ /***/ (function(module, exports) { module['exports'] = function(colors) { @@ -110377,7 +106436,7 @@ module['exports'] = function(colors) { /***/ }), -/* 616 */ +/* 584 */ /***/ (function(module, exports) { module['exports'] = function(colors) { @@ -110393,7 +106452,7 @@ module['exports'] = function(colors) { /***/ }), -/* 617 */ +/* 585 */ /***/ (function(module, exports) { module['exports'] = function(colors) { @@ -110404,7 +106463,7 @@ module['exports'] = function(colors) { /***/ }), -/* 618 */ +/* 586 */ /***/ (function(module, exports) { /* @@ -110487,7 +106546,7 @@ Object.keys(codes).forEach(function(key) { /***/ }), -/* 619 */ +/* 587 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -110529,7 +106588,7 @@ module.exports = function(flag, argv) { /***/ }), -/* 620 */ +/* 588 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -110561,7 +106620,7 @@ THE SOFTWARE. var os = __webpack_require__(46); -var hasFlag = __webpack_require__(619); +var hasFlag = __webpack_require__(587); var env = process.env; @@ -110687,7 +106746,7 @@ module.exports = { /***/ }), -/* 621 */ +/* 589 */ /***/ (function(module, exports, __webpack_require__) { // @@ -110698,12 +106757,12 @@ module.exports = { // colors.red("foo") // // -var colors = __webpack_require__(611); +var colors = __webpack_require__(579); module['exports'] = colors; /***/ }), -/* 622 */ +/* 590 */ /***/ (function(module, exports) { module.exports = defer; @@ -110735,25 +106794,25 @@ function defer(fn) /***/ }), -/* 623 */ +/* 591 */ /***/ (function(module, exports, __webpack_require__) { -__webpack_require__(627); +__webpack_require__(595); module.exports = __webpack_require__(31).Object.assign; /***/ }), -/* 624 */ +/* 592 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // 19.1.2.1 Object.assign(target, source, ...) -var getKeys = __webpack_require__(171); -var gOPS = __webpack_require__(625); -var pIE = __webpack_require__(626); -var toObject = __webpack_require__(172); -var IObject = __webpack_require__(170); +var getKeys = __webpack_require__(172); +var gOPS = __webpack_require__(593); +var pIE = __webpack_require__(594); +var toObject = __webpack_require__(173); +var IObject = __webpack_require__(171); var $assign = Object.assign; // should work with symbols and should have deterministic property order (V8 bug) @@ -110784,36 +106843,36 @@ module.exports = !$assign || __webpack_require__(112)(function () { /***/ }), -/* 625 */ +/* 593 */ /***/ (function(module, exports) { exports.f = Object.getOwnPropertySymbols; /***/ }), -/* 626 */ +/* 594 */ /***/ (function(module, exports) { exports.f = {}.propertyIsEnumerable; /***/ }), -/* 627 */ +/* 595 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.3.1 Object.assign(target, source) var $export = __webpack_require__(60); -$export($export.S + $export.F, 'Object', { assign: __webpack_require__(624) }); +$export($export.S + $export.F, 'Object', { assign: __webpack_require__(592) }); /***/ }), -/* 628 */ +/* 596 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var arrayFindIndex = __webpack_require__(511); +var arrayFindIndex = __webpack_require__(479); module.exports = function () { var unhandledRejections = []; @@ -110848,12 +106907,12 @@ module.exports = function () { /***/ }), -/* 629 */ +/* 597 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var core = __webpack_require__(628); +var core = __webpack_require__(596); module.exports = function (p) { p = p || process; @@ -110867,7 +106926,7 @@ module.exports = function (p) { /***/ }), -/* 630 */ +/* 598 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -110968,12 +107027,12 @@ module.exports = function (encodedURI) { /***/ }), -/* 631 */ +/* 599 */ /***/ (function(module, exports, __webpack_require__) { var pSlice = Array.prototype.slice; -var objectKeys = __webpack_require__(633); -var isArguments = __webpack_require__(632); +var objectKeys = __webpack_require__(601); +var isArguments = __webpack_require__(600); var deepEqual = module.exports = function (actual, expected, opts) { if (!opts) opts = {}; @@ -111068,7 +107127,7 @@ function objEquiv(a, b, opts) { /***/ }), -/* 632 */ +/* 600 */ /***/ (function(module, exports) { var supportsArgumentsClass = (function(){ @@ -111094,7 +107153,7 @@ function unsupported(object){ /***/ }), -/* 633 */ +/* 601 */ /***/ (function(module, exports) { exports = module.exports = typeof Object.keys === 'function' @@ -111109,7 +107168,7 @@ function shim (obj) { /***/ }), -/* 634 */ +/* 602 */ /***/ (function(module, exports, __webpack_require__) { var Stream = __webpack_require__(23).Stream; @@ -111222,7 +107281,7 @@ DelayedStream.prototype._checkIfMaxDataSizeExceeded = function() { /***/ }), -/* 635 */ +/* 603 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -111351,7 +107410,7 @@ module.exports = str => { /***/ }), -/* 636 */ +/* 604 */ /***/ (function(module, exports, __webpack_require__) { /* @@ -111370,7 +107429,7 @@ var CacheObject = function (conf) { this.count = 0; this.data = {}; - var next = __webpack_require__(512); + var next = __webpack_require__(480); this.set = function (key, value, callback) { var self = this; @@ -111478,7 +107537,7 @@ module.exports = CacheObject; /***/ }), -/* 637 */ +/* 605 */ /***/ (function(module, exports, __webpack_require__) { /* @@ -111487,7 +107546,7 @@ module.exports = CacheObject; * See the accompanying LICENSE file for terms. */ -var CacheObject = __webpack_require__(636), +var CacheObject = __webpack_require__(604), deepCopy = __webpack_require__(749), dns = __webpack_require__(964); @@ -111805,7 +107864,7 @@ module.exports = function(conf) { /***/ }), -/* 638 */ +/* 606 */ /***/ (function(module, exports, __webpack_require__) { // Named EC curves @@ -111981,7 +108040,7 @@ module.exports = { /***/ }), -/* 639 */ +/* 607 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -112151,7 +108210,7 @@ brackets.match = function(arr, pattern) { /***/ }), -/* 640 */ +/* 608 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -112164,7 +108223,7 @@ brackets.match = function(arr, pattern) { -var fill = __webpack_require__(641); +var fill = __webpack_require__(609); module.exports = function expandRange(str, options, fn) { if (typeof str !== 'string') { @@ -112201,7 +108260,7 @@ module.exports = function expandRange(str, options, fn) { /***/ }), -/* 641 */ +/* 609 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -112214,8 +108273,8 @@ module.exports = function expandRange(str, options, fn) { -var isObject = __webpack_require__(643); -var isNumber = __webpack_require__(642); +var isObject = __webpack_require__(611); +var isNumber = __webpack_require__(610); var randomize = __webpack_require__(787); var repeatStr = __webpack_require__(797); var repeat = __webpack_require__(411); @@ -112616,7 +108675,7 @@ function length(val) { /***/ }), -/* 642 */ +/* 610 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -112629,7 +108688,7 @@ function length(val) { -var typeOf = __webpack_require__(179); +var typeOf = __webpack_require__(180); module.exports = function isNumber(num) { var type = typeOf(num); @@ -112642,7 +108701,7 @@ module.exports = function isNumber(num) { /***/ }), -/* 643 */ +/* 611 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -112663,7 +108722,7 @@ module.exports = function isObject(val) { /***/ }), -/* 644 */ +/* 612 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -112680,7 +108739,7 @@ module.exports = function isObject(val) { * Module dependencies */ -var isExtglob = __webpack_require__(177); +var isExtglob = __webpack_require__(178); var re, cache = {}; /** @@ -112848,7 +108907,7 @@ function toRegex(pattern, contains, isNegated) { /***/ }), -/* 645 */ +/* 613 */ /***/ (function(module, exports, __webpack_require__) { /* @@ -113037,7 +109096,7 @@ function dumpException(ex) /***/ }), -/* 646 */ +/* 614 */ /***/ (function(module, exports) { /*! @@ -113053,7 +109112,7 @@ module.exports = function filenameRegex() { /***/ }), -/* 647 */ +/* 615 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -113076,7 +109135,7 @@ module.exports = function forIn(obj, fn, thisArg) { /***/ }), -/* 648 */ +/* 616 */ /***/ (function(module, exports, __webpack_require__) { module.exports = ForeverAgent @@ -113086,7 +109145,7 @@ var util = __webpack_require__(3) , Agent = __webpack_require__(87).Agent , net = __webpack_require__(164) , tls = __webpack_require__(467) - , AgentSSL = __webpack_require__(195).Agent + , AgentSSL = __webpack_require__(196).Agent function getConnectionName(host, port) { var name = '' @@ -113220,19 +109279,19 @@ function createConnectionSSL (port, host, options) { /***/ }), -/* 649 */ +/* 617 */ /***/ (function(module, exports, __webpack_require__) { -var CombinedStream = __webpack_require__(385); +var CombinedStream = __webpack_require__(379); var util = __webpack_require__(3); var path = __webpack_require__(0); var http = __webpack_require__(87); -var https = __webpack_require__(195); +var https = __webpack_require__(196); var parseUrl = __webpack_require__(24).parse; -var fs = __webpack_require__(5); +var fs = __webpack_require__(4); var mime = __webpack_require__(400); -var asynckit = __webpack_require__(517); -var populate = __webpack_require__(650); +var asynckit = __webpack_require__(485); +var populate = __webpack_require__(618); // Public API module.exports = FormData; @@ -113683,7 +109742,7 @@ FormData.prototype.toString = function () { /***/ }), -/* 650 */ +/* 618 */ /***/ (function(module, exports) { // populates missing values @@ -113699,14 +109758,14 @@ module.exports = function(dst, src) { /***/ }), -/* 651 */ +/* 619 */ /***/ (function(module, exports, __webpack_require__) { -module.exports = __webpack_require__(5).constants || __webpack_require__(466) +module.exports = __webpack_require__(4).constants || __webpack_require__(466) /***/ }), -/* 652 */ +/* 620 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -113720,8 +109779,8 @@ module.exports = __webpack_require__(5).constants || __webpack_require__(466) var path = __webpack_require__(0); -var parent = __webpack_require__(653); -var isGlob = __webpack_require__(178); +var parent = __webpack_require__(621); +var isGlob = __webpack_require__(179); module.exports = function globBase(pattern) { if (typeof pattern !== 'string') { @@ -113764,14 +109823,14 @@ function dirname(glob) { /***/ }), -/* 653 */ +/* 621 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var path = __webpack_require__(0); -var isglob = __webpack_require__(178); +var isglob = __webpack_require__(179); module.exports = function globParent(str) { str += 'a'; // preserves full path in case of trailing path separator @@ -113781,7 +109840,7 @@ module.exports = function globParent(str) { /***/ }), -/* 654 */ +/* 622 */ /***/ (function(module, exports, __webpack_require__) { var Stream = __webpack_require__(23).Stream @@ -113905,10 +109964,10 @@ function legacy (fs) { /***/ }), -/* 655 */ +/* 623 */ /***/ (function(module, exports, __webpack_require__) { -var fs = __webpack_require__(390) +var fs = __webpack_require__(384) var constants = __webpack_require__(466) var origCwd = process.cwd @@ -114241,10 +110300,10 @@ function chownErOk (er) { /***/ }), -/* 656 */ +/* 624 */ /***/ (function(module, exports, __webpack_require__) { -var zlib = __webpack_require__(198) +var zlib = __webpack_require__(199) var peek = __webpack_require__(775) var through = __webpack_require__(461) var pumpify = __webpack_require__(782) @@ -114279,144 +110338,144 @@ module.exports = gunzip /***/ }), -/* 657 */ +/* 625 */ /***/ (function(module, exports) { module.exports = {"$id":"afterRequest.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","optional":true,"required":["lastAccess","eTag","hitCount"],"properties":{"expires":{"type":"string","pattern":"^(\\d{4})(-)?(\\d\\d)(-)?(\\d\\d)(T)?(\\d\\d)(:)?(\\d\\d)(:)?(\\d\\d)(\\.\\d+)?(Z|([+-])(\\d\\d)(:)?(\\d\\d))?"},"lastAccess":{"type":"string","pattern":"^(\\d{4})(-)?(\\d\\d)(-)?(\\d\\d)(T)?(\\d\\d)(:)?(\\d\\d)(:)?(\\d\\d)(\\.\\d+)?(Z|([+-])(\\d\\d)(:)?(\\d\\d))?"},"eTag":{"type":"string"},"hitCount":{"type":"integer"},"comment":{"type":"string"}}} /***/ }), -/* 658 */ +/* 626 */ /***/ (function(module, exports) { module.exports = {"$id":"beforeRequest.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","optional":true,"required":["lastAccess","eTag","hitCount"],"properties":{"expires":{"type":"string","pattern":"^(\\d{4})(-)?(\\d\\d)(-)?(\\d\\d)(T)?(\\d\\d)(:)?(\\d\\d)(:)?(\\d\\d)(\\.\\d+)?(Z|([+-])(\\d\\d)(:)?(\\d\\d))?"},"lastAccess":{"type":"string","pattern":"^(\\d{4})(-)?(\\d\\d)(-)?(\\d\\d)(T)?(\\d\\d)(:)?(\\d\\d)(:)?(\\d\\d)(\\.\\d+)?(Z|([+-])(\\d\\d)(:)?(\\d\\d))?"},"eTag":{"type":"string"},"hitCount":{"type":"integer"},"comment":{"type":"string"}}} /***/ }), -/* 659 */ +/* 627 */ /***/ (function(module, exports) { module.exports = {"$id":"browser.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","required":["name","version"],"properties":{"name":{"type":"string"},"version":{"type":"string"},"comment":{"type":"string"}}} /***/ }), -/* 660 */ +/* 628 */ /***/ (function(module, exports) { module.exports = {"$id":"cache.json#","$schema":"http://json-schema.org/draft-06/schema#","properties":{"beforeRequest":{"oneOf":[{"type":"null"},{"$ref":"beforeRequest.json#"}]},"afterRequest":{"oneOf":[{"type":"null"},{"$ref":"afterRequest.json#"}]},"comment":{"type":"string"}}} /***/ }), -/* 661 */ +/* 629 */ /***/ (function(module, exports) { module.exports = {"$id":"content.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","required":["size","mimeType"],"properties":{"size":{"type":"integer"},"compression":{"type":"integer"},"mimeType":{"type":"string"},"text":{"type":"string"},"encoding":{"type":"string"},"comment":{"type":"string"}}} /***/ }), -/* 662 */ +/* 630 */ /***/ (function(module, exports) { module.exports = {"$id":"cookie.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","required":["name","value"],"properties":{"name":{"type":"string"},"value":{"type":"string"},"path":{"type":"string"},"domain":{"type":"string"},"expires":{"type":["string","null"],"format":"date-time"},"httpOnly":{"type":"boolean"},"secure":{"type":"boolean"},"comment":{"type":"string"}}} /***/ }), -/* 663 */ +/* 631 */ /***/ (function(module, exports) { module.exports = {"$id":"creator.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","required":["name","version"],"properties":{"name":{"type":"string"},"version":{"type":"string"},"comment":{"type":"string"}}} /***/ }), -/* 664 */ +/* 632 */ /***/ (function(module, exports) { module.exports = {"$id":"entry.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","optional":true,"required":["startedDateTime","time","request","response","cache","timings"],"properties":{"pageref":{"type":"string"},"startedDateTime":{"type":"string","format":"date-time","pattern":"^(\\d{4})(-)?(\\d\\d)(-)?(\\d\\d)(T)?(\\d\\d)(:)?(\\d\\d)(:)?(\\d\\d)(\\.\\d+)?(Z|([+-])(\\d\\d)(:)?(\\d\\d))"},"time":{"type":"number","min":0},"request":{"$ref":"request.json#"},"response":{"$ref":"response.json#"},"cache":{"$ref":"cache.json#"},"timings":{"$ref":"timings.json#"},"serverIPAddress":{"type":"string","oneOf":[{"format":"ipv4"},{"format":"ipv6"}]},"connection":{"type":"string"},"comment":{"type":"string"}}} /***/ }), -/* 665 */ +/* 633 */ /***/ (function(module, exports) { module.exports = {"$id":"har.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","required":["log"],"properties":{"log":{"$ref":"log.json#"}}} /***/ }), -/* 666 */ +/* 634 */ /***/ (function(module, exports) { module.exports = {"$id":"header.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","required":["name","value"],"properties":{"name":{"type":"string"},"value":{"type":"string"},"comment":{"type":"string"}}} /***/ }), -/* 667 */ +/* 635 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; module.exports = { - afterRequest: __webpack_require__(657), - beforeRequest: __webpack_require__(658), - browser: __webpack_require__(659), - cache: __webpack_require__(660), - content: __webpack_require__(661), - cookie: __webpack_require__(662), - creator: __webpack_require__(663), - entry: __webpack_require__(664), - har: __webpack_require__(665), - header: __webpack_require__(666), - log: __webpack_require__(668), - page: __webpack_require__(669), - pageTimings: __webpack_require__(670), - postData: __webpack_require__(671), - query: __webpack_require__(672), - request: __webpack_require__(673), - response: __webpack_require__(674), - timings: __webpack_require__(675) + afterRequest: __webpack_require__(625), + beforeRequest: __webpack_require__(626), + browser: __webpack_require__(627), + cache: __webpack_require__(628), + content: __webpack_require__(629), + cookie: __webpack_require__(630), + creator: __webpack_require__(631), + entry: __webpack_require__(632), + har: __webpack_require__(633), + header: __webpack_require__(634), + log: __webpack_require__(636), + page: __webpack_require__(637), + pageTimings: __webpack_require__(638), + postData: __webpack_require__(639), + query: __webpack_require__(640), + request: __webpack_require__(641), + response: __webpack_require__(642), + timings: __webpack_require__(643) } /***/ }), -/* 668 */ +/* 636 */ /***/ (function(module, exports) { module.exports = {"$id":"log.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","required":["version","creator","entries"],"properties":{"version":{"type":"string"},"creator":{"$ref":"creator.json#"},"browser":{"$ref":"browser.json#"},"pages":{"type":"array","items":{"$ref":"page.json#"}},"entries":{"type":"array","items":{"$ref":"entry.json#"}},"comment":{"type":"string"}}} /***/ }), -/* 669 */ +/* 637 */ /***/ (function(module, exports) { module.exports = {"$id":"page.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","optional":true,"required":["startedDateTime","id","title","pageTimings"],"properties":{"startedDateTime":{"type":"string","format":"date-time","pattern":"^(\\d{4})(-)?(\\d\\d)(-)?(\\d\\d)(T)?(\\d\\d)(:)?(\\d\\d)(:)?(\\d\\d)(\\.\\d+)?(Z|([+-])(\\d\\d)(:)?(\\d\\d))"},"id":{"type":"string","unique":true},"title":{"type":"string"},"pageTimings":{"$ref":"pageTimings.json#"},"comment":{"type":"string"}}} /***/ }), -/* 670 */ +/* 638 */ /***/ (function(module, exports) { module.exports = {"$id":"pageTimings.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","properties":{"onContentLoad":{"type":"number","min":-1},"onLoad":{"type":"number","min":-1},"comment":{"type":"string"}}} /***/ }), -/* 671 */ +/* 639 */ /***/ (function(module, exports) { module.exports = {"$id":"postData.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","optional":true,"required":["mimeType"],"properties":{"mimeType":{"type":"string"},"text":{"type":"string"},"params":{"type":"array","required":["name"],"properties":{"name":{"type":"string"},"value":{"type":"string"},"fileName":{"type":"string"},"contentType":{"type":"string"},"comment":{"type":"string"}}},"comment":{"type":"string"}}} /***/ }), -/* 672 */ +/* 640 */ /***/ (function(module, exports) { module.exports = {"$id":"query.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","required":["name","value"],"properties":{"name":{"type":"string"},"value":{"type":"string"},"comment":{"type":"string"}}} /***/ }), -/* 673 */ +/* 641 */ /***/ (function(module, exports) { module.exports = {"$id":"request.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","required":["method","url","httpVersion","cookies","headers","queryString","headersSize","bodySize"],"properties":{"method":{"type":"string"},"url":{"type":"string","format":"uri"},"httpVersion":{"type":"string"},"cookies":{"type":"array","items":{"$ref":"cookie.json#"}},"headers":{"type":"array","items":{"$ref":"header.json#"}},"queryString":{"type":"array","items":{"$ref":"query.json#"}},"postData":{"$ref":"postData.json#"},"headersSize":{"type":"integer"},"bodySize":{"type":"integer"},"comment":{"type":"string"}}} /***/ }), -/* 674 */ +/* 642 */ /***/ (function(module, exports) { module.exports = {"$id":"response.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","required":["status","statusText","httpVersion","cookies","headers","content","redirectURL","headersSize","bodySize"],"properties":{"status":{"type":"integer"},"statusText":{"type":"string"},"httpVersion":{"type":"string"},"cookies":{"type":"array","items":{"$ref":"cookie.json#"}},"headers":{"type":"array","items":{"$ref":"header.json#"}},"content":{"$ref":"content.json#"},"redirectURL":{"type":"string"},"headersSize":{"type":"integer"},"bodySize":{"type":"integer"},"comment":{"type":"string"}}} /***/ }), -/* 675 */ +/* 643 */ /***/ (function(module, exports) { module.exports = {"$id":"timings.json#","$schema":"http://json-schema.org/draft-06/schema#","required":["send","wait","receive"],"properties":{"dns":{"type":"number","min":-1},"connect":{"type":"number","min":-1},"blocked":{"type":"number","min":-1},"send":{"type":"number","min":-1},"wait":{"type":"number","min":-1},"receive":{"type":"number","min":-1},"ssl":{"type":"number","min":-1},"comment":{"type":"string"}}} /***/ }), -/* 676 */ +/* 644 */ /***/ (function(module, exports) { function HARError (errors) { @@ -114439,12 +110498,12 @@ module.exports = HARError /***/ }), -/* 677 */ +/* 645 */ /***/ (function(module, exports, __webpack_require__) { -var Ajv = __webpack_require__(473) -var HARError = __webpack_require__(676) -var schemas = __webpack_require__(667) +var Ajv = __webpack_require__(647) +var HARError = __webpack_require__(644) +var schemas = __webpack_require__(635) var ajv @@ -114539,6 +110598,4084 @@ exports.timings = function (data) { } +/***/ }), +/* 646 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var KEYWORDS = [ + 'multipleOf', + 'maximum', + 'exclusiveMaximum', + 'minimum', + 'exclusiveMinimum', + 'maxLength', + 'minLength', + 'pattern', + 'additionalItems', + 'maxItems', + 'minItems', + 'uniqueItems', + 'maxProperties', + 'minProperties', + 'required', + 'additionalProperties', + 'enum', + 'format', + 'const' +]; + +module.exports = function (metaSchema, keywordsJsonPointers) { + for (var i=0; i} errors optional array of validation errors, if not passed errors from the instance are used. + * @param {Object} options optional options with properties `separator` and `dataVar`. + * @return {String} human readable string with all errors descriptions + */ +function errorsText(errors, options) { + errors = errors || this.errors; + if (!errors) return 'No errors'; + options = options || {}; + var separator = options.separator === undefined ? ', ' : options.separator; + var dataVar = options.dataVar === undefined ? 'data' : options.dataVar; + + var text = ''; + for (var i=0; i%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i; +// For the source: https://gist.github.com/dperini/729294 +// For test cases: https://mathiasbynens.be/demo/url-regex +// @todo Delete current URL in favour of the commented out URL rule when this issue is fixed https://github.com/eslint/eslint/issues/7983. +// var URL = /^(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u{00a1}-\u{ffff}0-9]+-?)*[a-z\u{00a1}-\u{ffff}0-9]+)(?:\.(?:[a-z\u{00a1}-\u{ffff}0-9]+-?)*[a-z\u{00a1}-\u{ffff}0-9]+)*(?:\.(?:[a-z\u{00a1}-\u{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/iu; +var URL = /^(?:(?:http[s\u017F]?|ftp):\/\/)(?:(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+(?::(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?@)?(?:(?!10(?:\.[0-9]{1,3}){3})(?!127(?:\.[0-9]{1,3}){3})(?!169\.254(?:\.[0-9]{1,3}){2})(?!192\.168(?:\.[0-9]{1,3}){2})(?!172\.(?:1[6-9]|2[0-9]|3[01])(?:\.[0-9]{1,3}){2})(?:[1-9][0-9]?|1[0-9][0-9]|2[01][0-9]|22[0-3])(?:\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){2}(?:\.(?:[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-4]))|(?:(?:(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-?)*(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)(?:\.(?:(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-?)*(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)*(?:\.(?:(?:[KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){2,})))(?::[0-9]{2,5})?(?:\/(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?$/i; +var UUID = /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i; +var JSON_POINTER = /^(?:\/(?:[^~/]|~0|~1)*)*$|^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i; +var RELATIVE_JSON_POINTER = /^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/; + + +module.exports = formats; + +function formats(mode) { + mode = mode == 'full' ? 'full' : 'fast'; + return util.copy(formats[mode]); +} + + +formats.fast = { + // date: http://tools.ietf.org/html/rfc3339#section-5.6 + date: /^\d\d\d\d-[0-1]\d-[0-3]\d$/, + // date-time: http://tools.ietf.org/html/rfc3339#section-5.6 + time: /^[0-2]\d:[0-5]\d:[0-5]\d(?:\.\d+)?(?:z|[+-]\d\d:\d\d)?$/i, + 'date-time': /^\d\d\d\d-[0-1]\d-[0-3]\d[t\s][0-2]\d:[0-5]\d:[0-5]\d(?:\.\d+)?(?:z|[+-]\d\d:\d\d)$/i, + // uri: https://github.com/mafintosh/is-my-json-valid/blob/master/formats.js + uri: /^(?:[a-z][a-z0-9+-.]*)(?::|\/)\/?[^\s]*$/i, + 'uri-reference': /^(?:(?:[a-z][a-z0-9+-.]*:)?\/\/)?[^\s]*$/i, + 'uri-template': URITEMPLATE, + url: URL, + // email (sources from jsen validator): + // http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address#answer-8829363 + // http://www.w3.org/TR/html5/forms.html#valid-e-mail-address (search for 'willful violation') + email: /^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i, + hostname: HOSTNAME, + // optimized https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html + ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/, + // optimized http://stackoverflow.com/questions/53497/regular-expression-that-matches-valid-ipv6-addresses + ipv6: /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i, + regex: regex, + // uuid: http://tools.ietf.org/html/rfc4122 + uuid: UUID, + // JSON-pointer: https://tools.ietf.org/html/rfc6901 + // uri fragment: https://tools.ietf.org/html/rfc3986#appendix-A + 'json-pointer': JSON_POINTER, + // relative JSON-pointer: http://tools.ietf.org/html/draft-luff-relative-json-pointer-00 + 'relative-json-pointer': RELATIVE_JSON_POINTER +}; + + +formats.full = { + date: date, + time: time, + 'date-time': date_time, + uri: uri, + 'uri-reference': URIREF, + 'uri-template': URITEMPLATE, + url: URL, + email: /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&''*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i, + hostname: hostname, + ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/, + ipv6: /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i, + regex: regex, + uuid: UUID, + 'json-pointer': JSON_POINTER, + 'relative-json-pointer': RELATIVE_JSON_POINTER +}; + + +function date(str) { + // full-date from http://tools.ietf.org/html/rfc3339#section-5.6 + var matches = str.match(DATE); + if (!matches) return false; + + var month = +matches[1]; + var day = +matches[2]; + return month >= 1 && month <= 12 && day >= 1 && day <= DAYS[month]; +} + + +function time(str, full) { + var matches = str.match(TIME); + if (!matches) return false; + + var hour = matches[1]; + var minute = matches[2]; + var second = matches[3]; + var timeZone = matches[5]; + return hour <= 23 && minute <= 59 && second <= 59 && (!full || timeZone); +} + + +var DATE_TIME_SEPARATOR = /t|\s/i; +function date_time(str) { + // http://tools.ietf.org/html/rfc3339#section-5.6 + var dateTime = str.split(DATE_TIME_SEPARATOR); + return dateTime.length == 2 && date(dateTime[0]) && time(dateTime[1], true); +} + + +function hostname(str) { + // https://tools.ietf.org/html/rfc1034#section-3.5 + // https://tools.ietf.org/html/rfc1123#section-2 + return str.length <= 255 && HOSTNAME.test(str); +} + + +var NOT_URI_FRAGMENT = /\/|:/; +function uri(str) { + // http://jmrware.com/articles/2009/uri_regexp/URI_regex.html + optional protocol + required "." + return NOT_URI_FRAGMENT.test(str) && URI.test(str); +} + + +var Z_ANCHOR = /[^\\]\\Z/; +function regex(str) { + if (Z_ANCHOR.test(str)) return false; + try { + new RegExp(str); + return true; + } catch(e) { + return false; + } +} + + +/***/ }), +/* 652 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var resolve = __webpack_require__(271) + , util = __webpack_require__(114) + , errorClasses = __webpack_require__(270) + , stableStringify = __webpack_require__(383); + +var validateGenerator = __webpack_require__(391); + +/** + * Functions below are used inside compiled validations function + */ + +var co = __webpack_require__(377); +var ucs2length = util.ucs2length; +var equal = __webpack_require__(272); + +// this error is thrown by async schemas to return validation errors via exception +var ValidationError = errorClasses.Validation; + +module.exports = compile; + + +/** + * Compiles schema to validation function + * @this Ajv + * @param {Object} schema schema object + * @param {Object} root object with information about the root schema for this schema + * @param {Object} localRefs the hash of local references inside the schema (created by resolve.id), used for inline resolution + * @param {String} baseId base ID for IDs in the schema + * @return {Function} validation function + */ +function compile(schema, root, localRefs, baseId) { + /* jshint validthis: true, evil: true */ + /* eslint no-shadow: 0 */ + var self = this + , opts = this._opts + , refVal = [ undefined ] + , refs = {} + , patterns = [] + , patternsHash = {} + , defaults = [] + , defaultsHash = {} + , customRules = []; + + root = root || { schema: schema, refVal: refVal, refs: refs }; + + var c = checkCompiling.call(this, schema, root, baseId); + var compilation = this._compilations[c.index]; + if (c.compiling) return (compilation.callValidate = callValidate); + + var formats = this._formats; + var RULES = this.RULES; + + try { + var v = localCompile(schema, root, localRefs, baseId); + compilation.validate = v; + var cv = compilation.callValidate; + if (cv) { + cv.schema = v.schema; + cv.errors = null; + cv.refs = v.refs; + cv.refVal = v.refVal; + cv.root = v.root; + cv.$async = v.$async; + if (opts.sourceCode) cv.source = v.source; + } + return v; + } finally { + endCompiling.call(this, schema, root, baseId); + } + + function callValidate() { + var validate = compilation.validate; + var result = validate.apply(null, arguments); + callValidate.errors = validate.errors; + return result; + } + + function localCompile(_schema, _root, localRefs, baseId) { + var isRoot = !_root || (_root && _root.schema == _schema); + if (_root.schema != root.schema) + return compile.call(self, _schema, _root, localRefs, baseId); + + var $async = _schema.$async === true; + + var sourceCode = validateGenerator({ + isTop: true, + schema: _schema, + isRoot: isRoot, + baseId: baseId, + root: _root, + schemaPath: '', + errSchemaPath: '#', + errorPath: '""', + MissingRefError: errorClasses.MissingRef, + RULES: RULES, + validate: validateGenerator, + util: util, + resolve: resolve, + resolveRef: resolveRef, + usePattern: usePattern, + useDefault: useDefault, + useCustomRule: useCustomRule, + opts: opts, + formats: formats, + logger: self.logger, + self: self + }); + + sourceCode = vars(refVal, refValCode) + vars(patterns, patternCode) + + vars(defaults, defaultCode) + vars(customRules, customRuleCode) + + sourceCode; + + if (opts.processCode) sourceCode = opts.processCode(sourceCode); + // console.log('\n\n\n *** \n', JSON.stringify(sourceCode)); + var validate; + try { + var makeValidate = new Function( + 'self', + 'RULES', + 'formats', + 'root', + 'refVal', + 'defaults', + 'customRules', + 'co', + 'equal', + 'ucs2length', + 'ValidationError', + sourceCode + ); + + validate = makeValidate( + self, + RULES, + formats, + root, + refVal, + defaults, + customRules, + co, + equal, + ucs2length, + ValidationError + ); + + refVal[0] = validate; + } catch(e) { + self.logger.error('Error compiling schema, function code:', sourceCode); + throw e; + } + + validate.schema = _schema; + validate.errors = null; + validate.refs = refs; + validate.refVal = refVal; + validate.root = isRoot ? validate : _root; + if ($async) validate.$async = true; + if (opts.sourceCode === true) { + validate.source = { + code: sourceCode, + patterns: patterns, + defaults: defaults + }; + } + + return validate; + } + + function resolveRef(baseId, ref, isRoot) { + ref = resolve.url(baseId, ref); + var refIndex = refs[ref]; + var _refVal, refCode; + if (refIndex !== undefined) { + _refVal = refVal[refIndex]; + refCode = 'refVal[' + refIndex + ']'; + return resolvedRef(_refVal, refCode); + } + if (!isRoot && root.refs) { + var rootRefId = root.refs[ref]; + if (rootRefId !== undefined) { + _refVal = root.refVal[rootRefId]; + refCode = addLocalRef(ref, _refVal); + return resolvedRef(_refVal, refCode); + } + } + + refCode = addLocalRef(ref); + var v = resolve.call(self, localCompile, root, ref); + if (v === undefined) { + var localSchema = localRefs && localRefs[ref]; + if (localSchema) { + v = resolve.inlineRef(localSchema, opts.inlineRefs) + ? localSchema + : compile.call(self, localSchema, root, localRefs, baseId); + } + } + + if (v === undefined) { + removeLocalRef(ref); + } else { + replaceLocalRef(ref, v); + return resolvedRef(v, refCode); + } + } + + function addLocalRef(ref, v) { + var refId = refVal.length; + refVal[refId] = v; + refs[ref] = refId; + return 'refVal' + refId; + } + + function removeLocalRef(ref) { + delete refs[ref]; + } + + function replaceLocalRef(ref, v) { + var refId = refs[ref]; + refVal[refId] = v; + } + + function resolvedRef(refVal, code) { + return typeof refVal == 'object' || typeof refVal == 'boolean' + ? { code: code, schema: refVal, inline: true } + : { code: code, $async: refVal && refVal.$async }; + } + + function usePattern(regexStr) { + var index = patternsHash[regexStr]; + if (index === undefined) { + index = patternsHash[regexStr] = patterns.length; + patterns[index] = regexStr; + } + return 'pattern' + index; + } + + function useDefault(value) { + switch (typeof value) { + case 'boolean': + case 'number': + return '' + value; + case 'string': + return util.toQuotedString(value); + case 'object': + if (value === null) return 'null'; + var valueStr = stableStringify(value); + var index = defaultsHash[valueStr]; + if (index === undefined) { + index = defaultsHash[valueStr] = defaults.length; + defaults[index] = value; + } + return 'default' + index; + } + } + + function useCustomRule(rule, schema, parentSchema, it) { + var validateSchema = rule.definition.validateSchema; + if (validateSchema && self._opts.validateSchema !== false) { + var valid = validateSchema(schema); + if (!valid) { + var message = 'keyword schema is invalid: ' + self.errorsText(validateSchema.errors); + if (self._opts.validateSchema == 'log') self.logger.error(message); + else throw new Error(message); + } + } + + var compile = rule.definition.compile + , inline = rule.definition.inline + , macro = rule.definition.macro; + + var validate; + if (compile) { + validate = compile.call(self, schema, parentSchema, it); + } else if (macro) { + validate = macro.call(self, schema, parentSchema, it); + if (opts.validateSchema !== false) self.validateSchema(validate, true); + } else if (inline) { + validate = inline.call(self, it, rule.keyword, schema, parentSchema); + } else { + validate = rule.definition.validate; + if (!validate) return; + } + + if (validate === undefined) + throw new Error('custom keyword "' + rule.keyword + '"failed to compile'); + + var index = customRules.length; + customRules[index] = validate; + + return { + code: 'customRule' + index, + validate: validate + }; + } +} + + +/** + * Checks if the schema is currently compiled + * @this Ajv + * @param {Object} schema schema to compile + * @param {Object} root root object + * @param {String} baseId base schema ID + * @return {Object} object with properties "index" (compilation index) and "compiling" (boolean) + */ +function checkCompiling(schema, root, baseId) { + /* jshint validthis: true */ + var index = compIndex.call(this, schema, root, baseId); + if (index >= 0) return { index: index, compiling: true }; + index = this._compilations.length; + this._compilations[index] = { + schema: schema, + root: root, + baseId: baseId + }; + return { index: index, compiling: false }; +} + + +/** + * Removes the schema from the currently compiled list + * @this Ajv + * @param {Object} schema schema to compile + * @param {Object} root root object + * @param {String} baseId base schema ID + */ +function endCompiling(schema, root, baseId) { + /* jshint validthis: true */ + var i = compIndex.call(this, schema, root, baseId); + if (i >= 0) this._compilations.splice(i, 1); +} + + +/** + * Index of schema compilation in the currently compiled list + * @this Ajv + * @param {Object} schema schema to compile + * @param {Object} root root object + * @param {String} baseId base schema ID + * @return {Integer} compilation index + */ +function compIndex(schema, root, baseId) { + /* jshint validthis: true */ + for (var i=0; i= 0xD800 && value <= 0xDBFF && pos < len) { + // high surrogate, and there is a next character + value = str.charCodeAt(pos); + if ((value & 0xFC00) == 0xDC00) pos++; // low surrogate + } + } + return length; +}; + + +/***/ }), +/* 655 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +module.exports = function generate_allOf(it, $keyword, $ruleType) { + var out = ' '; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + var $currentBaseId = $it.baseId, + $allSchemasEmpty = true; + var arr1 = $schema; + if (arr1) { + var $sch, $i = -1, + l1 = arr1.length - 1; + while ($i < l1) { + $sch = arr1[$i += 1]; + if (it.util.schemaHasRules($sch, it.RULES.all)) { + $allSchemasEmpty = false; + $it.schema = $sch; + $it.schemaPath = $schemaPath + '[' + $i + ']'; + $it.errSchemaPath = $errSchemaPath + '/' + $i; + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + } + } + if ($breakOnError) { + if ($allSchemasEmpty) { + out += ' if (true) { '; + } else { + out += ' ' + ($closingBraces.slice(0, -1)) + ' '; + } + } + out = it.util.cleanUpCode(out); + return out; +} + + +/***/ }), +/* 656 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +module.exports = function generate_anyOf(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + var $noEmptySchema = $schema.every(function($sch) { + return it.util.schemaHasRules($sch, it.RULES.all); + }); + if ($noEmptySchema) { + var $currentBaseId = $it.baseId; + out += ' var ' + ($errs) + ' = errors; var ' + ($valid) + ' = false; '; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + var arr1 = $schema; + if (arr1) { + var $sch, $i = -1, + l1 = arr1.length - 1; + while ($i < l1) { + $sch = arr1[$i += 1]; + $it.schema = $sch; + $it.schemaPath = $schemaPath + '[' + $i + ']'; + $it.errSchemaPath = $errSchemaPath + '/' + $i; + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + out += ' ' + ($valid) + ' = ' + ($valid) + ' || ' + ($nextValid) + '; if (!' + ($valid) + ') { '; + $closingBraces += '}'; + } + } + it.compositeRule = $it.compositeRule = $wasComposite; + out += ' ' + ($closingBraces) + ' if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('anyOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'should match some schema in anyOf\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError(vErrors); '; + } else { + out += ' validate.errors = vErrors; return false; '; + } + } + out += ' } else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; + if (it.opts.allErrors) { + out += ' } '; + } + out = it.util.cleanUpCode(out); + } else { + if ($breakOnError) { + out += ' if (true) { '; + } + } + return out; +} + + +/***/ }), +/* 657 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +module.exports = function generate_const(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + if (!$isData) { + out += ' var schema' + ($lvl) + ' = validate.schema' + ($schemaPath) + ';'; + } + out += 'var ' + ($valid) + ' = equal(' + ($data) + ', schema' + ($lvl) + '); if (!' + ($valid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('const') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'should be equal to constant\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' }'; + if ($breakOnError) { + out += ' else { '; + } + return out; +} + + +/***/ }), +/* 658 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +module.exports = function generate_contains(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + var $idx = 'i' + $lvl, + $dataNxt = $it.dataLevel = it.dataLevel + 1, + $nextData = 'data' + $dataNxt, + $currentBaseId = it.baseId, + $nonEmptySchema = it.util.schemaHasRules($schema, it.RULES.all); + out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';'; + if ($nonEmptySchema) { + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + out += ' var ' + ($nextValid) + ' = false; for (var ' + ($idx) + ' = 0; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { '; + $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); + var $passData = $data + '[' + $idx + ']'; + $it.dataPathArr[$dataNxt] = $idx; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + out += ' if (' + ($nextValid) + ') break; } '; + it.compositeRule = $it.compositeRule = $wasComposite; + out += ' ' + ($closingBraces) + ' if (!' + ($nextValid) + ') {'; + } else { + out += ' if (' + ($data) + '.length == 0) {'; + } + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('contains') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'should contain a valid item\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } else { '; + if ($nonEmptySchema) { + out += ' errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; + } + if (it.opts.allErrors) { + out += ' } '; + } + out = it.util.cleanUpCode(out); + return out; +} + + +/***/ }), +/* 659 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +module.exports = function generate_custom(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $errorKeyword; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + var $rule = this, + $definition = 'definition' + $lvl, + $rDef = $rule.definition, + $closingBraces = ''; + var $compile, $inline, $macro, $ruleValidate, $validateCode; + if ($isData && $rDef.$data) { + $validateCode = 'keywordValidate' + $lvl; + var $validateSchema = $rDef.validateSchema; + out += ' var ' + ($definition) + ' = RULES.custom[\'' + ($keyword) + '\'].definition; var ' + ($validateCode) + ' = ' + ($definition) + '.validate;'; + } else { + $ruleValidate = it.useCustomRule($rule, $schema, it.schema, it); + if (!$ruleValidate) return; + $schemaValue = 'validate.schema' + $schemaPath; + $validateCode = $ruleValidate.code; + $compile = $rDef.compile; + $inline = $rDef.inline; + $macro = $rDef.macro; + } + var $ruleErrs = $validateCode + '.errors', + $i = 'i' + $lvl, + $ruleErr = 'ruleErr' + $lvl, + $asyncKeyword = $rDef.async; + if ($asyncKeyword && !it.async) throw new Error('async keyword in sync schema'); + if (!($inline || $macro)) { + out += '' + ($ruleErrs) + ' = null;'; + } + out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';'; + if ($isData && $rDef.$data) { + $closingBraces += '}'; + out += ' if (' + ($schemaValue) + ' === undefined) { ' + ($valid) + ' = true; } else { '; + if ($validateSchema) { + $closingBraces += '}'; + out += ' ' + ($valid) + ' = ' + ($definition) + '.validateSchema(' + ($schemaValue) + '); if (' + ($valid) + ') { '; + } + } + if ($inline) { + if ($rDef.statements) { + out += ' ' + ($ruleValidate.validate) + ' '; + } else { + out += ' ' + ($valid) + ' = ' + ($ruleValidate.validate) + '; '; + } + } else if ($macro) { + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + $it.schema = $ruleValidate.validate; + $it.schemaPath = ''; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + var $code = it.validate($it).replace(/validate\.schema/g, $validateCode); + it.compositeRule = $it.compositeRule = $wasComposite; + out += ' ' + ($code); + } else { + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; + out += ' ' + ($validateCode) + '.call( '; + if (it.opts.passContext) { + out += 'this'; + } else { + out += 'self'; + } + if ($compile || $rDef.schema === false) { + out += ' , ' + ($data) + ' '; + } else { + out += ' , ' + ($schemaValue) + ' , ' + ($data) + ' , validate.schema' + (it.schemaPath) + ' '; + } + out += ' , (dataPath || \'\')'; + if (it.errorPath != '""') { + out += ' + ' + (it.errorPath); + } + var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData', + $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty'; + out += ' , ' + ($parentData) + ' , ' + ($parentDataProperty) + ' , rootData ) '; + var def_callRuleValidate = out; + out = $$outStack.pop(); + if ($rDef.errors === false) { + out += ' ' + ($valid) + ' = '; + if ($asyncKeyword) { + out += '' + (it.yieldAwait); + } + out += '' + (def_callRuleValidate) + '; '; + } else { + if ($asyncKeyword) { + $ruleErrs = 'customErrors' + $lvl; + out += ' var ' + ($ruleErrs) + ' = null; try { ' + ($valid) + ' = ' + (it.yieldAwait) + (def_callRuleValidate) + '; } catch (e) { ' + ($valid) + ' = false; if (e instanceof ValidationError) ' + ($ruleErrs) + ' = e.errors; else throw e; } '; + } else { + out += ' ' + ($ruleErrs) + ' = null; ' + ($valid) + ' = ' + (def_callRuleValidate) + '; '; + } + } + } + if ($rDef.modifying) { + out += ' if (' + ($parentData) + ') ' + ($data) + ' = ' + ($parentData) + '[' + ($parentDataProperty) + '];'; + } + out += '' + ($closingBraces); + if ($rDef.valid) { + if ($breakOnError) { + out += ' if (true) { '; + } + } else { + out += ' if ( '; + if ($rDef.valid === undefined) { + out += ' !'; + if ($macro) { + out += '' + ($nextValid); + } else { + out += '' + ($valid); + } + } else { + out += ' ' + (!$rDef.valid) + ' '; + } + out += ') { '; + $errorKeyword = $rule.keyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || 'custom') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { keyword: \'' + ($rule.keyword) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should pass "' + ($rule.keyword) + '" keyword validation\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + var def_customError = out; + out = $$outStack.pop(); + if ($inline) { + if ($rDef.errors) { + if ($rDef.errors != 'full') { + out += ' for (var ' + ($i) + '=' + ($errs) + '; ' + ($i) + '= 0) { + if ($breakOnError) { + out += ' if (true) { '; + } + return out; + } else { + throw new Error('unknown format "' + $schema + '" is used in schema at path "' + it.errSchemaPath + '"'); + } + } + var $isObject = typeof $format == 'object' && !($format instanceof RegExp) && $format.validate; + var $formatType = $isObject && $format.type || 'string'; + if ($isObject) { + var $async = $format.async === true; + $format = $format.validate; + } + if ($formatType != $ruleType) { + if ($breakOnError) { + out += ' if (true) { '; + } + return out; + } + if ($async) { + if (!it.async) throw new Error('async format in sync schema'); + var $formatRef = 'formats' + it.util.getProperty($schema) + '.validate'; + out += ' if (!(' + (it.yieldAwait) + ' ' + ($formatRef) + '(' + ($data) + '))) { '; + } else { + out += ' if (! '; + var $formatRef = 'formats' + it.util.getProperty($schema); + if ($isObject) $formatRef += '.validate'; + if (typeof $format == 'function') { + out += ' ' + ($formatRef) + '(' + ($data) + ') '; + } else { + out += ' ' + ($formatRef) + '.test(' + ($data) + ') '; + } + out += ') { '; + } + } + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('format') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { format: '; + if ($isData) { + out += '' + ($schemaValue); + } else { + out += '' + (it.util.toQuotedString($schema)); + } + out += ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should match format "'; + if ($isData) { + out += '\' + ' + ($schemaValue) + ' + \''; + } else { + out += '' + (it.util.escapeQuotes($schema)); + } + out += '"\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + (it.util.toQuotedString($schema)); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} + + +/***/ }), +/* 663 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +module.exports = function generate_items(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + var $idx = 'i' + $lvl, + $dataNxt = $it.dataLevel = it.dataLevel + 1, + $nextData = 'data' + $dataNxt, + $currentBaseId = it.baseId; + out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';'; + if (Array.isArray($schema)) { + var $additionalItems = it.schema.additionalItems; + if ($additionalItems === false) { + out += ' ' + ($valid) + ' = ' + ($data) + '.length <= ' + ($schema.length) + '; '; + var $currErrSchemaPath = $errSchemaPath; + $errSchemaPath = it.errSchemaPath + '/additionalItems'; + out += ' if (!' + ($valid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('additionalItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schema.length) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT have more than ' + ($schema.length) + ' items\' '; + } + if (it.opts.verbose) { + out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } '; + $errSchemaPath = $currErrSchemaPath; + if ($breakOnError) { + $closingBraces += '}'; + out += ' else { '; + } + } + var arr1 = $schema; + if (arr1) { + var $sch, $i = -1, + l1 = arr1.length - 1; + while ($i < l1) { + $sch = arr1[$i += 1]; + if (it.util.schemaHasRules($sch, it.RULES.all)) { + out += ' ' + ($nextValid) + ' = true; if (' + ($data) + '.length > ' + ($i) + ') { '; + var $passData = $data + '[' + $i + ']'; + $it.schema = $sch; + $it.schemaPath = $schemaPath + '[' + $i + ']'; + $it.errSchemaPath = $errSchemaPath + '/' + $i; + $it.errorPath = it.util.getPathExpr(it.errorPath, $i, it.opts.jsonPointers, true); + $it.dataPathArr[$dataNxt] = $i; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + out += ' } '; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + } + } + if (typeof $additionalItems == 'object' && it.util.schemaHasRules($additionalItems, it.RULES.all)) { + $it.schema = $additionalItems; + $it.schemaPath = it.schemaPath + '.additionalItems'; + $it.errSchemaPath = it.errSchemaPath + '/additionalItems'; + out += ' ' + ($nextValid) + ' = true; if (' + ($data) + '.length > ' + ($schema.length) + ') { for (var ' + ($idx) + ' = ' + ($schema.length) + '; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { '; + $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); + var $passData = $data + '[' + $idx + ']'; + $it.dataPathArr[$dataNxt] = $idx; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + if ($breakOnError) { + out += ' if (!' + ($nextValid) + ') break; '; + } + out += ' } } '; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + } else if (it.util.schemaHasRules($schema, it.RULES.all)) { + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + out += ' for (var ' + ($idx) + ' = ' + (0) + '; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { '; + $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); + var $passData = $data + '[' + $idx + ']'; + $it.dataPathArr[$dataNxt] = $idx; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + if ($breakOnError) { + out += ' if (!' + ($nextValid) + ') break; '; + } + out += ' }'; + } + if ($breakOnError) { + out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {'; + } + out = it.util.cleanUpCode(out); + return out; +} + + +/***/ }), +/* 664 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +module.exports = function generate_multipleOf(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + out += 'var division' + ($lvl) + ';if ('; + if ($isData) { + out += ' ' + ($schemaValue) + ' !== undefined && ( typeof ' + ($schemaValue) + ' != \'number\' || '; + } + out += ' (division' + ($lvl) + ' = ' + ($data) + ' / ' + ($schemaValue) + ', '; + if (it.opts.multipleOfPrecision) { + out += ' Math.abs(Math.round(division' + ($lvl) + ') - division' + ($lvl) + ') > 1e-' + (it.opts.multipleOfPrecision) + ' '; + } else { + out += ' division' + ($lvl) + ' !== parseInt(division' + ($lvl) + ') '; + } + out += ' ) '; + if ($isData) { + out += ' ) '; + } + out += ' ) { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('multipleOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { multipleOf: ' + ($schemaValue) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be multiple of '; + if ($isData) { + out += '\' + ' + ($schemaValue); + } else { + out += '' + ($schemaValue) + '\''; + } + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += '} '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} + + +/***/ }), +/* 665 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +module.exports = function generate_not(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + $it.level++; + var $nextValid = 'valid' + $it.level; + if (it.util.schemaHasRules($schema, it.RULES.all)) { + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + out += ' var ' + ($errs) + ' = errors; '; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + $it.createErrors = false; + var $allErrorsOption; + if ($it.opts.allErrors) { + $allErrorsOption = $it.opts.allErrors; + $it.opts.allErrors = false; + } + out += ' ' + (it.validate($it)) + ' '; + $it.createErrors = true; + if ($allErrorsOption) $it.opts.allErrors = $allErrorsOption; + it.compositeRule = $it.compositeRule = $wasComposite; + out += ' if (' + ($nextValid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('not') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT be valid\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; + if (it.opts.allErrors) { + out += ' } '; + } + } else { + out += ' var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('not') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT be valid\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + if ($breakOnError) { + out += ' if (false) { '; + } + } + return out; +} + + +/***/ }), +/* 666 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +module.exports = function generate_oneOf(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + out += 'var ' + ($errs) + ' = errors;var prevValid' + ($lvl) + ' = false;var ' + ($valid) + ' = false;'; + var $currentBaseId = $it.baseId; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + var arr1 = $schema; + if (arr1) { + var $sch, $i = -1, + l1 = arr1.length - 1; + while ($i < l1) { + $sch = arr1[$i += 1]; + if (it.util.schemaHasRules($sch, it.RULES.all)) { + $it.schema = $sch; + $it.schemaPath = $schemaPath + '[' + $i + ']'; + $it.errSchemaPath = $errSchemaPath + '/' + $i; + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + } else { + out += ' var ' + ($nextValid) + ' = true; '; + } + if ($i) { + out += ' if (' + ($nextValid) + ' && prevValid' + ($lvl) + ') ' + ($valid) + ' = false; else { '; + $closingBraces += '}'; + } + out += ' if (' + ($nextValid) + ') ' + ($valid) + ' = prevValid' + ($lvl) + ' = true;'; + } + } + it.compositeRule = $it.compositeRule = $wasComposite; + out += '' + ($closingBraces) + 'if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('oneOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'should match exactly one schema in oneOf\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError(vErrors); '; + } else { + out += ' validate.errors = vErrors; return false; '; + } + } + out += '} else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; }'; + if (it.opts.allErrors) { + out += ' } '; + } + return out; +} + + +/***/ }), +/* 667 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +module.exports = function generate_pattern(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + var $regexp = $isData ? '(new RegExp(' + $schemaValue + '))' : it.usePattern($schema); + out += 'if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'string\') || '; + } + out += ' !' + ($regexp) + '.test(' + ($data) + ') ) { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('pattern') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { pattern: '; + if ($isData) { + out += '' + ($schemaValue); + } else { + out += '' + (it.util.toQuotedString($schema)); + } + out += ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should match pattern "'; + if ($isData) { + out += '\' + ' + ($schemaValue) + ' + \''; + } else { + out += '' + (it.util.escapeQuotes($schema)); + } + out += '"\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + (it.util.toQuotedString($schema)); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += '} '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} + + +/***/ }), +/* 668 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +module.exports = function generate_properties(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + var $key = 'key' + $lvl, + $idx = 'idx' + $lvl, + $dataNxt = $it.dataLevel = it.dataLevel + 1, + $nextData = 'data' + $dataNxt, + $dataProperties = 'dataProperties' + $lvl; + var $schemaKeys = Object.keys($schema || {}), + $pProperties = it.schema.patternProperties || {}, + $pPropertyKeys = Object.keys($pProperties), + $aProperties = it.schema.additionalProperties, + $someProperties = $schemaKeys.length || $pPropertyKeys.length, + $noAdditional = $aProperties === false, + $additionalIsSchema = typeof $aProperties == 'object' && Object.keys($aProperties).length, + $removeAdditional = it.opts.removeAdditional, + $checkAdditional = $noAdditional || $additionalIsSchema || $removeAdditional, + $ownProperties = it.opts.ownProperties, + $currentBaseId = it.baseId; + var $required = it.schema.required; + if ($required && !(it.opts.v5 && $required.$data) && $required.length < it.opts.loopRequired) var $requiredHash = it.util.toHash($required); + if (it.opts.patternGroups) { + var $pgProperties = it.schema.patternGroups || {}, + $pgPropertyKeys = Object.keys($pgProperties); + } + out += 'var ' + ($errs) + ' = errors;var ' + ($nextValid) + ' = true;'; + if ($ownProperties) { + out += ' var ' + ($dataProperties) + ' = undefined;'; + } + if ($checkAdditional) { + if ($ownProperties) { + out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; + } else { + out += ' for (var ' + ($key) + ' in ' + ($data) + ') { '; + } + if ($someProperties) { + out += ' var isAdditional' + ($lvl) + ' = !(false '; + if ($schemaKeys.length) { + if ($schemaKeys.length > 5) { + out += ' || validate.schema' + ($schemaPath) + '[' + ($key) + '] '; + } else { + var arr1 = $schemaKeys; + if (arr1) { + var $propertyKey, i1 = -1, + l1 = arr1.length - 1; + while (i1 < l1) { + $propertyKey = arr1[i1 += 1]; + out += ' || ' + ($key) + ' == ' + (it.util.toQuotedString($propertyKey)) + ' '; + } + } + } + } + if ($pPropertyKeys.length) { + var arr2 = $pPropertyKeys; + if (arr2) { + var $pProperty, $i = -1, + l2 = arr2.length - 1; + while ($i < l2) { + $pProperty = arr2[$i += 1]; + out += ' || ' + (it.usePattern($pProperty)) + '.test(' + ($key) + ') '; + } + } + } + if (it.opts.patternGroups && $pgPropertyKeys.length) { + var arr3 = $pgPropertyKeys; + if (arr3) { + var $pgProperty, $i = -1, + l3 = arr3.length - 1; + while ($i < l3) { + $pgProperty = arr3[$i += 1]; + out += ' || ' + (it.usePattern($pgProperty)) + '.test(' + ($key) + ') '; + } + } + } + out += ' ); if (isAdditional' + ($lvl) + ') { '; + } + if ($removeAdditional == 'all') { + out += ' delete ' + ($data) + '[' + ($key) + ']; '; + } else { + var $currentErrorPath = it.errorPath; + var $additionalProperty = '\' + ' + $key + ' + \''; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); + } + if ($noAdditional) { + if ($removeAdditional) { + out += ' delete ' + ($data) + '[' + ($key) + ']; '; + } else { + out += ' ' + ($nextValid) + ' = false; '; + var $currErrSchemaPath = $errSchemaPath; + $errSchemaPath = it.errSchemaPath + '/additionalProperties'; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('additionalProperties') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { additionalProperty: \'' + ($additionalProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT have additional properties\' '; + } + if (it.opts.verbose) { + out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + $errSchemaPath = $currErrSchemaPath; + if ($breakOnError) { + out += ' break; '; + } + } + } else if ($additionalIsSchema) { + if ($removeAdditional == 'failing') { + out += ' var ' + ($errs) + ' = errors; '; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + $it.schema = $aProperties; + $it.schemaPath = it.schemaPath + '.additionalProperties'; + $it.errSchemaPath = it.errSchemaPath + '/additionalProperties'; + $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); + var $passData = $data + '[' + $key + ']'; + $it.dataPathArr[$dataNxt] = $key; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + out += ' if (!' + ($nextValid) + ') { errors = ' + ($errs) + '; if (validate.errors !== null) { if (errors) validate.errors.length = errors; else validate.errors = null; } delete ' + ($data) + '[' + ($key) + ']; } '; + it.compositeRule = $it.compositeRule = $wasComposite; + } else { + $it.schema = $aProperties; + $it.schemaPath = it.schemaPath + '.additionalProperties'; + $it.errSchemaPath = it.errSchemaPath + '/additionalProperties'; + $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); + var $passData = $data + '[' + $key + ']'; + $it.dataPathArr[$dataNxt] = $key; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + if ($breakOnError) { + out += ' if (!' + ($nextValid) + ') break; '; + } + } + } + it.errorPath = $currentErrorPath; + } + if ($someProperties) { + out += ' } '; + } + out += ' } '; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + var $useDefaults = it.opts.useDefaults && !it.compositeRule; + if ($schemaKeys.length) { + var arr4 = $schemaKeys; + if (arr4) { + var $propertyKey, i4 = -1, + l4 = arr4.length - 1; + while (i4 < l4) { + $propertyKey = arr4[i4 += 1]; + var $sch = $schema[$propertyKey]; + if (it.util.schemaHasRules($sch, it.RULES.all)) { + var $prop = it.util.getProperty($propertyKey), + $passData = $data + $prop, + $hasDefault = $useDefaults && $sch.default !== undefined; + $it.schema = $sch; + $it.schemaPath = $schemaPath + $prop; + $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($propertyKey); + $it.errorPath = it.util.getPath(it.errorPath, $propertyKey, it.opts.jsonPointers); + $it.dataPathArr[$dataNxt] = it.util.toQuotedString($propertyKey); + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + $code = it.util.varReplace($code, $nextData, $passData); + var $useData = $passData; + } else { + var $useData = $nextData; + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; '; + } + if ($hasDefault) { + out += ' ' + ($code) + ' '; + } else { + if ($requiredHash && $requiredHash[$propertyKey]) { + out += ' if ( ' + ($useData) + ' === undefined '; + if ($ownProperties) { + out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; + } + out += ') { ' + ($nextValid) + ' = false; '; + var $currentErrorPath = it.errorPath, + $currErrSchemaPath = $errSchemaPath, + $missingProperty = it.util.escapeQuotes($propertyKey); + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers); + } + $errSchemaPath = it.errSchemaPath + '/required'; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + $errSchemaPath = $currErrSchemaPath; + it.errorPath = $currentErrorPath; + out += ' } else { '; + } else { + if ($breakOnError) { + out += ' if ( ' + ($useData) + ' === undefined '; + if ($ownProperties) { + out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; + } + out += ') { ' + ($nextValid) + ' = true; } else { '; + } else { + out += ' if (' + ($useData) + ' !== undefined '; + if ($ownProperties) { + out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; + } + out += ' ) { '; + } + } + out += ' ' + ($code) + ' } '; + } + } + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + } + } + if ($pPropertyKeys.length) { + var arr5 = $pPropertyKeys; + if (arr5) { + var $pProperty, i5 = -1, + l5 = arr5.length - 1; + while (i5 < l5) { + $pProperty = arr5[i5 += 1]; + var $sch = $pProperties[$pProperty]; + if (it.util.schemaHasRules($sch, it.RULES.all)) { + $it.schema = $sch; + $it.schemaPath = it.schemaPath + '.patternProperties' + it.util.getProperty($pProperty); + $it.errSchemaPath = it.errSchemaPath + '/patternProperties/' + it.util.escapeFragment($pProperty); + if ($ownProperties) { + out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; + } else { + out += ' for (var ' + ($key) + ' in ' + ($data) + ') { '; + } + out += ' if (' + (it.usePattern($pProperty)) + '.test(' + ($key) + ')) { '; + $it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); + var $passData = $data + '[' + $key + ']'; + $it.dataPathArr[$dataNxt] = $key; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + if ($breakOnError) { + out += ' if (!' + ($nextValid) + ') break; '; + } + out += ' } '; + if ($breakOnError) { + out += ' else ' + ($nextValid) + ' = true; '; + } + out += ' } '; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + } + } + } + if (it.opts.patternGroups && $pgPropertyKeys.length) { + var arr6 = $pgPropertyKeys; + if (arr6) { + var $pgProperty, i6 = -1, + l6 = arr6.length - 1; + while (i6 < l6) { + $pgProperty = arr6[i6 += 1]; + var $pgSchema = $pgProperties[$pgProperty], + $sch = $pgSchema.schema; + if (it.util.schemaHasRules($sch, it.RULES.all)) { + $it.schema = $sch; + $it.schemaPath = it.schemaPath + '.patternGroups' + it.util.getProperty($pgProperty) + '.schema'; + $it.errSchemaPath = it.errSchemaPath + '/patternGroups/' + it.util.escapeFragment($pgProperty) + '/schema'; + out += ' var pgPropCount' + ($lvl) + ' = 0; '; + if ($ownProperties) { + out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; + } else { + out += ' for (var ' + ($key) + ' in ' + ($data) + ') { '; + } + out += ' if (' + (it.usePattern($pgProperty)) + '.test(' + ($key) + ')) { pgPropCount' + ($lvl) + '++; '; + $it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); + var $passData = $data + '[' + $key + ']'; + $it.dataPathArr[$dataNxt] = $key; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + if ($breakOnError) { + out += ' if (!' + ($nextValid) + ') break; '; + } + out += ' } '; + if ($breakOnError) { + out += ' else ' + ($nextValid) + ' = true; '; + } + out += ' } '; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + var $pgMin = $pgSchema.minimum, + $pgMax = $pgSchema.maximum; + if ($pgMin !== undefined || $pgMax !== undefined) { + out += ' var ' + ($valid) + ' = true; '; + var $currErrSchemaPath = $errSchemaPath; + if ($pgMin !== undefined) { + var $limit = $pgMin, + $reason = 'minimum', + $moreOrLess = 'less'; + out += ' ' + ($valid) + ' = pgPropCount' + ($lvl) + ' >= ' + ($pgMin) + '; '; + $errSchemaPath = it.errSchemaPath + '/patternGroups/minimum'; + out += ' if (!' + ($valid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('patternGroups') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { reason: \'' + ($reason) + '\', limit: ' + ($limit) + ', pattern: \'' + (it.util.escapeQuotes($pgProperty)) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT have ' + ($moreOrLess) + ' than ' + ($limit) + ' properties matching pattern "' + (it.util.escapeQuotes($pgProperty)) + '"\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } '; + if ($pgMax !== undefined) { + out += ' else '; + } + } + if ($pgMax !== undefined) { + var $limit = $pgMax, + $reason = 'maximum', + $moreOrLess = 'more'; + out += ' ' + ($valid) + ' = pgPropCount' + ($lvl) + ' <= ' + ($pgMax) + '; '; + $errSchemaPath = it.errSchemaPath + '/patternGroups/maximum'; + out += ' if (!' + ($valid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('patternGroups') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { reason: \'' + ($reason) + '\', limit: ' + ($limit) + ', pattern: \'' + (it.util.escapeQuotes($pgProperty)) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT have ' + ($moreOrLess) + ' than ' + ($limit) + ' properties matching pattern "' + (it.util.escapeQuotes($pgProperty)) + '"\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } '; + } + $errSchemaPath = $currErrSchemaPath; + if ($breakOnError) { + out += ' if (' + ($valid) + ') { '; + $closingBraces += '}'; + } + } + } + } + } + } + if ($breakOnError) { + out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {'; + } + out = it.util.cleanUpCode(out); + return out; +} + + +/***/ }), +/* 669 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +module.exports = function generate_propertyNames(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + if (it.util.schemaHasRules($schema, it.RULES.all)) { + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + var $key = 'key' + $lvl, + $idx = 'idx' + $lvl, + $i = 'i' + $lvl, + $invalidName = '\' + ' + $key + ' + \'', + $dataNxt = $it.dataLevel = it.dataLevel + 1, + $nextData = 'data' + $dataNxt, + $dataProperties = 'dataProperties' + $lvl, + $ownProperties = it.opts.ownProperties, + $currentBaseId = it.baseId; + out += ' var ' + ($errs) + ' = errors; '; + if ($ownProperties) { + out += ' var ' + ($dataProperties) + ' = undefined; '; + } + if ($ownProperties) { + out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; + } else { + out += ' for (var ' + ($key) + ' in ' + ($data) + ') { '; + } + out += ' var startErrs' + ($lvl) + ' = errors; '; + var $passData = $key; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + it.compositeRule = $it.compositeRule = $wasComposite; + out += ' if (!' + ($nextValid) + ') { for (var ' + ($i) + '=startErrs' + ($lvl) + '; ' + ($i) + '= it.opts.loopRequired, + $ownProperties = it.opts.ownProperties; + if ($breakOnError) { + out += ' var missing' + ($lvl) + '; '; + if ($loopRequired) { + if (!$isData) { + out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + '; '; + } + var $i = 'i' + $lvl, + $propertyPath = 'schema' + $lvl + '[' + $i + ']', + $missingProperty = '\' + ' + $propertyPath + ' + \''; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers); + } + out += ' var ' + ($valid) + ' = true; '; + if ($isData) { + out += ' if (schema' + ($lvl) + ' === undefined) ' + ($valid) + ' = true; else if (!Array.isArray(schema' + ($lvl) + ')) ' + ($valid) + ' = false; else {'; + } + out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { ' + ($valid) + ' = ' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] !== undefined '; + if ($ownProperties) { + out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + ']) '; + } + out += '; if (!' + ($valid) + ') break; } '; + if ($isData) { + out += ' } '; + } + out += ' if (!' + ($valid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } else { '; + } else { + out += ' if ( '; + var arr2 = $required; + if (arr2) { + var $propertyKey, $i = -1, + l2 = arr2.length - 1; + while ($i < l2) { + $propertyKey = arr2[$i += 1]; + if ($i) { + out += ' || '; + } + var $prop = it.util.getProperty($propertyKey), + $useData = $data + $prop; + out += ' ( ( ' + ($useData) + ' === undefined '; + if ($ownProperties) { + out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; + } + out += ') && (missing' + ($lvl) + ' = ' + (it.util.toQuotedString(it.opts.jsonPointers ? $propertyKey : $prop)) + ') ) '; + } + } + out += ') { '; + var $propertyPath = 'missing' + $lvl, + $missingProperty = '\' + ' + $propertyPath + ' + \''; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.opts.jsonPointers ? it.util.getPathExpr($currentErrorPath, $propertyPath, true) : $currentErrorPath + ' + ' + $propertyPath; + } + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } else { '; + } + } else { + if ($loopRequired) { + if (!$isData) { + out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + '; '; + } + var $i = 'i' + $lvl, + $propertyPath = 'schema' + $lvl + '[' + $i + ']', + $missingProperty = '\' + ' + $propertyPath + ' + \''; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers); + } + if ($isData) { + out += ' if (' + ($vSchema) + ' && !Array.isArray(' + ($vSchema) + ')) { var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else if (' + ($vSchema) + ' !== undefined) { '; + } + out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { if (' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] === undefined '; + if ($ownProperties) { + out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + ']) '; + } + out += ') { var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } '; + if ($isData) { + out += ' } '; + } + } else { + var arr3 = $required; + if (arr3) { + var $propertyKey, i3 = -1, + l3 = arr3.length - 1; + while (i3 < l3) { + $propertyKey = arr3[i3 += 1]; + var $prop = it.util.getProperty($propertyKey), + $missingProperty = it.util.escapeQuotes($propertyKey), + $useData = $data + $prop; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers); + } + out += ' if ( ' + ($useData) + ' === undefined '; + if ($ownProperties) { + out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; + } + out += ') { var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } '; + } + } + } + } + it.errorPath = $currentErrorPath; + } else if ($breakOnError) { + out += ' if (true) {'; + } + return out; +} + + +/***/ }), +/* 672 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +module.exports = function generate_uniqueItems(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + if (($schema || $isData) && it.opts.uniqueItems !== false) { + if ($isData) { + out += ' var ' + ($valid) + '; if (' + ($schemaValue) + ' === false || ' + ($schemaValue) + ' === undefined) ' + ($valid) + ' = true; else if (typeof ' + ($schemaValue) + ' != \'boolean\') ' + ($valid) + ' = false; else { '; + } + out += ' var ' + ($valid) + ' = true; if (' + ($data) + '.length > 1) { var i = ' + ($data) + '.length, j; outer: for (;i--;) { for (j = i; j--;) { if (equal(' + ($data) + '[i], ' + ($data) + '[j])) { ' + ($valid) + ' = false; break outer; } } } } '; + if ($isData) { + out += ' } '; + } + out += ' if (!' + ($valid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('uniqueItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { i: i, j: j } '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT have duplicate items (items ## \' + j + \' and \' + i + \' are identical)\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } '; + if ($breakOnError) { + out += ' else { '; + } + } else { + if ($breakOnError) { + out += ' if (true) { '; + } + } + return out; +} + + +/***/ }), +/* 673 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var IDENTIFIER = /^[a-z_$][a-z0-9_$-]*$/i; +var customRuleCode = __webpack_require__(659); + +module.exports = { + add: addKeyword, + get: getKeyword, + remove: removeKeyword +}; + +/** + * Define custom keyword + * @this Ajv + * @param {String} keyword custom keyword, should be unique (including different from all standard, custom and macro keywords). + * @param {Object} definition keyword definition object with properties `type` (type(s) which the keyword applies to), `validate` or `compile`. + * @return {Ajv} this for method chaining + */ +function addKeyword(keyword, definition) { + /* jshint validthis: true */ + /* eslint no-shadow: 0 */ + var RULES = this.RULES; + + if (RULES.keywords[keyword]) + throw new Error('Keyword ' + keyword + ' is already defined'); + + if (!IDENTIFIER.test(keyword)) + throw new Error('Keyword ' + keyword + ' is not a valid identifier'); + + if (definition) { + if (definition.macro && definition.valid !== undefined) + throw new Error('"valid" option cannot be used with macro keywords'); + + var dataType = definition.type; + if (Array.isArray(dataType)) { + var i, len = dataType.length; + for (i=0; i from( - runAsync(question.when)(answers).then(conditions => { - if (conditions) { + runAsync(question.when)(answers).then(shouldRun => { + if (shouldRun) { return question; } }) @@ -117368,7 +117505,7 @@ module.exports = PromptUI; var _ = __webpack_require__(38); var util = __webpack_require__(394); -var cliWidth = __webpack_require__(606); +var cliWidth = __webpack_require__(574); var stripAnsi = __webpack_require__(329); var stringWidth = __webpack_require__(728); @@ -117512,8 +117649,8 @@ module.exports = ScreenManager; "use strict"; var _ = __webpack_require__(38); -var { from, of } = __webpack_require__(182); -var runAsync = __webpack_require__(181); +var { from, of } = __webpack_require__(183); +var runAsync = __webpack_require__(182); /** * Resolve a question property value if it is passed as a function. @@ -119320,7 +119457,7 @@ module.exports = function() { /***/ (function(module, exports, __webpack_require__) { -var fs = __webpack_require__(5); +var fs = __webpack_require__(4); var utf8 = __webpack_require__(703), unicode = __webpack_require__(702), @@ -119671,7 +119808,7 @@ exports.RemoveFileError = RemoveFileError; Object.defineProperty(exports, "__esModule", { value: true }); var chardet_1 = __webpack_require__(704); var child_process_1 = __webpack_require__(331); -var fs_1 = __webpack_require__(5); +var fs_1 = __webpack_require__(4); var iconv_lite_1 = __webpack_require__(726); var tmp_1 = __webpack_require__(954); var CreateFileError_1 = __webpack_require__(705); @@ -123033,280 +123170,280 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ /* 744 */ /***/ (function(module, exports, __webpack_require__) { -var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/** - * JSONSchema Validator - Validates JavaScript objects using JSON Schemas - * (http://www.json.com/json-schema-proposal/) - * - * Copyright (c) 2007 Kris Zyp SitePen (www.sitepen.com) - * Licensed under the MIT (MIT-LICENSE.txt) license. -To use the validator call the validate function with an instance object and an optional schema object. -If a schema is provided, it will be used to validate. If the instance object refers to a schema (self-validating), -that schema will be used to validate and the schema parameter is not necessary (if both exist, -both validations will occur). -The validate method will return an array of validation errors. If there are no errors, then an -empty list will be returned. A validation error will have two properties: -"property" which indicates which property had the error -"message" which indicates what the error was - */ -(function (root, factory) { - if (true) { - // AMD. Register as an anonymous module. - !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function () { - return factory(); +var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/** + * JSONSchema Validator - Validates JavaScript objects using JSON Schemas + * (http://www.json.com/json-schema-proposal/) + * + * Copyright (c) 2007 Kris Zyp SitePen (www.sitepen.com) + * Licensed under the MIT (MIT-LICENSE.txt) license. +To use the validator call the validate function with an instance object and an optional schema object. +If a schema is provided, it will be used to validate. If the instance object refers to a schema (self-validating), +that schema will be used to validate and the schema parameter is not necessary (if both exist, +both validations will occur). +The validate method will return an array of validation errors. If there are no errors, then an +empty list will be returned. A validation error will have two properties: +"property" which indicates which property had the error +"message" which indicates what the error was + */ +(function (root, factory) { + if (true) { + // AMD. Register as an anonymous module. + !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function () { + return factory(); }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), - __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); - } else if (typeof module === 'object' && module.exports) { - // Node. Does not work with strict CommonJS, but - // only CommonJS-like environments that support module.exports, - // like Node. - module.exports = factory(); - } else { - // Browser globals - root.jsonSchema = factory(); - } -}(this, function () {// setup primitive classes to be JSON Schema types -var exports = validate -exports.Integer = {type:"integer"}; -var primitiveConstructors = { - String: String, - Boolean: Boolean, - Number: Number, - Object: Object, - Array: Array, - Date: Date -} -exports.validate = validate; -function validate(/*Any*/instance,/*Object*/schema) { - // Summary: - // To use the validator call JSONSchema.validate with an instance object and an optional schema object. - // If a schema is provided, it will be used to validate. If the instance object refers to a schema (self-validating), - // that schema will be used to validate and the schema parameter is not necessary (if both exist, - // both validations will occur). - // The validate method will return an object with two properties: - // valid: A boolean indicating if the instance is valid by the schema - // errors: An array of validation errors. If there are no errors, then an - // empty list will be returned. A validation error will have two properties: - // property: which indicates which property had the error - // message: which indicates what the error was - // - return validate(instance, schema, {changing: false});//, coerce: false, existingOnly: false}); - }; -exports.checkPropertyChange = function(/*Any*/value,/*Object*/schema, /*String*/property) { - // Summary: - // The checkPropertyChange method will check to see if an value can legally be in property with the given schema - // This is slightly different than the validate method in that it will fail if the schema is readonly and it will - // not check for self-validation, it is assumed that the passed in value is already internally valid. - // The checkPropertyChange method will return the same object type as validate, see JSONSchema.validate for - // information. - // - return validate(value, schema, {changing: property || "property"}); - }; -var validate = exports._validate = function(/*Any*/instance,/*Object*/schema,/*Object*/options) { - - if (!options) options = {}; - var _changing = options.changing; - - function getType(schema){ - return schema.type || (primitiveConstructors[schema.name] == schema && schema.name.toLowerCase()); - } - var errors = []; - // validate a value against a property definition - function checkProp(value, schema, path,i){ - - var l; - path += path ? typeof i == 'number' ? '[' + i + ']' : typeof i == 'undefined' ? '' : '.' + i : i; - function addError(message){ - errors.push({property:path,message:message}); - } - - if((typeof schema != 'object' || schema instanceof Array) && (path || typeof schema != 'function') && !(schema && getType(schema))){ - if(typeof schema == 'function'){ - if(!(value instanceof schema)){ - addError("is not an instance of the class/constructor " + schema.name); - } - }else if(schema){ - addError("Invalid schema/property definition " + schema); - } - return null; - } - if(_changing && schema.readonly){ - addError("is a readonly field, it can not be changed"); - } - if(schema['extends']){ // if it extends another schema, it must pass that schema as well - checkProp(value,schema['extends'],path,i); - } - // validate a value against a type definition - function checkType(type,value){ - if(type){ - if(typeof type == 'string' && type != 'any' && - (type == 'null' ? value !== null : typeof value != type) && - !(value instanceof Array && type == 'array') && - !(value instanceof Date && type == 'date') && - !(type == 'integer' && value%1===0)){ - return [{property:path,message:(typeof value) + " value found, but a " + type + " is required"}]; - } - if(type instanceof Array){ - var unionErrors=[]; - for(var j = 0; j < type.length; j++){ // a union type - if(!(unionErrors=checkType(type[j],value)).length){ - break; - } - } - if(unionErrors.length){ - return unionErrors; - } - }else if(typeof type == 'object'){ - var priorErrors = errors; - errors = []; - checkProp(value,type,path); - var theseErrors = errors; - errors = priorErrors; - return theseErrors; - } - } - return []; - } - if(value === undefined){ - if(schema.required){ - addError("is missing and it is required"); - } - }else{ - errors = errors.concat(checkType(getType(schema),value)); - if(schema.disallow && !checkType(schema.disallow,value).length){ - addError(" disallowed value was matched"); - } - if(value !== null){ - if(value instanceof Array){ - if(schema.items){ - var itemsIsArray = schema.items instanceof Array; - var propDef = schema.items; - for (i = 0, l = value.length; i < l; i += 1) { - if (itemsIsArray) - propDef = schema.items[i]; - if (options.coerce) - value[i] = options.coerce(value[i], propDef); - errors.concat(checkProp(value[i],propDef,path,i)); - } - } - if(schema.minItems && value.length < schema.minItems){ - addError("There must be a minimum of " + schema.minItems + " in the array"); - } - if(schema.maxItems && value.length > schema.maxItems){ - addError("There must be a maximum of " + schema.maxItems + " in the array"); - } - }else if(schema.properties || schema.additionalProperties){ - errors.concat(checkObj(value, schema.properties, path, schema.additionalProperties)); - } - if(schema.pattern && typeof value == 'string' && !value.match(schema.pattern)){ - addError("does not match the regex pattern " + schema.pattern); - } - if(schema.maxLength && typeof value == 'string' && value.length > schema.maxLength){ - addError("may only be " + schema.maxLength + " characters long"); - } - if(schema.minLength && typeof value == 'string' && value.length < schema.minLength){ - addError("must be at least " + schema.minLength + " characters long"); - } - if(typeof schema.minimum !== undefined && typeof value == typeof schema.minimum && - schema.minimum > value){ - addError("must have a minimum value of " + schema.minimum); - } - if(typeof schema.maximum !== undefined && typeof value == typeof schema.maximum && - schema.maximum < value){ - addError("must have a maximum value of " + schema.maximum); - } - if(schema['enum']){ - var enumer = schema['enum']; - l = enumer.length; - var found; - for(var j = 0; j < l; j++){ - if(enumer[j]===value){ - found=1; - break; - } - } - if(!found){ - addError("does not have a value in the enumeration " + enumer.join(", ")); - } - } - if(typeof schema.maxDecimal == 'number' && - (value.toString().match(new RegExp("\\.[0-9]{" + (schema.maxDecimal + 1) + ",}")))){ - addError("may only have " + schema.maxDecimal + " digits of decimal places"); - } - } - } - return null; - } - // validate an object against a schema - function checkObj(instance,objTypeDef,path,additionalProp){ - - if(typeof objTypeDef =='object'){ - if(typeof instance != 'object' || instance instanceof Array){ - errors.push({property:path,message:"an object is required"}); - } - - for(var i in objTypeDef){ - if(objTypeDef.hasOwnProperty(i)){ - var value = instance[i]; - // skip _not_ specified properties - if (value === undefined && options.existingOnly) continue; - var propDef = objTypeDef[i]; - // set default - if(value === undefined && propDef["default"]){ - value = instance[i] = propDef["default"]; - } - if(options.coerce && i in instance){ - value = instance[i] = options.coerce(value, propDef); - } - checkProp(value,propDef,path,i); - } - } - } - for(i in instance){ - if(instance.hasOwnProperty(i) && !(i.charAt(0) == '_' && i.charAt(1) == '_') && objTypeDef && !objTypeDef[i] && additionalProp===false){ - if (options.filter) { - delete instance[i]; - continue; - } else { - errors.push({property:path,message:(typeof value) + "The property " + i + - " is not defined in the schema and the schema does not allow additional properties"}); - } - } - var requires = objTypeDef && objTypeDef[i] && objTypeDef[i].requires; - if(requires && !(requires in instance)){ - errors.push({property:path,message:"the presence of the property " + i + " requires that " + requires + " also be present"}); - } - value = instance[i]; - if(additionalProp && (!(objTypeDef && typeof objTypeDef == 'object') || !(i in objTypeDef))){ - if(options.coerce){ - value = instance[i] = options.coerce(value, additionalProp); - } - checkProp(value,additionalProp,path,i); - } - if(!_changing && value && value.$schema){ - errors = errors.concat(checkProp(value,value.$schema,path,i)); - } - } - return errors; - } - if(schema){ - checkProp(instance,schema,'',_changing || ''); - } - if(!_changing && instance && instance.$schema){ - checkProp(instance,instance.$schema,'',''); - } - return {valid:!errors.length,errors:errors}; -}; -exports.mustBeValid = function(result){ - // summary: - // This checks to ensure that the result is valid and will throw an appropriate error message if it is not - // result: the result returned from checkPropertyChange or validate - if(!result.valid){ - throw new TypeError(result.errors.map(function(error){return "for property " + error.property + ': ' + error.message;}).join(", \n")); - } -} - -return exports; -})); + __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + } else if (typeof module === 'object' && module.exports) { + // Node. Does not work with strict CommonJS, but + // only CommonJS-like environments that support module.exports, + // like Node. + module.exports = factory(); + } else { + // Browser globals + root.jsonSchema = factory(); + } +}(this, function () {// setup primitive classes to be JSON Schema types +var exports = validate +exports.Integer = {type:"integer"}; +var primitiveConstructors = { + String: String, + Boolean: Boolean, + Number: Number, + Object: Object, + Array: Array, + Date: Date +} +exports.validate = validate; +function validate(/*Any*/instance,/*Object*/schema) { + // Summary: + // To use the validator call JSONSchema.validate with an instance object and an optional schema object. + // If a schema is provided, it will be used to validate. If the instance object refers to a schema (self-validating), + // that schema will be used to validate and the schema parameter is not necessary (if both exist, + // both validations will occur). + // The validate method will return an object with two properties: + // valid: A boolean indicating if the instance is valid by the schema + // errors: An array of validation errors. If there are no errors, then an + // empty list will be returned. A validation error will have two properties: + // property: which indicates which property had the error + // message: which indicates what the error was + // + return validate(instance, schema, {changing: false});//, coerce: false, existingOnly: false}); + }; +exports.checkPropertyChange = function(/*Any*/value,/*Object*/schema, /*String*/property) { + // Summary: + // The checkPropertyChange method will check to see if an value can legally be in property with the given schema + // This is slightly different than the validate method in that it will fail if the schema is readonly and it will + // not check for self-validation, it is assumed that the passed in value is already internally valid. + // The checkPropertyChange method will return the same object type as validate, see JSONSchema.validate for + // information. + // + return validate(value, schema, {changing: property || "property"}); + }; +var validate = exports._validate = function(/*Any*/instance,/*Object*/schema,/*Object*/options) { + + if (!options) options = {}; + var _changing = options.changing; + + function getType(schema){ + return schema.type || (primitiveConstructors[schema.name] == schema && schema.name.toLowerCase()); + } + var errors = []; + // validate a value against a property definition + function checkProp(value, schema, path,i){ + + var l; + path += path ? typeof i == 'number' ? '[' + i + ']' : typeof i == 'undefined' ? '' : '.' + i : i; + function addError(message){ + errors.push({property:path,message:message}); + } + + if((typeof schema != 'object' || schema instanceof Array) && (path || typeof schema != 'function') && !(schema && getType(schema))){ + if(typeof schema == 'function'){ + if(!(value instanceof schema)){ + addError("is not an instance of the class/constructor " + schema.name); + } + }else if(schema){ + addError("Invalid schema/property definition " + schema); + } + return null; + } + if(_changing && schema.readonly){ + addError("is a readonly field, it can not be changed"); + } + if(schema['extends']){ // if it extends another schema, it must pass that schema as well + checkProp(value,schema['extends'],path,i); + } + // validate a value against a type definition + function checkType(type,value){ + if(type){ + if(typeof type == 'string' && type != 'any' && + (type == 'null' ? value !== null : typeof value != type) && + !(value instanceof Array && type == 'array') && + !(value instanceof Date && type == 'date') && + !(type == 'integer' && value%1===0)){ + return [{property:path,message:(typeof value) + " value found, but a " + type + " is required"}]; + } + if(type instanceof Array){ + var unionErrors=[]; + for(var j = 0; j < type.length; j++){ // a union type + if(!(unionErrors=checkType(type[j],value)).length){ + break; + } + } + if(unionErrors.length){ + return unionErrors; + } + }else if(typeof type == 'object'){ + var priorErrors = errors; + errors = []; + checkProp(value,type,path); + var theseErrors = errors; + errors = priorErrors; + return theseErrors; + } + } + return []; + } + if(value === undefined){ + if(schema.required){ + addError("is missing and it is required"); + } + }else{ + errors = errors.concat(checkType(getType(schema),value)); + if(schema.disallow && !checkType(schema.disallow,value).length){ + addError(" disallowed value was matched"); + } + if(value !== null){ + if(value instanceof Array){ + if(schema.items){ + var itemsIsArray = schema.items instanceof Array; + var propDef = schema.items; + for (i = 0, l = value.length; i < l; i += 1) { + if (itemsIsArray) + propDef = schema.items[i]; + if (options.coerce) + value[i] = options.coerce(value[i], propDef); + errors.concat(checkProp(value[i],propDef,path,i)); + } + } + if(schema.minItems && value.length < schema.minItems){ + addError("There must be a minimum of " + schema.minItems + " in the array"); + } + if(schema.maxItems && value.length > schema.maxItems){ + addError("There must be a maximum of " + schema.maxItems + " in the array"); + } + }else if(schema.properties || schema.additionalProperties){ + errors.concat(checkObj(value, schema.properties, path, schema.additionalProperties)); + } + if(schema.pattern && typeof value == 'string' && !value.match(schema.pattern)){ + addError("does not match the regex pattern " + schema.pattern); + } + if(schema.maxLength && typeof value == 'string' && value.length > schema.maxLength){ + addError("may only be " + schema.maxLength + " characters long"); + } + if(schema.minLength && typeof value == 'string' && value.length < schema.minLength){ + addError("must be at least " + schema.minLength + " characters long"); + } + if(typeof schema.minimum !== undefined && typeof value == typeof schema.minimum && + schema.minimum > value){ + addError("must have a minimum value of " + schema.minimum); + } + if(typeof schema.maximum !== undefined && typeof value == typeof schema.maximum && + schema.maximum < value){ + addError("must have a maximum value of " + schema.maximum); + } + if(schema['enum']){ + var enumer = schema['enum']; + l = enumer.length; + var found; + for(var j = 0; j < l; j++){ + if(enumer[j]===value){ + found=1; + break; + } + } + if(!found){ + addError("does not have a value in the enumeration " + enumer.join(", ")); + } + } + if(typeof schema.maxDecimal == 'number' && + (value.toString().match(new RegExp("\\.[0-9]{" + (schema.maxDecimal + 1) + ",}")))){ + addError("may only have " + schema.maxDecimal + " digits of decimal places"); + } + } + } + return null; + } + // validate an object against a schema + function checkObj(instance,objTypeDef,path,additionalProp){ + + if(typeof objTypeDef =='object'){ + if(typeof instance != 'object' || instance instanceof Array){ + errors.push({property:path,message:"an object is required"}); + } + + for(var i in objTypeDef){ + if(objTypeDef.hasOwnProperty(i)){ + var value = instance[i]; + // skip _not_ specified properties + if (value === undefined && options.existingOnly) continue; + var propDef = objTypeDef[i]; + // set default + if(value === undefined && propDef["default"]){ + value = instance[i] = propDef["default"]; + } + if(options.coerce && i in instance){ + value = instance[i] = options.coerce(value, propDef); + } + checkProp(value,propDef,path,i); + } + } + } + for(i in instance){ + if(instance.hasOwnProperty(i) && !(i.charAt(0) == '_' && i.charAt(1) == '_') && objTypeDef && !objTypeDef[i] && additionalProp===false){ + if (options.filter) { + delete instance[i]; + continue; + } else { + errors.push({property:path,message:(typeof value) + "The property " + i + + " is not defined in the schema and the schema does not allow additional properties"}); + } + } + var requires = objTypeDef && objTypeDef[i] && objTypeDef[i].requires; + if(requires && !(requires in instance)){ + errors.push({property:path,message:"the presence of the property " + i + " requires that " + requires + " also be present"}); + } + value = instance[i]; + if(additionalProp && (!(objTypeDef && typeof objTypeDef == 'object') || !(i in objTypeDef))){ + if(options.coerce){ + value = instance[i] = options.coerce(value, additionalProp); + } + checkProp(value,additionalProp,path,i); + } + if(!_changing && value && value.$schema){ + errors = errors.concat(checkProp(value,value.$schema,path,i)); + } + } + return errors; + } + if(schema){ + checkProp(instance,schema,'',_changing || ''); + } + if(!_changing && instance && instance.$schema){ + checkProp(instance,instance.$schema,'',''); + } + return {valid:!errors.length,errors:errors}; +}; +exports.mustBeValid = function(result){ + // summary: + // This checks to ensure that the result is valid and will throw an appropriate error message if it is not + // result: the result returned from checkPropertyChange or validate + if(!result.valid){ + throw new TypeError(result.errors.map(function(error){return "for property " + error.property + ': ' + error.message;}).join(", \n")); + } +} + +return exports; +})); /***/ }), @@ -123353,7 +123490,7 @@ function serializer(replacer, cycleReplacer) { var mod_assert = __webpack_require__(16); var mod_util = __webpack_require__(3); -var mod_extsprintf = __webpack_require__(645); +var mod_extsprintf = __webpack_require__(613); var mod_verror = __webpack_require__(960); var mod_jsonschema = __webpack_require__(744); @@ -127505,7 +127642,7 @@ function unesc(str) { -var flatten = __webpack_require__(510); +var flatten = __webpack_require__(478); var slice = [].slice; /** @@ -127609,7 +127746,7 @@ module.exports = function unique(arr) { * Module dependencies */ -var expand = __webpack_require__(640); +var expand = __webpack_require__(608); var repeat = __webpack_require__(411); var tokens = __webpack_require__(778); @@ -128057,12 +128194,12 @@ module.exports = function (dir, opts) { /***/ (function(module, exports, __webpack_require__) { -var Promise = __webpack_require__(345) +var Promise = __webpack_require__(339) var fs try { - fs = __webpack_require__(391) + fs = __webpack_require__(385) } catch(err) { - fs = __webpack_require__(5) + fs = __webpack_require__(4) } var api = [ @@ -128673,7 +128810,7 @@ module.exports = Number.isNaN || function (x) { /***/ (function(module, exports, __webpack_require__) { var crypto = __webpack_require__(11) - , qs = __webpack_require__(196) + , qs = __webpack_require__(197) ; function sha1 (key, body) { @@ -128871,7 +129008,7 @@ module.exports = function omit(obj, keys) { -var forIn = __webpack_require__(647); +var forIn = __webpack_require__(615); var hasOwn = Object.prototype.hasOwnProperty; module.exports = function forOwn(obj, fn, thisArg) { @@ -128975,9 +129112,9 @@ module.exports = function () { -var isGlob = __webpack_require__(178); -var findBase = __webpack_require__(652); -var extglob = __webpack_require__(177); +var isGlob = __webpack_require__(179); +var findBase = __webpack_require__(620); +var extglob = __webpack_require__(178); var dotfile = __webpack_require__(733); /** @@ -129228,9 +129365,9 @@ module.exports.win32 = win32.parse; /* 775 */ /***/ (function(module, exports, __webpack_require__) { -var duplexify = __webpack_require__(386) +var duplexify = __webpack_require__(380) var through = __webpack_require__(461) -var bufferFrom = __webpack_require__(595) +var bufferFrom = __webpack_require__(563) var noop = function() {} @@ -130228,8 +130365,8 @@ exports.unquoted = unquoted; /***/ (function(module, exports, __webpack_require__) { var once = __webpack_require__(83) -var eos = __webpack_require__(173) -var fs = __webpack_require__(5) // we only need fs to get the ReadStream and WriteStream prototypes +var eos = __webpack_require__(174) +var fs = __webpack_require__(4) // we only need fs to get the ReadStream and WriteStream prototypes var noop = function () {} @@ -130315,7 +130452,7 @@ module.exports = pump var pump = __webpack_require__(783) var inherits = __webpack_require__(61) -var Duplexify = __webpack_require__(386) +var Duplexify = __webpack_require__(380) var toArray = function(args) { if (!args.length) return [] @@ -130380,8 +130517,8 @@ module.exports.ctor = define /***/ (function(module, exports, __webpack_require__) { var once = __webpack_require__(83) -var eos = __webpack_require__(173) -var fs = __webpack_require__(5) // we only need fs to get the ReadStream and WriteStream prototypes +var eos = __webpack_require__(174) +var fs = __webpack_require__(4) // we only need fs to get the ReadStream and WriteStream prototypes var noop = function () {} var ancient = /^v?\.0/.test(process.version) @@ -130869,7 +131006,7 @@ module.exports = function (object, opts) { var strictUriEncode = __webpack_require__(943); var objectAssign = __webpack_require__(303); -var decodeComponent = __webpack_require__(630); +var decodeComponent = __webpack_require__(598); function encoderForArrayFormat(opts) { switch (opts.arrayFormat) { @@ -131355,7 +131492,7 @@ function isBuffer(val) { module.exports = read -var readline = __webpack_require__(197) +var readline = __webpack_require__(198) var Mute = __webpack_require__(401) function read (opts, cb) { @@ -131804,7 +131941,7 @@ module.exports = {"name":"request-capture-har","version":"1.2.2","description":" /* 799 */ /***/ (function(module, exports, __webpack_require__) { -var fs = __webpack_require__(5); +var fs = __webpack_require__(4); var pkg = __webpack_require__(798); function buildHarHeaders (headers) { @@ -131969,7 +132106,7 @@ module.exports = HarWrapper; -var extend = __webpack_require__(269) +var extend = __webpack_require__(266) var cookies = __webpack_require__(412) var helpers = __webpack_require__(305) @@ -132117,8 +132254,8 @@ Object.defineProperty(request, 'debug', { "use strict"; -var caseless = __webpack_require__(231) -var uuid = __webpack_require__(119) +var caseless = __webpack_require__(228) +var uuid = __webpack_require__(120) var helpers = __webpack_require__(305) var md5 = helpers.md5 @@ -132377,10 +132514,10 @@ module.exports = getProxyFromURI "use strict"; -var fs = __webpack_require__(5) -var qs = __webpack_require__(196) -var validate = __webpack_require__(677) -var extend = __webpack_require__(269) +var fs = __webpack_require__(4) +var qs = __webpack_require__(197) +var validate = __webpack_require__(645) +var extend = __webpack_require__(266) function Har (request) { this.request = request @@ -132685,8 +132822,8 @@ exports.header = function (uri, method, opts) { "use strict"; -var uuid = __webpack_require__(119) -var CombinedStream = __webpack_require__(385) +var uuid = __webpack_require__(120) +var CombinedStream = __webpack_require__(379) var isstream = __webpack_require__(399) var Buffer = __webpack_require__(45).Buffer @@ -132806,8 +132943,8 @@ exports.Multipart = Multipart var url = __webpack_require__(24) var qs = __webpack_require__(404) -var caseless = __webpack_require__(231) -var uuid = __webpack_require__(119) +var caseless = __webpack_require__(228) +var uuid = __webpack_require__(120) var oauth = __webpack_require__(768) var crypto = __webpack_require__(11) var Buffer = __webpack_require__(45).Buffer @@ -132960,7 +133097,7 @@ exports.OAuth = OAuth var qs = __webpack_require__(404) -var querystring = __webpack_require__(196) +var querystring = __webpack_require__(197) function Querystring (request) { this.request = request @@ -134976,19 +135113,19 @@ module.exports = {"author":{"name":"Jeremy Stashewsky","email":"jstashewsky@sale var http = __webpack_require__(87) -var https = __webpack_require__(195) +var https = __webpack_require__(196) var url = __webpack_require__(24) var util = __webpack_require__(3) var stream = __webpack_require__(23) -var zlib = __webpack_require__(198) -var aws2 = __webpack_require__(521) -var aws4 = __webpack_require__(522) +var zlib = __webpack_require__(199) +var aws2 = __webpack_require__(489) +var aws4 = __webpack_require__(490) var httpSignature = __webpack_require__(680) var mime = __webpack_require__(400) -var caseless = __webpack_require__(231) -var ForeverAgent = __webpack_require__(648) -var FormData = __webpack_require__(649) -var extend = __webpack_require__(269) +var caseless = __webpack_require__(228) +var ForeverAgent = __webpack_require__(616) +var FormData = __webpack_require__(617) +var extend = __webpack_require__(266) var isstream = __webpack_require__(399) var isTypedArray = __webpack_require__(742).strict var helpers = __webpack_require__(305) @@ -136540,7 +136677,7 @@ module.exports = async; /***/ (function(module, exports, __webpack_require__) { var core = __webpack_require__(306); -var fs = __webpack_require__(5); +var fs = __webpack_require__(4); var path = __webpack_require__(0); var caller = __webpack_require__(417); var nodeModulesPaths = __webpack_require__(418); @@ -136758,7 +136895,7 @@ module.exports = {"assert":true,"async_hooks":">= 8","buffer_ieee754":"< 0.9.7", /***/ (function(module, exports, __webpack_require__) { var core = __webpack_require__(306); -var fs = __webpack_require__(5); +var fs = __webpack_require__(4); var path = __webpack_require__(0); var caller = __webpack_require__(417); var nodeModulesPaths = __webpack_require__(418); @@ -137176,7 +137313,7 @@ RetryOperation.prototype.mainError = function() { /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Observable__ = __webpack_require__(12); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__scheduler_asap__ = __webpack_require__(438); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_isNumeric__ = __webpack_require__(190); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_isNumeric__ = __webpack_require__(191); /** PURE_IMPORTS_START tslib,_Observable,_scheduler_asap,_util_isNumeric PURE_IMPORTS_END */ @@ -137237,7 +137374,7 @@ var SubscribeOnObservable = /*@__PURE__*/ (function (_super) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = bindCallback; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Observable__ = __webpack_require__(12); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__AsyncSubject__ = __webpack_require__(183); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__AsyncSubject__ = __webpack_require__(184); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__operators_map__ = __webpack_require__(47); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_canReportError__ = __webpack_require__(322); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__util_isArray__ = __webpack_require__(41); @@ -137356,7 +137493,7 @@ function dispatchError(state) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = bindNodeCallback; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Observable__ = __webpack_require__(12); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__AsyncSubject__ = __webpack_require__(183); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__AsyncSubject__ = __webpack_require__(184); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__operators_map__ = __webpack_require__(47); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_canReportError__ = __webpack_require__(322); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__util_isScheduler__ = __webpack_require__(49); @@ -137756,7 +137893,7 @@ function fromIterable(input, scheduler) { /* harmony export (immutable) */ __webpack_exports__["a"] = fromObservable; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Observable__ = __webpack_require__(12); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscription__ = __webpack_require__(25); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__symbol_observable__ = __webpack_require__(117); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__symbol_observable__ = __webpack_require__(118); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_subscribeToObservable__ = __webpack_require__(449); /** PURE_IMPORTS_START _Observable,_Subscription,_symbol_observable,_util_subscribeToObservable PURE_IMPORTS_END */ @@ -137829,7 +137966,7 @@ function fromPromise(input, scheduler) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = generate; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Observable__ = __webpack_require__(12); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_identity__ = __webpack_require__(118); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_identity__ = __webpack_require__(119); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_isScheduler__ = __webpack_require__(49); /** PURE_IMPORTS_START _Observable,_util_identity,_util_isScheduler PURE_IMPORTS_END */ @@ -137989,7 +138126,7 @@ function iif(condition, trueResult, falseResult) { /* harmony export (immutable) */ __webpack_exports__["a"] = interval; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Observable__ = __webpack_require__(12); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__scheduler_async__ = __webpack_require__(40); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_isNumeric__ = __webpack_require__(190); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_isNumeric__ = __webpack_require__(191); /** PURE_IMPORTS_START _Observable,_scheduler_async,_util_isNumeric PURE_IMPORTS_END */ @@ -138667,7 +138804,7 @@ var BufferToggleSubscriber = /*@__PURE__*/ (function (_super) { /* harmony export (immutable) */ __webpack_exports__["a"] = bufferWhen; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscription__ = __webpack_require__(25); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_tryCatch__ = __webpack_require__(56); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_tryCatch__ = __webpack_require__(57); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_errorObject__ = __webpack_require__(48); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__OuterSubscriber__ = __webpack_require__(13); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__util_subscribeToResult__ = __webpack_require__(14); @@ -138867,7 +139004,7 @@ function combineLatest() { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = concat; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__observable_concat__ = __webpack_require__(186); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__observable_concat__ = __webpack_require__(187); /** PURE_IMPORTS_START _observable_concat PURE_IMPORTS_END */ function concat() { @@ -139131,7 +139268,7 @@ function dispatchNext(subscriber) { /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__scheduler_async__ = __webpack_require__(40); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_isDate__ = __webpack_require__(443); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Subscriber__ = __webpack_require__(7); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__Notification__ = __webpack_require__(184); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__Notification__ = __webpack_require__(185); /** PURE_IMPORTS_START tslib,_scheduler_async,_util_isDate,_Subscriber,_Notification PURE_IMPORTS_END */ @@ -139509,7 +139646,7 @@ function distinctUntilKeyChanged(key, compare) { /* harmony export (immutable) */ __webpack_exports__["a"] = elementAt; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__util_ArgumentOutOfRangeError__ = __webpack_require__(152); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__filter__ = __webpack_require__(147); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__throwIfEmpty__ = __webpack_require__(188); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__throwIfEmpty__ = __webpack_require__(189); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__defaultIfEmpty__ = __webpack_require__(146); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__take__ = __webpack_require__(319); /** PURE_IMPORTS_START _util_ArgumentOutOfRangeError,_filter,_throwIfEmpty,_defaultIfEmpty,_take PURE_IMPORTS_END */ @@ -139541,7 +139678,7 @@ function elementAt(index, defaultValue) { /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__observable_fromArray__ = __webpack_require__(85); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__observable_scalar__ = __webpack_require__(312); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__observable_empty__ = __webpack_require__(39); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__observable_concat__ = __webpack_require__(186); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__observable_concat__ = __webpack_require__(187); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__util_isScheduler__ = __webpack_require__(49); /** PURE_IMPORTS_START _observable_fromArray,_observable_scalar,_observable_empty,_observable_concat,_util_isScheduler PURE_IMPORTS_END */ @@ -139799,7 +139936,7 @@ var ExhaustMapSubscriber = /*@__PURE__*/ (function (_super) { /* unused harmony export ExpandOperator */ /* unused harmony export ExpandSubscriber */ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_tryCatch__ = __webpack_require__(56); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_tryCatch__ = __webpack_require__(57); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_errorObject__ = __webpack_require__(48); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__OuterSubscriber__ = __webpack_require__(13); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__util_subscribeToResult__ = __webpack_require__(14); @@ -139971,8 +140108,8 @@ function findIndex(predicate, thisArg) { /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__filter__ = __webpack_require__(147); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__take__ = __webpack_require__(319); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__defaultIfEmpty__ = __webpack_require__(146); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__throwIfEmpty__ = __webpack_require__(188); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__util_identity__ = __webpack_require__(118); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__throwIfEmpty__ = __webpack_require__(189); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__util_identity__ = __webpack_require__(119); /** PURE_IMPORTS_START _util_EmptyError,_filter,_take,_defaultIfEmpty,_throwIfEmpty,_util_identity PURE_IMPORTS_END */ @@ -140075,9 +140212,9 @@ var IsEmptySubscriber = /*@__PURE__*/ (function (_super) { /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__util_EmptyError__ = __webpack_require__(153); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__filter__ = __webpack_require__(147); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__takeLast__ = __webpack_require__(320); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__throwIfEmpty__ = __webpack_require__(188); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__throwIfEmpty__ = __webpack_require__(189); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__defaultIfEmpty__ = __webpack_require__(146); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__util_identity__ = __webpack_require__(118); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__util_identity__ = __webpack_require__(119); /** PURE_IMPORTS_START _util_EmptyError,_filter,_takeLast,_throwIfEmpty,_defaultIfEmpty,_util_identity PURE_IMPORTS_END */ @@ -140138,7 +140275,7 @@ var MapToSubscriber = /*@__PURE__*/ (function (_super) { /* harmony export (immutable) */ __webpack_exports__["a"] = materialize; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Notification__ = __webpack_require__(184); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Notification__ = __webpack_require__(185); /** PURE_IMPORTS_START tslib,_Subscriber,_Notification PURE_IMPORTS_END */ @@ -140185,7 +140322,7 @@ var MaterializeSubscriber = /*@__PURE__*/ (function (_super) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = max; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__reduce__ = __webpack_require__(187); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__reduce__ = __webpack_require__(188); /** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */ function max(comparer) { @@ -140249,7 +140386,7 @@ function mergeMapTo(innerObservable, resultSelector, concurrent) { /* unused harmony export MergeScanOperator */ /* unused harmony export MergeScanSubscriber */ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_tryCatch__ = __webpack_require__(56); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_tryCatch__ = __webpack_require__(57); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_errorObject__ = __webpack_require__(48); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_subscribeToResult__ = __webpack_require__(14); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__OuterSubscriber__ = __webpack_require__(13); @@ -140359,7 +140496,7 @@ var MergeScanSubscriber = /*@__PURE__*/ (function (_super) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = min; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__reduce__ = __webpack_require__(187); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__reduce__ = __webpack_require__(188); /** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */ function min(comparer) { @@ -140572,7 +140709,7 @@ function plucker(props, length) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = publish; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Subject__ = __webpack_require__(36); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__multicast__ = __webpack_require__(116); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__multicast__ = __webpack_require__(117); /** PURE_IMPORTS_START _Subject,_multicast PURE_IMPORTS_END */ @@ -140591,7 +140728,7 @@ function publish(selector) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = publishBehavior; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__BehaviorSubject__ = __webpack_require__(419); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__multicast__ = __webpack_require__(116); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__multicast__ = __webpack_require__(117); /** PURE_IMPORTS_START _BehaviorSubject,_multicast PURE_IMPORTS_END */ @@ -140607,8 +140744,8 @@ function publishBehavior(value) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = publishLast; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__AsyncSubject__ = __webpack_require__(183); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__multicast__ = __webpack_require__(116); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__AsyncSubject__ = __webpack_require__(184); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__multicast__ = __webpack_require__(117); /** PURE_IMPORTS_START _AsyncSubject,_multicast PURE_IMPORTS_END */ @@ -140625,7 +140762,7 @@ function publishLast() { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = publishReplay; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__ReplaySubject__ = __webpack_require__(308); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__multicast__ = __webpack_require__(116); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__multicast__ = __webpack_require__(117); /** PURE_IMPORTS_START _ReplaySubject,_multicast PURE_IMPORTS_END */ @@ -140738,7 +140875,7 @@ var RepeatSubscriber = /*@__PURE__*/ (function (_super) { /* harmony export (immutable) */ __webpack_exports__["a"] = repeatWhen; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subject__ = __webpack_require__(36); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_tryCatch__ = __webpack_require__(56); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_tryCatch__ = __webpack_require__(57); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_errorObject__ = __webpack_require__(48); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__OuterSubscriber__ = __webpack_require__(13); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__util_subscribeToResult__ = __webpack_require__(14); @@ -140885,7 +141022,7 @@ var RetrySubscriber = /*@__PURE__*/ (function (_super) { /* harmony export (immutable) */ __webpack_exports__["a"] = retryWhen; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subject__ = __webpack_require__(36); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_tryCatch__ = __webpack_require__(56); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_tryCatch__ = __webpack_require__(57); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_errorObject__ = __webpack_require__(48); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__OuterSubscriber__ = __webpack_require__(13); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__util_subscribeToResult__ = __webpack_require__(14); @@ -141090,7 +141227,7 @@ function dispatchNotification(state) { /* unused harmony export SequenceEqualSubscriber */ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_tryCatch__ = __webpack_require__(56); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_tryCatch__ = __webpack_require__(57); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_errorObject__ = __webpack_require__(48); /** PURE_IMPORTS_START tslib,_Subscriber,_util_tryCatch,_util_errorObject PURE_IMPORTS_END */ @@ -141215,7 +141352,7 @@ var SequenceEqualCompareToSubscriber = /*@__PURE__*/ (function (_super) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = share; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__multicast__ = __webpack_require__(116); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__multicast__ = __webpack_require__(117); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__refCount__ = __webpack_require__(316); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Subject__ = __webpack_require__(36); /** PURE_IMPORTS_START _multicast,_refCount,_Subject PURE_IMPORTS_END */ @@ -141586,7 +141723,7 @@ var SkipWhileSubscriber = /*@__PURE__*/ (function (_super) { /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__observable_fromArray__ = __webpack_require__(85); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__observable_scalar__ = __webpack_require__(312); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__observable_empty__ = __webpack_require__(39); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__observable_concat__ = __webpack_require__(186); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__observable_concat__ = __webpack_require__(187); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__util_isScheduler__ = __webpack_require__(49); /** PURE_IMPORTS_START _observable_fromArray,_observable_scalar,_observable_empty,_observable_concat,_util_isScheduler PURE_IMPORTS_END */ @@ -141659,7 +141796,7 @@ var SubscribeOnOperator = /*@__PURE__*/ (function () { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = switchAll; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__switchMap__ = __webpack_require__(318); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_identity__ = __webpack_require__(118); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_identity__ = __webpack_require__(119); /** PURE_IMPORTS_START _switchMap,_util_identity PURE_IMPORTS_END */ @@ -141985,7 +142122,7 @@ var Timestamp = /*@__PURE__*/ (function () { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = toArray; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__reduce__ = __webpack_require__(187); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__reduce__ = __webpack_require__(188); /** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */ function toArrayReducer(arr, item, index) { @@ -142179,7 +142316,7 @@ var WindowCountSubscriber = /*@__PURE__*/ (function (_super) { /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subject__ = __webpack_require__(36); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__scheduler_async__ = __webpack_require__(40); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Subscriber__ = __webpack_require__(7); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__util_isNumeric__ = __webpack_require__(190); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__util_isNumeric__ = __webpack_require__(191); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__util_isScheduler__ = __webpack_require__(49); /** PURE_IMPORTS_START tslib,_Subject,_scheduler_async,_Subscriber,_util_isNumeric,_util_isScheduler PURE_IMPORTS_END */ @@ -142347,7 +142484,7 @@ function dispatchWindowClose(state) { /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subject__ = __webpack_require__(36); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Subscription__ = __webpack_require__(25); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_tryCatch__ = __webpack_require__(56); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_tryCatch__ = __webpack_require__(57); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__util_errorObject__ = __webpack_require__(48); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__OuterSubscriber__ = __webpack_require__(13); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__util_subscribeToResult__ = __webpack_require__(14); @@ -142491,7 +142628,7 @@ var WindowToggleSubscriber = /*@__PURE__*/ (function (_super) { /* harmony export (immutable) */ __webpack_exports__["a"] = windowWhen; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subject__ = __webpack_require__(36); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_tryCatch__ = __webpack_require__(56); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_tryCatch__ = __webpack_require__(57); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_errorObject__ = __webpack_require__(48); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__OuterSubscriber__ = __webpack_require__(13); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__util_subscribeToResult__ = __webpack_require__(14); @@ -143166,7 +143303,7 @@ var Immediate = { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = isInteropObservable; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__symbol_observable__ = __webpack_require__(117); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__symbol_observable__ = __webpack_require__(118); /** PURE_IMPORTS_START _symbol_observable PURE_IMPORTS_END */ function isInteropObservable(input) { @@ -144492,7 +144629,7 @@ module.exports = function pkg(name, dir) { "use strict"; var stripAnsi = __webpack_require__(947); -var codePointAt = __webpack_require__(607); +var codePointAt = __webpack_require__(575); var isFullwidthCodePoint = __webpack_require__(946); // https://github.com/nodejs/io.js/blob/cff7300a578be1b10001f2d967aaedc88aee6402/lib/readline.js#L1345 @@ -144588,7 +144725,7 @@ module.exports = function (x) { "use strict"; -var ansiRegex = __webpack_require__(505)(); +var ansiRegex = __webpack_require__(473)(); module.exports = function (str) { return typeof str === 'string' ? str.replace(ansiRegex, '') : str; @@ -144617,7 +144754,7 @@ module.exports = () => { /***/ (function(module, exports, __webpack_require__) { var util = __webpack_require__(3) -var bl = __webpack_require__(592) +var bl = __webpack_require__(560) var xtend = __webpack_require__(465) var headers = __webpack_require__(459) @@ -144880,10 +145017,10 @@ module.exports = Extract /* 950 */ /***/ (function(module, exports, __webpack_require__) { -var constants = __webpack_require__(651) -var eos = __webpack_require__(173) +var constants = __webpack_require__(619) +var eos = __webpack_require__(174) var util = __webpack_require__(3) -var alloc = __webpack_require__(380) +var alloc = __webpack_require__(374) var toBuffer = __webpack_require__(462) var Readable = __webpack_require__(102).Readable @@ -145221,7 +145358,7 @@ function deprecated(source, name) { /***/ (function(module, exports, __webpack_require__) { -var Promise = __webpack_require__(345) +var Promise = __webpack_require__(339) var assert = __webpack_require__(28) module.exports = thenify @@ -145431,7 +145568,7 @@ function through (write, end, opts) { /* * Module dependencies. */ -const fs = __webpack_require__(5); +const fs = __webpack_require__(4); const path = __webpack_require__(0); const crypto = __webpack_require__(11); const osTmpDir = __webpack_require__(772); @@ -146043,7 +146180,7 @@ module.exports.setGracefulCleanup = setGracefulCleanup; var net = __webpack_require__(164) , tls = __webpack_require__(467) , http = __webpack_require__(87) - , https = __webpack_require__(195) + , https = __webpack_require__(196) , events = __webpack_require__(77) , assert = __webpack_require__(28) , util = __webpack_require__(3) diff --git a/.yarnrc.yml b/.yarnrc.yml new file mode 100644 index 00000000..82069dd8 --- /dev/null +++ b/.yarnrc.yml @@ -0,0 +1 @@ +yarnPath: .yarn/releases/yarn-1.22.19.cjs diff --git a/package.json b/package.json index 4dc1c584..67e11563 100644 --- a/package.json +++ b/package.json @@ -8,15 +8,15 @@ }, "private": true, "dependencies": { - "@emotion/react": "^11.9.0", - "@emotion/styled": "^11.8.1", + "@emotion/react": "^11.10.5", + "@emotion/styled": "^11.10.5", "@mdi/js": "^6.6.96", "@monaco-editor/react": "^4.4.4", - "@mui/icons-material": "5.6.0", + "@mui/icons-material": "^5.10.16", "@mui/lab": "^5.0.0-alpha.76", - "@mui/material": "5.6.0", + "@mui/material": "^5.10.16", "@mui/x-date-pickers": "^5.0.0-alpha.4", - "@rowy/form-builder": "^0.7.0", + "@rowy/form-builder": "^0.8.0", "@rowy/multiselect": "^0.4.1", "@tanstack/react-table": "^8.5.15", "@tinymce/tinymce-react": "^3", @@ -44,14 +44,14 @@ "path-browserify": "^1.0.1", "pb-util": "^1.0.3", "quicktype-core": "^6.0.71", - "react": "^18.0.0", + "react": "^18.2.0", "react-beautiful-dnd": "^13.1.0", "react-color-palette": "^6.2.0", "react-detect-offline": "^2.4.5", "react-div-100vh": "^0.7.0", "react-dnd": "^16.0.1", "react-dnd-html5-backend": "^16.0.1", - "react-dom": "^18.0.0", + "react-dom": "^18.2.0", "react-dropzone": "^10", "react-element-scroll-hook": "^1.1.0", "react-error-boundary": "^3.1.4", @@ -62,7 +62,7 @@ "react-markdown": "^8.0.3", "react-router-dom": "^6.3.0", "react-router-hash-link": "^2.4.3", - "react-scripts": "^5.0.0", + "react-scripts": "^5.0.1", "react-usestateref": "^1.0.8", "react-virtual": "^2.10.4", "remark-gfm": "^3.0.1", @@ -70,13 +70,14 @@ "stream-browserify": "^3.0.0", "swr": "^1.3.0", "tinymce": "^5", - "tss-react": "^3.6.2", - "typescript": "^4.6.3", + "tss-react": "^4.4.4", + "typescript": "^4.9.3", "use-algolia": "^1.5.3", "use-async-memo": "^1.2.4", "use-debounce": "^8.0.0", "use-memo-value": "^1.0.1", - "web-vitals": "^2.1.4" + "web-vitals": "^2.1.4", + "workbox-webpack-plugin": "^6.5.4" }, "scripts": { "start": "cross-env PORT=7699 craco start", @@ -92,7 +93,7 @@ "typedoc": "typedoc --options typedoc.json" }, "engines": { - "node": "^16" + "node": ">=16" }, "eslintConfig": { "plugins": [ @@ -156,21 +157,22 @@ "@types/json2csv": "^5.0.3", "@types/lodash-es": "^4.17.6", "@types/node": "^17.0.23", - "@types/react": "^18.0.5", + "@types/react": "^18.0.25", "@types/react-beautiful-dnd": "^13.1.2", "@types/react-detect-offline": "^2.4.1", "@types/react-div-100vh": "^0.4.0", - "@types/react-dom": "^18.0.0", + "@types/react-dom": "^18.0.9", "@types/react-router-dom": "^5.3.3", "@types/react-router-hash-link": "^2.4.5", "@types/seedrandom": "^3.0.2", - "@typescript-eslint/parser": "^5.18.0", + "@typescript-eslint/eslint-plugin": "^5.45.0", + "@typescript-eslint/parser": "^5.45.0", "craco-alias": "^3.0.1", "craco-swc": "^0.5.1", "cross-env": "^7.0.3", - "eslint": "^8.12.0", + "eslint": "^8.28.0", "eslint-config-prettier": "^8.5.0", - "eslint-config-react-app": "^7.0.0", + "eslint-config-react-app": "^7.0.1", "eslint-plugin-local-rules": "^1.1.0", "eslint-plugin-no-relative-import-paths": "^1.2.0", "eslint-plugin-tsdoc": "^0.2.16", @@ -189,5 +191,6 @@ "lint-staged": { "*.{js,ts,tsx}": "eslint --cache --fix", "**/*": "prettier --write --ignore-unknown" - } + }, + "packageManager": "yarn@1.22.19" } diff --git a/src/Providers.tsx b/src/Providers.tsx index 4bb24f48..3162ef91 100644 --- a/src/Providers.tsx +++ b/src/Providers.tsx @@ -6,8 +6,8 @@ import { HelmetProvider } from "react-helmet-async"; import { Provider as JotaiProvider, Atom } from "jotai"; import { projectScope } from "@src/atoms/projectScope"; import { DebugAtoms } from "@src/atoms/utils"; -import LocalizationProvider from "@mui/lab/LocalizationProvider"; -import AdapterDateFns from "@mui/lab/AdapterDateFns"; +import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider"; +import { AdapterDateFns } from "@mui/x-date-pickers/AdapterDateFns"; import createCache from "@emotion/cache"; import { CacheProvider } from "@emotion/react"; import RowyThemeProvider from "@src/theme/RowyThemeProvider"; diff --git a/src/components/TableSettingsDialog/TableSettingsDialog.tsx b/src/components/TableSettingsDialog/TableSettingsDialog.tsx index d045739c..8424ce1a 100644 --- a/src/components/TableSettingsDialog/TableSettingsDialog.tsx +++ b/src/components/TableSettingsDialog/TableSettingsDialog.tsx @@ -184,18 +184,20 @@ export default function TableSettingsDialog() { handleCancel: async () => { let _schema: Record = {}; if (hasExtensions) { - _schema.extensionObjects = get( - data, - "_schema.extensionObjects" - // TODO: types - )!.map((x: any) => ({ + _schema.extensionObjects = ( + get( + data, + "_schema.extensionObjects" + // TODO: types + ) ?? [] + ).map((x: any) => ({ ...x, active: false, })); } if (hasWebhooks) { // TODO: types - _schema.webhooks = get(data, "_schema.webhooks")!.map( + _schema.webhooks = (get(data, "_schema.webhooks") ?? []).map( (x: any) => ({ ...x, active: false, @@ -272,7 +274,7 @@ export default function TableSettingsDialog() { ).reduce((acc, [name, err]) => { const match = find(fields, ["name", name])?.step; if (!match) return acc; - acc[match] = err.message; + acc[match] = (err?.message as string) ?? ""; return acc; }, {} as Record); diff --git a/src/components/fields/Date/EditorCell.tsx b/src/components/fields/Date/EditorCell.tsx index 56de95c1..bae76c2d 100644 --- a/src/components/fields/Date/EditorCell.tsx +++ b/src/components/fields/Date/EditorCell.tsx @@ -1,7 +1,7 @@ import { useDebouncedCallback } from "use-debounce"; import { IEditorCellProps } from "@src/components/fields/types"; -import DatePicker from "@mui/lab/DatePicker"; +import { DatePicker } from "@mui/x-date-pickers"; import { TextField } from "@mui/material"; import { ChevronDown } from "@src/assets/icons"; @@ -63,6 +63,8 @@ export default function Date_({ }, "& .MuiInputAdornment-root": { m: 0 }, }} + autoFocus + onKeyDown={(e) => e.stopPropagation()} onClick={(e) => e.stopPropagation()} inputProps={{ ...props.inputProps, tabIndex }} /> @@ -72,7 +74,6 @@ export default function Date_({ onChange={handleDateChange} inputFormat={format} mask={format.replace(/[A-Za-z]/g, "_")} - clearable OpenPickerButtonProps={{ size: "small", className: "row-hover-iconButton end", diff --git a/src/components/fields/Date/SideDrawerField.tsx b/src/components/fields/Date/SideDrawerField.tsx index 2fa85327..b20c5aa2 100644 --- a/src/components/fields/Date/SideDrawerField.tsx +++ b/src/components/fields/Date/SideDrawerField.tsx @@ -1,6 +1,6 @@ import { ISideDrawerFieldProps } from "@src/components/fields/types"; -import DatePicker from "@mui/lab/DatePicker"; +import { DatePicker } from "@mui/x-date-pickers"; import { TextField } from "@mui/material"; import { ChevronDown } from "@src/assets/icons"; @@ -52,7 +52,6 @@ export default function Date_({ onAccept={onSubmit} inputFormat={format} mask={format.replace(/[A-Za-z]/g, "_")} - clearable OpenPickerButtonProps={{ size: "small", sx: { width: 32, height: 32 }, diff --git a/src/components/fields/DateTime/EditorCell.tsx b/src/components/fields/DateTime/EditorCell.tsx index 5a8cf2f1..03d5dc03 100644 --- a/src/components/fields/DateTime/EditorCell.tsx +++ b/src/components/fields/DateTime/EditorCell.tsx @@ -2,7 +2,7 @@ import { useDebouncedCallback } from "use-debounce"; import { IEditorCellProps } from "@src/components/fields/types"; import { setSeconds } from "date-fns"; -import DateTimePicker from "@mui/lab/DateTimePicker"; +import { DateTimePicker } from "@mui/x-date-pickers"; import { TextField } from "@mui/material"; import { ChevronDown } from "@src/assets/icons"; @@ -68,6 +68,7 @@ export default function DateTime({ }, "& .MuiInputAdornment-root": { m: 0 }, }} + autoFocus onKeyDown={(e) => e.stopPropagation()} onClick={(e) => e.stopPropagation()} inputProps={{ ...props.inputProps, tabIndex }} @@ -77,7 +78,6 @@ export default function DateTime({ value={transformedValue} onChange={(date) => handleDateChange(date ? setSeconds(date, 0) : null)} inputFormat={format} - clearable OpenPickerButtonProps={{ size: "small", className: "row-hover-iconButton end", @@ -88,6 +88,7 @@ export default function DateTime({ disableOpenPicker={false} disabled={disabled} PopperProps={{ onClick: (e) => e.stopPropagation() }} + hideTabs={false} /> ); } diff --git a/src/components/fields/DateTime/SideDrawerField.tsx b/src/components/fields/DateTime/SideDrawerField.tsx index 55a892ba..d240814e 100644 --- a/src/components/fields/DateTime/SideDrawerField.tsx +++ b/src/components/fields/DateTime/SideDrawerField.tsx @@ -1,7 +1,7 @@ import { ISideDrawerFieldProps } from "@src/components/fields/types"; import { setSeconds } from "date-fns"; -import DateTimePicker from "@mui/lab/DateTimePicker"; +import { DateTimePicker } from "@mui/x-date-pickers"; import { TextField } from "@mui/material"; import { ChevronDown } from "@src/assets/icons"; @@ -52,11 +52,10 @@ export default function DateTime({ )} label={column.name} value={transformedValue} - onChange={(date) => handleChange(date ? setSeconds(date, 0) : null)} + onChange={(date: any) => handleChange(date ? setSeconds(date, 0) : null)} onAccept={onSubmit} inputFormat={format} mask={format.replace(/[A-Za-z]/g, "_")} - clearable OpenPickerButtonProps={{ size: "small", sx: { width: 32, height: 32 }, @@ -64,6 +63,7 @@ export default function DateTime({ components={{ OpenPickerIcon: ChevronDown }} disableOpenPicker={false} disabled={disabled} + hideTabs={false} /> ); } diff --git a/src/components/fields/Duration/SideDrawerField.tsx b/src/components/fields/Duration/SideDrawerField.tsx index 9cdc6be4..2fd11e72 100644 --- a/src/components/fields/Duration/SideDrawerField.tsx +++ b/src/components/fields/Duration/SideDrawerField.tsx @@ -1,8 +1,8 @@ import { ISideDrawerFieldProps } from "@src/components/fields/types"; import { Box, Stack, TextField } from "@mui/material"; -import DatePicker from "@mui/lab/DatePicker"; -import DateTimeIcon from "@mui/icons-material/AccessTime"; +import { DateTimePicker } from "@mui/x-date-pickers"; +import { ChevronDown } from "@src/assets/icons"; import { fieldSx, getFieldId } from "@src/components/SideDrawer/utils"; import { getDurationString } from "./utils"; @@ -42,7 +42,7 @@ export default function Duration({ - ( - ), - }} sx={{ "& .MuiInputBase-input": { fontVariantNumeric: "tabular-nums" }, "& .MuiInputAdornment-root": { m: 0 }, @@ -71,15 +65,14 @@ export default function Duration({ onAccept={onSubmit} inputFormat={format} mask={format.replace(/[A-Za-z]/g, "_")} - clearable OpenPickerButtonProps={{ size: "small" }} - components={{ OpenPickerIcon: DateTimeIcon }} + components={{ OpenPickerIcon: ChevronDown }} disableOpenPicker={false} - showToolbar disabled={disabled} + hideTabs={false} /> - ( - ), - }} sx={{ "& .MuiInputBase-input": { fontVariantNumeric: "tabular-nums" }, "& .MuiInputAdornment-root": { m: 0 }, @@ -108,12 +95,11 @@ export default function Duration({ onAccept={onSubmit} inputFormat={format} mask={format.replace(/[A-Za-z]/g, "_")} - clearable OpenPickerButtonProps={{ size: "small" }} - components={{ OpenPickerIcon: DateTimeIcon }} + components={{ OpenPickerIcon: ChevronDown }} disableOpenPicker={false} - showToolbar disabled={disabled} + hideTabs={false} /> diff --git a/src/hooks/useFirestoreCollectionWithAtom.ts b/src/hooks/useFirestoreCollectionWithAtom.ts index a49ec98a..16a7fb92 100644 --- a/src/hooks/useFirestoreCollectionWithAtom.ts +++ b/src/hooks/useFirestoreCollectionWithAtom.ts @@ -23,6 +23,7 @@ import { WhereFilterOp, documentId, getCountFromServer, + DocumentData, } from "firebase/firestore"; import { useErrorHandler } from "react-error-boundary"; @@ -77,7 +78,9 @@ interface IUseFirestoreCollectionWithAtomOptions { * @param path - Collection path. If falsy, the listener isn’t created at all. * @param options - {@link IUseFirestoreCollectionWithAtomOptions} */ -export function useFirestoreCollectionWithAtom( +export function useFirestoreCollectionWithAtom< + T extends DocumentData = TableRow +>( dataAtom: PrimitiveAtom, dataScope: Parameters[1] | undefined, path: string | undefined, diff --git a/src/theme/components.tsx b/src/theme/components.tsx index 374dc25b..02282bfc 100644 --- a/src/theme/components.tsx +++ b/src/theme/components.tsx @@ -1402,23 +1402,23 @@ export const components = (theme: Theme): ThemeOptions => { }, }, - MuiYearPicker: { - styleOverrides: { - root: { - "& .PrivatePickersYear-yearButton": { - ...(theme.typography.button as any), - fontSize: "1rem", - }, - }, - }, - }, - MuiPickersDay: { - styleOverrides: { - root: { - background: "none", - }, - }, - }, + // MuiYearPicker: { + // styleOverrides: { + // root: { + // "& .PrivatePickersYear-yearButton": { + // ...(theme.typography.button as any), + // fontSize: "1rem", + // }, + // }, + // }, + // }, + // MuiPickersDay: { + // styleOverrides: { + // root: { + // background: "none", + // }, + // }, + // }, RowyMultiSelect: { defaultProps: { diff --git a/yarn.lock b/yarn.lock index 00c14283..3f159757 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,153 +2,159 @@ # yarn lockfile v1 -"@algolia/cache-browser-local-storage@4.13.1": - version "4.13.1" - resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.13.1.tgz#ffacb9230119f77de1a6f163b83680be999110e4" - integrity sha512-UAUVG2PEfwd/FfudsZtYnidJ9eSCpS+LW9cQiesePQLz41NAcddKxBak6eP2GErqyFagSlnVXe/w2E9h2m2ttg== +"@adobe/css-tools@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.0.1.tgz#b38b444ad3aa5fedbb15f2f746dcd934226a12dd" + integrity sha512-+u76oB43nOHrF4DDWRLWDCtci7f3QJoEBigemIdIeTi1ODqjx6Tad9NCVnPRwewWlKkVab5PlK8DCtPTyX7S8g== + +"@algolia/cache-browser-local-storage@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.14.2.tgz#d5b1b90130ca87c6321de876e167df9ec6524936" + integrity sha512-FRweBkK/ywO+GKYfAWbrepewQsPTIEirhi1BdykX9mxvBPtGNKccYAxvGdDCumU1jL4r3cayio4psfzKMejBlA== dependencies: - "@algolia/cache-common" "4.13.1" + "@algolia/cache-common" "4.14.2" -"@algolia/cache-common@4.13.1": - version "4.13.1" - resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.13.1.tgz#c933fdec9f73b4f7c69d5751edc92eee4a63d76b" - integrity sha512-7Vaf6IM4L0Jkl3sYXbwK+2beQOgVJ0mKFbz/4qSxKd1iy2Sp77uTAazcX+Dlexekg1fqGUOSO7HS4Sx47ZJmjA== +"@algolia/cache-common@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.14.2.tgz#b946b6103c922f0c06006fb6929163ed2c67d598" + integrity sha512-SbvAlG9VqNanCErr44q6lEKD2qoK4XtFNx9Qn8FK26ePCI8I9yU7pYB+eM/cZdS9SzQCRJBbHUumVr4bsQ4uxg== -"@algolia/cache-in-memory@4.13.1": - version "4.13.1" - resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.13.1.tgz#c19baa67b4597e1a93e987350613ab3b88768832" - integrity sha512-pZzybCDGApfA/nutsFK1P0Sbsq6fYJU3DwIvyKg4pURerlJM4qZbB9bfLRef0FkzfQu7W11E4cVLCIOWmyZeuQ== +"@algolia/cache-in-memory@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.14.2.tgz#88e4a21474f9ac05331c2fa3ceb929684a395a24" + integrity sha512-HrOukWoop9XB/VFojPv1R5SVXowgI56T9pmezd/djh2JnVN/vXswhXV51RKy4nCpqxyHt/aGFSq2qkDvj6KiuQ== dependencies: - "@algolia/cache-common" "4.13.1" + "@algolia/cache-common" "4.14.2" -"@algolia/client-account@4.13.1": - version "4.13.1" - resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.13.1.tgz#fea591943665477a23922ab31863ad0732e26c66" - integrity sha512-TFLiZ1KqMiir3FNHU+h3b0MArmyaHG+eT8Iojio6TdpeFcAQ1Aiy+2gb3SZk3+pgRJa/BxGmDkRUwE5E/lv3QQ== +"@algolia/client-account@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.14.2.tgz#b76ac1ba9ea71e8c3f77a1805b48350dc0728a16" + integrity sha512-WHtriQqGyibbb/Rx71YY43T0cXqyelEU0lB2QMBRXvD2X0iyeGl4qMxocgEIcbHyK7uqE7hKgjT8aBrHqhgc1w== dependencies: - "@algolia/client-common" "4.13.1" - "@algolia/client-search" "4.13.1" - "@algolia/transporter" "4.13.1" + "@algolia/client-common" "4.14.2" + "@algolia/client-search" "4.14.2" + "@algolia/transporter" "4.14.2" -"@algolia/client-analytics@4.13.1": - version "4.13.1" - resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.13.1.tgz#5275956b2d0d16997148f2085f1701b6c39ecc32" - integrity sha512-iOS1JBqh7xaL5x00M5zyluZ9+9Uy9GqtYHv/2SMuzNW1qP7/0doz1lbcsP3S7KBbZANJTFHUOfuqyRLPk91iFA== +"@algolia/client-analytics@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.14.2.tgz#ca04dcaf9a78ee5c92c5cb5e9c74cf031eb2f1fb" + integrity sha512-yBvBv2mw+HX5a+aeR0dkvUbFZsiC4FKSnfqk9rrfX+QrlNOKEhCG0tJzjiOggRW4EcNqRmaTULIYvIzQVL2KYQ== dependencies: - "@algolia/client-common" "4.13.1" - "@algolia/client-search" "4.13.1" - "@algolia/requester-common" "4.13.1" - "@algolia/transporter" "4.13.1" + "@algolia/client-common" "4.14.2" + "@algolia/client-search" "4.14.2" + "@algolia/requester-common" "4.14.2" + "@algolia/transporter" "4.14.2" -"@algolia/client-common@4.13.1": - version "4.13.1" - resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.13.1.tgz#3bf9e3586f20ef85bbb56ccca390f7dbe57c8f4f" - integrity sha512-LcDoUE0Zz3YwfXJL6lJ2OMY2soClbjrrAKB6auYVMNJcoKZZ2cbhQoFR24AYoxnGUYBER/8B+9sTBj5bj/Gqbg== +"@algolia/client-common@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.14.2.tgz#e1324e167ffa8af60f3e8bcd122110fd0bfd1300" + integrity sha512-43o4fslNLcktgtDMVaT5XwlzsDPzlqvqesRi4MjQz2x4/Sxm7zYg5LRYFol1BIhG6EwxKvSUq8HcC/KxJu3J0Q== dependencies: - "@algolia/requester-common" "4.13.1" - "@algolia/transporter" "4.13.1" + "@algolia/requester-common" "4.14.2" + "@algolia/transporter" "4.14.2" -"@algolia/client-personalization@4.13.1": - version "4.13.1" - resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-4.13.1.tgz#438a1f58576ef19c4ad4addb8417bdacfe2fce2e" - integrity sha512-1CqrOW1ypVrB4Lssh02hP//YxluoIYXAQCpg03L+/RiXJlCs+uIqlzC0ctpQPmxSlTK6h07kr50JQoYH/TIM9w== +"@algolia/client-personalization@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-4.14.2.tgz#656bbb6157a3dd1a4be7de65e457fda136c404ec" + integrity sha512-ACCoLi0cL8CBZ1W/2juehSltrw2iqsQBnfiu/Rbl9W2yE6o2ZUb97+sqN/jBqYNQBS+o0ekTMKNkQjHHAcEXNw== dependencies: - "@algolia/client-common" "4.13.1" - "@algolia/requester-common" "4.13.1" - "@algolia/transporter" "4.13.1" + "@algolia/client-common" "4.14.2" + "@algolia/requester-common" "4.14.2" + "@algolia/transporter" "4.14.2" -"@algolia/client-search@4.13.1": - version "4.13.1" - resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.13.1.tgz#5501deed01e23c33d4aaa9f9eb96a849f0fce313" - integrity sha512-YQKYA83MNRz3FgTNM+4eRYbSmHi0WWpo019s5SeYcL3HUan/i5R09VO9dk3evELDFJYciiydSjbsmhBzbpPP2A== +"@algolia/client-search@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.14.2.tgz#357bdb7e640163f0e33bad231dfcc21f67dc2e92" + integrity sha512-L5zScdOmcZ6NGiVbLKTvP02UbxZ0njd5Vq9nJAmPFtjffUSOGEp11BmD2oMJ5QvARgx2XbX4KzTTNS5ECYIMWw== dependencies: - "@algolia/client-common" "4.13.1" - "@algolia/requester-common" "4.13.1" - "@algolia/transporter" "4.13.1" + "@algolia/client-common" "4.14.2" + "@algolia/requester-common" "4.14.2" + "@algolia/transporter" "4.14.2" -"@algolia/logger-common@4.13.1": - version "4.13.1" - resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.13.1.tgz#4221378e701e3f1eacaa051bcd4ba1f25ddfaf4d" - integrity sha512-L6slbL/OyZaAXNtS/1A8SAbOJeEXD5JcZeDCPYDqSTYScfHu+2ePRTDMgUTY4gQ7HsYZ39N1LujOd8WBTmM2Aw== +"@algolia/logger-common@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.14.2.tgz#b74b3a92431f92665519d95942c246793ec390ee" + integrity sha512-/JGlYvdV++IcMHBnVFsqEisTiOeEr6cUJtpjz8zc0A9c31JrtLm318Njc72p14Pnkw3A/5lHHh+QxpJ6WFTmsA== -"@algolia/logger-console@4.13.1": - version "4.13.1" - resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.13.1.tgz#423d358e4992dd4bceab0d9a4e99d1fd68107043" - integrity sha512-7jQOTftfeeLlnb3YqF8bNgA2GZht7rdKkJ31OCeSH2/61haO0tWPoNRjZq9XLlgMQZH276pPo0NdiArcYPHjCA== +"@algolia/logger-console@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.14.2.tgz#ec49cb47408f5811d4792598683923a800abce7b" + integrity sha512-8S2PlpdshbkwlLCSAB5f8c91xyc84VM9Ar9EdfE9UmX+NrKNYnWR1maXXVDQQoto07G1Ol/tYFnFVhUZq0xV/g== dependencies: - "@algolia/logger-common" "4.13.1" + "@algolia/logger-common" "4.14.2" -"@algolia/requester-browser-xhr@4.13.1": - version "4.13.1" - resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.13.1.tgz#f8ea79233cf6f0392feaf31e35a6b40d68c5bc9e" - integrity sha512-oa0CKr1iH6Nc7CmU6RE7TnXMjHnlyp7S80pP/LvZVABeJHX3p/BcSCKovNYWWltgTxUg0U1o+2uuy8BpMKljwA== +"@algolia/requester-browser-xhr@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.14.2.tgz#a2cd4d9d8d90d53109cc7f3682dc6ebf20f798f2" + integrity sha512-CEh//xYz/WfxHFh7pcMjQNWgpl4wFB85lUMRyVwaDPibNzQRVcV33YS+63fShFWc2+42YEipFGH2iPzlpszmDw== dependencies: - "@algolia/requester-common" "4.13.1" + "@algolia/requester-common" "4.14.2" -"@algolia/requester-common@4.13.1": - version "4.13.1" - resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.13.1.tgz#daea143d15ab6ed3909c4c45877f1b6c36a16179" - integrity sha512-eGVf0ID84apfFEuXsaoSgIxbU3oFsIbz4XiotU3VS8qGCJAaLVUC5BUJEkiFENZIhon7hIB4d0RI13HY4RSA+w== +"@algolia/requester-common@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.14.2.tgz#bc4e9e5ee16c953c0ecacbfb334a33c30c28b1a1" + integrity sha512-73YQsBOKa5fvVV3My7iZHu1sUqmjjfs9TteFWwPwDmnad7T0VTCopttcsM3OjLxZFtBnX61Xxl2T2gmG2O4ehg== -"@algolia/requester-node-http@4.13.1": - version "4.13.1" - resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.13.1.tgz#32c63d4c009f22d97e396406de7af9b66fb8e89d" - integrity sha512-7C0skwtLdCz5heKTVe/vjvrqgL/eJxmiEjHqXdtypcE5GCQCYI15cb+wC4ytYioZDMiuDGeVYmCYImPoEgUGPw== +"@algolia/requester-node-http@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.14.2.tgz#7c1223a1785decaab1def64c83dade6bea45e115" + integrity sha512-oDbb02kd1o5GTEld4pETlPZLY0e+gOSWjWMJHWTgDXbv9rm/o2cF7japO6Vj1ENnrqWvLBmW1OzV9g6FUFhFXg== dependencies: - "@algolia/requester-common" "4.13.1" + "@algolia/requester-common" "4.14.2" -"@algolia/transporter@4.13.1": - version "4.13.1" - resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.13.1.tgz#509e03e9145102843d5be4a031c521f692d4e8d6" - integrity sha512-pICnNQN7TtrcYJqqPEXByV8rJ8ZRU2hCiIKLTLRyNpghtQG3VAFk6fVtdzlNfdUGZcehSKGarPIZEHlQXnKjgw== +"@algolia/transporter@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.14.2.tgz#77c069047fb1a4359ee6a51f51829508e44a1e3d" + integrity sha512-t89dfQb2T9MFQHidjHcfhh6iGMNwvuKUvojAj+JsrHAGbuSy7yE4BylhLX6R0Q1xYRoC4Vvv+O5qIw/LdnQfsQ== dependencies: - "@algolia/cache-common" "4.13.1" - "@algolia/logger-common" "4.13.1" - "@algolia/requester-common" "4.13.1" + "@algolia/cache-common" "4.14.2" + "@algolia/logger-common" "4.14.2" + "@algolia/requester-common" "4.14.2" "@ampproject/remapping@^2.1.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.1.2.tgz#4edca94973ded9630d20101cd8559cedb8d8bd34" - integrity sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg== + version "2.2.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== dependencies: - "@jridgewell/trace-mapping" "^0.3.0" + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" "@apideck/better-ajv-errors@^0.3.1": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.3.tgz#ab0b1e981e1749bf59736cf7ebe25cfc9f949c15" - integrity sha512-9o+HO2MbJhJHjDYZaDxJmSDckvDpiuItEsrIShV0DXeCshXWRHhqYyU/PKHMkuClOmFnZhRd6wzv4vpDu/dRKg== + version "0.3.6" + resolved "https://registry.yarnpkg.com/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz#957d4c28e886a64a8141f7522783be65733ff097" + integrity sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA== dependencies: json-schema "^0.4.0" jsonpointer "^5.0.0" leven "^3.1.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.8.3": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" - integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.8.3": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== dependencies: - "@babel/highlight" "^7.16.7" + "@babel/highlight" "^7.18.6" -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.8", "@babel/compat-data@^7.17.0", "@babel/compat-data@^7.17.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.7.tgz#078d8b833fbbcc95286613be8c716cef2b519fa2" - integrity sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ== +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.0", "@babel/compat-data@^7.20.1": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.5.tgz#86f172690b093373a933223b4745deeb6049e733" + integrity sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g== "@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.7.2", "@babel/core@^7.8.0": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.9.tgz#6bae81a06d95f4d0dec5bb9d74bbc1f58babdcfe" - integrity sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.5.tgz#45e2114dc6cd4ab167f81daf7820e8fa1250d113" + integrity sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ== dependencies: "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.17.9" - "@babel/helper-compilation-targets" "^7.17.7" - "@babel/helper-module-transforms" "^7.17.7" - "@babel/helpers" "^7.17.9" - "@babel/parser" "^7.17.9" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.9" - "@babel/types" "^7.17.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.20.5" + "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-module-transforms" "^7.20.2" + "@babel/helpers" "^7.20.5" + "@babel/parser" "^7.20.5" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.20.5" + "@babel/types" "^7.20.5" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -156,391 +162,393 @@ semver "^6.3.0" "@babel/eslint-parser@^7.16.3": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.17.0.tgz#eabb24ad9f0afa80e5849f8240d0e5facc2d90d6" - integrity sha512-PUEJ7ZBXbRkbq3qqM/jZ2nIuakUBqCYc7Qf52Lj7dlZ6zERnqisdHioL0l4wwQZnmskMeasqUNzLBFKs3nylXA== + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.19.1.tgz#4f68f6b0825489e00a24b41b6a1ae35414ecd2f4" + integrity sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ== dependencies: - eslint-scope "^5.1.1" + "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" semver "^6.3.0" -"@babel/generator@^7.17.9", "@babel/generator@^7.7.2": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.9.tgz#f4af9fd38fa8de143c29fce3f71852406fc1e2fc" - integrity sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ== +"@babel/generator@^7.20.5", "@babel/generator@^7.7.2": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.5.tgz#cb25abee3178adf58d6814b68517c62bdbfdda95" + integrity sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA== dependencies: - "@babel/types" "^7.17.0" + "@babel/types" "^7.20.5" + "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" - source-map "^0.5.0" -"@babel/helper-annotate-as-pure@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" - integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== +"@babel/helper-annotate-as-pure@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" + integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== dependencies: - "@babel/types" "^7.16.7" + "@babel/types" "^7.18.6" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b" - integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" + integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== dependencies: - "@babel/helper-explode-assignable-expression" "^7.16.7" - "@babel/types" "^7.16.7" + "@babel/helper-explode-assignable-expression" "^7.18.6" + "@babel/types" "^7.18.9" -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.17.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz#a3c2924f5e5f0379b356d4cfb313d1414dc30e46" - integrity sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w== +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz#6bf5374d424e1b3922822f1d9bdaa43b1a139d0a" + integrity sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ== dependencies: - "@babel/compat-data" "^7.17.7" - "@babel/helper-validator-option" "^7.16.7" - browserslist "^4.17.5" + "@babel/compat-data" "^7.20.0" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.21.3" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7", "@babel/helper-create-class-features-plugin@^7.17.6", "@babel/helper-create-class-features-plugin@^7.17.9": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.9.tgz#71835d7fb9f38bd9f1378e40a4c0902fdc2ea49d" - integrity sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ== +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.2", "@babel/helper-create-class-features-plugin@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.5.tgz#327154eedfb12e977baa4ecc72e5806720a85a06" + integrity sha512-3RCdA/EmEaikrhayahwToF0fpweU/8o2p8vhc1c/1kftHOdTKuC65kik/TLc+qfbS8JKw4qqJbne4ovICDhmww== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.17.9" - "@babel/helper-member-expression-to-functions" "^7.17.7" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/helper-replace-supers" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-member-expression-to-functions" "^7.18.9" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-replace-supers" "^7.19.1" + "@babel/helper-split-export-declaration" "^7.18.6" -"@babel/helper-create-regexp-features-plugin@^7.16.7": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz#1dcc7d40ba0c6b6b25618997c5dbfd310f186fe1" - integrity sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA== +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz#5ea79b59962a09ec2acf20a963a01ab4d076ccca" + integrity sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - regexpu-core "^5.0.1" + "@babel/helper-annotate-as-pure" "^7.18.6" + regexpu-core "^5.2.1" -"@babel/helper-define-polyfill-provider@^0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz#52411b445bdb2e676869e5a74960d2d3826d2665" - integrity sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA== +"@babel/helper-define-polyfill-provider@^0.3.3": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz#8612e55be5d51f0cd1f36b4a5a83924e89884b7a" + integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== dependencies: - "@babel/helper-compilation-targets" "^7.13.0" - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/traverse" "^7.13.0" + "@babel/helper-compilation-targets" "^7.17.7" + "@babel/helper-plugin-utils" "^7.16.7" debug "^4.1.1" lodash.debounce "^4.0.8" resolve "^1.14.2" semver "^6.1.2" -"@babel/helper-environment-visitor@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" - integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + +"@babel/helper-explode-assignable-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" + integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== dependencies: - "@babel/types" "^7.16.7" + "@babel/types" "^7.18.6" -"@babel/helper-explode-assignable-expression@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a" - integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ== +"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" + integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== dependencies: - "@babel/types" "^7.16.7" + "@babel/template" "^7.18.10" + "@babel/types" "^7.19.0" -"@babel/helper-function-name@^7.16.7", "@babel/helper-function-name@^7.17.9": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12" - integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg== +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== dependencies: - "@babel/template" "^7.16.7" - "@babel/types" "^7.17.0" + "@babel/types" "^7.18.6" -"@babel/helper-hoist-variables@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" - integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== +"@babel/helper-member-expression-to-functions@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz#1531661e8375af843ad37ac692c132841e2fd815" + integrity sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg== dependencies: - "@babel/types" "^7.16.7" + "@babel/types" "^7.18.9" -"@babel/helper-member-expression-to-functions@^7.16.7", "@babel/helper-member-expression-to-functions@^7.17.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz#a34013b57d8542a8c4ff8ba3f747c02452a4d8c4" - integrity sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw== +"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== dependencies: - "@babel/types" "^7.17.0" + "@babel/types" "^7.18.6" -"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" - integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== +"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.19.6", "@babel/helper-module-transforms@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz#ac53da669501edd37e658602a21ba14c08748712" + integrity sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA== dependencies: - "@babel/types" "^7.16.7" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.20.1" + "@babel/types" "^7.20.2" -"@babel/helper-module-transforms@^7.16.7", "@babel/helper-module-transforms@^7.17.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz#3943c7f777139e7954a5355c815263741a9c1cbd" - integrity sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw== +"@babel/helper-optimise-call-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" + integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== dependencies: - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-simple-access" "^7.17.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/helper-validator-identifier" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.3" - "@babel/types" "^7.17.0" + "@babel/types" "^7.18.6" -"@babel/helper-optimise-call-expression@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2" - integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" + integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== + +"@babel/helper-remap-async-to-generator@^7.18.6", "@babel/helper-remap-async-to-generator@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" + integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== dependencies: - "@babel/types" "^7.16.7" + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-wrap-function" "^7.18.9" + "@babel/types" "^7.18.9" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" - integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== - -"@babel/helper-remap-async-to-generator@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz#29ffaade68a367e2ed09c90901986918d25e57e3" - integrity sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw== +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz#e1592a9b4b368aa6bdb8784a711e0bcbf0612b78" + integrity sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-wrap-function" "^7.16.8" - "@babel/types" "^7.16.8" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-member-expression-to-functions" "^7.18.9" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/traverse" "^7.19.1" + "@babel/types" "^7.19.0" -"@babel/helper-replace-supers@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz#e9f5f5f32ac90429c1a4bdec0f231ef0c2838ab1" - integrity sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw== +"@babel/helper-simple-access@^7.19.4", "@babel/helper-simple-access@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" + integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== dependencies: - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-member-expression-to-functions" "^7.16.7" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/traverse" "^7.16.7" - "@babel/types" "^7.16.7" + "@babel/types" "^7.20.2" -"@babel/helper-simple-access@^7.17.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz#aaa473de92b7987c6dfa7ce9a7d9674724823367" - integrity sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA== +"@babel/helper-skip-transparent-expression-wrappers@^7.18.9": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" + integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== dependencies: - "@babel/types" "^7.17.0" + "@babel/types" "^7.20.0" -"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" - integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== dependencies: - "@babel/types" "^7.16.0" + "@babel/types" "^7.18.6" -"@babel/helper-split-export-declaration@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" - integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== + +"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + +"@babel/helper-validator-option@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" + integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== + +"@babel/helper-wrap-function@^7.18.9": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" + integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== dependencies: - "@babel/types" "^7.16.7" + "@babel/helper-function-name" "^7.19.0" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.20.5" + "@babel/types" "^7.20.5" -"@babel/helper-validator-identifier@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" - integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== - -"@babel/helper-validator-option@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" - integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== - -"@babel/helper-wrap-function@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz#58afda087c4cd235de92f7ceedebca2c41274200" - integrity sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw== +"@babel/helpers@^7.20.5": + version "7.20.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.6.tgz#e64778046b70e04779dfbdf924e7ebb45992c763" + integrity sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w== dependencies: - "@babel/helper-function-name" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.16.8" - "@babel/types" "^7.16.8" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.20.5" + "@babel/types" "^7.20.5" -"@babel/helpers@^7.17.9": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.9.tgz#b2af120821bfbe44f9907b1826e168e819375a1a" - integrity sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q== +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== dependencies: - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.9" - "@babel/types" "^7.17.0" - -"@babel/highlight@^7.16.7": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.9.tgz#61b2ee7f32ea0454612def4fccdae0de232b73e3" - integrity sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg== - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" + "@babel/helper-validator-identifier" "^7.18.6" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.9": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.9.tgz#9c94189a6062f0291418ca021077983058e171ef" - integrity sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.5.tgz#7f3c7335fe417665d929f34ae5dceae4c04015e8" + integrity sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA== -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz#4eda6d6c2a0aa79c70fa7b6da67763dfe2141050" - integrity sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" + integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz#cc001234dfc139ac45f6bcf801866198c8c72ff9" - integrity sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz#a11af19aa373d68d561f08e0a57242350ed0ec50" + integrity sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - "@babel/plugin-proposal-optional-chaining" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" + "@babel/plugin-proposal-optional-chaining" "^7.18.9" -"@babel/plugin-proposal-async-generator-functions@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz#3bdd1ebbe620804ea9416706cd67d60787504bc8" - integrity sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ== +"@babel/plugin-proposal-async-generator-functions@^7.20.1": + version "7.20.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.1.tgz#352f02baa5d69f4e7529bdac39aaa02d41146af9" + integrity sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-remap-async-to-generator" "^7.16.8" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-remap-async-to-generator" "^7.18.9" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-proposal-class-properties@^7.16.0", "@babel/plugin-proposal-class-properties@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz#925cad7b3b1a2fcea7e59ecc8eb5954f961f91b0" - integrity sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww== +"@babel/plugin-proposal-class-properties@^7.16.0", "@babel/plugin-proposal-class-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" + integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-proposal-class-static-block@^7.16.7": - version "7.17.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz#164e8fd25f0d80fa48c5a4d1438a6629325ad83c" - integrity sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA== +"@babel/plugin-proposal-class-static-block@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz#8aa81d403ab72d3962fc06c26e222dacfc9b9020" + integrity sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.17.6" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-proposal-decorators@^7.16.4": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.9.tgz#67a1653be9c77ce5b6c318aa90c8287b87831619" - integrity sha512-EfH2LZ/vPa2wuPwJ26j+kYRkaubf89UlwxKXtxqEm57HrgSEYDB8t4swFP+p8LcI9yiP9ZRJJjo/58hS6BnaDA== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.20.5.tgz#28ba1a0e5044664a512967a19407d7fc26925394" + integrity sha512-Lac7PpRJXcC3s9cKsBfl+uc+DYXU5FD06BrTFunQO6QIQT+DwyzDPURAowI3bcvD1dZF/ank1Z5rstUJn3Hn4Q== dependencies: - "@babel/helper-create-class-features-plugin" "^7.17.9" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-replace-supers" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/plugin-syntax-decorators" "^7.17.0" - charcodes "^0.2.0" + "@babel/helper-create-class-features-plugin" "^7.20.5" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-replace-supers" "^7.19.1" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/plugin-syntax-decorators" "^7.19.0" -"@babel/plugin-proposal-dynamic-import@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz#c19c897eaa46b27634a00fee9fb7d829158704b2" - integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg== +"@babel/plugin-proposal-dynamic-import@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94" + integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-proposal-export-namespace-from@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz#09de09df18445a5786a305681423ae63507a6163" - integrity sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA== +"@babel/plugin-proposal-export-namespace-from@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203" + integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-json-strings@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz#9732cb1d17d9a2626a08c5be25186c195b6fa6e8" - integrity sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ== +"@babel/plugin-proposal-json-strings@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b" + integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-proposal-logical-assignment-operators@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz#be23c0ba74deec1922e639832904be0bea73cdea" - integrity sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg== +"@babel/plugin-proposal-logical-assignment-operators@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz#8148cbb350483bf6220af06fa6db3690e14b2e23" + integrity sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz#141fc20b6857e59459d430c850a0011e36561d99" - integrity sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ== +"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" + integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-proposal-numeric-separator@^7.16.0", "@babel/plugin-proposal-numeric-separator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9" - integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw== +"@babel/plugin-proposal-numeric-separator@^7.16.0", "@babel/plugin-proposal-numeric-separator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" + integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.16.7": - version "7.17.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz#d9eb649a54628a51701aef7e0ea3d17e2b9dd390" - integrity sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw== +"@babel/plugin-proposal-object-rest-spread@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.2.tgz#a556f59d555f06961df1e572bb5eca864c84022d" + integrity sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ== dependencies: - "@babel/compat-data" "^7.17.0" - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/compat-data" "^7.20.1" + "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.16.7" + "@babel/plugin-transform-parameters" "^7.20.1" -"@babel/plugin-proposal-optional-catch-binding@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz#c623a430674ffc4ab732fd0a0ae7722b67cb74cf" - integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA== +"@babel/plugin-proposal-optional-catch-binding@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" + integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.16.0", "@babel/plugin-proposal-optional-chaining@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz#7cd629564724816c0e8a969535551f943c64c39a" - integrity sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA== +"@babel/plugin-proposal-optional-chaining@^7.16.0", "@babel/plugin-proposal-optional-chaining@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz#e8e8fe0723f2563960e4bf5e9690933691915993" + integrity sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-proposal-private-methods@^7.16.0", "@babel/plugin-proposal-private-methods@^7.16.11": - version "7.16.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz#e8df108288555ff259f4527dbe84813aac3a1c50" - integrity sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw== +"@babel/plugin-proposal-private-methods@^7.16.0", "@babel/plugin-proposal-private-methods@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" + integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.10" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-proposal-private-property-in-object@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz#b0b8cef543c2c3d57e59e2c611994861d46a3fce" - integrity sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ== +"@babel/plugin-proposal-private-property-in-object@^7.18.6": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz#309c7668f2263f1c711aa399b5a9a6291eef6135" + integrity sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-create-class-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.20.5" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-proposal-unicode-property-regex@^7.16.7", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz#635d18eb10c6214210ffc5ff4932552de08188a2" - integrity sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg== +"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" + integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -570,12 +578,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-decorators@^7.17.0": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.17.0.tgz#a2be3b2c9fe7d78bd4994e790896bc411e2f166d" - integrity sha512-qWe85yCXsvDEluNP0OyeQjH63DlhAR3W7K9BxxU1MvbDb48tgBG+Ao6IJJ6smPDrrVzSQZrbF6donpkFBMcs3A== +"@babel/plugin-syntax-decorators@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.19.0.tgz#5f13d1d8fce96951bea01a10424463c9a5b3a599" + integrity sha512-xaBZUEDntt4faL1yN8oIFlhfXeQAWJW7CLKYsHTUqriCUbj8xOra8bfxxKGi/UwExPFBuPdH4XfHc9rGQhrVkQ== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.19.0" "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" @@ -591,12 +599,19 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-flow@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.16.7.tgz#202b147e5892b8452bbb0bb269c7ed2539ab8832" - integrity sha512-UDo3YGQO0jH6ytzVwgSLv9i/CzMcUjbKenL67dTrAZPPv6GFAtDhe6jqnvmoKzC/7htNTohhos+onPtDMqJwaQ== +"@babel/plugin-syntax-flow@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz#774d825256f2379d06139be0c723c4dd444f3ca1" + integrity sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-import-assertions@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" + integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" @@ -612,12 +627,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.12.13", "@babel/plugin-syntax-jsx@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz#50b6571d13f764266a113d77c82b4a6508bbe665" - integrity sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q== +"@babel/plugin-syntax-jsx@^7.17.12", "@babel/plugin-syntax-jsx@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" + integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" @@ -675,363 +690,364 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.16.7", "@babel/plugin-syntax-typescript@^7.7.2": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz#39c9b55ee153151990fb038651d58d3fd03f98f8" - integrity sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A== +"@babel/plugin-syntax-typescript@^7.20.0", "@babel/plugin-syntax-typescript@^7.7.2": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz#4e9a0cfc769c85689b77a2e642d24e9f697fc8c7" + integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.19.0" -"@babel/plugin-transform-arrow-functions@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz#44125e653d94b98db76369de9c396dc14bef4154" - integrity sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ== +"@babel/plugin-transform-arrow-functions@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz#19063fcf8771ec7b31d742339dac62433d0611fe" + integrity sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-async-to-generator@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz#b83dff4b970cf41f1b819f8b49cc0cfbaa53a808" - integrity sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg== +"@babel/plugin-transform-async-to-generator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz#ccda3d1ab9d5ced5265fdb13f1882d5476c71615" + integrity sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag== dependencies: - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-remap-async-to-generator" "^7.16.8" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-remap-async-to-generator" "^7.18.6" -"@babel/plugin-transform-block-scoped-functions@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620" - integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg== +"@babel/plugin-transform-block-scoped-functions@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" + integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-block-scoping@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz#f50664ab99ddeaee5bc681b8f3a6ea9d72ab4f87" - integrity sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ== +"@babel/plugin-transform-block-scoping@^7.20.2": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.5.tgz#401215f9dc13dc5262940e2e527c9536b3d7f237" + integrity sha512-WvpEIW9Cbj9ApF3yJCjIEEf1EiNJLtXagOrL5LNWEZOo3jv8pmPoYTSNJQvqej8OavVlgOoOPw6/htGZro6IkA== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-classes@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz#8f4b9562850cd973de3b498f1218796eb181ce00" - integrity sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ== +"@babel/plugin-transform-classes@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.2.tgz#c0033cf1916ccf78202d04be4281d161f6709bb2" + integrity sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-replace-supers" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-replace-supers" "^7.19.1" + "@babel/helper-split-export-declaration" "^7.18.6" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz#66dee12e46f61d2aae7a73710f591eb3df616470" - integrity sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw== +"@babel/plugin-transform-computed-properties@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz#2357a8224d402dad623caf6259b611e56aec746e" + integrity sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-destructuring@^7.16.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz#49dc2675a7afa9a5e4c6bdee636061136c3408d1" - integrity sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ== +"@babel/plugin-transform-destructuring@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.2.tgz#c23741cfa44ddd35f5e53896e88c75331b8b2792" + integrity sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz#6b2d67686fab15fb6a7fd4bd895d5982cfc81241" - integrity sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ== +"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" + integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-duplicate-keys@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz#2207e9ca8f82a0d36a5a67b6536e7ef8b08823c9" - integrity sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw== +"@babel/plugin-transform-duplicate-keys@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" + integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-exponentiation-operator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz#efa9862ef97e9e9e5f653f6ddc7b665e8536fe9b" - integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA== +"@babel/plugin-transform-exponentiation-operator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" + integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-flow-strip-types@^7.16.0": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.16.7.tgz#291fb140c78dabbf87f2427e7c7c332b126964b8" - integrity sha512-mzmCq3cNsDpZZu9FADYYyfZJIOrSONmHcop2XEKPdBNMa4PDC4eEvcOvzZaCNcjKu72v0XQlA5y1g58aLRXdYg== + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.19.0.tgz#e9e8606633287488216028719638cbbb2f2dde8f" + integrity sha512-sgeMlNaQVbCSpgLSKP4ZZKfsJVnFnNQlUSk6gPYzR/q7tzCgQF2t8RBKAP6cKJeZdveei7Q7Jm527xepI8lNLg== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-flow" "^7.16.7" + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/plugin-syntax-flow" "^7.18.6" -"@babel/plugin-transform-for-of@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz#649d639d4617dff502a9a158c479b3b556728d8c" - integrity sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg== +"@babel/plugin-transform-for-of@^7.18.8": + version "7.18.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz#6ef8a50b244eb6a0bdbad0c7c61877e4e30097c1" + integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-function-name@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf" - integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA== +"@babel/plugin-transform-function-name@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" + integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== dependencies: - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz#254c9618c5ff749e87cb0c0cef1a0a050c0bdab1" - integrity sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ== +"@babel/plugin-transform-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" + integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-member-expression-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384" - integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw== +"@babel/plugin-transform-member-expression-literals@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" + integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-modules-amd@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz#b28d323016a7daaae8609781d1f8c9da42b13186" - integrity sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g== +"@babel/plugin-transform-modules-amd@^7.19.6": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz#aca391801ae55d19c4d8d2ebfeaa33df5f2a2cbd" + integrity sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg== dependencies: - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - babel-plugin-dynamic-import-node "^2.3.3" + "@babel/helper-module-transforms" "^7.19.6" + "@babel/helper-plugin-utils" "^7.19.0" -"@babel/plugin-transform-modules-commonjs@^7.16.8": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.9.tgz#274be1a2087beec0254d4abd4d86e52442e1e5b6" - integrity sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw== +"@babel/plugin-transform-modules-commonjs@^7.19.6": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz#25b32feef24df8038fc1ec56038917eacb0b730c" + integrity sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ== dependencies: - "@babel/helper-module-transforms" "^7.17.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-simple-access" "^7.17.7" - babel-plugin-dynamic-import-node "^2.3.3" + "@babel/helper-module-transforms" "^7.19.6" + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-simple-access" "^7.19.4" -"@babel/plugin-transform-modules-systemjs@^7.16.7": - version "7.17.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz#81fd834024fae14ea78fbe34168b042f38703859" - integrity sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw== +"@babel/plugin-transform-modules-systemjs@^7.19.6": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz#59e2a84064b5736a4471b1aa7b13d4431d327e0d" + integrity sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ== dependencies: - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-module-transforms" "^7.17.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-validator-identifier" "^7.16.7" - babel-plugin-dynamic-import-node "^2.3.3" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-module-transforms" "^7.19.6" + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-validator-identifier" "^7.19.1" -"@babel/plugin-transform-modules-umd@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz#23dad479fa585283dbd22215bff12719171e7618" - integrity sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ== +"@babel/plugin-transform-modules-umd@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9" + integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== dependencies: - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-module-transforms" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-named-capturing-groups-regex@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz#7f860e0e40d844a02c9dcf9d84965e7dfd666252" - integrity sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw== +"@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz#626298dd62ea51d452c3be58b285d23195ba69a8" + integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-create-regexp-features-plugin" "^7.20.5" + "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-new-target@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz#9967d89a5c243818e0800fdad89db22c5f514244" - integrity sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg== +"@babel/plugin-transform-new-target@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz#d128f376ae200477f37c4ddfcc722a8a1b3246a8" + integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-object-super@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94" - integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw== +"@babel/plugin-transform-object-super@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" + integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-replace-supers" "^7.18.6" -"@babel/plugin-transform-parameters@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz#a1721f55b99b736511cb7e0152f61f17688f331f" - integrity sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw== +"@babel/plugin-transform-parameters@^7.20.1": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.5.tgz#f8f9186c681d10c3de7620c916156d893c8a019e" + integrity sha512-h7plkOmcndIUWXZFLgpbrh2+fXAi47zcUX7IrOQuZdLD0I0KvjJ6cvo3BEcAOsDOcZhVKGJqv07mkSqK0y2isQ== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-property-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55" - integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw== +"@babel/plugin-transform-property-literals@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" + integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-react-constant-elements@^7.12.1": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.12.13.tgz#f8ee56888545d53d80f766b3cc1563ab2c241f92" - integrity sha512-qmzKVTn46Upvtxv8LQoQ8mTCdUC83AOVQIQm57e9oekLT5cmK9GOMOfcWhe8jMNx4UJXn/UDhVZ/7lGofVNeDQ== + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.20.2.tgz#3f02c784e0b711970d7d8ccc96c4359d64e27ac7" + integrity sha512-KS/G8YI8uwMGKErLFOHS/ekhqdHhpEloxs43NecQHVgo2QuQSyJhGIY1fL8UGl9wy5ItVwwoUL4YxVqsplGq2g== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-react-display-name@^7.16.0", "@babel/plugin-transform-react-display-name@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz#7b6d40d232f4c0f550ea348593db3b21e2404340" - integrity sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg== +"@babel/plugin-transform-react-display-name@^7.16.0", "@babel/plugin-transform-react-display-name@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz#8b1125f919ef36ebdfff061d664e266c666b9415" + integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-react-jsx-development@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz#43a00724a3ed2557ed3f276a01a929e6686ac7b8" - integrity sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A== +"@babel/plugin-transform-react-jsx-development@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz#dbe5c972811e49c7405b630e4d0d2e1380c0ddc5" + integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== dependencies: - "@babel/plugin-transform-react-jsx" "^7.16.7" + "@babel/plugin-transform-react-jsx" "^7.18.6" -"@babel/plugin-transform-react-jsx@^7.16.7": - version "7.17.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.3.tgz#eac1565da176ccb1a715dae0b4609858808008c1" - integrity sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ== +"@babel/plugin-transform-react-jsx@^7.18.6": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz#b3cbb7c3a00b92ec8ae1027910e331ba5c500eb9" + integrity sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-jsx" "^7.16.7" - "@babel/types" "^7.17.0" + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/plugin-syntax-jsx" "^7.18.6" + "@babel/types" "^7.19.0" -"@babel/plugin-transform-react-pure-annotations@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz#232bfd2f12eb551d6d7d01d13fe3f86b45eb9c67" - integrity sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA== +"@babel/plugin-transform-react-pure-annotations@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz#561af267f19f3e5d59291f9950fd7b9663d0d844" + integrity sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-regenerator@^7.16.7": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz#0a33c3a61cf47f45ed3232903683a0afd2d3460c" - integrity sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ== +"@babel/plugin-transform-regenerator@^7.18.6": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz#57cda588c7ffb7f4f8483cc83bdcea02a907f04d" + integrity sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ== dependencies: - regenerator-transform "^0.15.0" + "@babel/helper-plugin-utils" "^7.20.2" + regenerator-transform "^0.15.1" -"@babel/plugin-transform-reserved-words@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz#1d798e078f7c5958eec952059c460b220a63f586" - integrity sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg== +"@babel/plugin-transform-reserved-words@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" + integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-runtime@^7.16.4": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.17.0.tgz#0a2e08b5e2b2d95c4b1d3b3371a2180617455b70" - integrity sha512-fr7zPWnKXNc1xoHfrIU9mN/4XKX4VLZ45Q+oMhfsYIaHvg7mHgmhfOy/ckRWqDK7XF3QDigRpkh5DKq6+clE8A== + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz#9d2a9dbf4e12644d6f46e5e75bfbf02b5d6e9194" + integrity sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw== dependencies: - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - babel-plugin-polyfill-corejs2 "^0.3.0" - babel-plugin-polyfill-corejs3 "^0.5.0" - babel-plugin-polyfill-regenerator "^0.3.0" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.19.0" + babel-plugin-polyfill-corejs2 "^0.3.3" + babel-plugin-polyfill-corejs3 "^0.6.0" + babel-plugin-polyfill-regenerator "^0.4.1" semver "^6.3.0" -"@babel/plugin-transform-shorthand-properties@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz#e8549ae4afcf8382f711794c0c7b6b934c5fbd2a" - integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg== +"@babel/plugin-transform-shorthand-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" + integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-spread@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz#a303e2122f9f12e0105daeedd0f30fb197d8ff44" - integrity sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg== +"@babel/plugin-transform-spread@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz#dd60b4620c2fec806d60cfaae364ec2188d593b6" + integrity sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" -"@babel/plugin-transform-sticky-regex@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz#c84741d4f4a38072b9a1e2e3fd56d359552e8660" - integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw== +"@babel/plugin-transform-sticky-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc" + integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-template-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz#f3d1c45d28967c8e80f53666fc9c3e50618217ab" - integrity sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA== +"@babel/plugin-transform-template-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" + integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-typeof-symbol@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz#9cdbe622582c21368bd482b660ba87d5545d4f7e" - integrity sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ== +"@babel/plugin-transform-typeof-symbol@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" + integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-typescript@^7.16.7": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz#591ce9b6b83504903fa9dd3652c357c2ba7a1ee0" - integrity sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ== +"@babel/plugin-transform-typescript@^7.18.6": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.2.tgz#91515527b376fc122ba83b13d70b01af8fe98f3f" + integrity sha512-jvS+ngBfrnTUBfOQq8NfGnSbF9BrqlR6hjJ2yVxMkmO5nL/cdifNbI30EfjRlN4g5wYWNnMPyj5Sa6R1pbLeag== dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-typescript" "^7.16.7" + "@babel/helper-create-class-features-plugin" "^7.20.2" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-typescript" "^7.20.0" -"@babel/plugin-transform-unicode-escapes@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz#da8717de7b3287a2c6d659750c964f302b31ece3" - integrity sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q== +"@babel/plugin-transform-unicode-escapes@^7.18.10": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz#1ecfb0eda83d09bbcb77c09970c2dd55832aa246" + integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-unicode-regex@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz#0f7aa4a501198976e25e82702574c34cfebe9ef2" - integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q== +"@babel/plugin-transform-unicode-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca" + integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/preset-env@^7.11.0", "@babel/preset-env@^7.12.1", "@babel/preset-env@^7.16.4": - version "7.16.11" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.11.tgz#5dd88fd885fae36f88fd7c8342475c9f0abe2982" - integrity sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g== + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.20.2.tgz#9b1642aa47bb9f43a86f9630011780dab7f86506" + integrity sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg== dependencies: - "@babel/compat-data" "^7.16.8" - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-validator-option" "^7.16.7" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.7" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.7" - "@babel/plugin-proposal-async-generator-functions" "^7.16.8" - "@babel/plugin-proposal-class-properties" "^7.16.7" - "@babel/plugin-proposal-class-static-block" "^7.16.7" - "@babel/plugin-proposal-dynamic-import" "^7.16.7" - "@babel/plugin-proposal-export-namespace-from" "^7.16.7" - "@babel/plugin-proposal-json-strings" "^7.16.7" - "@babel/plugin-proposal-logical-assignment-operators" "^7.16.7" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.7" - "@babel/plugin-proposal-numeric-separator" "^7.16.7" - "@babel/plugin-proposal-object-rest-spread" "^7.16.7" - "@babel/plugin-proposal-optional-catch-binding" "^7.16.7" - "@babel/plugin-proposal-optional-chaining" "^7.16.7" - "@babel/plugin-proposal-private-methods" "^7.16.11" - "@babel/plugin-proposal-private-property-in-object" "^7.16.7" - "@babel/plugin-proposal-unicode-property-regex" "^7.16.7" + "@babel/compat-data" "^7.20.1" + "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-async-generator-functions" "^7.20.1" + "@babel/plugin-proposal-class-properties" "^7.18.6" + "@babel/plugin-proposal-class-static-block" "^7.18.6" + "@babel/plugin-proposal-dynamic-import" "^7.18.6" + "@babel/plugin-proposal-export-namespace-from" "^7.18.9" + "@babel/plugin-proposal-json-strings" "^7.18.6" + "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" + "@babel/plugin-proposal-numeric-separator" "^7.18.6" + "@babel/plugin-proposal-object-rest-spread" "^7.20.2" + "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" + "@babel/plugin-proposal-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-private-methods" "^7.18.6" + "@babel/plugin-proposal-private-property-in-object" "^7.18.6" + "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.20.0" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" @@ -1041,44 +1057,44 @@ "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.16.7" - "@babel/plugin-transform-async-to-generator" "^7.16.8" - "@babel/plugin-transform-block-scoped-functions" "^7.16.7" - "@babel/plugin-transform-block-scoping" "^7.16.7" - "@babel/plugin-transform-classes" "^7.16.7" - "@babel/plugin-transform-computed-properties" "^7.16.7" - "@babel/plugin-transform-destructuring" "^7.16.7" - "@babel/plugin-transform-dotall-regex" "^7.16.7" - "@babel/plugin-transform-duplicate-keys" "^7.16.7" - "@babel/plugin-transform-exponentiation-operator" "^7.16.7" - "@babel/plugin-transform-for-of" "^7.16.7" - "@babel/plugin-transform-function-name" "^7.16.7" - "@babel/plugin-transform-literals" "^7.16.7" - "@babel/plugin-transform-member-expression-literals" "^7.16.7" - "@babel/plugin-transform-modules-amd" "^7.16.7" - "@babel/plugin-transform-modules-commonjs" "^7.16.8" - "@babel/plugin-transform-modules-systemjs" "^7.16.7" - "@babel/plugin-transform-modules-umd" "^7.16.7" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.8" - "@babel/plugin-transform-new-target" "^7.16.7" - "@babel/plugin-transform-object-super" "^7.16.7" - "@babel/plugin-transform-parameters" "^7.16.7" - "@babel/plugin-transform-property-literals" "^7.16.7" - "@babel/plugin-transform-regenerator" "^7.16.7" - "@babel/plugin-transform-reserved-words" "^7.16.7" - "@babel/plugin-transform-shorthand-properties" "^7.16.7" - "@babel/plugin-transform-spread" "^7.16.7" - "@babel/plugin-transform-sticky-regex" "^7.16.7" - "@babel/plugin-transform-template-literals" "^7.16.7" - "@babel/plugin-transform-typeof-symbol" "^7.16.7" - "@babel/plugin-transform-unicode-escapes" "^7.16.7" - "@babel/plugin-transform-unicode-regex" "^7.16.7" + "@babel/plugin-transform-arrow-functions" "^7.18.6" + "@babel/plugin-transform-async-to-generator" "^7.18.6" + "@babel/plugin-transform-block-scoped-functions" "^7.18.6" + "@babel/plugin-transform-block-scoping" "^7.20.2" + "@babel/plugin-transform-classes" "^7.20.2" + "@babel/plugin-transform-computed-properties" "^7.18.9" + "@babel/plugin-transform-destructuring" "^7.20.2" + "@babel/plugin-transform-dotall-regex" "^7.18.6" + "@babel/plugin-transform-duplicate-keys" "^7.18.9" + "@babel/plugin-transform-exponentiation-operator" "^7.18.6" + "@babel/plugin-transform-for-of" "^7.18.8" + "@babel/plugin-transform-function-name" "^7.18.9" + "@babel/plugin-transform-literals" "^7.18.9" + "@babel/plugin-transform-member-expression-literals" "^7.18.6" + "@babel/plugin-transform-modules-amd" "^7.19.6" + "@babel/plugin-transform-modules-commonjs" "^7.19.6" + "@babel/plugin-transform-modules-systemjs" "^7.19.6" + "@babel/plugin-transform-modules-umd" "^7.18.6" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.19.1" + "@babel/plugin-transform-new-target" "^7.18.6" + "@babel/plugin-transform-object-super" "^7.18.6" + "@babel/plugin-transform-parameters" "^7.20.1" + "@babel/plugin-transform-property-literals" "^7.18.6" + "@babel/plugin-transform-regenerator" "^7.18.6" + "@babel/plugin-transform-reserved-words" "^7.18.6" + "@babel/plugin-transform-shorthand-properties" "^7.18.6" + "@babel/plugin-transform-spread" "^7.19.0" + "@babel/plugin-transform-sticky-regex" "^7.18.6" + "@babel/plugin-transform-template-literals" "^7.18.9" + "@babel/plugin-transform-typeof-symbol" "^7.18.9" + "@babel/plugin-transform-unicode-escapes" "^7.18.10" + "@babel/plugin-transform-unicode-regex" "^7.18.6" "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.16.8" - babel-plugin-polyfill-corejs2 "^0.3.0" - babel-plugin-polyfill-corejs3 "^0.5.0" - babel-plugin-polyfill-regenerator "^0.3.0" - core-js-compat "^3.20.2" + "@babel/types" "^7.20.2" + babel-plugin-polyfill-corejs2 "^0.3.3" + babel-plugin-polyfill-corejs3 "^0.6.0" + babel-plugin-polyfill-regenerator "^0.4.1" + core-js-compat "^3.25.1" semver "^6.3.0" "@babel/preset-modules@^0.1.5": @@ -1093,72 +1109,73 @@ esutils "^2.0.2" "@babel/preset-react@^7.12.5", "@babel/preset-react@^7.16.0": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.16.7.tgz#4c18150491edc69c183ff818f9f2aecbe5d93852" - integrity sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA== + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.18.6.tgz#979f76d6277048dc19094c217b507f3ad517dd2d" + integrity sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-validator-option" "^7.16.7" - "@babel/plugin-transform-react-display-name" "^7.16.7" - "@babel/plugin-transform-react-jsx" "^7.16.7" - "@babel/plugin-transform-react-jsx-development" "^7.16.7" - "@babel/plugin-transform-react-pure-annotations" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-transform-react-display-name" "^7.18.6" + "@babel/plugin-transform-react-jsx" "^7.18.6" + "@babel/plugin-transform-react-jsx-development" "^7.18.6" + "@babel/plugin-transform-react-pure-annotations" "^7.18.6" "@babel/preset-typescript@^7.16.0": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz#ab114d68bb2020afc069cd51b37ff98a046a70b9" - integrity sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ== + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz#ce64be3e63eddc44240c6358daefac17b3186399" + integrity sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-validator-option" "^7.16.7" - "@babel/plugin-transform-typescript" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-transform-typescript" "^7.18.6" "@babel/runtime-corejs3@^7.10.2": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.17.9.tgz#3d02d0161f0fbf3ada8e88159375af97690f4055" - integrity sha512-WxYHHUWF2uZ7Hp1K+D1xQgbgkGUfA+5UPOegEXGt2Y5SMog/rYCVaifLZDbw8UkNXozEqqrZTy6bglL7xTaCOw== + version "7.20.6" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.20.6.tgz#63dae945963539ab0ad578efbf3eff271e7067ae" + integrity sha512-tqeujPiuEfcH067mx+7otTQWROVMKHXEaOQcAeNV5dDdbPWvPcFA8/W9LXw2NfjNmOetqLl03dfnG2WALPlsRQ== dependencies: - core-js-pure "^3.20.2" - regenerator-runtime "^0.13.4" + core-js-pure "^3.25.1" + regenerator-runtime "^0.13.11" -"@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.14.6", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": - version "7.18.3" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.3.tgz#c7b654b57f6f63cf7f8b418ac9ca04408c4579f4" - integrity sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug== +"@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.6", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.9", "@babel/runtime@^7.20.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": + version "7.20.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.6.tgz#facf4879bfed9b5326326273a64220f099b0fce3" + integrity sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA== dependencies: - regenerator-runtime "^0.13.4" + regenerator-runtime "^0.13.11" -"@babel/template@^7.16.7", "@babel/template@^7.3.3": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" - integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== +"@babel/template@^7.18.10", "@babel/template@^7.3.3": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" + integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/parser" "^7.16.7" - "@babel/types" "^7.16.7" + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.18.10" + "@babel/types" "^7.18.10" -"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.17.3", "@babel/traverse@^7.17.9", "@babel/traverse@^7.7.2": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.9.tgz#1f9b207435d9ae4a8ed6998b2b82300d83c37a0d" - integrity sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw== +"@babel/traverse@^7.19.1", "@babel/traverse@^7.20.1", "@babel/traverse@^7.20.5", "@babel/traverse@^7.7.2": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.5.tgz#78eb244bea8270fdda1ef9af22a5d5e5b7e57133" + integrity sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ== dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.17.9" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.17.9" - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/parser" "^7.17.9" - "@babel/types" "^7.17.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.20.5" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.20.5" + "@babel/types" "^7.20.5" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" - integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw== +"@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.5.tgz#e206ae370b5393d94dfd1d04cd687cace53efa84" + integrity sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg== dependencies: - "@babel/helper-validator-identifier" "^7.16.7" + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -1167,9 +1184,9 @@ integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== "@craco/craco@^6.4.3": - version "6.4.3" - resolved "https://registry.yarnpkg.com/@craco/craco/-/craco-6.4.3.tgz#784395b6ebab764056550a2860494d24c3abd44e" - integrity sha512-RzkXYmNzRCGUyG7mM+IUMM+nvrpSfA34352sPSGQN76UivAmCAht3sI4v5JKgzO05oUK9Zwi6abCKD7iKXI8hQ== + version "6.4.5" + resolved "https://registry.yarnpkg.com/@craco/craco/-/craco-6.4.5.tgz#471e67082a2ffd3edf73759b215bdc16250d27b3" + integrity sha512-8F2rIAao8sEh0FPP52ViEvDM9GjJ7acq0knu1c8UgI+EuZMD5/ZB270ol6jV4iNY7it9Umg/RoGBvNRUNr8U8w== dependencies: cosmiconfig "^7.0.1" cosmiconfig-typescript-loader "^1.0.0" @@ -1178,71 +1195,82 @@ semver "^7.3.2" webpack-merge "^4.2.2" -"@cspotcode/source-map-consumer@0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b" - integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg== - -"@cspotcode/source-map-support@0.7.0": - version "0.7.0" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz#4789840aa859e46d2f3173727ab707c66bf344f5" - integrity sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA== +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== dependencies: - "@cspotcode/source-map-consumer" "0.8.0" + "@jridgewell/trace-mapping" "0.3.9" "@csstools/normalize.css@*": version "12.0.0" resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-12.0.0.tgz#a9583a75c3f150667771f30b60d9f059473e62c4" integrity sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg== -"@csstools/postcss-color-function@^1.0.3": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@csstools/postcss-color-function/-/postcss-color-function-1.1.0.tgz#229966327747f58fbe586de35daa139db3ce1e5d" - integrity sha512-5D5ND/mZWcQoSfYnSPsXtuiFxhzmhxt6pcjrFLJyldj+p0ZN2vvRpYNX+lahFTtMhAYOa2WmkdGINr0yP0CvGA== - dependencies: - "@csstools/postcss-progressive-custom-properties" "^1.1.0" - postcss-value-parser "^4.2.0" - -"@csstools/postcss-font-format-keywords@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.0.tgz#7e7df948a83a0dfb7eb150a96e2390ac642356a1" - integrity sha512-oO0cZt8do8FdVBX8INftvIA4lUrKUSCcWUf9IwH9IPWOgKT22oAZFXeHLoDK7nhB2SmkNycp5brxfNMRLIhd6Q== - dependencies: - postcss-value-parser "^4.2.0" - -"@csstools/postcss-hwb-function@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.0.tgz#d6785c1c5ba8152d1d392c66f3a6a446c6034f6d" - integrity sha512-VSTd7hGjmde4rTj1rR30sokY3ONJph1reCBTUXqeW1fKwETPy1x4t/XIeaaqbMbC5Xg4SM/lyXZ2S8NELT2TaA== - dependencies: - postcss-value-parser "^4.2.0" - -"@csstools/postcss-ic-unit@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.0.tgz#f484db59fc94f35a21b6d680d23b0ec69b286b7f" - integrity sha512-i4yps1mBp2ijrx7E96RXrQXQQHm6F4ym1TOD0D69/sjDjZvQ22tqiEvaNw7pFZTUO5b9vWRHzbHzP9+UKuw+bA== - dependencies: - "@csstools/postcss-progressive-custom-properties" "^1.1.0" - postcss-value-parser "^4.2.0" - -"@csstools/postcss-is-pseudo-class@^2.0.1": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.2.tgz#a834ca11a43d6ed9bc9e3ff53c80d490a4b1aaad" - integrity sha512-L9h1yxXMj7KpgNzlMrw3isvHJYkikZgZE4ASwssTnGEH8tm50L6QsM9QQT5wR4/eO5mU0rN5axH7UzNxEYg5CA== +"@csstools/postcss-cascade-layers@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz#8a997edf97d34071dd2e37ea6022447dd9e795ad" + integrity sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA== dependencies: + "@csstools/selector-specificity" "^2.0.2" postcss-selector-parser "^6.0.10" -"@csstools/postcss-normalize-display-values@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.0.tgz#ce698f688c28517447aedf15a9037987e3d2dc97" - integrity sha512-bX+nx5V8XTJEmGtpWTO6kywdS725t71YSLlxWt78XoHUbELWgoCXeOFymRJmL3SU1TLlKSIi7v52EWqe60vJTQ== +"@csstools/postcss-color-function@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz#2bd36ab34f82d0497cfacdc9b18d34b5e6f64b6b" + integrity sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-font-format-keywords@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz#677b34e9e88ae997a67283311657973150e8b16a" + integrity sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg== dependencies: postcss-value-parser "^4.2.0" -"@csstools/postcss-oklab-function@^1.0.2": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.0.tgz#e9a269487a292e0930760948e923e1d46b638ee6" - integrity sha512-e/Q5HopQzmnQgqimG9v3w2IG4VRABsBq3itOcn4bnm+j4enTgQZ0nWsaH/m9GV2otWGQ0nwccYL5vmLKyvP1ww== +"@csstools/postcss-hwb-function@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz#ab54a9fce0ac102c754854769962f2422ae8aa8b" + integrity sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-ic-unit@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz#28237d812a124d1a16a5acc5c3832b040b303e58" + integrity sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-is-pseudo-class@^2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz#846ae6c0d5a1eaa878fce352c544f9c295509cd1" + integrity sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA== + dependencies: + "@csstools/selector-specificity" "^2.0.0" + postcss-selector-parser "^6.0.10" + +"@csstools/postcss-nested-calc@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz#d7e9d1d0d3d15cf5ac891b16028af2a1044d0c26" + integrity sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-normalize-display-values@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz#15da54a36e867b3ac5163ee12c1d7f82d4d612c3" + integrity sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-oklab-function@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz#88cee0fbc8d6df27079ebd2fa016ee261eecf844" + integrity sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA== dependencies: "@csstools/postcss-progressive-custom-properties" "^1.1.0" postcss-value-parser "^4.2.0" @@ -1254,534 +1282,573 @@ dependencies: postcss-value-parser "^4.2.0" -"@date-io/core@^2.14.0": - version "2.14.0" - resolved "https://registry.yarnpkg.com/@date-io/core/-/core-2.14.0.tgz#03e9b9b9fc8e4d561c32dd324df0f3ccd967ef14" - integrity sha512-qFN64hiFjmlDHJhu+9xMkdfDG2jLsggNxKXglnekUpXSq8faiqZgtHm2lsHCUuaPDTV6wuXHcCl8J1GQ5wLmPw== - -"@date-io/date-fns@^2.11.0", "@date-io/date-fns@^2.14.0": - version "2.14.0" - resolved "https://registry.yarnpkg.com/@date-io/date-fns/-/date-fns-2.14.0.tgz#92ab150f488f294c135c873350d154803cebdbea" - integrity sha512-4fJctdVyOd5cKIKGaWUM+s3MUXMuzkZaHuTY15PH70kU1YTMrCoauA7hgQVx9qj0ZEbGrH9VSPYJYnYro7nKiA== +"@csstools/postcss-stepped-value-functions@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz#f8772c3681cc2befed695e2b0b1d68e22f08c4f4" + integrity sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ== dependencies: - "@date-io/core" "^2.14.0" + postcss-value-parser "^4.2.0" -"@date-io/dayjs@^2.11.0", "@date-io/dayjs@^2.14.0": - version "2.14.0" - resolved "https://registry.yarnpkg.com/@date-io/dayjs/-/dayjs-2.14.0.tgz#8d4e93e1d473bb5f25210866204dc33384ca4c20" - integrity sha512-4fRvNWaOh7AjvOyJ4h6FYMS7VHLQnIEeAV5ahv6sKYWx+1g1UwYup8h7+gPuoF+sW2hTScxi7PVaba2Jk/U8Og== +"@csstools/postcss-text-decoration-shorthand@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz#ea96cfbc87d921eca914d3ad29340d9bcc4c953f" + integrity sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw== dependencies: - "@date-io/core" "^2.14.0" + postcss-value-parser "^4.2.0" -"@date-io/luxon@^2.11.1", "@date-io/luxon@^2.14.0": - version "2.14.0" - resolved "https://registry.yarnpkg.com/@date-io/luxon/-/luxon-2.14.0.tgz#cd1641229e00a899625895de3a31e3aaaf66629f" - integrity sha512-KmpBKkQFJ/YwZgVd0T3h+br/O0uL9ZdE7mn903VPAG2ZZncEmaUfUdYKFT7v7GyIKJ4KzCp379CRthEbxevEVg== +"@csstools/postcss-trigonometric-functions@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz#94d3e4774c36d35dcdc88ce091336cb770d32756" + integrity sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og== dependencies: - "@date-io/core" "^2.14.0" + postcss-value-parser "^4.2.0" -"@date-io/moment@^2.11.0", "@date-io/moment@^2.14.0": - version "2.14.0" - resolved "https://registry.yarnpkg.com/@date-io/moment/-/moment-2.14.0.tgz#8300abd6ae8c55d8edee90d118db3cef0b1d4f58" - integrity sha512-VsoLXs94GsZ49ecWuvFbsa081zEv2xxG7d+izJsqGa2L8RPZLlwk27ANh87+SNnOUpp+qy2AoCAf0mx4XXhioA== - dependencies: - "@date-io/core" "^2.14.0" +"@csstools/postcss-unset-value@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz#c99bb70e2cdc7312948d1eb41df2412330b81f77" + integrity sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g== -"@emotion/babel-plugin@^11.7.1": - version "11.7.2" - resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.7.2.tgz#fec75f38a6ab5b304b0601c74e2a5e77c95e5fa0" - integrity sha512-6mGSCWi9UzXut/ZAN6lGFu33wGR3SJisNl3c0tvlmb8XChH1b2SUvxvnOh7hvLpqyRdHHU9AiazV3Cwbk5SXKQ== +"@csstools/selector-specificity@^2.0.0", "@csstools/selector-specificity@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz#1bfafe4b7ed0f3e4105837e056e0a89b108ebe36" + integrity sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg== + +"@date-io/core@^2.15.0", "@date-io/core@^2.16.0": + version "2.16.0" + resolved "https://registry.yarnpkg.com/@date-io/core/-/core-2.16.0.tgz#7871bfc1d9bca9aa35ad444a239505589d0f22f6" + integrity sha512-DYmSzkr+jToahwWrsiRA2/pzMEtz9Bq1euJwoOuYwuwIYXnZFtHajY2E6a1VNVDc9jP8YUXK1BvnZH9mmT19Zg== + +"@date-io/date-fns@^2.15.0": + version "2.16.0" + resolved "https://registry.yarnpkg.com/@date-io/date-fns/-/date-fns-2.16.0.tgz#bd5e09b6ecb47ee55e593fc3a87e7b2caaa3da40" + integrity sha512-bfm5FJjucqlrnQcXDVU5RD+nlGmL3iWgkHTq3uAZWVIuBu6dDmGa3m8a6zo2VQQpu8ambq9H22UyUpn7590joA== dependencies: - "@babel/helper-module-imports" "^7.12.13" - "@babel/plugin-syntax-jsx" "^7.12.13" - "@babel/runtime" "^7.13.10" - "@emotion/hash" "^0.8.0" - "@emotion/memoize" "^0.7.5" - "@emotion/serialize" "^1.0.2" - babel-plugin-macros "^2.6.1" + "@date-io/core" "^2.16.0" + +"@date-io/dayjs@^2.15.0": + version "2.16.0" + resolved "https://registry.yarnpkg.com/@date-io/dayjs/-/dayjs-2.16.0.tgz#0d2c254ad8db1306fdc4b8eda197cb53c9af89dc" + integrity sha512-y5qKyX2j/HG3zMvIxTobYZRGnd1FUW2olZLS0vTj7bEkBQkjd2RO7/FEwDY03Z1geVGlXKnzIATEVBVaGzV4Iw== + dependencies: + "@date-io/core" "^2.16.0" + +"@date-io/luxon@^2.15.0": + version "2.16.1" + resolved "https://registry.yarnpkg.com/@date-io/luxon/-/luxon-2.16.1.tgz#b08786614cb58831c729a15807753011e4acb966" + integrity sha512-aeYp5K9PSHV28946pC+9UKUi/xMMYoaGelrpDibZSgHu2VWHXrr7zWLEr+pMPThSs5vt8Ei365PO+84pCm37WQ== + dependencies: + "@date-io/core" "^2.16.0" + +"@date-io/moment@^2.15.0": + version "2.16.1" + resolved "https://registry.yarnpkg.com/@date-io/moment/-/moment-2.16.1.tgz#ec6e0daa486871e0e6412036c6f806842a0eeed4" + integrity sha512-JkxldQxUqZBfZtsaCcCMkm/dmytdyq5pS1RxshCQ4fHhsvP5A7gSqPD22QbVXMcJydi3d3v1Y8BQdUKEuGACZQ== + dependencies: + "@date-io/core" "^2.16.0" + +"@emotion/babel-plugin@^11.10.5": + version "11.10.5" + resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.10.5.tgz#65fa6e1790ddc9e23cc22658a4c5dea423c55c3c" + integrity sha512-xE7/hyLHJac7D2Ve9dKroBBZqBT7WuPQmWcq7HSGb84sUuP4mlOWoB8dvVfD9yk5DHkU1m6RW7xSoDtnQHNQeA== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/plugin-syntax-jsx" "^7.17.12" + "@babel/runtime" "^7.18.3" + "@emotion/hash" "^0.9.0" + "@emotion/memoize" "^0.8.0" + "@emotion/serialize" "^1.1.1" + babel-plugin-macros "^3.1.0" convert-source-map "^1.5.0" escape-string-regexp "^4.0.0" find-root "^1.1.0" source-map "^0.5.7" - stylis "4.0.13" + stylis "4.1.3" -"@emotion/cache@*", "@emotion/cache@^11.7.1", "@emotion/cache@^11.9.3": - version "11.9.3" - resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.9.3.tgz#96638449f6929fd18062cfe04d79b29b44c0d6cb" - integrity sha512-0dgkI/JKlCXa+lEXviaMtGBL0ynpx4osh7rjOXE71q9bIF8G+XhJgvi+wDu0B0IdCVx37BffiwXlN9I3UuzFvg== +"@emotion/cache@*", "@emotion/cache@^11.10.5": + version "11.10.5" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.10.5.tgz#c142da9351f94e47527ed458f7bbbbe40bb13c12" + integrity sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA== dependencies: - "@emotion/memoize" "^0.7.4" - "@emotion/sheet" "^1.1.1" - "@emotion/utils" "^1.0.0" - "@emotion/weak-memoize" "^0.2.5" - stylis "4.0.13" + "@emotion/memoize" "^0.8.0" + "@emotion/sheet" "^1.2.1" + "@emotion/utils" "^1.2.0" + "@emotion/weak-memoize" "^0.3.0" + stylis "4.1.3" -"@emotion/hash@^0.8.0": +"@emotion/hash@^0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.0.tgz#c5153d50401ee3c027a57a177bc269b16d889cb7" + integrity sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ== + +"@emotion/is-prop-valid@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz#7f2d35c97891669f7e276eb71c83376a5dc44c83" + integrity sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg== + dependencies: + "@emotion/memoize" "^0.8.0" + +"@emotion/memoize@^0.8.0": version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" - integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.0.tgz#f580f9beb67176fa57aae70b08ed510e1b18980f" + integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA== -"@emotion/is-prop-valid@^1.1.2", "@emotion/is-prop-valid@^1.1.3": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.1.3.tgz#f0907a416368cf8df9e410117068e20fe87c0a3a" - integrity sha512-RFg04p6C+1uO19uG8N+vqanzKqiM9eeV1LDOG3bmkYmuOj7NbKNlFC/4EZq5gnwAIlcC/jOT24f8Td0iax2SXA== +"@emotion/react@^11.10.5": + version "11.10.5" + resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.10.5.tgz#95fff612a5de1efa9c0d535384d3cfa115fe175d" + integrity sha512-TZs6235tCJ/7iF6/rvTaOH4oxQg2gMAcdHemjwLKIjKz4rRuYe1HJ2TQJKnAcRAfOUDdU8XoDadCe1rl72iv8A== dependencies: - "@emotion/memoize" "^0.7.4" - -"@emotion/memoize@^0.7.4", "@emotion/memoize@^0.7.5": - version "0.7.5" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.5.tgz#2c40f81449a4e554e9fc6396910ed4843ec2be50" - integrity sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ== - -"@emotion/react@^11.9.0": - version "11.9.0" - resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.9.0.tgz#b6d42b1db3bd7511e7a7c4151dc8bc82e14593b8" - integrity sha512-lBVSF5d0ceKtfKCDQJveNAtkC7ayxpVlgOohLgXqRwqWr9bOf4TZAFFyIcNngnV6xK6X4x2ZeXq7vliHkoVkxQ== - dependencies: - "@babel/runtime" "^7.13.10" - "@emotion/babel-plugin" "^11.7.1" - "@emotion/cache" "^11.7.1" - "@emotion/serialize" "^1.0.3" - "@emotion/utils" "^1.1.0" - "@emotion/weak-memoize" "^0.2.5" + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.10.5" + "@emotion/cache" "^11.10.5" + "@emotion/serialize" "^1.1.1" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" + "@emotion/utils" "^1.2.0" + "@emotion/weak-memoize" "^0.3.0" hoist-non-react-statics "^3.3.1" -"@emotion/serialize@*", "@emotion/serialize@^1.0.2", "@emotion/serialize@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.0.3.tgz#99e2060c26c6292469fb30db41f4690e1c8fea63" - integrity sha512-2mSSvgLfyV3q+iVh3YWgNlUc2a9ZlDU7DjuP5MjK3AXRR0dYigCrP99aeFtaB2L/hjfEZdSThn5dsZ0ufqbvsA== +"@emotion/serialize@*", "@emotion/serialize@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.1.tgz#0595701b1902feded8a96d293b26be3f5c1a5cf0" + integrity sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA== dependencies: - "@emotion/hash" "^0.8.0" - "@emotion/memoize" "^0.7.4" - "@emotion/unitless" "^0.7.5" - "@emotion/utils" "^1.0.0" + "@emotion/hash" "^0.9.0" + "@emotion/memoize" "^0.8.0" + "@emotion/unitless" "^0.8.0" + "@emotion/utils" "^1.2.0" csstype "^3.0.2" -"@emotion/sheet@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.1.1.tgz#015756e2a9a3c7c5f11d8ec22966a8dbfbfac787" - integrity sha512-J3YPccVRMiTZxYAY0IOq3kd+hUP8idY8Kz6B/Cyo+JuXq52Ek+zbPbSQUrVQp95aJ+lsAW7DPL1P2Z+U1jGkKA== - -"@emotion/styled@^11.8.1": - version "11.8.1" - resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.8.1.tgz#856f6f63aceef0eb783985fa2322e2bf66d04e17" - integrity sha512-OghEVAYBZMpEquHZwuelXcRjRJQOVayvbmNR0zr174NHdmMgrNkLC6TljKC5h9lZLkN5WGrdUcrKlOJ4phhoTQ== - dependencies: - "@babel/runtime" "^7.13.10" - "@emotion/babel-plugin" "^11.7.1" - "@emotion/is-prop-valid" "^1.1.2" - "@emotion/serialize" "^1.0.2" - "@emotion/utils" "^1.1.0" - -"@emotion/unitless@^0.7.5": - version "0.7.5" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" - integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== - -"@emotion/utils@*", "@emotion/utils@^1.0.0", "@emotion/utils@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.1.0.tgz#86b0b297f3f1a0f2bdb08eeac9a2f49afd40d0cf" - integrity sha512-iRLa/Y4Rs5H/f2nimczYmS5kFJEbpiVvgN3XVfZ022IYhuNA1IRSHEizcof88LtCTXtl9S2Cxt32KgaXEu72JQ== - -"@emotion/weak-memoize@^0.2.5": - version "0.2.5" - resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46" - integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA== - -"@eslint/eslintrc@^1.2.1": +"@emotion/sheet@^1.2.1": version "1.2.1" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.2.1.tgz#8b5e1c49f4077235516bc9ec7d41378c0f69b8c6" - integrity sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ== + resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.1.tgz#0767e0305230e894897cadb6c8df2c51e61a6c2c" + integrity sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA== + +"@emotion/styled@^11.10.5": + version "11.10.5" + resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.10.5.tgz#1fe7bf941b0909802cb826457e362444e7e96a79" + integrity sha512-8EP6dD7dMkdku2foLoruPCNkRevzdcBaY6q0l0OsbyJK+x8D9HWjX27ARiSIKNF634hY9Zdoedh8bJCiva8yZw== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.10.5" + "@emotion/is-prop-valid" "^1.2.0" + "@emotion/serialize" "^1.1.1" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" + "@emotion/utils" "^1.2.0" + +"@emotion/unitless@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.0.tgz#a4a36e9cbdc6903737cd20d38033241e1b8833db" + integrity sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw== + +"@emotion/use-insertion-effect-with-fallbacks@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz#ffadaec35dbb7885bd54de3fa267ab2f860294df" + integrity sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A== + +"@emotion/utils@*", "@emotion/utils@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.0.tgz#9716eaccbc6b5ded2ea5a90d65562609aab0f561" + integrity sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw== + +"@emotion/weak-memoize@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz#ea89004119dc42db2e1dba0f97d553f7372f6fcb" + integrity sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg== + +"@eslint/eslintrc@^1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.3.tgz#2b044ab39fdfa75b4688184f9e573ce3c5b0ff95" + integrity sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg== dependencies: ajv "^6.12.4" debug "^4.3.2" - espree "^9.3.1" - globals "^13.9.0" + espree "^9.4.0" + globals "^13.15.0" ignore "^5.2.0" import-fresh "^3.2.1" js-yaml "^4.1.0" - minimatch "^3.0.4" + minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@firebase/analytics-compat@0.1.16": - version "0.1.16" - resolved "https://registry.yarnpkg.com/@firebase/analytics-compat/-/analytics-compat-0.1.16.tgz#7a2c57c37a39efe52c476fa8878dd5a6b93b2155" - integrity sha512-mDAhE33WiyCrqSQZvzyZtQCCdf4ipn5tsEpTbIUruk7MbThQ1EbNAbPBiEk9NDLD3sUyLABZGFctvym/hc8H+w== +"@firebase/analytics-compat@0.1.17": + version "0.1.17" + resolved "https://registry.yarnpkg.com/@firebase/analytics-compat/-/analytics-compat-0.1.17.tgz#7be65327b3fe8a4dceab636562fc10032064280f" + integrity sha512-36ByEDsH6/3YNuD6yig30s2A/+E1pt333r8SJirUE8+aHYl/DGX0PXplKvJWDGamYYjMwet3Kt4XRrB1NY8mLg== dependencies: - "@firebase/analytics" "0.8.3" - "@firebase/analytics-types" "0.7.0" - "@firebase/component" "0.5.20" - "@firebase/util" "1.7.2" + "@firebase/analytics" "0.8.4" + "@firebase/analytics-types" "0.7.1" + "@firebase/component" "0.5.21" + "@firebase/util" "1.7.3" tslib "^2.1.0" -"@firebase/analytics-types@0.7.0": - version "0.7.0" - resolved "https://registry.yarnpkg.com/@firebase/analytics-types/-/analytics-types-0.7.0.tgz#91960e7c87ce8bf18cf8dd9e55ccbf5dc3989b5d" - integrity sha512-DNE2Waiwy5+zZnCfintkDtBfaW6MjIG883474v6Z0K1XZIvl76cLND4iv0YUb48leyF+PJK1KO2XrgHb/KpmhQ== +"@firebase/analytics-types@0.7.1": + version "0.7.1" + resolved "https://registry.yarnpkg.com/@firebase/analytics-types/-/analytics-types-0.7.1.tgz#21556098e83aa14f192ce84051c81d794b2eb150" + integrity sha512-a1INLjelc1Mqrt2CbGmGdlNBj0zsvwBv0K5q5C6Fje8GSXBMc3+iQQQjzYe/4KkK6nL54UP7ZMeI/Q3VEW72FA== -"@firebase/analytics@0.8.3": - version "0.8.3" - resolved "https://registry.yarnpkg.com/@firebase/analytics/-/analytics-0.8.3.tgz#d8c6d71c3aa09d2ae5041db5b3778e4f66a832cb" - integrity sha512-viGhc57JW9zHp/0JKpLBUthdpOrEjbPETQFz8oNfaNma+cHA6FtIrtg4Sla52DgqatbATcE9aIDBiPCGrCtNjw== +"@firebase/analytics@0.8.4": + version "0.8.4" + resolved "https://registry.yarnpkg.com/@firebase/analytics/-/analytics-0.8.4.tgz#596e79258605c8322ef25f47cd4e1ff94579dd90" + integrity sha512-Bgr2tMexv0YrL6kjrOF1xVRts8PM6WWmROpfRQjh0xFU4QSoofBJhkVn2NXDXkHWrr5slFfqB5yOnmgAIsHiMw== dependencies: - "@firebase/component" "0.5.20" - "@firebase/installations" "0.5.15" - "@firebase/logger" "0.3.3" - "@firebase/util" "1.7.2" + "@firebase/component" "0.5.21" + "@firebase/installations" "0.5.16" + "@firebase/logger" "0.3.4" + "@firebase/util" "1.7.3" tslib "^2.1.0" -"@firebase/app-check-compat@0.2.15": - version "0.2.15" - resolved "https://registry.yarnpkg.com/@firebase/app-check-compat/-/app-check-compat-0.2.15.tgz#d61255996b23f3e91ffd8eab7391877a3a993dca" - integrity sha512-EgD1WEFwwq7aP7DxPSYuUpMt8eAhClA57976D3BaHDbH/IXEuw0DfaeT0LtBb+xJD7J8uxy+YKpudCC8gzUu8g== +"@firebase/app-check-compat@0.2.17": + version "0.2.17" + resolved "https://registry.yarnpkg.com/@firebase/app-check-compat/-/app-check-compat-0.2.17.tgz#c949976e8353156d521a52664d3735d4aa3c4417" + integrity sha512-yhiAy6U4MuhbY+DCgvG5FcrXkAL+7YohRzqywycQKr31k/ftelbR5l9Zmo2WJMxdLxfubnnqeG/BYCRHlSvk7A== dependencies: - "@firebase/app-check" "0.5.15" - "@firebase/app-check-types" "0.4.0" - "@firebase/component" "0.5.20" - "@firebase/logger" "0.3.3" - "@firebase/util" "1.7.2" + "@firebase/app-check" "0.5.17" + "@firebase/app-check-types" "0.4.1" + "@firebase/component" "0.5.21" + "@firebase/logger" "0.3.4" + "@firebase/util" "1.7.3" tslib "^2.1.0" -"@firebase/app-check-interop-types@0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@firebase/app-check-interop-types/-/app-check-interop-types-0.1.0.tgz#83afd9d41f99166c2bdb2d824e5032e9edd8fe53" - integrity sha512-uZfn9s4uuRsaX5Lwx+gFP3B6YsyOKUE+Rqa6z9ojT4VSRAsZFko9FRn6OxQUA1z5t5d08fY4pf+/+Dkd5wbdbA== +"@firebase/app-check-interop-types@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@firebase/app-check-interop-types/-/app-check-interop-types-0.1.1.tgz#7a6e01f4bc37195e58e62d7e4a2995e54b1957b8" + integrity sha512-QpYh5GmiLA9ob8NWAZpHbNNl9TzxxZI4NLevT6MYPRDXKG9BSmBI7FATRfm5uv2QQUVSQrESKog5CCmU16v+7Q== -"@firebase/app-check-types@0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@firebase/app-check-types/-/app-check-types-0.4.0.tgz#7007a9d1d720db20bcf466fe6785c96feaa0a82d" - integrity sha512-SsWafqMABIOu7zLgWbmwvHGOeQQVQlwm42kwwubsmfLmL4Sf5uGpBfDhQ0CAkpi7bkJ/NwNFKafNDL9prRNP0Q== +"@firebase/app-check-types@0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@firebase/app-check-types/-/app-check-types-0.4.1.tgz#7807e761b119d71562611a14c307ac8ca2981103" + integrity sha512-4X79w2X0H5i5qvaho3qkjZg5qdERnKR4gCfy/fxDmdMMP4QgNJHJ9IBk1E+c4cm5HlaZVcLq9K6z8xaRqjZhyw== -"@firebase/app-check@0.5.15": - version "0.5.15" - resolved "https://registry.yarnpkg.com/@firebase/app-check/-/app-check-0.5.15.tgz#a57830b00864f792eddf45d581d256b1513643ab" - integrity sha512-ifQalGXkXMwGR3F8Glmo1XtDg0UjkwCmI/ff05mxnKGMfs5ZDyw8DikQfna//a/KdYuOBqxlBwS2BhHiobqUUg== +"@firebase/app-check@0.5.17": + version "0.5.17" + resolved "https://registry.yarnpkg.com/@firebase/app-check/-/app-check-0.5.17.tgz#d24aa73f9ac887711c79986c90f18b0f15cb2c14" + integrity sha512-P4bm0lbs+VgS7pns322GC0hyKuTDCqYk2X4FGBf133LZaw1NXJpzOteqPdCT0hBCaR0QSHk49gxx+bdnSdd5Fg== dependencies: - "@firebase/component" "0.5.20" - "@firebase/logger" "0.3.3" - "@firebase/util" "1.7.2" + "@firebase/component" "0.5.21" + "@firebase/logger" "0.3.4" + "@firebase/util" "1.7.3" tslib "^2.1.0" -"@firebase/app-compat@0.1.37": - version "0.1.37" - resolved "https://registry.yarnpkg.com/@firebase/app-compat/-/app-compat-0.1.37.tgz#338fead261344529ad7fcedd5ca014d463d6679b" - integrity sha512-doTKYGlVc8ZiQNOl66rpkU/YItRyOxCgMp4YWThXkPM4T/pTi4a9IMCe8K88gVNeYWd8sKW4vSnxjcOG5hQXEA== +"@firebase/app-compat@0.1.39": + version "0.1.39" + resolved "https://registry.yarnpkg.com/@firebase/app-compat/-/app-compat-0.1.39.tgz#3ea5465d07855fdb8357a0f63fd113da81468e50" + integrity sha512-F5O/N38dVGFzpe6zM//MslYT80rpX0V+MQNMvONPUlXhvDqS5T+8NMSCWOcZ++Z4Hkj8EvgTJk59AMnD8SdyFw== dependencies: - "@firebase/app" "0.8.2" - "@firebase/component" "0.5.20" - "@firebase/logger" "0.3.3" - "@firebase/util" "1.7.2" + "@firebase/app" "0.8.4" + "@firebase/component" "0.5.21" + "@firebase/logger" "0.3.4" + "@firebase/util" "1.7.3" tslib "^2.1.0" -"@firebase/app-types@0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@firebase/app-types/-/app-types-0.8.0.tgz#50a539a0a20bef8c50494d0615592fe2a384851f" - integrity sha512-Lec3VVquUwXPn2UReGSsfTxuMBVRmzGIwA/CJnF0LQuPgv9kOmXk9mVqsDMfHxHtqjai0n6wWHR2TqjdVV/bYA== +"@firebase/app-types@0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@firebase/app-types/-/app-types-0.8.1.tgz#4c7f916281aed570581fc667e3eb6cc730119a95" + integrity sha512-p75Ow3QhB82kpMzmOntv866wH9eZ3b4+QbUY+8/DA5Zzdf1c8Nsk8B7kbFpzJt4wwHMdy5LTF5YUnoTc1JiWkw== -"@firebase/app@0.8.2": - version "0.8.2" - resolved "https://registry.yarnpkg.com/@firebase/app/-/app-0.8.2.tgz#705fcbdd82d4720038a2eb9af7277c73ebd9e9d5" - integrity sha512-ByNDCe8h9O/szO3XVTrS484MtqBOKriVaNCQC7Y7KgZSaiA0OOWmIY5vwi63mBTYetqMNN5VGiG/6ZSmGIZyoQ== +"@firebase/app@0.8.4": + version "0.8.4" + resolved "https://registry.yarnpkg.com/@firebase/app/-/app-0.8.4.tgz#e62b47f909e10627f7f377ecfb7b90b921303d21" + integrity sha512-gQntijd+sLaGWjcBQpk33giCEXNzGLB6489NMpypVgEXJwQXYQPSrtb9vUHXot1w1iy/j6xlNl4K8wwwNdRgDg== dependencies: - "@firebase/component" "0.5.20" - "@firebase/logger" "0.3.3" - "@firebase/util" "1.7.2" + "@firebase/component" "0.5.21" + "@firebase/logger" "0.3.4" + "@firebase/util" "1.7.3" idb "7.0.1" tslib "^2.1.0" -"@firebase/auth-compat@0.2.23": - version "0.2.23" - resolved "https://registry.yarnpkg.com/@firebase/auth-compat/-/auth-compat-0.2.23.tgz#72a2d5163f4688bd85b0db58ded13db68f34b0a2" - integrity sha512-r9YEXaL7YKoFOWHRvVoQ6d5klP+hkSsAtt21UIvP3/BxDDU+yLXN5vVvFHr38apuUeMGN34M7zkY6SihnLutIQ== +"@firebase/auth-compat@0.2.24": + version "0.2.24" + resolved "https://registry.yarnpkg.com/@firebase/auth-compat/-/auth-compat-0.2.24.tgz#7ad914d412d467f181016c88b5a2b398b6e7fba3" + integrity sha512-IuZQScjtoOLkUHtmIUJ2F3E2OpDOyap6L/9HL/DX3nzEA1LrX7wlpeU6OF2jS9E0KLueWKIrSkIQOOsKoQj/sA== dependencies: - "@firebase/auth" "0.20.10" - "@firebase/auth-types" "0.11.0" - "@firebase/component" "0.5.20" - "@firebase/util" "1.7.2" + "@firebase/auth" "0.20.11" + "@firebase/auth-types" "0.11.1" + "@firebase/component" "0.5.21" + "@firebase/util" "1.7.3" node-fetch "2.6.7" - selenium-webdriver "4.1.2" + selenium-webdriver "4.5.0" tslib "^2.1.0" -"@firebase/auth-interop-types@0.1.6": - version "0.1.6" - resolved "https://registry.yarnpkg.com/@firebase/auth-interop-types/-/auth-interop-types-0.1.6.tgz#5ce13fc1c527ad36f1bb1322c4492680a6cf4964" - integrity sha512-etIi92fW3CctsmR9e3sYM3Uqnoq861M0Id9mdOPF6PWIg38BXL5k4upCNBggGUpLIS0H1grMOvy/wn1xymwe2g== +"@firebase/auth-interop-types@0.1.7": + version "0.1.7" + resolved "https://registry.yarnpkg.com/@firebase/auth-interop-types/-/auth-interop-types-0.1.7.tgz#82c8d431779916224d2af5cef6cec2042d830f28" + integrity sha512-yA/dTveGGPcc85JP8ZE/KZqfGQyQTBCV10THdI8HTlP1GDvNrhr//J5jAt58MlsCOaO3XmC4DqScPBbtIsR/EA== -"@firebase/auth-types@0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@firebase/auth-types/-/auth-types-0.11.0.tgz#b9c73c60ca07945b3bbd7a097633e5f78fa9e886" - integrity sha512-q7Bt6cx+ySj9elQHTsKulwk3+qDezhzRBFC9zlQ1BjgMueUOnGMcvqmU0zuKlQ4RhLSH7MNAdBV2znVaoN3Vxw== +"@firebase/auth-types@0.11.1": + version "0.11.1" + resolved "https://registry.yarnpkg.com/@firebase/auth-types/-/auth-types-0.11.1.tgz#f5524891653dbe4e22fba7586ef00605f33ce61d" + integrity sha512-ud7T39VG9ptTrC2fOy/XlU+ubC+BVuBJPteuzsPZSa9l7gkntvWgVb3Z/3FxqqRPlkVUYiyvmsbRN3DE1He2ow== -"@firebase/auth@0.20.10": - version "0.20.10" - resolved "https://registry.yarnpkg.com/@firebase/auth/-/auth-0.20.10.tgz#4dbd6cb24906e11f78bf65100a71b45b028b607b" - integrity sha512-uAZypmVv/4nijaPVtR/ipjKBmSDPLQ7sNScLHs2DVhdvCklgUUF5+zsEdPlMfKDIfmVQHFwHbUgeKyXDYSRMwQ== +"@firebase/auth@0.20.11": + version "0.20.11" + resolved "https://registry.yarnpkg.com/@firebase/auth/-/auth-0.20.11.tgz#acf40fcf9c64af9d5f29ad9a8cfc2e99aed50237" + integrity sha512-cKy91l4URDG3yWfPK7tjUySh2wCLxtTilsR59jiqQJLReBrQsKP79eFDJ6jqWwbEh3+f1lmoH1nKswwbo9XdmA== dependencies: - "@firebase/component" "0.5.20" - "@firebase/logger" "0.3.3" - "@firebase/util" "1.7.2" + "@firebase/component" "0.5.21" + "@firebase/logger" "0.3.4" + "@firebase/util" "1.7.3" node-fetch "2.6.7" - selenium-webdriver "4.1.2" + selenium-webdriver "4.5.0" tslib "^2.1.0" -"@firebase/component@0.5.20": - version "0.5.20" - resolved "https://registry.yarnpkg.com/@firebase/component/-/component-0.5.20.tgz#52165b5f7d25c4ac9c679e4e48d6f7fa7bf722cf" - integrity sha512-wP51tQBlPFprfAWxWjzC/56hG4APhl43jFsgwuqCl3bhVbiKcr278QbrbGNmIXDeGKo4sGZLAnH9whl2apeCmA== +"@firebase/component@0.5.21": + version "0.5.21" + resolved "https://registry.yarnpkg.com/@firebase/component/-/component-0.5.21.tgz#bb10add24fe2ee59a61163a469d4711d8da4002d" + integrity sha512-12MMQ/ulfygKpEJpseYMR0HunJdlsLrwx2XcEs40M18jocy2+spyzHHEwegN3x/2/BLFBjR5247Etmz0G97Qpg== dependencies: - "@firebase/util" "1.7.2" + "@firebase/util" "1.7.3" tslib "^2.1.0" -"@firebase/database-compat@0.2.9": - version "0.2.9" - resolved "https://registry.yarnpkg.com/@firebase/database-compat/-/database-compat-0.2.9.tgz#a1b4ecf94e11eadfc21aa48121b3ba7ea18a57ae" - integrity sha512-zzyFM3+jW/qYtHojiQirHXGXYyElbqVngEEn/i2gXoSzcK0Y2AL5oHAqGYXLaaW0+t4Zwnssh3HnQJM8C1D0fw== +"@firebase/database-compat@0.2.10": + version "0.2.10" + resolved "https://registry.yarnpkg.com/@firebase/database-compat/-/database-compat-0.2.10.tgz#fa4440db9f41a9a05112642504c1e6557a75b8be" + integrity sha512-fK+IgUUqVKcWK/gltzDU+B1xauCOfY6vulO8lxoNTkcCGlSxuTtwsdqjGkFmgFRMYjXFWWJ6iFcJ/vXahzwCtA== dependencies: - "@firebase/component" "0.5.20" - "@firebase/database" "0.13.9" - "@firebase/database-types" "0.9.16" - "@firebase/logger" "0.3.3" - "@firebase/util" "1.7.2" + "@firebase/component" "0.5.21" + "@firebase/database" "0.13.10" + "@firebase/database-types" "0.9.17" + "@firebase/logger" "0.3.4" + "@firebase/util" "1.7.3" tslib "^2.1.0" -"@firebase/database-types@0.9.16": - version "0.9.16" - resolved "https://registry.yarnpkg.com/@firebase/database-types/-/database-types-0.9.16.tgz#4f7f612c00346641a641ac689005857190e91ebc" - integrity sha512-dK/uFgHisrVijSoHf9RLJ7NwvlOul2rO/z9ufOSbGd8/TqFVASXz+19mynhDIoSEnyQtJC/NTyBzSPfjz0w61w== +"@firebase/database-types@0.9.17": + version "0.9.17" + resolved "https://registry.yarnpkg.com/@firebase/database-types/-/database-types-0.9.17.tgz#4c248052b0a9ae052ba940e4996a0bfab25dc257" + integrity sha512-YQm2tCZyxNtEnlS5qo5gd2PAYgKCy69tUKwioGhApCFThW+mIgZs7IeYeJo2M51i4LCixYUl+CvnOyAnb/c3XA== dependencies: - "@firebase/app-types" "0.8.0" - "@firebase/util" "1.7.2" + "@firebase/app-types" "0.8.1" + "@firebase/util" "1.7.3" -"@firebase/database@0.13.9": - version "0.13.9" - resolved "https://registry.yarnpkg.com/@firebase/database/-/database-0.13.9.tgz#8cf8c77fb837ed1a6fa85565ac8c28864b0957fb" - integrity sha512-raQEBgQQybaEoMloJL8wWHQywGQ9mF2VbitvHydsbSNn+KL/xRDjXeQZPuuSbRjkYV6mR8jvQB7gpnzQQNE8Qg== +"@firebase/database@0.13.10": + version "0.13.10" + resolved "https://registry.yarnpkg.com/@firebase/database/-/database-0.13.10.tgz#c24e0219490b9c1fabfb7b42cb45850e145fe56d" + integrity sha512-KRucuzZ7ZHQsRdGEmhxId5jyM2yKsjsQWF9yv0dIhlxYg0D8rCVDZc/waoPKA5oV3/SEIoptF8F7R1Vfe7BCQA== dependencies: - "@firebase/auth-interop-types" "0.1.6" - "@firebase/component" "0.5.20" - "@firebase/logger" "0.3.3" - "@firebase/util" "1.7.2" + "@firebase/auth-interop-types" "0.1.7" + "@firebase/component" "0.5.21" + "@firebase/logger" "0.3.4" + "@firebase/util" "1.7.3" faye-websocket "0.11.4" tslib "^2.1.0" -"@firebase/firestore-compat@0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@firebase/firestore-compat/-/firestore-compat-0.2.1.tgz#15fac47547e2c2fe2c4d3ddd8af63591009436af" - integrity sha512-XiiTpmUfyZ6QU3Dw9BCT4T+KPvqzada1GsUNX49HmriWHpIn3jTAjsagkigRAnmNDlxS3ki6Yzg9Cs60tpD0tw== +"@firebase/firestore-compat@0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@firebase/firestore-compat/-/firestore-compat-0.2.3.tgz#da2f4f9a1da8cdf0a83769ec771f64ad7866363c" + integrity sha512-FgJwGCA2K+lsGk6gbJo57qn4iocQSGfOlNi2s4QsEO/WOVIU00yYGm408fN7iAGpr9d5VKyulO4sYcic7cS51g== dependencies: - "@firebase/component" "0.5.20" - "@firebase/firestore" "3.7.1" - "@firebase/firestore-types" "2.5.0" - "@firebase/util" "1.7.2" + "@firebase/component" "0.5.21" + "@firebase/firestore" "3.7.3" + "@firebase/firestore-types" "2.5.1" + "@firebase/util" "1.7.3" tslib "^2.1.0" -"@firebase/firestore-types@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@firebase/firestore-types/-/firestore-types-2.5.0.tgz#16fca40b6980fdb000de86042d7a96635f2bcdd7" - integrity sha512-I6c2m1zUhZ5SH0cWPmINabDyH5w0PPFHk2UHsjBpKdZllzJZ2TwTkXbDtpHUZNmnc/zAa0WNMNMvcvbb/xJLKA== +"@firebase/firestore-types@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@firebase/firestore-types/-/firestore-types-2.5.1.tgz#464b2ee057956599ca34de50eae957c30fdbabb7" + integrity sha512-xG0CA6EMfYo8YeUxC8FeDzf6W3FX1cLlcAGBYV6Cku12sZRI81oWcu61RSKM66K6kUENP+78Qm8mvroBcm1whw== -"@firebase/firestore@3.7.1": - version "3.7.1" - resolved "https://registry.yarnpkg.com/@firebase/firestore/-/firestore-3.7.1.tgz#68d6c35ba16702942577afe4607a5acf6d62d912" - integrity sha512-sDZ79cUf4cwCyRzN74zODgaeUvyt0lGA8YwaasVVqojgznwMG/bIz+/Tny4ZEnLZFrlniCqt2tStWsiC6s3u7g== +"@firebase/firestore@3.7.3": + version "3.7.3" + resolved "https://registry.yarnpkg.com/@firebase/firestore/-/firestore-3.7.3.tgz#c839d6983f81d2853daeac42fba316a86102e5e4" + integrity sha512-hnA8hljwJBpejv0SPlt0yiej1wz3VRcLzoNAZujTCI1wLoADkRNsqic5uN/Ge0M0vbmHliLXtet/PDqvEbB9Ww== dependencies: - "@firebase/component" "0.5.20" - "@firebase/logger" "0.3.3" - "@firebase/util" "1.7.2" - "@firebase/webchannel-wrapper" "0.8.0" + "@firebase/component" "0.5.21" + "@firebase/logger" "0.3.4" + "@firebase/util" "1.7.3" + "@firebase/webchannel-wrapper" "0.8.1" "@grpc/grpc-js" "^1.3.2" "@grpc/proto-loader" "^0.6.13" node-fetch "2.6.7" tslib "^2.1.0" -"@firebase/functions-compat@0.2.7": - version "0.2.7" - resolved "https://registry.yarnpkg.com/@firebase/functions-compat/-/functions-compat-0.2.7.tgz#fc43b1ab79f2c63209ea69db87b121f18b63a973" - integrity sha512-bcUst8ZDJHeVy2Wox4KEM5EizsrrqLzbwFIwJD7KkuSYP8XrlV2gaqJnCvIXXc0Nc4JRGvbXcvFFMXDjhsEp4Q== +"@firebase/functions-compat@0.2.8": + version "0.2.8" + resolved "https://registry.yarnpkg.com/@firebase/functions-compat/-/functions-compat-0.2.8.tgz#e6f1c476cdd6c3657d3b6328aebe8a62ace0a7bb" + integrity sha512-5w668whT+bm6oVcFqIxfFbn9N77WycpNCfZNg1l0iC+5RLSt53RTVu43pqi43vh23Vp4ad+SRBgZiQGAMen5wA== dependencies: - "@firebase/component" "0.5.20" - "@firebase/functions" "0.8.7" - "@firebase/functions-types" "0.5.0" - "@firebase/util" "1.7.2" + "@firebase/component" "0.5.21" + "@firebase/functions" "0.8.8" + "@firebase/functions-types" "0.5.1" + "@firebase/util" "1.7.3" tslib "^2.1.0" -"@firebase/functions-types@0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@firebase/functions-types/-/functions-types-0.5.0.tgz#b50ba95ccce9e96f7cda453228ffe1684645625b" - integrity sha512-qza0M5EwX+Ocrl1cYI14zoipUX4gI/Shwqv0C1nB864INAD42Dgv4v94BCyxGHBg2kzlWy8PNafdP7zPO8aJQA== +"@firebase/functions-types@0.5.1": + version "0.5.1" + resolved "https://registry.yarnpkg.com/@firebase/functions-types/-/functions-types-0.5.1.tgz#7633fd2ade99c1b8c0c5037fa369fc91849e3b15" + integrity sha512-olEJnTuULM/ws0pwhHA0Ze5oIdpFbZsdBGCaBhyL4pm1NUR4Moh0cyAsqr+VtqHCNMGquHU1GJ77qITkoonp0w== -"@firebase/functions@0.8.7": - version "0.8.7" - resolved "https://registry.yarnpkg.com/@firebase/functions/-/functions-0.8.7.tgz#b5571c50b849a31f8825a08f535419b2c2f3e9d8" - integrity sha512-JHSKdAOzlFJ9NdKoOaq4x6S1q6B3GmYZDg13KIDsE6BC0E9o/eWxOWOjSFJRCP/lpfFwa0rYBRayfUvZxW3BLw== +"@firebase/functions@0.8.8": + version "0.8.8" + resolved "https://registry.yarnpkg.com/@firebase/functions/-/functions-0.8.8.tgz#a193d5565670bfa9b0e64b00556fae7d183fc895" + integrity sha512-weNcDQJcH3/2YFaXd5dF5pUk3IQdZY60QNuWpq7yS+uaPlCRHjT0K989Q3ZcmYwXz7mHTfhlQamXdA4Yobgt+Q== dependencies: - "@firebase/app-check-interop-types" "0.1.0" - "@firebase/auth-interop-types" "0.1.6" - "@firebase/component" "0.5.20" - "@firebase/messaging-interop-types" "0.1.0" - "@firebase/util" "1.7.2" + "@firebase/app-check-interop-types" "0.1.1" + "@firebase/auth-interop-types" "0.1.7" + "@firebase/component" "0.5.21" + "@firebase/messaging-interop-types" "0.1.1" + "@firebase/util" "1.7.3" node-fetch "2.6.7" tslib "^2.1.0" -"@firebase/installations-compat@0.1.15": - version "0.1.15" - resolved "https://registry.yarnpkg.com/@firebase/installations-compat/-/installations-compat-0.1.15.tgz#95b13a2fa55ba1aa05094b8b54ccd09fc046cc11" - integrity sha512-m0atyudsVj6ekmM+djhhzzInMC3Y233YJky9vXUVt5MHQY0mHhqDds9+UIrCa6cpbl+ntI2fOuoYV7y01s3sfw== +"@firebase/installations-compat@0.1.16": + version "0.1.16" + resolved "https://registry.yarnpkg.com/@firebase/installations-compat/-/installations-compat-0.1.16.tgz#b54c2fefaffd49a9f16e84ab5260348197ea9e4e" + integrity sha512-Xp7s3iUMZ6/TN0a+g1kpHNEn7h59kSxi44/2I7bd3X6xwHnxMu0TqYB7U9WfqEhqiI9iKulL3g06wIZqaklElw== dependencies: - "@firebase/component" "0.5.20" - "@firebase/installations" "0.5.15" - "@firebase/installations-types" "0.4.0" - "@firebase/util" "1.7.2" + "@firebase/component" "0.5.21" + "@firebase/installations" "0.5.16" + "@firebase/installations-types" "0.4.1" + "@firebase/util" "1.7.3" tslib "^2.1.0" -"@firebase/installations-types@0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@firebase/installations-types/-/installations-types-0.4.0.tgz#256782ff9adfb390ac658c25bc32f89635ddce7c" - integrity sha512-nXxWKQDvBGctuvsizbUEJKfxXU9WAaDhon+j0jpjIfOJkvkj3YHqlLB/HeYjpUn85Pb22BjplpTnDn4Gm9pc3A== +"@firebase/installations-types@0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@firebase/installations-types/-/installations-types-0.4.1.tgz#3aa99213e39a81a3bbac25b1627169082da289ad" + integrity sha512-ac906QcmipomZjSasGDYNS1LDy4JNGzQ4VXHpFtoOrI6U2QGFkRezZpI+5bzfU062JOD+doO6irYC6Uwnv/GnA== -"@firebase/installations@0.5.15": - version "0.5.15" - resolved "https://registry.yarnpkg.com/@firebase/installations/-/installations-0.5.15.tgz#c037152c1b6a21e8ed54ecf7439ec50820962aa4" - integrity sha512-RVm2nc2d+bEDFzFzQDTTU1Z13fjAD0v88yDLjtRZuT2R7JwvAegQ4F7CupBvnnf7nftkd3kBwdOi8MhMthb3jQ== +"@firebase/installations@0.5.16": + version "0.5.16" + resolved "https://registry.yarnpkg.com/@firebase/installations/-/installations-0.5.16.tgz#ee83f771d36e991335d625dc861ac7d5574044e4" + integrity sha512-k3iyjr+yZnDOcJbP+CCZW3/zQJf9gYL2CNBJs9QbmFJoLz7cgIcnAT/XNDMudxcggF1goLfq4+MygpzHD0NzLA== dependencies: - "@firebase/component" "0.5.20" - "@firebase/util" "1.7.2" + "@firebase/component" "0.5.21" + "@firebase/util" "1.7.3" idb "7.0.1" tslib "^2.1.0" -"@firebase/logger@0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@firebase/logger/-/logger-0.3.3.tgz#0f724b1e0b166d17ac285aac5c8ec14d136beed4" - integrity sha512-POTJl07jOKTOevLXrTvJD/VZ0M6PnJXflbAh5J9VGkmtXPXNG6MdZ9fmRgqYhXKTaDId6AQenQ262uwgpdtO0Q== +"@firebase/logger@0.3.4": + version "0.3.4" + resolved "https://registry.yarnpkg.com/@firebase/logger/-/logger-0.3.4.tgz#8822dd3e9168be93c1bce0b4ac235e3b165a6a68" + integrity sha512-hlFglGRgZEwoyClZcGLx/Wd+zoLfGmbDkFx56mQt/jJ0XMbfPqwId1kiPl0zgdWZX+D8iH+gT6GuLPFsJWgiGw== dependencies: tslib "^2.1.0" -"@firebase/messaging-compat@0.1.19": - version "0.1.19" - resolved "https://registry.yarnpkg.com/@firebase/messaging-compat/-/messaging-compat-0.1.19.tgz#4de2dcb0768846cd889e5ba89742dd5232afb8a5" - integrity sha512-h5tx4nxfSILeRquk5mKE8Onu7WtL6b7rfB6GKNJKecvkPs3nnq5Z4cp2Av4JUR2Wtt9UxCTfO0iRbbmtrt2bZQ== +"@firebase/messaging-compat@0.1.21": + version "0.1.21" + resolved "https://registry.yarnpkg.com/@firebase/messaging-compat/-/messaging-compat-0.1.21.tgz#1e221cdd186fd48d41a8b9c42fdb912476717939" + integrity sha512-oxQCQ8EXqpSaTybryokbEM/LAqkG0L7OJuucllCg5roqRGIHE437Abus0Bn67P8TKJaYjyKxomg8wCvfmInjlg== dependencies: - "@firebase/component" "0.5.20" - "@firebase/messaging" "0.9.19" - "@firebase/util" "1.7.2" + "@firebase/component" "0.5.21" + "@firebase/messaging" "0.11.0" + "@firebase/util" "1.7.3" tslib "^2.1.0" -"@firebase/messaging-interop-types@0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@firebase/messaging-interop-types/-/messaging-interop-types-0.1.0.tgz#bdac02dd31edd5cb9eec37b1db698ea5e2c1a631" - integrity sha512-DbvUl/rXAZpQeKBnwz0NYY5OCqr2nFA0Bj28Fmr3NXGqR4PAkfTOHuQlVtLO1Nudo3q0HxAYLa68ZDAcuv2uKQ== +"@firebase/messaging-interop-types@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@firebase/messaging-interop-types/-/messaging-interop-types-0.1.1.tgz#03733115df2688786be5f96baa64869fb3914d0c" + integrity sha512-7XuY87zPh01EBaeS3s6co31Il5oGbPl5MxAg6Uj3fPv7PqJQlbwQ+B5k7CKSF/Y26tRxp+u+usxIvIWCSEA8CQ== -"@firebase/messaging@0.9.19": - version "0.9.19" - resolved "https://registry.yarnpkg.com/@firebase/messaging/-/messaging-0.9.19.tgz#868916ed20e2bd3ecb58d13e1adb186714cfcbfa" - integrity sha512-xu99y/7/P+y3txGtgjsVJZyvx7T5/KdvFgDWS7oZwhKYG0o+DXFvvw3SBMK82LFGFOoyHlJUPqv45EyCPnOPCA== +"@firebase/messaging@0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@firebase/messaging/-/messaging-0.11.0.tgz#ab6dbcd8b95f2b65f2290eb44110979261f84399" + integrity sha512-V7+Xw4QlB8PgINY7Wml+Uj8A3S2nR0ooVoaqfRJ8ZN3W7A4aO/DCkjPsf6DXehwfqRLA7PGB9Boe8l9Idy7icA== dependencies: - "@firebase/component" "0.5.20" - "@firebase/installations" "0.5.15" - "@firebase/messaging-interop-types" "0.1.0" - "@firebase/util" "1.7.2" + "@firebase/component" "0.5.21" + "@firebase/installations" "0.5.16" + "@firebase/messaging-interop-types" "0.1.1" + "@firebase/util" "1.7.3" idb "7.0.1" tslib "^2.1.0" -"@firebase/performance-compat@0.1.15": - version "0.1.15" - resolved "https://registry.yarnpkg.com/@firebase/performance-compat/-/performance-compat-0.1.15.tgz#9ba68c6696a5ccd9ea5022ead43c1246017015bf" - integrity sha512-mryHr5eBEpWxBo8b3KM/53SwwVjMVahwdEnhfx1r+zAvmEPEzXUOGBzAC1l5WQ4DrwtDR87uMZ5soiQ/0jl9QQ== +"@firebase/performance-compat@0.1.17": + version "0.1.17" + resolved "https://registry.yarnpkg.com/@firebase/performance-compat/-/performance-compat-0.1.17.tgz#23774adda07f6af83299517a202f8d98ebc9a70d" + integrity sha512-Hci5MrDlRuqwVozq7LaSAufXXElz+AtmEQArix64kLRJqHhOu5K/8TpuZXM/klR6gnLyIrk+01CrAemH3zHpDw== dependencies: - "@firebase/component" "0.5.20" - "@firebase/logger" "0.3.3" - "@firebase/performance" "0.5.15" - "@firebase/performance-types" "0.1.0" - "@firebase/util" "1.7.2" + "@firebase/component" "0.5.21" + "@firebase/logger" "0.3.4" + "@firebase/performance" "0.5.17" + "@firebase/performance-types" "0.1.1" + "@firebase/util" "1.7.3" tslib "^2.1.0" -"@firebase/performance-types@0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@firebase/performance-types/-/performance-types-0.1.0.tgz#5e6efa9dc81860aee2cb7121b39ae8fa137e69fc" - integrity sha512-6p1HxrH0mpx+622Ql6fcxFxfkYSBpE3LSuwM7iTtYU2nw91Hj6THC8Bc8z4nboIq7WvgsT/kOTYVVZzCSlXl8w== +"@firebase/performance-types@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@firebase/performance-types/-/performance-types-0.1.1.tgz#ac37fff87f2e716c18fb78c138dc398d9b9aecd7" + integrity sha512-wiJRLBg8EPaYSGJqx7aqkZ3L5fULfZa9zOTs4C06K020g0zzJh9kUUO/0U3wvHz7zRQjJxTO8Jw4SDjxs3EZrA== -"@firebase/performance@0.5.15": - version "0.5.15" - resolved "https://registry.yarnpkg.com/@firebase/performance/-/performance-0.5.15.tgz#094856ab0b5799a81d57c4998cda6d363d315a07" - integrity sha512-YnnkUehXXzqQefNE5PlPEsXeJYSeY7cMWEdHYTj6u0/F5ntLSAhVZC8jl3Y0fTU1W8a9USQhml6NaXyWiVGmjQ== +"@firebase/performance@0.5.17": + version "0.5.17" + resolved "https://registry.yarnpkg.com/@firebase/performance/-/performance-0.5.17.tgz#f0aa9724df9e2ef095f176c2ef1accfa75e3bac6" + integrity sha512-NDgzI5JYo6Itnj1FWhMkK3LtwKhtOnhC+WBkxezjzFVuCOornQjvu7ucAU1o2dHXh7MFruhHGFPsHyfkkMCljA== dependencies: - "@firebase/component" "0.5.20" - "@firebase/installations" "0.5.15" - "@firebase/logger" "0.3.3" - "@firebase/util" "1.7.2" + "@firebase/component" "0.5.21" + "@firebase/installations" "0.5.16" + "@firebase/logger" "0.3.4" + "@firebase/util" "1.7.3" tslib "^2.1.0" -"@firebase/remote-config-compat@0.1.15": - version "0.1.15" - resolved "https://registry.yarnpkg.com/@firebase/remote-config-compat/-/remote-config-compat-0.1.15.tgz#91343411085468a6c65b77acbbabc8791ea984f5" - integrity sha512-jGUrZXIxQRMeSrqEaCi3MtMF33NN12TNTQDZlbex2+T2+yTMI/sn3Mq52T/OccCo86DK17WVlXSWQCH1zCD13g== +"@firebase/remote-config-compat@0.1.16": + version "0.1.16" + resolved "https://registry.yarnpkg.com/@firebase/remote-config-compat/-/remote-config-compat-0.1.16.tgz#2953f8d556145eb57cb4244eb3e2c4a2c6f19804" + integrity sha512-BWonzeqODnGki/fZ17zOnjJFR5CWbIOU0PmYGjWBnbkWxpFDdE3zNsz8JTVd/Mkt7y2PHFMYpLsyZ473E/62FQ== dependencies: - "@firebase/component" "0.5.20" - "@firebase/logger" "0.3.3" - "@firebase/remote-config" "0.3.14" - "@firebase/remote-config-types" "0.2.0" - "@firebase/util" "1.7.2" + "@firebase/component" "0.5.21" + "@firebase/logger" "0.3.4" + "@firebase/remote-config" "0.3.15" + "@firebase/remote-config-types" "0.2.1" + "@firebase/util" "1.7.3" tslib "^2.1.0" -"@firebase/remote-config-types@0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@firebase/remote-config-types/-/remote-config-types-0.2.0.tgz#1e2759fc01f20b58c564db42196f075844c3d1fd" - integrity sha512-hqK5sCPeZvcHQ1D6VjJZdW6EexLTXNMJfPdTwbD8NrXUw6UjWC4KWhLK/TSlL0QPsQtcKRkaaoP+9QCgKfMFPw== +"@firebase/remote-config-types@0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@firebase/remote-config-types/-/remote-config-types-0.2.1.tgz#9f7dfb6b0066443592b055dddc57b0c954b0e83c" + integrity sha512-1PGx4vKtMMd5uB6G1Nj2b8fOnJx7mIJGzkdyfhIM1oQx9k3dJ+pVu4StrNm46vHaD8ZlOQLr91YfUE43xSXwSg== -"@firebase/remote-config@0.3.14": - version "0.3.14" - resolved "https://registry.yarnpkg.com/@firebase/remote-config/-/remote-config-0.3.14.tgz#44b2e6174b82b9729ab0893ab80eadcc7b3c830c" - integrity sha512-wEOz3Tasxhr5lCGioe0WNZwDOoQhNZK2qGAm5+AlHAPaAhWIWvqUTkKsk3nFRztyRZzj3r9k5Gc2OSpEcQKP1A== +"@firebase/remote-config@0.3.15": + version "0.3.15" + resolved "https://registry.yarnpkg.com/@firebase/remote-config/-/remote-config-0.3.15.tgz#97e14d08a1065ce1ccd63b13a6eaa0927164556d" + integrity sha512-ZCyqoCaftoNvc2r4zPaqNV4OgC4sRHjcQI+agzXESnhDLnTY8DpCaQ0m9j6deHuxxDOgu8QPDb8psLbjR+9CgQ== dependencies: - "@firebase/component" "0.5.20" - "@firebase/installations" "0.5.15" - "@firebase/logger" "0.3.3" - "@firebase/util" "1.7.2" + "@firebase/component" "0.5.21" + "@firebase/installations" "0.5.16" + "@firebase/logger" "0.3.4" + "@firebase/util" "1.7.3" tslib "^2.1.0" -"@firebase/storage-compat@0.1.20": - version "0.1.20" - resolved "https://registry.yarnpkg.com/@firebase/storage-compat/-/storage-compat-0.1.20.tgz#ec24fd62332d39460db6e7d62770de57e72fe690" - integrity sha512-8vruwltKdvEPhYbPXA/otb5fAD7MGsBHpCzktJWvF7eIALa4sUlYt+jJxG5Nwk2FoT1NrwLQ7TtI7zvm6/NinA== +"@firebase/storage-compat@0.1.22": + version "0.1.22" + resolved "https://registry.yarnpkg.com/@firebase/storage-compat/-/storage-compat-0.1.22.tgz#0eba37444a525fce3854c68eacc1d2b5d87f8b5a" + integrity sha512-uv33WnAEcxf2983Z03uhJmKc91LKSsRijFwut8xeoJamJoGAVj1Tc9Mio491aI1KZ+RMkNFghHL2FpxjuvxpPg== dependencies: - "@firebase/component" "0.5.20" - "@firebase/storage" "0.9.12" - "@firebase/storage-types" "0.6.0" - "@firebase/util" "1.7.2" + "@firebase/component" "0.5.21" + "@firebase/storage" "0.9.14" + "@firebase/storage-types" "0.6.1" + "@firebase/util" "1.7.3" tslib "^2.1.0" -"@firebase/storage-types@0.6.0": - version "0.6.0" - resolved "https://registry.yarnpkg.com/@firebase/storage-types/-/storage-types-0.6.0.tgz#0b1af64a2965af46fca138e5b70700e9b7e6312a" - integrity sha512-1LpWhcCb1ftpkP/akhzjzeFxgVefs6eMD2QeKiJJUGH1qOiows2w5o0sKCUSQrvrRQS1lz3SFGvNR1Ck/gqxeA== +"@firebase/storage-types@0.6.1": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@firebase/storage-types/-/storage-types-0.6.1.tgz#76b71b6f6ef5df4cf286e63f58e92638b9dcd62d" + integrity sha512-/pkNzKiGCSjdBBZHPvWL1kkPZfM3pFJ38HPJE1xTHwLBwdrFb4JrmY+5/E4ma5ePsbejecIOD1SZhEKDB/JwUQ== -"@firebase/storage@0.9.12": - version "0.9.12" - resolved "https://registry.yarnpkg.com/@firebase/storage/-/storage-0.9.12.tgz#5631893a1ae9f7b0426948ab9910cd58782f9183" - integrity sha512-XIAmje0ufvRrxrUU/9tvGCuUIy7WSJf3XM8Y8OV9EW2Dg1w4f8IpraLiUdlirdtFM0UAnO2kDQHoiVQYhRrADQ== +"@firebase/storage@0.9.14": + version "0.9.14" + resolved "https://registry.yarnpkg.com/@firebase/storage/-/storage-0.9.14.tgz#e70a0e6a706df8401acfa9991306b77eb1e32d7d" + integrity sha512-he8VAJ4BLkQdebnna15TI1/ymkwQTeKnjA/psKMAJ2+/UswD/68bCMKOlTrMvw6Flv3zc5YZk1xdL9DHR0i6wg== dependencies: - "@firebase/component" "0.5.20" - "@firebase/util" "1.7.2" + "@firebase/component" "0.5.21" + "@firebase/util" "1.7.3" node-fetch "2.6.7" tslib "^2.1.0" -"@firebase/util@1.7.2": - version "1.7.2" - resolved "https://registry.yarnpkg.com/@firebase/util/-/util-1.7.2.tgz#dbdb259f141b5025a7faaaa38e2ea5df0be36ff5" - integrity sha512-P3aTihYEMoz2QQlcn0T7av7HLEK9gsTc1ZiN9VA8wnUtEJscUNemCmTmP3RRysqEb3Z+tVVoycztY8f6R36rRw== +"@firebase/util@1.7.3": + version "1.7.3" + resolved "https://registry.yarnpkg.com/@firebase/util/-/util-1.7.3.tgz#e71640b6b2970b754f947235ceb10cba3f70e62c" + integrity sha512-wxNqWbqokF551WrJ9BIFouU/V5SL1oYCGx1oudcirdhadnQRFH5v1sjgGL7cUV/UsekSycygphdrF2lxBxOYKg== dependencies: tslib "^2.1.0" -"@firebase/webchannel-wrapper@0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.8.0.tgz#88dfc717fb950276fd0fdee879fad2c041e33475" - integrity sha512-Q8erQds5LuAUgNuFOt/tu/abffYUHYxN+Ogp2V5EOssfFG7Ja4ce324Sqyq41u/vB5CSr+tfYS3JzTDrDxCvdw== +"@firebase/webchannel-wrapper@0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.8.1.tgz#5fbb3808677aa6b88bf79968237d3bb14595b1ba" + integrity sha512-CJW8vxt6bJaBeco2VnlJjmCmAkrrtIdf0GGKvpAB4J5gw8Gi0rHb+qsgKp6LsyS5W6ALPLawLs7phZmw02dvLw== "@grpc/grpc-js@^1.3.2": - version "1.3.6" - resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.3.6.tgz#6e2d17610c2c8df0f6ceab0e1968f563df74b173" - integrity sha512-v7+LQFbqZKmd/Tvf5/j1Xlbq6jXL/4d+gUtm2TNX4QiEC3ELWADmGr2dGlUyLl6aKTuYfsN72vAsO5zmavYkEg== + version "1.7.3" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.7.3.tgz#f2ea79f65e31622d7f86d4b4c9ae38f13ccab99a" + integrity sha512-H9l79u4kJ2PVSxUNA08HMYAnUBLj9v6KjYQ7SQ71hOZcEXhShE/y5iQCesP8+6/Ik/7i2O0a10bPquIcYfufog== dependencies: + "@grpc/proto-loader" "^0.7.0" "@types/node" ">=12.12.47" "@grpc/proto-loader@^0.6.13": @@ -1795,19 +1862,35 @@ protobufjs "^6.11.3" yargs "^16.2.0" -"@hookform/resolvers@^2.6.0": - version "2.8.8" - resolved "https://registry.yarnpkg.com/@hookform/resolvers/-/resolvers-2.8.8.tgz#17cf806485435877fdafce9f3bee6ff68f7f87b6" - integrity sha512-meAEDur1IJBfKyTo9yPYAuzjIfrxA7m9Ov+1nxaW/YupsqMeseWifoUjWK03+hz/RJizsVQAaUjVxFEkyu0GWg== +"@grpc/proto-loader@^0.7.0": + version "0.7.3" + resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.3.tgz#75a6f95b51b85c5078ac7394da93850c32d36bb8" + integrity sha512-5dAvoZwna2Py3Ef96Ux9jIkp3iZ62TUsV00p3wVBPNX5K178UbNi8Q7gQVqwXT1Yq9RejIGG9G2IPEo93T6RcA== + dependencies: + "@types/long" "^4.0.1" + lodash.camelcase "^4.3.0" + long "^4.0.0" + protobufjs "^7.0.0" + yargs "^16.2.0" -"@humanwhocodes/config-array@^0.9.2": - version "0.9.5" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.5.tgz#2cbaf9a89460da24b5ca6531b8bbfc23e1df50c7" - integrity sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw== +"@hookform/resolvers@^2.6.0": + version "2.9.10" + resolved "https://registry.yarnpkg.com/@hookform/resolvers/-/resolvers-2.9.10.tgz#e7e88942ee34e97b7bc937b0be4694194c9cd420" + integrity sha512-JIL1DgJIlH9yuxcNGtyhsWX/PgNltz+5Gr6+8SX9fhXc/hPbEIk6wPI82nhgvp3uUb6ZfAM5mqg/x7KR7NAb+A== + +"@humanwhocodes/config-array@^0.11.6": + version "0.11.7" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.7.tgz#38aec044c6c828f6ed51d5d7ae3d9b9faf6dbb0f" + integrity sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw== dependencies: "@humanwhocodes/object-schema" "^1.2.1" debug "^4.1.1" - minimatch "^3.0.4" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== "@humanwhocodes/object-schema@^1.2.1": version "1.2.1" @@ -1842,6 +1925,18 @@ jest-util "^27.5.1" slash "^3.0.0" +"@jest/console@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-28.1.3.tgz#2030606ec03a18c31803b8a36382762e447655df" + integrity sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw== + dependencies: + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^28.1.3" + jest-util "^28.1.3" + slash "^3.0.0" + "@jest/core@^27.5.1": version "27.5.1" resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.5.1.tgz#267ac5f704e09dc52de2922cbf3af9edcd64b626" @@ -1893,6 +1988,13 @@ "@types/node" "*" jest-mock "^27.5.1" +"@jest/expect-utils@^29.3.1": + version "29.3.1" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.3.1.tgz#531f737039e9b9e27c42449798acb5bba01935b6" + integrity sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g== + dependencies: + jest-get-type "^29.2.0" + "@jest/fake-timers@^27.5.1": version "27.5.1" resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.5.1.tgz#76979745ce0579c8a94a4678af7a748eda8ada74" @@ -1945,12 +2047,19 @@ terminal-link "^2.0.0" v8-to-istanbul "^8.1.0" -"@jest/schemas@^28.0.2": - version "28.0.2" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-28.0.2.tgz#08c30df6a8d07eafea0aef9fb222c5e26d72e613" - integrity sha512-YVDJZjd4izeTDkij00vHHAymNXQ6WWsdChFRK86qck6Jpr3DCL5W3Is3vslviRlP+bLuMYRLbdp98amMvqudhA== +"@jest/schemas@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-28.1.3.tgz#ad8b86a66f11f33619e3d7e1dcddd7f2d40ff905" + integrity sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg== dependencies: - "@sinclair/typebox" "^0.23.3" + "@sinclair/typebox" "^0.24.1" + +"@jest/schemas@^29.0.0": + version "29.0.0" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.0.0.tgz#5f47f5994dd4ef067fb7b4188ceac45f77fe952a" + integrity sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA== + dependencies: + "@sinclair/typebox" "^0.24.1" "@jest/source-map@^27.5.1": version "27.5.1" @@ -1971,6 +2080,16 @@ "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" +"@jest/test-result@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-28.1.3.tgz#5eae945fd9f4b8fcfce74d239e6f725b6bf076c5" + integrity sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg== + dependencies: + "@jest/console" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + "@jest/test-sequencer@^27.5.1": version "27.5.1" resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz#4057e0e9cea4439e544c6353c6affe58d095745b" @@ -2013,19 +2132,39 @@ "@types/yargs" "^16.0.0" chalk "^4.0.0" -"@jest/types@^28.1.0": - version "28.1.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.0.tgz#508327a89976cbf9bd3e1cc74641a29fd7dfd519" - integrity sha512-xmEggMPr317MIOjjDoZ4ejCSr9Lpbt/u34+dvc99t7DS8YirW5rwZEhzKPC2BMUFkUhI48qs6qLUSGw5FuL0GA== +"@jest/types@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.3.tgz#b05de80996ff12512bc5ceb1d208285a7d11748b" + integrity sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ== dependencies: - "@jest/schemas" "^28.0.2" + "@jest/schemas" "^28.1.3" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jridgewell/gen-mapping@^0.3.0": +"@jest/types@^29.3.1": + version "29.3.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.3.1.tgz#7c5a80777cb13e703aeec6788d044150341147e3" + integrity sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA== + dependencies: + "@jest/schemas" "^29.0.0" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": version "0.3.2" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== @@ -2034,12 +2173,12 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/resolve-uri@^3.0.3": +"@jridgewell/resolve-uri@3.1.0", "@jridgewell/resolve-uri@^3.0.3": version "3.1.0" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== -"@jridgewell/set-array@^1.0.1": +"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== @@ -2052,23 +2191,31 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@^1.4.10": +"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.14" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== -"@jridgewell/trace-mapping@^0.3.0", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.14" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed" - integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ== +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== dependencies: "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" +"@jridgewell/trace-mapping@^0.3.14", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.17" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + "@leichtgewicht/ip-codec@^2.0.1": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.3.tgz#0300943770e04231041a51bd39f0439b5c7ab4f0" - integrity sha512-nkalE/f1RvRGChwBnEIoBfSEYOXnCRdleKuv6+lePbMDrMZXeDQnqak5XDOeBgrPPyPfAdcCu/B5z+v3VhplGg== + version "2.0.4" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" + integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== "@mark.probst/unicode-properties@~1.1.0": version "1.1.0" @@ -2079,205 +2226,171 @@ unicode-trie "^0.3.0" "@mdi/js@^6.6.96": - version "6.6.96" - resolved "https://registry.yarnpkg.com/@mdi/js/-/js-6.6.96.tgz#119f79fa9327359421167a7d4b8bde26e84702ce" - integrity sha512-ke9PN5DjPCOlMfhioxeZYADz8Yiz6v47W0IYRza01SSJD7y1EwESVpwFnnFUso+eCoWtE1CO9cTIvQF6sEreuA== + version "6.9.96" + resolved "https://registry.yarnpkg.com/@mdi/js/-/js-6.9.96.tgz#90e8fadef05a975df384f0505b2100a795881873" + integrity sha512-rK0/vLFaiItYS2W7uVmaKPKnhNQE4XVkylpk5njtVwENnp8elwY5uRL6qvdj2esuvUHG7DwygE4Qu3eKxxuJiQ== -"@microsoft/tsdoc-config@0.16.1": - version "0.16.1" - resolved "https://registry.yarnpkg.com/@microsoft/tsdoc-config/-/tsdoc-config-0.16.1.tgz#4de11976c1202854c4618f364bf499b4be33e657" - integrity sha512-2RqkwiD4uN6MLnHFljqBlZIXlt/SaUT6cuogU1w2ARw4nKuuppSmR0+s+NC+7kXBQykd9zzu0P4HtBpZT5zBpQ== +"@microsoft/tsdoc-config@0.16.2": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz#b786bb4ead00d54f53839a458ce626c8548d3adf" + integrity sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw== dependencies: - "@microsoft/tsdoc" "0.14.1" + "@microsoft/tsdoc" "0.14.2" ajv "~6.12.6" jju "~1.4.0" resolve "~1.19.0" -"@microsoft/tsdoc@0.14.1": - version "0.14.1" - resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.14.1.tgz#155ef21065427901994e765da8a0ba0eaae8b8bd" - integrity sha512-6Wci+Tp3CgPt/B9B0a3J4s3yMgLNSku6w5TV6mN+61C71UqsRBv2FUibBf3tPGlNxebgPHMEUzKpb1ggE8KCKw== +"@microsoft/tsdoc@0.14.2": + version "0.14.2" + resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz#c3ec604a0b54b9a9b87e9735dfc59e1a5da6a5fb" + integrity sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug== -"@monaco-editor/loader@^1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@monaco-editor/loader/-/loader-1.3.1.tgz#35d198fb13a983dd49e9e448a172b6a9da309411" - integrity sha512-LfpAO6e54SZQW0nnI1sWKO4XtAlNx3WHXYZixeVy0HhZ4txGPOok4rs2u4dSi2+iRWeL198cZ2FlFQKr8mH+cw== +"@monaco-editor/loader@^1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@monaco-editor/loader/-/loader-1.3.2.tgz#04effbb87052d19cd7d3c9d81c0635490f9bb6d8" + integrity sha512-BTDbpHl3e47r3AAtpfVFTlAi7WXv4UQ/xZmz8atKl4q7epQV5e7+JbigFDViWF71VBi4IIBdcWP57Hj+OWuc9g== dependencies: state-local "^1.0.6" "@monaco-editor/react@^4.4.4": - version "4.4.4" - resolved "https://registry.yarnpkg.com/@monaco-editor/react/-/react-4.4.4.tgz#8d6b0ac144e2b673f85408e30f1facafff9b7aab" - integrity sha512-yQsYnVkgP5RC5ZMoRVCXSBn4D4hLUOgoQK+AZJpVY57NDXmEb57OVaaYKh8/RTzxkpuLV278hKNw5DnuzlgQwg== + version "4.4.6" + resolved "https://registry.yarnpkg.com/@monaco-editor/react/-/react-4.4.6.tgz#8ae500b0edf85276d860ed702e7056c316548218" + integrity sha512-Gr3uz3LYf33wlFE3eRnta4RxP5FSNxiIV9ENn2D2/rN8KgGAD8ecvcITRtsbbyuOuNkwbuHYxfeaz2Vr+CtyFA== dependencies: - "@monaco-editor/loader" "^1.3.1" + "@monaco-editor/loader" "^1.3.2" prop-types "^15.7.2" -"@mui/base@5.0.0-alpha.75": - version "5.0.0-alpha.75" - resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-alpha.75.tgz#0b352ff951765dfa83723fd1faf46a128dfe63ca" - integrity sha512-eQ8SP2ML5nJyOdSqmk26ezg/eEP1k42Z+k6uMfNbgHZc8iZwgw9iVe+6g5j/qZPKS88AtxVG8YsLLZkXT82/Bw== +"@mui/base@5.0.0-alpha.108": + version "5.0.0-alpha.108" + resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-alpha.108.tgz#4e4639ba6769dd178ef475dba4cc36bf8a3f1dc6" + integrity sha512-KjzRUts2i/ODlMfywhFTqTzQl+Cr9nlDSZxJcnYjrbOV/iRyQNBTDoiFJt+XEdRi0fZBHnk74AFbnP56ehybsA== dependencies: - "@babel/runtime" "^7.17.2" - "@emotion/is-prop-valid" "^1.1.2" - "@mui/types" "^7.1.3" - "@mui/utils" "^5.6.0" - "@popperjs/core" "^2.11.4" - clsx "^1.1.1" - prop-types "^15.7.2" - react-is "^17.0.2" - -"@mui/base@5.0.0-alpha.90": - version "5.0.0-alpha.90" - resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-alpha.90.tgz#73700ba74e5c75096ee5d0bfe3ba4a3b3b81beef" - integrity sha512-hNKwzr+RkiuGsGrakz8Q2i5ezr4Dz4b4Qsdipt9SiMrhuFAra/i501VSaEIzwec9LC4G+vtW4fE7yJBB0XaAYw== - dependencies: - "@babel/runtime" "^7.17.2" - "@emotion/is-prop-valid" "^1.1.3" - "@mui/types" "^7.1.4" - "@mui/utils" "^5.9.1" - "@popperjs/core" "^2.11.5" + "@babel/runtime" "^7.20.1" + "@emotion/is-prop-valid" "^1.2.0" + "@mui/types" "^7.2.2" + "@mui/utils" "^5.10.16" + "@popperjs/core" "^2.11.6" clsx "^1.2.1" prop-types "^15.8.1" react-is "^18.2.0" -"@mui/icons-material@5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-5.6.0.tgz#bce757f7c7a8eb31b238311a15fa0a0bcdf9ec39" - integrity sha512-2GDGt+/BbwM3oVkF84b9FFKQdQ9TxBJIRnTwT99vO2mimdfJaojxMRB2lkysm9tUY4HOf0yoU6O//X6GTC0Zhw== +"@mui/core-downloads-tracker@^5.10.16": + version "5.10.16" + resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-5.10.16.tgz#4c2d36bcab58cb6250596b20601f499bfadc0642" + integrity sha512-eK9+olw2ZbXX+vGrtKnN01/vLP1aX0Lq0xok35bqWM1aB93Dcmky/xPNf8h31oJ/C+IzJBjZaZMEDzVZg4Qc0A== + +"@mui/icons-material@^5.10.16": + version "5.10.16" + resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-5.10.16.tgz#9c16054d0cc54d40267447128a07e79b516ead1e" + integrity sha512-jjCc0IF6iyLiucQCu5igg3fOscSqbbvRCmyRxXgzOcLR56B0sg2L8o+ZfJ0dAg59+wvgtXaxvjze/mJg0B4iWA== dependencies: - "@babel/runtime" "^7.17.2" + "@babel/runtime" "^7.20.1" "@mui/lab@^5.0.0-alpha.76": - version "5.0.0-alpha.76" - resolved "https://registry.yarnpkg.com/@mui/lab/-/lab-5.0.0-alpha.76.tgz#c41d1bd3413ab43b7da118088b121578dafc251c" - integrity sha512-MCx6t28L6xo5S3/GXFZqIfXBdFXfCO8UblEb+sf48UREDx1awUDLS7/n0BLC9N6pj6P95OpMx+at25gTSd2CQQ== + version "5.0.0-alpha.110" + resolved "https://registry.yarnpkg.com/@mui/lab/-/lab-5.0.0-alpha.110.tgz#d34638fb66334a1865a10b8a2d54beddb41adb3e" + integrity sha512-SkX5QNbaWouO7BXvb8zpFzDizLt7UzgaebqKSvFJLF28OXiNDfPVCle6IIB4g7hAyb/o19Kbhxs9V+LwK5gQzA== dependencies: - "@babel/runtime" "^7.17.2" - "@mui/base" "5.0.0-alpha.75" - "@mui/system" "^5.6.0" - "@mui/utils" "^5.6.0" - "@mui/x-date-pickers" "5.0.0-alpha.0" - clsx "^1.1.1" - prop-types "^15.7.2" - react-is "^17.0.2" - react-transition-group "^4.4.2" - rifm "^0.12.1" - -"@mui/material@5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.6.0.tgz#284270f5e48d379a9b9bc4db412a807b807965b5" - integrity sha512-yh4FoRRPTgJWjv1oIu3YuvfYGD/WOEnyGizQ9fKs+hlMjIc0rzFpyUCo++P/3BUd0/hRKcI8D8mrpJK9OiOy1g== - dependencies: - "@babel/runtime" "^7.17.2" - "@mui/base" "5.0.0-alpha.75" - "@mui/system" "^5.6.0" - "@mui/types" "^7.1.3" - "@mui/utils" "^5.6.0" - "@types/react-transition-group" "^4.4.4" - clsx "^1.1.1" - csstype "^3.0.11" - hoist-non-react-statics "^3.3.2" - prop-types "^15.7.2" - react-is "^17.0.2" - react-transition-group "^4.4.2" - -"@mui/material@^5.0.0": - version "5.9.1" - resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.9.1.tgz#92990e6d4035792430dcf548b91db6f335aebdd3" - integrity sha512-c09SbaMm7Rl7Df9JRkXwPWNbnfrutmHERTJC46OJ9OMAM9+HGQihIbGln1k2Xj65jb3E+G498FZFAoSrrBDvwQ== - dependencies: - "@babel/runtime" "^7.17.2" - "@mui/base" "5.0.0-alpha.90" - "@mui/system" "^5.9.1" - "@mui/types" "^7.1.4" - "@mui/utils" "^5.9.1" - "@types/react-transition-group" "^4.4.5" + "@babel/runtime" "^7.20.1" + "@mui/base" "5.0.0-alpha.108" + "@mui/system" "^5.10.16" + "@mui/types" "^7.2.2" + "@mui/utils" "^5.10.16" clsx "^1.2.1" - csstype "^3.1.0" prop-types "^15.8.1" react-is "^18.2.0" - react-transition-group "^4.4.2" -"@mui/private-theming@^5.9.1": - version "5.9.1" - resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.9.1.tgz#4f714ed9ebd587373dc77b3fc69e9f3e720f0190" - integrity sha512-eIh2IZJInNTdgPLMo9cruzm8UDX5amBBxxsSoNre7lRj3wcsu3TG5OKjIbzkf4VxHHEhdPeNNQyt92k7L78u2A== +"@mui/material@^5.0.0", "@mui/material@^5.10.16": + version "5.10.16" + resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.10.16.tgz#4ad6e69d81f11487f502591d8d060143d2e89b97" + integrity sha512-JSHcDQQ+k30NKkCM/0KX6jq4F5LOrbFKZpS+cEl7scZWOCJpUPH5ccAT5a7O8wzrgNZ8Y9PnwzNvWBrfShpJFw== dependencies: - "@babel/runtime" "^7.17.2" - "@mui/utils" "^5.9.1" - prop-types "^15.8.1" - -"@mui/styled-engine@^5.8.7": - version "5.8.7" - resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-5.8.7.tgz#63d0779c07677fe76d4705a02c7ae99f89b50780" - integrity sha512-tVqtowjbYmiRq+qcqXK731L9eWoL9H8xTRhuTgaDGKdch1zlt4I2UwInUe1w2N9N/u3/jHsFbLcl1Un3uOwpQg== - dependencies: - "@babel/runtime" "^7.17.2" - "@emotion/cache" "^11.9.3" - csstype "^3.1.0" - prop-types "^15.8.1" - -"@mui/system@^5.6.0", "@mui/system@^5.9.1": - version "5.9.1" - resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.9.1.tgz#dadd1094b1582781cc524b112a0a126f60b23c25" - integrity sha512-ZixTmc2+sYp++avoYJ38eM70nfwwudN06vYCU4kfwa4nQPiH+bhLYZnfYkcXRKiDR/hfT0dptbOOfQGZqBYczQ== - dependencies: - "@babel/runtime" "^7.17.2" - "@mui/private-theming" "^5.9.1" - "@mui/styled-engine" "^5.8.7" - "@mui/types" "^7.1.4" - "@mui/utils" "^5.9.1" + "@babel/runtime" "^7.20.1" + "@mui/base" "5.0.0-alpha.108" + "@mui/core-downloads-tracker" "^5.10.16" + "@mui/system" "^5.10.16" + "@mui/types" "^7.2.2" + "@mui/utils" "^5.10.16" + "@types/react-transition-group" "^4.4.5" clsx "^1.2.1" - csstype "^3.1.0" + csstype "^3.1.1" + prop-types "^15.8.1" + react-is "^18.2.0" + react-transition-group "^4.4.5" + +"@mui/private-theming@^5.10.16": + version "5.10.16" + resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.10.16.tgz#181ab7568a3cf0c6b12cc12f5a91aeb4509df1ce" + integrity sha512-0MArkJaOHRCKqL/GWjngGZmyOeRz+uxffhx82bKcewr8swqV7xx7EFP02pk0L/gLdfcvYdqwH4YTVjG/+TaKrg== + dependencies: + "@babel/runtime" "^7.20.1" + "@mui/utils" "^5.10.16" prop-types "^15.8.1" -"@mui/types@^7.1.3", "@mui/types@^7.1.4": - version "7.1.4" - resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.1.4.tgz#4185c05d6df63ec673cda15feab80440abadc764" - integrity sha512-uveM3byMbthO+6tXZ1n2zm0W3uJCQYtwt/v5zV5I77v2v18u0ITkb8xwhsDD2i3V2Kye7SaNR6FFJ6lMuY/WqQ== - -"@mui/utils@^5.2.3", "@mui/utils@^5.6.0", "@mui/utils@^5.7.0", "@mui/utils@^5.9.1": - version "5.9.1" - resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.9.1.tgz#2b2c9dadbf8ba6561e145b5688fb7df5ef15a934" - integrity sha512-8+4adOR3xusyJwvbnZxcjqcmbWvl7Og+260ZKIrSvwnFs0aLubL+8MhiceeDDGcmb0bTKxfUgRJ96j32Jb7P+A== +"@mui/styled-engine@^5.10.16": + version "5.10.16" + resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-5.10.16.tgz#52a2d31e4012958d21c92b42acaca4c3e79841b4" + integrity sha512-ZMSjXvtiGwGDKqrSlXhpxK2voUaF2/lpC/pSTfFmZvKH9j9a9h1/iwo3ybgjFVYGgbfNeW4h0xEchiRohu9xsw== dependencies: - "@babel/runtime" "^7.17.2" + "@babel/runtime" "^7.20.1" + "@emotion/cache" "^11.10.5" + csstype "^3.1.1" + prop-types "^15.8.1" + +"@mui/system@^5.10.16": + version "5.10.16" + resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.10.16.tgz#2b07d78eb5e337463045b81a59f718795807fdc7" + integrity sha512-OqI9B1jZ9zQ/dmoqseku4CzdEs9DbLiiMOaWxC3WeAJxM1UavlCgXz0encqm93LIlmSL7TjuHN1/rW8BJCnU8A== + dependencies: + "@babel/runtime" "^7.20.1" + "@mui/private-theming" "^5.10.16" + "@mui/styled-engine" "^5.10.16" + "@mui/types" "^7.2.2" + "@mui/utils" "^5.10.16" + clsx "^1.2.1" + csstype "^3.1.1" + prop-types "^15.8.1" + +"@mui/types@^7.2.2": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.2.2.tgz#723f6d40c25c89c2e0352a7e51794e8eb77cdbe3" + integrity sha512-siex8cZDtWeC916cXOoUOnEQQejuMYmHtc4hM6VkKVYaBICz3VIiqyiAomRboTQHt2jchxQ5Q5ATlbcDekTxDA== + +"@mui/utils@^5.10.16", "@mui/utils@^5.10.3": + version "5.10.16" + resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.10.16.tgz#7a981444855968ebdb1830d76e298d1ac47eaaf6" + integrity sha512-3MB/SGsgiiu9Z55CFmAfiONUoR7AAue/H4F6w3mc2LnhFQCsoVvXhioDPcsiRpUMIQr34jDPzGXdCuqWooPCXQ== + dependencies: + "@babel/runtime" "^7.20.1" "@types/prop-types" "^15.7.5" "@types/react-is" "^16.7.1 || ^17.0.0" prop-types "^15.8.1" react-is "^18.2.0" -"@mui/x-date-pickers@5.0.0-alpha.0": - version "5.0.0-alpha.0" - resolved "https://registry.yarnpkg.com/@mui/x-date-pickers/-/x-date-pickers-5.0.0-alpha.0.tgz#a62ffbab453d3c2dcd4ec20bd4f3f6338ad2ed3f" - integrity sha512-JTzTaNSWbxNi8KDUJjHCH6im0YlIEv88gPoKhGm7s6xCGT1q6FtMp/oQ40nhfwrJ73nkM5G1JXRIzI/yfsHXQQ== +"@mui/x-date-pickers@^5.0.0-alpha.4": + version "5.0.9" + resolved "https://registry.yarnpkg.com/@mui/x-date-pickers/-/x-date-pickers-5.0.9.tgz#7490ba4615285280fcb42bdd38f68578f2faa5f4" + integrity sha512-PM3RU8MiwDVi+dSDGJ7ylI0hCe79wSCDfrjghS8ApGGFn/n87S8pUZxsZ5czw3mVRN6VfS2C19peo4nM1Tx+nA== dependencies: - "@date-io/date-fns" "^2.11.0" - "@date-io/dayjs" "^2.11.0" - "@date-io/luxon" "^2.11.1" - "@date-io/moment" "^2.11.0" - "@mui/utils" "^5.2.3" - clsx "^1.1.1" + "@babel/runtime" "^7.18.9" + "@date-io/core" "^2.15.0" + "@date-io/date-fns" "^2.15.0" + "@date-io/dayjs" "^2.15.0" + "@date-io/luxon" "^2.15.0" + "@date-io/moment" "^2.15.0" + "@mui/utils" "^5.10.3" + "@types/react-transition-group" "^4.4.5" + clsx "^1.2.1" prop-types "^15.7.2" - react-transition-group "^4.4.2" + react-transition-group "^4.4.5" rifm "^0.12.1" -"@mui/x-date-pickers@^5.0.0-alpha.4": - version "5.0.0-alpha.4" - resolved "https://registry.yarnpkg.com/@mui/x-date-pickers/-/x-date-pickers-5.0.0-alpha.4.tgz#853710d09b2dc29876e61a32d1f7b5c4b6d8816a" - integrity sha512-bPEsVygOI5KvrySYzi4ujJlRr4uskM5hDpcV8JCafHtSNQjUMQmCDtQKpAd8rViKBCBQMK8vhpqmf8ShfiZpLA== +"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": + version "5.1.1-v1" + resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129" + integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg== dependencies: - "@babel/runtime" "^7.17.2" - "@date-io/date-fns" "^2.14.0" - "@date-io/dayjs" "^2.14.0" - "@date-io/luxon" "^2.14.0" - "@date-io/moment" "^2.14.0" - "@mui/utils" "^5.7.0" - clsx "^1.1.1" - prop-types "^15.7.2" - react-transition-group "^4.4.2" - rifm "^0.12.1" + eslint-scope "5.1.1" "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -2292,7 +2405,7 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== -"@nodelib/fs.walk@^1.2.3": +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": version "1.2.8" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== @@ -2301,24 +2414,24 @@ fastq "^1.6.0" "@pmmmwh/react-refresh-webpack-plugin@^0.5.3": - version "0.5.5" - resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.5.tgz#e77aac783bd079f548daa0a7f080ab5b5a9741ca" - integrity sha512-RbG7h6TuP6nFFYKJwbcToA1rjC1FyPg25NR2noAZ0vKI+la01KTSRPkuVPE+U88jXv7javx2JHglUcL1MHcshQ== + version "0.5.10" + resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.10.tgz#2eba163b8e7dbabb4ce3609ab5e32ab63dda3ef8" + integrity sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA== dependencies: ansi-html-community "^0.0.8" common-path-prefix "^3.0.0" - core-js-pure "^3.8.1" + core-js-pure "^3.23.3" error-stack-parser "^2.0.6" find-up "^5.0.0" html-entities "^2.1.0" - loader-utils "^2.0.0" + loader-utils "^2.0.4" schema-utils "^3.0.0" source-map "^0.7.3" -"@popperjs/core@^2.11.4", "@popperjs/core@^2.11.5": - version "2.11.5" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.5.tgz#db5a11bf66bdab39569719555b0f76e138d7bd64" - integrity sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw== +"@popperjs/core@^2.11.6": + version "2.11.6" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.6.tgz#cee20bd55e68a1720bdab363ecf0c821ded4cd45" + integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw== "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" @@ -2408,6 +2521,11 @@ resolved "https://registry.yarnpkg.com/@react-dnd/shallowequal/-/shallowequal-4.0.2.tgz#d1b4befa423f692fa4abf1c79209702e7d8ae4b4" integrity sha512-/RVXdLvJxLg4QKvMoM5WlwNR9ViO9z8B/qPcc+C0Sa/teJY7QG7kJ441DwzOjMYEY7GmU4dj5EcGHIkKZiQZCA== +"@remix-run/router@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.0.3.tgz#953b88c20ea00d0eddaffdc1b115c08474aa295d" + integrity sha512-ceuyTSs7PZ/tQqi19YZNBc5X7kj1f8p+4DIyrcIYFY9h+hd1OKm4RqtiWldR9eGEvIiJfsqwM4BsuCtRIuEw6Q== + "@rollup/plugin-babel@^5.2.0": version "5.3.1" resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz#04bc0608f4aa4b2e4b1aebf284344d0f68fda283" @@ -2445,10 +2563,10 @@ estree-walker "^1.0.1" picomatch "^2.2.2" -"@rowy/form-builder@^0.7.0": - version "0.7.0" - resolved "https://registry.yarnpkg.com/@rowy/form-builder/-/form-builder-0.7.0.tgz#75c95d7114d0912a944f737a1c61b60b6cefa935" - integrity sha512-D5koLnPdcGuHCMWgiU0stLVK8Dvu+mKWJY+WSKNUsPtqCxuSeoi1RWTQEy+DYkQl2msVFWvxt4Ei1FlPTNwNsQ== +"@rowy/form-builder@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@rowy/form-builder/-/form-builder-0.8.0.tgz#6bdf284033ce1dfa665e3adac01bcb99c981602a" + integrity sha512-FJRcfnDCTVn9+AyGWCa1SZ5bRGNZJ+uWo2vgrHep4Xef+pXmgxTLUXrpuUirCrL9F/omfC5/q3/KgcYUME4qdA== dependencies: "@hookform/resolvers" "^2.6.0" "@types/lodash-es" "^4.17.6" @@ -2471,19 +2589,19 @@ integrity sha512-XAHWKDeZjHWelNqjIRzS+RdAOXqWiQSv9dcWJAmwheLdhqRym2IjTEux41cy3OWyAKupAJkWacGDQmhLaRh1Lg== "@rushstack/eslint-patch@^1.1.0": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.1.1.tgz#782fa5da44c4f38ae9fd38e9184b54e451936118" - integrity sha512-BUyKJGdDWqvWC5GEhyOiUrGNi9iJUr4CU0O2WxJL6QJhHeeA/NVBalH+FeK0r/x/W0rPymXt5s78TDS7d6lCwg== + version "1.2.0" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz#8be36a1f66f3265389e90b5f9c9962146758f728" + integrity sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg== -"@sinclair/typebox@^0.23.3": - version "0.23.5" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.23.5.tgz#93f7b9f4e3285a7a9ade7557d9a8d36809cbc47d" - integrity sha512-AFBVi/iT4g20DHoujvMH1aEDn8fGJh4xsRGCP6d8RpLPMqsNPvW01Jcn0QysXTsg++/xj25NmJsGyH9xug/wKg== +"@sinclair/typebox@^0.24.1": + version "0.24.51" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" + integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== "@sinonjs/commons@^1.7.0": - version "1.8.2" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.2.tgz#858f5c4b48d80778fde4b9d541f27edc0d56488b" - integrity sha512-sruwd86RJHdsVf/AtBoijDmUqJp3B6hF/DGC23C+JaegnDHaZyewCjoVGTdg3J0uz3Zs7NnIT05OBOmML72lQw== + version "1.8.6" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9" + integrity sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ== dependencies: type-detect "4.0.8" @@ -2607,118 +2725,103 @@ "@svgr/plugin-svgo" "^5.5.0" loader-utils "^2.0.0" -"@swc/core-android-arm-eabi@1.2.164": - version "1.2.164" - resolved "https://registry.yarnpkg.com/@swc/core-android-arm-eabi/-/core-android-arm-eabi-1.2.164.tgz#91dade277d6ff3017df0f08c48acef6c6f094129" - integrity sha512-TdVOB3SJEpcBr+AfWXtK/r8GWJjddLD2bVHZe5wcN+GOGFZpkDTvhT66neK3Z13IBOMWkc5HckjdZ+Rfj+n3Ew== +"@swc/core-darwin-arm64@1.3.20": + version "1.3.20" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.20.tgz#e713ed63ef7b8096fb820b7cbd5aa776e824431f" + integrity sha512-ZLk5oVP4v/BAdC3FuBuyB0xpnkZStblIajiyo/kpp/7mq3YbABhOxTCUJGDozISbkaZlIZFXjqvHHnIS42tssw== -"@swc/core-android-arm64@1.2.164": - version "1.2.164" - resolved "https://registry.yarnpkg.com/@swc/core-android-arm64/-/core-android-arm64-1.2.164.tgz#8a1542788c37f0c0f7ccae78338276c735ebc560" - integrity sha512-nAl9QFzA94ESL+UL+UvPywuEjHIADHBCurIVOHMg4XIrgNQwRlbi7RQDKtLyhsTSmZoGoP4bGt5dRnKEyiSzNg== +"@swc/core-darwin-x64@1.3.20": + version "1.3.20" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.20.tgz#8f8fe3562da7472be87346ae4a6c1919705b5b9b" + integrity sha512-yM11/3n8PwougalAi9eWkz1r5QRDAg1qdXMSCn7sWlVGr0RvdPL20viKddm38yn+X3FzZzgdoajh7NGfEeqCIQ== -"@swc/core-darwin-arm64@1.2.164": - version "1.2.164" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.2.164.tgz#dc005f9ad96418d9aed8258b4c4e0932b665a488" - integrity sha512-OOsZybjAqcvsV/foB0K3RN6SEDJPb9UEJAYtKGeL1sae1vDq4JyuUhgWhGNmLJy4W1yeMCaDXLFSa9c/YN9pEg== +"@swc/core-linux-arm-gnueabihf@1.3.20": + version "1.3.20" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.20.tgz#3fa68f374f04e9331b3aa7ba1cdc4d59a1cb9cd8" + integrity sha512-Y8YX7Ma7/xdvCR+hwqhU2lNKF7Qevlx3qZ+eGEpz2fP6k5iu8C5arUBjFWdC2OTY11OuD00TH43TgYfbWpU/Sw== -"@swc/core-darwin-x64@1.2.164": - version "1.2.164" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.2.164.tgz#dafff10f4850b2251c3786292665ce917954f8e2" - integrity sha512-nKh3qoM4V60NruuY+GZgVwS7aGOjRxovakT84L3ELVCoa1Z/1qnLy5Lq3b1wW+PICxCjapqFGQAu3TQ8IRUNEg== +"@swc/core-linux-arm64-gnu@1.3.20": + version "1.3.20" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.20.tgz#998adffd8d21b63ce6b447cbcc3fa1fae0c2c5d1" + integrity sha512-XCjQj4zo2T4QIqxVgzXkKxTLw4adqMgFG2iXBRRu1kOZXJor7Yzc0wH0B4rGtlkcZnh57MBbo+N1TNzH1leSFw== -"@swc/core-freebsd-x64@1.2.164": - version "1.2.164" - resolved "https://registry.yarnpkg.com/@swc/core-freebsd-x64/-/core-freebsd-x64-1.2.164.tgz#4be6a52f43022df409d964ae2f920e0eeb8f3955" - integrity sha512-yawmWGxFmFHMXc40ojmN4yXNXdNBGiauf1ZgF8VQK1Zqn+hcUaSIpNGJ4V9cDX97QKMmTJSEoeUbPGR5cIqEzQ== +"@swc/core-linux-arm64-musl@1.3.20": + version "1.3.20" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.20.tgz#cb22719d615cd42ab9d89192ead228b2be983238" + integrity sha512-f+fIixoNNaDjmHX0kJn8Lm1Z+CJPHqcYocGaPrXETRAv+8F3Q0rUtxO9FhDKtsG4pI6HRLmS5nBQtBBJWOmfvw== -"@swc/core-linux-arm-gnueabihf@1.2.164": - version "1.2.164" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.2.164.tgz#a6dac7f9654bdf863cdcc3143dc2abfb8faffeea" - integrity sha512-8U85zH0hIbgqFe/71ocDatvCLDzIv/GIIzcuuoTFsdPCDDUzxRjmyZqQfVdwqrbk/j4MiV+iSFnM86VQYs1fRQ== +"@swc/core-linux-x64-gnu@1.3.20": + version "1.3.20" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.20.tgz#0090804c384ea343f8a39bbeee7a46d93cada714" + integrity sha512-F5TKwsZh3F7CzfYoTAiNwhZazQ02NCgFZSqSwO4lOYbT7RU+zXI3OfLoi2R8f0dzfqh26QSdeeMFPdMb3LpzXg== -"@swc/core-linux-arm64-gnu@1.2.164": - version "1.2.164" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.2.164.tgz#26684021f8f2d974045ce29b3f4e17e441f6e964" - integrity sha512-NT3IuJGstGnAbBXxE2O2LrMlVUDUFVyybXoklNSL811Y1g6HPPbnGl+by1iEFyMHxSPnn5d6R5dvpvezMwBUDA== +"@swc/core-linux-x64-musl@1.3.20": + version "1.3.20" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.20.tgz#64ed5e489f0bcde67aae973bca5eb94ab16fa8d8" + integrity sha512-svbrCeaWU2N9saeg5yKZ2aQh+eYE6vW7y+ptZHgLIriuhnelg38mNqNjKK9emhshUNqOPLFJbW8kA1P+jOyyLw== -"@swc/core-linux-arm64-musl@1.2.164": - version "1.2.164" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.2.164.tgz#88731dfa9d61162710849383d0cd24f6a2e97335" - integrity sha512-L/he+XSa1oQ7V95kbjrcmef8fxTZFA6RMj9bbGk62Nj/kQFOyUpXKVvWD+kQkLxqPeN9s7OV6fCyBwRly2SpNQ== +"@swc/core-win32-arm64-msvc@1.3.20": + version "1.3.20" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.20.tgz#1a0c27cca7a43932fd123d699e67741f9cc73129" + integrity sha512-rFrC8JtVlnyfj5wTAIMvNWqPv0KXUA8/TmEKUlg7jgF/IweFPOFvF509tiAstz16Ui2JKL9xaA566/I+XLd+og== -"@swc/core-linux-x64-gnu@1.2.164": - version "1.2.164" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.2.164.tgz#bbe19048a58a5f639fccec47fde26c79d154b476" - integrity sha512-FiNan0A3zkgpMqhWMUvJ1QmpJlpPwkQ4OhERgyos1ZiTnF8PuTcN4kUqV0Pc4mrX5bfSeHRbrYr4owa2PjHv8w== +"@swc/core-win32-ia32-msvc@1.3.20": + version "1.3.20" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.20.tgz#7873119494214fdc079be4aba17e7851261833e7" + integrity sha512-xIkBDw0Rd0G0SQ/g9FOUqrcmwcq/Iy7ScBQVV/NzziIGIUlrj9l4nYe3VyoMEH2lwAcyGo9AxwiNB0vq6vDjiQ== -"@swc/core-linux-x64-musl@1.2.164": - version "1.2.164" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.2.164.tgz#dfbf220f3552e0d10a59c2aaad24a299145d3f11" - integrity sha512-yN8GLowpJAlKFnxfVEOEwHIVK3wC587Hyo+MwYx8dDDaQS/n4GQ9XyHjbEDVyf2thGtr3C+2umozi19AgbIs5g== - -"@swc/core-win32-arm64-msvc@1.2.164": - version "1.2.164" - resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.2.164.tgz#4164831f8af2da39461d2374bc784667f188d96a" - integrity sha512-Hdt+Q2kAPNjLfVj+xHbtjDNJjQNtktb3s+CrGhYkz9iW6w3qb7wO8i18yu6gUVH6HgVYuyDK56oRxOX7T7iP8w== - -"@swc/core-win32-ia32-msvc@1.2.164": - version "1.2.164" - resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.2.164.tgz#f647cc5de26e5eef464325a145b9a37044813f4d" - integrity sha512-+nNJMnFNQBUPoA3Zu/v9pBn1ZD13b0vHLrPhg6qDAkXCZJJYpr6jUvEcED4F/9sjQs3S+JrH47S6DtkuBn+TzQ== - -"@swc/core-win32-x64-msvc@1.2.164": - version "1.2.164" - resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.2.164.tgz#e5268d50d300fc863f2d7c146b8d41d338bf7ac9" - integrity sha512-qoE7VNS5Fo6BrmSCtVumrp0v86xoQtHIgCymymjF7C/DQ/lbVDdZ7kSREMnJD2OujKstsJmfiJiRdQcpEJKoAw== +"@swc/core-win32-x64-msvc@1.3.20": + version "1.3.20" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.20.tgz#21b03ea39ea3e2af1a88fa35c0e7ae49adc89d87" + integrity sha512-1/vxiNasPvpCnVdMxGXEXYhRI65l7yNg/AQ9fYLQn3O5ouWJcd60+6ZoeVrnR5i/R87Fyu/A9fMhOJuOKLHXmA== "@swc/core@^1.2.161": - version "1.2.164" - resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.2.164.tgz#158f49cf262357cdbae590a14c7a690b89e6e22a" - integrity sha512-vw+jzMIVNzSK+lURMH3kANNRLPGROMvw3NpNm9vbtyjgKz9k/qf5ULCq96mayTPB5yXa9bWGBvzvhy6PtsKtqA== + version "1.3.20" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.3.20.tgz#1a290a3020cc272ea57f784e7d7669733b25eda2" + integrity sha512-wSuy5mFTbAPYGlo1DGWkTbXwUubpyYxY2Sf10Y861c4EPtwK7D1nbj35Zg0bsIQvcFG5Y2Q4sXNV5QpsnT0+1A== optionalDependencies: - "@swc/core-android-arm-eabi" "1.2.164" - "@swc/core-android-arm64" "1.2.164" - "@swc/core-darwin-arm64" "1.2.164" - "@swc/core-darwin-x64" "1.2.164" - "@swc/core-freebsd-x64" "1.2.164" - "@swc/core-linux-arm-gnueabihf" "1.2.164" - "@swc/core-linux-arm64-gnu" "1.2.164" - "@swc/core-linux-arm64-musl" "1.2.164" - "@swc/core-linux-x64-gnu" "1.2.164" - "@swc/core-linux-x64-musl" "1.2.164" - "@swc/core-win32-arm64-msvc" "1.2.164" - "@swc/core-win32-ia32-msvc" "1.2.164" - "@swc/core-win32-x64-msvc" "1.2.164" + "@swc/core-darwin-arm64" "1.3.20" + "@swc/core-darwin-x64" "1.3.20" + "@swc/core-linux-arm-gnueabihf" "1.3.20" + "@swc/core-linux-arm64-gnu" "1.3.20" + "@swc/core-linux-arm64-musl" "1.3.20" + "@swc/core-linux-x64-gnu" "1.3.20" + "@swc/core-linux-x64-musl" "1.3.20" + "@swc/core-win32-arm64-msvc" "1.3.20" + "@swc/core-win32-ia32-msvc" "1.3.20" + "@swc/core-win32-x64-msvc" "1.3.20" "@swc/helpers@^0.3.8": - version "0.3.8" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.3.8.tgz#5b9ecf4ee480ca00f1ffbc2d1a5d4eed0d1afe81" - integrity sha512-aWItSZvJj4+GI6FWkjZR13xPNPctq2RRakzo+O6vN7bC2yjwdg5EFpgaSAUn95b7BGSgcflvzVDPoKmJv24IOg== + version "0.3.17" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.3.17.tgz#7c1b91f43c77e2bba99492162a498d465ef253d5" + integrity sha512-tb7Iu+oZ+zWJZ3HJqwx8oNwSDIU440hmVMDPhpACWQWnrZHK99Bxs70gT1L2dnr5Hg50ZRWEFkQCAnOVVV0z1Q== + dependencies: + tslib "^2.4.0" "@swc/jest@^0.2.20": - version "0.2.20" - resolved "https://registry.yarnpkg.com/@swc/jest/-/jest-0.2.20.tgz#2bddb4348fb730296b86cdcd96748be131b11395" - integrity sha512-5qSUBYY1wyIMn7p0Vl9qqV4hMI69oJwZCIPUpBsTFWN2wlwn6RDugzdgCn+bLXVYh+Cxi8bJcZ1uumDgsoL+FA== + version "0.2.23" + resolved "https://registry.yarnpkg.com/@swc/jest/-/jest-0.2.23.tgz#0b7499d5927faaa090c5b7a4a0e35122968fef30" + integrity sha512-ZLj17XjHbPtNsgqjm83qizENw05emLkKGu3WuPUttcy9hkngl0/kcc7fDbcSBpADS0GUtsO+iKPjZFWVAtJSlA== dependencies: "@jest/create-cache-key-function" "^27.4.2" + jsonc-parser "^3.2.0" "@tanstack/react-table@^8.5.15": - version "8.5.15" - resolved "https://registry.yarnpkg.com/@tanstack/react-table/-/react-table-8.5.15.tgz#8179d24d7fdf909799a517e8897501c44e51284d" - integrity sha512-9rSvhIFeMpfXksFgQNTWnVoJbkae/U8CkHnHYGWAIB/O0Ca51IKap0Rjp5WkIUVBWxJ7Wfl2y13oY+aWcyM6Rg== + version "8.7.0" + resolved "https://registry.yarnpkg.com/@tanstack/react-table/-/react-table-8.7.0.tgz#853fae74db6bf49738d0f18e4d507b00262fc09c" + integrity sha512-VJ+9rsymDLaSU35rWOfX0bwNXnpW1i+T14wi+sHx8lxwAsfg6IY1Yw7FPfGADvUFP5eQn2t4nlohAJd+IoEj/Q== dependencies: - "@tanstack/table-core" "8.5.15" + "@tanstack/table-core" "8.7.0" -"@tanstack/table-core@8.5.15": - version "8.5.15" - resolved "https://registry.yarnpkg.com/@tanstack/table-core/-/table-core-8.5.15.tgz#e1e674135cd6c36f29a1562a2b846f824861149b" - integrity sha512-k+BcCOAYD610Cij6p1BPyEqjMQjZIdAnVDoIUKVnA/tfHbF4JlDP7pKAftXPBxyyX5Z1yQPurPnOdEY007Snyg== +"@tanstack/table-core@8.7.0": + version "8.7.0" + resolved "https://registry.yarnpkg.com/@tanstack/table-core/-/table-core-8.7.0.tgz#046e376cd536cd53727a91a880345f92d3ec5859" + integrity sha512-DRiRbOAmDHapzUBd4/C4Yy+FTug4fdGp5sdZWWfCq4wxRoaXQraQgbzmK23a3QcbwLFtLeNezPkZrqbJWuX+VA== "@testing-library/dom@^8.5.0": - version "8.13.0" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.13.0.tgz#bc00bdd64c7d8b40841e27a70211399ad3af46f5" - integrity sha512-9VHgfIatKNXQNaZTtLnalIy0jNZzY35a4S3oi08YAt9Hv1VsfZ/DfA45lM8D/UhtHBGJ4/lGwp0PZkVndRkoOQ== + version "8.19.0" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.19.0.tgz#bd3f83c217ebac16694329e413d9ad5fdcfd785f" + integrity sha512-6YWYPPpxG3e/xOo6HIWwB/58HukkwIVTOaZ0VwdMVjhRUX/01E4FtQbck9GazOOj7MXHc5RBzMrU86iBJHbI+A== dependencies: "@babel/code-frame" "^7.10.4" "@babel/runtime" "^7.12.5" @@ -2730,33 +2833,33 @@ pretty-format "^27.0.2" "@testing-library/jest-dom@^5.16.4": - version "5.16.4" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.16.4.tgz#938302d7b8b483963a3ae821f1c0808f872245cd" - integrity sha512-Gy+IoFutbMQcky0k+bqqumXZ1cTGswLsFqmNLzNdSKkU9KGV2u9oXhukCbbJ9/LRPKiqwxEE8VpV/+YZlfkPUA== + version "5.16.5" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.16.5.tgz#3912846af19a29b2dbf32a6ae9c31ef52580074e" + integrity sha512-N5ixQ2qKpi5OLYfwQmUb/5mSV9LneAcaUfp32pn4yCnpb8r/Yz0pXFPck21dIicKmi+ta5WRAknkZCfA8refMA== dependencies: + "@adobe/css-tools" "^4.0.1" "@babel/runtime" "^7.9.2" "@types/testing-library__jest-dom" "^5.9.1" aria-query "^5.0.0" chalk "^3.0.0" - css "^3.0.0" css.escape "^1.5.1" dom-accessibility-api "^0.5.6" lodash "^4.17.15" redent "^3.0.0" "@testing-library/react@^13.0.0": - version "13.1.1" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-13.1.1.tgz#6c1635e25acca8ca5be8ee3b19ad1391681c5846" - integrity sha512-8mirlAa0OKaUvnqnZF6MdAh2tReYA2KtWVw1PKvaF5EcCZqgK5pl8iF+3uW90JdG5Ua2c2c2E2wtLdaug3dsVg== + version "13.4.0" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-13.4.0.tgz#6a31e3bf5951615593ad984e96b9e5e2d9380966" + integrity sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw== dependencies: "@babel/runtime" "^7.12.5" "@testing-library/dom" "^8.5.0" "@types/react-dom" "^18.0.0" "@testing-library/user-event@^14.0.4": - version "14.0.4" - resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-14.0.4.tgz#5b430a9c27f25078bff4471661b755115d0db9d4" - integrity sha512-VBZe5lcUsmrQyOwIFvqOxLBoaTw1/Qy4Ek+VgmFYs719bs2SxUp42vbsb7ATlQDkHdj4OIQlucfpwxe5WoG1jA== + version "14.4.3" + resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-14.4.3.tgz#af975e367743fa91989cd666666aec31a8f50591" + integrity sha512-kCUc5MEwaEMakkO5x7aoD+DLi02ehmEM2QCGWvNqAS1dV/fAvORWEjnjsEIvml59M7Y5kCkWN6fCCyPOe8OL6Q== "@tinymce/tinymce-react@^3": version "3.14.0" @@ -2777,24 +2880,24 @@ integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== "@tsconfig/node10@^1.0.7": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" - integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg== + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== "@tsconfig/node12@^1.0.7": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c" - integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw== + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== "@tsconfig/node14@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2" - integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg== + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== "@tsconfig/node16@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e" - integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" + integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== "@types/aria-query@^4.2.0": version "4.2.2" @@ -2802,9 +2905,9 @@ integrity sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig== "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": - version "7.1.19" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460" - integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw== + version "7.1.20" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.20.tgz#e168cdd612c92a2d335029ed62ac94c95b362359" + integrity sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -2813,24 +2916,24 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.2.tgz#f3d71178e187858f7c45e30380f8f1b7415a12d8" - integrity sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ== + version "7.6.4" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" + integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.0.tgz#0c888dd70b3ee9eebb6e4f200e809da0076262be" - integrity sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A== + version "7.4.1" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.11.0.tgz#b9a1efa635201ba9bc850323a8793ee2d36c04a0" - integrity sha512-kSjgDMZONiIfSH1Nxcr5JIRMwUetDki63FSQfpTCz8ogF3Ulqm8+mr5f78dUYs6vMiB6gBusQqfQmBvHZj/lwg== + version "7.18.3" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.3.tgz#dfc508a85781e5698d5b33443416b6268c4b3e8d" + integrity sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w== dependencies: "@babel/types" "^7.3.0" @@ -2872,59 +2975,56 @@ "@types/ms" "*" "@types/dompurify@^2.3.3": - version "2.3.3" - resolved "https://registry.yarnpkg.com/@types/dompurify/-/dompurify-2.3.3.tgz#c24c92f698f77ed9cc9d9fa7888f90cf2bfaa23f" - integrity sha512-nnVQSgRVuZ/843oAfhA25eRSNzUFcBPk/LOiw5gm8mD9/X7CNcbRkQu/OsjCewO8+VIYfPxUnXvPEVGenw14+w== + version "2.4.0" + resolved "https://registry.yarnpkg.com/@types/dompurify/-/dompurify-2.4.0.tgz#fd9706392a88e0e0e6d367f3588482d817df0ab9" + integrity sha512-IDBwO5IZhrKvHFUl+clZxgf3hn2b/lU6H1KaBShPkQyGJUQ0xwebezIPSuiyGwfz1UzJWQl4M7BDxtHtCCPlTg== dependencies: "@types/trusted-types" "*" "@types/eslint-scope@^3.7.3": - version "3.7.3" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224" - integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g== + version "3.7.4" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" + integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== dependencies: "@types/eslint" "*" "@types/estree" "*" -"@types/eslint@*": - version "8.4.1" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.1.tgz#c48251553e8759db9e656de3efc846954ac32304" - integrity sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA== +"@types/eslint@*", "@types/eslint@^7.29.0 || ^8.4.1": + version "8.4.10" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.10.tgz#19731b9685c19ed1552da7052b6f668ed7eb64bb" + integrity sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw== dependencies: "@types/estree" "*" "@types/json-schema" "*" -"@types/eslint@^7.28.2": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.29.0.tgz#e56ddc8e542815272720bb0b4ccc2aff9c3e1c78" - integrity sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/estree@*", "@types/estree@^0.0.51": - version "0.0.51" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" - integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== +"@types/estree@*": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" + integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== "@types/estree@0.0.39": version "0.0.39" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== +"@types/estree@^0.0.51": + version "0.0.51" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" + integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== + "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18": - version "4.17.28" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz#c47def9f34ec81dc6328d0b1b5303d1ec98d86b8" - integrity sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig== + version "4.17.31" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz#a1139efeab4e7323834bb0226e62ac019f474b2f" + integrity sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q== dependencies: "@types/node" "*" "@types/qs" "*" "@types/range-parser" "*" "@types/express@*", "@types/express@^4.17.13": - version "4.17.13" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" - integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== + version "4.17.14" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.14.tgz#143ea0557249bc1b3b54f15db4c81c3d4eb3569c" + integrity sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg== dependencies: "@types/body-parser" "*" "@types/express-serve-static-core" "^4.17.18" @@ -2950,7 +3050,7 @@ dependencies: "@types/unist" "*" -"@types/history@*", "@types/history@^4.7.11": +"@types/history@^4.7.11": version "4.7.11" resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.11.tgz#56588b17ae8f50c53983a524fc3cc47437969d64" integrity sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA== @@ -2969,9 +3069,9 @@ integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== "@types/http-proxy@^1.17.8": - version "1.17.8" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.8.tgz#968c66903e7e42b483608030ee85800f22d03f55" - integrity sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA== + version "1.17.9" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.9.tgz#7f0e7931343761efde1e2bf48c40f02f3f75705a" + integrity sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw== dependencies: "@types/node" "*" @@ -2994,10 +3094,18 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@*", "@types/jest@^27.4.1": - version "27.4.1" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.4.1.tgz#185cbe2926eaaf9662d340cc02e548ce9e11ab6d" - integrity sha512-23iPJADSmicDVrWk+HT58LMJtzLAnB2AgIzplQuq/bSrGaxCrlvRFjGbXmamnnk/mAmCdLStiGqggu28ocUyiw== +"@types/jest@*": + version "29.2.3" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.2.3.tgz#f5fd88e43e5a9e4221ca361e23790d48fcf0a211" + integrity sha512-6XwoEbmatfyoCjWRX7z0fKMmgYKe9+/HrviJ5k0X/tjJWHGAezZOfYaxqQKuzG/TvQyr+ktjm4jgbk0s4/oF2w== + dependencies: + expect "^29.0.0" + pretty-format "^29.0.0" + +"@types/jest@^27.4.1": + version "27.5.2" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.5.2.tgz#ec49d29d926500ffb9fd22b84262e862049c026c" + integrity sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA== dependencies: jest-matcher-utils "^27.0.0" pretty-format "^27.0.0" @@ -3017,7 +3125,7 @@ "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== "@types/lodash-es@^4.17.6": version "4.17.6" @@ -3027,9 +3135,9 @@ "@types/lodash" "*" "@types/lodash@*", "@types/lodash@^4.14.175": - version "4.14.182" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.182.tgz#05301a4d5e62963227eaafe0ce04dd77c54ea5c2" - integrity sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q== + version "4.14.190" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.190.tgz#d8e99647af141c63902d0ca53cf2b34d2df33545" + integrity sha512-5iJ3FBJBvQHQ8sFhEhJfjUP+G+LalhavTkYyrAYqz5MEJG+erSv0k9KJLb6q7++17Lafk1scaTIFXcMJlwK8Mw== "@types/long@^4.0.1": version "4.0.2" @@ -3043,15 +3151,10 @@ dependencies: "@types/unist" "*" -"@types/mdurl@^1.0.0": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-1.0.2.tgz#e2ce9d83a613bacf284c7be7d491945e39e1f8e9" - integrity sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA== - -"@types/mime@^1": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" - integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== +"@types/mime@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" + integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== "@types/ms@*": version "0.7.31" @@ -3059,14 +3162,14 @@ integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== "@types/node@*", "@types/node@>=12.12.47", "@types/node@>=13.7.0": - version "18.0.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.0.tgz#67c7b724e1bcdd7a8821ce0d5ee184d3b4dd525a" - integrity sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA== + version "18.11.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.9.tgz#02d013de7058cea16d36168ef2fc653464cfbad4" + integrity sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg== "@types/node@^17.0.23": - version "17.0.26" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.26.tgz#1bbff9b23ee5a64f87b4f30c0c854b112ee2e635" - integrity sha512-z/FG/6DUO7pnze3AE3TBGIjGGKkvCcGcWINe1C7cADY8hKLJPDYpzsNE37uExQ4md5RFtTCvg+M8Mu1Enyeg2A== + version "17.0.45" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" + integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== "@types/parse-json@^4.0.0": version "4.0.0" @@ -3079,9 +3182,9 @@ integrity sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g== "@types/prettier@^2.1.5": - version "2.4.4" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.4.tgz#5d9b63132df54d8909fce1c3f8ca260fdd693e17" - integrity sha512-ReVR2rLTV1kvtlWFyuot+d1pkpG2Fw/XKE3PDAdj57rbM97ttSp9JZ2UsP+2EHTylra9cUf6JA7tGwW1INzUrA== + version "2.7.1" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.1.tgz#dfd20e2dc35f027cdd6c1908e80a5ddc7499670e" + integrity sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow== "@types/prismjs@^1.0.0": version "1.26.0" @@ -3094,9 +3197,9 @@ integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== "@types/q@^1.5.1": - version "1.5.4" - resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24" - integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug== + version "1.5.5" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.5.tgz#75a2a8e7d8ab4b230414505d92335d1dcb53a6df" + integrity sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ== "@types/qs@*": version "6.9.7" @@ -3129,10 +3232,10 @@ dependencies: react-div-100vh "*" -"@types/react-dom@^18.0.0": - version "18.0.0" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.0.tgz#b13f8d098e4b0c45df4f1ed123833143b0c71141" - integrity sha512-49897Y0UiCGmxZqpC8Blrf6meL8QUla6eb+BBhn69dTXlmuOlzkfr7HHY/O8J25e1lTUMs+YYxSlVDAaGHCOLg== +"@types/react-dom@^18.0.0", "@types/react-dom@^18.0.9": + version "18.0.9" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.9.tgz#ffee5e4bfc2a2f8774b15496474f8e7fe8d0b504" + integrity sha512-qnVvHxASt/H7i+XG1U1xMiY5t+IHcPGUK7TDMDzom08xa7e86eCeKOiLZezwCKVxJn6NEiiy2ekgX8aQssjIKg== dependencies: "@types/react" "*" @@ -3172,24 +3275,24 @@ "@types/react-router-dom" "*" "@types/react-router@*": - version "5.1.16" - resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.16.tgz#f3ba045fb96634e38b21531c482f9aeb37608a99" - integrity sha512-8d7nR/fNSqlTFGHti0R3F9WwIertOaaA1UEB8/jr5l5mDMOs4CidEgvvYMw4ivqrBK+vtVLxyTj2P+Pr/dtgzg== + version "5.1.19" + resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.19.tgz#9b404246fba7f91474d7008a3d48c17b6e075ad6" + integrity sha512-Fv/5kb2STAEMT3wHzdKQK2z8xKq38EDIGVrutYLmQVVLe+4orDFquU52hQrULnEHinMKv9FSA6lf9+uNT1ITtA== dependencies: - "@types/history" "*" + "@types/history" "^4.7.11" "@types/react" "*" -"@types/react-transition-group@^4.4.4", "@types/react-transition-group@^4.4.5": +"@types/react-transition-group@^4.4.5": version "4.4.5" resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.5.tgz#aae20dcf773c5aa275d5b9f7cdbca638abc5e416" integrity sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA== dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^18", "@types/react@^18.0.5": - version "18.0.5" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.5.tgz#1a4d4b705ae6af5aed369dec22800b20f89f5301" - integrity sha512-UPxNGInDCIKlfqBrm8LDXYWNfLHwIdisWcsH5GpMyGjhEDLFgTtlRBaoWuCua9HcyuE0rMkmAeZ3FXV1pYLIYQ== +"@types/react@*", "@types/react@^18", "@types/react@^18.0.25": + version "18.0.25" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.25.tgz#8b1dcd7e56fe7315535a4af25435e0bb55c8ae44" + integrity sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -3202,10 +3305,10 @@ dependencies: "@types/node" "*" -"@types/retry@^0.12.0": - version "0.12.1" - resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.1.tgz#d8f1c0d0dc23afad6dc16a9e993a0865774b4065" - integrity sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g== +"@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== "@types/scheduler@*": version "0.16.2" @@ -3217,6 +3320,11 @@ resolved "https://registry.yarnpkg.com/@types/seedrandom/-/seedrandom-3.0.2.tgz#7f30db28221067a90b02e73ffd46b6685b18df1a" integrity sha512-YPLqEOo0/X8JU3rdiq+RgUKtQhQtrppE766y7vMTu8dGML7TVtZNiiiaC/hhU9Zqw9UYopXxhuWWENclMVBwKQ== +"@types/semver@^7.3.12": + version "7.3.13" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" + integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== + "@types/serve-index@^1.9.1": version "1.9.1" resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278" @@ -3224,12 +3332,12 @@ dependencies: "@types/express" "*" -"@types/serve-static@*": - version "1.13.10" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9" - integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ== +"@types/serve-static@*", "@types/serve-static@^1.13.10": + version "1.15.0" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.0.tgz#c7930ff61afb334e121a9da780aac0d9b8f34155" + integrity sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg== dependencies: - "@types/mime" "^1" + "@types/mime" "*" "@types/node" "*" "@types/sockjs@^0.3.33": @@ -3240,14 +3348,14 @@ "@types/node" "*" "@types/stack-utils@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.0.tgz#7036640b4e21cc2f259ae826ce843d277dad8cff" - integrity sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw== + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== "@types/testing-library__jest-dom@^5.9.1": - version "5.14.1" - resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.1.tgz#014162a5cee6571819d48e999980694e2f657c3c" - integrity sha512-Gk9vaXfbzc5zCXI9eYE9BI5BNHEp4D3FWjgqBE/ePGYElLAP+KvxBcsdkwfIVvezs605oiyd/VrpiHe3Oeg+Aw== + version "5.14.5" + resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.5.tgz#d113709c90b3c75fdb127ec338dad7d5f86c974f" + integrity sha512-SBwbxYoyPIvxHbeHxTZX2Pe/74F/tX2/D3mMvzabdeJ25bBojfW0TyB8BHrbq/9zaaKICJZjLP+8r6AeZMFCuQ== dependencies: "@types/jest" "*" @@ -3281,129 +3389,133 @@ "@types/yargs-parser" "*" "@types/yargs@^17.0.8": - version "17.0.10" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.10.tgz#591522fce85d8739bca7b8bb90d048e4478d186a" - integrity sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA== + version "17.0.15" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.15.tgz#5b62c89fb049e2fc8378394a2861a593055f0866" + integrity sha512-ZHc4W2dnEQPfhn06TBEdWaiUHEZAocYaiVMfwOipY5jcJt/251wVrKCBWBetGZWO5CF8tdb7L3DmdxVlZ2BOIg== dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^5.5.0": - version "5.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.18.0.tgz#950df411cec65f90d75d6320a03b2c98f6c3af7d" - integrity sha512-tzrmdGMJI/uii9/V6lurMo4/o+dMTKDH82LkNjhJ3adCW22YQydoRs5MwTiqxGF9CSYxPxQ7EYb4jLNlIs+E+A== +"@typescript-eslint/eslint-plugin@^5.45.0", "@typescript-eslint/eslint-plugin@^5.5.0": + version "5.45.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.45.0.tgz#ffa505cf961d4844d38cfa19dcec4973a6039e41" + integrity sha512-CXXHNlf0oL+Yg021cxgOdMHNTXD17rHkq7iW6RFHoybdFgQBjU3yIXhhcPpGwr1CjZlo6ET8C6tzX5juQoXeGA== dependencies: - "@typescript-eslint/scope-manager" "5.18.0" - "@typescript-eslint/type-utils" "5.18.0" - "@typescript-eslint/utils" "5.18.0" - debug "^4.3.2" - functional-red-black-tree "^1.0.1" - ignore "^5.1.8" + "@typescript-eslint/scope-manager" "5.45.0" + "@typescript-eslint/type-utils" "5.45.0" + "@typescript-eslint/utils" "5.45.0" + debug "^4.3.4" + ignore "^5.2.0" + natural-compare-lite "^1.4.0" regexpp "^3.2.0" - semver "^7.3.5" + semver "^7.3.7" tsutils "^3.21.0" "@typescript-eslint/experimental-utils@^5.0.0": - version "5.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.18.0.tgz#a6b5662e6b0452cb0e75a13662ce3b33cd1be59d" - integrity sha512-hypiw5N0aM2aH91/uMmG7RpyUH3PN/iOhilMwkMFZIbm/Bn/G3ZnbaYdSoAN4PG/XHQjdhBYLi0ZoRZsRYT4hA== + version "5.45.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.45.0.tgz#b59fea61a855cb2b1fdbd0fb45934a844f4bf870" + integrity sha512-DnRQg5+3uHHt/gaifTjwg9OKbg9/TWehfJzYHQIDJboPEbF897BKDE/qoqMhW7nf0jWRV1mwVXTaUvtB1/9Gwg== dependencies: - "@typescript-eslint/utils" "5.18.0" + "@typescript-eslint/utils" "5.45.0" -"@typescript-eslint/parser@^5.18.0", "@typescript-eslint/parser@^5.5.0": - version "5.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.18.0.tgz#2bcd4ff21df33621df33e942ccb21cb897f004c6" - integrity sha512-+08nYfurBzSSPndngnHvFw/fniWYJ5ymOrn/63oMIbgomVQOvIDhBoJmYZ9lwQOCnQV9xHGvf88ze3jFGUYooQ== +"@typescript-eslint/parser@^5.45.0", "@typescript-eslint/parser@^5.5.0": + version "5.45.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.45.0.tgz#b18a5f6b3cf1c2b3e399e9d2df4be40d6b0ddd0e" + integrity sha512-brvs/WSM4fKUmF5Ot/gEve6qYiCMjm6w4HkHPfS6ZNmxTS0m0iNN4yOChImaCkqc1hRwFGqUyanMXuGal6oyyQ== dependencies: - "@typescript-eslint/scope-manager" "5.18.0" - "@typescript-eslint/types" "5.18.0" - "@typescript-eslint/typescript-estree" "5.18.0" - debug "^4.3.2" + "@typescript-eslint/scope-manager" "5.45.0" + "@typescript-eslint/types" "5.45.0" + "@typescript-eslint/typescript-estree" "5.45.0" + debug "^4.3.4" -"@typescript-eslint/scope-manager@5.18.0": - version "5.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.18.0.tgz#a7d7b49b973ba8cebf2a3710eefd457ef2fb5505" - integrity sha512-C0CZML6NyRDj+ZbMqh9FnPscg2PrzSaVQg3IpTmpe0NURMVBXlghGZgMYqBw07YW73i0MCqSDqv2SbywnCS8jQ== +"@typescript-eslint/scope-manager@5.45.0": + version "5.45.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.45.0.tgz#7a4ac1bfa9544bff3f620ab85947945938319a96" + integrity sha512-noDMjr87Arp/PuVrtvN3dXiJstQR1+XlQ4R1EvzG+NMgXi8CuMCXpb8JqNtFHKceVSQ985BZhfRdowJzbv4yKw== dependencies: - "@typescript-eslint/types" "5.18.0" - "@typescript-eslint/visitor-keys" "5.18.0" + "@typescript-eslint/types" "5.45.0" + "@typescript-eslint/visitor-keys" "5.45.0" -"@typescript-eslint/type-utils@5.18.0": - version "5.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.18.0.tgz#62dbfc8478abf36ba94a90ddf10be3cc8e471c74" - integrity sha512-vcn9/6J5D6jtHxpEJrgK8FhaM8r6J1/ZiNu70ZUJN554Y3D9t3iovi6u7JF8l/e7FcBIxeuTEidZDR70UuCIfA== +"@typescript-eslint/type-utils@5.45.0": + version "5.45.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.45.0.tgz#aefbc954c40878fcebeabfb77d20d84a3da3a8b2" + integrity sha512-DY7BXVFSIGRGFZ574hTEyLPRiQIvI/9oGcN8t1A7f6zIs6ftbrU0nhyV26ZW//6f85avkwrLag424n+fkuoJ1Q== dependencies: - "@typescript-eslint/utils" "5.18.0" - debug "^4.3.2" + "@typescript-eslint/typescript-estree" "5.45.0" + "@typescript-eslint/utils" "5.45.0" + debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.18.0": - version "5.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.18.0.tgz#4f0425d85fdb863071680983853c59a62ce9566e" - integrity sha512-bhV1+XjM+9bHMTmXi46p1Led5NP6iqQcsOxgx7fvk6gGiV48c6IynY0apQb7693twJDsXiVzNXTflhplmaiJaw== +"@typescript-eslint/types@5.45.0": + version "5.45.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.45.0.tgz#794760b9037ee4154c09549ef5a96599621109c5" + integrity sha512-QQij+u/vgskA66azc9dCmx+rev79PzX8uDHpsqSjEFtfF2gBUTRCpvYMh2gw2ghkJabNkPlSUCimsyBEQZd1DA== -"@typescript-eslint/typescript-estree@5.18.0": - version "5.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.18.0.tgz#6498e5ee69a32e82b6e18689e2f72e4060986474" - integrity sha512-wa+2VAhOPpZs1bVij9e5gyVu60ReMi/KuOx4LKjGx2Y3XTNUDJgQ+5f77D49pHtqef/klglf+mibuHs9TrPxdQ== +"@typescript-eslint/typescript-estree@5.45.0": + version "5.45.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.45.0.tgz#f70a0d646d7f38c0dfd6936a5e171a77f1e5291d" + integrity sha512-maRhLGSzqUpFcZgXxg1qc/+H0bT36lHK4APhp0AEUVrpSwXiRAomm/JGjSG+kNUio5kAa3uekCYu/47cnGn5EQ== dependencies: - "@typescript-eslint/types" "5.18.0" - "@typescript-eslint/visitor-keys" "5.18.0" - debug "^4.3.2" - globby "^11.0.4" + "@typescript-eslint/types" "5.45.0" + "@typescript-eslint/visitor-keys" "5.45.0" + debug "^4.3.4" + globby "^11.1.0" is-glob "^4.0.3" - semver "^7.3.5" + semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.18.0", "@typescript-eslint/utils@^5.13.0": - version "5.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.18.0.tgz#27fc84cf95c1a96def0aae31684cb43a37e76855" - integrity sha512-+hFGWUMMri7OFY26TsOlGa+zgjEy1ssEipxpLjtl4wSll8zy85x0GrUSju/FHdKfVorZPYJLkF3I4XPtnCTewA== +"@typescript-eslint/utils@5.45.0", "@typescript-eslint/utils@^5.13.0": + version "5.45.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.45.0.tgz#9cca2996eee1b8615485a6918a5c763629c7acf5" + integrity sha512-OUg2JvsVI1oIee/SwiejTot2OxwU8a7UfTFMOdlhD2y+Hl6memUSL4s98bpUTo8EpVEr0lmwlU7JSu/p2QpSvA== dependencies: "@types/json-schema" "^7.0.9" - "@typescript-eslint/scope-manager" "5.18.0" - "@typescript-eslint/types" "5.18.0" - "@typescript-eslint/typescript-estree" "5.18.0" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.45.0" + "@typescript-eslint/types" "5.45.0" + "@typescript-eslint/typescript-estree" "5.45.0" eslint-scope "^5.1.1" eslint-utils "^3.0.0" + semver "^7.3.7" -"@typescript-eslint/visitor-keys@5.18.0": - version "5.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.18.0.tgz#c7c07709823804171d569017f3b031ced7253e60" - integrity sha512-Hf+t+dJsjAKpKSkg3EHvbtEpFFb/1CiOHnvI8bjHgOD4/wAw3gKrA0i94LrbekypiZVanJu3McWJg7rWDMzRTg== +"@typescript-eslint/visitor-keys@5.45.0": + version "5.45.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.45.0.tgz#e0d160e9e7fdb7f8da697a5b78e7a14a22a70528" + integrity sha512-jc6Eccbn2RtQPr1s7th6jJWQHBHI6GBVQkCHoJFQ5UreaKm59Vxw+ynQUPPY2u2Amquc+7tmEoC2G52ApsGNNg== dependencies: - "@typescript-eslint/types" "5.18.0" - eslint-visitor-keys "^3.0.0" + "@typescript-eslint/types" "5.45.0" + eslint-visitor-keys "^3.3.0" "@uiw/copy-to-clipboard@~1.0.12": version "1.0.12" resolved "https://registry.yarnpkg.com/@uiw/copy-to-clipboard/-/copy-to-clipboard-1.0.12.tgz#46f563bd6f3007895f95855e5b4bb692c7251933" integrity sha512-3tt7FVSbjtBCNBhffy7k26rpnEmk8GQj9QkTGZBIfpHU7mG3Buryt69u6xooYM7/gmv7GIqD4QxxIauIp2HHKg== -"@uiw/react-markdown-preview@^4.0.10": - version "4.0.11" - resolved "https://registry.yarnpkg.com/@uiw/react-markdown-preview/-/react-markdown-preview-4.0.11.tgz#7c0e0ff6820f5878c378cf87034195eeb02fe00b" - integrity sha512-+vabc1MC/prdaDsrX6dPTx90QtUd63r9R7ZDM/GvCagj+wF7okNop0vxk2HCkU3VjpG7xpDAsQw/A54Pp4IdPg== +"@uiw/react-markdown-preview@^4.1.5": + version "4.1.5" + resolved "https://registry.yarnpkg.com/@uiw/react-markdown-preview/-/react-markdown-preview-4.1.5.tgz#d133f7a90f7c0268871f209d90123f388a620d79" + integrity sha512-CYiwzrarfg/jCsSHSfLkgxpLiqwZjmXhMJmwMa2SCct/PX/vt9wJJ84aNgUVbSjfQFKgmTlSWpDiN+kGnf8D/w== dependencies: "@babel/runtime" "^7.17.2" "@uiw/copy-to-clipboard" "~1.0.12" react-markdown "~8.0.0" rehype-attr "~2.0.7" rehype-autolink-headings "~6.1.1" - rehype-prism-plus "~1.3.2" - rehype-raw "~6.1.1" + rehype-ignore "^1.0.1" + rehype-prism-plus "~1.5.0" + rehype-raw "^6.1.1" rehype-rewrite "~3.0.6" rehype-slug "~5.0.1" remark-gfm "~3.0.1" + unist-util-visit "^4.1.0" "@uiw/react-md-editor@^3.14.1": - version "3.14.1" - resolved "https://registry.yarnpkg.com/@uiw/react-md-editor/-/react-md-editor-3.14.1.tgz#754923f8d0fae025be4986c939d6f0f3ddd1c99e" - integrity sha512-F0BCKXv3bFte/7WwB4CKTM7VzvBNeJj0LjFDExMFUKr72R8+lC+dbZGAa1RlgGwqeSCqkyi5Wv4aqDu5jYEn0w== + version "3.19.7" + resolved "https://registry.yarnpkg.com/@uiw/react-md-editor/-/react-md-editor-3.19.7.tgz#e575c77a011083b806cdd90346f9ebe7a83e08f7" + integrity sha512-mZb8c6aTwq9k6t6xav8zNoD/f6q7w5BmMiixswiDCA7/YWc19Xp+qCtp5C5FQtb4AStxozIRjY1uWK4VQOI/gQ== dependencies: "@babel/runtime" "^7.14.6" - "@uiw/react-markdown-preview" "^4.0.10" + "@uiw/react-markdown-preview" "^4.1.5" rehype "~12.0.1" - rehype-sanitize "~5.0.1" "@webassemblyjs/ast@1.11.1": version "1.11.1" @@ -3537,9 +3649,9 @@ integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== abab@^2.0.3, abab@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" - integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== + version "2.0.6" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: version "1.3.8" @@ -3562,12 +3674,12 @@ acorn-import-assertions@^1.7.6: resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== -acorn-jsx@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" - integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn-node@^1.6.1: +acorn-node@^1.8.2: version "1.8.2" resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== @@ -3591,15 +3703,15 @@ acorn@^7.0.0, acorn@^7.1.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.0: - version "8.7.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" - integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== +acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0: + version "8.8.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" + integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== address@^1.0.1, address@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" - integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== + version "1.2.1" + resolved "https://registry.yarnpkg.com/address/-/address-1.2.1.tgz#25bb61095b7522d65b357baa11bc05492d4c8acd" + integrity sha512-B+6bi5D34+fDYENiH5qOlA0cV2rAGKuWZ9LeyUUehbXy8e0VS9e498yO0Jeeh+iM+6KbfudHTFjXw2MmJD4QRA== adjust-sourcemap-loader@^4.0.0: version "4.0.0" @@ -3654,9 +3766,9 @@ ajv@^6.10.0, ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5, ajv@~6.12.6: uri-js "^4.2.2" ajv@^8.0.0, ajv@^8.6.0, ajv@^8.8.0: - version "8.11.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" - integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== + version "8.11.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.2.tgz#aecb20b50607acf2569b6382167b65a96008bb78" + integrity sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -3664,24 +3776,24 @@ ajv@^8.0.0, ajv@^8.6.0, ajv@^8.8.0: uri-js "^4.2.2" algoliasearch@^4.13.1: - version "4.13.1" - resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.13.1.tgz#54195c41c9e4bd13ed64982248cf49d4576974fe" - integrity sha512-dtHUSE0caWTCE7liE1xaL+19AFf6kWEcyn76uhcitWpntqvicFHXKFoZe5JJcv9whQOTRM6+B8qJz6sFj+rDJA== + version "4.14.2" + resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.14.2.tgz#63f142583bfc3a9bd3cd4a1b098bf6fe58e56f6c" + integrity sha512-ngbEQonGEmf8dyEh5f+uOIihv4176dgbuOZspiuhmTTBRBuzWu3KCGHre6uHj5YyuC7pNvQGzB6ZNJyZi0z+Sg== dependencies: - "@algolia/cache-browser-local-storage" "4.13.1" - "@algolia/cache-common" "4.13.1" - "@algolia/cache-in-memory" "4.13.1" - "@algolia/client-account" "4.13.1" - "@algolia/client-analytics" "4.13.1" - "@algolia/client-common" "4.13.1" - "@algolia/client-personalization" "4.13.1" - "@algolia/client-search" "4.13.1" - "@algolia/logger-common" "4.13.1" - "@algolia/logger-console" "4.13.1" - "@algolia/requester-browser-xhr" "4.13.1" - "@algolia/requester-common" "4.13.1" - "@algolia/requester-node-http" "4.13.1" - "@algolia/transporter" "4.13.1" + "@algolia/cache-browser-local-storage" "4.14.2" + "@algolia/cache-common" "4.14.2" + "@algolia/cache-in-memory" "4.14.2" + "@algolia/client-account" "4.14.2" + "@algolia/client-analytics" "4.14.2" + "@algolia/client-common" "4.14.2" + "@algolia/client-personalization" "4.14.2" + "@algolia/client-search" "4.14.2" + "@algolia/logger-common" "4.14.2" + "@algolia/logger-console" "4.14.2" + "@algolia/requester-browser-xhr" "4.14.2" + "@algolia/requester-common" "4.14.2" + "@algolia/requester-node-http" "4.14.2" + "@algolia/transporter" "4.14.2" anser@^1.4.1: version "1.4.10" @@ -3730,9 +3842,9 @@ ansi-styles@^5.0.0: integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== ansi-styles@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.1.0.tgz#87313c102b8118abd57371afab34618bf7350ed3" - integrity sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ== + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== ansi-to-react@^6.1.6: version "6.1.6" @@ -3743,9 +3855,9 @@ ansi-to-react@^6.1.6: escape-carriage "^1.3.0" anymatch@^3.0.3, anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" @@ -3755,10 +3867,10 @@ arg@^4.1.0: resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== -arg@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.1.tgz#eb0c9a8f77786cad2af8ff2b862899842d7b6adb" - integrity sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA== +arg@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== argparse@^1.0.7: version "1.0.10" @@ -3781,29 +3893,31 @@ aria-query@^4.2.2: "@babel/runtime-corejs3" "^7.10.2" aria-query@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.0.0.tgz#210c21aaf469613ee8c9a62c7f86525e058db52c" - integrity sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg== + version "5.1.3" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" + integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== + dependencies: + deep-equal "^2.0.5" array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== array-flatten@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== -array-includes@^3.1.4: - version "3.1.4" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.4.tgz#f5b493162c760f3539631f005ba2bb46acb45ba9" - integrity sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw== +array-includes@^3.1.4, array-includes@^3.1.5, array-includes@^3.1.6: + version "3.1.6" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" + integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - get-intrinsic "^1.1.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" is-string "^1.0.7" array-move@^3.0.1: @@ -3817,45 +3931,62 @@ array-union@^2.1.0: integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== array.prototype.flat@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz#07e0975d84bbc7c48cd1879d609e682598d33e13" - integrity sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg== + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" + integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" -array.prototype.flatmap@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz#908dc82d8a406930fdf38598d51e7411d18d4446" - integrity sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA== +array.prototype.flatmap@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" + integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - es-abstract "^1.19.0" + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +array.prototype.reduce@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz#6b20b0daa9d9734dd6bc7ea66b5bbce395471eac" + integrity sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-array-method-boxes-properly "^1.0.0" + is-string "^1.0.7" + +array.prototype.tosorted@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz#ccf44738aa2b5ac56578ffda97c03fd3e23dd532" + integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.1.3" asap@~2.0.3, asap@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== ast-types-flow@^0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" - integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= + integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== astral-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -async@^2.6.2: - version "2.6.4" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" - integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== - dependencies: - lodash "^4.17.14" - async@^3.2.3: version "3.2.4" resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" @@ -3864,39 +3995,39 @@ async@^3.2.3: asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== at-least-node@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - attr-accept@^2.0.0: version "2.2.2" resolved "https://registry.yarnpkg.com/attr-accept/-/attr-accept-2.2.2.tgz#646613809660110749e92f2c10833b70968d929b" integrity sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg== -autoprefixer@^10.4.4: - version "10.4.4" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.4.tgz#3e85a245b32da876a893d3ac2ea19f01e7ea5a1e" - integrity sha512-Tm8JxsB286VweiZ5F0anmbyGiNI3v3wGv3mz9W+cxEDYB/6jbnj6GM9H9mK3wIL8ftgl+C07Lcwb8PG5PCCPzA== +autoprefixer@^10.4.13: + version "10.4.13" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.13.tgz#b5136b59930209a321e9fa3dca2e7c4d223e83a8" + integrity sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg== dependencies: - browserslist "^4.20.2" - caniuse-lite "^1.0.30001317" + browserslist "^4.21.4" + caniuse-lite "^1.0.30001426" fraction.js "^4.2.0" normalize-range "^0.1.2" picocolors "^1.0.0" postcss-value-parser "^4.2.0" -axe-core@^4.3.5: - version "4.4.1" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.4.1.tgz#7dbdc25989298f9ad006645cd396782443757413" - integrity sha512-gd1kmb21kwNuWr6BQz8fv6GNECPBnUasepcoLbekws23NVBLODdsClRZ+bQ8+9Uomf3Sm3+Vwn0oYG9NvwnJCw== +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +axe-core@^4.4.3: + version "4.5.2" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.5.2.tgz#823fdf491ff717ac3c58a52631d4206930c1d9f7" + integrity sha512-u2MVsXfew5HBvjsczCv+xlwdNnB1oQR9HlAcsejZttNjKKSkeDNVwB1vMThIUIFI9GoT57Vtk8iQLwqOfAkboA== axobject-query@^2.2.0: version "2.2.0" @@ -3918,22 +4049,15 @@ babel-jest@^27.4.2, babel-jest@^27.5.1: slash "^3.0.0" babel-loader@^8.2.3: - version "8.2.4" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.4.tgz#95f5023c791b2e9e2ca6f67b0984f39c82ff384b" - integrity sha512-8dytA3gcvPPPv4Grjhnt8b5IIiTcq/zeXOPk4iTYI0SVXcsmuGg7JtBRDp8S9X+gJfhQ8ektjXZlDu1Bb33U8A== + version "8.3.0" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.3.0.tgz#124936e841ba4fe8176786d6ff28add1f134d6a8" + integrity sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q== dependencies: find-cache-dir "^3.3.1" loader-utils "^2.0.0" make-dir "^3.1.0" schema-utils "^2.6.5" -babel-plugin-dynamic-import-node@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" - integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== - dependencies: - object.assign "^4.1.0" - babel-plugin-istanbul@^6.1.1: version "6.1.1" resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" @@ -3955,15 +4079,6 @@ babel-plugin-jest-hoist@^27.5.1: "@types/babel__core" "^7.0.0" "@types/babel__traverse" "^7.0.6" -babel-plugin-macros@^2.6.1: - version "2.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138" - integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg== - dependencies: - "@babel/runtime" "^7.7.2" - cosmiconfig "^6.0.0" - resolve "^1.12.0" - babel-plugin-macros@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" @@ -3978,29 +4093,29 @@ babel-plugin-named-asset-import@^0.3.8: resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz#6b7fa43c59229685368683c28bc9734f24524cc2" integrity sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q== -babel-plugin-polyfill-corejs2@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz#440f1b70ccfaabc6b676d196239b138f8a2cfba5" - integrity sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w== +babel-plugin-polyfill-corejs2@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" + integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== dependencies: - "@babel/compat-data" "^7.13.11" - "@babel/helper-define-polyfill-provider" "^0.3.1" + "@babel/compat-data" "^7.17.7" + "@babel/helper-define-polyfill-provider" "^0.3.3" semver "^6.1.1" -babel-plugin-polyfill-corejs3@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz#aabe4b2fa04a6e038b688c5e55d44e78cd3a5f72" - integrity sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ== +babel-plugin-polyfill-corejs3@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz#56ad88237137eade485a71b52f72dbed57c6230a" + integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.1" - core-js-compat "^3.21.0" + "@babel/helper-define-polyfill-provider" "^0.3.3" + core-js-compat "^3.25.1" -babel-plugin-polyfill-regenerator@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz#2c0678ea47c75c8cc2fbb1852278d8fb68233990" - integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A== +babel-plugin-polyfill-regenerator@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz#390f91c38d90473592ed43351e801a9d3e0fd747" + integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.1" + "@babel/helper-define-polyfill-provider" "^0.3.3" babel-plugin-transform-react-remove-prop-types@^0.4.24: version "0.4.24" @@ -4078,12 +4193,12 @@ base64-js@^1.3.1: batch@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" - integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= + integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== bcp-47-match@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/bcp-47-match/-/bcp-47-match-2.0.2.tgz#3323e221eb5b40ddc3b91ed29d847ab459d549c4" - integrity sha512-zy5swVXwQ25ttElhoN9Dgnqm6VFlMkeDNljvHSGqGNr4zClUosdFzxD+fQHJVmx3g3KY+r//wV/fmBHsa1ErnA== + version "2.0.3" + resolved "https://registry.yarnpkg.com/bcp-47-match/-/bcp-47-match-2.0.3.tgz#603226f6e5d3914a581408be33b28a53144b09d0" + integrity sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ== bfj@^7.0.2: version "7.0.2" @@ -4110,36 +4225,38 @@ bluebird@^3.5.5: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -body-parser@1.19.2: - version "1.19.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.2.tgz#4714ccd9c157d44797b8b5607d72c0b89952f26e" - integrity sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw== +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== dependencies: bytes "3.1.2" content-type "~1.0.4" debug "2.6.9" - depd "~1.1.2" - http-errors "1.8.1" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" iconv-lite "0.4.24" - on-finished "~2.3.0" - qs "6.9.7" - raw-body "2.4.3" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.1" type-is "~1.6.18" + unpipe "1.0.0" bonjour-service@^1.0.11: - version "1.0.11" - resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.0.11.tgz#5418e5c1ac91c89a406f853a942e7892829c0d89" - integrity sha512-drMprzr2rDTCtgEE3VgdA9uUFaUHF+jXduwYSThHJnKMYM+FhI9Z3ph+TX3xy0LtgYHae6CHYPJ/2UnK8nQHcA== + version "1.0.14" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.0.14.tgz#c346f5bc84e87802d08f8d5a60b93f758e514ee7" + integrity sha512-HIMbgLnk1Vqvs6B4Wq5ep7mxvj9sGz5d1JJyDNSGNIdA/w2MCz6GTjWTdjqOJV1bEPj+6IkxDvWNFKEBxNt4kQ== dependencies: array-flatten "^2.1.2" dns-equal "^1.0.0" fast-deep-equal "^3.1.3" - multicast-dns "^7.2.4" + multicast-dns "^7.2.5" boolbase@^1.0.0, boolbase@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== brace-expansion@^1.1.7: version "1.1.11" @@ -4183,16 +4300,15 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4.17.5, browserslist@^4.18.1, browserslist@^4.19.1, browserslist@^4.20.2: - version "4.20.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.2.tgz#567b41508757ecd904dab4d1c646c612cd3d4f88" - integrity sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA== +browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4.18.1, browserslist@^4.21.3, browserslist@^4.21.4: + version "4.21.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" + integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== dependencies: - caniuse-lite "^1.0.30001317" - electron-to-chromium "^1.4.84" - escalade "^3.1.1" - node-releases "^2.0.2" - picocolors "^1.0.0" + caniuse-lite "^1.0.30001400" + electron-to-chromium "^1.4.251" + node-releases "^2.0.6" + update-browserslist-db "^1.0.9" bs-logger@0.x: version "0.2.6" @@ -4216,7 +4332,7 @@ btoa@^1.2.1: buffer-equal@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b" - integrity sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs= + integrity sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA== buffer-from@^1.0.0: version "1.1.2" @@ -4232,14 +4348,14 @@ buffer@^6.0.3: ieee754 "^1.2.1" builtin-modules@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.2.0.tgz#45d5db99e7ee5e6bc4f362e008bf917ab5049887" - integrity sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA== + version "3.3.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" + integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== bytes@3.1.2: version "3.1.2" @@ -4292,10 +4408,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001317: - version "1.0.30001328" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001328.tgz" - integrity sha512-Ue55jHkR/s4r00FLNiX+hGMMuwml/QGqqzVeMQ5thUewznU2EdULFvI3JR7JJid6OrjJNfFvHY2G2dIjmRaDDQ== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001400, caniuse-lite@^1.0.30001426: + version "1.0.30001434" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz#ec1ec1cfb0a93a34a0600d37903853030520a4e5" + integrity sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA== case-sensitive-paths-webpack-plugin@^2.4.0: version "2.4.0" @@ -4353,24 +4469,19 @@ character-entities-legacy@^3.0.0: integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== character-entities@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.1.tgz#98724833e1e27990dee0bd0f2b8a859c3476aac7" - integrity sha512-OzmutCf2Kmc+6DrFrrPS8/tDh2+DpnrfzdICHWhcVC9eOd0N1PXmQEE1a8iM4IziIAG+8tmTq3K+oo0ubH6RRQ== + version "2.0.2" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" + integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== character-reference-invalid@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz#85c66b041e43b47210faf401278abf808ac45cb9" integrity sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw== -charcodes@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/charcodes/-/charcodes-0.2.0.tgz#5208d327e6cc05f99eb80ffc814707572d1f14e4" - integrity sha512-Y4kiDb+AM4Ecy58YkuZrrSRJBDQdQ2L+NyS1vHHFtNtUjgutcZfx3yp1dAONI/oPaPmyGfCLx5CxL+zauIMyKQ== - check-types@^11.1.1: - version "11.1.2" - resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.1.2.tgz#86a7c12bf5539f6324eb0e70ca8896c0e38f3e2f" - integrity sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ== + version "11.2.2" + resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.2.2.tgz#7afc0b6a860d686885062f2dba888ba5710335b4" + integrity sha512-HBiYvXvn9Z70Z88XKjz3AEKd4HJhBXsa3j7xFnITAzoS8+q6eIGi8qDB8FKPBAjtuxjI/zFpwuiCb8oDtKOYrA== chokidar@^3.4.2, chokidar@^3.5.3: version "3.5.3" @@ -4388,16 +4499,14 @@ chokidar@^3.4.2, chokidar@^3.5.3: fsevents "~2.3.2" chrome-trace-event@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" - integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== - dependencies: - tslib "^1.9.0" + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== ci-info@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.0.tgz#b4ed1fb6818dea4803a55c623041f9165d2066b2" - integrity sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw== + version "3.7.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.7.0.tgz#6d01b3696c59915b6ce057e4aa4adfc2fa25f5ef" + integrity sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog== cjs-module-lexer@^1.0.0: version "1.2.2" @@ -4405,14 +4514,14 @@ cjs-module-lexer@^1.0.0: integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== classnames@^2.2.6: - version "2.3.1" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" - integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== + version "2.3.2" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" + integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== clean-css@^5.2.2: - version "5.3.0" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.0.tgz#ad3d8238d5f3549e83d5f87205189494bc7cbb59" - integrity sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ== + version "5.3.1" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.1.tgz#d0610b0b90d125196a2894d35366f734e5d7aa32" + integrity sha512-lCr8OHhiWCTw4v8POJovCoh4T7I9U11yVsPjMWWnnMmp9ZowCxyad1Pathle/9HjaDp+fdQKjO9fQydE6RHTZg== dependencies: source-map "~0.6.0" @@ -4453,7 +4562,7 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" -clsx@^1.1.0, clsx@^1.1.1, clsx@^1.2.1: +clsx@^1.1.0, clsx@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== @@ -4461,7 +4570,7 @@ clsx@^1.1.0, clsx@^1.1.1, clsx@^1.2.1: co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== coa@^2.0.2: version "2.0.2" @@ -4499,7 +4608,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#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== color-name@^1.1.4, color-name@~1.1.4: version "1.1.4" @@ -4507,14 +4616,14 @@ color-name@^1.1.4, color-name@~1.1.4: integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== colord@^2.9.1: - version "2.9.2" - resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.2.tgz#25e2bacbbaa65991422c07ea209e2089428effb1" - integrity sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ== + version "2.9.3" + resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" + integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== -colorette@^2.0.10, colorette@^2.0.16: - version "2.0.16" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" - integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== +colorette@^2.0.10, colorette@^2.0.19: + version "2.0.19" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" + integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== combined-stream@^1.0.8: version "1.0.8" @@ -4524,9 +4633,9 @@ combined-stream@^1.0.8: delayed-stream "~1.0.0" comma-separated-tokens@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.2.tgz#d4c25abb679b7751c880be623c1179780fe1dd98" - integrity sha512-G5yTt3KQN4Yn7Yk4ed73hlZ1evrFKXeUW3086p3PRFNp7m2vIjI6Pg+Kgb+oyzhd9F2qdcoj67+y3SdxL5XWsg== + version "2.0.3" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" + integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== commander@^2.20.0: version "2.20.3" @@ -4548,25 +4657,30 @@ commander@^8.3.0: resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== +commander@^9.4.1: + version "9.4.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-9.4.1.tgz#d1dd8f2ce6faf93147295c0df13c7c21141cfbdd" + integrity sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw== + common-path-prefix@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== common-tags@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" - integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw== + version "1.8.2" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" + integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== compare-versions@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-4.1.3.tgz#8f7b8966aef7dc4282b45dfa6be98434fc18a1a4" - integrity sha512-WQfnbDcrYnGr55UwbxKiQKASnTtNnaAWVi8jZyy8NTpVAXWACSne8lMD1iaIo9AiU6mnuLvSVshCzewVuWxHUg== + version "4.1.4" + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-4.1.4.tgz#3571f4d610924d4414846a4183d386c8f3d51112" + integrity sha512-FemMreK9xNyL8gQevsdRMrvO4lFCkQP7qbuktn1q8ndcNk1+0mz7lgE7b/sNvbhVgY4w6tMN1FDp6aADjqw2rw== compressible@~2.0.16: version "2.0.18" @@ -4608,10 +4722,10 @@ confusing-browser-globals@^1.0.11: resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== -connect-history-api-fallback@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" - integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== +connect-history-api-fallback@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" + integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== content-disposition@0.5.4: version "0.5.4" @@ -4626,44 +4740,41 @@ content-type@~1.0.4: integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1, convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== -cookie@0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" - integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== -core-js-compat@^3.20.2, core-js-compat@^3.21.0: - version "3.21.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.21.1.tgz#cac369f67c8d134ff8f9bd1623e3bc2c42068c82" - integrity sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g== +core-js-compat@^3.25.1: + version "3.26.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.26.1.tgz#0e710b09ebf689d719545ac36e49041850f943df" + integrity sha512-622/KzTudvXCDLRw70iHW4KKs1aGpcRcowGWyYJr2DEBfRrd6hNJybxSWJFuZYD4ma86xhrwDDHxmDaIq4EA8A== dependencies: - browserslist "^4.19.1" - semver "7.0.0" + browserslist "^4.21.4" -core-js-pure@^3.20.2, core-js-pure@^3.8.1: - version "3.21.1" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.21.1.tgz#8c4d1e78839f5f46208de7230cebfb72bc3bdb51" - integrity sha512-12VZfFIu+wyVbBebyHmRTuEE/tZrB4tJToWcwAMcsp3h4+sHR+fMJWbKpYiCRWlhFBq+KNyO8rIV9rTkeVmznQ== +core-js-pure@^3.23.3, core-js-pure@^3.25.1: + version "3.26.1" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.26.1.tgz#653f4d7130c427820dcecd3168b594e8bb095a33" + integrity sha512-VVXcDpp/xJ21KdULRq/lXdLzQAtX7+37LzpyfFM973il0tWSsDEoyzG38G14AjTpK9VTfiNM9jnFauq/CpaWGQ== core-js@^3.19.2: - version "3.21.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.21.1.tgz#f2e0ddc1fc43da6f904706e8e955bc19d06a0d94" - integrity sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig== + version "3.26.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.26.1.tgz#7a9816dabd9ee846c1c0fe0e8fcad68f3709134e" + integrity sha512-21491RRQVzUn0GGM9Z1Jrpr6PNPxPi+Za8OM9q4tksTSnlbXXGKK1nXNg/QvwFYettXvSX6zWKCtHHfjN4puyA== 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= + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== cosmiconfig-typescript-loader@^1.0.0: version "1.0.9" @@ -4685,9 +4796,9 @@ cosmiconfig@^6.0.0: yaml "^1.7.2" cosmiconfig@^7, cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" - integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== + version "7.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== dependencies: "@types/parse-json" "^4.0.0" import-fresh "^3.2.1" @@ -4757,10 +4868,10 @@ css-box-model@^1.2.0: dependencies: tiny-invariant "^1.0.6" -css-declaration-sorter@^6.2.2: - version "6.2.2" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz#bfd2f6f50002d6a3ae779a87d3a0c5d5b10e0f02" - integrity sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg== +css-declaration-sorter@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz#be5e1d71b7a992433fb1c542c7a1b835e45682ec" + integrity sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w== css-has-pseudo@^3.0.4: version "3.0.4" @@ -4770,18 +4881,18 @@ css-has-pseudo@^3.0.4: postcss-selector-parser "^6.0.9" css-loader@^6.5.1: - version "6.7.1" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.1.tgz#e98106f154f6e1baf3fc3bc455cb9981c1d5fd2e" - integrity sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw== + version "6.7.2" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.2.tgz#26bc22401b5921686a10fbeba75d124228302304" + integrity sha512-oqGbbVcBJkm8QwmnNzrFrWTnudnRZC+1eXikLJl0n4ljcfotgRifpg2a1lKy8jTrc4/d9A/ap1GFq1jDKG7J+Q== dependencies: icss-utils "^5.1.0" - postcss "^8.4.7" + postcss "^8.4.18" postcss-modules-extract-imports "^3.0.0" postcss-modules-local-by-default "^4.0.0" postcss-modules-scope "^3.0.0" postcss-modules-values "^4.0.0" postcss-value-parser "^4.2.0" - semver "^7.3.5" + semver "^7.3.8" css-minimizer-webpack-plugin@^3.2.0: version "3.4.1" @@ -4860,58 +4971,49 @@ css-what@^6.0.1: css.escape@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" - integrity sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s= + integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== -css@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/css/-/css-3.0.0.tgz#4447a4d58fdd03367c516ca9f64ae365cee4aa5d" - integrity sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ== - dependencies: - inherits "^2.0.4" - source-map "^0.6.1" - source-map-resolve "^0.6.0" - -cssdb@^6.5.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-6.5.0.tgz#61264b71f29c834f09b59cb3e5b43c8226590122" - integrity sha512-Rh7AAopF2ckPXe/VBcoUS9JrCZNSyc60+KpgE6X25vpVxA32TmiqvExjkfhwP4wGSb6Xe8Z/JIyGqwgx/zZYFA== +cssdb@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-7.1.0.tgz#574f97235a83eb753a29f0b1f2cbacac0d628bb8" + integrity sha512-Sd99PrFgx28ez4GHu8yoQIufc/70h9oYowDf4EjeIKi8mac9whxRjhM3IaMr6EllP6KKKWtJrMfN6C7T9tIWvQ== cssesc@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssnano-preset-default@^5.2.7: - version "5.2.7" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.2.7.tgz#791e3603fb8f1b46717ac53b47e3c418e950f5f3" - integrity sha512-JiKP38ymZQK+zVKevphPzNSGHSlTI+AOwlasoSRtSVMUU285O7/6uZyd5NbW92ZHp41m0sSHe6JoZosakj63uA== +cssnano-preset-default@^5.2.13: + version "5.2.13" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.2.13.tgz#e7353b0c57975d1bdd97ac96e68e5c1b8c68e990" + integrity sha512-PX7sQ4Pb+UtOWuz8A1d+Rbi+WimBIxJTRyBdgGp1J75VU0r/HFQeLnMYgHiCAp6AR4rqrc7Y4R+1Rjk3KJz6DQ== dependencies: - css-declaration-sorter "^6.2.2" + css-declaration-sorter "^6.3.1" cssnano-utils "^3.1.0" postcss-calc "^8.2.3" postcss-colormin "^5.3.0" - postcss-convert-values "^5.1.0" - postcss-discard-comments "^5.1.1" + postcss-convert-values "^5.1.3" + postcss-discard-comments "^5.1.2" postcss-discard-duplicates "^5.1.0" postcss-discard-empty "^5.1.1" postcss-discard-overridden "^5.1.0" - postcss-merge-longhand "^5.1.4" - postcss-merge-rules "^5.1.1" + postcss-merge-longhand "^5.1.7" + postcss-merge-rules "^5.1.3" postcss-minify-font-values "^5.1.0" postcss-minify-gradients "^5.1.1" - postcss-minify-params "^5.1.2" - postcss-minify-selectors "^5.2.0" + postcss-minify-params "^5.1.4" + postcss-minify-selectors "^5.2.1" postcss-normalize-charset "^5.1.0" postcss-normalize-display-values "^5.1.0" - postcss-normalize-positions "^5.1.0" - postcss-normalize-repeat-style "^5.1.0" + postcss-normalize-positions "^5.1.1" + postcss-normalize-repeat-style "^5.1.1" postcss-normalize-string "^5.1.0" postcss-normalize-timing-functions "^5.1.0" - postcss-normalize-unicode "^5.1.0" + postcss-normalize-unicode "^5.1.1" postcss-normalize-url "^5.1.0" postcss-normalize-whitespace "^5.1.1" - postcss-ordered-values "^5.1.1" - postcss-reduce-initial "^5.1.0" + postcss-ordered-values "^5.1.3" + postcss-reduce-initial "^5.1.1" postcss-reduce-transforms "^5.1.0" postcss-svgo "^5.1.0" postcss-unique-selectors "^5.1.1" @@ -4922,11 +5024,11 @@ cssnano-utils@^3.1.0: integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== cssnano@^5.0.6: - version "5.1.7" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.7.tgz#99858bef6c76c9240f0cdc9239570bc7db8368be" - integrity sha512-pVsUV6LcTXif7lvKKW9ZrmX+rGRzxkEdJuVJcp5ftUjWITgwam5LMZOgaTvUrWPkcORBey6he7JKb4XAJvrpKg== + version "5.1.14" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.14.tgz#07b0af6da73641276fe5a6d45757702ebae2eb05" + integrity sha512-Oou7ihiTocbKqi0J1bB+TRJIQX5RMR3JghA8hcWSw9mjBLQ5Y3RWqEDoYG3sRNlAbCIXpqMoZGbq5KDR3vdzgw== dependencies: - cssnano-preset-default "^5.2.7" + cssnano-preset-default "^5.2.13" lilconfig "^2.0.3" yaml "^1.10.2" @@ -4954,17 +5056,17 @@ cssstyle@^2.3.0: dependencies: cssom "~0.3.6" -csstype@^3.0.11, csstype@^3.0.2, csstype@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.0.tgz#4ddcac3718d787cf9df0d1b7d15033925c8f29f2" - integrity sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA== +csstype@^3.0.2, csstype@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" + integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== csv-parse@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-5.1.0.tgz#e587e969bf0385ecf4f36f584ed5ddebba0237ab" - integrity sha512-JL+Q6YEikT2uoe57InjFFa6VejhSv0tDwOxeQ1bVQKeUC/NCnLAAZ8n3PzowPQQLuZ37fysDYZipB2UJkH9C6A== + version "5.3.3" + resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-5.3.3.tgz#3b75d2279e2edb550cbc54c65b25cbbf3d0033ad" + integrity sha512-kEWkAPleNEdhFNkHQpFHu9RYPogsFj3dx6bCxL847fsiLgidzWg0z/O0B1kVWMJUc5ky64zGp18LX2T3DQrOfw== -damerau-levenshtein@^1.0.7: +damerau-levenshtein@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== @@ -4979,9 +5081,9 @@ data-urls@^2.0.0: whatwg-url "^8.0.0" date-fns@^2.22.1, date-fns@^2.28.0: - version "2.28.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.28.0.tgz#9570d656f5fc13143e50c975a3b6bbeb46cd08b2" - integrity sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw== + version "2.29.3" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8" + integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA== debug@2.6.9, debug@^2.6.0, debug@^2.6.9: version "2.6.9" @@ -4990,14 +5092,14 @@ debug@2.6.9, debug@^2.6.0, debug@^2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3: +debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -debug@^3.1.1, debug@^3.2.7: +debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== @@ -5005,31 +5107,47 @@ debug@^3.1.1, debug@^3.2.7: ms "^2.1.1" decimal.js@^10.2.1: - version "10.3.1" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" - integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== + version "10.4.2" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.2.tgz#0341651d1d997d86065a2ce3a441fbd0d8e8b98e" + integrity sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA== decode-named-character-reference@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.1.tgz#57b2bd9112659cacbc449d3577d7dadb8e1f3d1b" - integrity sha512-YV/0HQHreRwKb7uBopyIkLG17jG6Sv2qUchk9qSoVJ2f+flwRsPNBO0hAnjt6mTNYUT+vw9Gy2ihXg4sUWPi2w== + version "1.0.2" + resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz#daabac9690874c394c81e4162a0304b35d824f0e" + integrity sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg== dependencies: character-entities "^2.0.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#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= - dedent@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= + integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== + +deep-equal@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.1.0.tgz#5ba60402cf44ab92c2c07f3f3312c3d857a0e1dd" + integrity sha512-2pxgvWu3Alv1PoWEyVg7HS8YhGlUFUV7N5oOvfL6d+7xAmLSemMwv/c8Zv/i9KFzxV5Kt5CAvQc70fLwVuf4UA== + dependencies: + call-bind "^1.0.2" + es-get-iterator "^1.1.2" + get-intrinsic "^1.1.3" + is-arguments "^1.1.1" + is-date-object "^1.0.5" + is-regex "^1.1.4" + isarray "^2.0.5" + object-is "^1.1.5" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.8" deep-is@^0.1.3, deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== deepmerge@^4.2.2: version "4.2.2" @@ -5048,37 +5166,43 @@ define-lazy-prop@^2.0.0: resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== -define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== +define-properties@^1.1.3, define-properties@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== dependencies: - object-keys "^1.0.12" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" defined@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" - integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= + version "1.0.1" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.1.tgz#c0b9db27bfaffd95d6f61399419b893df0f91ebf" + integrity sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q== delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== dequal@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.2.tgz#85ca22025e3a87e65ef75a7a437b35284a7e319d" - integrity sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug== + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== detect-newline@^3.0.0: version "3.1.0" @@ -5086,9 +5210,9 @@ detect-newline@^3.0.0: integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== detect-node@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" - integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== detect-port-alt@^1.1.6: version "1.1.6" @@ -5098,14 +5222,14 @@ detect-port-alt@^1.1.6: address "^1.0.1" debug "^2.6.0" -detective@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.0.tgz#feb2a77e85b904ecdea459ad897cc90a99bd2a7b" - integrity sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg== +detective@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.1.tgz#6af01eeda11015acb0e73f933242b70f24f91034" + integrity sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw== dependencies: - acorn-node "^1.6.1" + acorn-node "^1.8.2" defined "^1.0.0" - minimist "^1.1.1" + minimist "^1.2.6" dialog-polyfill@^0.4.7: version "0.4.10" @@ -5122,15 +5246,20 @@ diff-sequences@^27.5.1: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== +diff-sequences@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.3.1.tgz#104b5b95fe725932421a9c6e5b4bef84c3f2249e" + integrity sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ== + diff@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== diff@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" - integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + version "5.1.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" + integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== dir-glob@^3.0.1: version "3.0.1" @@ -5170,12 +5299,12 @@ dnd-core@^16.0.1: dns-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" - integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= + integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== dns-packet@^5.2.2: - version "5.3.1" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.3.1.tgz#eb94413789daec0f0ebe2fcc230bdc9d7c91b43d" - integrity sha512-spBwIj0TK0Ey3666GwIdWVfUpLyubpU53BTCu8iPn4r4oXd9O14Hjg3EHw3ts2oed77/SeckunUYCyRlSngqHw== + version "5.4.0" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.4.0.tgz#1f88477cf9f27e78a213fb6d118ae38e759a879b" + integrity sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g== dependencies: "@leichtgewicht/ip-codec" "^2.0.1" @@ -5222,9 +5351,9 @@ dom-serializer@0: entities "^2.0.0" dom-serializer@^1.0.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" - integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== + version "1.4.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" + integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== dependencies: domelementtype "^2.0.1" domhandler "^4.2.0" @@ -5255,9 +5384,9 @@ domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: domelementtype "^2.2.0" dompurify@^2.2.9, dompurify@^2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.3.6.tgz#2e019d7d7617aacac07cbbe3d88ae3ad354cf875" - integrity sha512-OFP2u/3T1R5CEgWCEONuJ1a5+MFKnOYpkywpUSxv/dj1LeBT1erK+JwM7zK0ROy2BRhqVCf0LRw/kHqKuMkVGg== + version "2.4.1" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.1.tgz#f9cb1a275fde9af6f2d0a2644ef648dd6847b631" + integrity sha512-ewwFzHzrrneRjxzmK6oVz/rZn9VWspGFRDb4/rRtIsM1n36t9AKma/ye8syCpcw+XJ25kOK/hOG7t1j2I2yBqA== domutils@^1.7.0: version "1.7.0" @@ -5297,7 +5426,7 @@ dotenv@^10.0.0: duplexer2@~0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" - integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= + integrity sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA== dependencies: readable-stream "^2.0.2" @@ -5314,7 +5443,7 @@ eastasianwidth@^0.2.0: ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== ejs@^3.1.5, ejs@^3.1.6: version "3.1.8" @@ -5323,10 +5452,15 @@ ejs@^3.1.5, ejs@^3.1.6: dependencies: jake "^10.8.5" -electron-to-chromium@^1.4.84: - version "1.4.106" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.106.tgz#e7a3bfa9d745dd9b9e597616cb17283cc349781a" - integrity sha512-ZYfpVLULm67K7CaaGP7DmjyeMY4naxsbTy+syVVxT6QHI1Ww8XbJjmr9fDckrhq44WzCrcC5kH3zGpdusxwwqg== +electron-to-chromium@^1.4.251: + version "1.4.284" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" + integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== + +emittery@^0.10.2: + version "0.10.2" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.2.tgz#902eec8aedb8c41938c46e9385e9db7e03182933" + integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== emittery@^0.8.1: version "0.8.1" @@ -5351,7 +5485,7 @@ emojis-list@^3.0.0: encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== encoding@^0.1.11: version "0.1.13" @@ -5360,10 +5494,10 @@ encoding@^0.1.11: dependencies: iconv-lite "^0.6.2" -enhanced-resolve@^5.9.2: - version "5.9.2" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz#0224dcd6a43389ebfb2d55efee517e5466772dd9" - integrity sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA== +enhanced-resolve@^5.10.0: + version "5.12.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634" + integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -5381,43 +5515,73 @@ error-ex@^1.3.1: is-arrayish "^0.2.1" error-stack-parser@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.6.tgz#5a99a707bd7a4c58a797902d48d82803ede6aad8" - integrity sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ== + version "2.1.4" + resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz#229cb01cdbfa84440bfa91876285b94680188286" + integrity sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ== dependencies: - stackframe "^1.1.1" + stackframe "^1.3.4" -es-abstract@^1.17.2, es-abstract@^1.18.0-next.2, es-abstract@^1.19.0, es-abstract@^1.19.1: - version "1.19.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.2.tgz#8f7b696d8f15b167ae3640b4060670f3d054143f" - integrity sha512-gfSBJoZdlL2xRiOCy0g8gLMryhoe1TlimjzU99L/31Z8QEGIhVQI+EWwt5lT+AuU9SnorVupXFqqOGqGfsyO6w== +es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.20.4: + version "1.20.4" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.4.tgz#1d103f9f8d78d4cf0713edcd6d0ed1a46eed5861" + integrity sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA== dependencies: call-bind "^1.0.2" es-to-primitive "^1.2.1" function-bind "^1.1.1" - get-intrinsic "^1.1.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.1.3" get-symbol-description "^1.0.0" has "^1.0.3" + has-property-descriptors "^1.0.0" has-symbols "^1.0.3" internal-slot "^1.0.3" - is-callable "^1.2.4" + is-callable "^1.2.7" is-negative-zero "^2.0.2" is-regex "^1.1.4" - is-shared-array-buffer "^1.0.1" + is-shared-array-buffer "^1.0.2" is-string "^1.0.7" is-weakref "^1.0.2" - object-inspect "^1.12.0" + object-inspect "^1.12.2" object-keys "^1.1.1" - object.assign "^4.1.2" - string.prototype.trimend "^1.0.4" - string.prototype.trimstart "^1.0.4" - unbox-primitive "^1.0.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + safe-regex-test "^1.0.0" + string.prototype.trimend "^1.0.5" + string.prototype.trimstart "^1.0.5" + unbox-primitive "^1.0.2" + +es-array-method-boxes-properly@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" + integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== + +es-get-iterator@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.2.tgz#9234c54aba713486d7ebde0220864af5e2b283f7" + integrity sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.0" + has-symbols "^1.0.1" + is-arguments "^1.1.0" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.5" + isarray "^2.0.5" es-module-lexer@^0.9.0: version "0.9.3" resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" + es-to-primitive@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" @@ -5440,12 +5604,12 @@ escape-carriage@^1.3.0: escape-html@^1.0.3, escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== 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#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^2.0.0: version "2.0.0" @@ -5503,10 +5667,10 @@ eslint-config-prettier@^8.5.0: resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== -eslint-config-react-app@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-7.0.0.tgz#0fa96d5ec1dfb99c029b1554362ab3fa1c3757df" - integrity sha512-xyymoxtIt1EOsSaGag+/jmcywRuieQoA2JbPCjnw9HukFj9/97aGPoZVFioaotzk1K5Qt9sHO5EutZbkrAXS0g== +eslint-config-react-app@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz#73ba3929978001c5c86274c017ea57eb5fa644b4" + integrity sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA== dependencies: "@babel/core" "^7.16.0" "@babel/eslint-parser" "^7.16.3" @@ -5532,12 +5696,11 @@ eslint-import-resolver-node@^0.3.6: resolve "^1.20.0" eslint-module-utils@^2.7.3: - version "2.7.3" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz#ad7e3a10552fdd0642e1e55292781bd6e34876ee" - integrity sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ== + version "2.7.4" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974" + integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== dependencies: debug "^3.2.7" - find-up "^2.1.0" eslint-plugin-flowtype@^8.0.3: version "8.0.3" @@ -5574,72 +5737,74 @@ eslint-plugin-jest@^25.3.0: "@typescript-eslint/experimental-utils" "^5.0.0" eslint-plugin-jsx-a11y@^6.5.1: - version "6.5.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz#cdbf2df901040ca140b6ec14715c988889c2a6d8" - integrity sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g== + version "6.6.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz#93736fc91b83fdc38cc8d115deedfc3091aef1ff" + integrity sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q== dependencies: - "@babel/runtime" "^7.16.3" + "@babel/runtime" "^7.18.9" aria-query "^4.2.2" - array-includes "^3.1.4" + array-includes "^3.1.5" ast-types-flow "^0.0.7" - axe-core "^4.3.5" + axe-core "^4.4.3" axobject-query "^2.2.0" - damerau-levenshtein "^1.0.7" + damerau-levenshtein "^1.0.8" emoji-regex "^9.2.2" has "^1.0.3" - jsx-ast-utils "^3.2.1" + jsx-ast-utils "^3.3.2" language-tags "^1.0.5" - minimatch "^3.0.4" + minimatch "^3.1.2" + semver "^6.3.0" eslint-plugin-local-rules@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-local-rules/-/eslint-plugin-local-rules-1.1.0.tgz#5f934f685b08c96eed40b92aee7b02f03cf55f7b" - integrity sha512-FdPyzxakUKgZkeNM3x/vvRcB6nCjTNbui5gWALhvcaH1R6aCiD37fWtdesagcyBpEe9S9XRHAJ8CJ4rUJ3K9tQ== + version "1.3.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-local-rules/-/eslint-plugin-local-rules-1.3.2.tgz#b9c9522915faeb9e430309fb909fc1dbcd7aedb3" + integrity sha512-X4ziX+cjlCYnZa+GB1ly3mmj44v2PeIld3tQVAxelY6AMrhHSjz6zsgsT6nt0+X5b7eZnvL/O7Q3pSSK2kF/+Q== eslint-plugin-no-relative-import-paths@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-no-relative-import-paths/-/eslint-plugin-no-relative-import-paths-1.2.0.tgz#ae969752ae910f4a92f7d3f467076e3cb19c6acf" - integrity sha512-UQiGNGU8Jite02FLMgB0J1Cg4D9GwpeDPvJo6x1++eKqqghNGRyFA68WVx6p6KjD9THDaenXnDOj/1YAobQ5Ag== + version "1.5.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-no-relative-import-paths/-/eslint-plugin-no-relative-import-paths-1.5.0.tgz#d277fd4d9644e2405cea32541af3bfbde00f02e9" + integrity sha512-4if/PGGzpSP+DfOscGZ2nYd8XObc5rN9Ux5lhDzAVqLEaz8XD3ikzApSogXBdf+lnpTsTE5LJSqXFmFpNkZ3LQ== eslint-plugin-react-hooks@^4.3.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.4.0.tgz#71c39e528764c848d8253e1aa2c7024ed505f6c4" - integrity sha512-U3RVIfdzJaeKDQKEJbz5p3NW8/L80PCATJAfuojwbaEL+gBjfGdhUcGde+WGUW46Q5sr/NgxevsIiDtNXrvZaQ== + version "4.6.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" + integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== eslint-plugin-react@^7.27.1: - version "7.29.4" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.29.4.tgz#4717de5227f55f3801a5fd51a16a4fa22b5914d2" - integrity sha512-CVCXajliVh509PcZYRFyu/BoUEz452+jtQJq2b3Bae4v3xBUWPLCmtmBM+ZinG4MzwmxJgJ2M5rMqhqLVn7MtQ== + version "7.31.11" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.31.11.tgz#011521d2b16dcf95795df688a4770b4eaab364c8" + integrity sha512-TTvq5JsT5v56wPa9OYHzsrOlHzKZKjV+aLgS+55NJP/cuzdiQPC7PfYoUjMoxlffKtvijpk7vA/jmuqRb9nohw== dependencies: - array-includes "^3.1.4" - array.prototype.flatmap "^1.2.5" + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + array.prototype.tosorted "^1.1.1" doctrine "^2.1.0" estraverse "^5.3.0" jsx-ast-utils "^2.4.1 || ^3.0.0" minimatch "^3.1.2" - object.entries "^1.1.5" - object.fromentries "^2.0.5" - object.hasown "^1.1.0" - object.values "^1.1.5" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + object.hasown "^1.1.2" + object.values "^1.1.6" prop-types "^15.8.1" resolve "^2.0.0-next.3" semver "^6.3.0" - string.prototype.matchall "^4.0.6" + string.prototype.matchall "^4.0.8" eslint-plugin-testing-library@^5.0.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.2.1.tgz#3f89cd28ade81329a11584e0bbea129bede01619" - integrity sha512-88qJv6uzYALtiYJDzhelP3ov0Px/GLgnu+UekjjDxL2nMyvgdTyboKqcDBsvFPmAeizlCoSWOjeBN4DxO0BxaA== + version "5.9.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.9.1.tgz#12e4bd34c48683ee98af4df2e3318ec9f51dcf8a" + integrity sha512-6BQp3tmb79jLLasPHJmy8DnxREe+2Pgf7L+7o09TSWPfdqqtQfRZmZNetr5mOs3yqZk/MRNxpN3RUpJe0wB4LQ== dependencies: "@typescript-eslint/utils" "^5.13.0" eslint-plugin-tsdoc@^0.2.16: - version "0.2.16" - resolved "https://registry.yarnpkg.com/eslint-plugin-tsdoc/-/eslint-plugin-tsdoc-0.2.16.tgz#a3d31fb9c7955faa3c66a43dd43da7635f1c5e0d" - integrity sha512-F/RWMnyDQuGlg82vQEFHQtGyWi7++XJKdYNn0ulIbyMOFqYIjoJOUdE6olORxgwgLkpJxsCJpJbTHgxJ/ggfXw== + version "0.2.17" + resolved "https://registry.yarnpkg.com/eslint-plugin-tsdoc/-/eslint-plugin-tsdoc-0.2.17.tgz#27789495bbd8778abbf92db1707fec2ed3dfe281" + integrity sha512-xRmVi7Zx44lOBuYqG8vzTXuL6IdGOeF9nHX17bjJ8+VE6fsxpdGem0/SBTmAwgYMKYB1WBkqRJVQ+n8GK041pA== dependencies: - "@microsoft/tsdoc" "0.14.1" - "@microsoft/tsdoc-config" "0.16.1" + "@microsoft/tsdoc" "0.14.2" + "@microsoft/tsdoc-config" "0.16.2" eslint-scope@5.1.1, eslint-scope@^5.1.1: version "5.1.1" @@ -5669,29 +5834,31 @@ eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.3.0: +eslint-visitor-keys@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== eslint-webpack-plugin@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/eslint-webpack-plugin/-/eslint-webpack-plugin-3.1.1.tgz#83dad2395e5f572d6f4d919eedaa9cf902890fcb" - integrity sha512-xSucskTN9tOkfW7so4EaiFIkulWLXwCB/15H917lR6pTv0Zot6/fetFucmENRb7J5whVSFKIvwnrnsa78SG2yg== + version "3.2.0" + resolved "https://registry.yarnpkg.com/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz#1978cdb9edc461e4b0195a20da950cf57988347c" + integrity sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w== dependencies: - "@types/eslint" "^7.28.2" - jest-worker "^27.3.1" - micromatch "^4.0.4" + "@types/eslint" "^7.29.0 || ^8.4.1" + jest-worker "^28.0.2" + micromatch "^4.0.5" normalize-path "^3.0.0" - schema-utils "^3.1.1" + schema-utils "^4.0.0" -eslint@^8.12.0, eslint@^8.3.0: - version "8.12.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.12.0.tgz#c7a5bd1cfa09079aae64c9076c07eada66a46e8e" - integrity sha512-it1oBL9alZg1S8UycLm5YDMAkIhtH6FtAzuZs6YvoGVldWjbS08BkAdb/ymP9LlAyq8koANu32U7Ib/w+UNh8Q== +eslint@^8.28.0, eslint@^8.3.0: + version "8.28.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.28.0.tgz#81a680732634677cc890134bcdd9fdfea8e63d6e" + integrity sha512-S27Di+EVyMxcHiwDrFzk8dJYAaD+/5SoWKxL1ri/71CRHsnJnRDPNt2Kzj24+MT9FDupf4aqqyqPrvI8MvQ4VQ== dependencies: - "@eslint/eslintrc" "^1.2.1" - "@humanwhocodes/config-array" "^0.9.2" + "@eslint/eslintrc" "^1.3.3" + "@humanwhocodes/config-array" "^0.11.6" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" @@ -5701,44 +5868,46 @@ eslint@^8.12.0, eslint@^8.3.0: eslint-scope "^7.1.1" eslint-utils "^3.0.0" eslint-visitor-keys "^3.3.0" - espree "^9.3.1" + espree "^9.4.0" esquery "^1.4.0" esutils "^2.0.2" fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^6.0.1" - globals "^13.6.0" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.15.0" + grapheme-splitter "^1.0.4" ignore "^5.2.0" import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-sdsl "^4.1.4" js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" lodash.merge "^4.6.2" - minimatch "^3.0.4" + minimatch "^3.1.2" natural-compare "^1.4.0" optionator "^0.9.1" regexpp "^3.2.0" strip-ansi "^6.0.1" strip-json-comments "^3.1.0" text-table "^0.2.0" - v8-compile-cache "^2.0.3" -espree@^9.3.1: - version "9.3.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.1.tgz#8793b4bc27ea4c778c19908e0719e7b8f4115bcd" - integrity sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ== +espree@^9.4.0: + version "9.4.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.1.tgz#51d6092615567a2c2cff7833445e37c28c0065bd" + integrity sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg== dependencies: - acorn "^8.7.0" - acorn-jsx "^5.3.1" + acorn "^8.8.0" + acorn-jsx "^5.3.2" eslint-visitor-keys "^3.3.0" esprima@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" - integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= + integrity sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg== esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" @@ -5782,7 +5951,7 @@ esutils@^2.0.2: etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== eventemitter3@^4.0.0: version "4.0.7" @@ -5794,7 +5963,7 @@ events@^3.2.0: resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -execa@^5.0.0, execa@^5.1.1: +execa@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== @@ -5809,10 +5978,25 @@ execa@^5.0.0, execa@^5.1.1: signal-exit "^3.0.3" strip-final-newline "^2.0.0" +execa@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-6.1.0.tgz#cea16dee211ff011246556388effa0818394fb20" + integrity sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.1" + human-signals "^3.0.1" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^3.0.7" + strip-final-newline "^3.0.0" + exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== expect@^27.5.1: version "27.5.1" @@ -5824,38 +6008,50 @@ expect@^27.5.1: jest-matcher-utils "^27.5.1" jest-message-util "^27.5.1" +expect@^29.0.0: + version "29.3.1" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.3.1.tgz#92877aad3f7deefc2e3f6430dd195b92295554a6" + integrity sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA== + dependencies: + "@jest/expect-utils" "^29.3.1" + jest-get-type "^29.2.0" + jest-matcher-utils "^29.3.1" + jest-message-util "^29.3.1" + jest-util "^29.3.1" + express@^4.17.3: - version "4.17.3" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.3.tgz#f6c7302194a4fb54271b73a1fe7a06478c8f85a1" - integrity sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg== + version "4.18.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== dependencies: accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.19.2" + body-parser "1.20.1" content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.4.2" + cookie "0.5.0" cookie-signature "1.0.6" debug "2.6.9" - depd "~1.1.2" + depd "2.0.0" encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "~1.1.2" + finalhandler "1.2.0" fresh "0.5.2" + http-errors "2.0.0" merge-descriptors "1.0.1" methods "~1.1.2" - on-finished "~2.3.0" + on-finished "2.4.1" parseurl "~1.3.3" path-to-regexp "0.1.7" proxy-addr "~2.0.7" - qs "6.9.7" + qs "6.11.0" range-parser "~1.2.1" safe-buffer "5.2.1" - send "0.17.2" - serve-static "1.14.2" + send "0.18.0" + serve-static "1.15.0" setprototypeof "1.2.0" - statuses "~1.5.0" + statuses "2.0.1" type-is "~1.6.18" utils-merge "1.0.1" vary "~1.1.2" @@ -5866,24 +6062,22 @@ extend@^3.0.0: integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== falafel@^2.1.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/falafel/-/falafel-2.2.4.tgz#b5d86c060c2412a43166243cb1bce44d1abd2819" - integrity sha512-0HXjo8XASWRmsS0X1EkhwEMZaD3Qvp7FfURwjLKjG1ghfRm/MGZl2r4cWUTv41KdNghTw4OUMmVtdGQp3+H+uQ== + version "2.2.5" + resolved "https://registry.yarnpkg.com/falafel/-/falafel-2.2.5.tgz#3ccb4970a09b094e9e54fead2deee64b4a589d56" + integrity sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ== dependencies: acorn "^7.1.1" - foreach "^2.0.5" isarray "^2.0.1" - object-keys "^1.0.6" fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^3.2.11, fast-glob@^3.2.9: - version "3.2.11" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" - integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== +fast-glob@^3.2.12, fast-glob@^3.2.9: + version "3.2.12" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -5899,7 +6093,7 @@ fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-sta fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastq@^1.6.0: version "1.13.0" @@ -5916,9 +6110,9 @@ faye-websocket@0.11.4, faye-websocket@^0.11.3: websocket-driver ">=0.5.1" fb-watchman@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" - integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== + version "2.0.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== dependencies: bser "2.1.1" @@ -5993,23 +6187,23 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -finalhandler@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== dependencies: debug "2.6.9" encodeurl "~1.0.2" escape-html "~1.0.3" - on-finished "~2.3.0" + on-finished "2.4.1" parseurl "~1.3.3" - statuses "~1.5.0" + statuses "2.0.1" unpipe "~1.0.0" find-cache-dir@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" - integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== + version "3.3.2" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== dependencies: commondir "^1.0.1" make-dir "^3.0.2" @@ -6020,13 +6214,6 @@ find-root@^1.1.0: resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== -find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= - dependencies: - locate-path "^2.0.0" - find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" @@ -6051,41 +6238,41 @@ find-up@^5.0.0: path-exists "^4.0.0" firebase@^9.12.1: - version "9.12.1" - resolved "https://registry.yarnpkg.com/firebase/-/firebase-9.12.1.tgz#f2ef2560a3a122bcf82dee09d5ae3a3805bb890a" - integrity sha512-sBp4rvkCC7TUnGeneRNs6GVcajO+iSXmYjxqXN4FsrBzldJ5/AOnDXf4bi9OUZtQSl+EHDgUWShBieht15ijgQ== + version "9.14.0" + resolved "https://registry.yarnpkg.com/firebase/-/firebase-9.14.0.tgz#407de4855092e607d3ee1fb222294ab2b45c4798" + integrity sha512-wePrsf7W33mhT7RVXQavragoAgXb/NDm22vuhwJXkprrQ2Y9alrEKC5LTAtLJL3P2dHdDmeylS6PLZwWPEE79A== dependencies: - "@firebase/analytics" "0.8.3" - "@firebase/analytics-compat" "0.1.16" - "@firebase/app" "0.8.2" - "@firebase/app-check" "0.5.15" - "@firebase/app-check-compat" "0.2.15" - "@firebase/app-compat" "0.1.37" - "@firebase/app-types" "0.8.0" - "@firebase/auth" "0.20.10" - "@firebase/auth-compat" "0.2.23" - "@firebase/database" "0.13.9" - "@firebase/database-compat" "0.2.9" - "@firebase/firestore" "3.7.1" - "@firebase/firestore-compat" "0.2.1" - "@firebase/functions" "0.8.7" - "@firebase/functions-compat" "0.2.7" - "@firebase/installations" "0.5.15" - "@firebase/installations-compat" "0.1.15" - "@firebase/messaging" "0.9.19" - "@firebase/messaging-compat" "0.1.19" - "@firebase/performance" "0.5.15" - "@firebase/performance-compat" "0.1.15" - "@firebase/remote-config" "0.3.14" - "@firebase/remote-config-compat" "0.1.15" - "@firebase/storage" "0.9.12" - "@firebase/storage-compat" "0.1.20" - "@firebase/util" "1.7.2" + "@firebase/analytics" "0.8.4" + "@firebase/analytics-compat" "0.1.17" + "@firebase/app" "0.8.4" + "@firebase/app-check" "0.5.17" + "@firebase/app-check-compat" "0.2.17" + "@firebase/app-compat" "0.1.39" + "@firebase/app-types" "0.8.1" + "@firebase/auth" "0.20.11" + "@firebase/auth-compat" "0.2.24" + "@firebase/database" "0.13.10" + "@firebase/database-compat" "0.2.10" + "@firebase/firestore" "3.7.3" + "@firebase/firestore-compat" "0.2.3" + "@firebase/functions" "0.8.8" + "@firebase/functions-compat" "0.2.8" + "@firebase/installations" "0.5.16" + "@firebase/installations-compat" "0.1.16" + "@firebase/messaging" "0.11.0" + "@firebase/messaging-compat" "0.1.21" + "@firebase/performance" "0.5.17" + "@firebase/performance-compat" "0.1.17" + "@firebase/remote-config" "0.3.15" + "@firebase/remote-config-compat" "0.1.16" + "@firebase/storage" "0.9.14" + "@firebase/storage-compat" "0.1.22" + "@firebase/util" "1.7.3" firebaseui@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/firebaseui/-/firebaseui-6.0.1.tgz#bdabc69de9c245975a1277d507b2f0ff0044e558" - integrity sha512-SMNCFt/xns3mnvd0hImEDu7di5fqRU3MVyIaXpVEfg6v0bH6f3m+YybivU7KElRUT/47DHMn++D8MrZYYnoN5g== + version "6.0.2" + resolved "https://registry.yarnpkg.com/firebaseui/-/firebaseui-6.0.2.tgz#14411920e17a7986e2ae969cb4890dfbf94fbfc5" + integrity sha512-Jwwn2I657loKrvedeCrwED9UibLFl8Cm0uH2ntDBSCpruWzG4HXlIWb35WsDdXMILRPQjJ1PwVwuRsrnsxcaXA== dependencies: dialog-polyfill "^0.4.7" material-design-lite "^1.2.0" @@ -6099,9 +6286,9 @@ flat-cache@^3.0.4: rimraf "^3.0.2" flatted@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.1.tgz#c4b489e80096d9df1dfc97c79871aea7c617c469" - integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== + version "3.2.7" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== flux@^4.0.1: version "4.0.3" @@ -6112,19 +6299,21 @@ flux@^4.0.1: fbjs "^3.0.1" follow-redirects@^1.0.0: - version "1.13.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.2.tgz#dd73c8effc12728ba5cf4259d760ea5fb83e3147" - integrity sha512-6mPTgLxYm3r6Bkkg0vNM0HTjfGrOEtsfbhagQvbxDEsEkpNhw582upBaoRZylzen6krEmxXJgt9Ju6HiI4O7BA== + version "1.15.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== -foreach@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" - integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" fork-ts-checker-webpack-plugin@^6.5.0: - version "6.5.1" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.1.tgz#fd689e2d9de6ac76abb620909eea56438cd0f232" - integrity sha512-x1wumpHOEf4gDROmKTaB6i4/Q6H3LwmjVO7fIX47vBwlZbtPjU33hgoMuD/Q/y6SU8bnuYSoN6ZQOLshGp0T/g== + version "6.5.2" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz#4f67183f2f9eb8ba7df7177ce3cf3e75cdafb340" + integrity sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA== dependencies: "@babel/code-frame" "^7.8.3" "@types/json-schema" "^7.0.5" @@ -6162,12 +6351,12 @@ fraction.js@^4.2.0: fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== fs-extra@^10.0.0: - version "10.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.1.tgz#27de43b4320e833f6867cc044bfce29fdf0ef3b8" - integrity sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag== + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== dependencies: graceful-fs "^4.2.0" jsonfile "^6.0.1" @@ -6183,7 +6372,7 @@ fs-extra@^9.0.0, fs-extra@^9.0.1: jsonfile "^6.0.1" universalify "^2.0.0" -fs-monkey@1.0.3: +fs-monkey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== @@ -6191,7 +6380,7 @@ fs-monkey@1.0.3: fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@^2.3.2, fsevents@~2.3.2: version "2.3.2" @@ -6203,10 +6392,20 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + +functions-have-names@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== gensync@^1.0.0-beta.2: version "1.0.0-beta.2" @@ -6218,14 +6417,14 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" - integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" + integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== dependencies: function-bind "^1.1.1" has "^1.0.3" - has-symbols "^1.0.1" + has-symbols "^1.0.3" get-own-enumerable-property-symbols@^3.0.0: version "3.0.2" @@ -6237,7 +6436,7 @@ get-package-type@^0.1.0: resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -get-stream@^6.0.0: +get-stream@^6.0.0, get-stream@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== @@ -6251,9 +6450,9 @@ get-symbol-description@^1.0.0: get-intrinsic "^1.1.1" github-slugger@^1.1.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.4.0.tgz#206eb96cdb22ee56fdc53a28d5a302338463444e" - integrity sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ== + version "1.5.0" + resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.5.0.tgz#17891bbc73232051474d68bd867a34625c955f7d" + integrity sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw== glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" @@ -6262,7 +6461,7 @@ glob-parent@^5.1.2, glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" -glob-parent@^6.0.1, glob-parent@^6.0.2: +glob-parent@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== @@ -6275,14 +6474,14 @@ glob-to-regexp@^0.4.1: integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== 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#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.4" + minimatch "^3.1.1" once "^1.3.0" path-is-absolute "^1.0.0" @@ -6307,14 +6506,14 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^13.6.0, globals@^13.9.0: - version "13.11.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.11.0.tgz#40ef678da117fe7bd2e28f1fab24951bd0255be7" - integrity sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g== +globals@^13.15.0: + version "13.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.18.0.tgz#fb224daeeb2bb7d254cd2c640f003528b8d0c1dc" + integrity sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A== dependencies: type-fest "^0.20.2" -globby@^11.0.4: +globby@^11.0.4, globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -6326,11 +6525,23 @@ globby@^11.0.4: merge2 "^1.4.1" slash "^3.0.0" +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + gzip-size@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" @@ -6344,25 +6555,32 @@ handle-thing@^2.0.0: integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== harmony-reflect@^1.4.6: - version "1.6.1" - resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.1.tgz#c108d4f2bb451efef7a37861fdbdae72c9bdefa9" - integrity sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA== + version "1.6.2" + resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.2.tgz#31ecbd32e648a34d030d86adb67d4d47547fe710" + integrity sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g== -has-bigints@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" - integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" @@ -6437,9 +6655,9 @@ hast-util-parse-selector@^3.0.0: "@types/hast" "^2.0.0" hast-util-raw@^7.2.0: - version "7.2.1" - resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-7.2.1.tgz#6e964cee098dbdd93d1b77cf180b5827d48048ab" - integrity sha512-wgtppqXVdXzkDXDFclLLdAyVUJSKMYYi6LWIAbA8oFqEdwksYIcPGM3RkKV1Dfn5GElvxhaOCs0jmCOMayxd3A== + version "7.2.2" + resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-7.2.2.tgz#1974360b2d7f15b5ce26c2a4bac892d5d8185a18" + integrity sha512-0x3BhhdlBcqRIKyc095lBSDvmQNMY3Eulj2PLsT5XCyKYrxssI5yr3P4Kv/PBo1s/DMkZy2voGkMXECnFCZRLQ== dependencies: "@types/hast" "^2.0.0" "@types/parse5" "^6.0.0" @@ -6453,13 +6671,6 @@ hast-util-raw@^7.2.0: web-namespaces "^2.0.0" zwitch "^2.0.0" -hast-util-sanitize@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/hast-util-sanitize/-/hast-util-sanitize-4.0.0.tgz#71a02ca2e50d04b852a5500846418070ca364f60" - integrity sha512-pw56+69jq+QSr/coADNvWTmBPDy+XsmwaF5KnUys4/wM1jt/fZdl7GPxhXXXYdXnz3Gj3qMkbUCH2uKjvX0MgQ== - dependencies: - "@types/hast" "^2.0.0" - hast-util-select@~5.0.1: version "5.0.2" resolved "https://registry.yarnpkg.com/hast-util-select/-/hast-util-select-5.0.2.tgz#8c603ebacf0f47e154c5fa2e5b7efc520813866b" @@ -6523,9 +6734,9 @@ hast-util-whitespace@^2.0.0: integrity sha512-Pkw+xBHuV6xFeJprJe2BBEoDV+AvQySaz3pPDRUs5PNZEMQjpXJJueqrpcHIXxnWTcAGi/UOCgVShlkY6kLoqg== hastscript@^7.0.0: - version "7.0.2" - resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-7.0.2.tgz#d811fc040817d91923448a28156463b2e40d590a" - integrity sha512-uA8ooUY4ipaBvKcMuPehTAB/YfFLSSzCwFSwT6ltJbocFUKH/GDHLN+tflq7lSRf9H86uOuxOFkh1KgIy3Gg2g== + version "7.1.0" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-7.1.0.tgz#e402ed48f46161cf2f093badbff30583a5c3c315" + integrity sha512-uBjaTTLN0MkCZxY/R2fWUOcu7FRtUVzKRO5P/RAfgsu3yFiMB1JWCO4AjeVkgHxAira1f2UecHK5WfS9QurlWA== dependencies: "@types/hast" "^2.0.0" comma-separated-tokens "^2.0.0" @@ -6538,13 +6749,6 @@ he@^1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -history@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/history/-/history-5.3.0.tgz#1548abaa245ba47992f063a0783db91ef201c73b" - integrity sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ== - dependencies: - "@babel/runtime" "^7.7.6" - hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" @@ -6560,7 +6764,7 @@ hoopy@^0.1.4: hpack.js@^2.1.6: version "2.1.6" resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" - integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= + integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== dependencies: inherits "^2.0.1" obuf "^1.0.0" @@ -6626,23 +6830,23 @@ htmlparser2@^6.1.0: http-deceiver@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" - integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= + integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== -http-errors@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" - integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== dependencies: - depd "~1.1.2" + depd "2.0.0" inherits "2.0.4" setprototypeof "1.2.0" - statuses ">= 1.5.0 < 2" + statuses "2.0.1" toidentifier "1.0.1" http-errors@~1.6.2: version "1.6.3" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== dependencies: depd "~1.1.2" inherits "2.0.3" @@ -6650,9 +6854,9 @@ http-errors@~1.6.2: statuses ">= 1.4.0 < 2" http-parser-js@>=0.5.1: - version "0.5.3" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.3.tgz#01d2709c79d41698bb01d4decc5e9da4e4a033d9" - integrity sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg== + version "0.5.8" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" + integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== http-proxy-agent@^4.0.1: version "4.0.1" @@ -6664,9 +6868,9 @@ http-proxy-agent@^4.0.1: debug "4" http-proxy-middleware@^2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz#03af0f4676d172ae775cb5c33f592f40e1a4e07a" - integrity sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg== + version "2.0.6" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== dependencies: "@types/http-proxy" "^1.17.8" http-proxy "^1.18.1" @@ -6684,9 +6888,9 @@ http-proxy@^1.18.1: requires-port "^1.0.0" https-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" - integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== dependencies: agent-base "6" debug "4" @@ -6696,10 +6900,15 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== +human-signals@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-3.0.1.tgz#c740920859dafa50e5a3222da9d3bf4bb0e5eef5" + integrity sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ== + husky@>=7.0.4: - version "7.0.4" - resolved "https://registry.yarnpkg.com/husky/-/husky-7.0.4.tgz#242048245dc49c8fb1bf0cc7cfb98dd722531535" - integrity sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ== + version "8.0.2" + resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.2.tgz#5816a60db02650f1f22c8b69b928fd6bcd77a236" + integrity sha512-Tkv80jtvbnkK3mYWxPZePGFpQ/tT3HNSs/sasF9P2YfkMezDl3ON37YN6jUUI4eTg5LcyVynlb6r4eyvOmspvg== iconv-lite@0.4.24: version "0.4.24" @@ -6725,15 +6934,15 @@ idb@7.0.1: resolved "https://registry.yarnpkg.com/idb/-/idb-7.0.1.tgz#d2875b3a2f205d854ee307f6d196f246fea590a7" integrity sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg== -idb@^6.1.4: - version "6.1.5" - resolved "https://registry.yarnpkg.com/idb/-/idb-6.1.5.tgz#dbc53e7adf1ac7c59f9b2bf56e00b4ea4fce8c7b" - integrity sha512-IJtugpKkiVXQn5Y+LteyBCNk1N8xpGV3wWZk9EVtZWH8DYkjBn0bX1XnGP9RkyZF0sAcywa6unHqSWKe7q4LGw== +idb@^7.0.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/idb/-/idb-7.1.1.tgz#d910ded866d32c7ced9befc5bfdf36f572ced72b" + integrity sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ== identity-obj-proxy@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14" - integrity sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ= + integrity sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA== dependencies: harmony-reflect "^1.4.6" @@ -6742,20 +6951,20 @@ ieee754@^1.2.1: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ignore@^5.1.8, ignore@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== +ignore@^5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.1.tgz#c2b1f76cb999ede1502f3a226a9310fdfe88d46c" + integrity sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA== immediate@~3.0.5: version "3.0.6" resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" - integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= + integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== immer@^9.0.7: - version "9.0.12" - resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.12.tgz#2d33ddf3ee1d247deab9d707ca472c8c942a0f20" - integrity sha512-lk7UNmSbAukB5B6dh9fnh5D0bJTOFKxVg2cyJWTYrWRfhLrLMBquONcUs3aFq507hNoIZEDDh8lb8UtOizSMhA== + version "9.0.16" + resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.16.tgz#8e7caab80118c2b54b37ad43e05758cdefad0198" + integrity sha512-qenGE7CstVm1NrHQbMh8YaSzTZTFNP3zPqr3YU0S0UY441j4bJTg4A2Hh5KAhwgaiU6ZZ1Ar6y/2f4TblnMReQ== import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: version "3.3.0" @@ -6766,9 +6975,9 @@ import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: resolve-from "^4.0.0" import-local@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" - integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== dependencies: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" @@ -6776,7 +6985,7 @@ import-local@^3.0.2: imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== indent-string@^4.0.0: version "4.0.0" @@ -6786,12 +6995,12 @@ indent-string@^4.0.0: inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@~2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3, inherits@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -6799,7 +7008,7 @@ inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, i inherits@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== ini@^1.3.5: version "1.3.8" @@ -6850,10 +7059,18 @@ is-alphanumerical@^2.0.0: is-alphabetical "^2.0.0" is-decimal "^2.0.0" +is-arguments@^1.1.0, is-arguments@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-bigint@^1.0.1: version "1.0.4" @@ -6882,19 +7099,19 @@ is-buffer@^2.0.0: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== -is-callable@^1.1.4, is-callable@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" - integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@^2.1.0, is-core-module@^2.2.0, is-core-module@^2.8.1: - version "2.9.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" - integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== +is-core-module@^2.1.0, is-core-module@^2.8.1, is-core-module@^2.9.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== dependencies: has "^1.0.3" -is-date-object@^1.0.1: +is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== @@ -6914,7 +7131,7 @@ is-docker@^2.0.0, is-docker@^2.1.1: is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-fullwidth-code-point@^3.0.0: version "3.0.0" @@ -6943,10 +7160,15 @@ is-hexadecimal@^2.0.0: resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz#86b5bf668fca307498d319dfc03289d781a90027" integrity sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg== +is-map@^2.0.1, is-map@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + is-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" - integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= + integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== is-negative-zero@^2.0.2: version "2.0.2" @@ -6968,7 +7190,12 @@ is-number@^7.0.0: is-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== is-plain-obj@^3.0.0: version "3.0.0" @@ -6976,9 +7203,9 @@ is-plain-obj@^3.0.0: integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== is-plain-obj@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.0.0.tgz#06c0999fd7574edf5a906ba5644ad0feb3a84d22" - integrity sha512-NXRbBtUdBioI73y/HmOhogw/U5msYPC9DAtGkJXeFcFWSFZw0mCUsPxk/snTuJHzNKA8kLBK4rH97RMB1BfCXw== + version "4.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" + integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== is-potential-custom-element-name@^1.0.1: version "1.0.1" @@ -6996,14 +7223,19 @@ is-regex@^1.1.4: is-regexp@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" - integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= + integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== is-root@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== -is-shared-array-buffer@^1.0.1: +is-set@^2.0.1, is-set@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + +is-shared-array-buffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== @@ -7013,12 +7245,17 @@ is-shared-array-buffer@^1.0.1: 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= + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== is-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" - integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" @@ -7034,16 +7271,32 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" +is-typed-array@^1.1.10: + version "1.1.10" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" + integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typedarray@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== is-url@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" @@ -7051,6 +7304,14 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" +is-weakset@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" + integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + 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#74a4c76e77ca9fd3f932f290c17ea326cd157271" @@ -7058,7 +7319,7 @@ is-wsl@^2.1.1, is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" -isarray@^2.0.1: +isarray@^2.0.1, isarray@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== @@ -7066,17 +7327,17 @@ isarray@^2.0.1: isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== 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= + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== isomorphic-fetch@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" - integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk= + integrity sha512-9c4TNAKYXM5PRyVcwUZrF3W09nQ+sO7+jydgs4ZGW9dhsLG2VOlISJABombdQqQRXCwuYG3sYV/puGf5rp0qmA== dependencies: node-fetch "^1.0.1" whatwg-fetch ">=0.10.0" @@ -7087,9 +7348,9 @@ istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz#7b49198b657b27a730b8e9cb601f1e1bff24c59a" - integrity sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q== + version "5.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== dependencies: "@babel/core" "^7.12.3" "@babel/parser" "^7.14.7" @@ -7107,18 +7368,18 @@ istanbul-lib-report@^3.0.0: supports-color "^7.1.0" istanbul-lib-source-maps@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" - integrity sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg== + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== dependencies: debug "^4.1.1" istanbul-lib-coverage "^3.0.0" source-map "^0.6.1" istanbul-reports@^3.1.3: - version "3.1.4" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.4.tgz#1b6f068ecbc6c331040aab5741991273e609e40c" - integrity sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw== + version "3.1.5" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" + integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" @@ -7225,6 +7486,16 @@ jest-diff@^27.5.1: jest-get-type "^27.5.1" pretty-format "^27.5.1" +jest-diff@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.3.1.tgz#d8215b72fed8f1e647aed2cae6c752a89e757527" + integrity sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.3.1" + jest-get-type "^29.2.0" + pretty-format "^29.3.1" + jest-docblock@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.5.1.tgz#14092f364a42c6108d42c33c8cf30e058e25f6c0" @@ -7273,6 +7544,11 @@ jest-get-type@^27.5.1: resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1" integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== +jest-get-type@^29.2.0: + version "29.2.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.2.0.tgz#726646f927ef61d583a3b3adb1ab13f3a5036408" + integrity sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA== + jest-haste-map@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.5.1.tgz#9fd8bd7e7b4fa502d9c6164c5640512b4e811e7f" @@ -7334,6 +7610,16 @@ jest-matcher-utils@^27.0.0, jest-matcher-utils@^27.5.1: jest-get-type "^27.5.1" pretty-format "^27.5.1" +jest-matcher-utils@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz#6e7f53512f80e817dfa148672bd2d5d04914a572" + integrity sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ== + dependencies: + chalk "^4.0.0" + jest-diff "^29.3.1" + jest-get-type "^29.2.0" + pretty-format "^29.3.1" + jest-message-util@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.5.1.tgz#bdda72806da10d9ed6425e12afff38cd1458b6cf" @@ -7349,6 +7635,36 @@ jest-message-util@^27.5.1: slash "^3.0.0" stack-utils "^2.0.3" +jest-message-util@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.1.3.tgz#232def7f2e333f1eecc90649b5b94b0055e7c43d" + integrity sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^28.1.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^28.1.3" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-message-util@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.3.1.tgz#37bc5c468dfe5120712053dd03faf0f053bd6adb" + integrity sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.3.1" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.3.1" + slash "^3.0.0" + stack-utils "^2.0.3" + jest-mock@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.5.1.tgz#19948336d49ef4d9c52021d34ac7b5f36ff967d6" @@ -7358,15 +7674,20 @@ jest-mock@^27.5.1: "@types/node" "*" jest-pnp-resolver@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" - integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== + version "1.2.3" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== -jest-regex-util@^27.0.0, jest-regex-util@^27.5.1: +jest-regex-util@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95" integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== +jest-regex-util@^28.0.0: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-28.0.2.tgz#afdc377a3b25fb6e80825adcf76c854e5bf47ead" + integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== + jest-resolve-dependencies@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz#d811ecc8305e731cc86dd79741ee98fed06f1da8" @@ -7495,12 +7816,24 @@ jest-util@^27.5.1: graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-util@^28.0.0: - version "28.1.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.0.tgz#d54eb83ad77e1dd441408738c5a5043642823be5" - integrity sha512-qYdCKD77k4Hwkose2YBEqQk7PzUf/NSE+rutzceduFveQREeH6b+89Dc9+wjX9dAwHcgdx4yedGA3FQlU/qCTA== +jest-util@^28.0.0, jest-util@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.3.tgz#f4f932aa0074f0679943220ff9cbba7e497028b0" + integrity sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ== dependencies: - "@jest/types" "^28.1.0" + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-util@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.3.1.tgz#1dda51e378bbcb7e3bc9d8ab651445591ed373e1" + integrity sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ== + dependencies: + "@jest/types" "^29.3.1" "@types/node" "*" chalk "^4.0.0" ci-info "^3.2.0" @@ -7520,19 +7853,19 @@ jest-validate@^27.5.1: pretty-format "^27.5.1" jest-watch-typeahead@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/jest-watch-typeahead/-/jest-watch-typeahead-1.0.0.tgz#4de2ca1eb596acb1889752afbab84b74fcd99173" - integrity sha512-jxoszalAb394WElmiJTFBMzie/RDCF+W7Q29n5LzOPtcoQoHWfdUtHFkbhgf5NwWe8uMOxvKb/g7ea7CshfkTw== + version "1.1.0" + resolved "https://registry.yarnpkg.com/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz#b4a6826dfb9c9420da2f7bc900de59dad11266a9" + integrity sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw== dependencies: ansi-escapes "^4.3.1" chalk "^4.0.0" - jest-regex-util "^27.0.0" - jest-watcher "^27.0.0" + jest-regex-util "^28.0.0" + jest-watcher "^28.0.0" slash "^4.0.0" string-length "^5.0.1" strip-ansi "^7.0.1" -jest-watcher@^27.0.0, jest-watcher@^27.5.1: +jest-watcher@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.5.1.tgz#71bd85fb9bde3a2c2ec4dc353437971c43c642a2" integrity sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw== @@ -7545,6 +7878,20 @@ jest-watcher@^27.0.0, jest-watcher@^27.5.1: jest-util "^27.5.1" string-length "^4.0.1" +jest-watcher@^28.0.0: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-28.1.3.tgz#c6023a59ba2255e3b4c57179fc94164b3e73abd4" + integrity sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g== + dependencies: + "@jest/test-result" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.10.2" + jest-util "^28.1.3" + string-length "^4.0.1" + jest-worker@^26.2.1: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" @@ -7554,7 +7901,7 @@ jest-worker@^26.2.1: merge-stream "^2.0.0" supports-color "^7.0.0" -jest-worker@^27.0.2, jest-worker@^27.3.1, jest-worker@^27.4.5, jest-worker@^27.5.1: +jest-worker@^27.0.2, jest-worker@^27.4.5, jest-worker@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== @@ -7563,6 +7910,15 @@ jest-worker@^27.0.2, jest-worker@^27.3.1, jest-worker@^27.4.5, jest-worker@^27.5 merge-stream "^2.0.0" supports-color "^8.0.0" +jest-worker@^28.0.2: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-28.1.3.tgz#7e3c4ce3fa23d1bb6accb169e7f396f98ed4bb98" + integrity sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + jest@^27.4.3: version "27.5.1" resolved "https://registry.yarnpkg.com/jest/-/jest-27.5.1.tgz#dadf33ba70a779be7a6fc33015843b51494f63fc" @@ -7575,18 +7931,23 @@ jest@^27.4.3: jju@~1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/jju/-/jju-1.4.0.tgz#a3abe2718af241a2b2904f84a625970f389ae32a" - integrity sha1-o6vicYryQaKykE+EpiWXDzia4yo= + integrity sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA== jotai@^1.8.4: - version "1.8.4" - resolved "https://registry.yarnpkg.com/jotai/-/jotai-1.8.4.tgz#e188bff3cc790c758d25646f6f5daf9854c98eef" - integrity sha512-bkHDHNxm7bU4+bJL4z96fTlJYN34UDRTu3ghEajJrDepayON9YEaxPrXr7xhLnIRntoFC6eDYYhMNA/ilbj2RQ== + version "1.10.0" + resolved "https://registry.yarnpkg.com/jotai/-/jotai-1.10.0.tgz#50c5224789282eca1cdc907a51e316d8d94c5976" + integrity sha512-3Q8kQU3Ktds+80Ku4dVcvnwSXEcK0Fg0b6mC1+4wz3rmF64lOGNUySKXQ4njvYCWodR8bw2HygOKYSYkHxQQmA== js-base64@^2.4.3: version "2.6.4" resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4" integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ== +js-sdsl@^4.1.4: + version "4.2.0" + resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.2.0.tgz#278e98b7bea589b8baaf048c20aeb19eb7ad09d0" + integrity sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ== + "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#19203fb59991df98e3a287050d4647cdeaf32499" @@ -7648,14 +8009,9 @@ jsesc@^2.5.1: jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== -json-parse-better-errors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-parse-even-better-errors@^2.3.0: +json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== @@ -7678,7 +8034,7 @@ json-schema@^0.4.0: json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== json2csv@^5.0.7: version "5.0.7" @@ -7689,11 +8045,6 @@ json2csv@^5.0.7: jsonparse "^1.3.1" lodash.get "^4.4.2" -json5@2.x, json5@^2.1.2, json5@^2.2.0, json5@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" - integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== - json5@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" @@ -7701,10 +8052,15 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -jsonc-parser@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.0.0.tgz#abdd785701c7e7eaca8a9ec8cf070ca51a745a22" - integrity sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA== +json5@^2.1.2, json5@^2.2.0, json5@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" + integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== + +jsonc-parser@^3.0.0, jsonc-parser@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" + integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== jsonfile@^6.0.1: version "6.1.0" @@ -7721,22 +8077,22 @@ jsonparse@^1.3.1: integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== jsonpointer@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.0.tgz#f802669a524ec4805fa7389eadbc9921d5dc8072" - integrity sha512-PNYZIdMjVIvVgDSYKTT63Y+KZ6IZvGRNNWcxwD+GNnUz1MKPfv30J8ueCjdwcN0nDx2SlshgyB7Oy0epAzVRRg== + version "5.0.1" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" + integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== -"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.2.1: - version "3.2.2" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.2.tgz#6ab1e52c71dfc0c0707008a91729a9491fe9f76c" - integrity sha512-HDAyJ4MNQBboGpUnHAVUNJs6X0lh058s6FuixsFGP7MgJYpD6Vasd6nzSG5iIfXu1zAYlHJ/zsOKNlrenTUBnw== +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.2: + version "3.3.3" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" + integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== dependencies: - array-includes "^3.1.4" - object.assign "^4.1.2" + array-includes "^3.1.5" + object.assign "^4.1.3" -jszip@^3.10.0, jszip@^3.6.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.0.tgz#faf3db2b4b8515425e34effcdbb086750a346061" - integrity sha512-LDfVtOLtOxb9RXkYOwPyNBTQDL4eUbqahtoY6x07GiDJHwSYvn8sHHIw8wINImV3MqbMNve2gSuM1DDqEKk09Q== +jszip@^3.10.0: + version "3.10.1" + resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2" + integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== dependencies: lie "~3.3.0" pako "~1.0.2" @@ -7754,9 +8110,9 @@ kleur@^3.0.3: integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== kleur@^4.0.3: - version "4.1.4" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.4.tgz#8c202987d7e577766d039a8cd461934c01cda04d" - integrity sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA== + version "4.1.5" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" + integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== klona@^2.0.4, klona@^2.0.5: version "2.0.5" @@ -7764,14 +8120,14 @@ klona@^2.0.4, klona@^2.0.5: integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== language-subtag-registry@~0.3.2: - version "0.3.21" - resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz#04ac218bea46f04cb039084602c6da9e788dd45a" - integrity sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg== + version "0.3.22" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" + integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== language-tags@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" - integrity sha1-0yHbxNowuovzAk4ED6XBRmH5GTo= + integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== dependencies: language-subtag-registry "~0.3.2" @@ -7791,7 +8147,7 @@ levn@^0.4.1: levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== dependencies: prelude-ls "~1.1.2" type-check "~0.3.2" @@ -7803,15 +8159,10 @@ lie@~3.3.0: dependencies: immediate "~3.0.5" -lilconfig@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.4.tgz#f4507d043d7058b380b6a8f5cb7bcd4b34cee082" - integrity sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA== - -lilconfig@^2.0.3, lilconfig@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.5.tgz#19e57fd06ccc3848fd1891655b5a447092225b25" - integrity sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg== +lilconfig@2.0.6, lilconfig@^2.0.3, lilconfig@^2.0.5, lilconfig@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.6.tgz#32a384558bd58af3d4c6e077dd1ad1d397bc69d4" + integrity sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg== lines-and-columns@^1.1.6: version "1.2.4" @@ -7819,45 +8170,44 @@ lines-and-columns@^1.1.6: integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== lint-staged@>=12.3.7: - version "12.3.7" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-12.3.7.tgz#ad0e2014302f704f9cf2c0ebdb97ac63d0f17be0" - integrity sha512-/S4D726e2GIsDVWIk1XGvheCaDm1SJRQp8efamZFWJxQMVEbOwSysp7xb49Oo73KYCdy97mIWinhlxcoNqIfIQ== + version "13.0.4" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-13.0.4.tgz#c4b4391280c35165b805ad43304ba01f733067a0" + integrity sha512-HxlHCXoYRsq9QCby5wFozmZW00hMs/9e3l+/dz6Qr8Kle4UH0kJTdABAbqhzG+3pcG6QjL9kz7NgGBfph+a5dw== dependencies: cli-truncate "^3.1.0" - colorette "^2.0.16" - commander "^8.3.0" - debug "^4.3.3" - execa "^5.1.1" - lilconfig "2.0.4" - listr2 "^4.0.1" - micromatch "^4.0.4" + colorette "^2.0.19" + commander "^9.4.1" + debug "^4.3.4" + execa "^6.1.0" + lilconfig "2.0.6" + listr2 "^5.0.5" + micromatch "^4.0.5" normalize-path "^3.0.0" - object-inspect "^1.12.0" - pidtree "^0.5.0" + object-inspect "^1.12.2" + pidtree "^0.6.0" string-argv "^0.3.1" - supports-color "^9.2.1" - yaml "^1.10.2" + yaml "^2.1.3" -listr2@^4.0.1: - version "4.0.5" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-4.0.5.tgz#9dcc50221583e8b4c71c43f9c7dfd0ef546b75d5" - integrity sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA== +listr2@^5.0.5: + version "5.0.6" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-5.0.6.tgz#3c61153383869ffaad08a8908d63edfde481dff8" + integrity sha512-u60KxKBy1BR2uLJNTWNptzWQ1ob/gjMzIJPZffAENzpZqbMZ/5PrXXOomDcevIS/+IB7s1mmCEtSlT2qHWMqag== dependencies: cli-truncate "^2.1.0" - colorette "^2.0.16" + colorette "^2.0.19" log-update "^4.0.0" p-map "^4.0.0" rfdc "^1.3.0" - rxjs "^7.5.5" + rxjs "^7.5.7" through "^2.3.8" wrap-ansi "^7.0.0" loader-runner@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384" - integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== + version "4.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== -loader-utils@^2.0.0: +loader-utils@^2.0.0, loader-utils@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== @@ -7867,17 +8217,9 @@ loader-utils@^2.0.0: json5 "^2.1.2" loader-utils@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.2.0.tgz#bcecc51a7898bee7473d4bc6b845b23af8304d4f" - integrity sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ== - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" + version "3.2.1" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.2.1.tgz#4fb104b599daafd82ef3e1a41fb9265f87e1f576" + integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== locate-path@^3.0.0: version "3.0.0" @@ -7909,22 +8251,22 @@ lodash-es@^4.17.21: lodash.camelcase@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== lodash.curry@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.curry/-/lodash.curry-4.1.1.tgz#248e36072ede906501d75966200a86dab8b23170" - integrity sha1-JI42By7ekGUB11lmIAqG2riyMXA= + integrity sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA== lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== lodash.flow@^3.3.0: version "3.5.0" resolved "https://registry.yarnpkg.com/lodash.flow/-/lodash.flow-3.5.0.tgz#87bf40292b8cf83e4e8ce1a3ae4209e20071675a" - integrity sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o= + integrity sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw== lodash.get@^4.4.2: version "4.4.2" @@ -7934,7 +8276,7 @@ lodash.get@^4.4.2: lodash.memoize@4.x, lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== lodash.merge@^4.6.2: version "4.6.2" @@ -7944,14 +8286,14 @@ lodash.merge@^4.6.2: lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== -lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0: +lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -7971,10 +8313,15 @@ long@^4.0.0: resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== +long@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/long/-/long-5.2.1.tgz#e27595d0083d103d2fa2c20c7699f8e0c92b897f" + integrity sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A== + longest-streak@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.0.1.tgz#c97315b7afa0e7d9525db9a5a2953651432bdc5d" - integrity sha512-cHlYSUpL2s7Fb3394mYxwTYj8niTaNHUCLr0qdiCXQfSjfuA7CKofpX2uSwEfFDQ0EB7JcnMnm+GjbqqoinYYg== + version "3.1.0" + resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" + integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" @@ -8005,7 +8352,7 @@ lunr@^2.3.9: lz-string@^1.4.4: version "1.4.4" resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" - integrity sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY= + integrity sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ== magic-string@^0.22.4: version "0.22.5" @@ -8015,11 +8362,11 @@ magic-string@^0.22.4: vlq "^0.2.2" magic-string@^0.25.0, magic-string@^0.25.7: - version "0.25.7" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" - integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== + version "0.25.9" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" + integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== dependencies: - sourcemap-codec "^1.4.4" + sourcemap-codec "^1.4.8" make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: version "3.1.0" @@ -8033,12 +8380,12 @@ make-error@1.x, make-error@^1.1.1: resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== -makeerror@1.0.x: - version "1.0.11" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" - integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== dependencies: - tmpl "1.0.x" + tmpl "1.0.5" markdown-table@^3.0.0: version "3.0.2" @@ -8061,12 +8408,12 @@ match-sorter@^6.3.1: material-design-lite@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/material-design-lite/-/material-design-lite-1.3.0.tgz#d004ce3fee99a1eeb74a78b8a325134a5f1171d3" - integrity sha1-0ATOP+6Zoe63Sni4oyUTSl8RcdM= + integrity sha512-ao76b0bqSTKcEMt7Pui+J/S3eVF0b3GWfuKUwfe2lP5DKlLZOwBq37e0/bXEzxrw7/SuHAuYAdoCwY6mAYhrsg== material-ui-popup-state@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/material-ui-popup-state/-/material-ui-popup-state-4.0.1.tgz#356258aa5d6be40d22512c1e9bb4c58f303d0e3f" - integrity sha512-4Ywj2QFOaS4mirRRtX4xps1waJQPa+IIEnVj/nnA4+aglinEcPkALPq+akAlvzKAjkjkmIjiku8SbdmTl0hTCQ== + version "4.1.0" + resolved "https://registry.yarnpkg.com/material-ui-popup-state/-/material-ui-popup-state-4.1.0.tgz#0e3e1536a449bb19b5a8b5e0c3cbbbca8a4c9688" + integrity sha512-YAxLT10XALsUuuo46sc81NKD6oKJzlkcKP3e+IqC0pKwzAhOAZIQ+RUHXT6Mz3bXHKoHCsM+NdIQxR4mOH/KEQ== dependencies: "@babel/runtime" "^7.12.5" "@mui/material" "^5.0.0" @@ -8074,22 +8421,22 @@ material-ui-popup-state@^4.0.1: prop-types "^15.7.2" mdast-util-definitions@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-5.1.0.tgz#b6d10ef00a3c4cf191e8d9a5fa58d7f4a366f817" - integrity sha512-5hcR7FL2EuZ4q6lLMUK5w4lHT2H3vqL9quPvYZ/Ku5iifrirfMHiGdhxdXMUbUkDmz5I+TYMd7nbaxUhbQkfpQ== + version "5.1.1" + resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-5.1.1.tgz#2c1d684b28e53f84938bb06317944bee8efa79db" + integrity sha512-rQ+Gv7mHttxHOBx2dkF4HWTg+EE+UR78ptQWDylzPKaQuVGdG4HIoY3SrS/pCp80nZ04greFvXbVFHT+uf0JVQ== dependencies: "@types/mdast" "^3.0.0" "@types/unist" "^2.0.0" - unist-util-visit "^3.0.0" + unist-util-visit "^4.0.0" mdast-util-find-and-replace@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.1.0.tgz#69728acd250749f8aac6e150e07d1fd15619e829" - integrity sha512-1w1jbqAd13oU78QPBf5223+xB+37ecNtQ1JElq2feWols5oEYAl+SgNDnOZipe7NfLemoEt362yUS15/wip4mw== + version "2.2.1" + resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.1.tgz#249901ef43c5f41d6e8a8d446b3b63b17e592d7c" + integrity sha512-SobxkQXFAdd4b5WmEakmkVoh18icjQRxGy5OWTCzgsLRm1Fu/KCtwD1HIQSsmq5ZRjVH0Ehwg6/Fn3xIUk+nKw== dependencies: escape-string-regexp "^5.0.0" unist-util-is "^5.0.0" - unist-util-visit-parents "^4.0.0" + unist-util-visit-parents "^5.0.0" mdast-util-from-markdown@^1.0.0: version "1.2.0" @@ -8129,18 +8476,19 @@ mdast-util-gfm-footnote@^1.0.0: micromark-util-normalize-identifier "^1.0.0" mdast-util-gfm-strikethrough@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.1.tgz#a4a74c36864ec6a6e3bbd31e1977f29beb475789" - integrity sha512-zKJbEPe+JP6EUv0mZ0tQUyLQOC+FADt0bARldONot/nefuISkaZFlmVK4tU6JgfyZGrky02m/I6PmehgAgZgqg== + version "1.0.2" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.2.tgz#6b4fa4ae37d449ccb988192ac0afbb2710ffcefd" + integrity sha512-T/4DVHXcujH6jx1yqpcAYYwd+z5lAYMw4Ls6yhTfbMMtCt0PHY4gEfhW9+lKsLBtyhUGKRIzcUA2FATVqnvPDA== dependencies: "@types/mdast" "^3.0.0" mdast-util-to-markdown "^1.3.0" mdast-util-gfm-table@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.4.tgz#0dbb25f04fd9c0877dc63b76203ecbdf5d945755" - integrity sha512-aEuoPwZyP4iIMkf2cLWXxx3EQ6Bmh2yKy9MVCg4i6Sd3cX80dcLEfXO/V4ul3pGH9czBK4kp+FAl+ZHmSUt9/w== + version "1.0.6" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.6.tgz#184e900979fe790745fc3dabf77a4114595fcd7f" + integrity sha512-uHR+fqFq3IvB3Rd4+kzXW8dmpxUhvgCQZep6KdjsLK4O6meK5dYZEayLtIxNus1XO3gfjfcIFe8a7L0HZRGgag== dependencies: + "@types/mdast" "^3.0.0" markdown-table "^3.0.0" mdast-util-from-markdown "^1.0.0" mdast-util-to-markdown "^1.3.0" @@ -8167,16 +8515,15 @@ mdast-util-gfm@^2.0.0: mdast-util-to-markdown "^1.0.0" mdast-util-to-hast@^12.1.0: - version "12.1.1" - resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-12.1.1.tgz#89a2bb405eaf3b05eb8bf45157678f35eef5dbca" - integrity sha512-qE09zD6ylVP14jV4mjLIhDBOrpFdShHZcEsYvvKGABlr9mGbV7mTlRWdoFxL/EYSTNDiC9GZXy7y8Shgb9Dtzw== + version "12.2.4" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-12.2.4.tgz#34c1ef2b6cf01c27b3e3504e2c977c76f722e7e1" + integrity sha512-a21xoxSef1l8VhHxS1Dnyioz6grrJkoaCUgGzMD/7dWHvboYX3VW53esRUfB5tgTyz4Yos1n25SPcj35dJqmAg== dependencies: "@types/hast" "^2.0.0" "@types/mdast" "^3.0.0" - "@types/mdurl" "^1.0.0" mdast-util-definitions "^5.0.0" - mdurl "^1.0.0" - micromark-util-sanitize-uri "^1.0.0" + micromark-util-sanitize-uri "^1.1.0" + trim-lines "^3.0.0" unist-builder "^3.0.0" unist-util-generated "^2.0.0" unist-util-position "^4.0.0" @@ -8201,9 +8548,9 @@ mdast-util-to-string@^3.0.0, mdast-util-to-string@^3.1.0: integrity sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA== mdi-material-ui@^7.2.0, mdi-material-ui@^7.3.0: - version "7.3.0" - resolved "https://registry.yarnpkg.com/mdi-material-ui/-/mdi-material-ui-7.3.0.tgz#db3ed681d35ae12c37fb1c95bcfe679a1be80c0b" - integrity sha512-BJ4JF+LlO/aYcOg9wrgbzRiInyRH6padgfBdJpoPNc3CoZDaik9ARTP3PWzgMjRSQQZ2KvxtFVpOHDkHfrc2Fw== + version "7.6.0" + resolved "https://registry.yarnpkg.com/mdi-material-ui/-/mdi-material-ui-7.6.0.tgz#bf166c9eab5b5e5abbf38edee1650674ad2f5660" + integrity sha512-daqyXS2tVPB9AulKee4LOwf6llx/eiA969HFx0rOGEC2Cgup/nAmHWnN7yYtndhXpvd2cXwov5kjw40HxjjjZg== mdn-data@2.0.14: version "2.0.14" @@ -8215,22 +8562,17 @@ mdn-data@2.0.4: resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== -mdurl@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" - integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= - media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== -memfs@^3.1.2, memfs@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.1.tgz#b78092f466a0dce054d63d39275b24c71d3f1305" - integrity sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw== +memfs@^3.1.2, memfs@^3.4.3: + version "3.4.12" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.12.tgz#d00f8ad8dab132dc277c659dc85bfd14b07d03bd" + integrity sha512-BcjuQn6vfqP+k100e0E9m61Hyqa//Brp+I3f0OBmN0ATHlFA8vx3Lt8z57R3u2bPqe3WGDBC+nF72fTH7isyEw== dependencies: - fs-monkey "1.0.3" + fs-monkey "^1.0.3" memoize-one@^5.1.1: version "5.2.1" @@ -8240,12 +8582,12 @@ memoize-one@^5.1.1: merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== merge-source-map@1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.0.4.tgz#a5de46538dae84d4114cc5ea02b4772a6346701f" - integrity sha1-pd5GU42uhNQRTMXqArR3KmNGcB8= + integrity sha512-PGSmS0kfnTnMJCzJ16BLLCEe6oeYCamKFFdQKshi4BmM6FUwipjVOcBFGxqtQtirtAG4iZvHlqST9CpZKqlRjA== dependencies: source-map "^0.5.6" @@ -8262,7 +8604,7 @@ merge2@^1.3.0, merge2@^1.4.1: methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== micromark-core-commonmark@^1.0.0, micromark-core-commonmark@^1.0.1: version "1.0.6" @@ -8469,9 +8811,9 @@ micromark-util-encode@^1.0.0: integrity sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA== micromark-util-html-tag-name@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.0.0.tgz#75737e92fef50af0c6212bd309bc5cb8dbd489ed" - integrity sha512-NenEKIshW2ZI/ERv9HtFNsrn3llSPZtY337LID/24WeLqMzeZhBEE6BQ0vS2ZBjshm5n40chKtJ3qjAbVV8S0g== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.1.0.tgz#eb227118befd51f48858e879b7a419fc0df20497" + integrity sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA== micromark-util-normalize-identifier@^1.0.0: version "1.0.0" @@ -8487,10 +8829,10 @@ micromark-util-resolve-all@^1.0.0: dependencies: micromark-util-types "^1.0.0" -micromark-util-sanitize-uri@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.0.0.tgz#27dc875397cd15102274c6c6da5585d34d4f12b2" - integrity sha512-cCxvBKlmac4rxCGx6ejlIviRaMKZc0fWm5HdCHEeDWRSkn44l6NdYVRyU+0nT1XC72EQJMZV8IPHF+jTr56lAg== +micromark-util-sanitize-uri@^1.0.0, micromark-util-sanitize-uri@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.1.0.tgz#f12e07a85106b902645e0364feb07cf253a85aee" + integrity sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg== dependencies: micromark-util-character "^1.0.0" micromark-util-encode "^1.0.0" @@ -8517,9 +8859,9 @@ micromark-util-types@^1.0.0, micromark-util-types@^1.0.1: integrity sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w== micromark@^3.0.0: - version "3.0.10" - resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.0.10.tgz#1eac156f0399d42736458a14b0ca2d86190b457c" - integrity sha512-ryTDy6UUunOXy2HPjelppgJ2sNfcPz1pLlMdA6Rz9jPzhLikWXv/irpWV/I2jd68Uhmny7hHxAlAhk4+vWggpg== + version "3.1.0" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.1.0.tgz#eeba0fe0ac1c9aaef675157b52c166f125e89f62" + integrity sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA== dependencies: "@types/debug" "^4.0.0" debug "^4.0.0" @@ -8539,7 +8881,7 @@ micromark@^3.0.0: micromark-util-types "^1.0.1" uvu "^0.5.0" -micromatch@^4.0.2, micromatch@^4.0.4: +micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== @@ -8569,15 +8911,20 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + min-indent@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== mini-css-extract-plugin@^2.4.5: - version "2.6.0" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.0.tgz#578aebc7fc14d32c0ad304c2c34f08af44673f5e" - integrity sha512-ndG8nxCEnAemsg4FSgS+yNyHKgkTB4nPKqCOgh65j3/30qqC5RaSQQXMm++Y6sb6E1zRSxPkztj9fqxhS1Eo6w== + version "2.7.0" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.0.tgz#d7d9ba0c5b596d155e36e2b174082fc7f010dd64" + integrity sha512-auqtVo8KhTScMsba7MbijqZTfibbXiBNlPAQbsVt7enQfcDYLdgG57eGxMqwVU3mfeWANY4F1wUg+rMF+ycZgw== dependencies: schema-utils "^4.0.0" @@ -8586,14 +8933,7 @@ minimalistic-assert@^1.0.0: resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimatch@3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^3.0.4, minimatch@^3.1.2: +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -8607,12 +8947,12 @@ minimatch@^5.0.1, minimatch@^5.1.0: dependencies: brace-expansion "^2.0.1" -minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" - integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== +minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.6: + version "1.2.7" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" + integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== -mkdirp@^0.5.1, mkdirp@^0.5.5, mkdirp@~0.5.1: +mkdirp@^0.5.1, mkdirp@~0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== @@ -8620,9 +8960,9 @@ mkdirp@^0.5.1, mkdirp@^0.5.5, mkdirp@~0.5.1: minimist "^1.2.6" monaco-editor-auto-typings@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/monaco-editor-auto-typings/-/monaco-editor-auto-typings-0.4.0.tgz#52c0b1c74086fbf23568a0322a505808ecd95566" - integrity sha512-rd98fgFtHIvetD/Pr3bU5u2lZkd39d8mFJJOIOuEPcf+ZLj1YpRWM0rv/7KKBbOkR50ya6IAp/xR1gE1BEiXrw== + version "0.4.3" + resolved "https://registry.yarnpkg.com/monaco-editor-auto-typings/-/monaco-editor-auto-typings-0.4.3.tgz#24498064ff876c641467815e65d54ae75f31cd7f" + integrity sha512-7lpiWHkg8eX2DRJGApaFq1wGn95Ute3Xv4PLz36qFyTytzz86irjxwMl00JnOOGX/R0eUbfuudbEtkQh2VK9Gg== monaco-editor@^0.33.0: version "0.33.0" @@ -8637,7 +8977,7 @@ mri@^1.1.0: ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== ms@2.1.2: version "2.1.2" @@ -8649,10 +8989,10 @@ ms@2.1.3, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -multicast-dns@^7.2.4: - version "7.2.4" - resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.4.tgz#cf0b115c31e922aeb20b64e6556cbeb34cf0dd19" - integrity sha512-XkCYOU+rr2Ft3LI6w4ye51M3VK31qJXFIxu0XLw169PtKG0Zx47OrXeVW/GCYOfpC9s1yyyf1S+L8/4LY0J9Zw== +multicast-dns@^7.2.5: + version "7.2.5" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" + integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== dependencies: dns-packet "^5.2.2" thunky "^1.0.2" @@ -8662,15 +9002,20 @@ nanoclone@^0.2.1: resolved "https://registry.yarnpkg.com/nanoclone/-/nanoclone-0.2.1.tgz#dd4090f8f1a110d26bb32c49ed2f5b9235209ed4" integrity sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA== -nanoid@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.2.tgz#c89622fafb4381cd221421c69ec58547a1eec557" - integrity sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA== +nanoid@^3.3.4: + version "3.3.4" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" + integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== + +natural-compare-lite@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" + integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== negotiator@0.6.3: version "0.6.3" @@ -8713,12 +9058,12 @@ node-forge@^1: node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -node-releases@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.2.tgz#7139fe71e2f4f11b47d4d2986aaf8c48699e0c01" - integrity sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg== +node-releases@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" + integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" @@ -8728,7 +9073,7 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: normalize-range@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== normalize-url@^6.0.1: version "6.1.0" @@ -8741,9 +9086,9 @@ not@^0.1.0: integrity sha512-5PDmaAsVfnWUgTUbJ3ERwn7u79Z0dYxN9ErxCpVJJqe2RK0PJ3z+iFUxuqjwtlDDegXvtWoxD/3Fzxox7tFGWA== notistack@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/notistack/-/notistack-2.0.4.tgz#9e043991d4788bed3d1701d1b2f694233ad38dd8" - integrity sha512-kOJmKvTG91ElMzi4aHu82BDe1liQ0zMrBp+TnWJptgowDsTbeTKbZmsRqJNIj145BmlOtZsEE9xjcrN46zVo3w== + version "2.0.8" + resolved "https://registry.yarnpkg.com/notistack/-/notistack-2.0.8.tgz#78cdf34c64e311bf1d1d71c2123396bcdea5e95b" + integrity sha512-/IY14wkFp5qjPgKNvAdfL5Jp6q90+MjgKTPh4c81r/lW70KeuX6b9pE/4f8L4FG31cNudbN9siiFS5ql1aSLRw== dependencies: clsx "^1.1.0" hoist-non-react-statics "^3.3.0" @@ -8755,6 +9100,13 @@ npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" +npm-run-path@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00" + integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== + dependencies: + path-key "^4.0.0" + nth-check@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" @@ -8770,98 +9122,107 @@ nth-check@^2.0.0, nth-check@^2.0.1: boolbase "^1.0.0" nwsapi@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" - integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== + version "2.2.2" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.2.tgz#e5418863e7905df67d51ec95938d67bf801f0bb0" + integrity sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw== 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= + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-hash@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5" - integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw== +object-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== -object-inspect@^1.12.0, object-inspect@^1.9.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" - integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== +object-inspect@^1.12.2, object-inspect@^1.9.0: + version "1.12.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" + integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== object-inspect@~1.4.0: version "1.4.1" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.4.1.tgz#37ffb10e71adaf3748d05f713b4c9452f402cbc4" integrity sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw== -object-keys@^1.0.12, object-keys@^1.0.6, object-keys@^1.1.1: +object-is@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.0, object.assign@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" - integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== +object.assign@^4.1.3, object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" object-keys "^1.1.1" -object.entries@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" - integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== +object.entries@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.6.tgz#9737d0e5b8291edd340a3e3264bb8a3b00d5fa23" + integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" -object.fromentries@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251" - integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw== +object.fromentries@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73" + integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" object.getownpropertydescriptors@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz#1bd63aeacf0d5d2d2f31b5e393b03a7c601a23f7" - integrity sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ== + version "2.1.5" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz#db5a9002489b64eef903df81d6623c07e5b4b4d3" + integrity sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw== + dependencies: + array.prototype.reduce "^1.0.5" + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.hasown@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.2.tgz#f919e21fad4eb38a57bc6345b3afd496515c3f92" + integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw== + dependencies: + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.values@^1.1.0, object.values@^1.1.5, object.values@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" + integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.2" - -object.hasown@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.0.tgz#7232ed266f34d197d15cac5880232f7a4790afe5" - integrity sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.19.1" - -object.values@^1.1.0, object.values@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" - integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== dependencies: ee-first "1.1.1" @@ -8873,7 +9234,7 @@ on-headers@~1.0.2: once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" @@ -8884,6 +9245,13 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== + dependencies: + mimic-fn "^4.0.0" + open@^7.3.1: version "7.4.2" resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" @@ -8925,13 +9293,6 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.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#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -8946,13 +9307,6 @@ p-limit@^3.0.2: dependencies: yocto-queue "^0.1.0" -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= - dependencies: - p-limit "^1.1.0" - p-locate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" @@ -8982,18 +9336,13 @@ p-map@^4.0.0: aggregate-error "^3.0.0" p-retry@^4.5.0: - version "4.6.1" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.1.tgz#8fcddd5cdf7a67a0911a9cf2ef0e5df7f602316c" - integrity sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA== + version "4.6.2" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== dependencies: - "@types/retry" "^0.12.0" + "@types/retry" "0.12.0" retry "^0.13.1" -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= - p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" @@ -9002,7 +9351,7 @@ p-try@^2.0.0: pako@^0.2.5: version "0.2.9" resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" - integrity sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU= + integrity sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA== pako@^1.0.6, pako@~1.0.2: version "1.0.11" @@ -9079,7 +9428,7 @@ path-browserify@^1.0.1: path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== path-exists@^4.0.0: version "4.0.0" @@ -9089,13 +9438,18 @@ path-exists@^4.0.0: path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== 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#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + path-parse@^1.0.6, path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" @@ -9104,7 +9458,7 @@ path-parse@^1.0.6, path-parse@^1.0.7: path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== path-type@^4.0.0: version "4.0.0" @@ -9119,7 +9473,7 @@ pb-util@^1.0.3: performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== picocolors@^0.2.1: version "0.2.1" @@ -9136,10 +9490,15 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatc resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pidtree@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.5.0.tgz#ad5fbc1de78b8a5f99d6fbdd4f6e4eee21d1aca1" - integrity sha512-9nxspIM7OpZuhBxPg73Zvyq7j1QMPMPsGKTqRc2XOaFQauDvoNz9fM1Wdkjmeo7l9GXOZiRs97sPkuayl39wjA== +pidtree@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" + integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== + +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== pirates@^4.0.4: version "4.0.5" @@ -9165,21 +9524,12 @@ pluralize@^7.0.0: resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== -portfinder@^1.0.28: - version "1.0.28" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" - integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== +postcss-attribute-case-insensitive@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz#03d761b24afc04c09e757e92ff53716ae8ea2741" + integrity sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ== dependencies: - async "^2.6.2" - debug "^3.1.1" - mkdirp "^0.5.5" - -postcss-attribute-case-insensitive@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.0.tgz#39cbf6babf3ded1e4abf37d09d6eda21c644105c" - integrity sha512-b4g9eagFGq9T5SWX4+USfVyjIb3liPnjhHHRMP7FMB2kFVpYyfEscV0wP3eaXhKlcHKUut8lt5BGoeylWA/dBQ== - dependencies: - postcss-selector-parser "^6.0.2" + postcss-selector-parser "^6.0.10" postcss-browser-comments@^4: version "4.0.0" @@ -9201,24 +9551,24 @@ postcss-clamp@^4.1.0: dependencies: postcss-value-parser "^4.2.0" -postcss-color-functional-notation@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.2.tgz#f59ccaeb4ee78f1b32987d43df146109cc743073" - integrity sha512-DXVtwUhIk4f49KK5EGuEdgx4Gnyj6+t2jBSEmxvpIK9QI40tWrpS2Pua8Q7iIZWBrki2QOaeUdEaLPPa91K0RQ== +postcss-color-functional-notation@^4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz#21a909e8d7454d3612d1659e471ce4696f28caec" + integrity sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg== dependencies: postcss-value-parser "^4.2.0" -postcss-color-hex-alpha@^8.0.3: - version "8.0.3" - resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.3.tgz#61a0fd151d28b128aa6a8a21a2dad24eebb34d52" - integrity sha512-fESawWJCrBV035DcbKRPAVmy21LpoyiXdPTuHUfWJ14ZRjY7Y7PA6P4g8z6LQGYhU1WAxkTxjIjurXzoe68Glw== +postcss-color-hex-alpha@^8.0.4: + version "8.0.4" + resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz#c66e2980f2fbc1a63f5b079663340ce8b55f25a5" + integrity sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ== dependencies: postcss-value-parser "^4.2.0" -postcss-color-rebeccapurple@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.0.2.tgz#5d397039424a58a9ca628762eb0b88a61a66e079" - integrity sha512-SFc3MaocHaQ6k3oZaFwH8io6MdypkUtEy/eXzXEB1vEQlO3S3oDc/FSZA8AsS04Z25RirQhlDlHLh3dn7XewWw== +postcss-color-rebeccapurple@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz#63fdab91d878ebc4dd4b7c02619a0c3d6a56ced0" + integrity sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg== dependencies: postcss-value-parser "^4.2.0" @@ -9232,43 +9582,46 @@ postcss-colormin@^5.3.0: colord "^2.9.1" postcss-value-parser "^4.2.0" -postcss-convert-values@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.1.0.tgz#f8d3abe40b4ce4b1470702a0706343eac17e7c10" - integrity sha512-GkyPbZEYJiWtQB0KZ0X6qusqFHUepguBCNFi9t5JJc7I2OTXG7C0twbTLvCfaKOLl3rSXmpAwV7W5txd91V84g== +postcss-convert-values@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz#04998bb9ba6b65aa31035d669a6af342c5f9d393" + integrity sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA== + dependencies: + browserslist "^4.21.4" + postcss-value-parser "^4.2.0" + +postcss-custom-media@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz#c8f9637edf45fef761b014c024cee013f80529ea" + integrity sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg== dependencies: postcss-value-parser "^4.2.0" -postcss-custom-media@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz#1be6aff8be7dc9bf1fe014bde3b71b92bb4552f1" - integrity sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g== - -postcss-custom-properties@^12.1.5: - version "12.1.6" - resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-12.1.6.tgz#345b5b64c9520bb66390393646e8d5fbb7f10b58" - integrity sha512-QEnQkDkb+J+j2bfJisJJpTAFL+lUFl66rUNvnjPBIvRbZACLG4Eu5bmBCIY4FJCqhwsfbBpmJUyb3FcR/31lAg== +postcss-custom-properties@^12.1.10: + version "12.1.10" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-12.1.10.tgz#624517179fd4cf50078a7a60f628d5782e7d4903" + integrity sha512-U3BHdgrYhCrwTVcByFHs9EOBoqcKq4Lf3kXwbTi4hhq0qWhl/pDWq2THbv/ICX/Fl9KqeHBb8OVrTf2OaYF07A== dependencies: postcss-value-parser "^4.2.0" -postcss-custom-selectors@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-6.0.0.tgz#022839e41fbf71c47ae6e316cb0e6213012df5ef" - integrity sha512-/1iyBhz/W8jUepjGyu7V1OPcGbc636snN1yXEQCinb6Bwt7KxsiU7/bLQlp8GwAXzCh7cobBU5odNn/2zQWR8Q== +postcss-custom-selectors@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz#1ab4684d65f30fed175520f82d223db0337239d9" + integrity sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg== dependencies: postcss-selector-parser "^6.0.4" -postcss-dir-pseudo-class@^6.0.4: - version "6.0.4" - resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.4.tgz#9afe49ea631f0cb36fa0076e7c2feb4e7e3f049c" - integrity sha512-I8epwGy5ftdzNWEYok9VjW9whC4xnelAtbajGv4adql4FIF09rnrxnA9Y8xSHN47y7gqFIv10C5+ImsLeJpKBw== +postcss-dir-pseudo-class@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz#2bf31de5de76added44e0a25ecf60ae9f7c7c26c" + integrity sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA== dependencies: - postcss-selector-parser "^6.0.9" + postcss-selector-parser "^6.0.10" -postcss-discard-comments@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.1.1.tgz#e90019e1a0e5b99de05f63516ce640bd0df3d369" - integrity sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ== +postcss-discard-comments@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz#8df5e81d2925af2780075840c1526f0660e53696" + integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ== postcss-discard-duplicates@^5.1.0: version "5.1.0" @@ -9285,10 +9638,10 @@ postcss-discard-overridden@^5.1.0: resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e" integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== -postcss-double-position-gradients@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.1.tgz#a12cfdb7d11fa1a99ccecc747f0c19718fb37152" - integrity sha512-jM+CGkTs4FcG53sMPjrrGE0rIvLDdCrqMzgDC5fLI7JHDO7o6QG8C5TQBtExb13hdBdoH9C2QVbG4jo2y9lErQ== +postcss-double-position-gradients@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz#b96318fdb477be95997e86edd29c6e3557a49b91" + integrity sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ== dependencies: "@csstools/postcss-progressive-custom-properties" "^1.1.0" postcss-value-parser "^4.2.0" @@ -9324,18 +9677,27 @@ postcss-font-variant@^5.0.0: resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz#efd59b4b7ea8bb06127f2d031bfbb7f24d32fa66" integrity sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA== -postcss-gap-properties@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-3.0.3.tgz#6401bb2f67d9cf255d677042928a70a915e6ba60" - integrity sha512-rPPZRLPmEKgLk/KlXMqRaNkYTUpE7YC+bOIQFN5xcu1Vp11Y4faIXv6/Jpft6FMnl6YRxZqDZG0qQOW80stzxQ== +postcss-gap-properties@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz#f7e3cddcf73ee19e94ccf7cb77773f9560aa2fff" + integrity sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg== -postcss-image-set-function@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-4.0.6.tgz#bcff2794efae778c09441498f40e0c77374870a9" - integrity sha512-KfdC6vg53GC+vPd2+HYzsZ6obmPqOk6HY09kttU19+Gj1nC3S3XBVEXDHxkhxTohgZqzbUb94bKXvKDnYWBm/A== +postcss-image-set-function@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz#08353bd756f1cbfb3b6e93182c7829879114481f" + integrity sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw== dependencies: postcss-value-parser "^4.2.0" +postcss-import@^14.1.0: + version "14.1.0" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-14.1.0.tgz#a7333ffe32f0b8795303ee9e40215dac922781f0" + integrity sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + postcss-initial@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-4.0.1.tgz#529f735f72c5724a0fb30527df6fb7ac54d7de42" @@ -9348,15 +9710,15 @@ postcss-js@^4.0.0: dependencies: camelcase-css "^2.0.1" -postcss-lab-function@^4.1.2: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-4.2.0.tgz#e054e662c6480202f5760887ec1ae0d153357123" - integrity sha512-Zb1EO9DGYfa3CP8LhINHCcTTCTLI+R3t7AX2mKsDzdgVQ/GkCpHOTgOr6HBHslP7XDdVbqgHW5vvRPMdVANQ8w== +postcss-lab-function@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz#6fe4c015102ff7cd27d1bd5385582f67ebdbdc98" + integrity sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w== dependencies: "@csstools/postcss-progressive-custom-properties" "^1.1.0" postcss-value-parser "^4.2.0" -postcss-load-config@^3.1.0: +postcss-load-config@^3.1.4: version "3.1.4" resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.4.tgz#1ab2571faf84bb078877e1d07905eabe9ebda855" integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg== @@ -9383,20 +9745,20 @@ postcss-media-minmax@^5.0.0: resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz#7140bddec173e2d6d657edbd8554a55794e2a5b5" integrity sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ== -postcss-merge-longhand@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.4.tgz#0f46f8753989a33260efc47de9a0cdc571f2ec5c" - integrity sha512-hbqRRqYfmXoGpzYKeW0/NCZhvNyQIlQeWVSao5iKWdyx7skLvCfQFGIUsP9NUs3dSbPac2IC4Go85/zG+7MlmA== +postcss-merge-longhand@^5.1.7: + version "5.1.7" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz#24a1bdf402d9ef0e70f568f39bdc0344d568fb16" + integrity sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ== dependencies: postcss-value-parser "^4.2.0" - stylehacks "^5.1.0" + stylehacks "^5.1.1" -postcss-merge-rules@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.1.1.tgz#d327b221cd07540bcc8d9ff84446d8b404d00162" - integrity sha512-8wv8q2cXjEuCcgpIB1Xx1pIy8/rhMPIQqYKNzEdyx37m6gpq83mQQdCxgIkFgliyEnKvdwJf/C61vN4tQDq4Ww== +postcss-merge-rules@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.1.3.tgz#8f97679e67cc8d08677a6519afca41edf2220894" + integrity sha512-LbLd7uFC00vpOuMvyZop8+vvhnfRGpp2S+IMQKeuOZZapPRY4SMq5ErjQeHbHsjCUgJkRNrlU+LmxsKIqPKQlA== dependencies: - browserslist "^4.16.6" + browserslist "^4.21.4" caniuse-api "^3.0.0" cssnano-utils "^3.1.0" postcss-selector-parser "^6.0.5" @@ -9417,19 +9779,19 @@ postcss-minify-gradients@^5.1.1: cssnano-utils "^3.1.0" postcss-value-parser "^4.2.0" -postcss-minify-params@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.1.2.tgz#77e250780c64198289c954884ebe3ee4481c3b1c" - integrity sha512-aEP+p71S/urY48HWaRHasyx4WHQJyOYaKpQ6eXl8k0kxg66Wt/30VR6/woh8THgcpRbonJD5IeD+CzNhPi1L8g== +postcss-minify-params@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz#c06a6c787128b3208b38c9364cfc40c8aa5d7352" + integrity sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw== dependencies: - browserslist "^4.16.6" + browserslist "^4.21.4" cssnano-utils "^3.1.0" postcss-value-parser "^4.2.0" -postcss-minify-selectors@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.0.tgz#17c2be233e12b28ffa8a421a02fc8b839825536c" - integrity sha512-vYxvHkW+iULstA+ctVNx0VoRAR4THQQRkG77o0oa4/mBS0OzGvvzLIvHDv/nNEM0crzN2WIyFU5X7wZhaUK3RA== +postcss-minify-selectors@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz#d4e7e6b46147b8117ea9325a915a801d5fe656c6" + integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg== dependencies: postcss-selector-parser "^6.0.5" @@ -9461,18 +9823,19 @@ postcss-modules-values@^4.0.0: dependencies: icss-utils "^5.0.0" -postcss-nested@5.0.6: - version "5.0.6" - resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-5.0.6.tgz#466343f7fc8d3d46af3e7dba3fcd47d052a945bc" - integrity sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA== +postcss-nested@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.0.tgz#1572f1984736578f360cffc7eb7dca69e30d1735" + integrity sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w== dependencies: - postcss-selector-parser "^6.0.6" + postcss-selector-parser "^6.0.10" -postcss-nesting@^10.1.3: - version "10.1.4" - resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-10.1.4.tgz#80de9d1c2717bc44df918dd7f118929300192a7a" - integrity sha512-2ixdQ59ik/Gt1+oPHiI1kHdwEI8lLKEmui9B1nl6163ANLC+GewQn7fXMxJF2JSb4i2MKL96GU8fIiQztK4TTA== +postcss-nesting@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-10.2.0.tgz#0b12ce0db8edfd2d8ae0aaf86427370b898890be" + integrity sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA== dependencies: + "@csstools/selector-specificity" "^2.0.0" postcss-selector-parser "^6.0.10" postcss-normalize-charset@^5.1.0: @@ -9487,17 +9850,17 @@ postcss-normalize-display-values@^5.1.0: dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-positions@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.0.tgz#902a7cb97cf0b9e8b1b654d4a43d451e48966458" - integrity sha512-8gmItgA4H5xiUxgN/3TVvXRoJxkAWLW6f/KKhdsH03atg0cB8ilXnrB5PpSshwVu/dD2ZsRFQcR1OEmSBDAgcQ== +postcss-normalize-positions@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz#ef97279d894087b59325b45c47f1e863daefbb92" + integrity sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg== dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-repeat-style@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.0.tgz#f6d6fd5a54f51a741cc84a37f7459e60ef7a6398" - integrity sha512-IR3uBjc+7mcWGL6CtniKNQ4Rr5fTxwkaDHwMBDGGs1x9IVRkYIT/M4NelZWkAOBdV6v3Z9S46zqaKGlyzHSchw== +postcss-normalize-repeat-style@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz#e9eb96805204f4766df66fd09ed2e13545420fb2" + integrity sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g== dependencies: postcss-value-parser "^4.2.0" @@ -9515,12 +9878,12 @@ postcss-normalize-timing-functions@^5.1.0: dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-unicode@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz#3d23aede35e160089a285e27bf715de11dc9db75" - integrity sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ== +postcss-normalize-unicode@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz#f67297fca3fea7f17e0d2caa40769afc487aa030" + integrity sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA== dependencies: - browserslist "^4.16.6" + browserslist "^4.21.4" postcss-value-parser "^4.2.0" postcss-normalize-url@^5.1.0: @@ -9552,93 +9915,101 @@ postcss-opacity-percentage@^1.1.2: resolved "https://registry.yarnpkg.com/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.2.tgz#bd698bb3670a0a27f6d657cc16744b3ebf3b1145" integrity sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w== -postcss-ordered-values@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.1.1.tgz#0b41b610ba02906a3341e92cab01ff8ebc598adb" - integrity sha512-7lxgXF0NaoMIgyihL/2boNAEZKiW0+HkMhdKMTD93CjW8TdCy2hSdj8lsAo+uwm7EDG16Da2Jdmtqpedl0cMfw== +postcss-ordered-values@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz#b6fd2bd10f937b23d86bc829c69e7732ce76ea38" + integrity sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ== dependencies: cssnano-utils "^3.1.0" postcss-value-parser "^4.2.0" -postcss-overflow-shorthand@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.3.tgz#ebcfc0483a15bbf1b27fdd9b3c10125372f4cbc2" - integrity sha512-CxZwoWup9KXzQeeIxtgOciQ00tDtnylYIlJBBODqkgS/PU2jISuWOL/mYLHmZb9ZhZiCaNKsCRiLp22dZUtNsg== +postcss-overflow-shorthand@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz#7ed6486fec44b76f0eab15aa4866cda5d55d893e" + integrity sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A== + dependencies: + postcss-value-parser "^4.2.0" postcss-page-break@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-3.0.4.tgz#7fbf741c233621622b68d435babfb70dd8c1ee5f" integrity sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ== -postcss-place@^7.0.4: - version "7.0.4" - resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-7.0.4.tgz#eb026650b7f769ae57ca4f938c1addd6be2f62c9" - integrity sha512-MrgKeiiu5OC/TETQO45kV3npRjOFxEHthsqGtkh3I1rPbZSbXGD/lZVi9j13cYh+NA8PIAPyk6sGjT9QbRyvSg== +postcss-place@^7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-7.0.5.tgz#95dbf85fd9656a3a6e60e832b5809914236986c4" + integrity sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g== dependencies: postcss-value-parser "^4.2.0" postcss-preset-env@^7.0.1: - version "7.4.3" - resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-7.4.3.tgz#fb1c8b4cb405da042da0ddb8c5eda7842c08a449" - integrity sha512-dlPA65g9KuGv7YsmGyCKtFkZKCPLkoVMUE3omOl6yM+qrynVHxFvf0tMuippIrXB/sB/MyhL1FgTIbrO+qMERg== + version "7.8.3" + resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz#2a50f5e612c3149cc7af75634e202a5b2ad4f1e2" + integrity sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag== dependencies: - "@csstools/postcss-color-function" "^1.0.3" - "@csstools/postcss-font-format-keywords" "^1.0.0" - "@csstools/postcss-hwb-function" "^1.0.0" - "@csstools/postcss-ic-unit" "^1.0.0" - "@csstools/postcss-is-pseudo-class" "^2.0.1" - "@csstools/postcss-normalize-display-values" "^1.0.0" - "@csstools/postcss-oklab-function" "^1.0.2" + "@csstools/postcss-cascade-layers" "^1.1.1" + "@csstools/postcss-color-function" "^1.1.1" + "@csstools/postcss-font-format-keywords" "^1.0.1" + "@csstools/postcss-hwb-function" "^1.0.2" + "@csstools/postcss-ic-unit" "^1.0.1" + "@csstools/postcss-is-pseudo-class" "^2.0.7" + "@csstools/postcss-nested-calc" "^1.0.0" + "@csstools/postcss-normalize-display-values" "^1.0.1" + "@csstools/postcss-oklab-function" "^1.1.1" "@csstools/postcss-progressive-custom-properties" "^1.3.0" - autoprefixer "^10.4.4" - browserslist "^4.20.2" + "@csstools/postcss-stepped-value-functions" "^1.0.1" + "@csstools/postcss-text-decoration-shorthand" "^1.0.0" + "@csstools/postcss-trigonometric-functions" "^1.0.2" + "@csstools/postcss-unset-value" "^1.0.2" + autoprefixer "^10.4.13" + browserslist "^4.21.4" css-blank-pseudo "^3.0.3" css-has-pseudo "^3.0.4" css-prefers-color-scheme "^6.0.3" - cssdb "^6.5.0" - postcss-attribute-case-insensitive "^5.0.0" + cssdb "^7.1.0" + postcss-attribute-case-insensitive "^5.0.2" postcss-clamp "^4.1.0" - postcss-color-functional-notation "^4.2.2" - postcss-color-hex-alpha "^8.0.3" - postcss-color-rebeccapurple "^7.0.2" - postcss-custom-media "^8.0.0" - postcss-custom-properties "^12.1.5" - postcss-custom-selectors "^6.0.0" - postcss-dir-pseudo-class "^6.0.4" - postcss-double-position-gradients "^3.1.1" + postcss-color-functional-notation "^4.2.4" + postcss-color-hex-alpha "^8.0.4" + postcss-color-rebeccapurple "^7.1.1" + postcss-custom-media "^8.0.2" + postcss-custom-properties "^12.1.10" + postcss-custom-selectors "^6.0.3" + postcss-dir-pseudo-class "^6.0.5" + postcss-double-position-gradients "^3.1.2" postcss-env-function "^4.0.6" postcss-focus-visible "^6.0.4" postcss-focus-within "^5.0.4" postcss-font-variant "^5.0.0" - postcss-gap-properties "^3.0.3" - postcss-image-set-function "^4.0.6" + postcss-gap-properties "^3.0.5" + postcss-image-set-function "^4.0.7" postcss-initial "^4.0.1" - postcss-lab-function "^4.1.2" + postcss-lab-function "^4.2.1" postcss-logical "^5.0.4" postcss-media-minmax "^5.0.0" - postcss-nesting "^10.1.3" + postcss-nesting "^10.2.0" postcss-opacity-percentage "^1.1.2" - postcss-overflow-shorthand "^3.0.3" + postcss-overflow-shorthand "^3.0.4" postcss-page-break "^3.0.4" - postcss-place "^7.0.4" - postcss-pseudo-class-any-link "^7.1.1" + postcss-place "^7.0.5" + postcss-pseudo-class-any-link "^7.1.6" postcss-replace-overflow-wrap "^4.0.0" - postcss-selector-not "^5.0.0" + postcss-selector-not "^6.0.1" postcss-value-parser "^4.2.0" -postcss-pseudo-class-any-link@^7.1.1: - version "7.1.2" - resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.2.tgz#81ec491aa43f97f9015e998b7a14263b4630bdf0" - integrity sha512-76XzEQv3g+Vgnz3tmqh3pqQyRojkcJ+pjaePsyhcyf164p9aZsu3t+NWxkZYbcHLK1ju5Qmalti2jPI5IWCe5w== +postcss-pseudo-class-any-link@^7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz#2693b221902da772c278def85a4d9a64b6e617ab" + integrity sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w== dependencies: postcss-selector-parser "^6.0.10" -postcss-reduce-initial@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz#fc31659ea6e85c492fb2a7b545370c215822c5d6" - integrity sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw== +postcss-reduce-initial@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.1.tgz#c18b7dfb88aee24b1f8e4936541c29adbd35224e" + integrity sha512-//jeDqWcHPuXGZLoolFrUXBDyuEGbr9S2rMo19bkTIjBQ4PqkaO+oI8wua5BOUxpfi97i3PCoInsiFIEBfkm9w== dependencies: - browserslist "^4.16.6" + browserslist "^4.21.4" caniuse-api "^3.0.0" postcss-reduce-transforms@^5.1.0: @@ -9653,17 +10024,17 @@ postcss-replace-overflow-wrap@^4.0.0: resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz#d2df6bed10b477bf9c52fab28c568b4b29ca4319" integrity sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw== -postcss-selector-not@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-5.0.0.tgz#ac5fc506f7565dd872f82f5314c0f81a05630dc7" - integrity sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ== +postcss-selector-not@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz#8f0a709bf7d4b45222793fc34409be407537556d" + integrity sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ== dependencies: - balanced-match "^1.0.0" + postcss-selector-parser "^6.0.10" -postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.6, postcss-selector-parser@^6.0.9: - version "6.0.10" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" - integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== +postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: + version "6.0.11" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz#2e41dc39b7ad74046e1615185185cd0b17d0c8dc" + integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -9683,7 +10054,7 @@ postcss-unique-selectors@^5.1.1: dependencies: postcss-selector-parser "^6.0.5" -postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: +postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== @@ -9696,12 +10067,12 @@ postcss@^7.0.35: picocolors "^0.2.1" source-map "^0.6.1" -postcss@^8.3.5, postcss@^8.4.4, postcss@^8.4.6, postcss@^8.4.7: - version "8.4.12" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.12.tgz#1e7de78733b28970fa4743f7da6f3763648b1905" - integrity sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg== +postcss@^8.3.5, postcss@^8.4.18, postcss@^8.4.4: + version "8.4.19" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.19.tgz#61178e2add236b17351897c8bcc0b4c8ecab56fc" + integrity sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA== dependencies: - nanoid "^3.3.1" + nanoid "^3.3.4" picocolors "^1.0.0" source-map-js "^1.0.2" @@ -9713,12 +10084,12 @@ prelude-ls@^1.2.1: prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== prettier@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.2.tgz#e26d71a18a74c3d0f0597f55f01fb6c06c206032" - integrity sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew== + version "2.8.0" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.0.tgz#c7df58393c9ba77d6fba3921ae01faf994fb9dc9" + integrity sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA== pretty-bytes@^5.3.0, pretty-bytes@^5.4.1: version "5.6.0" @@ -9742,10 +10113,29 @@ pretty-format@^27.0.0, pretty-format@^27.0.2, pretty-format@^27.5.1: ansi-styles "^5.0.0" react-is "^17.0.1" +pretty-format@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.3.tgz#c9fba8cedf99ce50963a11b27d982a9ae90970d5" + integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q== + dependencies: + "@jest/schemas" "^28.1.3" + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +pretty-format@^29.0.0, pretty-format@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.3.1.tgz#1841cac822b02b4da8971dacb03e8a871b4722da" + integrity sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg== + dependencies: + "@jest/schemas" "^29.0.0" + ansi-styles "^5.0.0" + react-is "^18.0.0" + process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" - integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= + integrity sha512-yN0WQmuCX63LP/TMvAg31nvT6m4vDqJEiiv2CAZqWOGNWutc9DfDk1NPYYmKUFmaVM2UwDowH4u5AHWYP/jxKw== process-nextick-args@~2.0.0: version "2.0.1" @@ -9760,9 +10150,9 @@ promise@^7.1.1: asap "~2.0.3" promise@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/promise/-/promise-8.1.0.tgz#697c25c3dfe7435dd79fcd58c38a135888eaf05e" - integrity sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q== + version "8.3.0" + resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" + integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== dependencies: asap "~2.0.6" @@ -9789,9 +10179,9 @@ property-expr@^2.0.4: integrity sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA== property-information@^6.0.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.1.1.tgz#5ca85510a3019726cb9afed4197b7b8ac5926a22" - integrity sha512-hrzC564QIl0r0vy4l6MvRLhafmUowhO/O3KgVSoXIbbA2Sz4j8HGpJc6T2cubRVwMwpdiG/vKGfhT4IixmKN9w== + version "6.2.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.2.0.tgz#b74f522c31c097b5149e3c3cb8d7f3defd986a1d" + integrity sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg== protobufjs@^6.11.3: version "6.11.3" @@ -9812,6 +10202,24 @@ protobufjs@^6.11.3: "@types/node" ">=13.7.0" long "^4.0.0" +protobufjs@^7.0.0: + version "7.1.2" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.1.2.tgz#a0cf6aeaf82f5625bffcf5a38b7cd2a7de05890c" + integrity sha512-4ZPTPkXCdel3+L81yw3dG6+Kq3umdWKh7Dc7GW/CpNk4SX3hK58iPCWeCyhVTDrbkNeKrYNZ7EojM5WDaEWTLQ== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/node" ">=13.7.0" + long "^5.0.0" + proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" @@ -9821,9 +10229,9 @@ proxy-addr@~2.0.7: ipaddr.js "1.9.1" psl@^1.1.33: - version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" @@ -9833,17 +10241,24 @@ punycode@^2.1.0, punycode@^2.1.1: pure-color@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/pure-color/-/pure-color-1.3.0.tgz#1fe064fb0ac851f0de61320a8bf796836422f33e" - integrity sha1-H+Bk+wrIUfDeYTIKi/eWg2Qi8z4= + integrity sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA== q@^1.1.2: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== -qs@6.9.7: - version "6.9.7" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.7.tgz#4610846871485e1e048f44ae3b94033f0e675afe" - integrity sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw== +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== queue-microtask@^1.2.2: version "1.2.3" @@ -9856,9 +10271,9 @@ quick-lru@^5.1.1: integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== quicktype-core@^6.0.71: - version "6.0.71" - resolved "https://registry.yarnpkg.com/quicktype-core/-/quicktype-core-6.0.71.tgz#01e9cf870a4d57112a4f0678835902bdd2f45934" - integrity sha512-NqyPyMhKFUzDKxk5+omV165x2HfxgAMuKaImjuUY3X0CSREBU7p3Bo2uXCMr16bdghpmc/dXOz4ZXvzayQritg== + version "6.1.0" + resolved "https://registry.yarnpkg.com/quicktype-core/-/quicktype-core-6.1.0.tgz#d190dbf79bf424ebcfca92b3437daf8cf096b7f3" + integrity sha512-r5+sRrUBX5RSdNNG2zpYD706Lxsq/0Tvh7te52csKrKKcAGGcSd1mx4sWWjhnBc54I0ZkrLHk/urIWwCDihgMg== dependencies: "@mark.probst/unicode-properties" "~1.1.0" browser-or-node "^1.2.1" @@ -9876,7 +10291,7 @@ quicktype-core@^6.0.71: quote-stream@^1.0.1, quote-stream@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/quote-stream/-/quote-stream-1.0.2.tgz#84963f8c9c26b942e153feeb53aae74652b7e0b2" - integrity sha1-hJY/jJwmuULhU/7rU6rnRlK34LI= + integrity sha512-kKr2uQ2AokadPjvTyKJQad9xELbZwYzWlNfI3Uz2j/ib5u6H9lDP7fUUR//rMycd0gv4Z5P1qXMfXR8YpIxrjQ== dependencies: buffer-equal "0.0.1" minimist "^1.1.3" @@ -9906,13 +10321,13 @@ range-parser@^1.2.1, range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.3.tgz#8f80305d11c2a0a545c2d9d89d7a0286fcead43c" - integrity sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g== +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== dependencies: bytes "3.1.2" - http-errors "1.8.1" + http-errors "2.0.0" iconv-lite "0.4.24" unpipe "1.0.0" @@ -9939,7 +10354,7 @@ react-app-polyfill@^3.0.0: react-base16-styling@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/react-base16-styling/-/react-base16-styling-0.6.0.tgz#ef2156d66cf4139695c8a167886cb69ea660792c" - integrity sha1-7yFW1mz0E5aVyKFniGy2nqZgeSw= + integrity sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ== dependencies: base16 "^1.0.0" lodash.curry "^4.0.1" @@ -9947,9 +10362,9 @@ react-base16-styling@^0.6.0: pure-color "^1.2.0" react-beautiful-dnd@^13.1.0: - version "13.1.0" - resolved "https://registry.yarnpkg.com/react-beautiful-dnd/-/react-beautiful-dnd-13.1.0.tgz#ec97c81093593526454b0de69852ae433783844d" - integrity sha512-aGvblPZTJowOWUNiwd6tNfEpgkX5OxmpqxHKNW/4VmvZTNTbeiq7bA3bn5T+QSF2uibXB0D1DmJsb1aC/+3cUA== + version "13.1.1" + resolved "https://registry.yarnpkg.com/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz#b0f3087a5840920abf8bb2325f1ffa46d8c4d0a2" + integrity sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ== dependencies: "@babel/runtime" "^7.9.2" css-box-model "^1.2.0" @@ -9969,10 +10384,10 @@ react-detect-offline@^2.4.5: resolved "https://registry.yarnpkg.com/react-detect-offline/-/react-detect-offline-2.4.5.tgz#3c242516c37b6789cf89102881031f87e70b80e6" integrity sha512-sI13NPEKl3uQp95FT5CwrYzH3DnXCwNP6TnY6NRF5gFDM4NU9KDlbtA6HG2dwhDVS0RYQGXwZW/mHbdf8fCnaw== -react-dev-utils@^12.0.0: - version "12.0.0" - resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-12.0.0.tgz#4eab12cdb95692a077616770b5988f0adf806526" - integrity sha512-xBQkitdxozPxt1YZ9O1097EJiVpwHr9FoAuEVURCKV0Av8NBERovJauzP7bo1ThvuhZ4shsQ1AJiu4vQpoT1AQ== +react-dev-utils@^12.0.1: + version "12.0.1" + resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-12.0.1.tgz#ba92edb4a1f379bd46ccd6bcd4e7bc398df33e73" + integrity sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ== dependencies: "@babel/code-frame" "^7.16.0" address "^1.1.2" @@ -9993,7 +10408,7 @@ react-dev-utils@^12.0.0: open "^8.4.0" pkg-up "^3.1.0" prompts "^2.4.2" - react-error-overlay "^6.0.10" + react-error-overlay "^6.0.11" recursive-readdir "^2.2.2" shell-quote "^1.7.3" strip-ansi "^6.0.1" @@ -10040,13 +10455,13 @@ react-dnd@^16.0.1: fast-deep-equal "^3.1.3" hoist-non-react-statics "^3.3.2" -react-dom@^18.0.0: - version "18.0.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.0.0.tgz#26b88534f8f1dbb80853e1eabe752f24100d8023" - integrity sha512-XqX7uzmFo0pUceWFCt7Gff6IyIMzFUn7QMZrbrQfGxtaxXZIcGQzoNpRLE3fQLnS4XzLLPMZX2T9TRcSrasicw== +react-dom@^18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== dependencies: loose-envify "^1.1.0" - scheduler "^0.21.0" + scheduler "^0.23.0" react-dropzone@^10: version "10.2.2" @@ -10069,10 +10484,10 @@ react-error-boundary@^3.1.4: dependencies: "@babel/runtime" "^7.12.5" -react-error-overlay@^6.0.10: - version "6.0.10" - resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.10.tgz#0fe26db4fa85d9dbb8624729580e90e7159a59a6" - integrity sha512-mKR90fX7Pm5seCOfz8q9F+66VCc1PGsWSBxKbITjfKVQHMNF2zudxHnMdJiB1fRCb+XsbQV9sO9DCkgsMQgBIA== +react-error-overlay@^6.0.11: + version "6.0.11" + resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb" + integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== react-fast-compare@^3.2.0: version "3.2.0" @@ -10091,9 +10506,9 @@ react-helmet-async@^1.3.0: shallowequal "^1.1.0" react-hook-form@^7.10.0, react-hook-form@^7.30.0: - version "7.30.0" - resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.30.0.tgz#c9e2fd54d3627e43bd94bf38ef549df2e80c1371" - integrity sha512-DzjiM6o2vtDGNMB9I4yCqW8J21P314SboNG1O0obROkbg7KVS0I7bMtwSdKyapnCPjHgnxc3L7E5PEdISeEUcQ== + version "7.39.7" + resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.39.7.tgz#8eabf2dbb9fce5baccfa60f401f6ef99c4e17fb4" + integrity sha512-RT0NE1uW1bY3nAuMdzfqHrpv2+sICVFaxBOvNJsCva4if2sxPxcyJy/CSqU56UXqAdRg724CNDhjMYPSHSF3rg== react-image@^4: version "4.0.3" @@ -10152,9 +10567,9 @@ react-markdown@^8.0.3, react-markdown@~8.0.0: vfile "^5.0.0" react-redux@^7.2.0: - version "7.2.8" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.8.tgz#a894068315e65de5b1b68899f9c6ee0923dd28de" - integrity sha512-6+uDjhs3PSIclqoCk0kd6iX74gzrGc3W5zcAjbrFgEdIjRSQObdIwfx80unTkVUYvbQ95Y8Av3OvFHq1w5EOUw== + version "7.2.9" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.9.tgz#09488fbb9416a4efe3735b7235055442b042481d" + integrity sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ== dependencies: "@babel/runtime" "^7.15.4" "@types/react-redux" "^7.1.20" @@ -10169,12 +10584,12 @@ react-refresh@^0.11.0: integrity sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A== react-router-dom@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.3.0.tgz#a0216da813454e521905b5fa55e0e5176123f43d" - integrity sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw== + version "6.4.3" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.4.3.tgz#70093b5f65f85f1df9e5d4182eb7ff3a08299275" + integrity sha512-MiaYQU8CwVCaOfJdYvt84KQNjT78VF0TJrA17SIQgNHRvLnXDJO6qsFqq8F/zzB1BWZjCFIrQpu4QxcshitziQ== dependencies: - history "^5.2.0" - react-router "6.3.0" + "@remix-run/router" "1.0.3" + react-router "6.4.3" react-router-hash-link@^2.4.3: version "2.4.3" @@ -10183,17 +10598,17 @@ react-router-hash-link@^2.4.3: dependencies: prop-types "^15.7.2" -react-router@6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.3.0.tgz#3970cc64b4cb4eae0c1ea5203a80334fdd175557" - integrity sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ== +react-router@6.4.3: + version "6.4.3" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.4.3.tgz#9ed3ee4d6e95889e9b075a5d63e29acc7def0d49" + integrity sha512-BT6DoGn6aV1FVP5yfODMOiieakp3z46P1Fk0RNzJMACzE7C339sFuHebfvWtnB4pzBvXXkHP2vscJzWRuUjTtA== dependencies: - history "^5.2.0" + "@remix-run/router" "1.0.3" -react-scripts@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-5.0.0.tgz#6547a6d7f8b64364ef95273767466cc577cb4b60" - integrity sha512-3i0L2CyIlROz7mxETEdfif6Sfhh9Lfpzi10CtcGs1emDQStmZfWjJbAIMtRD0opVUjQuFWqHZyRZ9PPzKCFxWg== +react-scripts@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-5.0.1.tgz#6285dbd65a8ba6e49ca8d651ce30645a6d980003" + integrity sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ== dependencies: "@babel/core" "^7.16.0" "@pmmmwh/react-refresh-webpack-plugin" "^0.5.3" @@ -10211,7 +10626,7 @@ react-scripts@^5.0.0: dotenv "^10.0.0" dotenv-expand "^5.1.0" eslint "^8.3.0" - eslint-config-react-app "^7.0.0" + eslint-config-react-app "^7.0.1" eslint-webpack-plugin "^3.1.1" file-loader "^6.2.0" fs-extra "^10.0.0" @@ -10228,7 +10643,7 @@ react-scripts@^5.0.0: postcss-preset-env "^7.0.1" prompts "^2.4.2" react-app-polyfill "^3.0.0" - react-dev-utils "^12.0.0" + react-dev-utils "^12.0.1" react-refresh "^0.11.0" resolve "^1.20.0" resolve-url-loader "^4.0.0" @@ -10246,18 +10661,18 @@ react-scripts@^5.0.0: fsevents "^2.3.2" react-textarea-autosize@^8.3.2: - version "8.3.4" - resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.3.4.tgz#270a343de7ad350534141b02c9cb78903e553524" - integrity sha512-CdtmP8Dc19xL8/R6sWvtknD/eCXkQr30dtvC4VmGInhRsfF8X/ihXCq6+9l9qbxmKRiq407/7z5fxE7cVWQNgQ== + version "8.4.0" + resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.4.0.tgz#4d0244d6a50caa897806b8c44abc0540a69bfc8c" + integrity sha512-YrTFaEHLgJsi8sJVYHBzYn+mkP3prGkmP2DKb/tm0t7CLJY5t1Rxix8070LAKb0wby7bl/lf2EeHkuMihMZMwQ== dependencies: "@babel/runtime" "^7.10.2" use-composed-ref "^1.3.0" use-latest "^1.2.1" -react-transition-group@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.2.tgz#8b59a56f09ced7b55cbd53c36768b922890d5470" - integrity sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg== +react-transition-group@^4.4.5: + version "4.4.5" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" + integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== dependencies: "@babel/runtime" "^7.5.5" dom-helpers "^5.0.1" @@ -10276,13 +10691,20 @@ react-virtual@^2.10.4: dependencies: "@reach/observe-rect" "^1.1.0" -react@^18.0.0: - version "18.0.0" - resolved "https://registry.yarnpkg.com/react/-/react-18.0.0.tgz#b468736d1f4a5891f38585ba8e8fb29f91c3cb96" - integrity sha512-x+VL6wbT4JRVPm7EGxXhZ8w8LTROaxPXOqhlGyVSrv0sB1jkyFGgXxJ8LVoPRLvPR6/CIZGFmfzqUa2NYeMr2A== +react@^18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== dependencies: loose-envify "^1.1.0" +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== + dependencies: + pify "^2.3.0" + readable-stream@2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.0.tgz#640f5dcda88c91a8dc60787145629170813a1ed2" @@ -10326,11 +10748,11 @@ readdirp@~3.6.0: picomatch "^2.2.1" recursive-readdir@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" - integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg== + version "2.2.3" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" + integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== dependencies: - minimatch "3.0.4" + minimatch "^3.0.5" redent@^3.0.0: version "3.0.0" @@ -10347,20 +10769,20 @@ redux@^4.0.0, redux@^4.0.4, redux@^4.1.1, redux@^4.2.0: dependencies: "@babel/runtime" "^7.9.2" -refractor@^4.5.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/refractor/-/refractor-4.7.0.tgz#aad649d7857acdc0d5792f1a7900867256941ac0" - integrity sha512-X3JUDE7nq1csWs7Etg5v7hW10RzF4lYesEn/KDbllocj0itZrs3paO2ZEgYUXrlgXzY3IN+eDRByyIvzcfF9Tg== +refractor@^4.7.0: + version "4.8.0" + resolved "https://registry.yarnpkg.com/refractor/-/refractor-4.8.0.tgz#ed56963d66765ac4f304bf9f16e901c5642164d2" + integrity sha512-SVOnWUJiEBFNiBlHbudSpSpDfDhDY1UHF0CMKgdvPsMYNQQ4rnqFxyGvP07UmteNC8V12mTF2c0lEsGS7lKaGw== dependencies: "@types/hast" "^2.0.0" "@types/prismjs" "^1.0.0" hastscript "^7.0.0" parse-entities "^4.0.0" -regenerate-unicode-properties@^10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz#7f442732aa7934a3740c779bb9b3340dccc1fb56" - integrity sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw== +regenerate-unicode-properties@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" + integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== dependencies: regenerate "^1.4.2" @@ -10369,15 +10791,15 @@ regenerate@^1.4.2: resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== -regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.9: - version "0.13.9" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" - integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== +regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.9: + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== -regenerator-transform@^0.15.0: - version "0.15.0" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.0.tgz#cbd9ead5d77fae1a48d957cf889ad0586adb6537" - integrity sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg== +regenerator-transform@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" + integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== dependencies: "@babel/runtime" "^7.8.4" @@ -10386,40 +10808,41 @@ regex-parser@^2.2.11: resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== -regexp.prototype.flags@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz#b3f4c0059af9e47eca9f3f660e51d81307e72307" - integrity sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ== +regexp.prototype.flags@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" + integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== dependencies: call-bind "^1.0.2" define-properties "^1.1.3" + functions-have-names "^1.2.2" regexpp@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== -regexpu-core@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.0.1.tgz#c531122a7840de743dcf9c83e923b5560323ced3" - integrity sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw== +regexpu-core@^5.2.1: + version "5.2.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.2.2.tgz#3e4e5d12103b64748711c3aad69934d7718e75fc" + integrity sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw== dependencies: regenerate "^1.4.2" - regenerate-unicode-properties "^10.0.1" - regjsgen "^0.6.0" - regjsparser "^0.8.2" + regenerate-unicode-properties "^10.1.0" + regjsgen "^0.7.1" + regjsparser "^0.9.1" unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" -regjsgen@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.6.0.tgz#83414c5354afd7d6627b16af5f10f41c4e71808d" - integrity sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA== +regjsgen@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.7.1.tgz#ee5ef30e18d3f09b7c369b76e7c2373ed25546f6" + integrity sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA== -regjsparser@^0.8.2: - version "0.8.4" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.8.4.tgz#8a14285ffcc5de78c5b95d62bbf413b6bc132d5f" - integrity sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA== +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== dependencies: jsesc "~0.5.0" @@ -10444,6 +10867,15 @@ rehype-autolink-headings@~6.1.1: unified "^10.0.0" unist-util-visit "^4.0.0" +rehype-ignore@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/rehype-ignore/-/rehype-ignore-1.0.3.tgz#0bc78cf2e82d8b12069e37f0944acf8509d8c95e" + integrity sha512-N8eAcq9+QUFhTZqB4oxJ8WL1D2EWp+Jr+j6DKlV21j8+TBLkPdotWNPSzo4FNJbIy6SWxjS/dgDpHmJm8YD6XQ== + dependencies: + hast-util-select "~5.0.1" + unified "~10.1.2" + unist-util-visit "~4.1.0" + rehype-parse@^8.0.0, rehype-parse@^8.0.2: version "8.0.4" resolved "https://registry.yarnpkg.com/rehype-parse/-/rehype-parse-8.0.4.tgz#3d17c9ff16ddfef6bbcc8e6a25a99467b482d688" @@ -10454,19 +10886,19 @@ rehype-parse@^8.0.0, rehype-parse@^8.0.2: parse5 "^6.0.0" unified "^10.0.0" -rehype-prism-plus@~1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/rehype-prism-plus/-/rehype-prism-plus-1.3.2.tgz#4ee433200a44b779afa919b48e186f89a9648330" - integrity sha512-fQXzzMpQu+XM/GUsT0GdwfU8gwpUJ1QjE0BLrMjuULkpFW6/GViNvUJKtIiYc9/uSh6k33CB0YbSa90Bs6R3TQ== +rehype-prism-plus@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/rehype-prism-plus/-/rehype-prism-plus-1.5.0.tgz#113aae19687c0f8faf6f5fb16964ff1527d130d7" + integrity sha512-KNJYMQHqN+53ZbT5Pa/lO7uorMpBIR3x9RjFeG1lPlQherZDZiPqyOFS464L4BniZ4VG5PnG5DXVqjGtwxWJew== dependencies: hast-util-to-string "^2.0.0" parse-numeric-range "^1.3.0" - refractor "^4.5.0" + refractor "^4.7.0" rehype-parse "^8.0.2" unist-util-filter "^4.0.0" unist-util-visit "^4.0.0" -rehype-raw@~6.1.1: +rehype-raw@^6.1.1: version "6.1.1" resolved "https://registry.yarnpkg.com/rehype-raw/-/rehype-raw-6.1.1.tgz#81bbef3793bd7abacc6bf8335879d1b6c868c9d4" integrity sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ== @@ -10484,15 +10916,6 @@ rehype-rewrite@~3.0.6: unified "~10.1.1" unist-util-visit "~4.1.0" -rehype-sanitize@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/rehype-sanitize/-/rehype-sanitize-5.0.1.tgz#dac01a7417bdd329260c74c74449697b4be5eb56" - integrity sha512-da/jIOjq8eYt/1r9GN6GwxIR3gde7OZ+WV8pheu1tL8K0D9KxM2AyMh+UEfke+FfdM3PvGHeYJU0Td5OWa7L5A== - dependencies: - "@types/hast" "^2.0.0" - hast-util-sanitize "^4.0.0" - unified "^10.0.0" - rehype-slug@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/rehype-slug/-/rehype-slug-5.0.1.tgz#6e732d0c55b3b1e34187e74b7363fb53229e5f52" @@ -10528,7 +10951,7 @@ rehype@~12.0.1: relateurl@^0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" - integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= + integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== remark-gfm@^3.0.1, remark-gfm@~3.0.1: version "3.0.1" @@ -10562,7 +10985,7 @@ remark-rehype@^10.0.0: remove-accents@0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/remove-accents/-/remove-accents-0.4.2.tgz#0a43d3aaae1e80db919e07ae254b285d9e1c7bb5" - integrity sha1-CkPTqq4egNuRngeuJUsoXZ4ce7U= + integrity sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA== renderkid@^3.0.0: version "3.0.0" @@ -10578,7 +11001,7 @@ renderkid@^3.0.0: require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== require-from-string@^2.0.2: version "2.0.2" @@ -10588,7 +11011,7 @@ require-from-string@^2.0.2: requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== resolve-cwd@^3.0.0: version "3.0.0" @@ -10623,22 +11046,23 @@ resolve.exports@^1.1.0: resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== -resolve@^1.1.5, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.0: - version "1.22.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" - integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== +resolve@^1.1.5, resolve@^1.1.7, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.22.1: + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== dependencies: - is-core-module "^2.8.1" + is-core-module "^2.9.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" resolve@^2.0.0-next.3: - version "2.0.0-next.3" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46" - integrity sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q== + version "2.0.0-next.4" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" + integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" resolve@~1.19.0: version "1.19.0" @@ -10701,9 +11125,9 @@ rollup-plugin-terser@^7.0.0: terser "^5.0.0" rollup@^2.43.1: - version "2.70.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.70.1.tgz#824b1f1f879ea396db30b0fc3ae8d2fead93523e" - integrity sha512-CRYsI5EuzLbXdxC6RnYhOuRdtz4bhejPMSWjsFLfVM/7w/85n2szZv6yExqUXsBdz5KT8eoubeyDUDjhLHEslA== + version "2.79.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7" + integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== optionalDependencies: fsevents "~2.3.2" @@ -10714,10 +11138,10 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rxjs@^7.5.5: - version "7.5.5" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.5.tgz#2ebad89af0f560f460ad5cc4213219e1f7dd4e9f" - integrity sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw== +rxjs@^7.5.7: + version "7.5.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.7.tgz#2ec0d57fdc89ece220d2e702730ae8f1e49def39" + integrity sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA== dependencies: tslib "^2.1.0" @@ -10738,6 +11162,15 @@ safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -10768,10 +11201,10 @@ saxes@^5.0.1: dependencies: xmlchars "^2.2.0" -scheduler@^0.21.0: - version "0.21.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.21.0.tgz#6fd2532ff5a6d877b6edb12f00d8ab7e8f308820" - integrity sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ== +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== dependencies: loose-envify "^1.1.0" @@ -10820,33 +11253,28 @@ seedrandom@^3.0.5: select-hose@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" - integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= + integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== -selenium-webdriver@4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.1.2.tgz#d463b4335632d2ea41a9e988e435a55dc41f5314" - integrity sha512-e4Ap8vQvhipgBB8Ry9zBiKGkU6kHKyNnWiavGGLKkrdW81Zv7NVMtFOL/j3yX0G8QScM7XIXijKssNd4EUxSOw== +selenium-webdriver@4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.5.0.tgz#7e20d0fc038177970dad81159950c12f7411ac0d" + integrity sha512-9mSFii+lRwcnT2KUAB1kqvx6+mMiiQHH60Y0VUtr3kxxi3oZ3CV3B8e2nuJ7T4SPb+Q6VA0swswe7rYpez07Bg== dependencies: - jszip "^3.6.0" + jszip "^3.10.0" tmp "^0.2.1" - ws ">=7.4.6" + ws ">=8.7.0" -selfsigned@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.0.1.tgz#8b2df7fa56bf014d19b6007655fff209c0ef0a56" - integrity sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ== +selfsigned@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.1.1.tgz#18a7613d714c0cd3385c48af0075abf3f266af61" + integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== dependencies: node-forge "^1" -semver@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" - integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== - -semver@7.x, semver@^7.3.2, semver@^7.3.5: - version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== +semver@7.x, semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8: + version "7.3.8" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== dependencies: lru-cache "^6.0.0" @@ -10855,24 +11283,24 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -send@0.17.2: - version "0.17.2" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" - integrity sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww== +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== dependencies: debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" + depd "2.0.0" + destroy "1.2.0" encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" fresh "0.5.2" - http-errors "1.8.1" + http-errors "2.0.0" mime "1.6.0" ms "2.1.3" - on-finished "~2.3.0" + on-finished "2.4.1" range-parser "~1.2.1" - statuses "~1.5.0" + statuses "2.0.1" serialize-javascript@^4.0.0: version "4.0.0" @@ -10891,7 +11319,7 @@ serialize-javascript@^6.0.0: serve-index@^1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" - integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== dependencies: accepts "~1.3.4" batch "0.6.1" @@ -10901,20 +11329,20 @@ serve-index@^1.9.1: mime-types "~2.1.17" parseurl "~1.3.2" -serve-static@1.14.2: - version "1.14.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.2.tgz#722d6294b1d62626d41b43a013ece4598d292bfa" - integrity sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ== +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== dependencies: encodeurl "~1.0.2" escape-html "~1.0.3" parseurl "~1.3.3" - send "0.17.2" + send "0.18.0" setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== setprototypeof@1.1.0: version "1.1.0" @@ -10929,7 +11357,7 @@ setprototypeof@1.2.0: shallow-copy@~0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/shallow-copy/-/shallow-copy-0.0.1.tgz#415f42702d73d810330292cc5ee86eae1a11a170" - integrity sha1-QV9CcC1z2BAzApLMXuhurhoRoXA= + integrity sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw== "shallowequal@^0.1.0 || ^0.2.0 || ^1.0.0", shallowequal@^1.1.0: version "1.1.0" @@ -10949,9 +11377,9 @@ shebang-regex@^3.0.0: integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== shell-quote@^1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" - integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== + version "1.7.4" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.4.tgz#33fe15dee71ab2a81fcbd3a52106c5cfb9fb75d8" + integrity sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw== shiki@^0.11.1: version "0.11.1" @@ -10971,10 +11399,10 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.2, signal-exit@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== +signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== sisteransi@^1.0.5: version "1.0.5" @@ -11017,13 +11445,13 @@ slice-ansi@^5.0.0: ansi-styles "^6.0.0" is-fullwidth-code-point "^4.0.0" -sockjs@^0.3.21: - version "0.3.21" - resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.21.tgz#b34ffb98e796930b60a0cfa11904d6a339a7d417" - integrity sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw== +sockjs@^0.3.24: + version "0.3.24" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== dependencies: faye-websocket "^0.11.3" - uuid "^3.4.0" + uuid "^8.3.2" websocket-driver "^0.7.4" source-list-map@^2.0.0, source-list-map@^2.0.1: @@ -11032,9 +11460,9 @@ source-list-map@^2.0.0, source-list-map@^2.0.1: integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== source-map-explorer@^2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/source-map-explorer/-/source-map-explorer-2.5.2.tgz#857cab5dd9d1d7175e9c5c2739dc9ccfb99f2dc5" - integrity sha512-gBwOyCcHPHcdLbgw6Y6kgoH1uLKL6hN3zz0xJcNI2lpnElZliIlmSYAjUVwAWnc7+HscoTyh1ScR7ITtFuEnxg== + version "2.5.3" + resolved "https://registry.yarnpkg.com/source-map-explorer/-/source-map-explorer-2.5.3.tgz#33551b51e33b70f56d15e79083cdd4c43e583b69" + integrity sha512-qfUGs7UHsOBE5p/lGfQdaAj/5U/GWYBw2imEpD6UQNkqElYonkow8t+HBL1qqIl3CuGZx7n8/CQo4x1HwSHhsg== dependencies: btoa "^1.2.1" chalk "^4.1.0" @@ -11045,7 +11473,7 @@ source-map-explorer@^2.5.2: gzip-size "^6.0.0" lodash "^4.17.20" open "^7.3.1" - source-map "^0.7.3" + source-map "^0.7.4" temp "^0.9.4" yargs "^16.2.0" @@ -11055,22 +11483,14 @@ source-map-js@^1.0.1, source-map-js@^1.0.2: integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== source-map-loader@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-3.0.1.tgz#9ae5edc7c2d42570934be4c95d1ccc6352eba52d" - integrity sha512-Vp1UsfyPvgujKQzi4pyDiTOnE3E4H+yHvkVRN3c/9PJmQS4CQJExvcDvaX/D+RV+xQben9HJ56jMJS3CgUeWyA== + version "3.0.2" + resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-3.0.2.tgz#af23192f9b344daa729f6772933194cc5fa54fee" + integrity sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg== dependencies: abab "^2.0.5" iconv-lite "^0.6.3" source-map-js "^1.0.1" -source-map-resolve@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.6.0.tgz#3d9df87e236b53f16d01e58150fc7711138e5ed2" - integrity sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - source-map-support@^0.5.6, source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" @@ -11084,15 +11504,15 @@ source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, sourc resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7: +source-map@^0.5.6, source-map@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== -source-map@^0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== +source-map@^0.7.3, source-map@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== source-map@^0.8.0-beta.0: version "0.8.0-beta.0" @@ -11101,15 +11521,15 @@ source-map@^0.8.0-beta.0: dependencies: whatwg-url "^7.0.0" -sourcemap-codec@^1.4.4: +sourcemap-codec@^1.4.8: version "1.4.8" resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== space-separated-tokens@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.1.tgz#43193cec4fb858a2ce934b7f98b7f2c18107098b" - integrity sha512-ekwEbFp5aqSPKaqeY1PGrlGQxPNaq+Cnx4+bE2D8sciBQrHpbwoBbawqTN2+6jPs9IdWxxiUcN0K2pkczD3zmw== + version "2.0.2" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" + integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== spdy-transport@^3.0.0: version "3.0.0" @@ -11137,7 +11557,7 @@ spdy@^4.0.2: sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== stable@^0.1.8: version "0.1.8" @@ -11145,16 +11565,16 @@ stable@^0.1.8: integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== stack-utils@^2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" - integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== dependencies: escape-string-regexp "^2.0.0" -stackframe@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.2.0.tgz#52429492d63c62eb989804c11552e3d22e779303" - integrity sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA== +stackframe@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" + integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== state-local@^1.0.6: version "1.0.7" @@ -11188,10 +11608,15 @@ static-module@^2.2.0: static-eval "^2.0.0" through2 "~2.0.3" -"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +"statuses@>= 1.4.0 < 2": version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== stream-browserify@^3.0.0: version "3.0.0" @@ -11207,9 +11632,9 @@ string-argv@^0.3.1: integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== string-length@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.1.tgz#4a973bf31ef77c4edbceadd6af2611996985f8a1" - integrity sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw== + version "4.0.2" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== dependencies: char-regex "^1.0.2" strip-ansi "^6.0.0" @@ -11228,13 +11653,13 @@ string-natural-compare@^3.0.1: integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== string-width@^4.1.0, string-width@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" - integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" + strip-ansi "^6.0.1" string-width@^5.0.0: version "5.1.2" @@ -11245,35 +11670,37 @@ string-width@^5.0.0: emoji-regex "^9.2.2" strip-ansi "^7.0.1" -string.prototype.matchall@^4.0.6: - version "4.0.7" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz#8e6ecb0d8a1fb1fda470d81acecb2dba057a481d" - integrity sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg== +string.prototype.matchall@^4.0.6, string.prototype.matchall@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" + integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - get-intrinsic "^1.1.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" has-symbols "^1.0.3" internal-slot "^1.0.3" - regexp.prototype.flags "^1.4.1" + regexp.prototype.flags "^1.4.3" side-channel "^1.0.4" -string.prototype.trimend@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" - integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== +string.prototype.trimend@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" + define-properties "^1.1.4" + es-abstract "^1.20.4" -string.prototype.trimstart@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" - integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== +string.prototype.trimstart@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" + define-properties "^1.1.4" + es-abstract "^1.20.4" string_decoder@^1.1.1: version "1.3.0" @@ -11330,7 +11757,7 @@ strip-ansi@^7.0.1: strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== strip-bom@^4.0.0: version "4.0.0" @@ -11347,6 +11774,11 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== +strip-final-newline@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== + strip-indent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" @@ -11371,18 +11803,18 @@ style-to-object@^0.3.0: dependencies: inline-style-parser "0.1.1" -stylehacks@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.0.tgz#a40066490ca0caca04e96c6b02153ddc39913520" - integrity sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q== +stylehacks@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.1.tgz#7934a34eb59d7152149fa69d6e9e56f2fc34bcc9" + integrity sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw== dependencies: - browserslist "^4.16.6" + browserslist "^4.21.4" postcss-selector-parser "^6.0.4" -stylis@4.0.13: - version "4.0.13" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.0.13.tgz#f5db332e376d13cc84ecfe5dace9a2a51d954c91" - integrity sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag== +stylis@4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.1.3.tgz#fd2fbe79f5fed17c55269e16ed8da14c84d069f7" + integrity sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA== supports-color@^5.3.0: version "5.5.0" @@ -11405,15 +11837,10 @@ supports-color@^8.0.0: dependencies: has-flag "^4.0.0" -supports-color@^9.2.1: - version "9.2.2" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-9.2.2.tgz#502acaf82f2b7ee78eb7c83dcac0f89694e5a7bb" - integrity sha512-XC6g/Kgux+rJXmwokjm9ECpD6k/smUoS5LKlUCcsYr4IY3rW0XyAympon2RmxGrlnZURMpg5T18gWDP9CsHXFA== - supports-hyperlinks@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz#f663df252af5f37c5d49bbd7eeefa9e0b9e59e47" - integrity sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA== + version "2.3.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624" + integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== dependencies: has-flag "^4.0.0" supports-color "^7.0.0" @@ -11461,11 +11888,9 @@ svgo@^2.7.0: stable "^0.1.8" swc-loader@^0.1.15: - version "0.1.15" - resolved "https://registry.yarnpkg.com/swc-loader/-/swc-loader-0.1.15.tgz#cb9c630ccfbb46dabc5aebc5560cced658e32992" - integrity sha512-cn1WPIeQJvXM4bbo3OwdEIapsQ4uUGOfyFj0h2+2+brT0k76DCGnZXDE2KmcqTd2JSQ+b61z2NPMib7eEwMYYw== - dependencies: - loader-utils "^2.0.0" + version "0.1.16" + resolved "https://registry.yarnpkg.com/swc-loader/-/swc-loader-0.1.16.tgz#4c718d698e518f3e6ceb9f7872c1855cdb187066" + integrity sha512-NKIm8aJjK/z/yfzk+v7YGwJMjBKaLaUs9ZKI2zoaIGKAjtkwjO92ZLI0fiTZuwzRqVLQl/29fBdSgFCBzquR0w== swr@^1.3.0: version "1.3.0" @@ -11478,31 +11903,33 @@ symbol-tree@^3.2.4: integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== tailwindcss@^3.0.2: - version "3.0.23" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.0.23.tgz#c620521d53a289650872a66adfcb4129d2200d10" - integrity sha512-+OZOV9ubyQ6oI2BXEhzw4HrqvgcARY38xv3zKcjnWtMIZstEsXdI9xftd1iB7+RbOnj2HOEzkA0OyB5BaSxPQA== + version "3.2.4" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.2.4.tgz#afe3477e7a19f3ceafb48e4b083e292ce0dc0250" + integrity sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ== dependencies: - arg "^5.0.1" - chalk "^4.1.2" + arg "^5.0.2" chokidar "^3.5.3" color-name "^1.1.4" - cosmiconfig "^7.0.1" - detective "^5.2.0" + detective "^5.2.1" didyoumean "^1.2.2" dlv "^1.1.3" - fast-glob "^3.2.11" + fast-glob "^3.2.12" glob-parent "^6.0.2" is-glob "^4.0.3" + lilconfig "^2.0.6" + micromatch "^4.0.5" normalize-path "^3.0.0" - object-hash "^2.2.0" - postcss "^8.4.6" + object-hash "^3.0.0" + picocolors "^1.0.0" + postcss "^8.4.18" + postcss-import "^14.1.0" postcss-js "^4.0.0" - postcss-load-config "^3.1.0" - postcss-nested "5.0.6" - postcss-selector-parser "^6.0.9" + postcss-load-config "^3.1.4" + postcss-nested "6.0.0" + postcss-selector-parser "^6.0.10" postcss-value-parser "^4.2.0" quick-lru "^5.1.1" - resolve "^1.22.0" + resolve "^1.22.1" tapable@^1.0.0: version "1.1.3" @@ -11546,20 +11973,20 @@ terminal-link@^2.0.0: supports-hyperlinks "^2.0.0" terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.2.5: - version "5.3.1" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz#0320dcc270ad5372c1e8993fabbd927929773e54" - integrity sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g== + version "5.3.6" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz#5590aec31aa3c6f771ce1b1acca60639eab3195c" + integrity sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ== dependencies: + "@jridgewell/trace-mapping" "^0.3.14" jest-worker "^27.4.5" schema-utils "^3.1.1" serialize-javascript "^6.0.0" - source-map "^0.6.1" - terser "^5.7.2" + terser "^5.14.1" -terser@^5.0.0, terser@^5.10.0, terser@^5.7.2: - version "5.14.2" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.14.2.tgz#9ac9f22b06994d736174f4091aa368db896f1c10" - integrity sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA== +terser@^5.0.0, terser@^5.10.0, terser@^5.14.1: + version "5.16.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.0.tgz#29362c6f5506e71545c73b069ccd199bb28f7f54" + integrity sha512-KjTV81QKStSfwbNiwlBXfcgMcOloyuRdb62/iLFPGBcVNF4EXjhdYBhYHmbJpiBrVxZhDvltE11j+LBQUxEEJg== dependencies: "@jridgewell/source-map" "^0.3.2" acorn "^8.5.0" @@ -11578,7 +12005,7 @@ test-exclude@^6.0.0: text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== throat@^6.0.1: version "6.0.1" @@ -11596,7 +12023,7 @@ through2@^2.0.0, through2@~2.0.3: through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== thunky@^1.0.2: version "1.1.0" @@ -11609,14 +12036,14 @@ tiny-inflate@^1.0.0: integrity sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw== tiny-invariant@^1.0.6: - version "1.2.0" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.2.0.tgz#a1141f86b672a9148c72e978a19a73b9b94a15a9" - integrity sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg== + version "1.3.1" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" + integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== tinymce@^5, tinymce@^5.5.1: - version "5.10.4" - resolved "https://registry.yarnpkg.com/tinymce/-/tinymce-5.10.4.tgz#24ee843c7648ade708605dec15d8dad07809f7db" - integrity sha512-L0ivAhGu7bEo6cUBrCzhtKlkIQqG2sTcL+uu7soMSxrECQIC5VwUnzp9HCEf+fRl36q6zavLV48lf8jelj+gXA== + version "5.10.6" + resolved "https://registry.yarnpkg.com/tinymce/-/tinymce-5.10.6.tgz#ea03927e9d20c035619dfd32ec4fd471c55e32c5" + integrity sha512-bnF2LUoycDsoZZLQBNHbOijrmoJuEeR1rQdqgo4s77BedufpOVnDh00OZKbseHeTMCxhVH05wvOqxLsi6vpeZw== tmp@^0.2.1: version "0.2.1" @@ -11625,7 +12052,7 @@ tmp@^0.2.1: dependencies: rimraf "^3.0.0" -tmpl@1.0.x: +tmpl@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== @@ -11633,7 +12060,7 @@ tmpl@1.0.x: to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== to-regex-range@^5.0.1: version "5.0.1" @@ -11650,21 +12077,22 @@ toidentifier@1.0.1: toposort@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" - integrity sha1-riF2gXXRVZ1IvvNUILL0li8JwzA= + integrity sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg== tough-cookie@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" - integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== + version "4.1.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.2.tgz#e53e84b85f24e0b65dd526f46628db6c85f6b874" + integrity sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ== dependencies: psl "^1.1.33" punycode "^2.1.1" - universalify "^0.1.2" + universalify "^0.2.0" + url-parse "^1.5.3" tr46@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" - integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + integrity sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA== dependencies: punycode "^2.1.0" @@ -11678,7 +12106,12 @@ tr46@^2.1.0: tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +trim-lines@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" + integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== trough@^2.0.0: version "2.1.0" @@ -11691,25 +12124,25 @@ tryer@^1.0.1: integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== ts-jest@^28.0.2: - version "28.0.2" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-28.0.2.tgz#e4026357006731f96a033b94db89d01e0d3c0591" - integrity sha512-IOZMb3D0gx6IHO9ywPgiQxJ3Zl4ECylEFwoVpENB55aTn5sdO0Ptyx/7noNBxAaUff708RqQL4XBNxxOVjY0vQ== + version "28.0.8" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-28.0.8.tgz#cd204b8e7a2f78da32cf6c95c9a6165c5b99cc73" + integrity sha512-5FaG0lXmRPzApix8oFG8RKjAz4ehtm8yMKOTy5HX3fY6W8kmvOrmcY0hKDElW52FJov+clhUbrKAqofnj4mXTg== dependencies: bs-logger "0.x" fast-json-stable-stringify "2.x" jest-util "^28.0.0" - json5 "2.x" + json5 "^2.2.1" lodash.memoize "4.x" make-error "1.x" semver "7.x" - yargs-parser "^20.x" + yargs-parser "^21.0.1" ts-node@^10.7.0: - version "10.7.0" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.7.0.tgz#35d503d0fab3e2baa672a0e94f4b40653c2463f5" - integrity sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A== + version "10.9.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== dependencies: - "@cspotcode/source-map-support" "0.7.0" + "@cspotcode/source-map-support" "^0.8.0" "@tsconfig/node10" "^1.0.7" "@tsconfig/node12" "^1.0.7" "@tsconfig/node14" "^1.0.0" @@ -11720,7 +12153,7 @@ ts-node@^10.7.0: create-require "^1.1.0" diff "^4.0.1" make-error "^1.1.1" - v8-compile-cache-lib "^3.0.0" + v8-compile-cache-lib "^3.0.1" yn "3.1.1" tsconfig-paths@^3.14.1: @@ -11733,20 +12166,20 @@ tsconfig-paths@^3.14.1: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^1.8.1, tslib@^1.9.0: +tslib@^1.8.1: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" - integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== +tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" + integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== -tss-react@^3.6.2: - version "3.6.2" - resolved "https://registry.yarnpkg.com/tss-react/-/tss-react-3.6.2.tgz#5e995d8b82ca730ba04a21203ae68f1c5372a85e" - integrity sha512-+ecQIqCNFVlVJVk3NiCWZY2+5DhVKMVUVxIbEwv9nYsTRQA/KxyKCU8g+KMj5ByqFv9LW76+TUYzbWck/IHkfA== +tss-react@^4.4.4: + version "4.4.4" + resolved "https://registry.yarnpkg.com/tss-react/-/tss-react-4.4.4.tgz#12207842dfc58676a9f4d0f532741257428a78e7" + integrity sha512-Bzyg99bIQq3Lk4Rwc5XMOps58c1biw1rghCkApIX5XkAB+/VjGCIFSl63PePhmiRNvKRxJRpawGPPxHytiw1TA== dependencies: "@emotion/cache" "*" "@emotion/serialize" "*" @@ -11769,7 +12202,7 @@ type-check@^0.4.0, type-check@~0.4.0: type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== dependencies: prelude-ls "~1.1.2" @@ -11811,7 +12244,7 @@ typedarray-to-buffer@^3.1.5: typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== typedoc@^0.23.21: version "0.23.21" @@ -11823,24 +12256,24 @@ typedoc@^0.23.21: minimatch "^5.1.0" shiki "^0.11.1" -typescript@^4.6.3: - version "4.6.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.3.tgz#eefeafa6afdd31d725584c67a0eaba80f6fc6c6c" - integrity sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw== +typescript@^4.9.3: + version "4.9.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.3.tgz#3aea307c1746b8c384435d8ac36b8a2e580d85db" + integrity sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA== ua-parser-js@^0.7.30: - version "0.7.31" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.31.tgz#649a656b191dffab4f21d5e053e27ca17cbff5c6" - integrity sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ== + version "0.7.32" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.32.tgz#cd8c639cdca949e30fa68c44b7813ef13e36d211" + integrity sha512-f9BESNVhzlhEFf2CHMSj40NWOjYPl1YKYbrvIr/hFTDEmLq7SRbWvm7FcdcpCYT95zrOhC7gZSxjdnnTpBcwVw== -unbox-primitive@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" - integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== dependencies: - function-bind "^1.1.1" - has-bigints "^1.0.1" - has-symbols "^1.0.2" + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" unicode-canonical-property-names-ecmascript@^2.0.0: @@ -11856,25 +12289,25 @@ unicode-match-property-ecmascript@^2.0.0: unicode-canonical-property-names-ecmascript "^2.0.0" unicode-property-aliases-ecmascript "^2.0.0" -unicode-match-property-value-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" - integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== unicode-property-aliases-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" - integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== unicode-trie@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/unicode-trie/-/unicode-trie-0.3.1.tgz#d671dddd89101a08bac37b6a5161010602052085" - integrity sha1-1nHd3YkQGgi6w3tqUWEBBgIFIIU= + integrity sha512-WgVuO0M2jDl7hVfbPgXv2LUrD81HM0bQj/bvLGiw6fJ4Zo8nNFnDrA0/hU2Te/wz6pjxCm5cxJwtLjo2eyV51Q== dependencies: pako "^0.2.5" tiny-inflate "^1.0.0" -unified@^10.0.0, unified@~10.1.1: +unified@^10.0.0, unified@~10.1.1, unified@~10.1.2: version "10.1.2" resolved "https://registry.yarnpkg.com/unified/-/unified-10.1.2.tgz#b1d64e55dafe1f0b98bb6c719881103ecf6c86df" integrity sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q== @@ -11934,44 +12367,27 @@ unist-util-stringify-position@^3.0.0: dependencies: "@types/unist" "^2.0.0" -unist-util-visit-parents@^4.0.0: +unist-util-visit-parents@^5.0.0, unist-util-visit-parents@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.1.tgz#868f353e6fce6bf8fa875b251b0f4fec3be709bb" + integrity sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^5.0.0" + +unist-util-visit@^4.0.0, unist-util-visit@^4.1.0, unist-util-visit@~4.1.0: version "4.1.1" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-4.1.1.tgz#e83559a4ad7e6048a46b1bdb22614f2f3f4724f2" - integrity sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw== + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.1.tgz#1c4842d70bd3df6cc545276f5164f933390a9aad" + integrity sha512-n9KN3WV9k4h1DxYR1LoajgN93wpEi/7ZplVe02IoB4gH5ctI1AaF2670BLHQYbwj+pY83gFtyeySFiyMHJklrg== dependencies: "@types/unist" "^2.0.0" unist-util-is "^5.0.0" + unist-util-visit-parents "^5.1.1" -unist-util-visit-parents@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.0.tgz#44bbc5d25f2411e7dfc5cecff12de43296aa8521" - integrity sha512-y+QVLcY5eR/YVpqDsLf/xh9R3Q2Y4HxkZTp7ViLDU6WtJCEcPmRzW1gpdWDCDIqIlhuPDXOgttqPlykrHYDekg== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^5.0.0" - -unist-util-visit@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-3.1.0.tgz#9420d285e1aee938c7d9acbafc8e160186dbaf7b" - integrity sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^5.0.0" - unist-util-visit-parents "^4.0.0" - -unist-util-visit@^4.0.0, unist-util-visit@~4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.0.tgz#f41e407a9e94da31594e6b1c9811c51ab0b3d8f5" - integrity sha512-n7lyhFKJfVZ9MnKtqbsqkQEk5P1KShj0+//V7mAcoI6bpbUjh3C/OG8HVD+pBihfh6Ovl01m8dkcv9HNqYajmQ== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^5.0.0" - unist-util-visit-parents "^5.0.0" - -universalify@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== universalify@^2.0.0: version "2.0.0" @@ -11981,18 +12397,26 @@ universalify@^2.0.0: unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== unquote@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" - integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + integrity sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg== upath@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== +update-browserslist-db@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -12005,6 +12429,14 @@ urijs@^1.19.1: resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.11.tgz#204b0d6b605ae80bea54bea39280cdb7c9f923cc" integrity sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ== +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + use-algolia@^1.5.3: version "1.5.3" resolved "https://registry.yarnpkg.com/use-algolia/-/use-algolia-1.5.3.tgz#7a194144a0050665e2134d18974a9408a9dae176" @@ -12021,9 +12453,9 @@ use-composed-ref@^1.3.0: integrity sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ== use-debounce@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/use-debounce/-/use-debounce-8.0.0.tgz#fd8d24858dd0d1986bb9a45af4d0aa6ce99226d2" - integrity sha512-rKavD/3NxRR8MnCBhcS+TiBEqLQHEFRPjm/MYKYZsRE8Z8u1einvgqRKcBTNkt4SfIXfYZNTJe3YSDBC+Vhz5g== + version "8.0.4" + resolved "https://registry.yarnpkg.com/use-debounce/-/use-debounce-8.0.4.tgz#27e93b2f010bd0b8ad06e9fc7de891d9ee5d6b8e" + integrity sha512-fGqsYQzl8kLHF2QpQSgIwgOgJmnh6j5L6SIzQiHdLfwp3q1egUL3btq5Bg2SJysH6A0ILLgT2IqXZKoNJr0nFw== use-isomorphic-layout-effect@^1.1.1: version "1.1.2" @@ -12038,9 +12470,9 @@ use-latest@^1.2.1: use-isomorphic-layout-effect "^1.1.1" use-memo-one@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/use-memo-one/-/use-memo-one-1.1.2.tgz#0c8203a329f76e040047a35a1197defe342fab20" - integrity sha512-u2qFKtxLsia/r8qG0ZKkbytbztzRb317XCkT7yP8wxL0tZ/CzK2G+WWie5vWvpyeP7+YoPIwbJoIHJ4Ba4k0oQ== + version "1.1.3" + resolved "https://registry.yarnpkg.com/use-memo-one/-/use-memo-one-1.1.3.tgz#2fd2e43a2169eabc7496960ace8c79efef975e99" + integrity sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ== use-memo-value@^1.0.1: version "1.0.1" @@ -12052,7 +12484,7 @@ use-memo-value@^1.0.1: util-deprecate@^1.0.1, util-deprecate@^1.0.2, 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= + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== util.promisify@~1.0.0: version "1.0.1" @@ -12067,37 +12499,32 @@ util.promisify@~1.0.0: utila@~0.4: version "0.4.0" resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" - integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= + integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== -uuid@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== uvu@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.3.tgz#3d83c5bc1230f153451877bfc7f4aea2392219ae" - integrity sha512-brFwqA3FXzilmtnIyJ+CxdkInkY/i4ErvP7uV0DnUVxQcQ55reuHphorpF+tZoVHK2MniZ/VJzI7zJQoc9T9Yw== + version "0.5.6" + resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.6.tgz#2754ca20bcb0bb59b64e9985e84d2e81058502df" + integrity sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA== dependencies: dequal "^2.0.0" diff "^5.0.0" kleur "^4.0.3" sade "^1.7.3" -v8-compile-cache-lib@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz#0582bcb1c74f3a2ee46487ceecf372e46bce53e8" - integrity sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA== - -v8-compile-cache@^2.0.3: - version "2.2.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz#9471efa3ef9128d2f7c6a7ca39c4dd6b5055b132" - integrity sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q== +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== v8-to-istanbul@^8.1.0: version "8.1.1" @@ -12111,7 +12538,7 @@ v8-to-istanbul@^8.1.0: vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== vfile-location@^4.0.0: version "4.0.1" @@ -12122,17 +12549,17 @@ vfile-location@^4.0.0: vfile "^5.0.0" vfile-message@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.1.2.tgz#a2908f64d9e557315ec9d7ea3a910f658ac05f7d" - integrity sha512-QjSNP6Yxzyycd4SVOtmKKyTsSvClqBPJcd00Z0zuPj3hOIjg0rUPG6DbFGPvUKRgYyaIWLPKpuEclcuvb3H8qA== + version "3.1.3" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.1.3.tgz#1360c27a99234bebf7bddbbbca67807115e6b0dd" + integrity sha512-0yaU+rj2gKAyEk12ffdSbBfjnnj+b1zqTBv3OQCTn8yEB02bsPizwdBPrLJjHnK+cU9EMMcUnNv938XcZIkmdA== dependencies: "@types/unist" "^2.0.0" unist-util-stringify-position "^3.0.0" vfile@^5.0.0: - version "5.3.2" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.3.2.tgz#b499fbc50197ea50ad3749e9b60beb16ca5b7c54" - integrity sha512-w0PLIugRY3Crkgw89TeMvHCzqCs/zpreR31hl4D92y6SOE07+bfJe+dK5Q2akwS+i/c801kzjoOr9gMcTe6IAA== + version "5.3.6" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.3.6.tgz#61b2e70690cc835a5d0d0fd135beae74e5a39546" + integrity sha512-ADBsmerdGBs2WYckrLBEmuETSPyTD4TuLxTrw0DvjirxW1ra4ZwkbzG8ndsv3Q57smvHxo677MHaQrY9yxH8cA== dependencies: "@types/unist" "^2.0.0" is-buffer "^2.0.0" @@ -12145,9 +12572,9 @@ vlq@^0.2.2: integrity sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow== vscode-oniguruma@^1.6.1: - version "1.6.2" - resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.6.2.tgz#aeb9771a2f1dbfc9083c8a7fdd9cccaa3f386607" - integrity sha512-KH8+KKov5eS/9WhofZR8M8dMHWN2gTxjMsG4jd04YhpbPR91fUj7rYQ2/XjeHCJWbg7X++ApRIU9NUwM2vTvLA== + version "1.7.0" + resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz#439bfad8fe71abd7798338d1cd3dc53a8beea94b" + integrity sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA== vscode-textmate@^6.0.0: version "6.0.0" @@ -12169,16 +12596,16 @@ w3c-xmlserializer@^2.0.0: xml-name-validator "^3.0.0" walker@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" - integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== dependencies: - makeerror "1.0.x" + makeerror "1.0.12" -watchpack@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.3.1.tgz#4200d9447b401156eeca7767ee610f8809bc9d25" - integrity sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA== +watchpack@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== dependencies: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" @@ -12203,7 +12630,7 @@ web-vitals@^2.1.4: webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== webidl-conversions@^4.0.2: version "4.0.2" @@ -12221,25 +12648,26 @@ webidl-conversions@^6.1.0: integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== webpack-dev-middleware@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz#aa079a8dedd7e58bfeab358a9af7dab304cee57f" - integrity sha512-81EujCKkyles2wphtdrnPg/QqegC/AtqNH//mQkBYSMqwFVCQrxM6ktB2O/SPlZy7LqeEfTbV3cZARGQz6umhg== + version "5.3.3" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f" + integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== dependencies: colorette "^2.0.10" - memfs "^3.4.1" + memfs "^3.4.3" mime-types "^2.1.31" range-parser "^1.2.1" schema-utils "^4.0.0" webpack-dev-server@^4.6.0: - version "4.8.1" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.8.1.tgz#58f9d797710d6e25fa17d6afab8708f958c11a29" - integrity sha512-dwld70gkgNJa33czmcj/PlKY/nOy/BimbrgZRaR9vDATBQAYgLzggR0nxDtPLJiLrMgZwbE6RRfJ5vnBBasTyg== + version "4.11.1" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz#ae07f0d71ca0438cf88446f09029b92ce81380b5" + integrity sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw== dependencies: "@types/bonjour" "^3.5.9" "@types/connect-history-api-fallback" "^1.3.5" "@types/express" "^4.17.13" "@types/serve-index" "^1.9.1" + "@types/serve-static" "^1.13.10" "@types/sockjs" "^0.3.33" "@types/ws" "^8.5.1" ansi-html-community "^0.0.8" @@ -12247,7 +12675,7 @@ webpack-dev-server@^4.6.0: chokidar "^3.5.3" colorette "^2.0.10" compression "^1.7.4" - connect-history-api-fallback "^1.6.0" + connect-history-api-fallback "^2.0.0" default-gateway "^6.0.3" express "^4.17.3" graceful-fs "^4.2.6" @@ -12256,12 +12684,11 @@ webpack-dev-server@^4.6.0: ipaddr.js "^2.0.1" open "^8.0.9" p-retry "^4.5.0" - portfinder "^1.0.28" rimraf "^3.0.2" schema-utils "^4.0.0" - selfsigned "^2.0.1" + selfsigned "^2.1.1" serve-index "^1.9.1" - sockjs "^0.3.21" + sockjs "^0.3.24" spdy "^4.0.2" webpack-dev-middleware "^5.3.1" ws "^8.4.2" @@ -12303,33 +12730,33 @@ webpack-sources@^3.2.3: integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@^5.64.4: - version "5.72.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.72.0.tgz#f8bc40d9c6bb489a4b7a8a685101d6022b8b6e28" - integrity sha512-qmSmbspI0Qo5ld49htys8GY9XhS9CGqFoHTsOVAnjBdg0Zn79y135R+k4IR4rKK6+eKaabMhJwiVB7xw0SJu5w== + version "5.75.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.75.0.tgz#1e440468647b2505860e94c9ff3e44d5b582c152" + integrity sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^0.0.51" "@webassemblyjs/ast" "1.11.1" "@webassemblyjs/wasm-edit" "1.11.1" "@webassemblyjs/wasm-parser" "1.11.1" - acorn "^8.4.1" + acorn "^8.7.1" acorn-import-assertions "^1.7.6" browserslist "^4.14.5" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.9.2" + enhanced-resolve "^5.10.0" es-module-lexer "^0.9.0" eslint-scope "5.1.1" events "^3.2.0" glob-to-regexp "^0.4.1" graceful-fs "^4.2.9" - json-parse-better-errors "^1.0.2" + json-parse-even-better-errors "^2.3.1" loader-runner "^4.2.0" mime-types "^2.1.27" neo-async "^2.6.2" schema-utils "^3.1.0" tapable "^2.1.1" terser-webpack-plugin "^5.1.3" - watchpack "^2.3.1" + watchpack "^2.4.0" webpack-sources "^3.2.3" websocket-driver@>=0.5.1, websocket-driver@^0.7.4: @@ -12366,7 +12793,7 @@ whatwg-mimetype@^2.3.0: whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== dependencies: tr46 "~0.0.3" webidl-conversions "^3.0.0" @@ -12400,6 +12827,28 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + +which-typed-array@^1.1.8: + version "1.1.9" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" + integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.10" + which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -12422,27 +12871,27 @@ word-wrap@^1.2.3, word-wrap@~1.2.3: wordwrap@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== -workbox-background-sync@6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-6.5.2.tgz#28be9bf89b8e4e0379d45903280c7c12f4df836f" - integrity sha512-EjG37LSMDJ1TFlFg56wx6YXbH4/NkG09B9OHvyxx+cGl2gP5OuOzsCY3rOPJSpbcz6jpuA40VIC3HzSD4OvE1g== +workbox-background-sync@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-6.5.4.tgz#3141afba3cc8aa2ae14c24d0f6811374ba8ff6a9" + integrity sha512-0r4INQZMyPky/lj4Ou98qxcThrETucOde+7mRGJl13MPJugQNKeZQOdIJe/1AchOP23cTqHcN/YVpD6r8E6I8g== dependencies: - idb "^6.1.4" - workbox-core "6.5.2" + idb "^7.0.1" + workbox-core "6.5.4" -workbox-broadcast-update@6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-6.5.2.tgz#b1f32bb40a9dcb5b05ca27e09fb7c01a0a126182" - integrity sha512-DjJYraYnprTZE/AQNoeogaxI1dPuYmbw+ZJeeP8uXBSbg9SNv5wLYofQgywXeRepv4yr/vglMo9yaHUmBMc+4Q== +workbox-broadcast-update@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-6.5.4.tgz#8441cff5417cd41f384ba7633ca960a7ffe40f66" + integrity sha512-I/lBERoH1u3zyBosnpPEtcAVe5lwykx9Yg1k6f8/BGEPGaMMgZrwVrqL1uA9QZ1NGGFoyE6t9i7lBjOlDhFEEw== dependencies: - workbox-core "6.5.2" + workbox-core "6.5.4" -workbox-build@6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-6.5.2.tgz#774faafd84b1dc94b74739ceb5d8ff367748523b" - integrity sha512-TVi4Otf6fgwikBeMpXF9n0awHfZTMNu/nwlMIT9W+c13yvxkmDFMPb7vHYK6RUmbcxwPnz4I/R+uL76+JxG4JQ== +workbox-build@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-6.5.4.tgz#7d06d31eb28a878817e1c991c05c5b93409f0389" + integrity sha512-kgRevLXEYvUW9WS4XoziYqZ8Q9j/2ziJYEtTrjdz5/L/cTUa2XfyMP2i7c3p34lgqJ03+mTiz13SdFef2POwbA== dependencies: "@apideck/better-ajv-errors" "^0.3.1" "@babel/core" "^7.11.1" @@ -12466,132 +12915,132 @@ workbox-build@6.5.2: strip-comments "^2.0.1" tempy "^0.6.0" upath "^1.2.0" - workbox-background-sync "6.5.2" - workbox-broadcast-update "6.5.2" - workbox-cacheable-response "6.5.2" - workbox-core "6.5.2" - workbox-expiration "6.5.2" - workbox-google-analytics "6.5.2" - workbox-navigation-preload "6.5.2" - workbox-precaching "6.5.2" - workbox-range-requests "6.5.2" - workbox-recipes "6.5.2" - workbox-routing "6.5.2" - workbox-strategies "6.5.2" - workbox-streams "6.5.2" - workbox-sw "6.5.2" - workbox-window "6.5.2" + workbox-background-sync "6.5.4" + workbox-broadcast-update "6.5.4" + workbox-cacheable-response "6.5.4" + workbox-core "6.5.4" + workbox-expiration "6.5.4" + workbox-google-analytics "6.5.4" + workbox-navigation-preload "6.5.4" + workbox-precaching "6.5.4" + workbox-range-requests "6.5.4" + workbox-recipes "6.5.4" + workbox-routing "6.5.4" + workbox-strategies "6.5.4" + workbox-streams "6.5.4" + workbox-sw "6.5.4" + workbox-window "6.5.4" -workbox-cacheable-response@6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-6.5.2.tgz#d9252eb99f0d0fceb70f63866172f4eaac56a3e8" - integrity sha512-UnHGih6xqloV808T7ve1iNKZMbpML0jGLqkkmyXkJbZc5j16+HRSV61Qrh+tiq3E3yLvFMGJ3AUBODOPNLWpTg== +workbox-cacheable-response@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-6.5.4.tgz#a5c6ec0c6e2b6f037379198d4ef07d098f7cf137" + integrity sha512-DCR9uD0Fqj8oB2TSWQEm1hbFs/85hXXoayVwFKLVuIuxwJaihBsLsp4y7J9bvZbqtPJ1KlCkmYVGQKrBU4KAug== dependencies: - workbox-core "6.5.2" + workbox-core "6.5.4" -workbox-core@6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-6.5.2.tgz#f5e06a22c6cb4651d3e13107443d972fdbd47364" - integrity sha512-IlxLGQf+wJHCR+NM0UWqDh4xe/Gu6sg2i4tfZk6WIij34IVk9BdOQgi6WvqSHd879jbQIUgL2fBdJUJyAP5ypQ== +workbox-core@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-6.5.4.tgz#df48bf44cd58bb1d1726c49b883fb1dffa24c9ba" + integrity sha512-OXYb+m9wZm8GrORlV2vBbE5EC1FKu71GGp0H4rjmxmF4/HLbMCoTFws87M3dFwgpmg0v00K++PImpNQ6J5NQ6Q== -workbox-expiration@6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-6.5.2.tgz#ee6ed755a220a0b375d67831f9237e4dcbccb59c" - integrity sha512-5Hfp0uxTZJrgTiy9W7AjIIec+9uTOtnxY/tRBm4DbqcWKaWbVTa+izrKzzOT4MXRJJIJUmvRhWw4oo8tpmMouw== +workbox-expiration@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-6.5.4.tgz#501056f81e87e1d296c76570bb483ce5e29b4539" + integrity sha512-jUP5qPOpH1nXtjGGh1fRBa1wJL2QlIb5mGpct3NzepjGG2uFFBn4iiEBiI9GUmfAFR2ApuRhDydjcRmYXddiEQ== dependencies: - idb "^6.1.4" - workbox-core "6.5.2" + idb "^7.0.1" + workbox-core "6.5.4" -workbox-google-analytics@6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-6.5.2.tgz#a79fa7a40824873baaa333dcd72d1fdf1c53adf5" - integrity sha512-8SMar+N0xIreP5/2we3dwtN1FUmTMScoopL86aKdXBpio8vXc8Oqb5fCJG32ialjN8BAOzDqx/FnGeCtkIlyvw== +workbox-google-analytics@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-6.5.4.tgz#c74327f80dfa4c1954cbba93cd7ea640fe7ece7d" + integrity sha512-8AU1WuaXsD49249Wq0B2zn4a/vvFfHkpcFfqAFHNHwln3jK9QUYmzdkKXGIZl9wyKNP+RRX30vcgcyWMcZ9VAg== dependencies: - workbox-background-sync "6.5.2" - workbox-core "6.5.2" - workbox-routing "6.5.2" - workbox-strategies "6.5.2" + workbox-background-sync "6.5.4" + workbox-core "6.5.4" + workbox-routing "6.5.4" + workbox-strategies "6.5.4" -workbox-navigation-preload@6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-6.5.2.tgz#ffb3d9d5cdb881a3824851707da221dbb0bb3f23" - integrity sha512-iqDNWWMswjCsZuvGFDpcX1Z8InBVAlVBELJ28xShsWWntALzbtr0PXMnm2WHkXCc56JimmGldZi1N5yDPiTPOg== +workbox-navigation-preload@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-6.5.4.tgz#ede56dd5f6fc9e860a7e45b2c1a8f87c1c793212" + integrity sha512-IIwf80eO3cr8h6XSQJF+Hxj26rg2RPFVUmJLUlM0+A2GzB4HFbQyKkrgD5y2d84g2IbJzP4B4j5dPBRzamHrng== dependencies: - workbox-core "6.5.2" + workbox-core "6.5.4" -workbox-precaching@6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-6.5.2.tgz#a3117b4d3eb61ce8d01b9dfc063c48155bd7f9d3" - integrity sha512-OZAlQ8AAT20KugGKKuJMHdQ8X1IyNQaLv+mPTHj+8Dmv8peBq5uWNzs4g/1OSFmXsbXZ6a1CBC6YtQWVPhJQ9w== +workbox-precaching@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-6.5.4.tgz#740e3561df92c6726ab5f7471e6aac89582cab72" + integrity sha512-hSMezMsW6btKnxHB4bFy2Qfwey/8SYdGWvVIKFaUm8vJ4E53JAY+U2JwLTRD8wbLWoP6OVUdFlXsTdKu9yoLTg== dependencies: - workbox-core "6.5.2" - workbox-routing "6.5.2" - workbox-strategies "6.5.2" + workbox-core "6.5.4" + workbox-routing "6.5.4" + workbox-strategies "6.5.4" -workbox-range-requests@6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-6.5.2.tgz#b8b7e5b5830fecc22f0a1d8815457921df2e5bf9" - integrity sha512-zi5VqF1mWqfCyJLTMXn1EuH/E6nisqWDK1VmOJ+TnjxGttaQrseOhMn+BMvULFHeF8AvrQ0ogfQ6bSv0rcfAlg== +workbox-range-requests@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-6.5.4.tgz#86b3d482e090433dab38d36ae031b2bb0bd74399" + integrity sha512-Je2qR1NXCFC8xVJ/Lux6saH6IrQGhMpDrPXWZWWS8n/RD+WZfKa6dSZwU+/QksfEadJEr/NfY+aP/CXFFK5JFg== dependencies: - workbox-core "6.5.2" + workbox-core "6.5.4" -workbox-recipes@6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/workbox-recipes/-/workbox-recipes-6.5.2.tgz#19f47ec25a8788c65d0cc8d217cbebc0bbbb5c63" - integrity sha512-2lcUKMYDiJKvuvRotOxLjH2z9K7jhj8GNUaHxHNkJYbTCUN3LsX1cWrsgeJFDZ/LgI565t3fntpbG9J415ZBXA== +workbox-recipes@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-recipes/-/workbox-recipes-6.5.4.tgz#cca809ee63b98b158b2702dcfb741b5cc3e24acb" + integrity sha512-QZNO8Ez708NNwzLNEXTG4QYSKQ1ochzEtRLGaq+mr2PyoEIC1xFW7MrWxrONUxBFOByksds9Z4//lKAX8tHyUA== dependencies: - workbox-cacheable-response "6.5.2" - workbox-core "6.5.2" - workbox-expiration "6.5.2" - workbox-precaching "6.5.2" - workbox-routing "6.5.2" - workbox-strategies "6.5.2" + workbox-cacheable-response "6.5.4" + workbox-core "6.5.4" + workbox-expiration "6.5.4" + workbox-precaching "6.5.4" + workbox-routing "6.5.4" + workbox-strategies "6.5.4" -workbox-routing@6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-6.5.2.tgz#e0ad46246ba51224fd57eff0dd46891b3220cb9a" - integrity sha512-nR1w5PjF6IVwo0SX3oE88LhmGFmTnqqU7zpGJQQPZiKJfEKgDENQIM9mh3L1ksdFd9Y3CZVkusopHfxQvit/BA== +workbox-routing@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-6.5.4.tgz#6a7fbbd23f4ac801038d9a0298bc907ee26fe3da" + integrity sha512-apQswLsbrrOsBUWtr9Lf80F+P1sHnQdYodRo32SjiByYi36IDyL2r7BH1lJtFX8fwNHDa1QOVY74WKLLS6o5Pg== dependencies: - workbox-core "6.5.2" + workbox-core "6.5.4" -workbox-strategies@6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-6.5.2.tgz#56b02e6959c6391351011fc2e5b0829aff1ed859" - integrity sha512-fgbwaUMxbG39BHjJIs2y2X21C0bmf1Oq3vMQxJ1hr6y5JMJIm8rvKCcf1EIdAr+PjKdSk4ddmgyBQ4oO8be4Uw== +workbox-strategies@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-6.5.4.tgz#4edda035b3c010fc7f6152918370699334cd204d" + integrity sha512-DEtsxhx0LIYWkJBTQolRxG4EI0setTJkqR4m7r4YpBdxtWJH1Mbg01Cj8ZjNOO8etqfA3IZaOPHUxCs8cBsKLw== dependencies: - workbox-core "6.5.2" + workbox-core "6.5.4" -workbox-streams@6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-6.5.2.tgz#2fb6ba307f7d2cbda63f64522a197be868b4ea25" - integrity sha512-ovD0P4UrgPtZ2Lfc/8E8teb1RqNOSZr+1ZPqLR6sGRZnKZviqKbQC3zVvvkhmOIwhWbpL7bQlWveLVONHjxd5w== +workbox-streams@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-6.5.4.tgz#1cb3c168a6101df7b5269d0353c19e36668d7d69" + integrity sha512-FXKVh87d2RFXkliAIheBojBELIPnWbQdyDvsH3t74Cwhg0fDheL1T8BqSM86hZvC0ZESLsznSYWw+Va+KVbUzg== dependencies: - workbox-core "6.5.2" - workbox-routing "6.5.2" + workbox-core "6.5.4" + workbox-routing "6.5.4" -workbox-sw@6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-6.5.2.tgz#2f5dca0e96c61a450fccf0405095ddf1b6f43bc7" - integrity sha512-2KhlYqtkoqlnPdllj2ujXUKRuEFsRDIp6rdE4l1PsxiFHRAFaRTisRQpGvRem5yxgXEr+fcEKiuZUW2r70KZaw== +workbox-sw@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-6.5.4.tgz#d93e9c67924dd153a61367a4656ff4d2ae2ed736" + integrity sha512-vo2RQo7DILVRoH5LjGqw3nphavEjK4Qk+FenXeUsknKn14eCNedHOXWbmnvP4ipKhlE35pvJ4yl4YYf6YsJArA== -workbox-webpack-plugin@^6.4.1: - version "6.5.2" - resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.2.tgz#0cf6e1d23d5107a88fd8502fd4f534215e1dd298" - integrity sha512-StrJ7wKp5tZuGVcoKLVjFWlhDy+KT7ZWsKnNcD6F08wA9Cpt6JN+PLIrplcsTHbQpoAV8+xg6RvcG0oc9z+RpQ== +workbox-webpack-plugin@^6.4.1, workbox-webpack-plugin@^6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.4.tgz#baf2d3f4b8f435f3469887cf4fba2b7fac3d0fd7" + integrity sha512-LmWm/zoaahe0EGmMTrSLUi+BjyR3cdGEfU3fS6PN1zKFYbqAKuQ+Oy/27e4VSXsyIwAw8+QDfk1XHNGtZu9nQg== dependencies: fast-json-stable-stringify "^2.1.0" pretty-bytes "^5.4.1" upath "^1.2.0" webpack-sources "^1.4.3" - workbox-build "6.5.2" + workbox-build "6.5.4" -workbox-window@6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-6.5.2.tgz#46d6412cd57039bdf3d5dd914ad21fb3f98fe980" - integrity sha512-2kZH37r9Wx8swjEOL4B8uGM53lakMxsKkQ7mOKzGA/QAn/DQTEZGrdHWtypk2tbhKY5S0jvPS+sYDnb2Z3378A== +workbox-window@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-6.5.4.tgz#d991bc0a94dff3c2dbb6b84558cff155ca878e91" + integrity sha512-HnLZJDwYBE+hpG25AQBO8RUWBJRaCsI9ksQJEp3aCOFCaG5kqaToAYXFRAHxzRluM2cQbGzdQF5rjKPWPA1fug== dependencies: "@types/trusted-types" "^2.0.2" - workbox-core "6.5.2" + workbox-core "6.5.4" wrap-ansi@^6.2.0: version "6.2.0" @@ -12614,7 +13063,7 @@ wrap-ansi@^7.0.0: wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== write-file-atomic@^3.0.0: version "3.0.3" @@ -12626,15 +13075,15 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -ws@>=7.4.6, ws@^8.4.2: - version "8.5.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" - integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== +ws@>=8.7.0, ws@^8.4.2: + version "8.11.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" + integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== ws@^7.4.6: - version "7.5.7" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" - integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A== + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== xml-name-validator@^3.0.0: version "3.0.0" @@ -12666,11 +13115,21 @@ yaml@^1.10.0, yaml@^1.10.2, yaml@^1.5.0, yaml@^1.7.2: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yargs-parser@^20.2.2, yargs-parser@^20.x: +yaml@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.1.3.tgz#9b3a4c8aff9821b696275c79a8bee8399d945207" + integrity sha512-AacA8nRULjKMX2DvWvOAdBZMOfQlypSFkjcOcu9FalllIDJ1kvlREzcdIZmidQUqqeMv7jorHjq2HlLv/+c2lg== + +yargs-parser@^20.2.2: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== +yargs-parser@^21.0.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + yargs@^16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" @@ -12708,6 +13167,6 @@ yup@^0.32.9: toposort "^2.0.2" zwitch@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.2.tgz#91f8d0e901ffa3d66599756dde7f57b17c95dce1" - integrity sha512-JZxotl7SxAJH0j7dN4pxsTV6ZLXoLdGME+PsjkL/DaBrVryK9kTGq06GfKrwcSOqypP+fdXGoCHE36b99fWVoA== + version "2.0.4" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" + integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== From a93fefa92b7bd82568a47c706aaf0326a83454f4 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Tue, 29 Nov 2022 17:26:02 +1100 Subject: [PATCH 306/309] lock react-router-dom to v6.3.0 --- package.json | 2 +- yarn.lock | 36 +++++++++++++++++++----------------- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index 67e11563..4fac6672 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "react-image": "^4", "react-json-view": "^1.21.3", "react-markdown": "^8.0.3", - "react-router-dom": "^6.3.0", + "react-router-dom": "6.3.0", "react-router-hash-link": "^2.4.3", "react-scripts": "^5.0.1", "react-usestateref": "^1.0.8", diff --git a/yarn.lock b/yarn.lock index 3f159757..003c37e7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1137,7 +1137,7 @@ core-js-pure "^3.25.1" regenerator-runtime "^0.13.11" -"@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.6", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.9", "@babel/runtime@^7.20.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.6", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.9", "@babel/runtime@^7.20.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.20.6" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.6.tgz#facf4879bfed9b5326326273a64220f099b0fce3" integrity sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA== @@ -2521,11 +2521,6 @@ resolved "https://registry.yarnpkg.com/@react-dnd/shallowequal/-/shallowequal-4.0.2.tgz#d1b4befa423f692fa4abf1c79209702e7d8ae4b4" integrity sha512-/RVXdLvJxLg4QKvMoM5WlwNR9ViO9z8B/qPcc+C0Sa/teJY7QG7kJ441DwzOjMYEY7GmU4dj5EcGHIkKZiQZCA== -"@remix-run/router@1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.0.3.tgz#953b88c20ea00d0eddaffdc1b115c08474aa295d" - integrity sha512-ceuyTSs7PZ/tQqi19YZNBc5X7kj1f8p+4DIyrcIYFY9h+hd1OKm4RqtiWldR9eGEvIiJfsqwM4BsuCtRIuEw6Q== - "@rollup/plugin-babel@^5.2.0": version "5.3.1" resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz#04bc0608f4aa4b2e4b1aebf284344d0f68fda283" @@ -6749,6 +6744,13 @@ he@^1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +history@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/history/-/history-5.3.0.tgz#1548abaa245ba47992f063a0783db91ef201c73b" + integrity sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ== + dependencies: + "@babel/runtime" "^7.7.6" + hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" @@ -10583,13 +10585,13 @@ react-refresh@^0.11.0: resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.11.0.tgz#77198b944733f0f1f1a90e791de4541f9f074046" integrity sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A== -react-router-dom@^6.3.0: - version "6.4.3" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.4.3.tgz#70093b5f65f85f1df9e5d4182eb7ff3a08299275" - integrity sha512-MiaYQU8CwVCaOfJdYvt84KQNjT78VF0TJrA17SIQgNHRvLnXDJO6qsFqq8F/zzB1BWZjCFIrQpu4QxcshitziQ== +react-router-dom@6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.3.0.tgz#a0216da813454e521905b5fa55e0e5176123f43d" + integrity sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw== dependencies: - "@remix-run/router" "1.0.3" - react-router "6.4.3" + history "^5.2.0" + react-router "6.3.0" react-router-hash-link@^2.4.3: version "2.4.3" @@ -10598,12 +10600,12 @@ react-router-hash-link@^2.4.3: dependencies: prop-types "^15.7.2" -react-router@6.4.3: - version "6.4.3" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.4.3.tgz#9ed3ee4d6e95889e9b075a5d63e29acc7def0d49" - integrity sha512-BT6DoGn6aV1FVP5yfODMOiieakp3z46P1Fk0RNzJMACzE7C339sFuHebfvWtnB4pzBvXXkHP2vscJzWRuUjTtA== +react-router@6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.3.0.tgz#3970cc64b4cb4eae0c1ea5203a80334fdd175557" + integrity sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ== dependencies: - "@remix-run/router" "1.0.3" + history "^5.2.0" react-scripts@^5.0.1: version "5.0.1" From bc48d809bcc0e4f73c3157b984e3756eeb9184e1 Mon Sep 17 00:00:00 2001 From: Raj Gaurav Maurya Date: Tue, 29 Nov 2022 17:57:45 +0530 Subject: [PATCH 307/309] Feat:Email validation regex field added along with default values (#820) * Feat:Email validation regex field added along with default values Signed-off-by: Raj Gaurav Maurya * Bug:regex fixed Signed-off-by: Raj Gaurav Maurya * Update CONTRIBUTING.md * ref added with button and inputfield but current not working Signed-off-by: Raj Gaurav Maurya * Feat: standard Regex is now being filled into the input * Feat: Copy feature added, ref deleted, working as expected Signed-off-by: Raj Gaurav Maurya * Update src/components/fields/Email/Settings.tsx * Update src/components/fields/Email/Settings.tsx Signed-off-by: Raj Gaurav Maurya Co-authored-by: Sidney Alcantara --- src/components/fields/Email/Settings.tsx | 28 ++++++++++++++++++++++++ src/components/fields/Email/index.tsx | 5 +++++ 2 files changed, 33 insertions(+) create mode 100644 src/components/fields/Email/Settings.tsx diff --git a/src/components/fields/Email/Settings.tsx b/src/components/fields/Email/Settings.tsx new file mode 100644 index 00000000..72246736 --- /dev/null +++ b/src/components/fields/Email/Settings.tsx @@ -0,0 +1,28 @@ +import { ISettingsProps } from "@src/components/fields/types"; +import { TextField, Button } from "@mui/material"; + +export default function Settings({ onChange, config }: ISettingsProps) { + + const copyStandardRegex = () => { + onChange("validationRegex")("^[a-zA-Z0-9+_.-]+@[a-zA-Z0-9.-]+.[a-zA-z]{2,3}$"); + } + + return ( + <> + { + if (e.target.value === "") onChange("validationRegex")(null); + else onChange("validationRegex")(e.target.value); + }} + /> + + + ); +} diff --git a/src/components/fields/Email/index.tsx b/src/components/fields/Email/index.tsx index 3ea395d8..29e274c0 100644 --- a/src/components/fields/Email/index.tsx +++ b/src/components/fields/Email/index.tsx @@ -13,6 +13,10 @@ const SideDrawerField = lazy( import("./SideDrawerField" /* webpackChunkName: "SideDrawerField-Email" */) ); +const Settings = lazy( + () => import("./Settings" /* webpackChunkName: "Settings-ShortText" */) +); + export const config: IFieldConfig = { type: FieldType.email, name: "Email", @@ -25,6 +29,7 @@ export const config: IFieldConfig = { contextMenuActions: BasicContextMenuActions, TableCell: withRenderTableCell(DisplayCell, EditorCell), SideDrawerField, + settings: Settings, filter: { operators: filterOperators, }, From d7065ad8bb99276cceb095c5e4269a36d8761c4d Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Wed, 30 Nov 2022 15:32:28 +1100 Subject: [PATCH 308/309] fix mock cell crashing --- src/components/Table/Mock/Cell.tsx | 97 +++++++++++++----------------- 1 file changed, 41 insertions(+), 56 deletions(-) diff --git a/src/components/Table/Mock/Cell.tsx b/src/components/Table/Mock/Cell.tsx index b614e9ce..959765a0 100644 --- a/src/components/Table/Mock/Cell.tsx +++ b/src/components/Table/Mock/Cell.tsx @@ -1,46 +1,12 @@ import { createElement } from "react"; -import { styled } from "@mui/material"; +import StyledTable from "@src/components/Table/Styled/StyledTable"; +import StyledCell from "@src/components/Table/Styled/StyledCell"; import EmptyState from "@src/components/EmptyState"; import { FieldType } from "@src/constants/fields"; import { getFieldProp } from "@src/components/fields"; - -const Root = styled("div")(({ theme }) => ({ - width: "100%", - height: 43, - position: "relative", - overflow: "hidden", - whiteSpace: "nowrap", - - pointerEvents: "none", - - border: `1px solid ${theme.palette.divider}`, - borderTopWidth: 0, - backgroundColor: theme.palette.background.paper, - - display: "flex", - alignItems: "center", - padding: theme.spacing(0, 1.25), - - ...theme.typography.body2, - fontSize: "0.75rem", - lineHeight: "inherit", - color: theme.palette.text.secondary, - - "& .cell-collapse-padding": { - margin: theme.spacing(0, -1.5), - width: `calc(100% + ${theme.spacing(3)})`, - }, -})); - -const Value = styled("div")(({ theme }) => ({ - width: "100%", - height: 43, - display: "flex", - justifyContent: "flex-start", - alignItems: "center", -})); +import { DEFAULT_ROW_HEIGHT } from "@src/components/Table"; export interface ICellProps extends Partial< @@ -53,6 +19,7 @@ export interface ICellProps type: FieldType; value: any; name?: string; + rowHeight?: number; } export default function Cell({ @@ -60,29 +27,47 @@ export default function Cell({ type, value, name, + rowHeight = DEFAULT_ROW_HEIGHT, ...props }: ICellProps) { - const formatter = type ? getFieldProp("TableCell", type) : null; + const tableCell = type ? getFieldProp("TableCell", type) : null; return ( - - - {formatter ? ( - createElement(formatter, { + + + {tableCell ? ( + createElement(tableCell, { value, - rowIdx: 0, column: { - type, - key: field, - name, - config: { options: [] }, - editable: false, - } as any, - row: { [field]: value }, - isRowSelected: false, - onRowSelectionChange: () => {}, - isSummaryRow: false, - } as any) + columnDef: { + meta: { + type, + key: field, + name, + config: { options: [] }, + editable: false, + }, + }, + }, + row: { + original: { + _rowy_ref: { path: "_rowy_/_mockCell" }, + [field]: value, + }, + }, + focusInsideCell: false, + disabled: true, + rowHeight: DEFAULT_ROW_HEIGHT, + }) ) : typeof value === "string" || typeof value === "number" || value === undefined || @@ -93,7 +78,7 @@ export default function Cell({ ) : ( )} - - + + ); } From 9d146d7478fa99bc0fcd889fde821d569e5fcd20 Mon Sep 17 00:00:00 2001 From: Sidney Alcantara Date: Wed, 30 Nov 2022 15:37:43 +1100 Subject: [PATCH 309/309] ROWY-795 change useFirestoreDocWithAtom createIfNonExistent behavior to prevent existing documents being reset --- src/hooks/useFirestoreDocWithAtom.ts | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/hooks/useFirestoreDocWithAtom.ts b/src/hooks/useFirestoreDocWithAtom.ts index c387a3bb..49736600 100644 --- a/src/hooks/useFirestoreDocWithAtom.ts +++ b/src/hooks/useFirestoreDocWithAtom.ts @@ -88,15 +88,12 @@ export function useFirestoreDocWithAtom( { includeMetadataChanges: true }, (docSnapshot) => { try { - // Create doc if it doesn’t exist and we’re online - // WARNING: If offline and we doc doesn’t exist in cache, it will - // ovewrite with default values when we go online - if ( - !docSnapshot.exists() && - !!createIfNonExistent && - !docSnapshot.metadata.fromCache - ) { - setDoc(docSnapshot.ref, createIfNonExistent); + // If doc doesn’t exist, set data atom to default value + // But don’t create a new document in db, since this has previously + // caused documents to be reset, and the bug is hard to reproduce. + // Instead, when the user updates the document, it will be created. + if (!docSnapshot.exists() && !!createIfNonExistent) { + // Temporarily set the data atom to the default data setDataAtom({ ...createIfNonExistent, _rowy_ref: docSnapshot.ref }); } else { setDataAtom({