From fa7c47922825ba331598473c2a79217ba8983e9b Mon Sep 17 00:00:00 2001 From: jaybuidl Date: Tue, 3 Oct 2023 02:15:32 +0100 Subject: [PATCH] feat: mixpanel experimentation (wip) --- web/package.json | 4 + web/src/app.tsx | 2 + web/src/components/CasesDisplay/index.tsx | 54 +++-- .../ConnectWallet/AccountDisplay.tsx | 2 + web/src/components/ConnectWallet/index.tsx | 3 + web/src/hooks/useTracking.ts | 23 ++ .../Evidence/SubmitEvidenceModal.tsx | 6 + .../StakePanel/StakeWithdrawButton.tsx | 11 + web/src/utils/mixpanel.ts | 9 + yarn.lock | 197 +++++++++++++++++- 10 files changed, 281 insertions(+), 30 deletions(-) create mode 100644 web/src/hooks/useTracking.ts create mode 100644 web/src/utils/mixpanel.ts diff --git a/web/package.json b/web/package.json index ea2cc5bb4..732f5b4c7 100644 --- a/web/package.json +++ b/web/package.json @@ -48,6 +48,7 @@ "@parcel/watcher": "~2.2.0", "@types/amqplib": "^0.10.1", "@types/busboy": "^1.5.0", + "@types/mixpanel-browser": "^2.47.3", "@types/react": "^18.2.14", "@types/react-dom": "^18.2.7", "@types/styled-components": "^5.1.26", @@ -55,6 +56,7 @@ "@typescript-eslint/parser": "^5.61.0", "@typescript-eslint/utils": "^5.58.0", "@wagmi/cli": "^1.3.0", + "crypto-browserify": "^3.12.0", "eslint": "^8.38.0", "eslint-config-prettier": "^8.8.0", "eslint-import-resolver-parcel": "^1.10.6", @@ -62,6 +64,7 @@ "eslint-plugin-react-hooks": "^4.6.0", "lru-cache": "^7.18.3", "parcel": "2.8.3", + "string_decoder": "^1.3.0", "typescript": "^4.9.5" }, "dependencies": { @@ -81,6 +84,7 @@ "ethers": "^5.7.2", "graphql": "^16.7.1", "graphql-request": "~6.1.0", + "mixpanel-browser": "^2.47.0", "moment": "^2.29.4", "overlayscrollbars": "^2.3.0", "overlayscrollbars-react": "^0.5.2", diff --git a/web/src/app.tsx b/web/src/app.tsx index 594489272..bbcee6e44 100644 --- a/web/src/app.tsx +++ b/web/src/app.tsx @@ -14,8 +14,10 @@ import Cases from "./pages/Cases"; import Dashboard from "./pages/Dashboard"; import Courts from "./pages/Courts"; import DisputeTemplateView from "./pages/DisputeTemplateView"; +import mixpanel from "./utils/mixpanel"; const App: React.FC = () => { + mixpanel.track("App"); return ( diff --git a/web/src/components/CasesDisplay/index.tsx b/web/src/components/CasesDisplay/index.tsx index a02a5e4fc..17047aee2 100644 --- a/web/src/components/CasesDisplay/index.tsx +++ b/web/src/components/CasesDisplay/index.tsx @@ -3,6 +3,7 @@ import styled from "styled-components"; import Search from "./Search"; import StatsAndFilters from "./StatsAndFilters"; import CasesGrid, { ICasesGrid } from "./CasesGrid"; +import useTracking from "../../hooks/useTracking"; const StyledHR = styled.hr` margin-top: 24px; @@ -22,26 +23,37 @@ const CasesDisplay: React.FC = ({ casesPerPage, title = "Cases", className, -}) => ( -
-

{title}

- - - - {disputes.length > 0 ? ( - - ) : ( -

wow no cases

- )} -
-); +}) => { + useTracking("CasesDisplay", { + disputes, + currentPage, + setCurrentPage, + numberDisputes, + casesPerPage, + title, + className, + }); + return ( +
+

{title}

+ + + + {disputes.length > 0 ? ( + + ) : ( +

wow no cases

+ )} +
+ ); +}; export default CasesDisplay; diff --git a/web/src/components/ConnectWallet/AccountDisplay.tsx b/web/src/components/ConnectWallet/AccountDisplay.tsx index d39e7c60e..2dd42f502 100644 --- a/web/src/components/ConnectWallet/AccountDisplay.tsx +++ b/web/src/components/ConnectWallet/AccountDisplay.tsx @@ -4,6 +4,7 @@ import { landscapeStyle } from "styles/landscapeStyle"; import { useAccount, useNetwork, useEnsAvatar, useEnsName } from "wagmi"; import Identicon from "react-identicons"; import { shortenAddress } from "utils/shortenAddress"; +import { useIdentify } from "../../hooks/useTracking"; const Container = styled.div` display: flex; @@ -119,6 +120,7 @@ export const AddressOrName: React.FC = () => { address, chainId: 1, }); + useIdentify(address); return ; }; diff --git a/web/src/components/ConnectWallet/index.tsx b/web/src/components/ConnectWallet/index.tsx index f1c30a007..7c642ccb6 100644 --- a/web/src/components/ConnectWallet/index.tsx +++ b/web/src/components/ConnectWallet/index.tsx @@ -3,10 +3,12 @@ import { useAccount, useNetwork, useSwitchNetwork } from "wagmi"; import { useWeb3Modal } from "@web3modal/react"; import { Button } from "@kleros/ui-components-library"; import { SUPPORTED_CHAINS, DEFAULT_CHAIN } from "consts/chains"; +import useTracking from "../../hooks/useTracking"; import AccountDisplay from "./AccountDisplay"; export const SwitchChainButton: React.FC = () => { const { switchNetwork, isLoading } = useSwitchNetwork(); + useTracking("Switch Network"); const handleSwitch = () => { if (!switchNetwork) { console.error("Cannot switch network. Please do it manually."); @@ -36,6 +38,7 @@ const ConnectButton: React.FC = () => { const ConnectWallet: React.FC = () => { const { chain } = useNetwork(); const { isConnected } = useAccount(); + useTracking("Connect Wallet", { chain }); if (isConnected) { if (chain && chain.id !== DEFAULT_CHAIN) { return ; diff --git a/web/src/hooks/useTracking.ts b/web/src/hooks/useTracking.ts new file mode 100644 index 000000000..ad571ce0a --- /dev/null +++ b/web/src/hooks/useTracking.ts @@ -0,0 +1,23 @@ +// useTracking.ts +import { useEffect } from "react"; +import mixpanel from "../utils/mixpanel"; +import crypto from "crypto"; + +const useTracking = (eventName: string, props?: object) => { + useEffect(() => { + mixpanel.track(eventName, { + pathname: window.location.pathname, + ...(props ?? {}), + }); + }, [eventName, props]); +}; + +export const useIdentify = (userId: string | undefined, props?: object) => { + useEffect(() => { + if (userId) { + mixpanel.identify(crypto.createHash("sha256").update(userId).digest("hex")); + } + }, [userId, props]); +}; + +export default useTracking; diff --git a/web/src/pages/Cases/CaseDetails/Evidence/SubmitEvidenceModal.tsx b/web/src/pages/Cases/CaseDetails/Evidence/SubmitEvidenceModal.tsx index c844d036c..0e6787a52 100644 --- a/web/src/pages/Cases/CaseDetails/Evidence/SubmitEvidenceModal.tsx +++ b/web/src/pages/Cases/CaseDetails/Evidence/SubmitEvidenceModal.tsx @@ -8,6 +8,7 @@ import { uploadFormDataToIPFS } from "utils/uploadFormDataToIPFS"; import { useWalletClient, usePublicClient } from "wagmi"; import { EnsureChain } from "components/EnsureChain"; import { prepareWriteDisputeKitClassic } from "hooks/contracts/generated"; +import mixpanel from "../../../../utils/mixpanel"; const StyledModal = styled(Modal)` position: absolute; @@ -82,6 +83,11 @@ const SubmitEvidenceModal: React.FC<{ }); await wrapWithToast(async () => await walletClient.writeContract(request), publicClient).then( () => { + mixpanel.track("submitEvidence", { + pathname: window.location.pathname, + cid, + evidenceGroup, + }); setMessage(""); close(); } diff --git a/web/src/pages/Courts/CourtDetails/StakePanel/StakeWithdrawButton.tsx b/web/src/pages/Courts/CourtDetails/StakePanel/StakeWithdrawButton.tsx index 24394eb21..baa1bd022 100644 --- a/web/src/pages/Courts/CourtDetails/StakePanel/StakeWithdrawButton.tsx +++ b/web/src/pages/Courts/CourtDetails/StakePanel/StakeWithdrawButton.tsx @@ -16,6 +16,7 @@ import { useCourtDetails } from "hooks/queries/useCourtDetails"; import { wrapWithToast } from "utils/wrapWithToast"; import { isUndefined } from "utils/index"; import { EnsureChain } from "components/EnsureChain"; +import mixpanel from "../../../../utils/mixpanel"; export enum ActionType { allowance = "allowance", @@ -87,6 +88,10 @@ const StakeWithdrawButton: React.FC = ({ wrapWithToast(async () => await increaseAllowance().then((response) => response.hash), publicClient).finally( () => { setIsSending(false); + mixpanel.track("increaseAllowance", { + pathname: window.location.pathname, + amount: increaseAllowanceConfig.request.args[1].toString(), + }); } ); } @@ -104,6 +109,12 @@ const StakeWithdrawButton: React.FC = ({ .then(() => setIsPopupOpen(true)) .finally(() => { setIsSending(false); + mixpanel.track("setStake", { + pathname: window.location.pathname, + action: isStaking ? "stake" : "withdraw", + courtId: id, + stakeChange: (isStaking ? "" : "-") + parsedAmount.toString(), + }); }); } }; diff --git a/web/src/utils/mixpanel.ts b/web/src/utils/mixpanel.ts new file mode 100644 index 000000000..d75124db2 --- /dev/null +++ b/web/src/utils/mixpanel.ts @@ -0,0 +1,9 @@ +import mixpanel from "mixpanel-browser"; + +mixpanel.init(process.env.REACT_APP_MIXPANEL_TOKEN!, { + debug: true, + track_pageview: true, + persistence: "localStorage", +}); + +export default mixpanel; diff --git a/yarn.lock b/yarn.lock index 08ed4e0ac..a80fa16bc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5264,6 +5264,7 @@ __metadata: "@tanstack/react-query": ^4.28.0 "@types/amqplib": ^0.10.1 "@types/busboy": ^1.5.0 + "@types/mixpanel-browser": ^2.47.3 "@types/react": ^18.2.14 "@types/react-dom": ^18.2.7 "@types/react-modal": ^3.16.0 @@ -5278,6 +5279,7 @@ __metadata: chart.js: ^3.9.1 chartjs-adapter-moment: ^1.0.1 core-js: ^3.31.0 + crypto-browserify: ^3.12.0 eslint: ^8.38.0 eslint-config-prettier: ^8.8.0 eslint-import-resolver-parcel: ^1.10.6 @@ -5287,6 +5289,7 @@ __metadata: graphql: ^16.7.1 graphql-request: ~6.1.0 lru-cache: ^7.18.3 + mixpanel-browser: ^2.47.0 moment: ^2.29.4 overlayscrollbars: ^2.3.0 overlayscrollbars-react: ^0.5.2 @@ -5304,6 +5307,7 @@ __metadata: react-scripts: ^5.0.1 react-toastify: ^9.1.3 react-use: ^17.4.0 + string_decoder: ^1.3.0 styled-components: ^5.3.9 typescript: ^4.9.5 viem: ^0.3.48 @@ -8902,6 +8906,13 @@ __metadata: languageName: node linkType: hard +"@types/mixpanel-browser@npm:^2.47.3": + version: 2.47.3 + resolution: "@types/mixpanel-browser@npm:2.47.3" + checksum: 7ca14ec29f7a4cd29389c1a96395dae90d48e01d363e209d34b6b89fd78bed9baf735057a7ecdeb0a4e47c85e2448d98e270ba5e72575000e07d011f71fdd49d + languageName: node + linkType: hard + "@types/mocha@npm:^10.0.1": version: 10.0.1 resolution: "@types/mocha@npm:10.0.1" @@ -11079,6 +11090,18 @@ __metadata: languageName: node linkType: hard +"asn1.js@npm:^5.2.0": + version: 5.4.1 + resolution: "asn1.js@npm:5.4.1" + dependencies: + bn.js: ^4.0.0 + inherits: ^2.0.1 + minimalistic-assert: ^1.0.0 + safer-buffer: ^2.1.0 + checksum: 3786a101ac6f304bd4e9a7df79549a7561950a13d4bcaec0c7790d44c80d147c1a94ba3d4e663673406064642a40b23fcd6c82a9952468e386c1a1376d747f9a + languageName: node + linkType: hard + "asn1@npm:^0.2.6, asn1@npm:~0.2.3": version: 0.2.6 resolution: "asn1@npm:0.2.6" @@ -11774,7 +11797,7 @@ __metadata: languageName: node linkType: hard -"bn.js@npm:^4.11.0, bn.js@npm:^4.11.8, bn.js@npm:^4.11.9": +"bn.js@npm:^4.0.0, bn.js@npm:^4.1.0, bn.js@npm:^4.11.0, bn.js@npm:^4.11.8, bn.js@npm:^4.11.9": version: 4.12.0 resolution: "bn.js@npm:4.12.0" checksum: 39afb4f15f4ea537b55eaf1446c896af28ac948fdcf47171961475724d1bb65118cca49fa6e3d67706e4790955ec0e74de584e45c8f1ef89f46c812bee5b5a12 @@ -11873,7 +11896,7 @@ __metadata: languageName: node linkType: hard -"brorand@npm:^1.1.0": +"brorand@npm:^1.0.1, brorand@npm:^1.1.0": version: 1.1.0 resolution: "brorand@npm:1.1.0" checksum: 8a05c9f3c4b46572dec6ef71012b1946db6cae8c7bb60ccd4b7dd5a84655db49fe043ecc6272e7ef1f69dc53d6730b9e2a3a03a8310509a3d797a618cbee52be @@ -11920,7 +11943,7 @@ __metadata: languageName: node linkType: hard -"browserify-aes@npm:^1.2.0": +"browserify-aes@npm:^1.0.0, browserify-aes@npm:^1.0.4, browserify-aes@npm:^1.2.0": version: 1.2.0 resolution: "browserify-aes@npm:1.2.0" dependencies: @@ -11934,6 +11957,56 @@ __metadata: languageName: node linkType: hard +"browserify-cipher@npm:^1.0.0": + version: 1.0.1 + resolution: "browserify-cipher@npm:1.0.1" + dependencies: + browserify-aes: ^1.0.4 + browserify-des: ^1.0.0 + evp_bytestokey: ^1.0.0 + checksum: 2d8500acf1ee535e6bebe808f7a20e4c3a9e2ed1a6885fff1facbfd201ac013ef030422bec65ca9ece8ffe82b03ca580421463f9c45af6c8415fd629f4118c13 + languageName: node + linkType: hard + +"browserify-des@npm:^1.0.0": + version: 1.0.2 + resolution: "browserify-des@npm:1.0.2" + dependencies: + cipher-base: ^1.0.1 + des.js: ^1.0.0 + inherits: ^2.0.1 + safe-buffer: ^5.1.2 + checksum: b15a3e358a1d78a3b62ddc06c845d02afde6fc826dab23f1b9c016e643e7b1fda41de628d2110b712f6a44fb10cbc1800bc6872a03ddd363fb50768e010395b7 + languageName: node + linkType: hard + +"browserify-rsa@npm:^4.0.0, browserify-rsa@npm:^4.0.1": + version: 4.1.0 + resolution: "browserify-rsa@npm:4.1.0" + dependencies: + bn.js: ^5.0.0 + randombytes: ^2.0.1 + checksum: 155f0c135873efc85620571a33d884aa8810e40176125ad424ec9d85016ff105a07f6231650914a760cca66f29af0494087947b7be34880dd4599a0cd3c38e54 + languageName: node + linkType: hard + +"browserify-sign@npm:^4.0.0": + version: 4.2.1 + resolution: "browserify-sign@npm:4.2.1" + dependencies: + bn.js: ^5.1.1 + browserify-rsa: ^4.0.1 + create-hash: ^1.2.0 + create-hmac: ^1.1.7 + elliptic: ^6.5.3 + inherits: ^2.0.4 + parse-asn1: ^5.1.5 + readable-stream: ^3.6.0 + safe-buffer: ^5.2.0 + checksum: 0221f190e3f5b2d40183fa51621be7e838d9caa329fe1ba773406b7637855f37b30f5d83e52ff8f244ed12ffe6278dd9983638609ed88c841ce547e603855707 + languageName: node + linkType: hard + "browserslist@npm:^4.0.0, browserslist@npm:^4.14.5, browserslist@npm:^4.18.1, browserslist@npm:^4.21.3, browserslist@npm:^4.21.4, browserslist@npm:^4.21.5, browserslist@npm:^4.6.6": version: 4.21.9 resolution: "browserslist@npm:4.21.9" @@ -13545,6 +13618,16 @@ __metadata: languageName: node linkType: hard +"create-ecdh@npm:^4.0.0": + version: 4.0.4 + resolution: "create-ecdh@npm:4.0.4" + dependencies: + bn.js: ^4.1.0 + elliptic: ^6.5.3 + checksum: 0dd7fca9711d09e152375b79acf1e3f306d1a25ba87b8ff14c2fd8e68b83aafe0a7dd6c4e540c9ffbdd227a5fa1ad9b81eca1f233c38bb47770597ba247e614b + languageName: node + linkType: hard + "create-hash@npm:^1.1.0, create-hash@npm:^1.1.2, create-hash@npm:^1.2.0": version: 1.2.0 resolution: "create-hash@npm:1.2.0" @@ -13558,7 +13641,7 @@ __metadata: languageName: node linkType: hard -"create-hmac@npm:^1.1.4, create-hmac@npm:^1.1.7": +"create-hmac@npm:^1.1.0, create-hmac@npm:^1.1.4, create-hmac@npm:^1.1.7": version: 1.1.7 resolution: "create-hmac@npm:1.1.7" dependencies: @@ -13619,6 +13702,25 @@ __metadata: languageName: node linkType: hard +"crypto-browserify@npm:^3.12.0": + version: 3.12.0 + resolution: "crypto-browserify@npm:3.12.0" + dependencies: + browserify-cipher: ^1.0.0 + browserify-sign: ^4.0.0 + create-ecdh: ^4.0.0 + create-hash: ^1.1.0 + create-hmac: ^1.1.0 + diffie-hellman: ^5.0.0 + inherits: ^2.0.1 + pbkdf2: ^3.0.3 + public-encrypt: ^4.0.0 + randombytes: ^2.0.0 + randomfill: ^1.0.3 + checksum: c1609af82605474262f3eaa07daa0b2140026bd264ab316d4bf1170272570dbe02f0c49e29407fe0d3634f96c507c27a19a6765fb856fed854a625f9d15618e2 + languageName: node + linkType: hard + "crypto-random-string@npm:^2.0.0": version: 2.0.0 resolution: "crypto-random-string@npm:2.0.0" @@ -14263,6 +14365,16 @@ __metadata: languageName: node linkType: hard +"des.js@npm:^1.0.0": + version: 1.1.0 + resolution: "des.js@npm:1.1.0" + dependencies: + inherits: ^2.0.1 + minimalistic-assert: ^1.0.0 + checksum: 0e9c1584b70d31e20f20a613fc9ef60fbc6a147dfec9e448a168794a4b97ac04d8dc47ea008f1fa93b0f8aaf7c1ead632a5e59ce1913a6079d2d244c9f5ebe33 + languageName: node + linkType: hard + "destroy@npm:1.2.0": version: 1.2.0 resolution: "destroy@npm:1.2.0" @@ -14384,6 +14496,17 @@ __metadata: languageName: node linkType: hard +"diffie-hellman@npm:^5.0.0": + version: 5.0.3 + resolution: "diffie-hellman@npm:5.0.3" + dependencies: + bn.js: ^4.1.0 + miller-rabin: ^4.0.0 + randombytes: ^2.0.0 + checksum: 0e620f322170c41076e70181dd1c24e23b08b47dbb92a22a644f3b89b6d3834b0f8ee19e37916164e5eb1ee26d2aa836d6129f92723995267250a0b541811065 + languageName: node + linkType: hard + "difflib@npm:^0.2.4": version: 0.2.4 resolution: "difflib@npm:0.2.4" @@ -14779,7 +14902,7 @@ __metadata: languageName: node linkType: hard -"elliptic@npm:6.5.4, elliptic@npm:^6.5.2, elliptic@npm:^6.5.4": +"elliptic@npm:6.5.4, elliptic@npm:^6.5.2, elliptic@npm:^6.5.3, elliptic@npm:^6.5.4": version: 6.5.4 resolution: "elliptic@npm:6.5.4" dependencies: @@ -16144,7 +16267,7 @@ __metadata: languageName: node linkType: hard -"evp_bytestokey@npm:^1.0.3": +"evp_bytestokey@npm:^1.0.0, evp_bytestokey@npm:^1.0.3": version: 1.0.3 resolution: "evp_bytestokey@npm:1.0.3" dependencies: @@ -22616,6 +22739,18 @@ __metadata: languageName: node linkType: hard +"miller-rabin@npm:^4.0.0": + version: 4.0.1 + resolution: "miller-rabin@npm:4.0.1" + dependencies: + bn.js: ^4.0.0 + brorand: ^1.0.1 + bin: + miller-rabin: bin/miller-rabin + checksum: 00cd1ab838ac49b03f236cc32a14d29d7d28637a53096bf5c6246a032a37749c9bd9ce7360cbf55b41b89b7d649824949ff12bc8eee29ac77c6b38eada619ece + languageName: node + linkType: hard + "mime-db@npm:1.52.0, mime-db@npm:>= 1.43.0 < 2": version: 1.52.0 resolution: "mime-db@npm:1.52.0" @@ -22871,6 +23006,13 @@ __metadata: languageName: node linkType: hard +"mixpanel-browser@npm:^2.47.0": + version: 2.47.0 + resolution: "mixpanel-browser@npm:2.47.0" + checksum: f44e0e0ac70b3772ed1be7c826d3cb0ffbf2dda35e6b927a3f7167795283745ae16573ae6ba303238bf776e3a5ed72c98c3c3f97e2a3c72bcbada15b956e9e9d + languageName: node + linkType: hard + "mkdirp-classic@npm:^0.5.2": version: 0.5.3 resolution: "mkdirp-classic@npm:0.5.3" @@ -24246,6 +24388,19 @@ __metadata: languageName: node linkType: hard +"parse-asn1@npm:^5.0.0, parse-asn1@npm:^5.1.5": + version: 5.1.6 + resolution: "parse-asn1@npm:5.1.6" + dependencies: + asn1.js: ^5.2.0 + browserify-aes: ^1.0.0 + evp_bytestokey: ^1.0.0 + pbkdf2: ^3.0.3 + safe-buffer: ^5.1.1 + checksum: 9243311d1f88089bc9f2158972aa38d1abd5452f7b7cabf84954ed766048fe574d434d82c6f5a39b988683e96fb84cd933071dda38927e03469dc8c8d14463c7 + languageName: node + linkType: hard + "parse-cache-control@npm:^1.0.1": version: 1.0.1 resolution: "parse-cache-control@npm:1.0.1" @@ -24456,7 +24611,7 @@ __metadata: languageName: node linkType: hard -"pbkdf2@npm:^3.0.17": +"pbkdf2@npm:^3.0.17, pbkdf2@npm:^3.0.3": version: 3.1.2 resolution: "pbkdf2@npm:3.1.2" dependencies: @@ -25830,6 +25985,20 @@ __metadata: languageName: node linkType: hard +"public-encrypt@npm:^4.0.0": + version: 4.0.3 + resolution: "public-encrypt@npm:4.0.3" + dependencies: + bn.js: ^4.1.0 + browserify-rsa: ^4.0.0 + create-hash: ^1.1.0 + parse-asn1: ^5.0.0 + randombytes: ^2.0.1 + safe-buffer: ^5.1.2 + checksum: 215d446e43cef021a20b67c1df455e5eea134af0b1f9b8a35f9e850abf32991b0c307327bc5b9bc07162c288d5cdb3d4a783ea6c6640979ed7b5017e3e0c9935 + languageName: node + linkType: hard + "pump@npm:^1.0.0": version: 1.0.3 resolution: "pump@npm:1.0.3" @@ -26012,7 +26181,7 @@ __metadata: languageName: node linkType: hard -"randombytes@npm:^2.1.0": +"randombytes@npm:^2.0.0, randombytes@npm:^2.0.1, randombytes@npm:^2.0.5, randombytes@npm:^2.1.0": version: 2.1.0 resolution: "randombytes@npm:2.1.0" dependencies: @@ -26021,6 +26190,16 @@ __metadata: languageName: node linkType: hard +"randomfill@npm:^1.0.3": + version: 1.0.4 + resolution: "randomfill@npm:1.0.4" + dependencies: + randombytes: ^2.0.5 + safe-buffer: ^5.1.0 + checksum: 33734bb578a868d29ee1b8555e21a36711db084065d94e019a6d03caa67debef8d6a1bfd06a2b597e32901ddc761ab483a85393f0d9a75838f1912461d4dbfc7 + languageName: node + linkType: hard + "range-parser@npm:^1.2.1, range-parser@npm:~1.2.1": version: 1.2.1 resolution: "range-parser@npm:1.2.1" @@ -28767,7 +28946,7 @@ __metadata: languageName: node linkType: hard -"string_decoder@npm:^1.1.1": +"string_decoder@npm:^1.1.1, string_decoder@npm:^1.3.0": version: 1.3.0 resolution: "string_decoder@npm:1.3.0" dependencies: