diff --git a/plugins-structure/apps/politeia/cypress/e2e/navigation.cy.js b/plugins-structure/apps/politeia/cypress/e2e/navigation.cy.js index 7048c1132..a96e9a2ea 100644 --- a/plugins-structure/apps/politeia/cypress/e2e/navigation.cy.js +++ b/plugins-structure/apps/politeia/cypress/e2e/navigation.cy.js @@ -52,7 +52,7 @@ beforeEach(() => { describe("Given Politeia app navigation", () => { it("should navigate to Details page when clicking on Proposal card", () => { cy.visit("/"); - cy.findAllByTestId("record-card-title-link").first().click(); + cy.findAllByTestId("proposal-card-title-link").first().click(); // Should fetch details, comments and pi summaires cy.wait("@details"); cy.wait("@comments"); @@ -94,7 +94,7 @@ describe("Given Politeia app navigation", () => { it("shouldn't fetch duplicated data", () => { cy.visit("/"); // navigate to details page - cy.findAllByTestId("record-card-title-link").first().click(); + cy.findAllByTestId("proposal-card-title-link").first().click(); cy.findByTestId("proposal-details").should("be.visible"); // Back to home cy.findByTestId("politeia-logo").click(); @@ -106,20 +106,21 @@ describe("Given Politeia app navigation", () => { cy.get("@records.all").should("have.length", 1); cy.get("@counts.all").should("have.length", 1); // Details page again - cy.findAllByTestId("record-card-title-link").first().click(); + cy.findAllByTestId("proposal-card-title-link").first().click(); cy.findByTestId("proposal-details").should("be.visible"); - // Assert details page aren't duplicated - cy.get("@details.all").should("have.length", 1); + // FIXME: Line bellow is commented until we fix the caching and listeners + // issue on the details page. + // cy.get("@details.all").should("have.length", 1); cy.get("@piSummaries.all").should("have.length", 1); cy.get("@comments.all").should("have.length", 1); }); it("should allow 'go back link' navigation on details page", () => { cy.visit("/"); - cy.findAllByTestId("record-card-title-link").first().click(); + cy.findAllByTestId("proposal-card-title-link").first().click(); cy.findByTestId("proposal-go-back").should("be.visible").click(); // navigate back to home - cy.findAllByTestId("record-card-title-link").should("be.visible"); + cy.findAllByTestId("proposal-card-title-link").should("be.visible"); cy.location("pathname").should("eq", "/"); // navigate to record details and go to some comment page cy.visit(`/record/${shortToken}`); @@ -134,9 +135,9 @@ describe("Given Politeia app navigation", () => { for (const tab of tabs) { cy.visit(`/?tab=${tab}`); cy.wait("@records"); - cy.findAllByTestId("record-card-title-link").first().click(); + cy.findAllByTestId("proposal-card-title-link").first().click(); cy.findByTestId("proposal-go-back").should("be.visible").click(); - cy.findAllByTestId("record-card-title-link").should("be.visible"); + cy.findAllByTestId("proposal-card-title-link").should("be.visible"); cy.location("pathname").should("eq", "/"); cy.location("search").should("eq", `?tab=${encodeURI(tab)}`); } diff --git a/plugins-structure/apps/politeia/src/components/Header/BannerTitle.js b/plugins-structure/apps/politeia/src/components/Header/BannerTitle.js new file mode 100644 index 000000000..60aad07ec --- /dev/null +++ b/plugins-structure/apps/politeia/src/components/Header/BannerTitle.js @@ -0,0 +1,29 @@ +import React from "react"; +import PropTypes from "prop-types"; +import { useSelector } from "react-redux"; +import { Button, H1 } from "pi-ui"; +import styles from "./styles.module.css"; +import { user } from "@politeiagui/core/user"; + +function BannerTitle({ title }) { + const currentUser = useSelector(user.selectCurrent); + return ( +
+

{title}

+ {currentUser && ( + + + + + )} +
+ ); +} + +BannerTitle.propTypes = { + title: PropTypes.string.isRequired, +}; + +export default BannerTitle; diff --git a/plugins-structure/apps/politeia/src/components/Header/styles.module.css b/plugins-structure/apps/politeia/src/components/Header/styles.module.css index 4e1f8d2fa..4c04395c2 100644 --- a/plugins-structure/apps/politeia/src/components/Header/styles.module.css +++ b/plugins-structure/apps/politeia/src/components/Header/styles.module.css @@ -1,3 +1,17 @@ +.bannerTitle { + display: flex; + justify-content: space-between; + align-items: center; +} + +.bannerTitle button { + margin-right: 0 !important; +} + +.xsScreenButton { + display: none; +} + .headerItems { padding: 0 !important; } @@ -5,3 +19,14 @@ .headerItems > * { margin: 0.6rem 1rem; } + +@media (--xs-viewport) { + .xsScreenButton { + display: block; + width: 3rem; + height: 3rem; + } + .fullScreenButton { + display: none; + } +} diff --git a/plugins-structure/apps/politeia/src/components/Proposal/ProposalCard.js b/plugins-structure/apps/politeia/src/components/Proposal/ProposalCard.js index 60f05e8f7..6050ee21d 100644 --- a/plugins-structure/apps/politeia/src/components/Proposal/ProposalCard.js +++ b/plugins-structure/apps/politeia/src/components/Proposal/ProposalCard.js @@ -38,9 +38,12 @@ const ProposalCard = ({
+ } subtitle={ { const [open] = useModal(); @@ -108,14 +110,19 @@ const ProposalDetails = ({ )} } - titleLink={proposalLink} + // titleLink={proposalLink} isDimmed={isAbandoned} subtitle={ diff --git a/plugins-structure/apps/politeia/src/components/Proposal/ProposalForm.js b/plugins-structure/apps/politeia/src/components/Proposal/ProposalForm.js index 243c36089..e7b596c01 100644 --- a/plugins-structure/apps/politeia/src/components/Proposal/ProposalForm.js +++ b/plugins-structure/apps/politeia/src/components/Proposal/ProposalForm.js @@ -161,6 +161,7 @@ export function ProposalForm({ onSubmit, onSave, initialValues, policy }) { />
{isRfp && } - {title} + + {title} + + {allowEdit && ( + + + + )} ); } diff --git a/plugins-structure/apps/politeia/src/components/Proposal/common/styles.module.css b/plugins-structure/apps/politeia/src/components/Proposal/common/styles.module.css index 644d1d359..148b6f744 100644 --- a/plugins-structure/apps/politeia/src/components/Proposal/common/styles.module.css +++ b/plugins-structure/apps/politeia/src/components/Proposal/common/styles.module.css @@ -70,6 +70,10 @@ align-items: center; } +.edit { + margin-left: var(--spacing-1); +} + .disabled { color: var(--color-gray-light); } diff --git a/plugins-structure/apps/politeia/src/components/index.js b/plugins-structure/apps/politeia/src/components/index.js index 40a3cd726..5ffd31990 100644 --- a/plugins-structure/apps/politeia/src/components/index.js +++ b/plugins-structure/apps/politeia/src/components/index.js @@ -1,6 +1,7 @@ // Common import About from "./Static/About"; import Header from "./Header/Header"; +import BannerTitle from "./Header/BannerTitle"; import Error from "./Error/Error"; // Proposal import ProposalCard from "./Proposal/ProposalCard"; @@ -17,6 +18,7 @@ export * from "./Modal"; export { About, + BannerTitle, Header, Error, ProposalCard, diff --git a/plugins-structure/apps/politeia/src/pages/Details/Details.js b/plugins-structure/apps/politeia/src/pages/Details/Details.js index 8f4607501..fa29d4985 100644 --- a/plugins-structure/apps/politeia/src/pages/Details/Details.js +++ b/plugins-structure/apps/politeia/src/pages/Details/Details.js @@ -12,6 +12,8 @@ import useProposalDetails from "./useProposalDetails"; import { getURLSearchParams } from "../../utils/getURLSearchParams"; import { GoBackLink } from "@politeiagui/common-ui"; import { keyCommentsThreadsBy } from "@politeiagui/comments/utils"; +import { useSelector } from "react-redux"; +import { user } from "@politeiagui/core/user"; function ErrorsMessages({ errors }) { return errors.reduce((acc, cur, i) => { @@ -56,6 +58,9 @@ function Details({ token, commentid = 0 }) { rfpSumbissionsVoteSummaries, } = useProposalDetails({ token }); + // Get current logged in user + const currentUser = useSelector(user.selectCurrent); + // TODO: this can be moved somewhere else const params = getURLSearchParams(); const shouldScrollToComments = !!params?.scrollToComments || !!commentid; @@ -108,6 +113,7 @@ function Details({ token, commentid = 0 }) { rfpSubmissionsProposalSummaries={rfpSubmissionsProposalsSummaries} rfpSubmissionsVoteSummaries={rfpSumbissionsVoteSummaries} hideBody={!!commentid} + currentUser={currentUser} /> {orderedAuthorUpdatesKeys.map((update, i) => ( @@ -126,7 +132,7 @@ function Details({ token, commentid = 0 }) { comments={mainCommentsThread} recordOwner={record.username} fullThreadUrl={`/record/${token}`} - // Mocking onReply until user layer is done. + // TODO: reply to user onReply={(comment, parentid) => { console.log(`Replying ${parentid}:`, comment); }} diff --git a/plugins-structure/apps/politeia/src/pages/Details/actions.js b/plugins-structure/apps/politeia/src/pages/Details/actions.js deleted file mode 100644 index 2746349a1..000000000 --- a/plugins-structure/apps/politeia/src/pages/Details/actions.js +++ /dev/null @@ -1,5 +0,0 @@ -import { createAction } from "@reduxjs/toolkit"; - -export const fetchProposalDetails = createAction( - "details/fetchProposalDetails" -); diff --git a/plugins-structure/apps/politeia/src/pages/Details/servicesListeners.js b/plugins-structure/apps/politeia/src/pages/Details/servicesListeners.js index 861cf50c5..be71c462b 100644 --- a/plugins-structure/apps/politeia/src/pages/Details/servicesListeners.js +++ b/plugins-structure/apps/politeia/src/pages/Details/servicesListeners.js @@ -1,4 +1,3 @@ -import { fetchProposalDetails } from "./actions"; import { records } from "@politeiagui/core/records"; import { ticketvoteSubmissions } from "@politeiagui/ticketvote/submissions"; import { piSummaries } from "../../pi/summaries"; @@ -19,9 +18,7 @@ import { onVoteSubmissionsFetch, } from "./customEffects"; -export const recordDetailsListener = recordsListeners.details.listenTo({ - actionCreator: fetchProposalDetails, -}); +export const recordDetailsListener = recordsListeners.detailsOnLoad; export const voteSummaryListener = voteSummariesListeners.single .listenTo({ actionCreator: records.fetchDetails.fulfilled }) diff --git a/plugins-structure/apps/politeia/src/pages/Details/useProposalDetails.js b/plugins-structure/apps/politeia/src/pages/Details/useProposalDetails.js index acd101fd0..066a08f61 100644 --- a/plugins-structure/apps/politeia/src/pages/Details/useProposalDetails.js +++ b/plugins-structure/apps/politeia/src/pages/Details/useProposalDetails.js @@ -1,6 +1,5 @@ import { useEffect } from "react"; -import { useDispatch, useSelector } from "react-redux"; -import { fetchProposalDetails } from "./actions"; +import { useSelector } from "react-redux"; import { selectDetailsStatus } from "./selectors"; import { records } from "@politeiagui/core/records"; import { ticketvoteSummaries } from "@politeiagui/ticketvote/summaries"; @@ -15,7 +14,6 @@ import { piSummaries, proposals } from "../../pi"; import app from "../../app"; function useProposalDetails({ token }) { - const dispatch = useDispatch(); const detailsStatus = useSelector(selectDetailsStatus); const fullToken = useSelector((state) => records.selectFullToken(state, token) @@ -23,7 +21,6 @@ function useProposalDetails({ token }) { const record = useSelector((state) => records.selectByToken(state, fullToken) ); - const recordStatus = useSelector(records.selectStatus); const voteSummary = useSelector((state) => ticketvoteSummaries.selectByToken(state, fullToken) ); @@ -65,16 +62,6 @@ function useProposalDetails({ token }) { records.selectByToken(state, rfpLinkedRecordToken) ); - useEffect(() => { - if ( - recordStatus !== "loading" && - recordStatus !== "failed" && - !record?.detailsFetched - ) { - dispatch(fetchProposalDetails({ token })); - } - }, [token, dispatch, recordStatus, record]); - useEffect(() => { if (record?.files) { const { name } = decodeProposalMetadataFile(record.files); diff --git a/plugins-structure/apps/politeia/src/pages/Edit/Edit.js b/plugins-structure/apps/politeia/src/pages/Edit/Edit.js new file mode 100644 index 000000000..10e3588b2 --- /dev/null +++ b/plugins-structure/apps/politeia/src/pages/Edit/Edit.js @@ -0,0 +1,41 @@ +import React from "react"; +import { H1 } from "pi-ui"; +import { useSelector } from "react-redux"; +import { SingleContentPage } from "@politeiagui/common-ui/layout"; +import { ProposalForm } from "../../components/Proposal/ProposalForm"; +import { piPolicy } from "../../pi/policy"; +import { decodeProposalRecordForm } from "../../pi/proposals/utils"; +import { records } from "@politeiagui/core/records"; +import { GoBackLink } from "@politeiagui/common-ui"; + +function ProposalEditPage({ token }) { + const policy = useSelector(piPolicy.selectAll); + const record = useSelector((state) => + records.selectByShortToken(state, token) + ); + const proposalFormValues = decodeProposalRecordForm(record); + + function handleSubmit(data) { + console.log(data); + } + + return ( + Edit Proposal}> + + {record && proposalFormValues ? ( + + ) : null} + + ); +} + +export default ProposalEditPage; diff --git a/plugins-structure/apps/politeia/src/pages/Edit/index.js b/plugins-structure/apps/politeia/src/pages/Edit/index.js new file mode 100644 index 000000000..be06247e1 --- /dev/null +++ b/plugins-structure/apps/politeia/src/pages/Edit/index.js @@ -0,0 +1,16 @@ +import { lazy } from "react"; +import App from "../../app"; +import { routeCleanup } from "../../utils/routeCleanup"; +import { createRouteView } from "../../utils/createRouteView"; +import { serviceListeners as detailsListeners } from "@politeiagui/core/records/services"; +import { serviceListeners as policyListeners } from "../../pi/policy/services"; + +export default App.createRoute({ + path: "/record/:token/edit", + setupServices: [policyListeners.fetch, detailsListeners.detailsOnLoad], + title: "Edit Proposal", + cleanup: routeCleanup, + view: createRouteView( + lazy(() => import(/* webpackChunkName: "new_proposal_page" */ "./Edit")) + ), +}); diff --git a/plugins-structure/apps/politeia/src/pages/Home/Home.js b/plugins-structure/apps/politeia/src/pages/Home/Home.js index e17541123..fff34aa2b 100644 --- a/plugins-structure/apps/politeia/src/pages/Home/Home.js +++ b/plugins-structure/apps/politeia/src/pages/Home/Home.js @@ -1,7 +1,7 @@ import React from "react"; import { MultiContentPage, TabsBanner } from "@politeiagui/common-ui/layout"; -import { getURLSearchParams } from "@politeiagui/core/router"; -import { About } from "../../components"; +import { getURLSearchParams } from "../../utils/getURLSearchParams"; +import { About, BannerTitle } from "../../components"; import HomeProposals from "./HomeProposals"; const TAB_LABELS = { @@ -39,7 +39,7 @@ function Home() { } activeTab={TAB_VALUES.indexOf(tab || TAB_LABELS.underReview)} tabs={tabs} /> diff --git a/plugins-structure/apps/politeia/src/pages/New/New.js b/plugins-structure/apps/politeia/src/pages/New/New.js index d2a087121..6ad1d7f15 100644 --- a/plugins-structure/apps/politeia/src/pages/New/New.js +++ b/plugins-structure/apps/politeia/src/pages/New/New.js @@ -5,21 +5,20 @@ import { SingleContentPage } from "@politeiagui/common-ui/layout"; import { ProposalForm } from "../../components/Proposal/ProposalForm"; import { piPolicy } from "../../pi/policy"; import { H1 } from "pi-ui"; -import { decodeProposalDraftForm } from "../../pi/proposals/utils"; +import { decodeProposalRecordForm } from "../../pi/proposals/utils"; import { getURLSearchParams } from "@politeiagui/core/router"; -function New() { +function ProposalNewPage() { const dispatch = useDispatch(); const { draft: draftid } = getURLSearchParams(); const policy = useSelector(piPolicy.selectAll); - // const { domains, startdatemin, enddatemax } = useSelector(piPolicy.selectAll); const draft = useSelector((state) => recordsDrafts.selectById(state, { draftid, userid: "user-id-test" }) ); // Decode Form values for drafts - const formValues = decodeProposalDraftForm(draft?.record); + const formValues = decodeProposalRecordForm(draft?.record); // Submission handlers function handleSubmit(data) { @@ -44,4 +43,4 @@ function New() { ); } -export default New; +export default ProposalNewPage; diff --git a/plugins-structure/apps/politeia/src/pages/Raw/Raw.js b/plugins-structure/apps/politeia/src/pages/Raw/Raw.js new file mode 100644 index 000000000..744089478 --- /dev/null +++ b/plugins-structure/apps/politeia/src/pages/Raw/Raw.js @@ -0,0 +1,62 @@ +import React from "react"; +import { records } from "@politeiagui/core/records"; +import { useSelector } from "react-redux"; +import { decodeProposalRecord } from "../../pi/proposals/utils"; +import { SingleContentPage } from "@politeiagui/common-ui/layout"; +import { + formatDateToInternationalString, + formatUnixTimestampToObj, +} from "@politeiagui/common-ui/utils"; + +function displayProposalInMarkdown({ + author, + body, + censored, + name, + proposalMetadata: { domain, amount, enddate, startdate }, + version, + token, +}) { + const startDate = + startdate && + formatDateToInternationalString(formatUnixTimestampToObj(startdate)); + const endDate = + enddate && + formatDateToInternationalString(formatUnixTimestampToObj(enddate)); + + return ` +**** +# ${name} + +- Token: ${token} +- Author: ${author.username} +- Version: ${version} +- Censored: ${censored} + +## Proposal Metadata +${domain ? `- Domain: ${domain}` : ""} +${amount ? `- Amount: ${amount} USD` : ""} +${startDate ? `- Start Date: ${startDate}` : ""} +${endDate ? `- End Date: ${endDate}` : ""} + +**** + +${body} +`; +} + +function ProposalRawPage({ token }) { + const record = useSelector((state) => + records.selectByShortToken(state, token) + ); + const proposal = decodeProposalRecord(record); + const md = proposal && displayProposalInMarkdown(proposal); + + return ( + +
{md}
+
+ ); +} + +export default ProposalRawPage; diff --git a/plugins-structure/apps/politeia/src/pages/Raw/index.js b/plugins-structure/apps/politeia/src/pages/Raw/index.js new file mode 100644 index 000000000..1b353ad5e --- /dev/null +++ b/plugins-structure/apps/politeia/src/pages/Raw/index.js @@ -0,0 +1,15 @@ +import { lazy } from "react"; +import App from "../../app"; +import { routeCleanup } from "../../utils/routeCleanup"; +import { createRouteView } from "../../utils/createRouteView"; +import { serviceListeners } from "@politeiagui/core/records/services"; + +export default App.createRoute({ + path: "/record/:token/raw", + setupServices: [serviceListeners.detailsOnLoad], + title: "Raw Proposal", + cleanup: routeCleanup, + view: createRouteView( + lazy(() => import(/* webpackChunkName: "new_proposal_page" */ "./Raw")) + ), +}); diff --git a/plugins-structure/apps/politeia/src/pages/index.js b/plugins-structure/apps/politeia/src/pages/index.js index f173b2550..ea5e7f898 100644 --- a/plugins-structure/apps/politeia/src/pages/index.js +++ b/plugins-structure/apps/politeia/src/pages/index.js @@ -1,6 +1,15 @@ import HomeRoute from "./Home"; +import EditProposalRoute from "./Edit"; import NewProposalRoute from "./New"; +import RawProposalRoute from "./Raw"; import DetailsRoute from "./Details"; import UserRoutes from "./User"; -export { HomeRoute, NewProposalRoute, DetailsRoute, UserRoutes }; +export { + HomeRoute, + NewProposalRoute, + EditProposalRoute, + RawProposalRoute, + DetailsRoute, + UserRoutes, +}; diff --git a/plugins-structure/apps/politeia/src/pi/proposals/utils.js b/plugins-structure/apps/politeia/src/pi/proposals/utils.js index 5fb311d64..38f5d2a3d 100644 --- a/plugins-structure/apps/politeia/src/pi/proposals/utils.js +++ b/plugins-structure/apps/politeia/src/pi/proposals/utils.js @@ -61,21 +61,6 @@ export const proposalFilenames = [ PROPOSAL_VOTE_METADATA_FILENAME, ]; -const MONTHS_LABELS = [ - "Jan", - "Feb", - "Mar", - "Apr", - "May", - "Jun", - "Jul", - "Aug", - "Sep", - "Oct", - "Nov", - "Dec", -]; - /** * Record object * @typedef {{ @@ -133,6 +118,22 @@ const MONTHS_LABELS = [ * }} Proposal */ +/** + * Proposal form object + * @typedef {{ + * name: string, + * body: string, + * attachments: Array, + * amount: number, + * domain: number, + * endDate: number, + * startDate: number, + * type: number, + * deadline: number, + * rfpToken: string + * }} ProposalFormValues + * + */ /** * decodeProposalType returns proposal type for given voteMetadata * @param {{ linkto: ?String, linkby: ?Number }} voteMetadata @@ -263,10 +264,18 @@ export function decodeProposalRecord(record) { }; } -export function decodeProposalDraftForm(draft) { - if (!draft) return; +/** + * decodeProposalRecordForm returns a formatted proposal form object values for + * given record. + * + * @param {Record} record + * @returns {ProposalFormValues} + * + */ +export function decodeProposalRecordForm(record) { + if (!record) return; const { name, proposalMetadata, voteMetadata, body, attachments } = - decodeProposalRecordFiles(draft.files); + decodeProposalRecordFiles(record.files); return { name, body, @@ -311,23 +320,6 @@ export function getRecordStatusChangesMetadata(record) { return getStatusMetadataPayloads(payloads); } -/** - * formatDateToInternationalString accepts an object of day, month and year. - * It returns a string of human viewable international date from the result - * of DatePicker or BackEnd and supposes they are correct. - * String format: 08 Sep 2021 - * @param {object} { day, month, year } - * @returns {string} - */ -export function formatDateToInternationalString({ day, month, year }) { - const monthLabel = MONTHS_LABELS[month - 1]; - if (monthLabel === undefined) { - return "Invalid Date"; - } - const dayView = `0${day}`.slice(-2); - return `${dayView} ${MONTHS_LABELS[month - 1]} ${year}`; -} - /** * getPublicStatusChangeMetadata returns the metadata stream that describes when * the record has been made `public`, i.e. status === 2. diff --git a/plugins-structure/apps/politeia/src/routes/routes.js b/plugins-structure/apps/politeia/src/routes/routes.js index d386cfab6..87e192bc4 100644 --- a/plugins-structure/apps/politeia/src/routes/routes.js +++ b/plugins-structure/apps/politeia/src/routes/routes.js @@ -1,31 +1,18 @@ -import { store } from "@politeiagui/core"; -import { records } from "@politeiagui/core/records"; import { DetailsRoute, + EditProposalRoute, HomeRoute, NewProposalRoute, + RawProposalRoute, UserRoutes, } from "../pages"; -import { decodeProposalRecord } from "../pi/proposals/utils"; -import { routeCleanup } from "../utils/routeCleanup"; export const routes = [ HomeRoute, NewProposalRoute, DetailsRoute, + EditProposalRoute, ...UserRoutes, { ...DetailsRoute, path: "/record/:token/comment/:commentid" }, - { - path: "/record/:token/raw", - view: async ({ token }) => { - const { payload: recordDetails } = await store.dispatch( - records.fetchDetails({ token }) - ); - const proposalDetails = decodeProposalRecord(recordDetails); - return (document.querySelector( - "#root" - ).innerHTML = `
${proposalDetails.body}
`); - }, - cleanup: routeCleanup, - }, + RawProposalRoute, ]; diff --git a/plugins-structure/packages/core/src/appSetup.js b/plugins-structure/packages/core/src/appSetup.js index f5472248f..41e18c9b0 100644 --- a/plugins-structure/packages/core/src/appSetup.js +++ b/plugins-structure/packages/core/src/appSetup.js @@ -212,12 +212,28 @@ export function appSetup({ clearListeners(allListeners); }, view: async (routeParams) => { + const actionsDispatchesQueue = []; registerListeners(allListeners); for (const service of routeServices) { + // We must cache all dispatches, because they might trigger services + // listeners effects that may not have executed their setup actions + // yet. Once they are properly setup, we can execute all cached + // actions. if (service.action) { - await service.action(); + await service.action({ + params: routeParams, + getState: store.getState, + dispatch: (fn) => { + actionsDispatchesQueue.push(fn); + }, + }); } } + // Now we can execute all cached actionsDispatchesQueue, because all + // actions have been successfully setup. + for (const fn of actionsDispatchesQueue) { + await store.dispatch(fn); + } return await view(routeParams); }, }; diff --git a/plugins-structure/packages/core/src/records/records/index.js b/plugins-structure/packages/core/src/records/records/index.js index 02d878525..c3d2a6399 100644 --- a/plugins-structure/packages/core/src/records/records/index.js +++ b/plugins-structure/packages/core/src/records/records/index.js @@ -3,6 +3,7 @@ import { fetchRecordVersionDetails, fetchRecords, selectFullToken, + selectRecordByShortToken, selectRecordByToken, selectRecordVersionByToken, selectRecordVersionStatusByToken, @@ -21,6 +22,7 @@ export const records = { selectStatus: selectRecordsStatus, selectError: selectRecordsError, selectByToken: selectRecordByToken, + selectByShortToken: selectRecordByShortToken, selectVersionByToken: selectRecordVersionByToken, selectVersionStatusByToken: selectRecordVersionStatusByToken, selectByTokensBatch: selectRecordsByTokensBatch, diff --git a/plugins-structure/packages/core/src/records/records/recordsSlice.js b/plugins-structure/packages/core/src/records/records/recordsSlice.js index ceed12520..28f2ee075 100644 --- a/plugins-structure/packages/core/src/records/records/recordsSlice.js +++ b/plugins-structure/packages/core/src/records/records/recordsSlice.js @@ -211,5 +211,13 @@ export const selectRecordVersionStatusByToken = (state, { version, token }) => { return recordVersions[version]?.status; }; +export const selectRecordByShortToken = (state, shortToken) => { + const allRecords = selectRecords(state); + const fullToken = selectFullToken(state, shortToken); + if (fullToken) { + return allRecords[fullToken]; + } +}; + // Export default reducer export default recordsSlice.reducer; diff --git a/plugins-structure/packages/core/src/records/records/services.js b/plugins-structure/packages/core/src/records/records/services.js index ba27af86b..721cad379 100644 --- a/plugins-structure/packages/core/src/records/records/services.js +++ b/plugins-structure/packages/core/src/records/records/services.js @@ -1,11 +1,14 @@ import { validateRecordsPageSize } from "../validation"; -import { store } from "../../storeSetup"; import { fetchPolicyIfIdle } from "../utils"; import { fetchAllRecordsInventory, fetchNextRecords, fetchRecordDetails, } from "./effects"; +import { + fetchRecordDetails as onFetchRecordDetails, + // selectRecordByShortToken, +} from "./recordsSlice"; import { createSliceServices } from "../../toolkit"; @@ -13,21 +16,41 @@ export const { pluginServices, serviceListeners } = createSliceServices({ name: "records", services: { batch: { - onSetup: async () => { + onSetup: async ({ getState }) => { await fetchPolicyIfIdle(); - validateRecordsPageSize(store.getState()); + validateRecordsPageSize(getState()); }, effect: fetchNextRecords, }, batchAll: { - onSetup: async () => { + onSetup: async ({ getState }) => { await fetchPolicyIfIdle(); - validateRecordsPageSize(store.getState()); + validateRecordsPageSize(getState()); }, effect: fetchAllRecordsInventory, }, + // TODO: Deprecate this service and use the one below. details: { effect: fetchRecordDetails, }, + // TODO: merge details service with the service below. Using this for now + // to keep the same scope of this PR. + detailsOnLoad: { + onSetup: ({ params, dispatch }) => { + const { token } = params || {}; + if (!token) return; + // FIXME: This is a temporary fix to avoid issues from listeners logic. + // Ideally, we should handle this issue on service listeners config + // level, but in order to keep the same scope of this PR, records + // details will be fetched on every page load. + dispatch(onFetchRecordDetails({ token })); + // TODO: Uncomment this code when the issue above is fixed. + // (the `getState` param is retreived from onSetup args). + // const record = selectRecordByShortToken(getState(), token); + // if (!record?.detailsFetched) { + // dispatch(onFetchRecordDetails({ token })); + // } + }, + }, }, }); diff --git a/plugins-structure/packages/core/src/toolkit/createSliceServices.js b/plugins-structure/packages/core/src/toolkit/createSliceServices.js index 70757c8cc..d27baa67d 100644 --- a/plugins-structure/packages/core/src/toolkit/createSliceServices.js +++ b/plugins-structure/packages/core/src/toolkit/createSliceServices.js @@ -1,4 +1,3 @@ -import { store } from "../storeSetup"; import curry from "lodash/fp/curry"; import { validateSliceServices } from "./validation"; /** @@ -22,9 +21,9 @@ import { validateSliceServices } from "./validation"; */ /** * @callback ListenerEffect - * @param {Object} state - * @param {import("@reduxjs/toolkit").Dispatch} dispatch - * @param {Object} effectPayload + * @param {Object} state - The current state of the store + * @param {import("@reduxjs/toolkit").Dispatch} dispatch - The store's dispatch function + * @param {Object} effectPayload - The payload of the action that triggered the effect */ /** * @callback CurriedListenerEffect @@ -39,6 +38,7 @@ import { validateSliceServices } from "./validation"; /** * @callback ServiceOnSetup * @param {{ + * params: Object, * getState: Function, * dispatch: import("@reduxjs/toolkit").Dispatch * }} @@ -146,10 +146,11 @@ export function formatServicesToPlugin(services, sliceName) { { id: setSliceId(sliceName, id), action: services[id].onSetup - ? () => + ? ({ params, getState, dispatch }) => services[id].onSetup({ - getState: store.getState, - dispatch: store.dispatch, + params, // Route params passed to the service + getState, // Redux getState function + dispatch, // Redux dispatch function }) : null, effect: services[id].effect, diff --git a/plugins-structure/packages/core/src/user/services.js b/plugins-structure/packages/core/src/user/services.js index 1c9110b60..1a90ba52a 100644 --- a/plugins-structure/packages/core/src/user/services.js +++ b/plugins-structure/packages/core/src/user/services.js @@ -1,24 +1,23 @@ import { user } from "."; import { getURLSearchParams } from "../router"; -import { store } from "../storeSetup"; import { createSliceServices } from "../toolkit"; export const { pluginServices, serviceListeners } = createSliceServices({ name: "userEmail", services: { emailVerify: { - onSetup: () => { + onSetup: ({ dispatch }) => { const { verificationtoken } = getURLSearchParams(); if (verificationtoken) { - store.dispatch(user.verifyEmail({ verificationtoken })); + dispatch(user.verifyEmail({ verificationtoken })); } }, }, keyVerify: { - onSetup: () => { + onSetup: ({ dispatch }) => { const { verificationtoken } = getURLSearchParams(); if (verificationtoken) { - store.dispatch(user.verifyKey({ verificationtoken })); + dispatch(user.verifyKey({ verificationtoken })); } }, }, diff --git a/plugins-structure/yarn.lock b/plugins-structure/yarn.lock index 12ed48aab..237e095bb 100644 --- a/plugins-structure/yarn.lock +++ b/plugins-structure/yarn.lock @@ -410,9 +410,9 @@ integrity sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg== "@babel/helper-plugin-utils@^7.18.6": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz#4796bb14961521f0f8715990bee2fb6e51ce21bf" - integrity sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw== + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" + integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== "@babel/helper-remap-async-to-generator@^7.14.5": version "7.14.5" @@ -509,10 +509,10 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-string-parser@^7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz#181f22d28ebe1b3857fa575f5c290b1aaf659b56" - integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw== +"@babel/helper-string-parser@^7.18.10", "@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== "@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9": version "7.16.7" @@ -1827,11 +1827,11 @@ regenerator-runtime "^0.13.4" "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.19.0.tgz#22b11c037b094d27a8a2504ea4dcff00f50e2259" - integrity sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA== + version "7.20.13" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b" + integrity sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA== dependencies: - regenerator-runtime "^0.13.4" + regenerator-runtime "^0.13.11" "@babel/runtime@^7.14.6": version "7.18.9" @@ -1970,12 +1970,12 @@ to-fast-properties "^2.0.0" "@babel/types@^7.18.6": - version "7.18.13" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.13.tgz#30aeb9e514f4100f7c1cb6e5ba472b30e48f519a" - integrity sha512-ePqfTihzW0W6XAU+aMw2ykilisStJfDnsejDCXRchCcMJ4O0+8DhPXf2YUbZ6wjBlsEmZwLK/sPweWtu8hcJYQ== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" + integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg== dependencies: - "@babel/helper-string-parser" "^7.18.10" - "@babel/helper-validator-identifier" "^7.18.6" + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" "@babel/types@^7.18.9": @@ -2148,34 +2148,34 @@ resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz#90420f9f9c6d3987f176a19a7d8e764271a2f55d" integrity sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g== -"@emotion/babel-plugin@^11.10.0": - version "11.10.2" - resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.10.2.tgz#879db80ba622b3f6076917a1e6f648b1c7d008c7" - integrity sha512-xNQ57njWTFVfPAc3cjfuaPdsgLp5QOSuRsj9MA6ndEhH/AzuZM86qIQzt6rq+aGBwj3n5/TkLmU5lhAfdRmogA== +"@emotion/babel-plugin@^11.10.5": + version "11.10.5" + resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.10.5.tgz#65fa6e1790ddc9e23cc22658a4c5dea423c55c3c" + integrity sha512-xE7/hyLHJac7D2Ve9dKroBBZqBT7WuPQmWcq7HSGb84sUuP4mlOWoB8dvVfD9yk5DHkU1m6RW7xSoDtnQHNQeA== dependencies: "@babel/helper-module-imports" "^7.16.7" "@babel/plugin-syntax-jsx" "^7.17.12" "@babel/runtime" "^7.18.3" "@emotion/hash" "^0.9.0" "@emotion/memoize" "^0.8.0" - "@emotion/serialize" "^1.1.0" + "@emotion/serialize" "^1.1.1" babel-plugin-macros "^3.1.0" convert-source-map "^1.5.0" escape-string-regexp "^4.0.0" find-root "^1.1.0" source-map "^0.5.7" - stylis "4.0.13" + stylis "4.1.3" -"@emotion/cache@^11.10.0", "@emotion/cache@^11.4.0": - version "11.10.3" - resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.10.3.tgz#c4f67904fad10c945fea5165c3a5a0583c164b87" - integrity sha512-Psmp/7ovAa8appWh3g51goxu/z3iVms7JXOreq136D8Bbn6dYraPnmL6mdM8GThEx9vwSn92Fz+mGSjBzN8UPQ== +"@emotion/cache@^11.10.5", "@emotion/cache@^11.4.0": + version "11.10.5" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.10.5.tgz#c142da9351f94e47527ed458f7bbbbe40bb13c12" + integrity sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA== dependencies: "@emotion/memoize" "^0.8.0" - "@emotion/sheet" "^1.2.0" + "@emotion/sheet" "^1.2.1" "@emotion/utils" "^1.2.0" "@emotion/weak-memoize" "^0.3.0" - stylis "4.0.13" + stylis "4.1.3" "@emotion/hash@^0.9.0": version "0.9.0" @@ -2188,23 +2188,23 @@ integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA== "@emotion/react@^11.8.1": - version "11.10.4" - resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.10.4.tgz#9dc6bccbda5d70ff68fdb204746c0e8b13a79199" - integrity sha512-j0AkMpr6BL8gldJZ6XQsQ8DnS9TxEQu1R+OGmDZiWjBAJtCcbt0tS3I/YffoqHXxH6MjgI7KdMbYKw3MEiU9eA== + version "11.10.5" + resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.10.5.tgz#95fff612a5de1efa9c0d535384d3cfa115fe175d" + integrity sha512-TZs6235tCJ/7iF6/rvTaOH4oxQg2gMAcdHemjwLKIjKz4rRuYe1HJ2TQJKnAcRAfOUDdU8XoDadCe1rl72iv8A== dependencies: "@babel/runtime" "^7.18.3" - "@emotion/babel-plugin" "^11.10.0" - "@emotion/cache" "^11.10.0" - "@emotion/serialize" "^1.1.0" + "@emotion/babel-plugin" "^11.10.5" + "@emotion/cache" "^11.10.5" + "@emotion/serialize" "^1.1.1" "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" "@emotion/utils" "^1.2.0" "@emotion/weak-memoize" "^0.3.0" hoist-non-react-statics "^3.3.1" -"@emotion/serialize@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.0.tgz#b1f97b1011b09346a40e9796c37a3397b4ea8ea8" - integrity sha512-F1ZZZW51T/fx+wKbVlwsfchr5q97iW8brAnXmsskz4d0hVB4O3M/SiA3SaeH06x02lSNzkkQv+n3AX3kCXKSFA== +"@emotion/serialize@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.1.tgz#0595701b1902feded8a96d293b26be3f5c1a5cf0" + integrity sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA== dependencies: "@emotion/hash" "^0.9.0" "@emotion/memoize" "^0.8.0" @@ -2212,10 +2212,10 @@ "@emotion/utils" "^1.2.0" csstype "^3.0.2" -"@emotion/sheet@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.0.tgz#771b1987855839e214fc1741bde43089397f7be5" - integrity sha512-OiTkRgpxescko+M51tZsMq7Puu/KP55wMT8BgpcXVG2hqXc0Vo0mfymJ/Uj24Hp0i083ji/o0aLddh08UEjq8w== +"@emotion/sheet@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.1.tgz#0767e0305230e894897cadb6c8df2c51e61a6c2c" + integrity sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA== "@emotion/unitless@^0.8.0": version "0.8.0" @@ -3423,91 +3423,91 @@ dependencies: "@octokit/openapi-types" "^9.5.0" -"@react-spring/animated@~9.5.5": - version "9.5.5" - resolved "https://registry.yarnpkg.com/@react-spring/animated/-/animated-9.5.5.tgz#d3bfd0f62ed13a337463a55d2c93bb23c15bbf3e" - integrity sha512-glzViz7syQ3CE6BQOwAyr75cgh0qsihm5lkaf24I0DfU63cMm/3+br299UEYkuaHNmfDfM414uktiPlZCNJbQA== - dependencies: - "@react-spring/shared" "~9.5.5" - "@react-spring/types" "~9.5.5" - -"@react-spring/core@~9.5.5": - version "9.5.5" - resolved "https://registry.yarnpkg.com/@react-spring/core/-/core-9.5.5.tgz#1d8a4c64630ee26b2295361e1eedfd716a85b4ae" - integrity sha512-shaJYb3iX18Au6gkk8ahaF0qx0LpS0Yd+ajb4asBaAQf6WPGuEdJsbsNSgei1/O13JyEATsJl20lkjeslJPMYA== - dependencies: - "@react-spring/animated" "~9.5.5" - "@react-spring/rafz" "~9.5.5" - "@react-spring/shared" "~9.5.5" - "@react-spring/types" "~9.5.5" - -"@react-spring/konva@~9.5.5": - version "9.5.5" - resolved "https://registry.yarnpkg.com/@react-spring/konva/-/konva-9.5.5.tgz#ddbb30cfa268219d69552aa71188832ca8ab4905" - integrity sha512-0CNh+1vCIjNUklTFwMvxg+H83Jo2OWykBrdEA28ccmnpZgkQ8Kq5xyvaPFLzcDKV67OXHnaWiCYKpRbhLy2wng== - dependencies: - "@react-spring/animated" "~9.5.5" - "@react-spring/core" "~9.5.5" - "@react-spring/shared" "~9.5.5" - "@react-spring/types" "~9.5.5" - -"@react-spring/native@~9.5.5": - version "9.5.5" - resolved "https://registry.yarnpkg.com/@react-spring/native/-/native-9.5.5.tgz#4ecc420c7b4c3fefeebd55d852640d36c29ec9c8" - integrity sha512-kauqmyJ8u7aVy2bBs22vl1SdB2i5uYIL4rP53k1KDWrFSqJh4j3efWkbTt9uzR5cMXuNVbkNo9OYVFUcQBz50A== - dependencies: - "@react-spring/animated" "~9.5.5" - "@react-spring/core" "~9.5.5" - "@react-spring/shared" "~9.5.5" - "@react-spring/types" "~9.5.5" - -"@react-spring/rafz@~9.5.5": - version "9.5.5" - resolved "https://registry.yarnpkg.com/@react-spring/rafz/-/rafz-9.5.5.tgz#62a49c5e294104b79db2a8afdf4f3a274c7f44ca" - integrity sha512-F/CLwB0d10jL6My5vgzRQxCNY2RNyDJZedRBK7FsngdCmzoq3V4OqqNc/9voJb9qRC2wd55oGXUeXv2eIaFmsw== - -"@react-spring/shared@~9.5.5": - version "9.5.5" - resolved "https://registry.yarnpkg.com/@react-spring/shared/-/shared-9.5.5.tgz#9be0b391d546e3e184a24ecbaf40acbaeab7fc73" - integrity sha512-YwW70Pa/YXPOwTutExHZmMQSHcNC90kJOnNR4G4mCDNV99hE98jWkIPDOsgqbYx3amIglcFPiYKMaQuGdr8dyQ== - dependencies: - "@react-spring/rafz" "~9.5.5" - "@react-spring/types" "~9.5.5" - -"@react-spring/three@~9.5.5": - version "9.5.5" - resolved "https://registry.yarnpkg.com/@react-spring/three/-/three-9.5.5.tgz#c6fbee977007d1980406db20a28ac3f5dc2ce153" - integrity sha512-9kTIaSceqFIl5EIrdwM7Z53o5I+9BGNVzbp4oZZYMao+GMAWOosnlQdDG5GeqNsIqfW9fZCEquGqagfKAxftcA== - dependencies: - "@react-spring/animated" "~9.5.5" - "@react-spring/core" "~9.5.5" - "@react-spring/shared" "~9.5.5" - "@react-spring/types" "~9.5.5" - -"@react-spring/types@~9.5.5": - version "9.5.5" - resolved "https://registry.yarnpkg.com/@react-spring/types/-/types-9.5.5.tgz#c8e94f1b9232ca7cb9d860ea67762ec401b1de14" - integrity sha512-7I/qY8H7Enwasxr4jU6WmtNK+RZ4Z/XvSlDvjXFVe7ii1x0MoSlkw6pD7xuac8qrHQRm9BTcbZNyeeKApYsvCg== - -"@react-spring/web@~9.5.5": - version "9.5.5" - resolved "https://registry.yarnpkg.com/@react-spring/web/-/web-9.5.5.tgz#d416abc591aaed930401f0c98a991a8c5b90c382" - integrity sha512-+moT8aDX/ho/XAhU+HRY9m0LVV9y9CK6NjSRaI+30Re150pB3iEip6QfnF4qnhSCQ5drpMF0XRXHgOTY/xbtFw== - dependencies: - "@react-spring/animated" "~9.5.5" - "@react-spring/core" "~9.5.5" - "@react-spring/shared" "~9.5.5" - "@react-spring/types" "~9.5.5" - -"@react-spring/zdog@~9.5.5": - version "9.5.5" - resolved "https://registry.yarnpkg.com/@react-spring/zdog/-/zdog-9.5.5.tgz#916dba337637d1151c3c2bc829b5105d15adacb5" - integrity sha512-LZgjo2kLlGmUqfE2fdVnvLXz+4eYyQARRvB9KQ4PTEynaETTG89Xgn9YxLrh1p57DzH7gEmTGDZ5hEw3pWqu8g== - dependencies: - "@react-spring/animated" "~9.5.5" - "@react-spring/core" "~9.5.5" - "@react-spring/shared" "~9.5.5" - "@react-spring/types" "~9.5.5" +"@react-spring/animated@~9.6.1": + version "9.6.1" + resolved "https://registry.yarnpkg.com/@react-spring/animated/-/animated-9.6.1.tgz#ccc626d847cbe346f5f8815d0928183c647eb425" + integrity sha512-ls/rJBrAqiAYozjLo5EPPLLOb1LM0lNVQcXODTC1SMtS6DbuBCPaKco5svFUQFMP2dso3O+qcC4k9FsKc0KxMQ== + dependencies: + "@react-spring/shared" "~9.6.1" + "@react-spring/types" "~9.6.1" + +"@react-spring/core@~9.6.1": + version "9.6.1" + resolved "https://registry.yarnpkg.com/@react-spring/core/-/core-9.6.1.tgz#ebe07c20682b360b06af116ea24e2b609e778c10" + integrity sha512-3HAAinAyCPessyQNNXe5W0OHzRfa8Yo5P748paPcmMowZ/4sMfaZ2ZB6e5x5khQI8NusOHj8nquoutd6FRY5WQ== + dependencies: + "@react-spring/animated" "~9.6.1" + "@react-spring/rafz" "~9.6.1" + "@react-spring/shared" "~9.6.1" + "@react-spring/types" "~9.6.1" + +"@react-spring/konva@~9.6.1": + version "9.6.1" + resolved "https://registry.yarnpkg.com/@react-spring/konva/-/konva-9.6.1.tgz#66e63da0e9681e42395e995402a7e73ba6892461" + integrity sha512-MevnU+tnG1LPsmMRpfJfevfLtI0ObIvrwYc+Xg+kmYJe00vwMRSdulQOztKANKalFXBewwk72XrQCeRLXFaUIg== + dependencies: + "@react-spring/animated" "~9.6.1" + "@react-spring/core" "~9.6.1" + "@react-spring/shared" "~9.6.1" + "@react-spring/types" "~9.6.1" + +"@react-spring/native@~9.6.1": + version "9.6.1" + resolved "https://registry.yarnpkg.com/@react-spring/native/-/native-9.6.1.tgz#b66e237f2faaa4f88569d5a03b6fb0136bcdf2b9" + integrity sha512-ZIfSytxFGLw4gYOb8gsmwG0+JZYxuM/Y1XPCXCkhuoMn+RmOYrr0kQ4gLczbmf+TRxth7OT1c8vBYz0+SCGcIQ== + dependencies: + "@react-spring/animated" "~9.6.1" + "@react-spring/core" "~9.6.1" + "@react-spring/shared" "~9.6.1" + "@react-spring/types" "~9.6.1" + +"@react-spring/rafz@~9.6.1": + version "9.6.1" + resolved "https://registry.yarnpkg.com/@react-spring/rafz/-/rafz-9.6.1.tgz#d71aafb92b78b24e4ff84639f52745afc285c38d" + integrity sha512-v6qbgNRpztJFFfSE3e2W1Uz+g8KnIBs6SmzCzcVVF61GdGfGOuBrbjIcp+nUz301awVmREKi4eMQb2Ab2gGgyQ== + +"@react-spring/shared@~9.6.1": + version "9.6.1" + resolved "https://registry.yarnpkg.com/@react-spring/shared/-/shared-9.6.1.tgz#4e2e4296910656c02bd9fd54c559702bc836ac4e" + integrity sha512-PBFBXabxFEuF8enNLkVqMC9h5uLRBo6GQhRMQT/nRTnemVENimgRd+0ZT4yFnAQ0AxWNiJfX3qux+bW2LbG6Bw== + dependencies: + "@react-spring/rafz" "~9.6.1" + "@react-spring/types" "~9.6.1" + +"@react-spring/three@~9.6.1": + version "9.6.1" + resolved "https://registry.yarnpkg.com/@react-spring/three/-/three-9.6.1.tgz#095fcd1dc6509127c33c14486d88289b89baeb9d" + integrity sha512-Tyw2YhZPKJAX3t2FcqvpLRb71CyTe1GvT3V+i+xJzfALgpk10uPGdGaQQ5Xrzmok1340DAeg2pR/MCfaW7b8AA== + dependencies: + "@react-spring/animated" "~9.6.1" + "@react-spring/core" "~9.6.1" + "@react-spring/shared" "~9.6.1" + "@react-spring/types" "~9.6.1" + +"@react-spring/types@~9.6.1": + version "9.6.1" + resolved "https://registry.yarnpkg.com/@react-spring/types/-/types-9.6.1.tgz#913d3a68c5cbc1124fdb18eff919432f7b6abdde" + integrity sha512-POu8Mk0hIU3lRXB3bGIGe4VHIwwDsQyoD1F394OK7STTiX9w4dG3cTLljjYswkQN+hDSHRrj4O36kuVa7KPU8Q== + +"@react-spring/web@~9.6.1": + version "9.6.1" + resolved "https://registry.yarnpkg.com/@react-spring/web/-/web-9.6.1.tgz#3e4c03b724d2b545dc2fa2649eb6109318ab9178" + integrity sha512-X2zR6q2Z+FjsWfGAmAXlQaoUHbPmfuCaXpuM6TcwXPpLE1ZD4A1eys/wpXboFQmDkjnrlTmKvpVna1MjWpZ5Hw== + dependencies: + "@react-spring/animated" "~9.6.1" + "@react-spring/core" "~9.6.1" + "@react-spring/shared" "~9.6.1" + "@react-spring/types" "~9.6.1" + +"@react-spring/zdog@~9.6.1": + version "9.6.1" + resolved "https://registry.yarnpkg.com/@react-spring/zdog/-/zdog-9.6.1.tgz#5292c374e23e3846db3eb9d7557ed5a7bb40dada" + integrity sha512-0jSGm2OFW/+/+4dkRp46KzEkcLVfzV2k6DO1om0dLDtQ4q6FpX4dmDTlRc7Apzin6VtfQONMFIGITtbqoS28MQ== + dependencies: + "@react-spring/animated" "~9.6.1" + "@react-spring/core" "~9.6.1" + "@react-spring/shared" "~9.6.1" + "@react-spring/types" "~9.6.1" "@reduxjs/toolkit@^1.8.3": version "1.8.3" @@ -3668,13 +3668,13 @@ "@testing-library/dom" "^8.1.0" "@testing-library/dom@>=7": - version "8.18.1" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.18.1.tgz#80f91be02bc171fe5a3a7003f88207be31ac2cf3" - integrity sha512-oEvsm2B/WtcHKE+IcEeeCqNU/ltFGaVyGbpcm4g/2ytuT49jrlH9x5qRKL/H3A6yfM4YAbSbC0ceT5+9CEXnLg== + version "8.20.0" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.20.0.tgz#914aa862cef0f5e89b98cc48e3445c4c921010f6" + integrity sha512-d9ULIT+a4EXLX3UU8FBjauG9NnsZHkHztXoIcTsOKoOw030fyjheN9svkTULjJxtYag9DZz5Jz5qkWZDPxTFwA== dependencies: "@babel/code-frame" "^7.10.4" "@babel/runtime" "^7.12.5" - "@types/aria-query" "^4.2.0" + "@types/aria-query" "^5.0.1" aria-query "^5.0.0" chalk "^4.1.0" dom-accessibility-api "^0.5.9" @@ -3747,6 +3747,11 @@ resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.2.tgz#ed4e0ad92306a704f9fb132a0cfcf77486dbe2bc" integrity sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig== +"@types/aria-query@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.1.tgz#3286741fb8f1e1580ac28784add4c7a1d49bdfbc" + integrity sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q== + "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": version "7.1.15" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.15.tgz#2ccfb1ad55a02c83f8e0ad327cbc332f55eb1024" @@ -4016,9 +4021,9 @@ "@types/react" "*" "@types/react@*": - version "18.0.21" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.21.tgz#b8209e9626bb00a34c76f55482697edd2b43cc67" - integrity sha512-7QUCOxvFgnD5Jk8ZKlUAhVcRj7GuJRjnjjiY/IUBWKgOlnvDvTMLD4RTF7NPyVmbRhNrbomZiOepg7M/2Kj1mA== + version "18.0.27" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.27.tgz#d9425abe187a00f8a5ec182b010d4fd9da703b71" + integrity sha512-3vtRKHgVxu3Jp9t718R9BuzoD4NcQ8YJ5XRzsSKxNDiDonD2MXIT1TmSkenxuCycZJoQT5d2vE8LwWJxBC1gmA== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -4611,9 +4616,11 @@ aria-query@^4.2.2: "@babel/runtime-corejs3" "^7.10.2" aria-query@^5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.0.2.tgz#0b8a744295271861e1d933f8feca13f9b70cfdc1" - integrity sha512-eigU3vhqSO+Z8BKDnVLN/ompjhf3pYzecKXz8+whRy+9gZu8n1TCGfwzQUUPnqdHl9ax1Hr9031orZ+UOEYr7Q== + version "5.1.3" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" + integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== + dependencies: + deep-equal "^2.0.5" array-differ@^3.0.0: version "3.0.0" @@ -4749,6 +4756,11 @@ autoprefixer@^10.4.8: picocolors "^1.0.0" postcss-value-parser "^4.2.0" +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" @@ -5791,13 +5803,18 @@ conventional-recommended-bump@^6.1.0: meow "^8.0.0" q "^1.5.1" -convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: +convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: version "1.8.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== dependencies: safe-buffer "~5.1.1" +convert-source-map@^1.5.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" @@ -5839,7 +5856,7 @@ core-util-is@1.0.2, core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -cosmiconfig@7.0.1, cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: +cosmiconfig@7.0.1, cosmiconfig@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== @@ -5850,6 +5867,17 @@ cosmiconfig@7.0.1, cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: path-type "^4.0.0" yaml "^1.10.0" +cosmiconfig@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + create-ecdh@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" @@ -6190,6 +6218,29 @@ dedent@^0.7.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= +deep-equal@^2.0.5: + version "2.2.0" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.0.tgz#5caeace9c781028b9ff459f33b779346637c43e6" + integrity sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw== + dependencies: + call-bind "^1.0.2" + es-get-iterator "^1.1.2" + get-intrinsic "^1.1.3" + is-arguments "^1.1.1" + is-array-buffer "^3.0.1" + is-date-object "^1.0.5" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + isarray "^2.0.5" + object-is "^1.1.5" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" @@ -6226,6 +6277,14 @@ define-properties@^1.1.3: dependencies: object-keys "^1.0.12" +define-properties@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -6360,9 +6419,9 @@ dom-accessibility-api@^0.5.6: integrity sha512-rAfghuBPeJldxqsmZQtBbna4TqMgFe4xhYs24vPULNslbmXUdcga+CXiKWzZxyWw0FCkGKPgmizIysIvsAEN8w== 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== + version "0.5.16" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453" + integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== dom-converter@^0.2.0: version "0.2.0" @@ -6628,6 +6687,21 @@ es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2, es-abstract@^1.18.2: string.prototype.trimstart "^1.0.4" unbox-primitive "^1.0.1" +es-get-iterator@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" + integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + is-arguments "^1.1.1" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.7" + isarray "^2.0.5" + stop-iteration-iterator "^1.0.0" + es-module-lexer@^0.9.0: version "0.9.3" resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" @@ -7269,6 +7343,13 @@ follow-redirects@^1.14.0: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -7361,6 +7442,11 @@ functional-red-black-tree@^1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= +functions-have-names@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -7394,6 +7480,15 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: has "^1.0.3" has-symbols "^1.0.1" +get-intrinsic@^1.1.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" + integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + get-package-type@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" @@ -7544,6 +7639,13 @@ globby@^11.0.2, globby@^11.0.3: merge2 "^1.3.0" slash "^3.0.0" +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.3, graceful-fs@^4.2.4, graceful-fs@^4.2.6: version "4.2.8" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" @@ -7616,11 +7718,23 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + has-symbols@^1.0.1, has-symbols@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + has-tostringtag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" @@ -8051,6 +8165,15 @@ internal-slot@^1.0.3: has "^1.0.3" side-channel "^1.0.4" +internal-slot@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.4.tgz#8551e7baf74a7a6ba5f749cfb16aa60722f0d6f3" + integrity sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + side-channel "^1.0.4" + interpret@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" @@ -8084,6 +8207,23 @@ is-alphanumerical@^1.0.0: is-alphabetical "^1.0.0" is-decimal "^1.0.0" +is-arguments@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-array-buffer@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.1.tgz#deb1db4fcae48308d54ef2442706c0393997052a" + integrity sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-typed-array "^1.1.10" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -8116,6 +8256,11 @@ is-buffer@^2.0.0: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== +is-callable@^1.1.3: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + is-callable@^1.1.4, is-callable@^1.2.3: version "1.2.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" @@ -8164,13 +8309,13 @@ is-core-module@^2.8.1: has "^1.0.3" is-core-module@^2.9.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed" - integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== + version "2.11.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== dependencies: has "^1.0.3" -is-date-object@^1.0.1: +is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== @@ -8239,6 +8384,11 @@ is-lambda@^1.0.1: resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" integrity sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU= +is-map@^2.0.1, is-map@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + is-negative-zero@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" @@ -8298,7 +8448,7 @@ is-potential-custom-element-name@^1.0.1: resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== -is-regex@^1.1.3: +is-regex@^1.1.3, is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== @@ -8306,6 +8456,18 @@ is-regex@^1.1.3: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-set@^2.0.1, is-set@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + is-ssh@^1.3.0: version "1.3.3" resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.3.3.tgz#7f133285ccd7f2c2c7fc897b771b53d95a2b2c7e" @@ -8318,7 +8480,7 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-string@^1.0.5, is-string@^1.0.6: +is-string@^1.0.5, is-string@^1.0.6, is-string@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== @@ -8339,6 +8501,17 @@ is-text-path@^1.0.1: dependencies: text-extensions "^1.0.0" +is-typed-array@^1.1.10: + version "1.1.10" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" + integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -8349,6 +8522,19 @@ is-unicode-supported@^0.1.0: resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + +is-weakset@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" + integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + is-wsl@^2.1.1, is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" @@ -8356,6 +8542,11 @@ is-wsl@^2.1.1, is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -10292,6 +10483,14 @@ object-inspect@^1.11.0, object-inspect@^1.9.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== +object-is@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" @@ -10307,6 +10506,16 @@ object.assign@^4.1.0, object.assign@^4.1.2: has-symbols "^1.0.1" object-keys "^1.1.1" +object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + object.entries@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.4.tgz#43ccf9a50bc5fd5b649d45ab1a579f24e088cafd" @@ -10744,7 +10953,7 @@ performance-now@^2.1.0: "pi-ui@https://github.com/decred/pi-ui": version "1.1.0" - resolved "https://github.com/decred/pi-ui#6a024e4769ae1508f1c5e7a19f75d4a287a13467" + resolved "https://github.com/decred/pi-ui#40e9524b128f93f42d8f5169131a2e00d4913324" dependencies: clamp-js-main "^0.11.5" lodash "^4.17.15" @@ -11526,16 +11735,16 @@ react-select@5.4.0: react-transition-group "^4.3.0" react-spring@^9.5.5: - version "9.5.5" - resolved "https://registry.yarnpkg.com/react-spring/-/react-spring-9.5.5.tgz#314009a65efc04d0ef157d3d60590dbb9de65f3c" - integrity sha512-vMGVd2yjgxWcRCzoLn9AD1d24+WpunHBRg5DoehcRdiBocaOH6qgle0xN9C5LPplXfv4yIpS5QWGN5MKrWxSZg== + version "9.6.1" + resolved "https://registry.yarnpkg.com/react-spring/-/react-spring-9.6.1.tgz#e715b2fa523c1a3acfdcf1aaa93e081620b8cc8e" + integrity sha512-BeP80R4SLb1bZHW/Q62nECoScHw/fH+jzGkD7dc892HNGa+lbGIJXURc6U7N8JfZ8peEO46nPxR57aUMuYzquQ== dependencies: - "@react-spring/core" "~9.5.5" - "@react-spring/konva" "~9.5.5" - "@react-spring/native" "~9.5.5" - "@react-spring/three" "~9.5.5" - "@react-spring/web" "~9.5.5" - "@react-spring/zdog" "~9.5.5" + "@react-spring/core" "~9.6.1" + "@react-spring/konva" "~9.6.1" + "@react-spring/native" "~9.6.1" + "@react-spring/three" "~9.6.1" + "@react-spring/web" "~9.6.1" + "@react-spring/zdog" "~9.6.1" react-tapper@^0.1.23: version "0.1.23" @@ -11756,12 +11965,12 @@ regenerate@^1.4.0, regenerate@^1.4.2: resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== -regenerator-runtime@^0.13.11: +regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.4: version "0.13.11" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== -regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.9: +regenerator-runtime@^0.13.9: version "0.13.9" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== @@ -11788,6 +11997,15 @@ regexp.prototype.flags@^1.3.1: call-bind "^1.0.2" define-properties "^1.1.3" +regexp.prototype.flags@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" + integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + functions-have-names "^1.2.2" + regexpp@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" @@ -12583,6 +12801,13 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= +stop-iteration-iterator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" + integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== + dependencies: + internal-slot "^1.0.4" + stream-browserify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" @@ -12762,10 +12987,10 @@ style-to-object@0.3.0, style-to-object@^0.3.0: dependencies: inline-style-parser "0.1.1" -stylis@4.0.13: - version "4.0.13" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.0.13.tgz#f5db332e376d13cc84ecfe5dace9a2a51d954c91" - integrity sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag== +stylis@4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.1.3.tgz#fd2fbe79f5fed17c55269e16ed8da14c84d069f7" + integrity sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA== supports-color@^5.3.0: version "5.5.0" @@ -13685,11 +13910,33 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== +which-typed-array@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" + integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.10" + which@2.0.2, which@^2.0.1, which@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"