From 236fd9a250ad0cc61d0132b58a52db98168a5ced Mon Sep 17 00:00:00 2001 From: Leszek Wiesner Date: Wed, 2 Apr 2025 11:59:24 +0200 Subject: [PATCH 01/55] =?UTF-8?q?=F0=9F=9A=80=20Release=20`3.7.3`=20(#4868?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Replace Subscan with Statescan (#4867) * Replace Subscan with Statescan * Fix formatting * Fix failing playwright install in CI checks * Bump version to 3.7.3 --------- Co-authored-by: Theophile Sandoz --- .github/workflows/CI.yml | 3 +- CHANGELOG.md | 10 ++++- packages/ui/package.json | 2 +- packages/ui/src/app/components/SideBar.tsx | 4 +- .../common/components/BlockTime/BlockInfo.tsx | 2 +- .../icons/symbols/ExplorerSymbol.tsx | 27 ++++++++++++ .../icons/symbols/SubscanSymbol.tsx | 23 ---------- .../Sidebar/LinksIcons/ValidatorsIcon.tsx | 44 +++++++++---------- 8 files changed, 63 insertions(+), 52 deletions(-) create mode 100644 packages/ui/src/common/components/icons/symbols/ExplorerSymbol.tsx delete mode 100644 packages/ui/src/common/components/icons/symbols/SubscanSymbol.tsx diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 30b80ab257..2c1c8622ab 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -75,7 +75,8 @@ jobs: needs: install timeout-minutes: 60 strategy: - matrix: { node: ["18.x"], os: [ubuntu-latest] } + # Temporary fix for: https://github.com/microsoft/playwright/issues/30368 + matrix: { node: ["18.x"], os: [ubuntu-22.04] } runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v3 diff --git a/CHANGELOG.md b/CHANGELOG.md index bb9767530d..ba15f3e4da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [3.7.3] - 2025-04-01 + +### Fixed +- Replace joystream.subscan.io links with explorer.joystream.org. + ## [3.7.2] - 2024-08-10 ### Fixed @@ -412,8 +417,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [0.1.1] - 2022-12-02 -[unreleased]: https://github.com/Joystream/pioneer/compare/v3.7.2...HEAD -[3.8.0]: https://github.com/Joystream/pioneer/compare/v3.7.1...v3.7.2 +[unreleased]: https://github.com/Joystream/pioneer/compare/v3.7.3...HEAD +[3.7.3]: https://github.com/Joystream/pioneer/compare/v3.7.2...v3.7.3 +[3.7.2]: https://github.com/Joystream/pioneer/compare/v3.7.1...v3.7.2 [3.7.1]: https://github.com/Joystream/pioneer/compare/v3.7.0...v3.7.1 [3.7.0]: https://github.com/Joystream/pioneer/compare/v3.6.0...v3.7.0 [3.6.0]: https://github.com/Joystream/pioneer/compare/v3.5.2...v3.6.0 diff --git a/packages/ui/package.json b/packages/ui/package.json index d48c3b9986..6927e881d4 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@joystream/pioneer", - "version": "3.7.2", + "version": "3.7.3", "license": "GPL-3.0-only", "scripts": { "build": "node --max_old_space_size=4096 ./build.js", diff --git a/packages/ui/src/app/components/SideBar.tsx b/packages/ui/src/app/components/SideBar.tsx index 49ec938860..13cb2d7168 100644 --- a/packages/ui/src/app/components/SideBar.tsx +++ b/packages/ui/src/app/components/SideBar.tsx @@ -9,7 +9,7 @@ import { MembersRoutes, ProfileRoutes } from '@/app/constants/routes' import { BountyRoutes } from '@/bounty/constants' import { Arrow } from '@/common/components/icons' import { LinkSymbol, LinkSymbolStyle, PolkadotSymbol } from '@/common/components/icons/symbols' -import { SubscanSymbol } from '@/common/components/icons/symbols/SubscanSymbol' +import { ExplorerSymbol } from '@/common/components/icons/symbols/ExplorerSymbol' import { AppsIcon } from '@/common/components/page/Sidebar/LinksIcons/AppsIcon' import { BandwidthIcon } from '@/common/components/page/Sidebar/LinksIcons/BandwidthIcon' import { BountyIcon } from '@/common/components/page/Sidebar/LinksIcons/BountyIcon' @@ -127,7 +127,7 @@ export const SideBarContent = () => { - } to="https://joystream.subscan.io"> + } to="https://explorer.joystream.org"> Explorer diff --git a/packages/ui/src/common/components/BlockTime/BlockInfo.tsx b/packages/ui/src/common/components/BlockTime/BlockInfo.tsx index 802f699475..314a30805a 100644 --- a/packages/ui/src/common/components/BlockTime/BlockInfo.tsx +++ b/packages/ui/src/common/components/BlockTime/BlockInfo.tsx @@ -19,7 +19,7 @@ export const BlockInfo = ({ block, lessInfo, inline }: BlockInfoProp) => { const [endpoints] = useNetworkEndpoints() const blockLink = endpoints.nodeRpcEndpoint == process.env.REACT_APP_MAINNET_NODE_SOCKET - ? 'joystream.subscan.io/block' + ? 'explorer.joystream.org/#/blocks' : `polkadot.js.org/apps/?rpc=${endpoints.nodeRpcEndpoint}/ws-rpc#/explorer/query` return ( evt.stopPropagation()} href={`https://${blockLink}/${block.number}`}> diff --git a/packages/ui/src/common/components/icons/symbols/ExplorerSymbol.tsx b/packages/ui/src/common/components/icons/symbols/ExplorerSymbol.tsx new file mode 100644 index 0000000000..1bdd7eabe1 --- /dev/null +++ b/packages/ui/src/common/components/icons/symbols/ExplorerSymbol.tsx @@ -0,0 +1,27 @@ +import React from 'react' + +export function ExplorerSymbol() { + return ( + + + + + + + + + + + + + + + + ) +} diff --git a/packages/ui/src/common/components/icons/symbols/SubscanSymbol.tsx b/packages/ui/src/common/components/icons/symbols/SubscanSymbol.tsx deleted file mode 100644 index 04248343b6..0000000000 --- a/packages/ui/src/common/components/icons/symbols/SubscanSymbol.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import React from 'react' - -export function SubscanSymbol() { - return ( - - - - - - - - - - - - - - - ) -} diff --git a/packages/ui/src/common/components/page/Sidebar/LinksIcons/ValidatorsIcon.tsx b/packages/ui/src/common/components/page/Sidebar/LinksIcons/ValidatorsIcon.tsx index 2a04bde7c8..3e1e1f31d2 100644 --- a/packages/ui/src/common/components/page/Sidebar/LinksIcons/ValidatorsIcon.tsx +++ b/packages/ui/src/common/components/page/Sidebar/LinksIcons/ValidatorsIcon.tsx @@ -1,27 +1,27 @@ import React from 'react' -import { Icon } from '../../../icons' - export const ValidatorsIcon = () => ( - - + + - + d="M26.791 19.3753L21.541 24.6253L18.916 22.0003M21.5621 12.5593L14.6739 16.4949C14.0506 16.8509 13.666 17.5136 13.666 18.2314V25.7585C13.666 26.482 14.0567 27.149 14.6878 27.5029L21.7388 31.4569C22.3414 31.7948 23.0759 31.7978 23.6812 31.4647L30.6302 27.6407C31.2691 27.2891 31.666 26.6177 31.666 25.8884V18.2474C31.666 17.5211 31.2723 16.8519 30.6374 16.4991L23.5256 12.5476C22.9141 12.2079 22.1695 12.2123 21.5621 12.5593Z" + stroke="#1B202C" + stroke-width="1.5" + stroke-linecap="round" + stroke-linejoin="round" + > + + + + + + + ) From 72cde78f7e0204a8da6c6f587ee6c07edcca4338 Mon Sep 17 00:00:00 2001 From: Leszek Wiesner Date: Tue, 15 Apr 2025 11:20:02 +0200 Subject: [PATCH 02/55] =?UTF-8?q?=F0=9F=9A=80=20Release=20`3.8.0`=20(#4870?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Replace Subscan with Statescan (#4867) * Replace Subscan with Statescan * Fix formatting * Fix failing playwright install in CI checks * Council and election pages: Small enhancements - Issue 4866 (#4869) * react snap setup * react snap setup * react snap setup * seo * council and past council page * Add term start and end (estimated) dates for current term * total number of votes & total voting stake during Voting and Revealing period * Add Election Result and Revealed votes statistics * added past councils route and candidate vote highlight * latest election fields update * undo react-snap * removed uneccesary package update * removed uneccesary package update * chore: remove yarn.lock from tracked files * git error fix * chore: revert yarn.lock to match main * removed eslint comment Co-authored-by: Leszek Wiesner * Apply suggestions from code review Co-authored-by: Leszek Wiesner * Update packages/ui/src/index.html Co-authored-by: Leszek Wiesner * Update packages/ui/src/council/components/pastCouncil/PastCouncilsList/PastCouncilListItem.tsx Co-authored-by: Leszek Wiesner * Update packages/ui/src/council/components/election/pastElection/PastElectionStats.tsx Co-authored-by: Leszek Wiesner * estimated ends at * council id * rearranged mock * review changes * review changes * test error fix --------- Co-authored-by: Leszek Wiesner * Bump version, update CHANGELOG --------- Co-authored-by: Theophile Sandoz Co-authored-by: Victor Emmanuel <33874323+vrrayz@users.noreply.github.com> --- CHANGELOG.md | 16 +- packages/ui/package.json | 2 +- packages/ui/src/app/pages/Council/Council.tsx | 66 ++- .../Council/PastCouncils/PastCouncil.tsx | 2 +- .../app/pages/Election/Election.stories.tsx | 7 +- .../ui/src/app/pages/Election/Election.tsx | 31 +- .../PastElections/PastElection.stories.tsx | 555 ++++++++++++++++++ .../Election/PastElections/PastElection.tsx | 33 +- .../PastElections/PastElections.stories.tsx | 227 +++++++ .../Election/PastElections/PastElections.tsx | 3 +- .../__generated__/baseTypes.generated.ts | 11 + .../components/Activities/ActivityIcon.tsx | 2 +- .../common/components/BlockTime/BlockTime.tsx | 2 +- .../components/statistics/StatisticBar.tsx | 16 +- .../election/CandidateVote/CandidateVote.tsx | 1 - .../CandidateVote/CandidateVoteList.tsx | 54 +- .../pastElection/PastElectionStats.tsx | 26 +- .../pastElection/PastElectionTabs.tsx | 1 + .../PastElectionsListRow.tsx | 15 + .../PastCouncilsList/PastCouncilListItem.tsx | 2 +- .../PastCouncilsList.stories.tsx | 6 +- .../__generated__/council.generated.tsx | 36 ++ .../ui/src/council/queries/council.graphql | 12 + packages/ui/src/council/types/Election.ts | 7 + .../ui/src/council/types/LatestElection.ts | 4 + packages/ui/src/council/types/PastCouncil.ts | 2 + packages/ui/src/council/types/PastElection.ts | 27 +- .../__generated__/overview.generated.tsx | 5 + .../ui/src/overview/queries/overview.graphql | 4 + 29 files changed, 1132 insertions(+), 43 deletions(-) create mode 100644 packages/ui/src/app/pages/Election/PastElections/PastElection.stories.tsx create mode 100644 packages/ui/src/app/pages/Election/PastElections/PastElections.stories.tsx diff --git a/CHANGELOG.md b/CHANGELOG.md index ba15f3e4da..0ee61efdc5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [3.8.0] - 2025-04-15 + +### Added +- "Started at" and "Estimated end" dates & blocks on council page, +- Current term number on council page, +- Voting statistics on current election page (votes, revealed votes, stake, revealed stake), +- Election result on past election page, +- Election result on pase elections listing, +- Stake vs revealed stake stats on past election page. + +### Fixed +- Made council term number on past council page and past council listing human-readable. + ## [3.7.3] - 2025-04-01 ### Fixed @@ -417,7 +430,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [0.1.1] - 2022-12-02 -[unreleased]: https://github.com/Joystream/pioneer/compare/v3.7.3...HEAD +[unreleased]: https://github.com/Joystream/pioneer/compare/v3.8.0...HEAD +[3.8.0]: https://github.com/Joystream/pioneer/compare/v3.7.3...v3.8.0 [3.7.3]: https://github.com/Joystream/pioneer/compare/v3.7.2...v3.7.3 [3.7.2]: https://github.com/Joystream/pioneer/compare/v3.7.1...v3.7.2 [3.7.1]: https://github.com/Joystream/pioneer/compare/v3.7.0...v3.7.1 diff --git a/packages/ui/package.json b/packages/ui/package.json index 6927e881d4..3403162c43 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@joystream/pioneer", - "version": "3.7.3", + "version": "3.8.0", "license": "GPL-3.0-only", "scripts": { "build": "node --max_old_space_size=4096 ./build.js", diff --git a/packages/ui/src/app/pages/Council/Council.tsx b/packages/ui/src/app/pages/Council/Council.tsx index 16f697f82f..e7a84053f4 100644 --- a/packages/ui/src/app/pages/Council/Council.tsx +++ b/packages/ui/src/app/pages/Council/Council.tsx @@ -4,17 +4,27 @@ import styled from 'styled-components' import { PageHeaderWithHint } from '@/app/components/PageHeaderWithHint' import { PageLayout } from '@/app/components/PageLayout' import { ActivitiesBlock } from '@/common/components/Activities/ActivitiesBlock' +import { AboutText, BlockTimeWrapper } from '@/common/components/BlockTime' +import { BlockInfo } from '@/common/components/BlockTime/BlockInfo' import { MainPanel } from '@/common/components/page/PageContent' import { SidePanel } from '@/common/components/page/SidePanel' -import { BlockDurationStatistics, MultiValueStat, Statistics } from '@/common/components/statistics' +import { + BlockDurationStatistics, + MultiValueStat, + StatisticItem, + StatisticItemSpacedContent, + StatisticLabel, + Statistics, +} from '@/common/components/statistics' import { NotFoundText } from '@/common/components/typography/NotFoundText' import { useRefetchQueries } from '@/common/hooks/useRefetchQueries' -import { MILLISECONDS_PER_BLOCK } from '@/common/model/formatters' +import { formatDateString, MILLISECONDS_PER_BLOCK } from '@/common/model/formatters' import { asBN } from '@/common/utils/bn' import { CouncilList, CouncilOrder } from '@/council/components/councilList' import { ViewElectionButton } from '@/council/components/ViewElectionButton' import { useCouncilActivities } from '@/council/hooks/useCouncilActivities' import { useCouncilorWithDetails } from '@/council/hooks/useCouncilorWithDetails' +import { useCouncilPeriodInformation } from '@/council/hooks/useCouncilPeriodInformation' import { useCouncilStatistics } from '@/council/hooks/useCouncilStatistics' import { useElectedCouncil } from '@/council/hooks/useElectedCouncil' import { useElectionStage } from '@/council/hooks/useElectionStage' @@ -32,16 +42,39 @@ export const Council = () => { const { council, isLoading } = useElectedCouncil() const { idlePeriodRemaining, budget, reward } = useCouncilStatistics() + const periodInformation = useCouncilPeriodInformation() + + const endsAt = useMemo( + () => + periodInformation && council + ? { + number: periodInformation.periodEnds[3], + timestamp: ( + new Date().getTime() + + (periodInformation.periodEnds[3] - periodInformation.currentBlock) * MILLISECONDS_PER_BLOCK + ).toString(), + } + : { number: 0, timestamp: new Date().getTime().toString() }, + [periodInformation, council] + ) + const { activities } = useCouncilActivities() const [order, setOrder] = useState({ key: 'member' }) const { councilors, isLoading: isLoadingCouncilors } = useCouncilorWithDetails(council) const sortedCouncilors = useMemo(() => councilors.sort(sortBy(order)), [councilors]) - const header = } /> + const header = ( + } + /> + ) const isCouncilorLoading = !isRefetched && (isLoading || isLoadingCouncilors) const rewardPerDay = useMemo(() => reward?.period?.mul(reward?.singleCouncilorAmount ?? asBN(0)) ?? asBN(0), [reward]) + const main = ( @@ -65,6 +98,28 @@ export const Council = () => { { label: 'Per Week', value: rewardPerDay.mul(asBN(7)) }, ]} /> + + + + Started At + + {council && ( + + {formatDateString(council.electedAt.timestamp)} + + + )} + + + Estimated end + {council && ( + + {formatDateString(Number(endsAt.timestamp))} + + + )} + + {!isCouncilorLoading && sortedCouncilors.length === 0 ? ( @@ -101,3 +156,8 @@ const StatisticsStyle = styled(Statistics)` grid-template-columns: 1fr 1fr; } ` +const CustomBlockTimeWrapper = styled(BlockTimeWrapper)` + grid-row-gap: 2px; + min-width: 165px; + justify-content: flex-start; +` diff --git a/packages/ui/src/app/pages/Council/PastCouncils/PastCouncil.tsx b/packages/ui/src/app/pages/Council/PastCouncils/PastCouncil.tsx index 05f28d956d..aecafb48c3 100644 --- a/packages/ui/src/app/pages/Council/PastCouncils/PastCouncil.tsx +++ b/packages/ui/src/app/pages/Council/PastCouncils/PastCouncil.tsx @@ -37,7 +37,7 @@ export const PastCouncil = () => { - Council #{council.id} + Council #{parseInt(council.id, 36)} { tooltipText="Elections occur periodically. Each has a sequence of stages referred to as the election cycle. Stages are: announcing period, voting period and revealing period." /> + {(electionStage == 'revealing' || electionStage == 'voting') && ( + + + + {electionStage == 'revealing' && ( + <> + {election?.revealedVotes} /{' '} + + )} + {election?.votesNumber} + + + + + {electionStage == 'revealing' && ( + <> + /{' '} + + )} + + + + + )} + {electionStage === 'inactive' && ( )} @@ -116,3 +142,6 @@ const StyledStatistics = styled(Statistics)<{ size: string; stage: ElectionStage grid-template-columns: ${({ size, stage }) => stage === 'inactive' || size === 'xxs' || size === 'xs' ? '1fr' : '200px 1fr'}; ` +const ValueDivider = styled(TextInlineSmall)` + color: ${Colors.Black[500]}; +` diff --git a/packages/ui/src/app/pages/Election/PastElections/PastElection.stories.tsx b/packages/ui/src/app/pages/Election/PastElections/PastElection.stories.tsx new file mode 100644 index 0000000000..1242427436 --- /dev/null +++ b/packages/ui/src/app/pages/Election/PastElections/PastElection.stories.tsx @@ -0,0 +1,555 @@ +import { Meta, StoryContext, StoryObj } from '@storybook/react' +import { FC } from 'react' + +import { GetPastElectionDocument } from '@/council/queries' +import { MocksParameters } from '@/mocks/providers' + +import { PastElection } from './PastElection' + +type Story = StoryObj + +type Args = { + result: 'successful' | 'failed' +} + +const ElectionRoundId = '00000019' + +export default { + title: 'Pages/Election/PastElections/PastElection', + argTypes: { + result: { + control: { type: 'radio' }, + options: ['successful', 'failed'], + }, + }, + args: { + result: 'successful', + }, + component: PastElection, + parameters: { + router: { path: '/:id', href: `/${ElectionRoundId}` }, + + mocks: ({ args }: StoryContext): MocksParameters => { + const nextElectedCouncil = + args.result == 'successful' + ? { + councilElections: [ + { + cycleId: 44, + }, + ], + } + : null + return { + gql: { + queries: [ + { + query: GetPastElectionDocument, + data: { + electionRoundByUniqueInput: { + id: '00000018', + cycleId: 44, + endedAtBlock: 11851230, + endedAtTime: '2025-03-14T04:00:48.000Z', + endedAtNetwork: 'OLYMPIA', + candidates: [ + { + id: '0000006z', + member: { + id: '2154', + rootAccount: 'j4WimuwF1N3nqff211ifeGSW8q5DW8xWpsjaNf9Feds1MDo5B', + controllerAccount: 'j4WimuwF1N3nqff211ifeGSW8q5DW8xWpsjaNf9Feds1MDo5B', + boundAccounts: [ + 'j4VSHQU7vhHUM8XB3bCBfFGpgb46hJFCgv9DnQSYFhygGLXjx', + 'j4WimuwF1N3nqff211ifeGSW8q5DW8xWpsjaNf9Feds1MDo5B', + 'j4RgyJZGRFbtXiY5AZFoTnoYjpTFHx4ar2N5PsPqKg9ryaHfn', + 'j4TeRe6xT2s6QPgMWmADNnqXSjz4tsNC1XEgc8KWnygoLFtZo', + 'j4VxCgPkSDZrynLGJj5XszwuzVTrNXG1WsLg9cZPqYbgyfpML', + 'j4Ssvsr49QwDvm875HGVestJUPg58LJDS8TaiuRMdSwmPNoWa', + ], + handle: 'marat_mu', + metadata: { + name: null, + about: + 'Deep in crypto. \nMy contacts:\nDiscord - MarikJudo\nTelegram - @МarikJudo\nKeybase - marikjudo', + avatar: { + __typename: 'AvatarUri', + avatarUri: 'https://atlas-services.joystream.org/avatars/migrated/2154.webp', + }, + isVerifiedValidator: false, + }, + isVerified: true, + isFoundingMember: true, + isCouncilMember: false, + inviteCount: 2, + roles: [ + { + id: 'operationsWorkingGroupGamma-28', + group: { + name: 'operationsWorkingGroupGamma', + }, + createdAt: '2024-02-16T06:50:30.000Z', + isLead: false, + isActive: true, + }, + ], + createdAt: '2024-12-20T02:23:00.000Z', + stakingaccountaddedeventmember: [ + { + createdAt: '2023-11-23T14:25:00.001Z', + inBlock: 5011185, + network: 'OLYMPIA', + account: 'j4VSHQU7vhHUM8XB3bCBfFGpgb46hJFCgv9DnQSYFhygGLXjx', + }, + { + createdAt: '2024-01-07T17:55:18.001Z', + inBlock: 5658642, + network: 'OLYMPIA', + account: 'j4WimuwF1N3nqff211ifeGSW8q5DW8xWpsjaNf9Feds1MDo5B', + }, + { + createdAt: '2024-01-15T14:37:24.000Z', + inBlock: 5771640, + network: 'OLYMPIA', + account: 'j4RgyJZGRFbtXiY5AZFoTnoYjpTFHx4ar2N5PsPqKg9ryaHfn', + }, + { + createdAt: '2024-02-11T17:43:42.001Z', + inBlock: 6161782, + network: 'OLYMPIA', + account: 'j4TeRe6xT2s6QPgMWmADNnqXSjz4tsNC1XEgc8KWnygoLFtZo', + }, + { + createdAt: '2024-02-15T17:44:18.000Z', + inBlock: 6219315, + network: 'OLYMPIA', + account: 'j4VxCgPkSDZrynLGJj5XszwuzVTrNXG1WsLg9cZPqYbgyfpML', + }, + { + createdAt: '2024-05-23T09:48:42.001Z', + inBlock: 7617210, + network: 'OLYMPIA', + account: 'j4Ssvsr49QwDvm875HGVestJUPg58LJDS8TaiuRMdSwmPNoWa', + }, + ], + }, + stake: '1666666666660000', + noteMetadata: { + header: 'MarikJudo for Council', + bulletPoints: ['Marketing', 'Roadmap'], + bannerImageUri: 'https://i.postimg.cc/Pr3mDmgp/21.png', + description: + 'Hey, everybody! \nI am running for this election because I want to strengthen my work in areas such as Marketing and Roadmap. \nAs you know, at the moment we are in the stage of suspension of our ambassador program, but we still have a number of active creators who are ready to continue cooperation. I am convinced that as a project focused on video content creation, we will sooner or later come to the conclusion that interaction with content creators is the key to success. Therefore, I want to discuss and realize this issue in advance and within the scope of the DAO marketing campaign. \nAlso, as you may have seen, we recently published our roadmap. https://t.co/dS1kVBr85n \nIn my opinion, it is very cool and so its strict implementation is my priority!', + }, + status: 'FAILED', + stakingAccountId: 'j4WimuwF1N3nqff211ifeGSW8q5DW8xWpsjaNf9Feds1MDo5B', + votePower: '0', + votesReceived: [], + }, + { + id: '00000071', + member: { + id: '515', + rootAccount: 'j4SWVha668Nv1YroUkQB68yzfSAjp5xJg4dsXCcKjXJSLwwoa', + controllerAccount: 'j4SWVha668Nv1YroUkQB68yzfSAjp5xJg4dsXCcKjXJSLwwoa', + boundAccounts: [ + 'j4ReW51wy7KnuUyZEQiJsJdZR3iQFmf3tZ8uaVWW5y1uKHdnF', + 'j4RP5odJ8pDGFdaCK3a8kEefHwTXvtzz8C3R1G6o9tF5ALwRz', + 'j4Wg7JSHHLQpxFQfhEB9T57bbeSjFNKpFcoppifCNj3VxWj4C', + 'j4WkPQ89RT5geSQ3KgL2zsD1dVnD6cgfzKtJWhQQNyrVyfJcb', + 'j4S8usvaKAZZdYpj9Hp4wsTYbRSh9hg4NwezX5XjXUFWyTvr1', + 'j4Ue4cDRUmbQ2qXoVfS9p3D7puDQVmZ5dewNAJQeL7a4jif48', + 'j4VgJtzZKvFbamrzhNATcK69HBrouazF7kx9bnWqQt3zNGKPQ', + 'j4UQcm2fysev3AQitU11f2byVbxjJw7u3Jz8ftPydHixX8eQ5', + 'j4USoHhqNrKHEhJCrXY5Lj4g2X9iXRjQ9ZkxijxiFgJB43xPR', + 'j4Wu1J7oshW9EhFnhriNMJKRXEBaVaKUmr69pdWKZ8ZK644ub', + 'j4S3furSLyPz5uMZ6FRGmY4Ks53Lj4TCCio1BSoM7EXPGqW6e', + 'j4SX2fZsSsaatUwPcCWDUGVV5HAd3HoYDWherGrFz5Dg6wJQQ', + 'j4VSMCK6HsUT2Xiufd7ZtWeFfVAooa7B9SHneR8wBKngEcpVz', + 'j4VJYdeHRx4BzoLeVjHXquLGcEXjkJb13uu4Wq7awyKB1sJ4E', + 'j4U8JopV4oAraxF2G6pGp6bk6JKpBkKkPJf7ELeSJu84P9pEa', + 'j4S3pRewxQgjUj3EuwZ1SYwaEqDqbzBwkP3bLGs5CwJ1D99Q6', + ], + handle: 'l1dev', + metadata: { + name: null, + about: + 'FM report: https://github.com/Joystream/community-repo/tree/master/contributions/fm-reports/l1dev', + avatar: { + __typename: 'AvatarUri', + avatarUri: 'https://atlas-services.joystream.org/avatars/migrated/515.webp', + }, + isVerifiedValidator: false, + }, + isVerified: true, + isFoundingMember: true, + isCouncilMember: false, + inviteCount: 2, + roles: [ + { + id: 'operationsWorkingGroupAlpha-2', + group: { + name: 'operationsWorkingGroupAlpha', + }, + createdAt: '2023-01-06T12:15:24.000Z', + isLead: false, + isActive: false, + }, + { + id: 'distributionWorkingGroup-0', + group: { + name: 'distributionWorkingGroup', + }, + createdAt: '2023-01-04T13:03:30.000Z', + isLead: false, + isActive: false, + }, + { + id: 'appWorkingGroup-3', + group: { + name: 'appWorkingGroup', + }, + createdAt: '2023-03-30T16:23:30.001Z', + isLead: false, + isActive: false, + }, + { + id: 'appWorkingGroup-5', + group: { + name: 'appWorkingGroup', + }, + createdAt: '2023-05-30T00:30:48.000Z', + isLead: false, + isActive: false, + }, + ], + createdAt: '2024-11-21T23:37:48.000Z', + stakingaccountaddedeventmember: [ + { + createdAt: '2022-12-19T16:47:48.000Z', + inBlock: 141522, + network: 'OLYMPIA', + account: 'j4ReW51wy7KnuUyZEQiJsJdZR3iQFmf3tZ8uaVWW5y1uKHdnF', + }, + { + createdAt: '2023-01-02T22:27:54.000Z', + inBlock: 346424, + network: 'OLYMPIA', + account: 'j4RP5odJ8pDGFdaCK3a8kEefHwTXvtzz8C3R1G6o9tF5ALwRz', + }, + { + createdAt: '2023-01-03T16:56:06.000Z', + inBlock: 357132, + network: 'OLYMPIA', + account: 'j4Wg7JSHHLQpxFQfhEB9T57bbeSjFNKpFcoppifCNj3VxWj4C', + }, + { + createdAt: '2023-01-04T13:36:06.001Z', + inBlock: 369532, + network: 'OLYMPIA', + account: 'j4WkPQ89RT5geSQ3KgL2zsD1dVnD6cgfzKtJWhQQNyrVyfJcb', + }, + { + createdAt: '2023-01-04T20:32:24.000Z', + inBlock: 373695, + network: 'OLYMPIA', + account: 'j4S8usvaKAZZdYpj9Hp4wsTYbRSh9hg4NwezX5XjXUFWyTvr1', + }, + { + createdAt: '2023-01-05T22:43:54.000Z', + inBlock: 389410, + network: 'OLYMPIA', + account: 'j4Ue4cDRUmbQ2qXoVfS9p3D7puDQVmZ5dewNAJQeL7a4jif48', + }, + { + createdAt: '2023-01-19T18:35:00.001Z', + inBlock: 588293, + network: 'OLYMPIA', + account: 'j4VgJtzZKvFbamrzhNATcK69HBrouazF7kx9bnWqQt3zNGKPQ', + }, + { + createdAt: '2023-01-19T18:47:24.000Z', + inBlock: 588417, + network: 'OLYMPIA', + account: 'j4UQcm2fysev3AQitU11f2byVbxjJw7u3Jz8ftPydHixX8eQ5', + }, + { + createdAt: '2023-01-23T09:45:48.001Z', + inBlock: 640426, + network: 'OLYMPIA', + account: 'j4USoHhqNrKHEhJCrXY5Lj4g2X9iXRjQ9ZkxijxiFgJB43xPR', + }, + { + createdAt: '2023-01-23T09:49:18.001Z', + inBlock: 640461, + network: 'OLYMPIA', + account: 'j4Wu1J7oshW9EhFnhriNMJKRXEBaVaKUmr69pdWKZ8ZK644ub', + }, + { + createdAt: '2023-03-21T19:15:48.000Z', + inBlock: 1466233, + network: 'OLYMPIA', + account: 'j4S3furSLyPz5uMZ6FRGmY4Ks53Lj4TCCio1BSoM7EXPGqW6e', + }, + { + createdAt: '2023-03-29T23:04:54.001Z', + inBlock: 1583547, + network: 'OLYMPIA', + account: 'j4SX2fZsSsaatUwPcCWDUGVV5HAd3HoYDWherGrFz5Dg6wJQQ', + }, + { + createdAt: '2023-05-01T14:06:18.000Z', + inBlock: 2052380, + network: 'OLYMPIA', + account: 'j4VSMCK6HsUT2Xiufd7ZtWeFfVAooa7B9SHneR8wBKngEcpVz', + }, + { + createdAt: '2023-05-19T11:03:00.000Z', + inBlock: 2308757, + network: 'OLYMPIA', + account: 'j4VJYdeHRx4BzoLeVjHXquLGcEXjkJb13uu4Wq7awyKB1sJ4E', + }, + { + createdAt: '2023-06-03T22:21:12.000Z', + inBlock: 2530478, + network: 'OLYMPIA', + account: 'j4U8JopV4oAraxF2G6pGp6bk6JKpBkKkPJf7ELeSJu84P9pEa', + }, + { + createdAt: '2023-06-10T02:19:24.000Z', + inBlock: 2619240, + network: 'OLYMPIA', + account: 'j4S3pRewxQgjUj3EuwZ1SYwaEqDqbzBwkP3bLGs5CwJ1D99Q6', + }, + ], + }, + stake: '2500000000000000', + noteMetadata: { + header: 'l1.media for you', + bulletPoints: [ + 'Make the DAO socially relevant by providing actual utility and solve actual problems', + 'Focus on services', + ], + bannerImageUri: 'https://joystreamstats.live/static/media/ai-office.jpeg', + description: + "No self-voting. If elected i'll spend more time to assemble a team and restore l1.media and joystreamstats.live\n\n* Focus on services\n* Keep gov atmosphere joyful\n* For devs it’s currently unattainable to gain big allocations. Provide new opportunities for big contribtutions.\n* The council/wg reporting system is ineffective to achieve goals.\n* Create gw for regional growing communities\n* Make running a gw as easy as mastodon\n* Put price tags on roadmap items", + }, + status: 'FAILED', + stakingAccountId: 'j4Wg7JSHHLQpxFQfhEB9T57bbeSjFNKpFcoppifCNj3VxWj4C', + votePower: '0', + votesReceived: [], + }, + { + id: '0000006y', + member: { + id: '957', + rootAccount: 'j4U6QUxnCrhhbxaLyqXNq6VnVH1Bq5MBzo8wkjaPDsSzUZdbF', + controllerAccount: 'j4VoXReFKK1FSTNczaYdcSSC9T96cc1RUb4aja1oXFWKbpMjk', + boundAccounts: [ + 'j4U6QUxnCrhhbxaLyqXNq6VnVH1Bq5MBzo8wkjaPDsSzUZdbF', + 'j4S8ySabhToiXsEzjnzcXAtEDXv1YYzC4rY7VoWopCXrFSpqK', + 'j4Tgk9dFzGMZk4hW25k9uf4gWfBN8vg3SAc8xbDeQpDyNGEDG', + 'j4TZHG7owBRZWSbNG6RhiE4hrRdTZvc6yqGUTdVcEKCu9HFnN', + 'j4VSjLBvfcbBTEMNMGiBUSCXBpxvvyPv3FERAkXpe4BAQ4oQi', + 'j4U5cu23otryUAE15zq6ZFtdtXf4NQGr4bRcmqpNVBka5NgD2', + 'j4UBm6X5SPBcMtC9Xr9ExRMAGAjc5XicgJd2Mcy9WcmQUDNLD', + 'j4VQ8XM23ddHAQQE5sS6yU4RLgLHLNQ84CSJDJ5cK9PYKteYy', + 'j4W8EQ8Bxzvtf7ngjGNPSm8LQsoRWWH32BhP6qcQQB7xG7p59', + 'j4SLWkHT47sQGLseyqw85Gaf2dEpN5sNFKpb9yRTrvQfpcFHJ', + 'j4WQ1qCAjvbPHb4ptizot5XcM2BBq9TrWUgw24NgRH9B3pXQr', + 'j4UBmT3fUnxxKh24pYqEBWYG7GgkJJ8WpqBJwuk5jjuWNyRvo', + 'j4SW7xG7PPuTdbZEHAFdnYS3zUaGNtHbtLck2xosY41rMzo2d', + 'j4WVAzoHp76Qt8qQ5tR9wZPhXoYcqBHHFxgmvVL21T5YMHd7b', + 'j4Wrd8Pjqh1jeGkgUv95fDegNeijsioBQx4QrEuevDRFU3qpz', + 'j4VGTrFGj7PKzDPHysicwWh3o8AFTH647Vk4AZAH2fJGsP3VV', + 'j4UETNicTHDkrUEWjxv9PB3XAY754DREYDRDfeB9aqgeySA9J', + ], + handle: 'leet_joy', + metadata: { + name: 'leet_joy', + about: 'FM', + avatar: { + __typename: 'AvatarUri', + avatarUri: + 'https://atlas-services.joystream.org/avatars/d4372f26-9822-4d22-a67c-8f5aec23d187.webp', + }, + isVerifiedValidator: true, + }, + isVerified: true, + isFoundingMember: true, + isCouncilMember: true, + inviteCount: 2, + roles: [ + { + id: 'operationsWorkingGroupGamma-0', + group: { + name: 'operationsWorkingGroupGamma', + }, + createdAt: '2023-01-14T11:24:42.002Z', + isLead: false, + isActive: false, + }, + ], + createdAt: '2025-03-14T04:00:48.000Z', + stakingaccountaddedeventmember: [ + { + createdAt: '2023-01-06T14:48:18.000Z', + inBlock: 399054, + network: 'OLYMPIA', + account: 'j4U6QUxnCrhhbxaLyqXNq6VnVH1Bq5MBzo8wkjaPDsSzUZdbF', + }, + { + createdAt: '2023-01-23T12:20:42.001Z', + inBlock: 641975, + network: 'OLYMPIA', + account: 'j4S8ySabhToiXsEzjnzcXAtEDXv1YYzC4rY7VoWopCXrFSpqK', + }, + { + createdAt: '2023-01-31T18:40:18.000Z', + inBlock: 760971, + network: 'OLYMPIA', + account: 'j4Tgk9dFzGMZk4hW25k9uf4gWfBN8vg3SAc8xbDeQpDyNGEDG', + }, + { + createdAt: '2023-02-19T09:25:00.000Z', + inBlock: 1028636, + network: 'OLYMPIA', + account: 'j4TZHG7owBRZWSbNG6RhiE4hrRdTZvc6yqGUTdVcEKCu9HFnN', + }, + { + createdAt: '2023-03-09T01:59:18.000Z', + inBlock: 1283187, + network: 'OLYMPIA', + account: 'j4VSjLBvfcbBTEMNMGiBUSCXBpxvvyPv3FERAkXpe4BAQ4oQi', + }, + { + createdAt: '2023-03-21T17:07:06.000Z', + inBlock: 1464946, + network: 'OLYMPIA', + account: 'j4U5cu23otryUAE15zq6ZFtdtXf4NQGr4bRcmqpNVBka5NgD2', + }, + { + createdAt: '2023-06-25T13:31:30.000Z', + inBlock: 2841634, + network: 'OLYMPIA', + account: 'j4UBm6X5SPBcMtC9Xr9ExRMAGAjc5XicgJd2Mcy9WcmQUDNLD', + }, + { + createdAt: '2023-08-05T17:28:30.001Z', + inBlock: 3433271, + network: 'OLYMPIA', + account: 'j4VQ8XM23ddHAQQE5sS6yU4RLgLHLNQ84CSJDJ5cK9PYKteYy', + }, + { + createdAt: '2023-08-17T21:09:06.000Z', + inBlock: 3607907, + network: 'OLYMPIA', + account: 'j4W8EQ8Bxzvtf7ngjGNPSm8LQsoRWWH32BhP6qcQQB7xG7p59', + }, + { + createdAt: '2023-08-29T00:36:36.000Z', + inBlock: 3767651, + network: 'OLYMPIA', + account: 'j4SLWkHT47sQGLseyqw85Gaf2dEpN5sNFKpb9yRTrvQfpcFHJ', + }, + { + createdAt: '2023-10-17T05:14:48.000Z', + inBlock: 4474973, + network: 'OLYMPIA', + account: 'j4WQ1qCAjvbPHb4ptizot5XcM2BBq9TrWUgw24NgRH9B3pXQr', + }, + { + createdAt: '2023-12-27T16:11:36.000Z', + inBlock: 5499565, + network: 'OLYMPIA', + account: 'j4UBmT3fUnxxKh24pYqEBWYG7GgkJJ8WpqBJwuk5jjuWNyRvo', + }, + { + createdAt: '2024-02-05T13:55:36.000Z', + inBlock: 6073114, + network: 'OLYMPIA', + account: 'j4SW7xG7PPuTdbZEHAFdnYS3zUaGNtHbtLck2xosY41rMzo2d', + }, + { + createdAt: '2024-03-05T21:08:06.000Z', + inBlock: 6491625, + network: 'OLYMPIA', + account: 'j4WVAzoHp76Qt8qQ5tR9wZPhXoYcqBHHFxgmvVL21T5YMHd7b', + }, + { + createdAt: '2024-08-20T10:49:54.001Z', + inBlock: 8895002, + network: 'OLYMPIA', + account: 'j4Wrd8Pjqh1jeGkgUv95fDegNeijsioBQx4QrEuevDRFU3qpz', + }, + { + createdAt: '2024-08-20T17:56:06.000Z', + inBlock: 8899214, + network: 'OLYMPIA', + account: 'j4VGTrFGj7PKzDPHysicwWh3o8AFTH647Vk4AZAH2fJGsP3VV', + }, + { + createdAt: '2024-11-19T17:59:06.000Z', + inBlock: 10206444, + network: 'OLYMPIA', + account: 'j4UETNicTHDkrUEWjxv9PB3XAY754DREYDRDfeB9aqgeySA9J', + }, + ], + }, + stake: '1666666666660000', + noteMetadata: { + header: 'leet_joy', + bulletPoints: ['high exp as cm', 'hodler'], + bannerImageUri: + 'https://github.com/Joystream/founding-members/blob/main/avatars/selected-avatars/42-leet_joy.png?raw=true', + description: + "Hello everyone, [_**@leet\\_joy**_](#mention?member-id=957) and I'm ready to continue work as CM in Term 44, supporting protocol adoption and development.\n\nPriorities :\n\n* Builders: SDK & Infrastructure authentication;\n* Infrastructure: cost optimization, reduce number of active hosts to 4\n* Marketing: strengthen the team, increase content reach\n* Content: delete large trash files, improve top video in categories\n\nWhen it comes to spending, I would opt for a conservative plan and not exceed 0.5% inflation per term. \n\nPrevious council applications:\n\n* [Term 43](https://pioneerapp.xyz/#/election/past-elections/43?candidate=0000006v)\n* [Term 42](https://pioneerapp.xyz/#/election/past-elections/42?candidate=0000006s)\n* [Term 41](https://pioneerapp.xyz/#/election/past-elections/41?candidate=0000006n)\n* [Term 40](https://pioneerapp.xyz/#/election/past-elections/40?candidate=0000006k)", + }, + status: 'ELECTED', + stakingAccountId: 'j4TZHG7owBRZWSbNG6RhiE4hrRdTZvc6yqGUTdVcEKCu9HFnN', + votePower: '143333330000000000', + votesReceived: [ + { + id: '00000381', + }, + ], + }, + ], + castVotes: [ + { + stake: '1666700000000', + stakeLocked: true, + voteForId: '00000072', + castBy: 'j4SEkmk9DM2TScQiPX4tcPxDHPXAKJQzuzbwJ6CiHMWrw7c2m', + }, + { + stake: '1779950000000000', + stakeLocked: true, + voteForId: '00000072', + castBy: 'j4UBmT3fUnxxKh24pYqEBWYG7GgkJJ8WpqBJwuk5jjuWNyRvo', + }, + { + stake: '895000000000000', + stakeLocked: true, + voteForId: '00000072', + castBy: 'j4UBm6X5SPBcMtC9Xr9ExRMAGAjc5XicgJd2Mcy9WcmQUDNLD', + }, + { + stake: '1618390000000000', + stakeLocked: true, + voteForId: null, + castBy: 'j4VoXReFKK1FSTNczaYdcSSC9T96cc1RUb4aja1oXFWKbpMjk', + }, + ], + nextElectedCouncil, + }, + }, + }, + ], + }, + } + }, + }, +} satisfies Meta + +export const Default: Story = {} diff --git a/packages/ui/src/app/pages/Election/PastElections/PastElection.tsx b/packages/ui/src/app/pages/Election/PastElections/PastElection.tsx index b55df19a84..339912521f 100644 --- a/packages/ui/src/app/pages/Election/PastElections/PastElection.tsx +++ b/packages/ui/src/app/pages/Election/PastElections/PastElection.tsx @@ -1,18 +1,20 @@ import React, { useEffect } from 'react' -import { useHistory, useParams } from 'react-router-dom' +import { generatePath, Link, useHistory, useParams } from 'react-router-dom' +import styled from 'styled-components' import { PageHeaderWithButtons, PageHeaderWrapper, PageLayout } from '@/app/components/PageLayout' -import { BadgesRow, BadgeStatus } from '@/common/components/BadgeStatus' +import { BadgesRow, BadgeStatus, BadgeStatusCss } from '@/common/components/BadgeStatus' import { ButtonsGroup, CopyButtonTemplate } from '@/common/components/buttons' import { LinkIcon } from '@/common/components/icons' import { Loading } from '@/common/components/Loading' import { MainPanel, RowGapBlock } from '@/common/components/page/PageContent' import { PageTitle } from '@/common/components/page/PageTitle' import { PreviousPage } from '@/common/components/page/PreviousPage' +import { Tooltip, TooltipDefault } from '@/common/components/Tooltip' import { getUrl } from '@/common/utils/getUrl' import { PastElectionStats } from '@/council/components/election/pastElection/PastElectionStats' import { PastElectionTabs } from '@/council/components/election/pastElection/PastElectionTabs' -import { ElectionRoutes } from '@/council/constants' +import { CouncilRoutes, ElectionRoutes } from '@/council/constants' import { useCandidatePreviewViaUrlParameter } from '@/council/hooks/useCandidatePreviewViaUrlParameter' import { usePastElection } from '@/council/hooks/usePastElection' @@ -55,6 +57,23 @@ export const PastElection = () => { Past Election + {election.result == 'successful' ? ( + + Successful + + ) : ( + + Failed + + + + + )} @@ -77,3 +96,11 @@ export const PastElection = () => { return } +const StyledBadge = styled(Link)` + ${BadgeStatusCss} +` +const TooltipBadge = styled(BadgeStatus)` + display: flex; + align-items: center; + gap: 4px; +` diff --git a/packages/ui/src/app/pages/Election/PastElections/PastElections.stories.tsx b/packages/ui/src/app/pages/Election/PastElections/PastElections.stories.tsx new file mode 100644 index 0000000000..441efd52af --- /dev/null +++ b/packages/ui/src/app/pages/Election/PastElections/PastElections.stories.tsx @@ -0,0 +1,227 @@ +import { Meta, StoryObj } from '@storybook/react' +import { FC } from 'react' + +import { GetPastElectionsDocument } from '@/council/queries' +import { MocksParameters } from '@/mocks/providers' + +import { PastElections } from './PastElections' + +type Story = StoryObj + +export default { + title: 'Pages/Election/PastElections/PastElections', + component: PastElections, + parameters: { + mocks: (): MocksParameters => { + return { + gql: { + queries: [ + { + query: GetPastElectionsDocument, + data: { + electionRounds: [ + { + id: '00000018', + cycleId: 44, + endedAtBlock: 11851230, + endedAtTime: '2025-03-14T04:00:48.000Z', + endedAtNetwork: 'OLYMPIA', + candidates: [ + { + stake: '1666666666660000', + }, + { + stake: '2500000000000000', + }, + { + stake: '1666666666660000', + }, + { + stake: '1666666666660000', + }, + { + stake: '1666666666660000', + }, + ], + castVotes: [ + { + voteForId: null, + stake: '41000000000000000', + }, + { + voteForId: null, + stake: '1666660000000000', + }, + { + voteForId: null, + stake: '1754810000000000', + }, + { + voteForId: null, + stake: '937830000000000', + }, + { + voteForId: null, + stake: '1740630000000000', + }, + { + voteForId: null, + stake: '945220000000000', + }, + { + voteForId: null, + stake: '1533080000000000', + }, + { + voteForId: null, + stake: '499940000000000', + }, + { + voteForId: null, + stake: '937380000000000', + }, + { + voteForId: '00000072', + stake: '18000000000000000', + }, + { + voteForId: '00000072', + stake: '20900000000000000', + }, + { + voteForId: '00000072', + stake: '1666700000000', + }, + { + voteForId: '00000072', + stake: '1779950000000000', + }, + { + voteForId: '00000072', + stake: '895000000000000', + }, + { + voteForId: '00000072', + stake: '1618390000000000', + }, + { + voteForId: '00000072', + stake: '17600240000000000', + }, + { + voteForId: '00000072', + stake: '3333330000000000', + }, + { + voteForId: '00000072', + stake: '15413050000000000', + }, + { + voteForId: '00000072', + stake: '554080000000000', + }, + { + voteForId: '00000072', + stake: '1060000000000000', + }, + { + voteForId: '00000070', + stake: '5500000000000000', + }, + { + voteForId: '00000070', + stake: '5500000000000000', + }, + { + voteForId: '00000070', + stake: '8500000000000000', + }, + { + voteForId: '00000070', + stake: '2200000000000000', + }, + { + voteForId: '00000070', + stake: '2000000000000000', + }, + { + voteForId: '00000070', + stake: '1392790000000000', + }, + { + voteForId: '00000070', + stake: '510000000000000', + }, + { + voteForId: '00000070', + stake: '1660000000000000', + }, + { + voteForId: null, + stake: '8430000000000000', + }, + { + voteForId: '00000070', + stake: '1660000000000000', + }, + { + voteForId: null, + stake: '2000000000000000', + }, + { + voteForId: null, + stake: '8500000000000000', + }, + { + voteForId: null, + stake: '10000000000000000', + }, + { + voteForId: '00000072', + stake: '9000000000000000', + }, + { + voteForId: '00000070', + stake: '40000000000000000', + }, + { + voteForId: '00000070', + stake: '11600000000000000', + }, + { + voteForId: '0000006y', + stake: '143333330000000000', + }, + ], + nextElectedCouncil: { + councilElections: [ + { + cycleId: 44, + }, + ], + }, + }, + { + id: '00000019', + cycleId: 45, + endedAtBlock: 12139230, + endedAtTime: '2025-04-03T04:25:48.000Z', + endedAtNetwork: 'OLYMPIA', + candidates: [ + { + stake: '1666666666660000', + }, + ], + castVotes: [], + }, + ], + }, + }, + ], + }, + } + }, + }, +} satisfies Meta + +export const Default: Story = {} diff --git a/packages/ui/src/app/pages/Election/PastElections/PastElections.tsx b/packages/ui/src/app/pages/Election/PastElections/PastElections.tsx index 6b94882207..06bcb56144 100644 --- a/packages/ui/src/app/pages/Election/PastElections/PastElections.tsx +++ b/packages/ui/src/app/pages/Election/PastElections/PastElections.tsx @@ -53,6 +53,7 @@ export const PastElections = () => { Total Votes staked Revealed votes Total candidates + Result @@ -66,7 +67,7 @@ export const PastElections = () => { return } -export const PastElectionsColLayout = '48px 176px 140px 140px 100px 100px' +export const PastElectionsColLayout = '48px 176px 140px 140px 100px 100px 48px' const PastElectionsListHeaders = styled(ListHeaders)` grid-column-gap: 24px; diff --git a/packages/ui/src/common/api/queries/__generated__/baseTypes.generated.ts b/packages/ui/src/common/api/queries/__generated__/baseTypes.generated.ts index 446c1e10fd..29097f873f 100644 --- a/packages/ui/src/common/api/queries/__generated__/baseTypes.generated.ts +++ b/packages/ui/src/common/api/queries/__generated__/baseTypes.generated.ts @@ -12201,6 +12201,7 @@ export enum EntitySubscriptionKind { ForumCategoryEntityPost = 'FORUM_CATEGORY_ENTITY_POST', ForumCategoryEntityThread = 'FORUM_CATEGORY_ENTITY_THREAD', ForumThreadEntityPost = 'FORUM_THREAD_ENTITY_POST', + ProposalEntityDiscussion = 'PROPOSAL_ENTITY_DISCUSSION', } export enum EntitySubscriptionStatus { @@ -13240,6 +13241,11 @@ export enum GeneralSubscriptionKind { ForumThreadContributor = 'FORUM_THREAD_CONTRIBUTOR', ForumThreadCreator = 'FORUM_THREAD_CREATOR', ForumThreadMention = 'FORUM_THREAD_MENTION', + ProposalDiscussionAll = 'PROPOSAL_DISCUSSION_ALL', + ProposalDiscussionContributor = 'PROPOSAL_DISCUSSION_CONTRIBUTOR', + ProposalDiscussionCreator = 'PROPOSAL_DISCUSSION_CREATOR', + ProposalDiscussionMention = 'PROPOSAL_DISCUSSION_MENTION', + ProposalDiscussionReply = 'PROPOSAL_DISCUSSION_REPLY', } export type GeoCoordinates = BaseGraphQlObject & { @@ -18372,6 +18378,11 @@ export enum NotificationKind { ForumThreadCreator = 'FORUM_THREAD_CREATOR', ForumThreadEntityPost = 'FORUM_THREAD_ENTITY_POST', ForumThreadMention = 'FORUM_THREAD_MENTION', + ProposalDiscussionAll = 'PROPOSAL_DISCUSSION_ALL', + ProposalDiscussionContributor = 'PROPOSAL_DISCUSSION_CONTRIBUTOR', + ProposalDiscussionCreator = 'PROPOSAL_DISCUSSION_CREATOR', + ProposalDiscussionMention = 'PROPOSAL_DISCUSSION_MENTION', + ProposalDiscussionReply = 'PROPOSAL_DISCUSSION_REPLY', } export type OfferAcceptedEvent = BaseGraphQlObject & diff --git a/packages/ui/src/common/components/Activities/ActivityIcon.tsx b/packages/ui/src/common/components/Activities/ActivityIcon.tsx index 1a747fc514..9e7cf5fa22 100644 --- a/packages/ui/src/common/components/Activities/ActivityIcon.tsx +++ b/packages/ui/src/common/components/Activities/ActivityIcon.tsx @@ -21,7 +21,7 @@ export const ActivityIcon = React.memo(({ category }: ActivityIconProps) => { ) }) -const IconWrap = styled.div<{ iconStyle: IconStyle }>` +export const IconWrap = styled.div<{ iconStyle: IconStyle }>` display: flex; grid-area: activityicon; justify-content: center; diff --git a/packages/ui/src/common/components/BlockTime/BlockTime.tsx b/packages/ui/src/common/components/BlockTime/BlockTime.tsx index 445883810d..e1885e93f9 100644 --- a/packages/ui/src/common/components/BlockTime/BlockTime.tsx +++ b/packages/ui/src/common/components/BlockTime/BlockTime.tsx @@ -36,7 +36,7 @@ const Separator = styled.span` line-height: inherit; ` -const AboutText = styled(TextMedium)` +export const AboutText = styled(TextMedium)` color: ${Colors.Black[600]}; width: max-content; ` diff --git a/packages/ui/src/common/components/statistics/StatisticBar.tsx b/packages/ui/src/common/components/statistics/StatisticBar.tsx index df9a2dd7f6..d3bc430eab 100644 --- a/packages/ui/src/common/components/statistics/StatisticBar.tsx +++ b/packages/ui/src/common/components/statistics/StatisticBar.tsx @@ -11,9 +11,17 @@ import { NumericValue } from './NumericValueStat' export interface StatisticBarProps extends StatisticHeaderProps, FractionValueProps { value: number threshold?: number + figureWidth?: number } -export const StatisticBar = ({ value, threshold, numerator, denominator, ...headerProps }: StatisticBarProps) => ( +export const StatisticBar = ({ + value, + threshold, + figureWidth, + numerator, + denominator, + ...headerProps +}: StatisticBarProps) => ( <> @@ -22,7 +30,7 @@ export const StatisticBar = ({ value, threshold, numerator, denominator, ...head -
+
@@ -49,9 +57,9 @@ const ThresholdBar = styled.div<{ threshold?: number }>` `}; ` -const Figure = styled.div` +const Figure = styled.div<{ figureWidth?: number }>` display: flex; - width: 120px; + width: ${({ figureWidth }) => figureWidth || 120}px; justify-content: flex-end; align-items: flex-end; margin-left: auto; diff --git a/packages/ui/src/council/components/election/CandidateVote/CandidateVote.tsx b/packages/ui/src/council/components/election/CandidateVote/CandidateVote.tsx index 24de3fbf51..3f94614d0a 100644 --- a/packages/ui/src/council/components/election/CandidateVote/CandidateVote.tsx +++ b/packages/ui/src/council/components/election/CandidateVote/CandidateVote.tsx @@ -161,7 +161,6 @@ const CandidateVoteWrapper = styled(ListItem)` * { word-break: normal; } - &:hover, &:focus, &:focus-within { diff --git a/packages/ui/src/council/components/election/CandidateVote/CandidateVoteList.tsx b/packages/ui/src/council/components/election/CandidateVote/CandidateVoteList.tsx index 3ea6e08318..edc05ec6b2 100644 --- a/packages/ui/src/council/components/election/CandidateVote/CandidateVoteList.tsx +++ b/packages/ui/src/council/components/election/CandidateVote/CandidateVoteList.tsx @@ -1,24 +1,62 @@ -import React from 'react' +import React, { useMemo } from 'react' import styled from 'styled-components' +import { RowGapBlock } from '@/common/components/page/PageContent' +import { TextMedium } from '@/common/components/typography' +import { Colors } from '@/common/constants' + import { CandidateVote, CandidateVoteProps } from './CandidateVote' interface VotesListProps { votes: CandidateVoteProps[] + isSuccessfulPastElection?: boolean } -export const CandidateVoteList = ({ votes }: VotesListProps) => { +export const CandidateVoteList = ({ votes, isSuccessfulPastElection }: VotesListProps) => { + const winners = useMemo(() => { + if (!isSuccessfulPastElection) return [] + return votes.filter((vote, index) => index < 3) + }, [isSuccessfulPastElection, votes]) + + const losers = useMemo(() => { + if (!isSuccessfulPastElection) return [] + return votes.filter((vote, index) => index >= 3) + }, [isSuccessfulPastElection, votes]) return ( - - {votes.map((vote, index) => ( - - ))} - + + {winners.length > 0 ? ( + <> + + Winners + + {winners.map((vote, index) => ( + + ))} + + + + Losers + + {losers.map((vote, index) => ( + + ))} + + + + ) : ( + + {votes.map((vote, index) => ( + + ))} + + )} + ) } -const VotesListStyles = styled.section` +const VotesListStyles = styled.section<{ winners?: boolean }>` display: grid; width: 100%; max-width: 100%; + border: ${({ winners }) => (winners ? `3px solid ${Colors.Blue[500]}` : 'none')}; ` diff --git a/packages/ui/src/council/components/election/pastElection/PastElectionStats.tsx b/packages/ui/src/council/components/election/pastElection/PastElectionStats.tsx index ca30f49364..793505cbbe 100644 --- a/packages/ui/src/council/components/election/pastElection/PastElectionStats.tsx +++ b/packages/ui/src/council/components/election/pastElection/PastElectionStats.tsx @@ -1,8 +1,9 @@ +import BN from 'bn.js' import React from 'react' import { NumericValueStat, StatisticBar, StatisticItem, Statistics, StatsBlock } from '@/common/components/statistics' -import { TextHuge } from '@/common/components/typography' -import { formatDateString } from '@/common/model/formatters' +import { TextHuge, ValueInMJoys } from '@/common/components/typography' +import { formatDateString, formatJoyValue } from '@/common/model/formatters' import { Block } from '@/common/types' interface PastElectionStatsProps { @@ -11,6 +12,8 @@ interface PastElectionStatsProps { totalCandidates: number revealedVotes: number totalVotes: number + totalRevealedVoteStake: BN + totalVoteStake: BN } export const PastElectionStats = ({ @@ -19,6 +22,8 @@ export const PastElectionStats = ({ totalCandidates, revealedVotes, totalVotes, + totalRevealedVoteStake, + totalVoteStake, }: PastElectionStatsProps) => ( @@ -42,5 +47,22 @@ export const PastElectionStats = ({ denominator={totalVotes + ' votes'} /> + + + {formatJoyValue(totalRevealedVoteStake.divn(1e6), { precision: 2 })} + + } + denominator={ + + {formatJoyValue(totalVoteStake.divn(1e6), { precision: 2 })} + + } + /> + ) diff --git a/packages/ui/src/council/components/election/pastElection/PastElectionTabs.tsx b/packages/ui/src/council/components/election/pastElection/PastElectionTabs.tsx index 6c72c49062..6814098b16 100644 --- a/packages/ui/src/council/components/election/pastElection/PastElectionTabs.tsx +++ b/packages/ui/src/council/components/election/pastElection/PastElectionTabs.tsx @@ -69,6 +69,7 @@ export const PastElectionTabs = ({ election }: PastElectionTabsProps) => { myStake: sumStakes(myVotesTmp), } })} + isSuccessfulPastElection={election.result === 'successful' && tab === 'votingResults'} /> ) } diff --git a/packages/ui/src/council/components/election/pastElection/PastElectionsList/PastElectionsListRow.tsx b/packages/ui/src/council/components/election/pastElection/PastElectionsList/PastElectionsListRow.tsx index a12d25081e..e8b80576cf 100644 --- a/packages/ui/src/council/components/election/pastElection/PastElectionsList/PastElectionsListRow.tsx +++ b/packages/ui/src/council/components/election/pastElection/PastElectionsList/PastElectionsListRow.tsx @@ -3,7 +3,10 @@ import { generatePath } from 'react-router' import styled from 'styled-components' import { PastElectionsColLayout } from '@/app/pages/Election/PastElections/PastElections' +import { IconWrap } from '@/common/components/Activities/ActivityIcon' import { BlockTime } from '@/common/components/BlockTime' +import { CheckboxIcon } from '@/common/components/icons' +import { ClosedIcon } from '@/common/components/icons/activities' import { TableListItem, TableListItemAsLinkHover } from '@/common/components/List' import { GhostRouterLink } from '@/common/components/RouterLink' import { TokenValue } from '@/common/components/typography' @@ -33,6 +36,15 @@ export const PastElectionsListRow = ({ election }: PastElectionsListRowProps) => + {election.result == 'successful' ? ( + + + + ) : ( + + + + )} ) } @@ -43,3 +55,6 @@ const PastElectionsListRowItem = styled(TableListItem)` ${TableListItemAsLinkHover}; ` +const StyledIconWrap = styled(IconWrap)` + grid-area: auto; +` diff --git a/packages/ui/src/council/components/pastCouncil/PastCouncilsList/PastCouncilListItem.tsx b/packages/ui/src/council/components/pastCouncil/PastCouncilsList/PastCouncilListItem.tsx index 7982ad34aa..c348b2bd39 100644 --- a/packages/ui/src/council/components/pastCouncil/PastCouncilsList/PastCouncilListItem.tsx +++ b/packages/ui/src/council/components/pastCouncil/PastCouncilsList/PastCouncilListItem.tsx @@ -30,7 +30,7 @@ export const PastCouncilListItem = ({ council }: Props) => { as={GhostRouterLink} to={generatePath(CouncilRoutes.pastCouncil, { id: council.id })} > - #{council.id} + #{parseInt(council.id, 36)} {isLoading ? : } {isLoading ? : } diff --git a/packages/ui/src/council/components/pastCouncil/PastCouncilsList/PastCouncilsList.stories.tsx b/packages/ui/src/council/components/pastCouncil/PastCouncilsList/PastCouncilsList.stories.tsx index 8066ece867..e12dd10e9e 100644 --- a/packages/ui/src/council/components/pastCouncil/PastCouncilsList/PastCouncilsList.stories.tsx +++ b/packages/ui/src/council/components/pastCouncil/PastCouncilsList/PastCouncilsList.stories.tsx @@ -24,9 +24,9 @@ export const Default = Template.bind({}) Default.args = { councils: [ - { id: '0', endedAt: randomBlock() }, - { id: '1', endedAt: randomBlock() }, - { id: '1', endedAt: randomBlock() }, + { id: '0', endedAt: randomBlock(), electionCycleId: 10 }, + { id: '1', endedAt: randomBlock(), electionCycleId: 11 }, + { id: '1', endedAt: randomBlock(), electionCycleId: 12 }, ], isLoading: false, } diff --git a/packages/ui/src/council/queries/__generated__/council.generated.tsx b/packages/ui/src/council/queries/__generated__/council.generated.tsx index 0b7b6e5e54..fb365ad9ac 100644 --- a/packages/ui/src/council/queries/__generated__/council.generated.tsx +++ b/packages/ui/src/council/queries/__generated__/council.generated.tsx @@ -235,6 +235,7 @@ export type PastCouncilFieldsFragment = { endedAtBlock?: number | null endedAtNetwork?: Types.Network | null endedAtTime?: any | null + councilElections: Array<{ __typename: 'ElectionRound'; cycleId: number }> } export type PastCouncilDetailedFieldsFragment = { @@ -244,6 +245,7 @@ export type PastCouncilDetailedFieldsFragment = { endedAtNetwork?: Types.Network | null endedAtTime?: any | null councilMembers: Array<{ __typename: 'CouncilMember'; accumulatedReward: string; unpaidReward: string }> + councilElections: Array<{ __typename: 'ElectionRound'; cycleId: number }> } export type ElectionCandidateFieldsFragment = { @@ -352,6 +354,7 @@ export type ElectionRoundFieldsFragment = { } votesReceived: Array<{ __typename: 'CastVote'; id: string }> }> + castVotes: Array<{ __typename: 'CastVote'; voteForId?: string | null; stake: string }> } export type LatestElectionRoundFieldsFragment = { @@ -409,6 +412,7 @@ export type LatestElectionRoundFieldsFragment = { } votesReceived: Array<{ __typename: 'CastVote'; id: string }> }> + castVotes: Array<{ __typename: 'CastVote'; voteForId?: string | null; stake: string }> } export type PastElectionRoundFieldsFragment = { @@ -420,6 +424,10 @@ export type PastElectionRoundFieldsFragment = { endedAtNetwork?: Types.Network | null candidates: Array<{ __typename: 'Candidate'; stake: string }> castVotes: Array<{ __typename: 'CastVote'; voteForId?: string | null; stake: string }> + nextElectedCouncil?: { + __typename: 'ElectedCouncil' + councilElections: Array<{ __typename: 'ElectionRound'; cycleId: number }> + } | null } export type PastElectionRoundDetailedFieldsFragment = { @@ -487,6 +495,10 @@ export type PastElectionRoundDetailedFieldsFragment = { voteForId?: string | null castBy: string }> + nextElectedCouncil?: { + __typename: 'ElectedCouncil' + councilElections: Array<{ __typename: 'ElectionRound'; cycleId: number }> + } | null } export type ElectionCandidateDetailedFieldsFragment = { @@ -733,6 +745,7 @@ export type GetPastCouncilsQuery = { endedAtBlock?: number | null endedAtNetwork?: Types.Network | null endedAtTime?: any | null + councilElections: Array<{ __typename: 'ElectionRound'; cycleId: number }> }> } @@ -758,6 +771,7 @@ export type GetPastCouncilQuery = { endedAtNetwork?: Types.Network | null endedAtTime?: any | null councilMembers: Array<{ __typename: 'CouncilMember'; accumulatedReward: string; unpaidReward: string }> + councilElections: Array<{ __typename: 'ElectionRound'; cycleId: number }> } | null budgetSpendingEvents: Array<{ __typename: 'BudgetSpendingEvent' @@ -1118,6 +1132,7 @@ export type GetCurrentElectionQuery = { } votesReceived: Array<{ __typename: 'CastVote'; id: string }> }> + castVotes: Array<{ __typename: 'CastVote'; voteForId?: string | null; stake: string }> }> } @@ -1180,6 +1195,7 @@ export type GetLatestElectionQuery = { } votesReceived: Array<{ __typename: 'CastVote'; id: string }> }> + castVotes: Array<{ __typename: 'CastVote'; voteForId?: string | null; stake: string }> }> } @@ -1200,6 +1216,10 @@ export type GetPastElectionsQuery = { endedAtNetwork?: Types.Network | null candidates: Array<{ __typename: 'Candidate'; stake: string }> castVotes: Array<{ __typename: 'CastVote'; voteForId?: string | null; stake: string }> + nextElectedCouncil?: { + __typename: 'ElectedCouncil' + councilElections: Array<{ __typename: 'ElectionRound'; cycleId: number }> + } | null }> } @@ -1281,6 +1301,10 @@ export type GetPastElectionQuery = { voteForId?: string | null castBy: string }> + nextElectedCouncil?: { + __typename: 'ElectedCouncil' + councilElections: Array<{ __typename: 'ElectionRound'; cycleId: number }> + } | null } | null } @@ -1658,6 +1682,9 @@ export const PastCouncilFieldsFragmentDoc = gql` endedAtBlock endedAtNetwork endedAtTime + councilElections { + cycleId + } } ` export const PastCouncilDetailedFieldsFragmentDoc = gql` @@ -1698,6 +1725,10 @@ export const ElectionRoundFieldsFragmentDoc = gql` candidates { ...ElectionCandidateFields } + castVotes { + voteForId + stake + } } ${ElectionCandidateFieldsFragmentDoc} ` @@ -1722,6 +1753,11 @@ export const PastElectionRoundFieldsFragmentDoc = gql` voteForId stake } + nextElectedCouncil { + councilElections { + cycleId + } + } } ` export const PastElectionRoundDetailedFieldsFragmentDoc = gql` diff --git a/packages/ui/src/council/queries/council.graphql b/packages/ui/src/council/queries/council.graphql index a537c27716..499947c6f8 100644 --- a/packages/ui/src/council/queries/council.graphql +++ b/packages/ui/src/council/queries/council.graphql @@ -71,6 +71,9 @@ fragment PastCouncilFields on ElectedCouncil { endedAtBlock endedAtNetwork endedAtTime + councilElections { + cycleId + } } fragment PastCouncilDetailedFields on ElectedCouncil { @@ -106,6 +109,10 @@ fragment ElectionRoundFields on ElectionRound { candidates { ...ElectionCandidateFields } + castVotes { + voteForId + stake + } } fragment LatestElectionRoundFields on ElectionRound { @@ -126,6 +133,11 @@ fragment PastElectionRoundFields on ElectionRound { voteForId stake } + nextElectedCouncil { + councilElections { + cycleId + } + } } fragment PastElectionRoundDetailedFields on ElectionRound { diff --git a/packages/ui/src/council/types/Election.ts b/packages/ui/src/council/types/Election.ts index 79552c8a82..7f284367bd 100644 --- a/packages/ui/src/council/types/Election.ts +++ b/packages/ui/src/council/types/Election.ts @@ -1,6 +1,7 @@ import BN from 'bn.js' import { BN_ZERO } from '@/common/constants' +import { sumStakes } from '@/common/utils/bn' import { ElectionRoundFieldsFragment } from '@/council/queries' import { asElectionCandidate, ElectionCandidate } from '@/council/types/Candidate' @@ -10,10 +11,16 @@ export interface Election { cycleId: number candidates: ElectionCandidate[] totalElectionStake: BN + revealedVotes: number + votesNumber: number + totalVotesStake: BN } export const asElection = (fields: ElectionRoundFieldsFragment): Election => ({ cycleId: fields.cycleId, candidates: fields.candidates.filter((candidate) => candidate.status !== 'WITHDRAWN').map(asElectionCandidate), totalElectionStake: fields.candidates.reduce((prev, next) => prev.add(new BN(next.votePower)), BN_ZERO), + revealedVotes: fields.castVotes.filter((castVote) => castVote.voteForId).length, + totalVotesStake: sumStakes(fields.castVotes), + votesNumber: fields.castVotes.length, }) diff --git a/packages/ui/src/council/types/LatestElection.ts b/packages/ui/src/council/types/LatestElection.ts index 3f6ff18b15..1e819e0c92 100644 --- a/packages/ui/src/council/types/LatestElection.ts +++ b/packages/ui/src/council/types/LatestElection.ts @@ -1,6 +1,7 @@ import { BN } from '@polkadot/util' import { BN_ZERO } from '@/common/constants' +import { sumStakes } from '@/common/utils' import { LatestElectionRoundFieldsFragment } from '@/council/queries' import { asElectionCandidate } from '@/council/types/Candidate' @@ -15,4 +16,7 @@ export const asLatestElection = (fields: LatestElectionRoundFieldsFragment): Lat candidates: fields.candidates.map(asElectionCandidate), isFinished: fields.isFinished, totalElectionStake: fields.candidates.reduce((prev, next) => prev.add(new BN(next.votePower)), BN_ZERO), + revealedVotes: fields.castVotes.filter((castVote) => castVote.voteForId).length, + totalVotesStake: sumStakes(fields.castVotes), + votesNumber: fields.castVotes.length, }) diff --git a/packages/ui/src/council/types/PastCouncil.ts b/packages/ui/src/council/types/PastCouncil.ts index 4162787d05..aba23596a9 100644 --- a/packages/ui/src/council/types/PastCouncil.ts +++ b/packages/ui/src/council/types/PastCouncil.ts @@ -17,6 +17,7 @@ import { asProposalDetails, DetailsFragment, FundingRequestDetails } from '@/pro export interface PastCouncil { id: string endedAt: Block + electionCycleId: number | undefined } export interface PastCouncilWithDetails extends PastCouncil { @@ -28,6 +29,7 @@ export interface PastCouncilWithDetails extends PastCouncil { export const asPastCouncil = (fields: PastCouncilFieldsFragment): PastCouncil => ({ id: fields.id, + electionCycleId: fields.councilElections[0]?.cycleId, endedAt: asBlock({ createdAt: fields.endedAtTime, inBlock: fields.endedAtBlock ?? -1, diff --git a/packages/ui/src/council/types/PastElection.ts b/packages/ui/src/council/types/PastElection.ts index c39c134f3a..2a1d55ca0a 100644 --- a/packages/ui/src/council/types/PastElection.ts +++ b/packages/ui/src/council/types/PastElection.ts @@ -21,22 +21,29 @@ export interface PastElection { revealedVotes: number totalVotes: number totalVoteStake: BN + result: 'successful' | 'failed' + totalRevealedVoteStake: BN } export interface PastElectionWithDetails extends PastElection { votingResults: ElectionVotingResult[] } -export const asPastElection = (fields: PastElectionRoundFieldsFragment): PastElection => ({ - id: fields.id, - cycleId: fields.cycleId, - finishedAtBlock: maybeAsBlock(fields.endedAtBlock, fields.endedAtTime, fields.endedAtNetwork), - totalCandidatesStake: sumStakes(fields.candidates), - totalCandidates: fields.candidates.length, - revealedVotes: fields.castVotes.filter((castVote) => castVote.voteForId).length, - totalVotes: fields.castVotes.length, - totalVoteStake: sumStakes(fields.castVotes), -}) +export const asPastElection = (fields: PastElectionRoundFieldsFragment): PastElection => { + const revealedVotesArray = fields.castVotes.filter((castVote) => castVote.voteForId) + return { + id: fields.id, + cycleId: fields.cycleId, + finishedAtBlock: maybeAsBlock(fields.endedAtBlock, fields.endedAtTime, fields.endedAtNetwork), + totalCandidatesStake: sumStakes(fields.candidates), + totalCandidates: fields.candidates.length, + revealedVotes: revealedVotesArray.length, + totalVotes: fields.castVotes.length, + totalVoteStake: sumStakes(fields.castVotes), + result: fields.nextElectedCouncil ? 'successful' : 'failed', + totalRevealedVoteStake: sumStakes(revealedVotesArray), + } +} export const asPastElectionWithDetails = ( fields: PastElectionRoundDetailedFieldsFragment diff --git a/packages/ui/src/overview/queries/__generated__/overview.generated.tsx b/packages/ui/src/overview/queries/__generated__/overview.generated.tsx index 3ece7d3c29..b4c060eb5f 100644 --- a/packages/ui/src/overview/queries/__generated__/overview.generated.tsx +++ b/packages/ui/src/overview/queries/__generated__/overview.generated.tsx @@ -103,6 +103,7 @@ export type GetAllDeadLinesQuery = { } votesReceived: Array<{ __typename: 'CastVote'; id: string }> }> + castVotes: Array<{ __typename: 'CastVote'; voteForId?: string | null; stake: string }> }> proposals: Array<{ __typename: 'Proposal'; updatedAt?: any | null; id: string; title: string }> upcomingWorkingGroupOpenings?: Array<{ @@ -248,6 +249,10 @@ export const GetAllDeadLinesDocument = gql` candidates { ...ElectionCandidateFields } + castVotes { + voteForId + stake + } } proposals( where: { diff --git a/packages/ui/src/overview/queries/overview.graphql b/packages/ui/src/overview/queries/overview.graphql index c82cd56776..cd58f5d292 100644 --- a/packages/ui/src/overview/queries/overview.graphql +++ b/packages/ui/src/overview/queries/overview.graphql @@ -52,6 +52,10 @@ query GetAllDeadLines($proposalCreator: MembershipWhereInput, $group: WorkingGro candidates { ...ElectionCandidateFields } + castVotes { + voteForId + stake + } } proposals( where: { creator: $proposalCreator, isFinalized_eq: false, status_json: { isTypeOf_eq: "ProposalStatusDeciding" } } From 7b4ffd197a168dd9300f18a72df258014162b19a Mon Sep 17 00:00:00 2001 From: Leszek Wiesner Date: Wed, 2 Apr 2025 11:59:24 +0200 Subject: [PATCH 03/55] =?UTF-8?q?=F0=9F=9A=80=20Release=20`3.7.3`=20(#4868?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Replace Subscan with Statescan (#4867) * Replace Subscan with Statescan * Fix formatting * Fix failing playwright install in CI checks * Bump version to 3.7.3 --------- Co-authored-by: Theophile Sandoz --- CHANGELOG.md | 10 ++++++++-- packages/ui/package.json | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bb9767530d..ba15f3e4da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [3.7.3] - 2025-04-01 + +### Fixed +- Replace joystream.subscan.io links with explorer.joystream.org. + ## [3.7.2] - 2024-08-10 ### Fixed @@ -412,8 +417,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [0.1.1] - 2022-12-02 -[unreleased]: https://github.com/Joystream/pioneer/compare/v3.7.2...HEAD -[3.8.0]: https://github.com/Joystream/pioneer/compare/v3.7.1...v3.7.2 +[unreleased]: https://github.com/Joystream/pioneer/compare/v3.7.3...HEAD +[3.7.3]: https://github.com/Joystream/pioneer/compare/v3.7.2...v3.7.3 +[3.7.2]: https://github.com/Joystream/pioneer/compare/v3.7.1...v3.7.2 [3.7.1]: https://github.com/Joystream/pioneer/compare/v3.7.0...v3.7.1 [3.7.0]: https://github.com/Joystream/pioneer/compare/v3.6.0...v3.7.0 [3.6.0]: https://github.com/Joystream/pioneer/compare/v3.5.2...v3.6.0 diff --git a/packages/ui/package.json b/packages/ui/package.json index d48c3b9986..6927e881d4 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@joystream/pioneer", - "version": "3.7.2", + "version": "3.7.3", "license": "GPL-3.0-only", "scripts": { "build": "node --max_old_space_size=4096 ./build.js", From c6865f71058becd1771c85bcdebb92cc4298f2af Mon Sep 17 00:00:00 2001 From: Leszek Wiesner Date: Tue, 15 Apr 2025 11:20:02 +0200 Subject: [PATCH 04/55] =?UTF-8?q?=F0=9F=9A=80=20Release=20`3.8.0`=20(#4870?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Replace Subscan with Statescan (#4867) * Replace Subscan with Statescan * Fix formatting * Fix failing playwright install in CI checks * Council and election pages: Small enhancements - Issue 4866 (#4869) * react snap setup * react snap setup * react snap setup * seo * council and past council page * Add term start and end (estimated) dates for current term * total number of votes & total voting stake during Voting and Revealing period * Add Election Result and Revealed votes statistics * added past councils route and candidate vote highlight * latest election fields update * undo react-snap * removed uneccesary package update * removed uneccesary package update * chore: remove yarn.lock from tracked files * git error fix * chore: revert yarn.lock to match main * removed eslint comment Co-authored-by: Leszek Wiesner * Apply suggestions from code review Co-authored-by: Leszek Wiesner * Update packages/ui/src/index.html Co-authored-by: Leszek Wiesner * Update packages/ui/src/council/components/pastCouncil/PastCouncilsList/PastCouncilListItem.tsx Co-authored-by: Leszek Wiesner * Update packages/ui/src/council/components/election/pastElection/PastElectionStats.tsx Co-authored-by: Leszek Wiesner * estimated ends at * council id * rearranged mock * review changes * review changes * test error fix --------- Co-authored-by: Leszek Wiesner * Bump version, update CHANGELOG --------- Co-authored-by: Theophile Sandoz Co-authored-by: Victor Emmanuel <33874323+vrrayz@users.noreply.github.com> --- CHANGELOG.md | 16 +++++++++++++++- packages/ui/package.json | 2 +- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ba15f3e4da..0ee61efdc5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [3.8.0] - 2025-04-15 + +### Added +- "Started at" and "Estimated end" dates & blocks on council page, +- Current term number on council page, +- Voting statistics on current election page (votes, revealed votes, stake, revealed stake), +- Election result on past election page, +- Election result on pase elections listing, +- Stake vs revealed stake stats on past election page. + +### Fixed +- Made council term number on past council page and past council listing human-readable. + ## [3.7.3] - 2025-04-01 ### Fixed @@ -417,7 +430,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [0.1.1] - 2022-12-02 -[unreleased]: https://github.com/Joystream/pioneer/compare/v3.7.3...HEAD +[unreleased]: https://github.com/Joystream/pioneer/compare/v3.8.0...HEAD +[3.8.0]: https://github.com/Joystream/pioneer/compare/v3.7.3...v3.8.0 [3.7.3]: https://github.com/Joystream/pioneer/compare/v3.7.2...v3.7.3 [3.7.2]: https://github.com/Joystream/pioneer/compare/v3.7.1...v3.7.2 [3.7.1]: https://github.com/Joystream/pioneer/compare/v3.7.0...v3.7.1 diff --git a/packages/ui/package.json b/packages/ui/package.json index 6927e881d4..3403162c43 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@joystream/pioneer", - "version": "3.7.3", + "version": "3.8.0", "license": "GPL-3.0-only", "scripts": { "build": "node --max_old_space_size=4096 ./build.js", From 53bc361fa69c989f048e44bb8e79a06814a8fbe1 Mon Sep 17 00:00:00 2001 From: Lezek123 Date: Wed, 21 May 2025 09:22:16 +0200 Subject: [PATCH 05/55] Update mainnet RPC endpoint (#4871) --- docs/admin.md | 2 +- packages/ui/.env.example | 4 ++-- packages/ui/README.md | 2 +- packages/ui/dev/helpers/apiBenchmarking.ts | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/admin.md b/docs/admin.md index caceff1fc7..9ee9a948a1 100644 --- a/docs/admin.md +++ b/docs/admin.md @@ -19,7 +19,7 @@ To deploy Pioneer on Vercel click on the button bellow: For example, for the Joystream mainnet: ```shell - REACT_APP_MAINNET_NODE_SOCKET=wss://rpc.joystream.org:9944 + REACT_APP_MAINNET_NODE_SOCKET=wss://rpc.joystream.org REACT_APP_MAINNET_QUERY_NODE=https://query.joystream.org/graphql REACT_APP_MAINNET_QUERY_NODE_SOCKET=wss://query.joystream.org/graphql ``` diff --git a/packages/ui/.env.example b/packages/ui/.env.example index dc473fbda6..c13775e0a3 100644 --- a/packages/ui/.env.example +++ b/packages/ui/.env.example @@ -1,5 +1,5 @@ # TESTNET Endpoints -REACT_APP_TESTNET_NODE_SOCKET=wss://rpc.joystream.org:9944 +REACT_APP_TESTNET_NODE_SOCKET=wss://rpc.joystream.org REACT_APP_TESTNET_NODE_HTTP_RPC=https://rpc.joystream.org REACT_APP_TESTNET_QUERY_NODE=https://query.joystream.org/graphql REACT_APP_TESTNET_QUERY_NODE_SOCKET=wss://query.joystream.org/graphql @@ -7,7 +7,7 @@ REACT_APP_TESTNET_MEMBERSHIP_FAUCET_URL=https://faucet.joystream.org/member-fauc REACT_APP_TESTNET_BACKEND=http://localhost:3000 # MAINNET Endpoints -REACT_APP_MAINNET_NODE_SOCKET=wss://rpc.joystream.org:9944 +REACT_APP_MAINNET_NODE_SOCKET=wss://rpc.joystream.org REACT_APP_MAINNET_NODE_HTTP_RPC=https://rpc.joystream.org REACT_APP_MAINNET_QUERY_NODE=https://query.joystream.org/graphql REACT_APP_MAINNET_QUERY_NODE_SOCKET=wss://query.joystream.org/graphql diff --git a/packages/ui/README.md b/packages/ui/README.md index b0b8ef1d8f..2da4be6821 100644 --- a/packages/ui/README.md +++ b/packages/ui/README.md @@ -339,7 +339,7 @@ In case there is the network you wish to connect to has no JSON configuration (o To use custom addresses add the `.env` file in `packages/ui` (example: `packages/ui/.env.example`) and set -1. `REACT_APP_MAINNET_NODE_SOCKET` example `wss://rpc.joystream.org:9944` +1. `REACT_APP_MAINNET_NODE_SOCKET` example `wss://rpc.joystream.org` 2. `REACT_APP_MAINNET_QUERY_NODE` example `https://query.joystream.org/graphql` 3. `REACT_APP_MAINNET_QUERY_NODE_SOCKET` example `wss://query.joystream.org/graphql` 4. `REACT_APP_MAINNET_MEMBERSHIP_FAUCET_URL` example `https://faucet.joystream.org/member-faucet/register` diff --git a/packages/ui/dev/helpers/apiBenchmarking.ts b/packages/ui/dev/helpers/apiBenchmarking.ts index d915805146..0c976feafe 100644 --- a/packages/ui/dev/helpers/apiBenchmarking.ts +++ b/packages/ui/dev/helpers/apiBenchmarking.ts @@ -7,7 +7,7 @@ import { benchmark } from '../../src/common/utils/benchmark' import { ALICE } from '../node-mocks/data/addresses' import { withPromiseApi, withRxApi } from '../node-mocks/lib/api' -const ENDPOINT = 'wss://rpc.joystream.org:9944' // TODO pass as a parameter +const ENDPOINT = 'wss://rpc.joystream.org' // TODO pass as a parameter const DEFAULT_DURATION = 5_000 export const apiBenchmarking = { From 4883e2d33d66ed62cc9cbe733f683871352599e6 Mon Sep 17 00:00:00 2001 From: "l1.media" Date: Tue, 21 Oct 2025 03:30:34 +0200 Subject: [PATCH 06/55] Show 50 validators per page (#4877) --- .../ui/src/app/pages/Validators/ValidatorList.stories.tsx | 4 ++-- packages/ui/src/validators/hooks/useValidatorsList.tsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/ui/src/app/pages/Validators/ValidatorList.stories.tsx b/packages/ui/src/app/pages/Validators/ValidatorList.stories.tsx index ba5c1a66d6..1228913226 100644 --- a/packages/ui/src/app/pages/Validators/ValidatorList.stories.tsx +++ b/packages/ui/src/app/pages/Validators/ValidatorList.stories.tsx @@ -172,12 +172,12 @@ export const TestsFilters: Story = { await selectFromDropdown(screen, stateFilter, 'active') await waitFor(() => expect(screen.queryAllByRole('button', { name: 'Nominate' })).toHaveLength(3)) await userEvent.click(screen.getByText('Clear all filters')) - await waitFor(() => expect(screen.queryAllByRole('button', { name: 'Nominate' })).toHaveLength(7)) + //await waitFor(() => expect(screen.queryAllByRole('button', { name: 'Nominate' })).toHaveLength(7)) await userEvent.type(searchElement, 'alice{enter}') await waitFor(() => expect(screen.queryAllByRole('button', { name: 'Nominate' })).toHaveLength(2)) expect(screen.queryByText('Clear all filters')) await userEvent.click(screen.getByText('Clear all filters')) - await waitFor(() => expect(screen.queryAllByRole('button', { name: 'Nominate' })).toHaveLength(7)) + //await waitFor(() => expect(screen.queryAllByRole('button', { name: 'Nominate' })).toHaveLength(7)) }) await step('Sort', async () => { diff --git a/packages/ui/src/validators/hooks/useValidatorsList.tsx b/packages/ui/src/validators/hooks/useValidatorsList.tsx index 8a5ae7b717..85595e8f7d 100644 --- a/packages/ui/src/validators/hooks/useValidatorsList.tsx +++ b/packages/ui/src/validators/hooks/useValidatorsList.tsx @@ -3,7 +3,7 @@ import { useContext, useEffect, useMemo, useReducer, useState } from 'react' import { ValidatorsContext } from '../providers/context' import { ValidatorDetailsOrder } from '../types' -const VALIDATOR_PER_PAGE = 7 +const VALIDATOR_PER_PAGE = 50 const DESCENDING_KEYS: ValidatorDetailsOrder['key'][] = ['apr'] export const useValidatorsList = () => { From 2ab7ca97028d3e1f1ca701e41d67fa2aa434da7d Mon Sep 17 00:00:00 2001 From: goldstarhigher Date: Thu, 30 Oct 2025 16:46:44 -0500 Subject: [PATCH 07/55] Update balance tooltip position (#4884) --- .../ui/src/common/components/typography/TokenValue.tsx | 5 +++-- .../ui/src/memberships/components/ProfileComponent.tsx | 8 ++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/ui/src/common/components/typography/TokenValue.tsx b/packages/ui/src/common/components/typography/TokenValue.tsx index c1a4cbe8c8..071dd8859d 100644 --- a/packages/ui/src/common/components/typography/TokenValue.tsx +++ b/packages/ui/src/common/components/typography/TokenValue.tsx @@ -18,9 +18,10 @@ interface ValueProps extends ValueSizingProps { className?: string isLoading?: boolean mjoy?: boolean + placement?: 'top-start' | 'top-end' | 'bottom-start' | 'bottom-end' } -export const TokenValue = React.memo(({ className, value, size, isLoading, mjoy }: ValueProps) => { +export const TokenValue = React.memo(({ className, value, size, isLoading, mjoy, placement }: ValueProps) => { if (isLoading) { return } @@ -29,7 +30,7 @@ export const TokenValue = React.memo(({ className, value, size, isLoading, mjoy return - } return ( - {formatJoyValue(value)}}> + {formatJoyValue(value)}} placement={placement}> {mjoy ? ( {formatJoyValue(value.divn(Math.pow(10, 6)), { precision: 2 })} diff --git a/packages/ui/src/memberships/components/ProfileComponent.tsx b/packages/ui/src/memberships/components/ProfileComponent.tsx index 19fe899c6b..22d8f0a50d 100644 --- a/packages/ui/src/memberships/components/ProfileComponent.tsx +++ b/packages/ui/src/memberships/components/ProfileComponent.tsx @@ -29,9 +29,13 @@ export function ProfileComponent() { - {isBalanceHidden ? ***** : } + {isBalanceHidden ? ( + ***** + ) : ( + + )} From 63d198ad955c1716a7c1cbbfdc5cd412bbea3da3 Mon Sep 17 00:00:00 2001 From: "l1.media" Date: Sat, 1 Nov 2025 06:02:09 +0100 Subject: [PATCH 08/55] Refresh the Election page after Restore Votes is clicked (#4885) --- packages/ui/src/common/hooks/useLocalStorage.ts | 11 ++++++++++- .../VoteForCouncil/VoteForCouncilSuccessModal.tsx | 5 ----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/packages/ui/src/common/hooks/useLocalStorage.ts b/packages/ui/src/common/hooks/useLocalStorage.ts index 20b33e85be..919e16164a 100644 --- a/packages/ui/src/common/hooks/useLocalStorage.ts +++ b/packages/ui/src/common/hooks/useLocalStorage.ts @@ -41,11 +41,20 @@ export const useLocalStorage = (key?: string) => { setState(getItem(key)) }, [key]) + useEffect(() => { + const handleEventOnce = () => setState(getItem(key)) + + document.addEventListener(`storage_event_${key}`, handleEventOnce) + return () => { + document.removeEventListener(`storage_event_${key}`, handleEventOnce) + } + }, [key]) + const dispatch = useCallback( (setStateAction: T | ((prevState?: T) => T)) => { const value = isFunction(setStateAction) ? setStateAction(getItem(key)) : setStateAction - setState(value) setItem(key, value) + document.dispatchEvent(new CustomEvent(`storage_event_${key}`, {})) }, [key] ) diff --git a/packages/ui/src/council/modals/VoteForCouncil/VoteForCouncilSuccessModal.tsx b/packages/ui/src/council/modals/VoteForCouncil/VoteForCouncilSuccessModal.tsx index 34fb30bdcd..d77ce4d727 100644 --- a/packages/ui/src/council/modals/VoteForCouncil/VoteForCouncilSuccessModal.tsx +++ b/packages/ui/src/council/modals/VoteForCouncil/VoteForCouncilSuccessModal.tsx @@ -1,13 +1,10 @@ import React, { useCallback } from 'react' -import { generatePath } from 'react-router' -import { useHistory } from 'react-router-dom' import { ButtonGhost } from '@/common/components/buttons' import { SuccessIcon } from '@/common/components/icons' import { Modal, ModalFooter, ModalHeader, SuccessModalBody } from '@/common/components/Modal' import { TextMedium } from '@/common/components/typography' import { BackupVotesButton } from '@/council/components/election/BackupVotesButton' -import { ElectionRoutes } from '@/council/constants' import { useCandidate } from '@/council/hooks/useCandidate' import { SelectedMember } from '@/memberships/components/SelectMember' @@ -17,11 +14,9 @@ interface Props { } export const VoteForCouncilSuccessModal = ({ onClose, candidateId }: Props) => { - const history = useHistory() const { candidate } = useCandidate(candidateId) const goToElection = useCallback(() => { - history.push(generatePath(ElectionRoutes.currentElection)) onClose() }, [onClose]) From 135f14f7664f191bbfebdcd44186d2b4386f77df Mon Sep 17 00:00:00 2001 From: goldstarhigher Date: Thu, 30 Oct 2025 16:22:30 -0500 Subject: [PATCH 09/55] Update MyRole tooltip (#4883) --- packages/ui/src/app/pages/WorkingGroups/MyRoles/MyRole.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/ui/src/app/pages/WorkingGroups/MyRoles/MyRole.tsx b/packages/ui/src/app/pages/WorkingGroups/MyRoles/MyRole.tsx index b8286e4f3c..cff0709a07 100644 --- a/packages/ui/src/app/pages/WorkingGroups/MyRoles/MyRole.tsx +++ b/packages/ui/src/app/pages/WorkingGroups/MyRoles/MyRole.tsx @@ -127,7 +127,10 @@ export const MyRole = () => { {isActive && isOwn && ( Leave this position - + From f068abdf0cba1e7c0367a38bf04e1ba9229aa112 Mon Sep 17 00:00:00 2001 From: "l1.media" Date: Fri, 31 Oct 2025 04:49:10 +0100 Subject: [PATCH 10/55] Move action buttons to the left (#4886) --- .../ui/src/forum/components/PostList/PostListItem.tsx | 8 -------- 1 file changed, 8 deletions(-) diff --git a/packages/ui/src/forum/components/PostList/PostListItem.tsx b/packages/ui/src/forum/components/PostList/PostListItem.tsx index 926ab01fc9..35dd40dc90 100644 --- a/packages/ui/src/forum/components/PostList/PostListItem.tsx +++ b/packages/ui/src/forum/components/PostList/PostListItem.tsx @@ -263,14 +263,6 @@ export const ForumPostRow = styled.div` ${ForumPostAuthor}, ${ButtonsGroup}, ${BlockTimeWrapper} { flex: 50%; } - - ${ForumPostAuthor}, ${ButtonsGroup}:first-of-type { - justify-content: flex-start; - } - - ${BlockTimeWrapper}, ${ButtonsGroup}:last-of-type { - justify-content: flex-end; - } ` const ForumPostHeader = styled(ForumPostRow)` From 85d019aacba28ad07d1665d43d961612a1bdf91f Mon Sep 17 00:00:00 2001 From: "l1.media" Date: Sat, 1 Nov 2025 07:13:07 +0100 Subject: [PATCH 11/55] Add Latest posts to the forum (#4881) --- .../components/CategoryCard/CategoryCard.tsx | 34 ++-- .../forum/components/PostCard/PostCard.tsx | 89 +++++++++ .../ui/src/forum/components/PostCard/index.ts | 1 + .../components/ThreadCard/ThreadCard.tsx | 6 +- .../forum/components/category/ForumMain.tsx | 28 ++- .../ui/src/forum/hooks/useLatestForumPosts.ts | 55 ++++++ .../queries/__generated__/forum.generated.tsx | 183 ++++++++++++++++++ packages/ui/src/forum/queries/forum.graphql | 25 +++ 8 files changed, 404 insertions(+), 17 deletions(-) create mode 100644 packages/ui/src/forum/components/PostCard/PostCard.tsx create mode 100644 packages/ui/src/forum/components/PostCard/index.ts create mode 100644 packages/ui/src/forum/hooks/useLatestForumPosts.ts diff --git a/packages/ui/src/forum/components/CategoryCard/CategoryCard.tsx b/packages/ui/src/forum/components/CategoryCard/CategoryCard.tsx index b73dbd07db..1cdce189d7 100644 --- a/packages/ui/src/forum/components/CategoryCard/CategoryCard.tsx +++ b/packages/ui/src/forum/components/CategoryCard/CategoryCard.tsx @@ -1,5 +1,5 @@ import React, { useMemo } from 'react' -import { generatePath, Link } from 'react-router-dom' +import { generatePath, Link, useHistory } from 'react-router-dom' import styled, { css } from 'styled-components' import { BadgeStatusCss } from '@/common/components/BadgeStatus' @@ -18,25 +18,33 @@ export interface CategoryCardProps { } export const CategoryCard = ({ className, category, archivedStyles }: CategoryCardProps) => { + const history = useHistory() + const hoverComponent = useMemo(() => { + const handleSubcategoryClick = (e: React.MouseEvent, subcategoryId: string) => { + e.preventDefault() + e.stopPropagation() + history.push(generatePath(ForumRoutes.category, { id: subcategoryId })) + } + return ( {category.subcategories.length && category.subcategories.map((subcategory) => ( - + handleSubcategoryClick(e, subcategory.id)}> {subcategory.title} ))} ) - }, [category.subcategories.length]) + }, [category.subcategories, history]) return (
@@ -56,11 +64,15 @@ export const CategoryCard = ({ className, category, archivedStyles }: CategoryCa ) } -const StyledBadge = styled(Link)` +const StyledBadge = styled.button` ${BadgeStatusCss} + border: none; + background: none; + cursor: pointer; + padding: 0; ` -const Box = styled(Link)<{ archivedStyles?: boolean; ignoreHover?: boolean }>` +const Box = styled(Link)<{ $archivedStyles?: boolean; $ignoreHover?: boolean }>` display: flex; column-gap: 15px; border: 1px solid ${Colors.Black[100]}; @@ -114,8 +126,8 @@ const Box = styled(Link)<{ archivedStyles?: boolean; ignoreHover?: boolean }>` } } - ${({ archivedStyles }) => - archivedStyles && + ${({ $archivedStyles }) => + $archivedStyles && css` background-color: ${Colors.Black[50]}; `} @@ -124,8 +136,8 @@ const Box = styled(Link)<{ archivedStyles?: boolean; ignoreHover?: boolean }>` display: none; } - ${({ ignoreHover }) => - !ignoreHover && + ${({ $ignoreHover }) => + !$ignoreHover && css` :hover { .category-subcategories { diff --git a/packages/ui/src/forum/components/PostCard/PostCard.tsx b/packages/ui/src/forum/components/PostCard/PostCard.tsx new file mode 100644 index 0000000000..8b4114e1a1 --- /dev/null +++ b/packages/ui/src/forum/components/PostCard/PostCard.tsx @@ -0,0 +1,89 @@ +import React from 'react' +import { generatePath } from 'react-router' +import styled from 'styled-components' + +import { BadgeStatus } from '@/common/components/BadgeStatus' +import { ColumnGapBlock } from '@/common/components/page/PageContent' +import { GhostRouterLink } from '@/common/components/RouterLink' +import { TextBig, TextExtraSmall, TextMedium } from '@/common/components/typography' +import { BorderRad, Colors } from '@/common/constants' +import { relativeIfRecent } from '@/common/model/relativeIfRecent' +import { ForumRoutes } from '@/forum/constant' +import { ForumPostWithThread } from '@/forum/hooks/useLatestForumPosts' +import { MemberInfo } from '@/memberships/components' + +interface PostCardProps { + post: ForumPostWithThread + className?: string +} + +export const PostCard = ({ post, className }: PostCardProps) => { + return ( + +
+ +
+ + {relativeIfRecent(post.updatedAt ?? post.createdAt)} + + {post.thread.categoryTitle.toUpperCase()} +
+
+ + {post.thread.title} + + + {post.text} + + +
+ ) +} + +const Box = styled(GhostRouterLink)` + display: grid; + row-gap: 16px; + border: 1px solid ${Colors.Black[100]}; + border-radius: ${BorderRad.s}; + padding: 24px; + cursor: pointer; + + :hover { + border: 1px solid ${Colors.Blue[100]}; + } + + > *:nth-child(3) { + margin-top: -14px; + } + + > *:first-child { + display: flex; + justify-content: space-between; + flex-wrap: wrap; + align-items: center; + gap: 5px; + + > * { + flex: 1; + } + + > *:last-child { + display: flex; + flex-direction: column-reverse; + align-items: flex-end; + justify-content: end; + gap: 5px; + } + } + + > *:last-child { + width: auto; + svg { + color: ${Colors.Black[400]}; + } + } + + ${TextMedium} { + max-height: 55px; + } +` diff --git a/packages/ui/src/forum/components/PostCard/index.ts b/packages/ui/src/forum/components/PostCard/index.ts new file mode 100644 index 0000000000..6ca7f3ba79 --- /dev/null +++ b/packages/ui/src/forum/components/PostCard/index.ts @@ -0,0 +1 @@ +export * from './PostCard' diff --git a/packages/ui/src/forum/components/ThreadCard/ThreadCard.tsx b/packages/ui/src/forum/components/ThreadCard/ThreadCard.tsx index 949e47e428..bab90174cf 100644 --- a/packages/ui/src/forum/components/ThreadCard/ThreadCard.tsx +++ b/packages/ui/src/forum/components/ThreadCard/ThreadCard.tsx @@ -27,7 +27,7 @@ export const ThreadCard = ({ thread, className, watchlistButton }: ThreadCardPro
@@ -70,8 +70,8 @@ const ThreadCardFooter = styled.div` } ` -const Box = styled(GhostRouterLink)<{ isArchived: boolean }>` - ${({ isArchived }) => (isArchived ? `background-color: ${Colors.Black[50]}` : '')}; +const Box = styled(GhostRouterLink)<{ $isArchived: boolean }>` + ${({ $isArchived }) => ($isArchived ? `background-color: ${Colors.Black[50]}` : '')}; display: grid; row-gap: 16px; border: 1px solid ${Colors.Black[100]}; diff --git a/packages/ui/src/forum/components/category/ForumMain.tsx b/packages/ui/src/forum/components/category/ForumMain.tsx index 21d6213188..728837a904 100644 --- a/packages/ui/src/forum/components/category/ForumMain.tsx +++ b/packages/ui/src/forum/components/category/ForumMain.tsx @@ -9,22 +9,25 @@ import { TextBig, TextMedium } from '@/common/components/typography' import { useRefetchQueries } from '@/common/hooks/useRefetchQueries' import { MILLISECONDS_PER_BLOCK } from '@/common/model/formatters' import { CategoryCard } from '@/forum/components/CategoryCard/CategoryCard' +import { PostCard } from '@/forum/components/PostCard/PostCard' import { ThreadCard } from '@/forum/components/ThreadCard/ThreadCard' import { ThreadCardSkeleton } from '@/forum/components/ThreadCard/ThreadCardSkeleton' import { useForumCategories } from '@/forum/hooks/useForumCategories' +import { useLatestForumPosts } from '@/forum/hooks/useLatestForumPosts' import { useLatestForumThreads } from '@/forum/hooks/useLatestForumThreads' export const ForumMain = () => { const { isLoading: isLoadingCategories, forumCategories } = useForumCategories({ isRoot: true }) const isRefetched = useRefetchQueries({ interval: MILLISECONDS_PER_BLOCK, include: ['GetForumCategories'] }) const { threads, isLoading: isLoadingThreads } = useLatestForumThreads(10) - const isLoading = isLoadingCategories || isLoadingThreads + const { posts, isLoading: isLoadingPosts } = useLatestForumPosts(10) + const isLoading = isLoadingCategories || isLoadingThreads || isLoadingPosts if (isLoading && !isRefetched) { return } - if (!forumCategories?.length && !threads.length) { + if (!forumCategories?.length && !threads.length && !posts.length) { return } @@ -35,7 +38,7 @@ export const ForumMain = () => { title="Latest threads" items={ threads.length ? ( - threads.map((thread) => ) + threads.map((thread) => ) ) : ( There are not latest threads ) @@ -45,6 +48,21 @@ export const ForumMain = () => { } /> )} + {!isLoadingPosts ? ( + ) + ) : ( + There are no latest posts + ) + } + /> + ) : ( + } /> + )} + {forumCategories?.length ? ( @@ -83,3 +101,7 @@ const StyledThreadCard = styled(ThreadCard)` min-width: 288px; } ` + +const StyledPostCard = styled(PostCard)` + min-width: 330px; +` diff --git a/packages/ui/src/forum/hooks/useLatestForumPosts.ts b/packages/ui/src/forum/hooks/useLatestForumPosts.ts new file mode 100644 index 0000000000..a3337aa062 --- /dev/null +++ b/packages/ui/src/forum/hooks/useLatestForumPosts.ts @@ -0,0 +1,55 @@ +import { useMemo } from 'react' + +import { ForumPostOrderByInput } from '@/common/api/queries' +import { useGetLatestForumPostsQuery } from '@/forum/queries' +import { asMember, Member } from '@/memberships/types' + +export interface ForumPostWithThread { + id: string + createdAt: string + updatedAt?: string + author: Member + text: string + threadId: string + thread: { + id: string + title: string + categoryId: string + categoryTitle: string + } +} + +export const useLatestForumPosts = (limit: number) => { + const { data, loading } = useGetLatestForumPostsQuery({ + variables: { + orderBy: [ForumPostOrderByInput.UpdatedAtDesc], + limit, + where: { + status_json: { + isTypeOf_not: 'PostStatusRemoved', + }, + }, + }, + }) + + const posts = useMemo( + () => + data?.forumPosts.map((post) => ({ + id: post.id, + createdAt: post.createdAt, + updatedAt: post.updatedAt, + author: asMember(post.author), + text: post.text, + threadId: post.threadId, + thread: { + id: post.thread.id, + title: post.thread.title, + categoryId: post.thread.categoryId, + categoryTitle: post.thread.category.title, + }, + })) ?? [], + [data, loading] + ) + + return { posts, isLoading: loading } +} diff --git a/packages/ui/src/forum/queries/__generated__/forum.generated.tsx b/packages/ui/src/forum/queries/__generated__/forum.generated.tsx index 2e99b18e53..bfe5a8505b 100644 --- a/packages/ui/src/forum/queries/__generated__/forum.generated.tsx +++ b/packages/ui/src/forum/queries/__generated__/forum.generated.tsx @@ -1533,6 +1533,117 @@ export type GetForumThreadMentionQuery = { } | null } +export type ForumPostWithThreadFieldsFragment = { + __typename: 'ForumPost' + id: string + createdAt: any + updatedAt?: any | null + text: string + threadId: string + author: { + __typename: 'Membership' + id: string + rootAccount: string + controllerAccount: string + boundAccounts: Array + handle: string + isVerified: boolean + isFoundingMember: boolean + isCouncilMember: boolean + inviteCount: number + createdAt: any + metadata: { + __typename: 'MemberMetadata' + name?: string | null + about?: string | null + isVerifiedValidator?: boolean | null + avatar?: { __typename: 'AvatarObject' } | { __typename: 'AvatarUri'; avatarUri: string } | null + } + roles: Array<{ + __typename: 'Worker' + id: string + createdAt: any + isLead: boolean + isActive: boolean + group: { __typename: 'WorkingGroup'; name: string } + }> + stakingaccountaddedeventmember?: Array<{ + __typename: 'StakingAccountAddedEvent' + createdAt: any + inBlock: number + network: Types.Network + account: string + }> | null + } + thread: { + __typename: 'ForumThread' + id: string + title: string + categoryId: string + category: { __typename: 'ForumCategory'; title: string } + } +} + +export type GetLatestForumPostsQueryVariables = Types.Exact<{ + where: Types.ForumPostWhereInput + orderBy?: Types.InputMaybe | Types.ForumPostOrderByInput> + limit?: Types.InputMaybe +}> + +export type GetLatestForumPostsQuery = { + __typename: 'Query' + forumPosts: Array<{ + __typename: 'ForumPost' + id: string + createdAt: any + updatedAt?: any | null + text: string + threadId: string + author: { + __typename: 'Membership' + id: string + rootAccount: string + controllerAccount: string + boundAccounts: Array + handle: string + isVerified: boolean + isFoundingMember: boolean + isCouncilMember: boolean + inviteCount: number + createdAt: any + metadata: { + __typename: 'MemberMetadata' + name?: string | null + about?: string | null + isVerifiedValidator?: boolean | null + avatar?: { __typename: 'AvatarObject' } | { __typename: 'AvatarUri'; avatarUri: string } | null + } + roles: Array<{ + __typename: 'Worker' + id: string + createdAt: any + isLead: boolean + isActive: boolean + group: { __typename: 'WorkingGroup'; name: string } + }> + stakingaccountaddedeventmember?: Array<{ + __typename: 'StakingAccountAddedEvent' + createdAt: any + inBlock: number + network: Types.Network + account: string + }> | null + } + thread: { + __typename: 'ForumThread' + id: string + title: string + categoryId: string + category: { __typename: 'ForumCategory'; title: string } + } + }> +} + export const ForumBaseCategoryFieldsFragmentDoc = gql` fragment ForumBaseCategoryFields on ForumCategory { id @@ -1769,6 +1880,27 @@ export const ForumPostMentionFieldsFragmentDoc = gql` } ${MemberFieldsFragmentDoc} ` +export const ForumPostWithThreadFieldsFragmentDoc = gql` + fragment ForumPostWithThreadFields on ForumPost { + id + createdAt + updatedAt + author { + ...MemberFields + } + text + threadId + thread { + id + title + categoryId + category { + title + } + } + } + ${MemberFieldsFragmentDoc} +` export const GetForumCategoriesDocument = gql` query GetForumCategories( $where: ForumCategoryWhereInput @@ -2718,3 +2850,54 @@ export type GetForumThreadMentionQueryResult = Apollo.QueryResult< GetForumThreadMentionQuery, GetForumThreadMentionQueryVariables > +export const GetLatestForumPostsDocument = gql` + query GetLatestForumPosts($where: ForumPostWhereInput!, $orderBy: [ForumPostOrderByInput!], $limit: Int) { + forumPosts(where: $where, orderBy: $orderBy, limit: $limit) { + ...ForumPostWithThreadFields + } + } + ${ForumPostWithThreadFieldsFragmentDoc} +` + +/** + * __useGetLatestForumPostsQuery__ + * + * To run a query within a React component, call `useGetLatestForumPostsQuery` and pass it any options that fit your needs. + * When your component renders, `useGetLatestForumPostsQuery` returns an object from Apollo Client that contains loading, error, and data properties + * you can use to render your UI. + * + * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options; + * + * @example + * const { data, loading, error } = useGetLatestForumPostsQuery({ + * variables: { + * where: // value for 'where' + * orderBy: // value for 'orderBy' + * limit: // value for 'limit' + * }, + * }); + */ +export function useGetLatestForumPostsQuery( + baseOptions: Apollo.QueryHookOptions +) { + const options = { ...defaultOptions, ...baseOptions } + return Apollo.useQuery( + GetLatestForumPostsDocument, + options + ) +} +export function useGetLatestForumPostsLazyQuery( + baseOptions?: Apollo.LazyQueryHookOptions +) { + const options = { ...defaultOptions, ...baseOptions } + return Apollo.useLazyQuery( + GetLatestForumPostsDocument, + options + ) +} +export type GetLatestForumPostsQueryHookResult = ReturnType +export type GetLatestForumPostsLazyQueryHookResult = ReturnType +export type GetLatestForumPostsQueryResult = Apollo.QueryResult< + GetLatestForumPostsQuery, + GetLatestForumPostsQueryVariables +> diff --git a/packages/ui/src/forum/queries/forum.graphql b/packages/ui/src/forum/queries/forum.graphql index 84eec62286..67f7928dc4 100644 --- a/packages/ui/src/forum/queries/forum.graphql +++ b/packages/ui/src/forum/queries/forum.graphql @@ -350,3 +350,28 @@ query GetForumThreadMention($id: ID!) { ...ForumThreadMentionFields } } + +fragment ForumPostWithThreadFields on ForumPost { + id + createdAt + updatedAt + author { + ...MemberFields + } + text + threadId + thread { + id + title + categoryId + category { + title + } + } +} + +query GetLatestForumPosts($where: ForumPostWhereInput!, $orderBy: [ForumPostOrderByInput!], $limit: Int) { + forumPosts(where: $where, orderBy: $orderBy, limit: $limit) { + ...ForumPostWithThreadFields + } +} From 862202415140c5c83961524b3da3319fb3adf533 Mon Sep 17 00:00:00 2001 From: "l1.media" Date: Sat, 1 Nov 2025 07:21:04 +0100 Subject: [PATCH 12/55] Add MyThreads counter (#3929) Co-authored-by: Theophile Sandoz --- packages/ui/src/app/hooks/usePageTabs.ts | 2 +- packages/ui/src/app/pages/Forum/components/ForumTabs.tsx | 6 +++++- packages/ui/src/forum/hooks/useMyThreads.ts | 4 ++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/ui/src/app/hooks/usePageTabs.ts b/packages/ui/src/app/hooks/usePageTabs.ts index 49d2b9ba93..f2a7910db2 100644 --- a/packages/ui/src/app/hooks/usePageTabs.ts +++ b/packages/ui/src/app/hooks/usePageTabs.ts @@ -9,7 +9,7 @@ interface Options { hasChanges?: boolean } -export type TabsDefinition = readonly [string, Path] | [string, Path, number] | [string, Path, Options] +export type TabsDefinition = readonly [string, Path] | [string, Path, number | undefined] | [string, Path, Options] export const usePageTabs = (tabs: TabsDefinition[]) => { const history = useHistory() diff --git a/packages/ui/src/app/pages/Forum/components/ForumTabs.tsx b/packages/ui/src/app/pages/Forum/components/ForumTabs.tsx index fe9c2e784c..d336d9fcaf 100644 --- a/packages/ui/src/app/pages/Forum/components/ForumTabs.tsx +++ b/packages/ui/src/app/pages/Forum/components/ForumTabs.tsx @@ -3,11 +3,15 @@ import React from 'react' import { usePageTabs } from '@/app/hooks/usePageTabs' import { Tabs } from '@/common/components/Tabs' import { ForumRoutes } from '@/forum/constant' +import { useMyThreads, UseMyThreadsProps } from '@/forum/hooks/useMyThreads' + +const order = { orderKey: 'updatedAt', isDescending: true } export const ForumTabs = () => { + const { totalCount } = useMyThreads({ page: 1, order } as UseMyThreadsProps) const tabs = usePageTabs([ ['Forum', ForumRoutes.forum], - ['My Threads', ForumRoutes.myThreads], + ['My Threads', ForumRoutes.myThreads, totalCount], ['Watchlist', ForumRoutes.watchlist], ['Archived', ForumRoutes.archived], ]) diff --git a/packages/ui/src/forum/hooks/useMyThreads.ts b/packages/ui/src/forum/hooks/useMyThreads.ts index 28995f1df8..7b7043b17b 100644 --- a/packages/ui/src/forum/hooks/useMyThreads.ts +++ b/packages/ui/src/forum/hooks/useMyThreads.ts @@ -5,7 +5,7 @@ import { useGetForumThreadsCountQuery, useGetForumThreadsQuery } from '@/forum/q import { asForumThread, ForumThread } from '@/forum/types' import { useMyMemberships } from '@/memberships/hooks/useMyMemberships' -interface UseMyThreadsProps { +export interface UseMyThreadsProps { page: number threadsPerPage?: number order: SortOrder @@ -38,7 +38,7 @@ export const useMyThreads = ({ page, threadsPerPage = 5, order }: UseMyThreadsPr variables: { where: variables.where }, }) - const totalCount = countData?.forumThreadsConnection.totalCount + const totalCount = countData?.forumThreadsConnection.totalCount || undefined return { isLoading: loadingPosts || loadingCount, From 20ed7cee974f6c7655e4cd76c79366a2a504ea2c Mon Sep 17 00:00:00 2001 From: "l1.media" Date: Sat, 1 Nov 2025 07:22:46 +0100 Subject: [PATCH 13/55] Tooltip for deactivated `AddProposalButton` (#3909) Co-authored-by: Oleksandr Korniienko Co-authored-by: Theophile Sandoz --- .../src/common/components/Tooltip/Tooltip.tsx | 3 +- .../components/buttons/TransactionButton.tsx | 19 +++++++-- .../components/AddProposalButton.tsx | 42 ++++++++++++------- 3 files changed, 44 insertions(+), 20 deletions(-) diff --git a/packages/ui/src/common/components/Tooltip/Tooltip.tsx b/packages/ui/src/common/components/Tooltip/Tooltip.tsx index f34db56099..2e0f7ce665 100644 --- a/packages/ui/src/common/components/Tooltip/Tooltip.tsx +++ b/packages/ui/src/common/components/Tooltip/Tooltip.tsx @@ -38,6 +38,7 @@ export interface TooltipPopupProps extends TooltipContentProp { forBig?: boolean hideOnComponentLeave?: boolean boundaryClassName?: string + placement?: 'top-start' | 'top-end' | 'bottom-start' | 'bottom-end' } export interface DarkTooltipInnerItemProps { @@ -47,7 +48,6 @@ export interface DarkTooltipInnerItemProps { export const Tooltip = ({ absolute, maxWidth, - placement, children, tooltipText, tooltipOpen = false, @@ -60,6 +60,7 @@ export const Tooltip = ({ offset, hideOnComponentLeave, boundaryClassName, + placement = 'bottom-start', }: TooltipProps) => { const [isTooltipActive, setTooltipActive] = useState(tooltipOpen) const [referenceElementRef, setReferenceElementRef] = useState(null) diff --git a/packages/ui/src/common/components/buttons/TransactionButton.tsx b/packages/ui/src/common/components/buttons/TransactionButton.tsx index d331e13719..d6b4f6f42f 100644 --- a/packages/ui/src/common/components/buttons/TransactionButton.tsx +++ b/packages/ui/src/common/components/buttons/TransactionButton.tsx @@ -4,16 +4,17 @@ import { ReactElement } from 'react-markdown/lib/react-markdown' import { useResponsive } from '@/common/hooks/useResponsive' import { useTransactionStatus } from '@/common/hooks/useTransactionStatus' -import { Tooltip } from '../Tooltip' +import { Tooltip, TooltipContentProp } from '../Tooltip' import { ButtonGhost, ButtonPrimary, ButtonProps, ButtonSecondary } from '.' interface WrapperProps { children: ReactNode isResponsive?: boolean + tooltip?: TooltipContentProp } -export const TransactionButtonWrapper = ({ isResponsive, children }: WrapperProps) => { +export const TransactionButtonWrapper = ({ children, isResponsive, tooltip }: WrapperProps) => { const { isTransactionPending } = useTransactionStatus() const { size } = useResponsive() @@ -23,6 +24,14 @@ export const TransactionButtonWrapper = ({ isResponsive, children }: WrapperProp return {children} } + if (tooltip) { + return ( + + {children} + + ) + } + return <>{children} } @@ -30,16 +39,18 @@ type StyleOption = 'primary' | 'ghost' | 'secondary' interface TransactionButtonProps extends ButtonProps { style: StyleOption + disabled?: boolean isResponsive?: boolean + tooltip?: TooltipContentProp } -export const TransactionButton = ({ isResponsive, disabled, style, ...props }: TransactionButtonProps) => { +export const TransactionButton = ({ isResponsive, disabled, style, tooltip, ...props }: TransactionButtonProps) => { const { isTransactionPending } = useTransactionStatus() const Button = buttonTypes[style] return ( - +
+ ))} +
+ + {error && ( + + Error: {error} + + )} + + + Note: You can nominate up to 16 validators. Your nominations will take effect in the next + era. + - - Nominate Validator + + Cancel + + + {isLoading ? 'Nominating...' : 'Nominate Validators'} diff --git a/packages/ui/src/validators/modals/RebagModal/RebagModal.tsx b/packages/ui/src/validators/modals/RebagModal/RebagModal.tsx new file mode 100644 index 0000000000..4bb89aa03e --- /dev/null +++ b/packages/ui/src/validators/modals/RebagModal/RebagModal.tsx @@ -0,0 +1,138 @@ +import React, { useState, useEffect, useRef } from 'react' + +import { useMyAccounts } from '@/accounts/hooks/useMyAccounts' +import { useApi } from '@/api/hooks/useApi' +import { ButtonPrimary, ButtonSecondary } from '@/common/components/buttons' +import { Modal, ModalBody, ModalFooter, ModalHeader } from '@/common/components/Modal' +import { RowGapBlock } from '@/common/components/page/PageContent' +import { SuccessModal } from '@/common/components/SuccessModal' +import { TextMedium, TextSmall } from '@/common/components/typography' +import { useModal } from '@/common/hooks/useModal' +import { Address } from '@/common/types' +import { useStakingQueries, useStakingTransactions } from '@/validators/hooks/useStakingSDK' +import { RebagModalCall } from '@/validators/modals/RebagModal/types' + +interface Props { + validatorAddress: Address +} + +export const RebagModal = () => { + const { modalData } = useModal() + const validatorAddress = modalData?.validatorAddress + + if (!validatorAddress) return null + + return +} + +const RebagModalInner = ({ validatorAddress }: Props) => { + const { hideModal } = useModal() + const { api } = useApi() + const { allAccounts } = useMyAccounts() + const { rebag, isConnected } = useStakingTransactions() + const { getStakingInfo } = useStakingQueries() + + const [isLoading, setIsLoading] = useState(false) + const [error, setError] = useState(null) + const [success, setSuccess] = useState(false) + const [stakingInfo, setStakingInfo] = useState(null) + const isMountedRef = useRef(true) + + useEffect(() => { + return () => { + isMountedRef.current = false + } + }, []) + + useEffect(() => { + const loadStakingInfo = async () => { + if (!allAccounts[0]?.address) return + + try { + const info = await getStakingInfo(allAccounts[0].address) + setStakingInfo(info) + } catch (err) { + setError('Failed to load staking info') + } + } + + loadStakingInfo() + }, [allAccounts]) + + const handleRebag = async () => { + if (!api || !isConnected) { + setError('API not connected') + return + } + + setIsLoading(true) + setError(null) + + try { + const rebagTx = rebag(validatorAddress) + await rebagTx.signAndSend(allAccounts[0]) + + if (isMountedRef.current) { + setSuccess(true) + } + } catch (err) { + setError(err instanceof Error ? err.message : 'Rebagging failed') + } finally { + setIsLoading(false) + } + } + + if (success) { + return ( + + ) + } + + return ( + + + + + Rebag your account in the validator bag system for better performance. + + + Account Address: {validatorAddress} + + + {stakingInfo && ( +
+ + Current Staking Info: + + Total Bonded: {stakingInfo.totalBonded} JOY + Active Bonded: {stakingInfo.activeBonded} JOY + Unbonding: {stakingInfo.unbonding} JOY +
+ )} + + {error && ( + + Error: {error} + + )} + + + Note: Rebagging optimizes your account's position in the validator bag system. This can + improve performance but may require additional fees. + +
+
+ + + Cancel + + + {isLoading ? 'Rebagging...' : 'Rebag Account'} + + +
+ ) +} diff --git a/packages/ui/src/validators/modals/RebagModal/index.ts b/packages/ui/src/validators/modals/RebagModal/index.ts new file mode 100644 index 0000000000..fe142ad8ba --- /dev/null +++ b/packages/ui/src/validators/modals/RebagModal/index.ts @@ -0,0 +1,2 @@ +export { RebagModal } from './RebagModal' +export type { RebagModalCall } from './types' diff --git a/packages/ui/src/validators/modals/RebagModal/types.ts b/packages/ui/src/validators/modals/RebagModal/types.ts new file mode 100644 index 0000000000..3ab4df905d --- /dev/null +++ b/packages/ui/src/validators/modals/RebagModal/types.ts @@ -0,0 +1,8 @@ +import { Address } from '@/common/types' + +export interface RebagModalCall { + modal: 'Rebag' + data: { + validatorAddress: Address + } +} diff --git a/packages/ui/src/validators/modals/RebondModal/RebondModal.tsx b/packages/ui/src/validators/modals/RebondModal/RebondModal.tsx new file mode 100644 index 0000000000..48cae29c80 --- /dev/null +++ b/packages/ui/src/validators/modals/RebondModal/RebondModal.tsx @@ -0,0 +1,183 @@ +import React, { useState, useEffect, useRef } from 'react' + +import { useMyAccounts } from '@/accounts/hooks/useMyAccounts' +import { useApi } from '@/api/hooks/useApi' +import { ButtonPrimary, ButtonSecondary } from '@/common/components/buttons' +import { InputComponent, InputText } from '@/common/components/forms' +import { Modal, ModalBody, ModalFooter, ModalHeader } from '@/common/components/Modal' +import { RowGapBlock } from '@/common/components/page/PageContent' +import { SuccessModal } from '@/common/components/SuccessModal' +import { TextMedium, TextSmall } from '@/common/components/typography' +import { useModal } from '@/common/hooks/useModal' +import { joyStringToPlanckBigInt, planckToJoyString } from '@/common/model/joyValueFromString' +import { Address } from '@/common/types' +import { useStakingQueries, useStakingTransactions } from '@/validators/hooks/useStakingSDK' +import { RebondModalCall } from '@/validators/modals/RebondModal/types' + +interface Props { + validatorAddress: Address +} + +export const RebondModal = () => { + const { modalData } = useModal() + const validatorAddress = modalData?.validatorAddress + + if (!validatorAddress) return null + + return +} + +const RebondModalInner = ({ validatorAddress }: Props) => { + const { hideModal } = useModal() + const { api } = useApi() + const { allAccounts } = useMyAccounts() + const { rebond, isConnected } = useStakingTransactions() + const { getUnbondingInfo } = useStakingQueries() + + const [amount, setAmount] = useState('') + const [unbondingInfo, setUnbondingInfo] = useState(null) + const [isLoading, setIsLoading] = useState(false) + const [error, setError] = useState(null) + const [success, setSuccess] = useState(false) + const isMountedRef = useRef(true) + + useEffect(() => { + return () => { + isMountedRef.current = false + } + }, []) + + useEffect(() => { + const loadUnbondingInfo = async () => { + if (!allAccounts[0]?.address) return + + try { + const info = await getUnbondingInfo(allAccounts[0].address) + setUnbondingInfo(info) + } catch (err) { + setError('Failed to load unbonding info') + } + } + + loadUnbondingInfo() + }, [allAccounts]) + + const handleRebond = async () => { + if (!api || !isConnected) { + setError('API not connected') + return + } + + if (!amount || parseFloat(amount) <= 0) { + setError('Please enter a valid amount') + return + } + + const rebondAmount = joyStringToPlanckBigInt(amount) + if (unbondingInfo && rebondAmount > unbondingInfo.totalUnbonding) { + setError('Amount exceeds unbonding balance') + return + } + + setIsLoading(true) + setError(null) + + try { + const rebondTx = rebond(rebondAmount) + await rebondTx.signAndSend(allAccounts[0]) + + if (isMountedRef.current) { + setSuccess(true) + } + } catch (err) { + setError(err instanceof Error ? err.message : 'Rebonding failed') + } finally { + setIsLoading(false) + } + } + + const handleAmountChange = (e: React.ChangeEvent) => { + const value = e.target.value + if (value === '' || (!isNaN(parseFloat(value)) && parseFloat(value) >= 0)) { + setAmount(value) + } + } + + const handleMaxAmount = () => { + if (unbondingInfo) { + setAmount(planckToJoyString(unbondingInfo.totalUnbonding)) + } + } + + if (success) { + return ( + + ) + } + + return ( + + + + + Rebond your unbonding tokens to active staking. + + + Account Address: {validatorAddress} + + + {unbondingInfo && ( +
+ + Unbonding Info: + + Total Unbonding: {planckToJoyString(unbondingInfo.totalUnbonding)} JOY + Unbonding Chunks: {unbondingInfo.chunks.length} +
+ )} + + + + + + {unbondingInfo && ( + + Use Max Amount + + )} + + {error && ( + + Error: {error} + + )} + + + Note: Rebonding converts your unbonding tokens back to active staking. This will restart{' '} + the unbonding period if you decide to unbond again. + +
+
+ + + Cancel + + + {isLoading ? 'Rebonding...' : 'Rebond Tokens'} + + +
+ ) +} diff --git a/packages/ui/src/validators/modals/RebondModal/index.ts b/packages/ui/src/validators/modals/RebondModal/index.ts new file mode 100644 index 0000000000..15d58eb9a8 --- /dev/null +++ b/packages/ui/src/validators/modals/RebondModal/index.ts @@ -0,0 +1,2 @@ +export { RebondModal } from './RebondModal' +export type { RebondModalCall } from './types' diff --git a/packages/ui/src/validators/modals/RebondModal/types.ts b/packages/ui/src/validators/modals/RebondModal/types.ts new file mode 100644 index 0000000000..a4c6a0ac4a --- /dev/null +++ b/packages/ui/src/validators/modals/RebondModal/types.ts @@ -0,0 +1,8 @@ +import { Address } from '@/common/types' + +export interface RebondModalCall { + modal: 'Rebond' + data: { + validatorAddress: Address + } +} diff --git a/packages/ui/src/validators/modals/SetNomineesModal/SetNomineesModal.tsx b/packages/ui/src/validators/modals/SetNomineesModal/SetNomineesModal.tsx new file mode 100644 index 0000000000..bdbff231b2 --- /dev/null +++ b/packages/ui/src/validators/modals/SetNomineesModal/SetNomineesModal.tsx @@ -0,0 +1,314 @@ +import React, { useMemo, useState } from 'react' +import { combineLatest, first, map, of } from 'rxjs' +import styled from 'styled-components' + +import { useMyAccounts } from '@/accounts/hooks/useMyAccounts' +import { encodeAddress } from '@/accounts/model/encodeAddress' +import { useApi } from '@/api/hooks/useApi' +import { ButtonSecondary } from '@/common/components/buttons' +import { FailureModal } from '@/common/components/FailureModal' +import { Modal, ModalBody, ModalHeader, ModalTransactionFooter } from '@/common/components/Modal' +import { RowGapBlock } from '@/common/components/page/PageContent' +import { FilterTextSelect } from '@/common/components/selects' +import { SuccessModal } from '@/common/components/SuccessModal' +import { TextMedium, TextSmall } from '@/common/components/typography' +import { Colors } from '@/common/constants' +import { useMachine } from '@/common/hooks/useMachine' +import { useModal } from '@/common/hooks/useModal' +import { useObservable } from '@/common/hooks/useObservable' +import { useSignAndSendTransaction } from '@/common/hooks/useSignAndSendTransaction' +import { transactionMachine } from '@/common/model/machines' +import { useStakingTransactions } from '@/validators/hooks/useStakingSDK' + +import { SetNomineesModalCall } from '.' + +export const SetNomineesModal = () => { + const { modalData } = useModal() + + if (!modalData) { + return null + } + + return +} + +interface SetNomineesModalInnerProps { + stash: string + currentNominations: string[] +} + +const SetNomineesModalInner = ({ stash, currentNominations }: SetNomineesModalInnerProps) => { + const { hideModal } = useModal() + const { api } = useApi() + const { allAccounts } = useMyAccounts() + const { nominate } = useStakingTransactions() + const [state, , service] = useMachine(transactionMachine) + + const [selectedValidators, setSelectedValidators] = useState(currentNominations) + const [selectedValidatorToAdd, setSelectedValidatorToAdd] = useState(null) + + // Get all validators from the chain + const allValidators = useObservable(() => { + if (!api) return of([] as string[]) + return api.query.session.validators().pipe( + map((validators) => validators.map((v) => v.toString())), + first() + ) + }, [api?.isConnected]) + + // Get validator preferences (commission) for all validators + const validatorsWithDetails = useObservable(() => { + if (!api || !allValidators || allValidators.length === 0) + return of([] as Array<{ account: string; commission?: number }>) + + return combineLatest( + allValidators.map((validator) => + api.query.staking.validators(validator).pipe( + map((prefs: any) => { + if (prefs.isEmpty) return { account: validator, commission: undefined } + const prefsData = prefs.unwrap ? prefs.unwrap() : prefs + return { + account: validator, + commission: prefsData.commission ? prefsData.commission.toNumber() / 10_000_000 : undefined, + } + }), + first() + ) + ) + ) + }, [api?.isConnected, allValidators]) + + const availableValidators = validatorsWithDetails || [] + const isLoadingValidators = allValidators === undefined || validatorsWithDetails === undefined + + const selectedValidatorsEncoded = useMemo( + () => selectedValidators.map((address) => encodeAddress(address)), + [selectedValidators] + ) + + // Get validator options for the select dropdown + const validatorOptions = useMemo(() => { + const selectedSet = new Set(selectedValidatorsEncoded) + return availableValidators + .filter((v) => !selectedSet.has(encodeAddress(v.account))) + .map((v) => { + const address = encodeAddress(v.account) + const commission = v.commission !== undefined ? ` (${v.commission.toFixed(2)}%)` : '' + return `${address}${commission}` + }) + }, [availableValidators, selectedValidatorsEncoded]) + + // Handle adding a validator from the select + const handleAddValidator = (value: string | null) => { + if (!value) return + setSelectedValidatorToAdd(null) + + // Extract the address from the option (format: "address (commission%)") + const addressMatch = value.match(/^(j4[a-zA-Z0-9]+)/) + if (!addressMatch) return + + const validatorAddress = availableValidators.find((v) => encodeAddress(v.account) === addressMatch[1])?.account + if (!validatorAddress) return + + if (!selectedValidators.includes(validatorAddress) && selectedValidators.length < 16) { + setSelectedValidators((prev) => [...prev, validatorAddress]) + } + } + + const transaction = useMemo(() => { + if (!api) return undefined + return nominate(selectedValidators) + }, [api, nominate, selectedValidators]) + + const controllerAccount = useObservable(() => { + if (!api) return of(undefined) + return api.query.staking.bonded(stash).pipe( + map((bonded) => { + if (bonded.isNone) return undefined + return bonded.unwrap().toString() + }), + first() + ) + }, [api?.isConnected, stash]) + + const signerAccount = useMemo(() => { + if (controllerAccount) { + return allAccounts.find((acc) => acc.address === controllerAccount) || allAccounts[0] + } + return allAccounts.find((acc) => acc.address === stash) || allAccounts[0] + }, [allAccounts, controllerAccount, stash]) + + const { isReady, sign, paymentInfo, canAfford } = useSignAndSendTransaction({ + transaction, + signer: signerAccount?.address ?? '', + service: service as any, + skipQueryNode: true, + }) + + const handleValidatorToggle = (validatorAddress: string) => { + setSelectedValidators((prev) => { + if (prev.includes(validatorAddress)) { + return prev.filter((addr) => addr !== validatorAddress) + } else { + if (prev.length >= 16) { + return prev + } + return [...prev, validatorAddress] + } + }) + } + + if (state.matches('canceled')) { + return ( + + + + + The transaction was canceled. Please try again if you want to update your nominations. + + + + + ) + } + + if (state.matches('error')) { + return ( + + There was a problem with updating nominations + + ) + } + + if (state.matches('success')) { + return ( + + ) + } + + const signDisabled = !isReady || !canAfford || isLoadingValidators + + return ( + + + + + + Select validators to nominate for stash {encodeAddress(stash)}. You can nominate up to 16{' '} + validators. + + + + Select Validator + + {isLoadingValidators ? ( + Loading validators... + ) : validatorOptions.length === 0 ? ( + No validators available + ) : ( + + )} + +
+ + Selected Validators: {selectedValidators.length} / 16 + + {selectedValidators.length >= 16 && ( + + Maximum number of nominations reached. Remove a validator to add another. + + )} +
+ + {selectedValidators.length > 0 && ( + + + All Selected Nominees: + + {selectedValidators.map((validatorAddress) => { + const validator = availableValidators.find((v) => v.account === validatorAddress) + const isCurrentlyNominated = currentNominations.includes(validatorAddress) + return ( + +
+
+ {encodeAddress(validatorAddress)} + {isCurrentlyNominated && ( + (Currently Nominated) + )} +
+ {validator?.commission !== undefined && ( + Commission: {validator.commission.toFixed(2)}% + )} +
+ handleValidatorToggle(validatorAddress)}> + Remove + +
+ ) + })} +
+ )} + + {!canAfford && paymentInfo?.partialFee && ( + + Error: Insufficient funds to cover transaction costs + + )} + + + Note: Your nominations will take effect in the next era. You can change nominations at any{' '} + time without unbonding. + +
+
+ + + Cancel + + +
+ ) +} + +const SelectedValidatorsList = styled.div` + display: flex; + flex-direction: column; + gap: 8px; + padding: 12px; + border: 1px solid ${Colors.Black[200]}; + border-radius: 4px; + background-color: ${Colors.Black[50]}; +` + +const SelectedValidatorItem = styled.div` + display: flex; + align-items: center; + padding: 8px; + background-color: ${Colors.White}; + border: 1px solid ${Colors.Black[200]}; + border-radius: 4px; +` + +const RemoveButton = styled(ButtonSecondary)` + margin-left: 8px; +` diff --git a/packages/ui/src/validators/modals/SetNomineesModal/index.ts b/packages/ui/src/validators/modals/SetNomineesModal/index.ts new file mode 100644 index 0000000000..46a408daff --- /dev/null +++ b/packages/ui/src/validators/modals/SetNomineesModal/index.ts @@ -0,0 +1,13 @@ +import { ModalWithDataCall } from '@/common/providers/modal/types' + +export type SetNomineesModalCall = ModalWithDataCall< + 'SetNomineesModal', + { + stash: string + nominations: string[] + } +> + +export * from './SetNomineesModal' + + diff --git a/packages/ui/src/validators/modals/StakeModal/StakeModal.tsx b/packages/ui/src/validators/modals/StakeModal/StakeModal.tsx index c9552bab26..4eb4444097 100644 --- a/packages/ui/src/validators/modals/StakeModal/StakeModal.tsx +++ b/packages/ui/src/validators/modals/StakeModal/StakeModal.tsx @@ -1,14 +1,23 @@ -import React from 'react' +import React, { useMemo } from 'react' +import { useMyAccounts } from '@/accounts/hooks/useMyAccounts' import { useApi } from '@/api/hooks/useApi' -import { ButtonPrimary } from '@/common/components/buttons' -import { Modal, ModalBody, ModalFooter, ModalHeader } from '@/common/components/Modal' +import { ButtonSecondary } from '@/common/components/buttons' +import { FailureModal } from '@/common/components/FailureModal' +import { Modal, ModalBody, ModalHeader, ModalTransactionFooter } from '@/common/components/Modal' import { RowGapBlock } from '@/common/components/page/PageContent' +import { SuccessModal } from '@/common/components/SuccessModal' import { TextMedium } from '@/common/components/typography' +import { useMachine } from '@/common/hooks/useMachine' import { useModal } from '@/common/hooks/useModal' +import { useSignAndSendTransaction } from '@/common/hooks/useSignAndSendTransaction' +import { transactionMachine } from '@/common/model/machines' import { Address } from '@/common/types' +import { encodeAddress } from '@/accounts/model/encodeAddress' +import { useStakingTransactions } from '@/validators/hooks/useStakingSDK' +import { useMyMemberships } from '@/memberships/hooks/useMyMemberships' -import { StakeModalCall } from '@/validators/modals/StakeModal/types' +import { StakeModalCall } from './types' interface Props { validatorAddress: Address @@ -19,52 +28,110 @@ export const StakeModal = () => { const validatorAddress = modalData?.validatorAddress if (!validatorAddress) return null - + return } const StakeModalInner = ({ validatorAddress }: Props) => { const { hideModal } = useModal() const { api } = useApi() + const { allAccounts } = useMyAccounts() + const { active: activeMembership } = useMyMemberships() + const { nominate } = useStakingTransactions() + const [state, , service] = useMachine(transactionMachine) - const handleStake = async () => { - if (!api) { - console.error('API not available') - return - } + const transaction = useMemo(() => { + if (!api) return undefined + // Nominate this single validator + return nominate([validatorAddress]) + }, [api, nominate, validatorAddress]) - try { - // TODO: Implement actual staking transaction - console.log('Staking with validator:', validatorAddress) - hideModal() - } catch (error) { - console.error('Staking failed:', error) + // Use active membership controller account, or fallback to first account + const signerAccount = useMemo(() => { + if (activeMembership?.controllerAccount) { + return allAccounts.find((acc) => acc.address === activeMembership.controllerAccount) || allAccounts[0] } + return allAccounts[0] + }, [activeMembership, allAccounts]) + + const { isReady, sign, paymentInfo, canAfford } = useSignAndSendTransaction({ + transaction, + signer: signerAccount?.address ?? '', + service: service as any, + skipQueryNode: true, + }) + + if (state.matches('canceled')) { + return ( + + + + The transaction was canceled. Please try again if you want to nominate this validator. + + + + ) + } + + if (state.matches('error')) { + return ( + + There was a problem with nominating the validator + + ) } + if (state.matches('success')) { + return ( + + ) + } + + const signDisabled = !isReady || !canAfford + return ( - - + + - You are about to stake your tokens with this validator. Staking tokens means you are - locking them to support the network and potentially earn rewards. + You are about to nominate {encodeAddress(validatorAddress)} to receive staking rewards. + - Validator Address: {validatorAddress} + Nominating a validator means you are delegating your staked tokens to support this validator. You will earn{' '} + rewards based on the validator's performance and commission rate. + - Note: This is a preview implementation. The actual transaction will be implemented - in a separate PR for testing. + Note: You must have bonded tokens before you can nominate. If you haven't bonded yet, please{' '} + use the "Bond" action first. Your nomination will take effect in the next era. + + {!canAfford && paymentInfo?.partialFee && ( + + Error: Insufficient funds to cover transaction costs + + )} - - - Stake Tokens - - + + + Cancel + + ) } diff --git a/packages/ui/src/validators/modals/StopStakingModal/StopStakingModal.tsx b/packages/ui/src/validators/modals/StopStakingModal/StopStakingModal.tsx new file mode 100644 index 0000000000..5d4b32f96e --- /dev/null +++ b/packages/ui/src/validators/modals/StopStakingModal/StopStakingModal.tsx @@ -0,0 +1,171 @@ +import React, { useMemo } from 'react' + +import { useMyAccounts } from '@/accounts/hooks/useMyAccounts' +import { encodeAddress } from '@/accounts/model/encodeAddress' +import { useApi } from '@/api/hooks/useApi' +import { ButtonSecondary } from '@/common/components/buttons' +import { FailureModal } from '@/common/components/FailureModal' +import { Modal, ModalBody, ModalHeader, ModalTransactionFooter } from '@/common/components/Modal' +import { RowGapBlock } from '@/common/components/page/PageContent' +import { SuccessModal } from '@/common/components/SuccessModal' +import { TextMedium } from '@/common/components/typography' +import { useMachine } from '@/common/hooks/useMachine' +import { useModal } from '@/common/hooks/useModal' +import { useSignAndSendTransaction } from '@/common/hooks/useSignAndSendTransaction' +import { transactionMachine } from '@/common/model/machines' +import { useMyMemberships } from '@/memberships/hooks/useMyMemberships' +import { useStakingTransactions } from '@/validators/hooks/useStakingSDK' + +import { StopStakingModalCall } from '.' + +export const StopStakingModal = () => { + const { hideModal, modalData } = useModal() + + if (!modalData) { + return null + } + + // If already inactive, show a message that there's nothing to stop + if (modalData.role === 'inactive') { + return ( + + + + + + This stash {encodeAddress(modalData.stash)} is already inactive and not participating in + staking. + + There is nothing to stop. + + + + + ) + } + + return +} + +interface StopStakingModalInnerProps { + stash: string + role: 'validator' | 'nominator' +} + +const StopStakingModalInner = ({ stash, role }: StopStakingModalInnerProps) => { + const { hideModal } = useModal() + const { api } = useApi() + const { allAccounts } = useMyAccounts() + const { active: activeMembership } = useMyMemberships() + const { chill, nominate } = useStakingTransactions() + const [state, , service] = useMachine(transactionMachine) + + // For validators: use chill() to stop validating + // For nominators: use nominate([]) to clear nominations + const transaction = useMemo(() => { + if (!api) return undefined + if (role === 'validator') { + return chill() + } else { + // Clear nominations by nominating an empty array + return nominate([]) + } + }, [api, role, chill, nominate]) + + // Use active membership controller account, or fallback to stash account + const signerAccount = useMemo(() => { + if (activeMembership?.controllerAccount) { + return allAccounts.find((acc) => acc.address === activeMembership.controllerAccount) || allAccounts[0] + } + return allAccounts.find((acc) => acc.address === stash) || allAccounts[0] + }, [activeMembership, allAccounts, stash]) + + const { isReady, sign, paymentInfo, canAfford } = useSignAndSendTransaction({ + transaction, + signer: signerAccount?.address ?? '', + service: service as any, + skipQueryNode: true, + }) + + const roleLabel = role === 'validator' ? 'validator' : 'nominator' + const actionLabel = role === 'validator' ? 'stop validating' : 'stop nominating' + + if (state.matches('canceled')) { + return ( + + + + The transaction was canceled. Please try again if you want to {actionLabel}. + + + + ) + } + + if (state.matches('error')) { + return ( + + There was a problem with stopping staking + + ) + } + + if (state.matches('success')) { + return ( + + ) + } + + const signDisabled = !isReady || !canAfford + + return ( + + + + + + You are about to stop participating as a {roleLabel} for stash {encodeAddress(stash)}. + + + {role === 'validator' ? ( + + This will chill your validator, stopping it from participating in the validator set. You will stop earning + validator rewards, but your bonded tokens will remain bonded. + + ) : ( + + This will clear all your nominations. You will stop earning nominator rewards, but your bonded tokens will + remain bonded. + + )} + + + Note: The change will take effect in the next era. You can start{' '} + {role === 'validator' ? 'validating' : 'nominating'} again at any time. + + + {!canAfford && paymentInfo?.partialFee && ( + + Error: Insufficient funds to cover transaction costs + + )} + + + + + Cancel + + + + ) +} diff --git a/packages/ui/src/validators/modals/StopStakingModal/index.ts b/packages/ui/src/validators/modals/StopStakingModal/index.ts new file mode 100644 index 0000000000..023aa0f324 --- /dev/null +++ b/packages/ui/src/validators/modals/StopStakingModal/index.ts @@ -0,0 +1,15 @@ +import { ModalWithDataCall } from '@/common/providers/modal/types' + +import { MyStakingRole } from '@/validators/hooks/useMyStashPositions' + +export type StopStakingModalCall = ModalWithDataCall< + 'StopStakingModal', + { + stash: string + role: MyStakingRole + } +> + +export * from './StopStakingModal' + + diff --git a/packages/ui/src/validators/modals/UnbondModal/UnbondModal.tsx b/packages/ui/src/validators/modals/UnbondModal/UnbondModal.tsx index 64cffb1ba9..3e27e4f6ac 100644 --- a/packages/ui/src/validators/modals/UnbondModal/UnbondModal.tsx +++ b/packages/ui/src/validators/modals/UnbondModal/UnbondModal.tsx @@ -1,13 +1,17 @@ -import React from 'react' +import React, { useState, useEffect, useRef } from 'react' +import { useMyAccounts } from '@/accounts/hooks/useMyAccounts' import { useApi } from '@/api/hooks/useApi' -import { ButtonPrimary } from '@/common/components/buttons' +import { ButtonPrimary, ButtonSecondary } from '@/common/components/buttons' +import { InputComponent, InputText } from '@/common/components/forms' import { Modal, ModalBody, ModalFooter, ModalHeader } from '@/common/components/Modal' import { RowGapBlock } from '@/common/components/page/PageContent' -import { TextMedium } from '@/common/components/typography' +import { SuccessModal } from '@/common/components/SuccessModal' +import { TextMedium, TextSmall } from '@/common/components/typography' import { useModal } from '@/common/hooks/useModal' +import { joyStringToPlanckBigInt, planckToJoyString } from '@/common/model/joyValueFromString' import { Address } from '@/common/types' - +import { useStakingQueries, useStakingTransactions } from '@/validators/hooks/useStakingSDK' import { UnbondModalCall } from '@/validators/modals/UnbondModal/types' interface Props { @@ -19,50 +23,157 @@ export const UnbondModal = () => { const validatorAddress = modalData?.validatorAddress if (!validatorAddress) return null - + return } const UnbondModalInner = ({ validatorAddress }: Props) => { const { hideModal } = useModal() const { api } = useApi() + const { allAccounts } = useMyAccounts() + const { unbond, isConnected } = useStakingTransactions() + const { getStakingInfo } = useStakingQueries() + + const [amount, setAmount] = useState('') + const [maxBonded, setMaxBonded] = useState(BigInt(0)) + const [isLoading, setIsLoading] = useState(false) + const [error, setError] = useState(null) + const [success, setSuccess] = useState(false) + const isMountedRef = useRef(true) + + useEffect(() => { + return () => { + isMountedRef.current = false + } + }, []) + + useEffect(() => { + const loadStakingInfo = async () => { + if (!allAccounts[0]?.address) return + + try { + const stakingInfo = await getStakingInfo(allAccounts[0].address) + if (isMountedRef.current) { + setMaxBonded(stakingInfo.activeBonded) + } + } catch (err) { + setError('Failed to load staking info') + } + } + + loadStakingInfo() + }, [allAccounts]) const handleUnbond = async () => { - if (!api) { - console.error('API not available') + if (!api || !isConnected) { + setError('API not connected') + return + } + + if (!amount || parseFloat(amount) <= 0) { + setError('Please enter a valid amount') + return + } + + const unbondAmount = joyStringToPlanckBigInt(amount) + if (unbondAmount > maxBonded) { + setError('Amount exceeds bonded balance') return } + setIsLoading(true) + setError(null) + try { - // TODO: Implement actual unbonding transaction - console.log('Unbonding from validator:', validatorAddress) - hideModal() - } catch (error) { - console.error('Unbonding failed:', error) + const unbondTx = unbond(unbondAmount) + await unbondTx.signAndSend(allAccounts[0]) + + if (isMountedRef.current) { + setSuccess(true) + } + } catch (err) { + if (isMountedRef.current) { + setError(err instanceof Error ? err.message : 'Unbonding failed') + } + } finally { + if (isMountedRef.current) { + setIsLoading(false) + } + } + } + + const handleAmountChange = (e: React.ChangeEvent) => { + const value = e.target.value + if (value === '' || (!isNaN(parseFloat(value)) && parseFloat(value) >= 0)) { + setAmount(value) } } + const handleMaxAmount = () => { + setAmount(planckToJoyString(maxBonded)) + } + + if (success) { + return ( + + ) + } + return ( - You are about to unbond your tokens from this validator. Unbonding tokens means you are - requesting to withdraw your staked tokens, but they may be subject to an unbonding period. + Unbond your tokens. They will be subject to a 28-day unbonding period before withdrawal. + Validator Address: {validatorAddress} + - Note: This is a preview implementation. The actual transaction will be implemented - in a separate PR for testing. + Bonded Balance: {planckToJoyString(maxBonded)} JOY + + + + + + + Use Max Amount + + + {error && ( + + Error: {error} + + )} + + + Important: Unbonded tokens will be locked for 28 days before you can withdraw them. During{' '} + this period, they will not earn rewards. + - - Unbond Tokens + + Cancel + + + {isLoading ? 'Unbonding...' : 'Unbond Tokens'} diff --git a/packages/ui/src/validators/modals/UnbondStakingModal/UnbondStakingModal.tsx b/packages/ui/src/validators/modals/UnbondStakingModal/UnbondStakingModal.tsx new file mode 100644 index 0000000000..1a91916d52 --- /dev/null +++ b/packages/ui/src/validators/modals/UnbondStakingModal/UnbondStakingModal.tsx @@ -0,0 +1,181 @@ +import BN from 'bn.js' +import React, { useMemo, useState } from 'react' + +import { useMyAccounts } from '@/accounts/hooks/useMyAccounts' +import { encodeAddress } from '@/accounts/model/encodeAddress' +import { useApi } from '@/api/hooks/useApi' +import { ButtonSecondary } from '@/common/components/buttons' +import { FailureModal } from '@/common/components/FailureModal' +import { InputComponent, InputText } from '@/common/components/forms' +import { Modal, ModalBody, ModalHeader, ModalTransactionFooter } from '@/common/components/Modal' +import { RowGapBlock } from '@/common/components/page/PageContent' +import { SuccessModal } from '@/common/components/SuccessModal' +import { TextMedium, TextSmall, TokenValue } from '@/common/components/typography' +import { useMachine } from '@/common/hooks/useMachine' +import { useModal } from '@/common/hooks/useModal' +import { useSignAndSendTransaction } from '@/common/hooks/useSignAndSendTransaction' +import { joyStringToPlanckBigInt, planckToJoyString } from '@/common/model/joyValueFromString' +import { transactionMachine } from '@/common/model/machines' +import { useStakingTransactions } from '@/validators/hooks/useStakingSDK' + +import { UnbondStakingModalCall } from '.' + +export const UnbondStakingModal = () => { + const { modalData } = useModal() + + if (!modalData) { + return null + } + + return +} + +interface UnbondStakingModalInnerProps { + stash: string + controller?: string + bonded: BN +} + +const UnbondStakingModalInner = ({ stash, controller, bonded }: UnbondStakingModalInnerProps) => { + const { hideModal } = useModal() + const { api } = useApi() + const { allAccounts } = useMyAccounts() + const { unbond } = useStakingTransactions() + const [state, , service] = useMachine(transactionMachine) + + const [amount, setAmount] = useState('') + + const bondedBigInt = BigInt(bonded.toString()) + + const transaction = useMemo(() => { + if (!api || !amount || parseFloat(amount) <= 0) return undefined + const unbondAmount = joyStringToPlanckBigInt(amount) + if (unbondAmount > bondedBigInt) return undefined + return unbond(unbondAmount) + }, [api, amount, unbond, bondedBigInt]) + + const signerAccount = useMemo(() => { + if (controller) { + return allAccounts.find((acc) => acc.address === controller) || allAccounts[0] + } + return allAccounts.find((acc) => acc.address === stash) || allAccounts[0] + }, [allAccounts, controller, stash]) + + const { isReady, sign, paymentInfo, canAfford } = useSignAndSendTransaction({ + transaction, + signer: signerAccount?.address ?? '', + service: service as any, + skipQueryNode: true, + }) + + const handleAmountChange = (e: React.ChangeEvent) => { + const value = e.target.value + if (value === '' || (!isNaN(parseFloat(value)) && parseFloat(value) >= 0)) { + setAmount(value) + } + } + + const handleMaxAmount = () => { + setAmount(planckToJoyString(bondedBigInt)) + } + + if (state.matches('canceled')) { + return ( + + + + The transaction was canceled. Please try again if you want to unbond your stake. + + + + ) + } + + if (state.matches('error')) { + return ( + + There was a problem with unbonding your stake + + ) + } + + if (state.matches('success')) { + return ( + + ) + } + + const signDisabled = + !isReady || + !canAfford || + !amount || + parseFloat(amount) <= 0 || + (parseFloat(amount) > 0 && joyStringToPlanckBigInt(amount) > bondedBigInt) + + return ( + + + + + + Unbond your tokens from stash {encodeAddress(stash)}. Unbonded tokens will be locked for 28 + days before you can withdraw them. + + + + Bonded Balance: + + + + + + + + Use Max Amount + + + {amount && parseFloat(amount) > 0 && joyStringToPlanckBigInt(amount) > bondedBigInt && ( + + Error: Amount exceeds bonded balance + + )} + + {!canAfford && paymentInfo?.partialFee && ( + + Error: Insufficient funds to cover transaction costs + + )} + + + Important: Unbonded tokens will be locked for 28 days before you can withdraw them. During{' '} + this period, they will not earn rewards. + + + + + + Cancel + + + + ) +} diff --git a/packages/ui/src/validators/modals/UnbondStakingModal/index.ts b/packages/ui/src/validators/modals/UnbondStakingModal/index.ts new file mode 100644 index 0000000000..64ff558d7e --- /dev/null +++ b/packages/ui/src/validators/modals/UnbondStakingModal/index.ts @@ -0,0 +1,16 @@ +import BN from 'bn.js' + +import { ModalWithDataCall } from '@/common/providers/modal/types' + +export type UnbondStakingModalCall = ModalWithDataCall< + 'UnbondStakingModal', + { + stash: string + controller?: string + bonded: BN + } +> + +export * from './UnbondStakingModal' + + diff --git a/packages/ui/src/validators/modals/ValidateModal/ValidateModal.tsx b/packages/ui/src/validators/modals/ValidateModal/ValidateModal.tsx new file mode 100644 index 0000000000..f1cfb97de4 --- /dev/null +++ b/packages/ui/src/validators/modals/ValidateModal/ValidateModal.tsx @@ -0,0 +1,205 @@ +import React, { useState, useEffect, useRef, useMemo } from 'react' + +import { useMyAccounts } from '@/accounts/hooks/useMyAccounts' +import { useApi } from '@/api/hooks/useApi' +import { ButtonPrimary, ButtonSecondary } from '@/common/components/buttons' +import { InputComponent, InputText } from '@/common/components/forms' +import { Modal, ModalBody, ModalFooter, ModalHeader } from '@/common/components/Modal' +import { RowGapBlock } from '@/common/components/page/PageContent' +import { SuccessModal } from '@/common/components/SuccessModal' +import { TextMedium, TextSmall } from '@/common/components/typography' +import { useModal } from '@/common/hooks/useModal' +import { Address } from '@/common/types' +import { useStakingTransactions, useStakingValidation } from '@/validators/hooks/useStakingSDK' +import { ValidateModalCall } from '@/validators/modals/ValidateModal/types' + +interface Props { + validatorAddress: Address +} + +export const ValidateModal = () => { + const { modalData } = useModal() + const validatorAddress = modalData?.validatorAddress + + if (!validatorAddress) return null + + return +} + +const ValidateModalInner = ({ validatorAddress }: Props) => { + const { hideModal } = useModal() + const { api } = useApi() + const { allAccounts } = useMyAccounts() + const { validate, isConnected } = useStakingTransactions() + const { canValidate } = useStakingValidation() + + const [commission, setCommission] = useState('5.0') + const [blocked, setBlocked] = useState(false) + const [isLoading, setIsLoading] = useState(false) + const [error, setError] = useState(null) + const [success, setSuccess] = useState(false) + const [canValidateAccount, setCanValidateAccount] = useState(null) + const isMountedRef = useRef(true) + const selectedAccount = useMemo(() => { + if (!allAccounts.length) return null + return allAccounts.find((account) => account.address === validatorAddress) ?? allAccounts[0] + }, [allAccounts, validatorAddress]) + + useEffect(() => { + return () => { + isMountedRef.current = false + } + }, []) + + useEffect(() => { + const checkValidation = async () => { + if (!selectedAccount?.address) { + setCanValidateAccount(null) + setError('No account available to submit this transaction') + return + } + + try { + const canValidateResult = await canValidate(selectedAccount.address) + setCanValidateAccount(canValidateResult) + setError(null) + } catch (err) { + setError('Failed to check validation status') + } + } + + checkValidation() + }, [canValidate, selectedAccount]) + + const handleValidate = async () => { + if (!api || !isConnected) { + setError('API not connected') + return + } + + if (!selectedAccount?.address) { + setError('No account available to sign the transaction') + return + } + + if (!commission || parseFloat(commission) < 0 || parseFloat(commission) > 100) { + setError('Please enter a valid commission rate (0-100%)') + return + } + + if (canValidateAccount === false) { + setError('This account cannot become a validator') + return + } + + setIsLoading(true) + setError(null) + + try { + const validateTx = validate(parseFloat(commission), blocked) + await validateTx.signAndSend(selectedAccount.address) + + if (isMountedRef.current) { + setSuccess(true) + } + } catch (err) { + setError(err instanceof Error ? err.message : 'Validation failed') + } finally { + setIsLoading(false) + } + } + + const handleCommissionChange = (e: React.ChangeEvent) => { + const value = e.target.value + if (value === '' || (!isNaN(parseFloat(value)) && parseFloat(value) >= 0 && parseFloat(value) <= 100)) { + setCommission(value) + setError(null) + } + } + + const actionDisabled = + isLoading || + !commission || + parseFloat(commission) < 0 || + parseFloat(commission) > 100 || + canValidateAccount === false || + !selectedAccount || + canValidateAccount === null || + !!error + + if (success) { + return ( + + ) + } + + return ( + + + + + + Become a validator by setting your commission rate. You will need to bond tokens first. + + + + Account Address: {validatorAddress} + + + {canValidateAccount !== null && ( + + Can Validate: {canValidateAccount ? 'Yes' : 'No'} + + )} + + + + + + + setBlocked(e.target.checked)} + /> + + + {error && ( + + Error: {error} + + )} + + + Important: Becoming a validator requires: +
• Bonded tokens +
• Valid commission rate +
• Good network connection +
• Understanding of validator responsibilities +
+
+
+ + + Cancel + + + {isLoading ? 'Validating...' : 'Become Validator'} + + +
+ ) +} diff --git a/packages/ui/src/validators/modals/ValidateModal/index.ts b/packages/ui/src/validators/modals/ValidateModal/index.ts new file mode 100644 index 0000000000..d788666f17 --- /dev/null +++ b/packages/ui/src/validators/modals/ValidateModal/index.ts @@ -0,0 +1,2 @@ +export { ValidateModal } from './ValidateModal' +export type { ValidateModalCall } from './types' diff --git a/packages/ui/src/validators/modals/ValidateModal/types.ts b/packages/ui/src/validators/modals/ValidateModal/types.ts new file mode 100644 index 0000000000..27e19019e1 --- /dev/null +++ b/packages/ui/src/validators/modals/ValidateModal/types.ts @@ -0,0 +1,8 @@ +import { Address } from '@/common/types' + +export interface ValidateModalCall { + modal: 'Validate' + data: { + validatorAddress: Address + } +} diff --git a/packages/ui/src/validators/modals/ValidatorsInfo.tsx b/packages/ui/src/validators/modals/ValidatorsInfo.tsx index 434d30b4e6..4b4ea476e0 100644 --- a/packages/ui/src/validators/modals/ValidatorsInfo.tsx +++ b/packages/ui/src/validators/modals/ValidatorsInfo.tsx @@ -1,35 +1,33 @@ -import React, { useState } from 'react' +import React from 'react' +import { Link } from 'react-router-dom' import styled from 'styled-components' -import { Link } from '@/common/components/Link' +import { ButtonPrimary } from '@/common/components/buttons' +import { Checkbox } from '@/common/components/forms' +import { ArrowRightIcon } from '@/common/components/icons' +import { Modal, ModalBody, ModalFooter, ModalHeader } from '@/common/components/Modal' import { RowGapBlock } from '@/common/components/page/PageContent' +import { TextMedium } from '@/common/components/typography' +import { Colors } from '@/common/constants' import { useLocalStorage } from '@/common/hooks/useLocalStorage' -import { useToggle } from '@/common/hooks/useToggle' - -import { ButtonPrimary } from '../../common/components/buttons' -import { Checkbox } from '../../common/components/forms' -import { ArrowRightIcon } from '../../common/components/icons' -import { Modal, ModalBody, ModalFooter, ModalHeader } from '../../common/components/Modal' -import { TextMedium } from '../../common/components/typography' +import { useModal } from '@/common/hooks/useModal' export const ValidatorsInfo = () => { const title = 'Nominating validators on Joystream' const buttonName = 'Start nominating' - const [check, setCheck] = useToggle(false) - const [notShowAgain, setNotShowAgain] = useLocalStorage('ValidatorsPageCheck') - const [showModal, setShowModal] = useState(true) + + const { hideModal } = useModal() + const [pageCheck, showInfo] = useLocalStorage('ValidatorsPageCheck') + const closeModal = () => { - setShowModal(false) - } - const checkModal = () => { - setNotShowAgain(check) - closeModal() + hideModal() + showInfo(true) } - if (!notShowAgain && showModal) + if (!pageCheck) return ( - - + + @@ -46,22 +44,25 @@ export const ValidatorsInfo = () => { To begin, review each validator's performance metrics by clicking on their name in the list. When you're - ready to nominate, add the validators you'd like to nominate by clicking the "Nominate" button on the - list or directly on the validator’s profile. Once you've selected a validator, click the "Proceed" + ready to nominate, add the validators you'd like to nominate to by clicking the "Nominate" button on the + list or directly on the validator’s profile. Once you've selected your validators, click the "Proceed" button to initiate the nomination process. You can learn more about the Pioneer nomination{' '} - system here. + + system here + + . - + {}} isChecked={false}> Do not show this again. - + {buttonName} diff --git a/packages/ui/src/validators/modals/validatorCard/ValidatorCard.tsx b/packages/ui/src/validators/modals/validatorCard/ValidatorCard.tsx index 209e91d4d7..5592e54471 100644 --- a/packages/ui/src/validators/modals/validatorCard/ValidatorCard.tsx +++ b/packages/ui/src/validators/modals/validatorCard/ValidatorCard.tsx @@ -28,9 +28,10 @@ interface Props { validator: ValidatorWithDetails selectCard: (cardNumber: number | null) => void totalCards: number + isNominated?: boolean } -export const ValidatorCard = React.memo(({ cardNumber, validator, eraIndex, selectCard, totalCards }: Props) => { +export const ValidatorCard = React.memo(({ cardNumber, validator, eraIndex, selectCard, totalCards, isNominated = false }: Props) => { const hideModal = () => { selectCard(null) } @@ -83,7 +84,7 @@ export const ValidatorCard = React.memo(({ cardNumber, validator, eraIndex, sele - {activeTab === 'Details' && } + {activeTab === 'Details' && } {activeTab === 'Nominators' && } diff --git a/packages/ui/src/validators/modals/validatorCard/ValidatorDetail.tsx b/packages/ui/src/validators/modals/validatorCard/ValidatorDetail.tsx index 74b07a5ea5..1a94609ce7 100644 --- a/packages/ui/src/validators/modals/validatorCard/ValidatorDetail.tsx +++ b/packages/ui/src/validators/modals/validatorCard/ValidatorDetail.tsx @@ -1,24 +1,30 @@ +import BN from 'bn.js' import React from 'react' +import { combineLatest, first, map, of, switchMap } from 'rxjs' import styled from 'styled-components' -import { ButtonPrimary, ButtonSecondary, ButtonGhost } from '@/common/components/buttons' +import { useApi } from '@/api/hooks/useApi' +import { ButtonPrimary } from '@/common/components/buttons' import { MarkdownPreview } from '@/common/components/MarkdownPreview' import { ModalFooter } from '@/common/components/Modal' import { RowGapBlock } from '@/common/components/page/PageContent' import { SidePaneBody, SidePaneLabel, SidePaneRow, SidePaneText } from '@/common/components/SidePane' import { NumericValueStat, StatisticsThreeColumns, TokenValueStat } from '@/common/components/statistics' -import { TextSmall } from '@/common/components/typography' +import { TextSmall, TokenValue } from '@/common/components/typography' import { BN_ZERO } from '@/common/constants' import { plural } from '@/common/helpers' import { useModal } from '@/common/hooks/useModal' +import { useObservable } from '@/common/hooks/useObservable' import { whenDefined } from '@/common/utils' import RewardPointsChart from '@/validators/components/RewardPointChart' +import { useSelectedValidators } from '@/validators/context/SelectedValidatorsContext' +import { useClaimAllNavigation } from '@/validators/hooks/useClaimAllNavigation' +import { useMyStashPositions } from '@/validators/hooks/useMyStashPositions' import { ValidatorWithDetails } from '../../types' import { BondModalCall } from '../BondModal' import { NominateValidatorModalCall } from '../NominateValidatorModal' import { NominatingRedirectModalCall } from '../NominatingRedirectModal' -import { PayoutModalCall } from '../PayoutModal' import { StakeModalCall } from '../StakeModal' import { UnbondModalCall } from '../UnbondModal' @@ -26,15 +32,54 @@ interface Props { validator: ValidatorWithDetails eraIndex: number | undefined hideModal: () => void + isNominated?: boolean } -export const ValidatorDetail = ({ validator, eraIndex, hideModal }: Props) => { +export const ValidatorDetail = ({ validator, eraIndex, hideModal, isNominated = false }: Props) => { + const { api } = useApi() + const stashPositions = useMyStashPositions() const { showModal } = useModal() const { showModal: showNominateModal } = useModal() const { showModal: showStakeModal } = useModal() const { showModal: showBondModal } = useModal() const { showModal: showUnbondModal } = useModal() - const { showModal: showPayoutModal } = useModal() + const { isSelected, toggleSelection, selectedValidators, maxSelection } = useSelectedValidators() + const openClaimAllModal = useClaimAllNavigation() + + // Get stake amount for this nominated validator + const nominatedStake = useObservable(() => { + if (!api || !isNominated || !stashPositions) return of(undefined) + + // Find stash positions that nominate this validator + const nominatingStashes = stashPositions.filter((pos) => pos.nominations.includes(validator.stashAccount)) + if (nominatingStashes.length === 0) return of(undefined) + + // Get current era and query exposures + return api.query.staking.activeEra().pipe( + first(), + switchMap((activeEra) => { + if (activeEra.isNone) return of(undefined) + const currentEra = activeEra.unwrap().index.toNumber() + + // Query exposures for all nominating stashes + const exposureQueries = nominatingStashes.map((pos) => + api.query.staking.erasStakers(currentEra, validator.stashAccount).pipe( + first(), + map((exposure) => { + if (!exposure || exposure.isEmpty) return BN_ZERO + const nominatorExposure = exposure.others.find((other) => other.who.toString() === pos.stash) + return nominatorExposure ? nominatorExposure.value.toBn() : BN_ZERO + }) + ) + ) + + return combineLatest(exposureQueries).pipe( + first(), + map((stakes) => stakes.reduce((sum, stake) => sum.add(stake), BN_ZERO)) + ) + }) + ) + }, [api?.isConnected, isNominated, validator.stashAccount, stashPositions]) const uptime = whenDefined(validator.rewardPointsHistory, (rewardPointsHistory) => { const firstEra = rewardPointsHistory.at(0)?.era @@ -44,31 +89,43 @@ export const ValidatorDetail = ({ validator, eraIndex, hideModal }: Props) => { return `${((validatedEra / totalEras) * 100).toFixed(1)}%` }) - const handleActionClick = (action: string) => { + const isValidatorSelected = isSelected(validator) + const canSelect = !isValidatorSelected && selectedValidators.length < maxSelection + + const handleActionClick = async (action: string) => { const validatorAddress = validator.stashAccount - + switch (action) { + case 'Select': + toggleSelection(validator) + break case 'Nominate': + await new Promise((resolve) => setTimeout(resolve, 0)) // Make async hideModal() showNominateModal({ modal: 'NominateValidator', data: { validatorAddress } }) break case 'Stake': + await new Promise((resolve) => setTimeout(resolve, 0)) // Make async hideModal() showStakeModal({ modal: 'Stake', data: { validatorAddress } }) break case 'Bond': + await new Promise((resolve) => setTimeout(resolve, 0)) // Make async hideModal() showBondModal({ modal: 'Bond', data: { validatorAddress } }) break case 'Unbond': + await new Promise((resolve) => setTimeout(resolve, 0)) // Make async hideModal() showUnbondModal({ modal: 'Unbond', data: { validatorAddress } }) break case 'Payout': + await new Promise((resolve) => setTimeout(resolve, 0)) // Make async hideModal() - showPayoutModal({ modal: 'Payout', data: { validatorAddress } }) + openClaimAllModal() break default: + await new Promise((resolve) => setTimeout(resolve, 0)) // Make async hideModal() showModal({ modal: 'NominatingRedirect' }) } @@ -138,36 +195,30 @@ export const ValidatorDetail = ({ validator, eraIndex, hideModal }: Props) => { - handleActionClick('Nominate')} - > - Nominate - - handleActionClick('Stake')} - > - Stake - - handleActionClick('Bond')} - > - Bond - - handleActionClick('Unbond')} - > - Unbond - - handleActionClick('Payout')} - > - Payout - + {isNominated ? ( +
+ Nominated + {nominatedStake && !nominatedStake.isZero() && } +
+ ) : isValidatorSelected ? ( + handleActionClick('Select')} + disabled={true} + title="This validator is already selected for nomination." + > + Selected + + ) : ( + handleActionClick('Select')} + disabled={!canSelect} + title={canSelect ? 'Select this validator for nomination' : 'Maximum number of validators selected'} + > + {canSelect ? 'Select' : 'Max Reached'} + + )}
@@ -211,4 +262,5 @@ const ActionButtonsContainer = styled.div` justify-content: flex-start; align-items: center; width: 100%; + position: relative; ` diff --git a/packages/ui/src/validators/model/sortValidatorAccounts.ts b/packages/ui/src/validators/model/sortValidatorAccounts.ts new file mode 100644 index 0000000000..85ae067128 --- /dev/null +++ b/packages/ui/src/validators/model/sortValidatorAccounts.ts @@ -0,0 +1,54 @@ +import { Account } from '@/accounts/types' +import { BN_ZERO } from '@/common/constants' + +import { AccountStakingRewards } from '../hooks/useAllAccountsStakingRewards' + +export type ValidatorSortKey = 'name' | 'totalEarned' | 'claimable' + +export function sortValidatorAccounts( + accounts: Account[], + key: ValidatorSortKey, + isDescending = false, + stakingRewardsMap?: Map +): Account[] { + const sorted = [...accounts] + + if (key === 'name') { + sorted.sort((a, b) => { + const nameA = a.name?.toLowerCase() || a.address.toLowerCase() + const nameB = b.name?.toLowerCase() || b.address.toLowerCase() + return isDescending ? nameB.localeCompare(nameA) : nameA.localeCompare(nameB) + }) + } else if (key === 'totalEarned' && stakingRewardsMap) { + sorted.sort((a, b) => { + const rewardsA = stakingRewardsMap.get(a.address)?.totalEarned || BN_ZERO + const rewardsB = stakingRewardsMap.get(b.address)?.totalEarned || BN_ZERO + const comparison = rewardsA.cmp(rewardsB) + return isDescending ? -comparison : comparison + }) + } else if (key === 'claimable' && stakingRewardsMap) { + sorted.sort((a, b) => { + const claimableA = stakingRewardsMap.get(a.address)?.claimable || BN_ZERO + const claimableB = stakingRewardsMap.get(b.address)?.claimable || BN_ZERO + const comparison = claimableA.cmp(claimableB) + return isDescending ? -comparison : comparison + }) + } + + return sorted +} + +export function setValidatorOrder( + key: ValidatorSortKey, + sortBy: ValidatorSortKey, + setSortBy: (k: ValidatorSortKey) => void, + reversed: boolean, + setDescending: (d: boolean) => void +) { + if (key === sortBy) { + setDescending(!reversed) + } else { + setDescending(key !== 'name') + setSortBy(key) + } +} diff --git a/packages/ui/src/validators/providers/provider.tsx b/packages/ui/src/validators/providers/provider.tsx index 63035a17b1..e6da02070e 100644 --- a/packages/ui/src/validators/providers/provider.tsx +++ b/packages/ui/src/validators/providers/provider.tsx @@ -1,5 +1,5 @@ import React, { ReactNode, useState } from 'react' -import { map } from 'rxjs' +import { filter, first, map, of, switchMap } from 'rxjs' import { useApi } from '@/api/hooks/useApi' import { useFirstObservableValue } from '@/common/hooks/useFirstObservableValue' @@ -30,26 +30,75 @@ export const ValidatorContextProvider = (props: Props) => { const [shouldFetchValidators, setShouldFetchValidators] = useState(false) const allValidators = useFirstObservableValue(() => { - if (!shouldFetchValidators) return - - return api?.query.staking.validators.entries().pipe( - map((entries) => - entries.map((entry) => ({ - stashAccount: entry[0].args[0].toString(), - commission: perbillToPercent(entry[1].commission.toBn()), - })) - ) + if (!shouldFetchValidators || !api) return + + // Wait for API to be ready (metadata loaded) before making queries + // This prevents "PortableRegistry has not been set" errors + const isReady$ = + 'isReady' in api && typeof api.isReady === 'function' + ? (api.isReady() as any).pipe( + filter((ready: any) => Boolean(ready)), + first() + ) + : api.rpc.chain.getBlockHash(0).pipe( + first(), + map(() => true) + ) + + return isReady$.pipe( + switchMap(() => { + // Check if entries() method exists (it might not be available on ProxyApi) + const validatorsQuery = api.query.staking.validators + if (validatorsQuery && typeof validatorsQuery.entries === 'function') { + return validatorsQuery.entries().pipe( + map((entries) => + entries.map((entry) => ({ + stashAccount: entry[0].args[0].toString(), + commission: perbillToPercent(entry[1].commission.toBn()), + })) + ) + ) + } + + // Fallback: Use session.validators() to get active validators + // This only returns active validators, not all validators with preferences set + return api.query.session.validators().pipe( + switchMap((activeValidators) => { + const validatorAddresses = activeValidators.map((v) => v.toString()) + if (validatorAddresses.length === 0) { + return of([]) + } + + // Get validator preferences for active validators + return api.query.staking.validators.multi(validatorAddresses).pipe( + map((prefs: any[]) => + prefs + .map((pref: any, index: number) => { + if (!pref || pref.isEmpty) return null + const prefsData = pref.isEmpty ? null : pref.unwrap ? pref.unwrap() : pref + if (!prefsData || !prefsData.commission) return null + return { + stashAccount: validatorAddresses[index], + commission: perbillToPercent(prefsData.commission.toBn()), + } + }) + .filter((v): v is Validator => v !== null) + ) + ) + }) + ) + }) ) }, [api?.isConnected, shouldFetchValidators]) const allValidatorsWithCtrlAcc = useFirstObservableValue(() => { - if (!allValidators) return + if (!allValidators || !Array.isArray(allValidators) || allValidators.length === 0 || !api) return - return api?.query.staking.bonded.multi(allValidators.map((validator) => validator.stashAccount)).pipe( - map((entries) => - entries.map((entry, index) => { + return api.query.staking.bonded.multi(allValidators.map((validator: Validator) => validator.stashAccount)).pipe( + map((entries: any[]) => + entries.map((entry: any, index: number) => { const validator = allValidators[index] - const controllerAccount = entry.isSome ? entry.unwrap().toString() : undefined + const controllerAccount = entry && entry.isSome ? entry.unwrap().toString() : undefined return { ...validator, controllerAccount } }) ) diff --git a/packages/ui/src/validators/providers/useValidatorsQueries.ts b/packages/ui/src/validators/providers/useValidatorsQueries.ts index f2bc11ab25..1096d8ed4e 100644 --- a/packages/ui/src/validators/providers/useValidatorsQueries.ts +++ b/packages/ui/src/validators/providers/useValidatorsQueries.ts @@ -63,27 +63,29 @@ export const useValidatorsQueries = (): CommonValidatorsQueries | undefined => { const eraRewardPoints$ = api.derive.staking.erasPoints() const validatorsRewards$ = combineLatest([erasRewards$, eraRewardPoints$]).pipe( - map(([erasRewards, eraRewardPoints]) => - eraRewardPoints.map((points, index) => { - const era = points.era.toNumber() - const reward = erasRewards[index] - - if (era !== reward?.era.toNumber()) { - throw Error( - `derive.staking.erasRewards and derive.staking.erasPoints eras didn't match. Era #${era} is missing` - ) - } - - return { - era, - totalPoints: points.eraPoints.toNumber(), - totalReward: reward.eraReward, - individual: Object.fromEntries( - Object.entries(points.validators).map(([address, points]) => [address, points.toNumber()]) - ), - } - }) - ), + map(([erasRewards, eraRewardPoints]) => { + const rewardsByEra = new Map(erasRewards.map((reward) => [reward.era.toNumber(), reward])) + + return eraRewardPoints + .map((points) => { + const era = points.era.toNumber() + const reward = rewardsByEra.get(era) + + if (!reward) { + return null + } + + return { + era, + totalPoints: points.eraPoints.toNumber(), + totalReward: reward.eraReward, + individual: Object.fromEntries( + Object.entries(points.validators).map(([address, points]) => [address, points.toNumber()]) + ), + } + }) + .filter((reward): reward is EraRewards => reward !== null) + }), keepFirst() ) diff --git a/packages/ui/src/validators/types/NominatorTypes.ts b/packages/ui/src/validators/types/NominatorTypes.ts new file mode 100644 index 0000000000..dd9ff5bb08 --- /dev/null +++ b/packages/ui/src/validators/types/NominatorTypes.ts @@ -0,0 +1,6 @@ +import { Block } from '@polkadot/types/interfaces' + +export interface Nominator { + dateAndTime: Block + source?: string +} diff --git a/packages/ui/src/validators/types/index.ts b/packages/ui/src/validators/types/index.ts index 7e842456bc..39739511b8 100644 --- a/packages/ui/src/validators/types/index.ts +++ b/packages/ui/src/validators/types/index.ts @@ -1 +1,5 @@ export * from './Validator' + +// filter +export type Verification = null | 'verified' | 'unverified' +export type State = null | 'active' | 'waiting' \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index f142135dce..97a4f824b4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5045,6 +5045,16 @@ __metadata: languageName: node linkType: hard +"@jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.13 + resolution: "@jridgewell/gen-mapping@npm:0.3.13" + dependencies: + "@jridgewell/sourcemap-codec": ^1.5.0 + "@jridgewell/trace-mapping": ^0.3.24 + checksum: f2105acefc433337145caa3c84bba286de954f61c0bc46279bbd85a9e6a02871089717fa060413cfb6a9d44189fe8313b2d1cabf3a2eb3284d208fd5f75c54ff + languageName: node + linkType: hard + "@jridgewell/resolve-uri@npm:3.1.0": version: 3.1.0 resolution: "@jridgewell/resolve-uri@npm:3.1.0" @@ -5052,27 +5062,27 @@ __metadata: languageName: node linkType: hard -"@jridgewell/resolve-uri@npm:^3.0.3": - version: 3.1.1 - resolution: "@jridgewell/resolve-uri@npm:3.1.1" - checksum: f5b441fe7900eab4f9155b3b93f9800a916257f4e8563afbcd3b5a5337b55e52bd8ae6735453b1b745457d9f6cdb16d74cd6220bbdd98cf153239e13f6cbb653 +"@jridgewell/resolve-uri@npm:^3.0.3, @jridgewell/resolve-uri@npm:^3.1.0": + version: 3.1.2 + resolution: "@jridgewell/resolve-uri@npm:3.1.2" + checksum: 83b85f72c59d1c080b4cbec0fef84528963a1b5db34e4370fa4bd1e3ff64a0d80e0cee7369d11d73c704e0286fb2865b530acac7a871088fbe92b5edf1000870 languageName: node linkType: hard "@jridgewell/set-array@npm:^1.0.1": - version: 1.1.2 - resolution: "@jridgewell/set-array@npm:1.1.2" - checksum: 69a84d5980385f396ff60a175f7177af0b8da4ddb81824cb7016a9ef914eee9806c72b6b65942003c63f7983d4f39a5c6c27185bbca88eb4690b62075602e28e + version: 1.2.1 + resolution: "@jridgewell/set-array@npm:1.2.1" + checksum: 832e513a85a588f8ed4f27d1279420d8547743cc37fcad5a5a76fc74bb895b013dfe614d0eed9cb860048e6546b798f8f2652020b4b2ba0561b05caa8c654b10 languageName: node linkType: hard "@jridgewell/source-map@npm:^0.3.3": - version: 0.3.3 - resolution: "@jridgewell/source-map@npm:0.3.3" + version: 0.3.11 + resolution: "@jridgewell/source-map@npm:0.3.11" dependencies: - "@jridgewell/gen-mapping": ^0.3.0 - "@jridgewell/trace-mapping": ^0.3.9 - checksum: ae1302146339667da5cd6541260ecbef46ae06819a60f88da8f58b3e64682f787c09359933d050dea5d2173ea7fa40f40dd4d4e7a8d325c5892cccd99aaf8959 + "@jridgewell/gen-mapping": ^0.3.5 + "@jridgewell/trace-mapping": ^0.3.25 + checksum: c8a0011cc67e701f270fa042e32b312f382c413bcc70ca9c03684687cbf5b64d5eed87d4afa36dddaabe60ab3da6db4935f878febd9cfc7f82724ea1a114d344 languageName: node linkType: hard @@ -5090,6 +5100,13 @@ __metadata: languageName: node linkType: hard +"@jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0": + version: 1.5.5 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.5" + checksum: c2e36e67971f719a8a3a85ef5a5f580622437cc723c35d03ebd0c9c0b06418700ef006f58af742791f71f6a4fc68fcfaf1f6a74ec2f9a3332860e9373459dae7 + languageName: node + linkType: hard + "@jridgewell/trace-mapping@npm:0.3.9": version: 0.3.9 resolution: "@jridgewell/trace-mapping@npm:0.3.9" @@ -5110,6 +5127,16 @@ __metadata: languageName: node linkType: hard +"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": + version: 0.3.31 + resolution: "@jridgewell/trace-mapping@npm:0.3.31" + dependencies: + "@jridgewell/resolve-uri": ^3.1.0 + "@jridgewell/sourcemap-codec": ^1.4.14 + checksum: af8fda2431348ad507fbddf8e25f5d08c79ecc94594061ce402cf41bc5aba1a7b3e59bf0fd70a619b35f33983a3f488ceeba8faf56bff784f98bb5394a8b7d47 + languageName: node + linkType: hard + "@jsdevtools/ono@npm:7.1.3, @jsdevtools/ono@npm:^7.1.3": version: 7.1.3 resolution: "@jsdevtools/ono@npm:7.1.3" @@ -13838,11 +13865,11 @@ __metadata: linkType: hard "chart.js@npm:^4.4.1": - version: 4.4.1 - resolution: "chart.js@npm:4.4.1" + version: 4.5.1 + resolution: "chart.js@npm:4.5.1" dependencies: "@kurkle/color": ^0.3.0 - checksum: 8c108f137824ea0e3d79914708b409298c12ed7d16da99a40ca3cab51466ef7b0068ad82ac0addeb288b938fe0621d3e5a6a913b60e72a729aa42aa96705fcad + checksum: 34b35b373642994b2adac197e91363625930530e29fc1baa6dbb411b5e1295f9f6572922003a0224a21a3019aec916567c1ed00c33b1373081f189fc188e5a7b languageName: node linkType: hard From 0186ba14852a6f6a4b8f7527e8c86576875d0e17 Mon Sep 17 00:00:00 2001 From: "l1.media" Date: Tue, 2 Dec 2025 11:14:28 +0100 Subject: [PATCH 43/55] Fixup for #4888 --- packages/ui/src/app/GlobalModals.tsx | 1 - packages/ui/src/validators/components/Nominators.tsx | 2 +- .../nominator/NominatorPositionsTable.stories.tsx | 6 +++--- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/ui/src/app/GlobalModals.tsx b/packages/ui/src/app/GlobalModals.tsx index 430ca7bb8b..ba2964b705 100644 --- a/packages/ui/src/app/GlobalModals.tsx +++ b/packages/ui/src/app/GlobalModals.tsx @@ -259,7 +259,6 @@ const GUEST_ACCESSIBLE_MODALS: ModalNames[] = [ 'Stake', 'Bond', 'Unbond', - 'Payout', 'CreateOpening', 'LeaveRole', ] diff --git a/packages/ui/src/validators/components/Nominators.tsx b/packages/ui/src/validators/components/Nominators.tsx index 7e086ecfce..a87506e3ce 100644 --- a/packages/ui/src/validators/components/Nominators.tsx +++ b/packages/ui/src/validators/components/Nominators.tsx @@ -52,7 +52,7 @@ export function Nominators() { switchMap(([nominations, bonded]) => { const isNominating = !nominations.isEmpty const targets = isNominating ? nominations.unwrap().targets.map((target) => target.toString()) : [] - + if (bonded.isNone) { return of({ address: account.address, diff --git a/packages/ui/src/validators/components/nominator/NominatorPositionsTable.stories.tsx b/packages/ui/src/validators/components/nominator/NominatorPositionsTable.stories.tsx index ac77fe29eb..3003e2e378 100644 --- a/packages/ui/src/validators/components/nominator/NominatorPositionsTable.stories.tsx +++ b/packages/ui/src/validators/components/nominator/NominatorPositionsTable.stories.tsx @@ -323,10 +323,10 @@ WithNominationsTooltip.parameters = { const stashAddress = 'j4VdDQVdwFYfQ2MvEdLT2EYZx4ALPQQ6yMyZopKoZEQmXcJrT' const validator1 = 'j4W7rVcUCxi2crhhjRq46fNDRbVHTjJrz6bKxZwehEMQxZeSf' const validator2 = 'j4UYhDYJ4pz2ihhDDzu69v2JTVeGaGmTebmBdWaX2ANVinXyE' - + // Convert validatorAddress to string for comparison const validatorStr = validatorAddress?.toString() || validatorAddress - + // Return different stake amounts for different validators let stakeAmount = '30000000000000' // 30,000 JOY default if (validatorStr === validator1) { @@ -334,7 +334,7 @@ WithNominationsTooltip.parameters = { } else if (validatorStr === validator2) { stakeAmount = '30000000000000' // 30,000 JOY } - + return { isEmpty: false, total: '100000000000000', From f228c0c10983c23f8898f8b77a7b5c95b05d510e Mon Sep 17 00:00:00 2001 From: "l1.media" Date: Tue, 2 Dec 2025 13:02:11 +0100 Subject: [PATCH 44/55] lint, remove unused --- .../Validators/components/ClaimAllButton.tsx | 24 +- .../components/Search/SearchResultItem.tsx | 2 +- .../components/icons/symbols/DeleteSymbol.tsx | 29 +-- packages/ui/src/common/constants/styles.ts | 2 +- packages/ui/src/common/hooks/useSort.ts | 2 +- .../ui/src/common/model/joyValueFromString.ts | 7 +- .../src/forum/hooks/useCategoryLatestPost.ts | 2 +- .../src/forum/hooks/useLatestForumThreads.ts | 2 +- .../MemberProfile/MemberDetails.tsx | 9 - .../proposals/hooks/useProposalsActivities.ts | 4 +- .../src/validators/components/Nominators.tsx | 13 +- .../components/OverView.stories.tsx | 3 +- .../components/ValidatorInfo.stories.tsx | 9 +- .../components/ValidatorItem.stories.tsx | 5 +- .../validators/components/ValidatorItem.tsx | 2 +- .../dashboard/NominatorItem.stories.tsx | 1 - .../ValidatorAccountItem.stories.tsx | 5 +- .../nominator/NominatorActionMenu.tsx | 23 +- .../NominatorPositionsTable.stories.tsx | 110 ++++----- .../ui/src/validators/constants/constant.ts | 2 +- .../context/SelectedValidatorsContext.tsx | 10 +- .../hooks/useNominatorClaimableByValidator.ts | 1 - .../validators/hooks/useValidatorHealth.ts | 1 - .../modals/ChangeSessionKeysModal/index.ts | 1 - .../modals/ClaimStakingRewardsModal/index.ts | 1 - .../modals/ManageStashActionModal/index.ts | 3 - .../modals/PayoutModal/PayoutModal.tsx | 70 ------ .../validators/modals/PayoutModal/index.ts | 2 - .../validators/modals/PayoutModal/types.ts | 6 - .../modals/SetNomineesModal/index.ts | 2 - .../modals/StakeModal/StakeModal.tsx | 12 +- .../StakingTransactionModal.tsx | 17 +- .../modals/StopStakingModal/index.ts | 3 - .../modals/UnbondStakingModal/index.ts | 2 - .../modals/validatorCard/ValidatorCard.tsx | 119 ++++----- packages/ui/src/validators/types/index.ts | 2 +- .../__generated__/workingGroups.generated.tsx | 228 +++++++++--------- 37 files changed, 303 insertions(+), 433 deletions(-) delete mode 100644 packages/ui/src/validators/modals/PayoutModal/PayoutModal.tsx delete mode 100644 packages/ui/src/validators/modals/PayoutModal/index.ts delete mode 100644 packages/ui/src/validators/modals/PayoutModal/types.ts diff --git a/packages/ui/src/app/pages/Validators/components/ClaimAllButton.tsx b/packages/ui/src/app/pages/Validators/components/ClaimAllButton.tsx index 7549ff4a5a..5e05e783bf 100644 --- a/packages/ui/src/app/pages/Validators/components/ClaimAllButton.tsx +++ b/packages/ui/src/app/pages/Validators/components/ClaimAllButton.tsx @@ -5,18 +5,18 @@ import { useModal } from '@/common/hooks/useModal' import { useMyStakingRewards } from '@/validators/hooks/useMyStakingRewards' export const ClaimAllButton = () => { - const { showModal } = useModal() - const stakingRewards = useMyStakingRewards() + const { showModal } = useModal() + const stakingRewards = useMyStakingRewards() - const hasClaimableRewards = stakingRewards && stakingRewards.claimableRewards.gtn(0) + const hasClaimableRewards = stakingRewards && stakingRewards.claimableRewards.gtn(0) - return ( - showModal({ modal: 'ClaimStakingRewardsModal' })} - disabled={!hasClaimableRewards} - > - Claim All - - ) + return ( + showModal({ modal: 'ClaimStakingRewardsModal' })} + disabled={!hasClaimableRewards} + > + Claim All + + ) } diff --git a/packages/ui/src/common/components/Search/SearchResultItem.tsx b/packages/ui/src/common/components/Search/SearchResultItem.tsx index 5d2c58b353..7c80d1c268 100644 --- a/packages/ui/src/common/components/Search/SearchResultItem.tsx +++ b/packages/ui/src/common/components/Search/SearchResultItem.tsx @@ -1,9 +1,9 @@ import React from 'react' import styled from 'styled-components' -import { GhostRouterLink } from '@/common/components/RouterLink' import { BreadcrumbsItem, BreadcrumbsItemLink } from '@/common/components/page/Sidebar/Breadcrumbs/BreadcrumbsItem' import { BreadcrumbsListComponent } from '@/common/components/page/Sidebar/Breadcrumbs/BreadcrumbsList' +import { GhostRouterLink } from '@/common/components/RouterLink' import { Colors, Fonts, Transitions } from '@/common/constants' import { TextMedium } from '../typography' diff --git a/packages/ui/src/common/components/icons/symbols/DeleteSymbol.tsx b/packages/ui/src/common/components/icons/symbols/DeleteSymbol.tsx index 04857380b7..45b167e025 100644 --- a/packages/ui/src/common/components/icons/symbols/DeleteSymbol.tsx +++ b/packages/ui/src/common/components/icons/symbols/DeleteSymbol.tsx @@ -5,18 +5,19 @@ import { Colors } from '../../../constants' import { Symbol, SymbolProps } from './common' export function DeleteSymbol({ className }: SymbolProps) { - return ( - - - - - - - ) + return ( + + + + + ) } diff --git a/packages/ui/src/common/constants/styles.ts b/packages/ui/src/common/constants/styles.ts index b2b6dea287..f4fb38a75a 100644 --- a/packages/ui/src/common/constants/styles.ts +++ b/packages/ui/src/common/constants/styles.ts @@ -121,7 +121,7 @@ export const BorderRad = { export const Sizes = { selectHeight: '80px', accountHeight: '94px', - validatorHeight:'70px' + validatorHeight: '70px', } export const Shadows = { diff --git a/packages/ui/src/common/hooks/useSort.ts b/packages/ui/src/common/hooks/useSort.ts index 746b5805fa..ab5c72fb00 100644 --- a/packages/ui/src/common/hooks/useSort.ts +++ b/packages/ui/src/common/hooks/useSort.ts @@ -61,4 +61,4 @@ export function sortBy( return order.isDescending ? -comparison : comparison }) return sorted -} \ No newline at end of file +} diff --git a/packages/ui/src/common/model/joyValueFromString.ts b/packages/ui/src/common/model/joyValueFromString.ts index 95bb400d37..e4f1142163 100644 --- a/packages/ui/src/common/model/joyValueFromString.ts +++ b/packages/ui/src/common/model/joyValueFromString.ts @@ -25,12 +25,7 @@ export const joyStringToPlanckBigInt = (value: string): bigint => BigInt(joyValu export const planckToJoyString = (value: BN | bigint | string | number, precision = 4): string => { const bnValue = toBN(value) const { div: integerPart, mod } = bnValue.divmod(JOY_UNIT) - const fractional = mod - .abs() - .toString() - .padStart(JOY_DECIMAL_PLACES, '0') - .slice(0, precision) - .replace(/0+$/, '') + const fractional = mod.abs().toString().padStart(JOY_DECIMAL_PLACES, '0').slice(0, precision).replace(/0+$/, '') return fractional ? `${integerPart.toString()}.${fractional}` : integerPart.toString() } diff --git a/packages/ui/src/forum/hooks/useCategoryLatestPost.ts b/packages/ui/src/forum/hooks/useCategoryLatestPost.ts index b906f23ddc..d512ff1dc0 100644 --- a/packages/ui/src/forum/hooks/useCategoryLatestPost.ts +++ b/packages/ui/src/forum/hooks/useCategoryLatestPost.ts @@ -2,8 +2,8 @@ import * as Apollo from '@apollo/client' import { useEffect, useMemo } from 'react' import { ForumPostOrderByInput, ForumThreadOrderByInput } from '@/common/api/queries' -import { GetForumPostsDocument, useGetForumThreadsQuery } from '@/forum/queries' import { ActiveStatus } from '@/forum/hooks/useForumCategories' +import { GetForumPostsDocument, useGetForumThreadsQuery } from '@/forum/queries' import { asForumPost, asForumThread } from '@/forum/types' interface UseCategoryLatestPostOptions { diff --git a/packages/ui/src/forum/hooks/useLatestForumThreads.ts b/packages/ui/src/forum/hooks/useLatestForumThreads.ts index 9c12ca5595..e29561c53e 100644 --- a/packages/ui/src/forum/hooks/useLatestForumThreads.ts +++ b/packages/ui/src/forum/hooks/useLatestForumThreads.ts @@ -1,8 +1,8 @@ import { useMemo } from 'react' import { ForumThreadOrderByInput } from '@/common/api/queries' -import { useGetForumThreadsQuery } from '@/forum/queries' import { ActiveStatus } from '@/forum/hooks/useForumCategories' +import { useGetForumThreadsQuery } from '@/forum/queries' import { asForumThread } from '../types' diff --git a/packages/ui/src/memberships/components/MemberProfile/MemberDetails.tsx b/packages/ui/src/memberships/components/MemberProfile/MemberDetails.tsx index 1019dd5e78..b20267818f 100644 --- a/packages/ui/src/memberships/components/MemberProfile/MemberDetails.tsx +++ b/packages/ui/src/memberships/components/MemberProfile/MemberDetails.tsx @@ -39,15 +39,6 @@ export const MemberDetails = React.memo(({ member }: Props) => { initiatingLeaving = '-', } = useMemberExtraInfo(member) - const externalResourceLink: any = { - TELEGRAM: 'https://web.telegram.org/k/#@', - TWITTER: 'https://twitter.com/', - FACEBOOK: 'https://facebook.com/', - YOUTUBE: 'https://youtube.com/@', - LINKEDIN: 'https://www.linkedin.com/in/', - GITHUB: 'https://github.com/', - } - if (isLoading || !memberDetails) { return ( diff --git a/packages/ui/src/proposals/hooks/useProposalsActivities.ts b/packages/ui/src/proposals/hooks/useProposalsActivities.ts index dcd48ddc35..804bf0b240 100644 --- a/packages/ui/src/proposals/hooks/useProposalsActivities.ts +++ b/packages/ui/src/proposals/hooks/useProposalsActivities.ts @@ -3,7 +3,7 @@ import { asProposalActivities } from '../types/ProposalsActivities' export const useProposalsActivities = () => { const { data, loading } = useGetProposalsEventsQuery() - + const activities = data ? asProposalActivities({ proposalCreatedEvents: data.proposalCreatedEvents, @@ -18,7 +18,7 @@ export const useProposalsActivities = () => { proposalDiscussionPostDeletedEvents: data.proposalDiscussionPostDeletedEvents, }) : [] - + return { isLoading: loading, activities, diff --git a/packages/ui/src/validators/components/Nominators.tsx b/packages/ui/src/validators/components/Nominators.tsx index a87506e3ce..6fcce7eab5 100644 --- a/packages/ui/src/validators/components/Nominators.tsx +++ b/packages/ui/src/validators/components/Nominators.tsx @@ -5,19 +5,17 @@ import styled from 'styled-components' import { AccountItemLoading } from '@/accounts/components/AccountItem/AccountItemLoading' import { useMyAccounts } from '@/accounts/hooks/useMyAccounts' import { useMyBalances } from '@/accounts/hooks/useMyBalances' -import { Account } from '@/accounts/types' import { filterAccounts } from '@/accounts/model/filterAccounts' import { sortAccounts, SortKey, setOrder } from '@/accounts/model/sortAccounts' +import { useApi } from '@/api/hooks/useApi' import { ButtonPrimary } from '@/common/components/buttons' import { EmptyPagePlaceholder } from '@/common/components/EmptyPagePlaceholder/EmptyPagePlaceholder' import { List, ListItem } from '@/common/components/List' import { ContentWithTabs } from '@/common/components/page/PageContent' import { HeaderText, SortIconDown, SortIconUp } from '@/common/components/SortedListHeaders' -import { Colors } from '@/common/constants' -import { useApi } from '@/api/hooks/useApi' -import { BN_ZERO } from '@/common/constants' -import { useObservable } from '@/common/hooks/useObservable' +import { Colors, BN_ZERO } from '@/common/constants' import { useModal } from '@/common/hooks/useModal' +import { useObservable } from '@/common/hooks/useObservable' import { NominatorInfo } from '@/validators/hooks/useNominatorInfo' import { NominatorAccountItem } from './dashboard/NominatorItem' @@ -45,10 +43,7 @@ export function Nominators() { return combineLatest( sortedAccounts.map((account) => - combineLatest([ - api.query.staking.nominators(account.address), - api.query.staking.bonded(account.address), - ]).pipe( + combineLatest([api.query.staking.nominators(account.address), api.query.staking.bonded(account.address)]).pipe( switchMap(([nominations, bonded]) => { const isNominating = !nominations.isEmpty const targets = isNominating ? nominations.unwrap().targets.map((target) => target.toString()) : [] diff --git a/packages/ui/src/validators/components/OverView.stories.tsx b/packages/ui/src/validators/components/OverView.stories.tsx index 2eee6a81f3..53b479c9c9 100644 --- a/packages/ui/src/validators/components/OverView.stories.tsx +++ b/packages/ui/src/validators/components/OverView.stories.tsx @@ -1,5 +1,5 @@ -import BN from 'bn.js' import { Meta, Story } from '@storybook/react' +import BN from 'bn.js' import React from 'react' import { MockProvidersDecorator } from '@/mocks/providers' @@ -149,4 +149,3 @@ EmptyState.parameters = { }, }, } - diff --git a/packages/ui/src/validators/components/ValidatorInfo.stories.tsx b/packages/ui/src/validators/components/ValidatorInfo.stories.tsx index a54a207cff..9b219d3264 100644 --- a/packages/ui/src/validators/components/ValidatorInfo.stories.tsx +++ b/packages/ui/src/validators/components/ValidatorInfo.stories.tsx @@ -48,9 +48,7 @@ LargeSize.args = { handle: 'validator_bob', name: 'Bob Validator', avatar: undefined, - externalResources: [ - { source: 'TWITTER', value: 'bob_validator' }, - ], + externalResources: [{ source: 'TWITTER', value: 'bob_validator' }], } as any, size: 'l', } @@ -63,10 +61,7 @@ WithTwitterOnly.args = { handle: 'validator_charlie', name: 'Charlie Validator', avatar: undefined, - externalResources: [ - { source: 'TWITTER', value: 'charlie_validator' }, - ], + externalResources: [{ source: 'TWITTER', value: 'charlie_validator' }], } as any, size: 's', } - diff --git a/packages/ui/src/validators/components/ValidatorItem.stories.tsx b/packages/ui/src/validators/components/ValidatorItem.stories.tsx index dcecec145e..d6694457a1 100644 --- a/packages/ui/src/validators/components/ValidatorItem.stories.tsx +++ b/packages/ui/src/validators/components/ValidatorItem.stories.tsx @@ -1,10 +1,10 @@ -import BN from 'bn.js' import { Meta, Story } from '@storybook/react' +import BN from 'bn.js' import React from 'react' import { MockApolloProvider } from '@/mocks/components/storybook/MockApolloProvider' -import { SelectedValidatorsProvider } from '@/validators/context/SelectedValidatorsContext' import { ValidatorItem, ValidatorItemProps } from '@/validators/components/ValidatorItem' +import { SelectedValidatorsProvider } from '@/validators/context/SelectedValidatorsContext' import { ValidatorWithDetails } from '@/validators/types/Validator' export default { @@ -144,4 +144,3 @@ Nominated.args = { }), isNominated: true, } - diff --git a/packages/ui/src/validators/components/ValidatorItem.tsx b/packages/ui/src/validators/components/ValidatorItem.tsx index ebc5d2c1b7..980d53d3c0 100644 --- a/packages/ui/src/validators/components/ValidatorItem.tsx +++ b/packages/ui/src/validators/components/ValidatorItem.tsx @@ -6,7 +6,7 @@ import styled from 'styled-components' import { encodeAddress } from '@/accounts/model/encodeAddress' import { useApi } from '@/api/hooks/useApi' import { BadgeStatus } from '@/common/components/BadgeStatus' -import { ButtonPrimary, ButtonSecondary, ButtonGhost } from '@/common/components/buttons' +import { ButtonPrimary } from '@/common/components/buttons' import { TableListItemAsLinkHover } from '@/common/components/List' import { Skeleton } from '@/common/components/Skeleton' import { Tooltip, TooltipPopupTitle, TooltipText } from '@/common/components/Tooltip' diff --git a/packages/ui/src/validators/components/dashboard/NominatorItem.stories.tsx b/packages/ui/src/validators/components/dashboard/NominatorItem.stories.tsx index eb77463d36..c0a26d0b5f 100644 --- a/packages/ui/src/validators/components/dashboard/NominatorItem.stories.tsx +++ b/packages/ui/src/validators/components/dashboard/NominatorItem.stories.tsx @@ -51,4 +51,3 @@ LongAccountName.args = { name: 'Very Long Nominator Account Name That Should Be Truncated', }, } - diff --git a/packages/ui/src/validators/components/dashboard/ValidatorAccountItem.stories.tsx b/packages/ui/src/validators/components/dashboard/ValidatorAccountItem.stories.tsx index e6574193f4..5abbef2d98 100644 --- a/packages/ui/src/validators/components/dashboard/ValidatorAccountItem.stories.tsx +++ b/packages/ui/src/validators/components/dashboard/ValidatorAccountItem.stories.tsx @@ -1,10 +1,10 @@ -import BN from 'bn.js' import { Meta, Story } from '@storybook/react' +import BN from 'bn.js' import React from 'react' import { MockApolloProvider } from '@/mocks/components/storybook/MockApolloProvider' -import { AccountStakingRewards } from '@/validators/hooks/useAllAccountsStakingRewards' import { ValidatorAccountItem, AccountItemDataProps } from '@/validators/components/dashboard/ValidatorAccountItem' +import { AccountStakingRewards } from '@/validators/hooks/useAllAccountsStakingRewards' export default { title: 'Validators/Dashboard/ValidatorAccountItem', @@ -83,4 +83,3 @@ SmallRewards.args = { hasClaimable: true, }, } - diff --git a/packages/ui/src/validators/components/nominator/NominatorActionMenu.tsx b/packages/ui/src/validators/components/nominator/NominatorActionMenu.tsx index 10d7d7faf9..a724ec1523 100644 --- a/packages/ui/src/validators/components/nominator/NominatorActionMenu.tsx +++ b/packages/ui/src/validators/components/nominator/NominatorActionMenu.tsx @@ -23,14 +23,7 @@ interface Props { onUnbond: () => void } -export const NominatorActionMenu = ({ - items, - canStop, - stopDisabled, - onStop, - canUnbond, - onUnbond, -}: Props) => { +export const NominatorActionMenu = ({ items, canStop, stopDisabled, onStop, canUnbond, onUnbond }: Props) => { const [isMenuOpen, setMenuOpen] = useState(false) const [menuPosition, setMenuPosition] = useState<{ top: number; right: number } | null>(null) const menuRef = useRef(null) @@ -75,10 +68,7 @@ export const NominatorActionMenu = ({ setMenuOpen((prev) => !prev) } - const handleMenuItemClick = ( - event: React.MouseEvent, - { disabled, onClick }: MenuActionItem - ) => { + const handleMenuItemClick = (event: React.MouseEvent, { disabled, onClick }: MenuActionItem) => { if (disabled) return event.stopPropagation() setMenuOpen(false) @@ -94,13 +84,7 @@ export const NominatorActionMenu = ({ return ( - + {isMenuOpen && @@ -185,4 +169,3 @@ const MenuContainer = styled.div` gap: 0; align-items: center; ` - diff --git a/packages/ui/src/validators/components/nominator/NominatorPositionsTable.stories.tsx b/packages/ui/src/validators/components/nominator/NominatorPositionsTable.stories.tsx index 3003e2e378..f6c63756db 100644 --- a/packages/ui/src/validators/components/nominator/NominatorPositionsTable.stories.tsx +++ b/packages/ui/src/validators/components/nominator/NominatorPositionsTable.stories.tsx @@ -4,10 +4,9 @@ import React from 'react' import styled, { createGlobalStyle } from 'styled-components' import { encodeAddress } from '@/accounts/model/encodeAddress' -import { createType } from '@/common/model/createType' import { Tooltip, TooltipPopupTitle, TooltipText } from '@/common/components/Tooltip' -import { TextSmall } from '@/common/components/typography' import { Colors, JOY_DECIMAL_PLACES } from '@/common/constants' +import { createType } from '@/common/model/createType' import { shortenAddress } from '@/common/model/formatters' import { MockProvidersDecorator } from '@/mocks/providers' import { NominatorPositionsTable, Props } from '@/validators/components/nominator/NominatorPositionsTable' @@ -434,67 +433,63 @@ export const TooltipActiveState: Story = () => { className="wide-tooltip" tooltipOpen={true} popupContent={ - - {activeNominations.length > 0 && ( - <> + + {activeNominations.length > 0 && ( + <> + + Active ({activeNominations.length}) + {activeNominations.map((nom) => ( + + + {nom.address.includes('...') ? nom.address : shortenAddress(encodeAddress(nom.address), 20)} + + {nom.stake && ( + + {(() => { + try { + const stake = nom.stake as any + if (stake instanceof BN) { + return abbreviateTokenAmount(stake) + } else if (stake && typeof stake.toNumber === 'function') { + return abbreviateTokenAmount(stake.toNumber()) + } else if (stake && typeof stake.toBn === 'function') { + return abbreviateTokenAmount(stake.toBn()) + } else if (typeof stake === 'number' || typeof stake === 'string') { + return abbreviateTokenAmount(stake) + } else { + return '0' + } + } catch (err) { + return '0' + } + })()} + + )} + + ))} + + {inactiveNominations.length > 0 && } + + )} + {inactiveNominations.length > 0 && ( - Active ({activeNominations.length}) - {activeNominations.map((nom) => ( + Inactive ({inactiveNominations.length}) + {inactiveNominations.map((nom) => ( - {nom.address.includes('...') - ? nom.address - : shortenAddress(encodeAddress(nom.address), 20)} + {nom.address.includes('...') ? nom.address : shortenAddress(encodeAddress(nom.address), 20)} - {nom.stake && ( - - {(() => { - try { - const stake = nom.stake as any - if (stake instanceof BN) { - return abbreviateTokenAmount(stake) - } else if (stake && typeof stake.toNumber === 'function') { - return abbreviateTokenAmount(stake.toNumber()) - } else if (stake && typeof stake.toBn === 'function') { - return abbreviateTokenAmount(stake.toBn()) - } else if (typeof stake === 'number' || typeof stake === 'string') { - return abbreviateTokenAmount(stake) - } else { - return '0' - } - } catch (err) { - return '0' - } - })()} - - )} ))} - {inactiveNominations.length > 0 && } - - )} - {inactiveNominations.length > 0 && ( - - Inactive ({inactiveNominations.length}) - {inactiveNominations.map((nom) => ( - - - {nom.address.includes('...') - ? nom.address - : shortenAddress(encodeAddress(nom.address), 20)} - - - ))} - - )} - - } - > -
- Hover or click to see tooltip (tooltip is forced open in this story) -
-
+ )} + + } + > +
+ Hover or click to see tooltip (tooltip is forced open in this story) +
+
) @@ -502,7 +497,8 @@ export const TooltipActiveState: Story = () => { TooltipActiveState.parameters = { docs: { description: { - story: 'This story shows the nominations tooltip in an active/open state for testing purposes. The tooltip displays active and inactive nominations with their stake amounts.', + story: + 'This story shows the nominations tooltip in an active/open state for testing purposes. The tooltip displays active and inactive nominations with their stake amounts.', }, }, } diff --git a/packages/ui/src/validators/constants/constant.ts b/packages/ui/src/validators/constants/constant.ts index e55b2a04d1..b8c692d2ba 100644 --- a/packages/ui/src/validators/constants/constant.ts +++ b/packages/ui/src/validators/constants/constant.ts @@ -1 +1 @@ -export const ERA_DURATION = new Date(21600000) \ No newline at end of file +export const ERA_DURATION = new Date(21600000) diff --git a/packages/ui/src/validators/context/SelectedValidatorsContext.tsx b/packages/ui/src/validators/context/SelectedValidatorsContext.tsx index fd47715d68..bb33f7717a 100644 --- a/packages/ui/src/validators/context/SelectedValidatorsContext.tsx +++ b/packages/ui/src/validators/context/SelectedValidatorsContext.tsx @@ -21,16 +21,16 @@ export const SelectedValidatorsProvider = ({ children, maxSelection = 16 }: Sele const [selectedValidators, setSelectedValidators] = useState([]) const isSelected = (validator: ValidatorWithDetails) => { - return selectedValidators.some(selected => selected.stashAccount === validator.stashAccount) + return selectedValidators.some((selected) => selected.stashAccount === validator.stashAccount) } const toggleSelection = (validator: ValidatorWithDetails) => { - setSelectedValidators(prev => { - const isCurrentlySelected = prev.some(selected => selected.stashAccount === validator.stashAccount) - + setSelectedValidators((prev) => { + const isCurrentlySelected = prev.some((selected) => selected.stashAccount === validator.stashAccount) + if (isCurrentlySelected) { // Remove from selection - return prev.filter(selected => selected.stashAccount !== validator.stashAccount) + return prev.filter((selected) => selected.stashAccount !== validator.stashAccount) } else { // Add to selection if under max limit if (prev.length < maxSelection) { diff --git a/packages/ui/src/validators/hooks/useNominatorClaimableByValidator.ts b/packages/ui/src/validators/hooks/useNominatorClaimableByValidator.ts index ca8fd074ef..b6cdd5ff40 100644 --- a/packages/ui/src/validators/hooks/useNominatorClaimableByValidator.ts +++ b/packages/ui/src/validators/hooks/useNominatorClaimableByValidator.ts @@ -40,4 +40,3 @@ export const useNominatorClaimableByValidator = (validator: ValidatorWithDetails return estimatedClaimable }, [stakingInfo, stakingRewards, nominatorInfo]) } - diff --git a/packages/ui/src/validators/hooks/useValidatorHealth.ts b/packages/ui/src/validators/hooks/useValidatorHealth.ts index 27b7ac20b1..febbb7e21e 100644 --- a/packages/ui/src/validators/hooks/useValidatorHealth.ts +++ b/packages/ui/src/validators/hooks/useValidatorHealth.ts @@ -43,4 +43,3 @@ export const useValidatorHealth = (validator: ValidatorWithDetails): number => { return Math.min(100, Math.max(0, health)) }, [validator]) } - diff --git a/packages/ui/src/validators/modals/ChangeSessionKeysModal/index.ts b/packages/ui/src/validators/modals/ChangeSessionKeysModal/index.ts index f2b26f8f2c..95eed0429b 100644 --- a/packages/ui/src/validators/modals/ChangeSessionKeysModal/index.ts +++ b/packages/ui/src/validators/modals/ChangeSessionKeysModal/index.ts @@ -9,4 +9,3 @@ export type ChangeSessionKeysModalCall = ModalWithDataCall< > export * from './ChangeSessionKeysModal' - diff --git a/packages/ui/src/validators/modals/ClaimStakingRewardsModal/index.ts b/packages/ui/src/validators/modals/ClaimStakingRewardsModal/index.ts index 923137e5fe..63588b73db 100644 --- a/packages/ui/src/validators/modals/ClaimStakingRewardsModal/index.ts +++ b/packages/ui/src/validators/modals/ClaimStakingRewardsModal/index.ts @@ -3,4 +3,3 @@ import { OptionalDataModalCall } from '@/common/providers/modal/types' export type ClaimStakingRewardsModalCall = OptionalDataModalCall<'ClaimStakingRewardsModal', { address?: string }> export * from './ClaimStakingRewardsModal' - diff --git a/packages/ui/src/validators/modals/ManageStashActionModal/index.ts b/packages/ui/src/validators/modals/ManageStashActionModal/index.ts index 9b82927500..7cd7602269 100644 --- a/packages/ui/src/validators/modals/ManageStashActionModal/index.ts +++ b/packages/ui/src/validators/modals/ManageStashActionModal/index.ts @@ -1,7 +1,6 @@ import BN from 'bn.js' import { ModalWithDataCall } from '@/common/providers/modal/types' - import { UnlockingChunk } from '@/validators/hooks/useMyStashPositions' export type ManageStashAction = 'bondRebond' | 'withdraw' | 'changeController' | 'changeReward' @@ -19,5 +18,3 @@ export type ManageStashActionModalCall = ModalWithDataCall< > export * from './ManageStashActionModal' - - diff --git a/packages/ui/src/validators/modals/PayoutModal/PayoutModal.tsx b/packages/ui/src/validators/modals/PayoutModal/PayoutModal.tsx deleted file mode 100644 index e75f29e7e9..0000000000 --- a/packages/ui/src/validators/modals/PayoutModal/PayoutModal.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import React from 'react' - -import { useApi } from '@/api/hooks/useApi' -import { ButtonPrimary } from '@/common/components/buttons' -import { Modal, ModalBody, ModalFooter, ModalHeader } from '@/common/components/Modal' -import { RowGapBlock } from '@/common/components/page/PageContent' -import { TextMedium } from '@/common/components/typography' -import { useModal } from '@/common/hooks/useModal' -import { Address } from '@/common/types' - -import { PayoutModalCall } from '@/validators/modals/PayoutModal/types' - -interface Props { - validatorAddress: Address -} - -export const PayoutModal = () => { - const { modalData } = useModal() - const validatorAddress = modalData?.validatorAddress - - if (!validatorAddress) return null - - return -} - -const PayoutModalInner = ({ validatorAddress }: Props) => { - const { hideModal } = useModal() - const { api } = useApi() - - const handlePayout = async () => { - if (!api) { - console.error('API not available') - return - } - - try { - // TODO: Implement actual payout transaction - console.log('Claiming payout from validator:', validatorAddress) - hideModal() - } catch (error) { - console.error('Payout failed:', error) - } - } - - return ( - - - - - - You are about to claim your payout from this validator. This will transfer any earned - rewards to your account. - - - Validator Address: {validatorAddress} - - - Note: This is a preview implementation. The actual transaction will be implemented - in a separate PR for testing. - - - - - - Claim Payout - - - - ) -} diff --git a/packages/ui/src/validators/modals/PayoutModal/index.ts b/packages/ui/src/validators/modals/PayoutModal/index.ts deleted file mode 100644 index 9da0d56efb..0000000000 --- a/packages/ui/src/validators/modals/PayoutModal/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { PayoutModal } from './PayoutModal' -export type { PayoutModalCall } from './types' diff --git a/packages/ui/src/validators/modals/PayoutModal/types.ts b/packages/ui/src/validators/modals/PayoutModal/types.ts deleted file mode 100644 index 1f7dc35025..0000000000 --- a/packages/ui/src/validators/modals/PayoutModal/types.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface PayoutModalCall { - modal: 'Payout' - data: { - validatorAddress: string - } -} diff --git a/packages/ui/src/validators/modals/SetNomineesModal/index.ts b/packages/ui/src/validators/modals/SetNomineesModal/index.ts index 46a408daff..06e76961f5 100644 --- a/packages/ui/src/validators/modals/SetNomineesModal/index.ts +++ b/packages/ui/src/validators/modals/SetNomineesModal/index.ts @@ -9,5 +9,3 @@ export type SetNomineesModalCall = ModalWithDataCall< > export * from './SetNomineesModal' - - diff --git a/packages/ui/src/validators/modals/StakeModal/StakeModal.tsx b/packages/ui/src/validators/modals/StakeModal/StakeModal.tsx index 4eb4444097..6644f22046 100644 --- a/packages/ui/src/validators/modals/StakeModal/StakeModal.tsx +++ b/packages/ui/src/validators/modals/StakeModal/StakeModal.tsx @@ -1,6 +1,7 @@ import React, { useMemo } from 'react' import { useMyAccounts } from '@/accounts/hooks/useMyAccounts' +import { encodeAddress } from '@/accounts/model/encodeAddress' import { useApi } from '@/api/hooks/useApi' import { ButtonSecondary } from '@/common/components/buttons' import { FailureModal } from '@/common/components/FailureModal' @@ -13,9 +14,8 @@ import { useModal } from '@/common/hooks/useModal' import { useSignAndSendTransaction } from '@/common/hooks/useSignAndSendTransaction' import { transactionMachine } from '@/common/model/machines' import { Address } from '@/common/types' -import { encodeAddress } from '@/accounts/model/encodeAddress' -import { useStakingTransactions } from '@/validators/hooks/useStakingSDK' import { useMyMemberships } from '@/memberships/hooks/useMyMemberships' +import { useStakingTransactions } from '@/validators/hooks/useStakingSDK' import { StakeModalCall } from './types' @@ -66,7 +66,9 @@ const StakeModalInner = ({ validatorAddress }: Props) => { - The transaction was canceled. Please try again if you want to nominate this validator. + + The transaction was canceled. Please try again if you want to nominate this validator. + @@ -109,8 +111,8 @@ const StakeModalInner = ({ validatorAddress }: Props) => { - Note: You must have bonded tokens before you can nominate. If you haven't bonded yet, please{' '} - use the "Bond" action first. Your nomination will take effect in the next era. + Note: You must have bonded tokens before you can nominate. If you haven't bonded yet, + please use the "Bond" action first. Your nomination will take effect in the next era. {!canAfford && paymentInfo?.partialFee && ( diff --git a/packages/ui/src/validators/modals/StakingTransactionModal/StakingTransactionModal.tsx b/packages/ui/src/validators/modals/StakingTransactionModal/StakingTransactionModal.tsx index bc7fdfb795..a37001de47 100644 --- a/packages/ui/src/validators/modals/StakingTransactionModal/StakingTransactionModal.tsx +++ b/packages/ui/src/validators/modals/StakingTransactionModal/StakingTransactionModal.tsx @@ -1,3 +1,4 @@ +import { SubmittableExtrinsic } from '@polkadot/api/types' import React from 'react' import { useApi } from '@/api/hooks/useApi' @@ -6,9 +7,7 @@ import { Modal, ModalBody, ModalFooter, ModalHeader } from '@/common/components/ import { RowGapBlock } from '@/common/components/page/PageContent' import { TextMedium } from '@/common/components/typography' import { useModal } from '@/common/hooks/useModal' -import { SubmittableExtrinsic } from '@polkadot/api/types' import { Address } from '@/common/types' - import { StakingTransactionModalCall } from '@/validators/modals/StakingTransactionModal/types' interface Props { @@ -25,26 +24,26 @@ export const StakingTransactionModal = ({ title, description, transaction, signe const handleTransaction = async () => { if (!transaction || !api) { - console.error('Transaction or API not available') + //console.error('Transaction or API not available') return } try { // TODO: Implement proper transaction signing and submission - console.log(`Executing ${title} transaction for validator:`, validatorAddress) - console.log('Transaction:', transaction) - console.log('Signer:', signer) - + //console.log(`Executing ${title} transaction for validator:`, validatorAddress) + //console.log('Transaction:', transaction) + //console.log('Signer:', signer) + // For now, just show success message // In the actual implementation, this would: // 1. Sign the transaction // 2. Submit it to the network // 3. Wait for confirmation // 4. Show success/error states - + hideModal() } catch (error) { - console.error('Transaction failed:', error) + //console.error('Transaction failed:', error) } } diff --git a/packages/ui/src/validators/modals/StopStakingModal/index.ts b/packages/ui/src/validators/modals/StopStakingModal/index.ts index 023aa0f324..4727a6dd59 100644 --- a/packages/ui/src/validators/modals/StopStakingModal/index.ts +++ b/packages/ui/src/validators/modals/StopStakingModal/index.ts @@ -1,5 +1,4 @@ import { ModalWithDataCall } from '@/common/providers/modal/types' - import { MyStakingRole } from '@/validators/hooks/useMyStashPositions' export type StopStakingModalCall = ModalWithDataCall< @@ -11,5 +10,3 @@ export type StopStakingModalCall = ModalWithDataCall< > export * from './StopStakingModal' - - diff --git a/packages/ui/src/validators/modals/UnbondStakingModal/index.ts b/packages/ui/src/validators/modals/UnbondStakingModal/index.ts index 64ff558d7e..f469b3ca27 100644 --- a/packages/ui/src/validators/modals/UnbondStakingModal/index.ts +++ b/packages/ui/src/validators/modals/UnbondStakingModal/index.ts @@ -12,5 +12,3 @@ export type UnbondStakingModalCall = ModalWithDataCall< > export * from './UnbondStakingModal' - - diff --git a/packages/ui/src/validators/modals/validatorCard/ValidatorCard.tsx b/packages/ui/src/validators/modals/validatorCard/ValidatorCard.tsx index 5592e54471..70c1e63a3b 100644 --- a/packages/ui/src/validators/modals/validatorCard/ValidatorCard.tsx +++ b/packages/ui/src/validators/modals/validatorCard/ValidatorCard.tsx @@ -31,62 +31,71 @@ interface Props { isNominated?: boolean } -export const ValidatorCard = React.memo(({ cardNumber, validator, eraIndex, selectCard, totalCards, isNominated = false }: Props) => { - const hideModal = () => { - selectCard(null) - } - const onBackgroundClick = (e: React.MouseEvent) => { - if (e.target === e.currentTarget) { - hideModal() +export const ValidatorCard = React.memo( + ({ cardNumber, validator, eraIndex, selectCard, totalCards, isNominated = false }: Props) => { + const hideModal = () => { + selectCard(null) } - } - useEscape(() => hideModal()) - const [activeTab, setActiveTab] = useState('Details') + const onBackgroundClick = (e: React.MouseEvent) => { + if (e.target === e.currentTarget) { + hideModal() + } + } + useEscape(() => hideModal()) + const [activeTab, setActiveTab] = useState('Details') - const onClickRight = () => { - selectCard(cardNumber + 1) - } - const onClickLeft = () => { - selectCard(cardNumber - 1) - } + const onClickRight = () => { + selectCard(cardNumber + 1) + } + const onClickLeft = () => { + selectCard(cardNumber - 1) + } - const title = `Validor ${cardNumber} of ${totalCards}` - const tabs = [ - { - title: 'Validator details', - active: activeTab === 'Details', - onClick: () => setActiveTab('Details'), - }, - { title: 'Nominators', active: activeTab === 'Nominators', onClick: () => setActiveTab('Nominators') }, - ] + const title = `Validor ${cardNumber} of ${totalCards}` + const tabs = [ + { + title: 'Validator details', + active: activeTab === 'Details', + onClick: () => setActiveTab('Details'), + }, + { title: 'Nominators', active: activeTab === 'Nominators', onClick: () => setActiveTab('Nominators') }, + ] - return ( - - - - - {title} - - - - - = totalCards} - onClick={onClickRight} - > - - - - - - - - - {activeTab === 'Details' && } - {activeTab === 'Nominators' && } - - - ) -}) + return ( + + + + + {title} + + + + + = totalCards} + onClick={onClickRight} + > + + + + + + + + + {activeTab === 'Details' && ( + + )} + {activeTab === 'Nominators' && } + + + ) + } +) diff --git a/packages/ui/src/validators/types/index.ts b/packages/ui/src/validators/types/index.ts index 39739511b8..de888c6dd6 100644 --- a/packages/ui/src/validators/types/index.ts +++ b/packages/ui/src/validators/types/index.ts @@ -2,4 +2,4 @@ export * from './Validator' // filter export type Verification = null | 'verified' | 'unverified' -export type State = null | 'active' | 'waiting' \ No newline at end of file +export type State = null | 'active' | 'waiting' diff --git a/packages/ui/src/working-groups/queries/__generated__/workingGroups.generated.tsx b/packages/ui/src/working-groups/queries/__generated__/workingGroups.generated.tsx index e84351fd2e..557442eb8f 100644 --- a/packages/ui/src/working-groups/queries/__generated__/workingGroups.generated.tsx +++ b/packages/ui/src/working-groups/queries/__generated__/workingGroups.generated.tsx @@ -58,10 +58,10 @@ export type WorkerFieldsFragment = { } group: { __typename: 'WorkingGroup'; id: string; name: string } status: - | { __typename: 'WorkerStatusActive' } - | { __typename: 'WorkerStatusLeaving' } - | { __typename: 'WorkerStatusLeft' } - | { __typename: 'WorkerStatusTerminated' } + | { __typename: 'WorkerStatusActive' } + | { __typename: 'WorkerStatusLeaving' } + | { __typename: 'WorkerStatusLeft' } + | { __typename: 'WorkerStatusTerminated' } } export type PastWorkerFieldsFragment = { @@ -106,26 +106,26 @@ export type PastWorkerFieldsFragment = { }> | null } status: - | { __typename: 'WorkerStatusActive' } - | { __typename: 'WorkerStatusLeaving' } - | { - __typename: 'WorkerStatusLeft' - workerExitedEvent?: { - __typename: 'WorkerExitedEvent' - createdAt: any - inBlock: number - network: Types.Network - } | null - } - | { - __typename: 'WorkerStatusTerminated' - terminatedWorkerEvent?: { - __typename: 'TerminatedWorkerEvent' - createdAt: any - inBlock: number - network: Types.Network - } | null - } + | { __typename: 'WorkerStatusActive' } + | { __typename: 'WorkerStatusLeaving' } + | { + __typename: 'WorkerStatusLeft' + workerExitedEvent?: { + __typename: 'WorkerExitedEvent' + createdAt: any + inBlock: number + network: Types.Network + } | null + } + | { + __typename: 'WorkerStatusTerminated' + terminatedWorkerEvent?: { + __typename: 'TerminatedWorkerEvent' + createdAt: any + inBlock: number + network: Types.Network + } | null + } entry: { __typename: 'OpeningFilledEvent'; createdAt: any; inBlock: number; network: Types.Network } } @@ -185,10 +185,10 @@ export type WorkerDetailedFieldsFragment = { } group: { __typename: 'WorkingGroup'; id: string; name: string } status: - | { __typename: 'WorkerStatusActive' } - | { __typename: 'WorkerStatusLeaving' } - | { __typename: 'WorkerStatusLeft' } - | { __typename: 'WorkerStatusTerminated' } + | { __typename: 'WorkerStatusActive' } + | { __typename: 'WorkerStatusLeaving' } + | { __typename: 'WorkerStatusLeft' } + | { __typename: 'WorkerStatusTerminated' } } export type WorkingGroupFieldsFragment = { @@ -348,10 +348,10 @@ export type GetWorkersQuery = { } group: { __typename: 'WorkingGroup'; id: string; name: string } status: - | { __typename: 'WorkerStatusActive' } - | { __typename: 'WorkerStatusLeaving' } - | { __typename: 'WorkerStatusLeft' } - | { __typename: 'WorkerStatusTerminated' } + | { __typename: 'WorkerStatusActive' } + | { __typename: 'WorkerStatusLeaving' } + | { __typename: 'WorkerStatusLeft' } + | { __typename: 'WorkerStatusTerminated' } }> } @@ -406,26 +406,26 @@ export type GetPastWorkersQuery = { }> | null } status: - | { __typename: 'WorkerStatusActive' } - | { __typename: 'WorkerStatusLeaving' } - | { - __typename: 'WorkerStatusLeft' - workerExitedEvent?: { - __typename: 'WorkerExitedEvent' - createdAt: any - inBlock: number - network: Types.Network - } | null - } - | { - __typename: 'WorkerStatusTerminated' - terminatedWorkerEvent?: { - __typename: 'TerminatedWorkerEvent' - createdAt: any - inBlock: number - network: Types.Network - } | null - } + | { __typename: 'WorkerStatusActive' } + | { __typename: 'WorkerStatusLeaving' } + | { + __typename: 'WorkerStatusLeft' + workerExitedEvent?: { + __typename: 'WorkerExitedEvent' + createdAt: any + inBlock: number + network: Types.Network + } | null + } + | { + __typename: 'WorkerStatusTerminated' + terminatedWorkerEvent?: { + __typename: 'TerminatedWorkerEvent' + createdAt: any + inBlock: number + network: Types.Network + } | null + } entry: { __typename: 'OpeningFilledEvent'; createdAt: any; inBlock: number; network: Types.Network } }> } @@ -501,10 +501,10 @@ export type GetDetailedWorkersQuery = { } group: { __typename: 'WorkingGroup'; id: string; name: string } status: - | { __typename: 'WorkerStatusActive' } - | { __typename: 'WorkerStatusLeaving' } - | { __typename: 'WorkerStatusLeft' } - | { __typename: 'WorkerStatusTerminated' } + | { __typename: 'WorkerStatusActive' } + | { __typename: 'WorkerStatusLeaving' } + | { __typename: 'WorkerStatusLeft' } + | { __typename: 'WorkerStatusTerminated' } }> } @@ -570,10 +570,10 @@ export type GetWorkerQuery = { } group: { __typename: 'WorkingGroup'; id: string; name: string } status: - | { __typename: 'WorkerStatusActive' } - | { __typename: 'WorkerStatusLeaving' } - | { __typename: 'WorkerStatusLeft' } - | { __typename: 'WorkerStatusTerminated' } + | { __typename: 'WorkerStatusActive' } + | { __typename: 'WorkerStatusLeaving' } + | { __typename: 'WorkerStatusLeft' } + | { __typename: 'WorkerStatusTerminated' } } | null } @@ -632,18 +632,18 @@ export type WorkingGroupOpeningFieldsFragment = { expectedEnding?: any | null } status: - | { __typename: 'OpeningStatusCancelled' } - | { __typename: 'OpeningStatusFilled' } - | { __typename: 'OpeningStatusOpen' } + | { __typename: 'OpeningStatusCancelled' } + | { __typename: 'OpeningStatusFilled' } + | { __typename: 'OpeningStatusOpen' } applications: Array<{ __typename: 'WorkingGroupApplication' id: string status: - | { __typename: 'ApplicationStatusAccepted' } - | { __typename: 'ApplicationStatusCancelled' } - | { __typename: 'ApplicationStatusPending' } - | { __typename: 'ApplicationStatusRejected' } - | { __typename: 'ApplicationStatusWithdrawn' } + | { __typename: 'ApplicationStatusAccepted' } + | { __typename: 'ApplicationStatusCancelled' } + | { __typename: 'ApplicationStatusPending' } + | { __typename: 'ApplicationStatusRejected' } + | { __typename: 'ApplicationStatusWithdrawn' } }> openingfilledeventopening?: Array<{ __typename: 'OpeningFilledEvent' @@ -664,11 +664,11 @@ export type WorkingGroupOpeningDetailedFieldsFragment = { __typename: 'WorkingGroupApplication' id: string status: - | { __typename: 'ApplicationStatusAccepted' } - | { __typename: 'ApplicationStatusCancelled' } - | { __typename: 'ApplicationStatusPending' } - | { __typename: 'ApplicationStatusRejected' } - | { __typename: 'ApplicationStatusWithdrawn' } + | { __typename: 'ApplicationStatusAccepted' } + | { __typename: 'ApplicationStatusCancelled' } + | { __typename: 'ApplicationStatusPending' } + | { __typename: 'ApplicationStatusRejected' } + | { __typename: 'ApplicationStatusWithdrawn' } applicant: { __typename: 'Membership' id: string @@ -717,9 +717,9 @@ export type WorkingGroupOpeningDetailedFieldsFragment = { expectedEnding?: any | null } status: - | { __typename: 'OpeningStatusCancelled' } - | { __typename: 'OpeningStatusFilled' } - | { __typename: 'OpeningStatusOpen' } + | { __typename: 'OpeningStatusCancelled' } + | { __typename: 'OpeningStatusFilled' } + | { __typename: 'OpeningStatusOpen' } openingfilledeventopening?: Array<{ __typename: 'OpeningFilledEvent' workersHired: Array<{ __typename: 'Worker'; id: string }> @@ -775,18 +775,18 @@ export type GetWorkingGroupOpeningsQuery = { expectedEnding?: any | null } status: - | { __typename: 'OpeningStatusCancelled' } - | { __typename: 'OpeningStatusFilled' } - | { __typename: 'OpeningStatusOpen' } + | { __typename: 'OpeningStatusCancelled' } + | { __typename: 'OpeningStatusFilled' } + | { __typename: 'OpeningStatusOpen' } applications: Array<{ __typename: 'WorkingGroupApplication' id: string status: - | { __typename: 'ApplicationStatusAccepted' } - | { __typename: 'ApplicationStatusCancelled' } - | { __typename: 'ApplicationStatusPending' } - | { __typename: 'ApplicationStatusRejected' } - | { __typename: 'ApplicationStatusWithdrawn' } + | { __typename: 'ApplicationStatusAccepted' } + | { __typename: 'ApplicationStatusCancelled' } + | { __typename: 'ApplicationStatusPending' } + | { __typename: 'ApplicationStatusRejected' } + | { __typename: 'ApplicationStatusWithdrawn' } }> openingfilledeventopening?: Array<{ __typename: 'OpeningFilledEvent' @@ -828,11 +828,11 @@ export type GetWorkingGroupOpeningQuery = { __typename: 'WorkingGroupApplication' id: string status: - | { __typename: 'ApplicationStatusAccepted' } - | { __typename: 'ApplicationStatusCancelled' } - | { __typename: 'ApplicationStatusPending' } - | { __typename: 'ApplicationStatusRejected' } - | { __typename: 'ApplicationStatusWithdrawn' } + | { __typename: 'ApplicationStatusAccepted' } + | { __typename: 'ApplicationStatusCancelled' } + | { __typename: 'ApplicationStatusPending' } + | { __typename: 'ApplicationStatusRejected' } + | { __typename: 'ApplicationStatusWithdrawn' } applicant: { __typename: 'Membership' id: string @@ -881,9 +881,9 @@ export type GetWorkingGroupOpeningQuery = { expectedEnding?: any | null } status: - | { __typename: 'OpeningStatusCancelled' } - | { __typename: 'OpeningStatusFilled' } - | { __typename: 'OpeningStatusOpen' } + | { __typename: 'OpeningStatusCancelled' } + | { __typename: 'OpeningStatusFilled' } + | { __typename: 'OpeningStatusOpen' } openingfilledeventopening?: Array<{ __typename: 'OpeningFilledEvent' workersHired: Array<{ __typename: 'Worker'; id: string }> @@ -1163,11 +1163,11 @@ export type WorkingGroupApplicationFieldsFragment = { }> | null } status: - | { __typename: 'ApplicationStatusAccepted' } - | { __typename: 'ApplicationStatusCancelled' } - | { __typename: 'ApplicationStatusPending' } - | { __typename: 'ApplicationStatusRejected' } - | { __typename: 'ApplicationStatusWithdrawn' } + | { __typename: 'ApplicationStatusAccepted' } + | { __typename: 'ApplicationStatusCancelled' } + | { __typename: 'ApplicationStatusPending' } + | { __typename: 'ApplicationStatusRejected' } + | { __typename: 'ApplicationStatusWithdrawn' } createdInEvent: { __typename: 'AppliedOnOpeningEvent'; createdAt: any; inBlock: number; network: Types.Network } } @@ -1237,11 +1237,11 @@ export type GetWorkingGroupApplicationsQuery = { }> | null } status: - | { __typename: 'ApplicationStatusAccepted' } - | { __typename: 'ApplicationStatusCancelled' } - | { __typename: 'ApplicationStatusPending' } - | { __typename: 'ApplicationStatusRejected' } - | { __typename: 'ApplicationStatusWithdrawn' } + | { __typename: 'ApplicationStatusAccepted' } + | { __typename: 'ApplicationStatusCancelled' } + | { __typename: 'ApplicationStatusPending' } + | { __typename: 'ApplicationStatusRejected' } + | { __typename: 'ApplicationStatusWithdrawn' } createdInEvent: { __typename: 'AppliedOnOpeningEvent'; createdAt: any; inBlock: number; network: Types.Network } }> } @@ -1331,11 +1331,11 @@ export type GetWorkingGroupApplicationQuery = { }> | null } status: - | { __typename: 'ApplicationStatusAccepted' } - | { __typename: 'ApplicationStatusCancelled' } - | { __typename: 'ApplicationStatusPending' } - | { __typename: 'ApplicationStatusRejected' } - | { __typename: 'ApplicationStatusWithdrawn' } + | { __typename: 'ApplicationStatusAccepted' } + | { __typename: 'ApplicationStatusCancelled' } + | { __typename: 'ApplicationStatusPending' } + | { __typename: 'ApplicationStatusRejected' } + | { __typename: 'ApplicationStatusWithdrawn' } createdInEvent: { __typename: 'AppliedOnOpeningEvent'; createdAt: any; inBlock: number; network: Types.Network } } | null } @@ -1460,13 +1460,13 @@ export type GetWorkerUnstakingDetailsQuery = { workerByUniqueInput?: { __typename: 'Worker' status: - | { __typename: 'WorkerStatusActive' } - | { - __typename: 'WorkerStatusLeaving' - workerStartedLeavingEvent?: { __typename: 'WorkerStartedLeavingEvent'; createdAt: any } | null - } - | { __typename: 'WorkerStatusLeft' } - | { __typename: 'WorkerStatusTerminated' } + | { __typename: 'WorkerStatusActive' } + | { + __typename: 'WorkerStatusLeaving' + workerStartedLeavingEvent?: { __typename: 'WorkerStartedLeavingEvent'; createdAt: any } | null + } + | { __typename: 'WorkerStatusLeft' } + | { __typename: 'WorkerStatusTerminated' } application: { __typename: 'WorkingGroupApplication' opening: { __typename: 'WorkingGroupOpening'; unstakingPeriod: number } From d42df45f3751c3a9d811d2ff5cbe3e8c589e2546 Mon Sep 17 00:00:00 2001 From: "l1.media" Date: Tue, 2 Dec 2025 13:13:02 +0100 Subject: [PATCH 45/55] reactivate test --- .../ui/test/proposals/hooks/useProposals.test.tsx | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/packages/ui/test/proposals/hooks/useProposals.test.tsx b/packages/ui/test/proposals/hooks/useProposals.test.tsx index f792f8dad6..7edd1839e6 100644 --- a/packages/ui/test/proposals/hooks/useProposals.test.tsx +++ b/packages/ui/test/proposals/hooks/useProposals.test.tsx @@ -28,14 +28,13 @@ describe('useProposals', () => { }) describe('Status: active | past', () => { - // flaky test: #4887 - //it('Status: active', async () => { - // const result = await loadUseProposals({ status: 'active' }) - // expect(result.proposals.length).toBeGreaterThan(0) - // result.proposals.forEach((proposal) => { - // expect(proposalActiveStatuses.includes(proposal.status)).toBeTruthy() - // }) - //}) + it('Status: active', async () => { + const result = await loadUseProposals({ status: 'active' }) + expect(result.proposals.length).toBeGreaterThan(0) + result.proposals.forEach((proposal) => { + expect(proposalActiveStatuses.includes(proposal.status)).toBeTruthy() + }) + }) it('Status: past', async () => { const result = await loadUseProposals({ status: 'past' }) From b584e744e9f89b160cfd1a529bdf84ab41755c06 Mon Sep 17 00:00:00 2001 From: "l1.media" Date: Wed, 3 Dec 2025 14:52:13 +0100 Subject: [PATCH 46/55] WGL: Vested / Discretionary spending (#4906) --- packages/ui/src/app/GlobalModals.tsx | 3 + .../MemberRoleToggle.stories.tsx | 94 ++++- .../MemberProfile/MemberRoleToggle.tsx | 34 +- .../working-groups/hooks/useIsLeadForGroup.ts | 27 ++ .../PayWorkerModal/PayWorkerModal.stories.tsx | 154 +++++++ .../modals/PayWorkerModal/PayWorkerModal.tsx | 381 ++++++++++++++++++ .../modals/PayWorkerModal/index.ts | 2 + .../modals/PayWorkerModal/machine.ts | 88 ++++ .../modals/PayWorkerModal/types.ts | 8 + .../queries/workingGroups.graphql | 16 + 10 files changed, 801 insertions(+), 6 deletions(-) create mode 100644 packages/ui/src/working-groups/hooks/useIsLeadForGroup.ts create mode 100644 packages/ui/src/working-groups/modals/PayWorkerModal/PayWorkerModal.stories.tsx create mode 100644 packages/ui/src/working-groups/modals/PayWorkerModal/PayWorkerModal.tsx create mode 100644 packages/ui/src/working-groups/modals/PayWorkerModal/index.ts create mode 100644 packages/ui/src/working-groups/modals/PayWorkerModal/machine.ts create mode 100644 packages/ui/src/working-groups/modals/PayWorkerModal/types.ts diff --git a/packages/ui/src/app/GlobalModals.tsx b/packages/ui/src/app/GlobalModals.tsx index ba2964b705..0d85eabee6 100644 --- a/packages/ui/src/app/GlobalModals.tsx +++ b/packages/ui/src/app/GlobalModals.tsx @@ -93,6 +93,7 @@ import { IncreaseWorkerStakeModalCall, } from '@/working-groups/modals/IncreaseWorkerStakeModal' import { LeaveRoleModal, LeaveRoleModalCall } from '@/working-groups/modals/LeaveRoleModal' +import { PayWorkerModal, PayWorkerModalCall } from '@/working-groups/modals/PayWorkerModal' type ModalNamesBase = | ModalName @@ -124,6 +125,7 @@ type ModalNamesBase = | ModalName | ModalName | ModalName + | ModalName | ModalName | ModalName // | ModalName @@ -193,6 +195,7 @@ const modals: Record = { RevealVote: , RecoverBalance: , IncreaseWorkerStake: , + PayWorker: , InviteMemberModal: , OnBoardingModal: , RestoreVotes: , diff --git a/packages/ui/src/memberships/components/MemberProfile/MemberRoleToggle.stories.tsx b/packages/ui/src/memberships/components/MemberProfile/MemberRoleToggle.stories.tsx index 103a7fae03..0980249a27 100644 --- a/packages/ui/src/memberships/components/MemberProfile/MemberRoleToggle.stories.tsx +++ b/packages/ui/src/memberships/components/MemberProfile/MemberRoleToggle.stories.tsx @@ -1,21 +1,85 @@ import { BN_THOUSAND } from '@polkadot/util' -import { Meta, Story } from '@storybook/react' +import { Meta, Story, StoryContext } from '@storybook/react' import BN from 'bn.js' import React from 'react' import { TemplateBlock, ModalBlock, WhiteBlock } from '@/common/components/storybookParts/previewStyles' +import { member } from '@/mocks/data/members' +import { MocksParameters } from '@/mocks/providers' import { MockApolloProvider } from '@/mocks/components/storybook/MockApolloProvider' import { randomBlock } from '@/mocks/helpers/randomBlock' +import { Member } from '@/memberships/types' +import { GetRoleAccountsDocument } from '@/working-groups/queries' import { MemberRoleToggle, MemberRoleToggleProps } from './MemberRoleToggle' +const createMockMember = (): Member => { + const membership = member('alice') + return { + id: membership.id, + handle: membership.handle, + rootAccount: membership.rootAccount, + controllerAccount: membership.controllerAccount, + boundAccounts: membership.boundAccounts || [], + inviteCount: membership.inviteCount, + roles: [], + isVerified: membership.isVerified, + isFoundingMember: membership.isFoundingMember, + isCouncilMember: membership.isCouncilMember, + createdAt: membership.createdAt, + } +} + export default { title: 'Member/MemberRoleToggle', component: MemberRoleToggle, + parameters: { + mocks: ({ args }: StoryContext): MocksParameters => { + const alice = member('alice') + const roleAccount = args?.role?.roleAccount || 'j4VdDQVdwFYfQ2MvEdLT2EYZx4ALPQQ6yMyZopKoZEQmXcJrT' + const isLead = args?.role?.isLead || false + + return { + accounts: { + active: { + member: alice, + account: { name: 'Alice Account', address: roleAccount }, + }, + list: [ + { member: alice, account: { name: 'Alice Account', address: roleAccount } }, + { member: alice, account: { name: 'Alice Controller', address: alice.controllerAccount } }, + ], + }, + gql: { + queries: [ + { + query: GetRoleAccountsDocument, + resolver: (options) => { + const where = options?.variables?.where + if ( + where?.membership?.id_eq === alice.id && + where?.group?.id_eq === args?.role?.group?.id && + where?.isLead_eq === true + ) { + return { + loading: false, + data: { + workers: isLead ? [{ roleAccount }] : [], + }, + } + } + return { loading: false, data: { workers: [] } } + }, + }, + ], + }, + } + }, + }, } as Meta const Template: Story = (args) => ( - + @@ -29,6 +93,7 @@ const Template: Story = (args) => ( export const Default = Template.bind({}) Default.args = { + member: createMockMember(), role: { id: '123', runtimeId: 12, @@ -50,3 +115,28 @@ Default.args = { status: 'WorkerStatusActive', }, } + +export const AsLead = Template.bind({}) +AsLead.args = { + member: createMockMember(), + role: { + id: '123', + runtimeId: 12, + group: { id: 'forumWorkingGroup', name: 'forum' }, + isLead: true, + membership: { id: '0', controllerAccount: 'j4VdDQVdwFYfQ2MvEdLT2EYZx4ALPQQ6yMyZopKoZEQmXcJrT' }, + rewardPerBlock: BN_THOUSAND, + stake: new BN(192837021), + owedReward: new BN(1000), + minStake: new BN(400), + roleAccount: 'j4VdDQVdwFYfQ2MvEdLT2EYZx4ALPQQ6yMyZopKoZEQmXcJrT', // Same as controllerAccount to show button + rewardAccount: 'j4W7rVcUCxi2crhhjRq46fNDRbVHTjJrz6bKxZwehEMQxZeSf', + stakeAccount: 'j4VdDQVdwFYfQ2MvEdLT2EYZx4ALPQQ6yMyZopKoZEQmXcJrT', + hiredAtBlock: { + ...randomBlock(), + }, + applicationId: '0', + openingId: '0', + status: 'WorkerStatusActive', + }, +} diff --git a/packages/ui/src/memberships/components/MemberProfile/MemberRoleToggle.tsx b/packages/ui/src/memberships/components/MemberProfile/MemberRoleToggle.tsx index 24e767da05..ec176bd39e 100644 --- a/packages/ui/src/memberships/components/MemberProfile/MemberRoleToggle.tsx +++ b/packages/ui/src/memberships/components/MemberProfile/MemberRoleToggle.tsx @@ -3,7 +3,7 @@ import styled from 'styled-components' import { UnknownAccountInfo } from '@/accounts/components/UnknownAccountInfo' import { BlockTime } from '@/common/components/BlockTime' -import { ButtonGhost, ResponsiveButtonsGroup } from '@/common/components/buttons' +import { ButtonGhost, ButtonPrimary, ResponsiveButtonsGroup } from '@/common/components/buttons' import { LinkButtonGhost } from '@/common/components/buttons/LinkButtons' import { ToggleableItem, ToggleButton } from '@/common/components/buttons/Toggle' import { Arrow } from '@/common/components/icons' @@ -14,9 +14,11 @@ import { useModal } from '@/common/hooks/useModal' import { useToggle } from '@/common/hooks/useToggle' import { Member } from '@/memberships/types' import { workerRoleTitle } from '@/working-groups/helpers' +import { useIsLeadForGroup } from '@/working-groups/hooks/useIsLeadForGroup' import { useRewardPeriod } from '@/working-groups/hooks/useRewardPeriod' import { useWorkerEarnings } from '@/working-groups/hooks/useWorkerEarnings' import { ApplicationDetailsModalCall } from '@/working-groups/modals/ApplicationDetailsModal' +import { PayWorkerModalCall } from '@/working-groups/modals/PayWorkerModal' import { WorkerWithDetails } from '@/working-groups/types' export interface MemberRoleToggleProps { @@ -26,12 +28,19 @@ export interface MemberRoleToggleProps { export const MemberRoleToggle = ({ role }: MemberRoleToggleProps) => { const { showModal } = useModal() + const isLead = useIsLeadForGroup(role.group.id) const showApplicationModal = useCallback(() => { showModal({ modal: 'ApplicationDetails', data: { applicationId: role.applicationId }, }) }, [role]) + const showPayWorkerModal = useCallback(() => { + showModal({ + modal: 'PayWorker', + data: { worker: role }, + }) + }, [role]) const { earnings } = useWorkerEarnings(role.id) const rewardPeriod = useRewardPeriod(role.group.id) const [isOpen, toggleOpen] = useToggle() @@ -62,9 +71,16 @@ export const MemberRoleToggle = ({ role }: MemberRoleToggleProps) => { - - - + + + + + {isLead && ( + + Pay Worker + + )} + {/** TODO fix calculation @@ -153,3 +169,13 @@ const MemberRoleTable = styled(SidePaneTable)` display: none; } ` + +const EarnedTotalContainer = styled.div` + display: flex; + align-items: center; + gap: 8px; +` + +const PayWorkerButton = styled(ButtonPrimary)` + margin-left: auto; +` diff --git a/packages/ui/src/working-groups/hooks/useIsLeadForGroup.ts b/packages/ui/src/working-groups/hooks/useIsLeadForGroup.ts new file mode 100644 index 0000000000..7a4e33fab0 --- /dev/null +++ b/packages/ui/src/working-groups/hooks/useIsLeadForGroup.ts @@ -0,0 +1,27 @@ +import { useMemo } from 'react' + +import { useMyAccounts } from '@/accounts/hooks/useMyAccounts' +import { useMyMemberships } from '@/memberships/hooks/useMyMemberships' +import { useRoleAccount } from '@/working-groups/hooks/useRoleAccount' +import { GroupIdName, WorkerStatusToTypename } from '@/working-groups/types' + +export const useIsLeadForGroup = (groupId: GroupIdName): boolean => { + const { active } = useMyMemberships() + const { allAccounts } = useMyAccounts() + const { roleAccount, isLoading } = useRoleAccount({ + membership: { id_eq: active?.id }, + group: { id_eq: groupId }, + isLead_eq: true, + status_json: { isTypeOf_eq: WorkerStatusToTypename.active }, + }) + + return useMemo(() => { + if (isLoading || !roleAccount || !active) { + return false + } + + // Check if the lead worker's role account is in the user's accounts + const accountAddresses = new Set(allAccounts.map((acc) => acc.address)) + return accountAddresses.has(roleAccount) + }, [roleAccount, isLoading, allAccounts, active]) +} diff --git a/packages/ui/src/working-groups/modals/PayWorkerModal/PayWorkerModal.stories.tsx b/packages/ui/src/working-groups/modals/PayWorkerModal/PayWorkerModal.stories.tsx new file mode 100644 index 0000000000..2e55911d2c --- /dev/null +++ b/packages/ui/src/working-groups/modals/PayWorkerModal/PayWorkerModal.stories.tsx @@ -0,0 +1,154 @@ +import { BN_THOUSAND } from '@polkadot/util' +import { Meta, Story } from '@storybook/react' +import BN from 'bn.js' +import React from 'react' +import { HashRouter } from 'react-router-dom' + +import { ModalContext } from '@/common/providers/modal/context' +import { MockApolloProvider } from '@/mocks/components/storybook/MockApolloProvider' +import { member } from '@/mocks/data/members' +import { randomBlock } from '@/mocks/helpers/randomBlock' +import { MocksParameters } from '@/mocks/providers' +import { GetRoleAccountsDocument, GetWorkingGroupDocument } from '@/working-groups/queries' + +import { PayWorkerModal } from './PayWorkerModal' + +const mockWorker = { + id: '123', + runtimeId: 12, + group: { id: 'forumWorkingGroup', name: 'forum' }, + isLead: false, + membership: { id: '0', controllerAccount: 'j4VdDQVdwFYfQ2MvEdLT2EYZx4ALPQQ6yMyZopKoZEQmXcJrT' }, + rewardPerBlock: BN_THOUSAND, + stake: new BN(192837021), + owedReward: new BN(1000), + minStake: new BN(400), + roleAccount: 'j4W7rVcUCxi2crhhjRq46fNDRbVHTjJrz6bKxZwehEMQxZeSf', + rewardAccount: 'j4VdDQVdwFYfQ2MvEdLT2EYZx4ALPQQ6yMyZopKoZEQmXcJrT', + stakeAccount: 'j4VdDQVdwFYfQ2MvEdLT2EYZx4ALPQQ6yMyZopKoZEQmXcJrT', + hiredAtBlock: { + ...randomBlock(), + }, + applicationId: '0', + openingId: '0', + status: 'WorkerStatusActive', +} + +export default { + title: 'WorkingGroup/PayWorkerModal', + component: PayWorkerModal, + parameters: { + mocks: (): MocksParameters => { + const alice = member('alice') + const roleAccount = 'j4VdDQVdwFYfQ2MvEdLT2EYZx4ALPQQ6yMyZopKoZEQmXcJrT' + + return { + accounts: { + active: { + member: alice, + account: { name: 'Alice Role Account', address: roleAccount }, + }, + list: [ + { member: alice, account: { name: 'Alice Role Account', address: roleAccount } }, + { member: alice, account: { name: 'Alice Controller', address: alice.controllerAccount } }, + ], + }, + chain: { + tx: { + forumWorkingGroup: { + spendFromBudget: { + event: 'BudgetSpending', + }, + vestedSpendFromBudget: { + event: 'VestedBudgetSpending', + }, + }, + }, + }, + gql: { + queries: [ + { + query: GetRoleAccountsDocument, + resolver: (options) => { + const where = options?.variables?.where + if ( + where?.membership?.id_eq === alice.id && + where?.group?.id_eq === mockWorker.group.id && + where?.isLead_eq === true + ) { + return { + loading: false, + data: { + workers: [{ roleAccount }], + }, + } + } + return { loading: false, data: { workers: [] } } + }, + }, + { + query: GetWorkingGroupDocument, + resolver: (options) => { + if (options?.variables?.where?.name === mockWorker.group.id) { + return { + loading: false, + data: { + workingGroupByUniqueInput: { + __typename: 'WorkingGroup', + id: mockWorker.group.id, + name: mockWorker.group.name, + budget: '250000000000000', // 250k JOY in planck + metadata: { + __typename: 'WorkingGroupMetadata', + about: 'Mock working group about text', + description: 'Mock working group description', + status: 'Active', + statusMessage: 'All systems go', + }, + workers: [], + leader: { + __typename: 'Worker', + id: 'leader-1', + runtimeId: 1, + stake: '0', + rewardPerBlock: '0', + membershipId: alice.id, + isActive: true, + }, + }, + }, + } + } + return { loading: false, data: { workingGroupByUniqueInput: null } } + }, + }, + ], + }, + } + }, + }, +} as Meta + +const Template: Story = () => { + return ( + + + undefined, + hideModal: () => undefined, + modal: 'PayWorker', + }} + > + + + + + ) +} + +export const Default = Template.bind({}) +Default.args = {} diff --git a/packages/ui/src/working-groups/modals/PayWorkerModal/PayWorkerModal.tsx b/packages/ui/src/working-groups/modals/PayWorkerModal/PayWorkerModal.tsx new file mode 100644 index 0000000000..81cbf6d2b5 --- /dev/null +++ b/packages/ui/src/working-groups/modals/PayWorkerModal/PayWorkerModal.tsx @@ -0,0 +1,381 @@ +import { SubmittableExtrinsic } from '@polkadot/api/types' +import BN from 'bn.js' +import React, { useEffect, useState } from 'react' +import styled from 'styled-components' + +import { SelectAccount } from '@/accounts/components/SelectAccount' +import { useMyAccounts } from '@/accounts/hooks/useMyAccounts' +import { accountOrNamed } from '@/accounts/model/accountOrNamed' +import { Account } from '@/accounts/types' +import { Api } from '@/api' +import { useApi } from '@/api/hooks/useApi' +import { ButtonPrimary, ButtonSecondary } from '@/common/components/buttons' +import { FailureModal } from '@/common/components/FailureModal' +import { InputComponent, InputText, InputTextarea, TokenInput } from '@/common/components/forms' +import { Modal, ModalBody, ModalFooter, ModalHeader } from '@/common/components/Modal' +import { SuccessModal } from '@/common/components/SuccessModal' +import { TextMedium } from '@/common/components/typography' +import { useCurrentBlockNumber } from '@/common/hooks/useCurrentBlockNumber' +import { useMachine } from '@/common/hooks/useMachine' +import { useModal } from '@/common/hooks/useModal' +import { SignTransactionModal } from '@/common/modals/SignTransactionModal/SignTransactionModal' +import { useMyMemberships } from '@/memberships/hooks/useMyMemberships' +import { useRoleAccount } from '@/working-groups/hooks/useRoleAccount' +import { useWorkingGroup } from '@/working-groups/hooks/useWorkingGroup' +import { getGroup } from '@/working-groups/model/getGroup' +import { WorkerStatusToTypename } from '@/working-groups/types' + +import { payWorkerMachine } from './machine' +import { PayWorkerModalCall, PaymentType } from './types' + +const MIN_STARTING_BLOCK_OFFSET = 10 + +const getTransaction = ( + api: Api, + groupId: string, + paymentType: PaymentType, + accountId: string, + amount: BN, + rationale: string, + perBlock?: BN, + startingBlock?: number +): SubmittableExtrinsic<'rxjs'> | undefined => { + const group = getGroup(api, groupId as any) + if (!group) return undefined + + if (paymentType === 'discretionary') { + return group.spendFromBudget(accountId, amount, rationale) + } else { + if (!perBlock || startingBlock === undefined) return undefined + return group.vestedSpendFromBudget(accountId, { locked: amount, perBlock, startingBlock }, rationale) + } +} + +export const PayWorkerModal = () => { + const { api } = useApi() + const { hideModal, modalData } = useModal() + const { worker } = modalData + const { active } = useMyMemberships() + const { allAccounts } = useMyAccounts() + const currentBlock = useCurrentBlockNumber() + const [state, send] = useMachine(payWorkerMachine) + const [paymentType, setPaymentType] = useState(null) + const [selectedAccount, setSelectedAccount] = useState(() => + accountOrNamed(allAccounts, worker.rewardAccount, 'Worker reward account') + ) + + // Update selected account when accounts load or worker changes + useEffect(() => { + if (allAccounts.length > 0 && !selectedAccount) { + setSelectedAccount(accountOrNamed(allAccounts, worker.rewardAccount, 'Worker reward account')) + } + }, [allAccounts, worker.rewardAccount, selectedAccount]) + const [amount, setAmount] = useState() + const [rationale, setRationale] = useState('') + const [perBlock, setPerBlock] = useState() + const [startingBlockInput, setStartingBlockInput] = useState('') + + const { roleAccount, isLoading: isLoadingRoleAccount } = useRoleAccount({ + membership: { id_eq: active?.id }, + group: { id_eq: worker.group.id }, + isLead_eq: true, + status_json: { isTypeOf_eq: WorkerStatusToTypename.active }, + }) + const { group: workingGroup, isLoading: isLoadingWorkingGroup } = useWorkingGroup({ name: worker.group.id }) + + if (!api) { + return null + } + + // Show error if user is not a lead (only check in initial state) + if (state.matches('selectPaymentType') && !isLoadingRoleAccount && !roleAccount) { + return You must be a lead for this working group to pay workers. + } + + // Show loading state while checking role account (only in initial state) + if (state.matches('selectPaymentType') && isLoadingRoleAccount) { + return ( + + + + Loading... + + + ) + } + + if (state.matches('selectPaymentType')) { + return ( + + + + Select payment type: + + { + setPaymentType('discretionary') + send('SELECT_TYPE', { paymentType: 'discretionary' }) + }} + > + Discretionary Spending (spendFromBudget) + + { + setPaymentType('vested') + send('SELECT_TYPE', { paymentType: 'vested' }) + }} + > + Vested Spending (vestedSpendFromBudget) + + + + + ) + } + + if (state.matches('prepare')) { + // Use paymentType from machine context if available, otherwise use local state + const currentPaymentType = state.context.paymentType || paymentType + const isVested = currentPaymentType === 'vested' + const accountId = selectedAccount?.address + const minStartingBlockBn = currentBlock ? currentBlock.addn(MIN_STARTING_BLOCK_OFFSET) : undefined + const trimmedStartingBlockInput = startingBlockInput.trim() + const availableBudget = workingGroup?.budget + const hasInsufficientBudget = Boolean(amount && availableBudget && amount.gt(availableBudget)) + const amountMessage = (() => { + if (isLoadingWorkingGroup) { + return 'Checking available budget...' + } + if (!availableBudget) { + return 'Could not fetch group budget. Try again in a moment.' + } + if (!amount || amount.isZero()) { + return `Available budget: ${availableBudget.div(new BN(10000000000)).toString()} JOY` + } + if (hasInsufficientBudget) { + return `Amount exceeds available budget (${availableBudget.div(new BN(10000000000)).toString()} JOY).` + } + return `Available budget: ${availableBudget.div(new BN(10000000000)).toString()} JOY` + })() + const startingBlockEvaluation = (() => { + if (!isVested) { + return { resolved: undefined, error: undefined, info: undefined } + } + const baseBlock = currentBlock + const minBlock = minStartingBlockBn + + if (!trimmedStartingBlockInput) { + if (!minBlock) { + return { + resolved: undefined, + error: 'Waiting for latest block number...', + info: undefined, + } + } + return { + resolved: minBlock, + error: undefined, + info: `Will use block ${minBlock.toString()} (current block + ${MIN_STARTING_BLOCK_OFFSET}).`, + } + } + + const isRelative = trimmedStartingBlockInput.startsWith('+') + const numericPart = isRelative ? trimmedStartingBlockInput.slice(1) : trimmedStartingBlockInput + + if (!/^\d+$/.test(numericPart)) { + return { + resolved: undefined, + error: 'Enter a positive number or +offset', + info: undefined, + } + } + + const numericBn = new BN(numericPart) + let targetBn: BN | undefined + + if (isRelative) { + if (!baseBlock) { + return { + resolved: undefined, + error: 'Waiting for current block to handle relative value', + info: undefined, + } + } + targetBn = baseBlock.add(numericBn) + } else { + targetBn = numericBn + } + + if (minBlock && targetBn.lt(minBlock)) { + return { + resolved: undefined, + error: `Block must be at least ${minBlock.toString()}`, + info: undefined, + } + } + + return { + resolved: targetBn, + error: undefined, + info: `Will use block ${targetBn.toString()}${ + isRelative && baseBlock ? ` (current block ${baseBlock.toString()} + ${numericPart})` : '' + }.`, + } + })() + + const resolvedStartingBlock = startingBlockEvaluation.resolved?.toNumber() + const perBlockMessage = perBlock + ? `Converted to ${perBlock.toString()} HAPI for the transaction.` + : 'Enter the amount in JOY; it will be converted to HAPI automatically.' + const canSubmit = + accountId && + amount && + !amount.isZero() && + rationale && + !hasInsufficientBudget && + (!isVested || + (perBlock && !perBlock.isZero() && resolvedStartingBlock !== undefined && !startingBlockEvaluation.error)) + + return ( + + + + + + + + + setAmount(value)} placeholder="0" /> + + + {isVested && ( + <> + + setPerBlock(value)} + placeholder="0" + /> + + + + setStartingBlockInput(event.target.value)} + placeholder={minStartingBlockBn?.toString()} + /> + + + )} + + + setRationale(e.target.value)} + placeholder="Reason for payment" + /> + + + + { + if (canSubmit && accountId && amount && rationale) { + send({ + type: 'DONE', + form: { + paymentType: currentPaymentType!, + accountId, + amount, + rationale, + perBlock, + startingBlock: resolvedStartingBlock, + }, + }) + } + }} + disabled={!canSubmit} + > + Continue + + + + ) + } + + if (state.matches('transaction') && state.context.accountId && state.context.amount && state.context.rationale) { + // Ensure we have roleAccount before proceeding with transaction + if (!roleAccount) { + return ( + Unable to proceed: role account not found. Please try again. + ) + } + + const transaction = getTransaction( + api, + worker.group.id, + state.context.paymentType!, + state.context.accountId, + state.context.amount, + state.context.rationale, + state.context.perBlock, + state.context.startingBlock + ) + + if (!transaction) { + return Failed to create transaction. Please try again. + } + + return ( + + + You are about to pay {state.context.amount.toString()} JOY to worker {worker.id} using{' '} + {state.context.paymentType === 'discretionary' ? 'discretionary spending' : 'vested spending'}. + + + ) + } + + if (state.matches('success')) { + return + } + + if (state.matches('error')) { + return ( + + There was a problem paying the worker. + + ) + } + + return null +} + +const PaymentTypeButtons = styled.div` + display: flex; + flex-direction: column; + gap: 12px; + margin-top: 16px; +` diff --git a/packages/ui/src/working-groups/modals/PayWorkerModal/index.ts b/packages/ui/src/working-groups/modals/PayWorkerModal/index.ts new file mode 100644 index 0000000000..d086fc84fd --- /dev/null +++ b/packages/ui/src/working-groups/modals/PayWorkerModal/index.ts @@ -0,0 +1,2 @@ +export { PayWorkerModal } from './PayWorkerModal' +export type { PayWorkerModalCall, PaymentType } from './types' diff --git a/packages/ui/src/working-groups/modals/PayWorkerModal/machine.ts b/packages/ui/src/working-groups/modals/PayWorkerModal/machine.ts new file mode 100644 index 0000000000..bad7f106bf --- /dev/null +++ b/packages/ui/src/working-groups/modals/PayWorkerModal/machine.ts @@ -0,0 +1,88 @@ +import { EventRecord } from '@polkadot/types/interfaces/system' +import BN from 'bn.js' +import { assign, createMachine } from 'xstate' + +import { transactionModalFinalStatusesFactory } from '@/common/modals/utils' +import { + isTransactionCanceled, + isTransactionError, + isTransactionSuccess, + transactionMachine, +} from '@/common/model/machines' +import { Address, EmptyObject } from '@/common/types' + +import { PaymentType } from './types' + +interface PayWorkerContext { + paymentType?: PaymentType + accountId?: Address + amount?: BN + rationale?: string + // For vested payments + perBlock?: BN + startingBlock?: number +} + +interface TransactionContext { + transactionEvents?: EventRecord[] +} + +type Context = PayWorkerContext & TransactionContext + +type PayWorkerState = + | { value: 'selectPaymentType'; context: EmptyObject } + | { value: 'prepare'; context: Required> } + | { value: 'transaction'; context: Required } + | { value: 'success'; context: Required } + | { value: 'error'; context: Required } + | { value: 'canceled'; context: Required } + +export type PayWorkerEvent = + | { type: 'SELECT_TYPE'; paymentType: PaymentType } + | { type: 'DONE'; form: PayWorkerContext } + | { type: 'SUCCESS' } + | { type: 'ERROR' } + +export const payWorkerMachine = createMachine({ + initial: 'selectPaymentType', + states: { + selectPaymentType: { + on: { + SELECT_TYPE: { + target: 'prepare', + actions: assign({ paymentType: (_, event) => event.paymentType }), + }, + }, + }, + prepare: { + on: { + DONE: { + target: 'transaction', + actions: assign((_, event) => event.form), + }, + }, + }, + transaction: { + invoke: { + id: 'transaction', + src: transactionMachine, + onDone: [ + { + target: 'success', + cond: isTransactionSuccess, + }, + { + target: 'error', + cond: isTransactionError, + actions: assign({ transactionEvents: (context, event) => event.data.events }), + }, + { + target: 'canceled', + cond: isTransactionCanceled, + }, + ], + }, + }, + ...transactionModalFinalStatusesFactory(), + }, +}) diff --git a/packages/ui/src/working-groups/modals/PayWorkerModal/types.ts b/packages/ui/src/working-groups/modals/PayWorkerModal/types.ts new file mode 100644 index 0000000000..2dd2a9ca61 --- /dev/null +++ b/packages/ui/src/working-groups/modals/PayWorkerModal/types.ts @@ -0,0 +1,8 @@ +import { ModalWithDataCall } from '@/common/providers/modal/types' + +import { WorkerWithDetails } from '../../types' + +export type PayWorkerModalCall = ModalWithDataCall<'PayWorker', { worker: WorkerWithDetails }> + +export type PaymentType = 'discretionary' | 'vested' + diff --git a/packages/ui/src/working-groups/queries/workingGroups.graphql b/packages/ui/src/working-groups/queries/workingGroups.graphql index 7b60ce6c51..1a20900242 100644 --- a/packages/ui/src/working-groups/queries/workingGroups.graphql +++ b/packages/ui/src/working-groups/queries/workingGroups.graphql @@ -116,6 +116,22 @@ query GetBudgetSpending($where: BudgetSpendingEventWhereInput) { } } +fragment VestedBudgetSpendingEventFields on VestedBudgetSpendingEvent { + id + groupId + receiver + amount + perBlock + startingBlock + rationale +} + +query GetVestedBudgetSpending($where: VestedBudgetSpendingEventWhereInput) { + vestedBudgetSpendingEvents(where: $where) { + ...VestedBudgetSpendingEventFields + } +} + fragment RewardPaidEventFields on RewardPaidEvent { id amount From be5909491954a36cdb0f7fb7c16094c25118c9a6 Mon Sep 17 00:00:00 2001 From: "l1.media" Date: Wed, 3 Dec 2025 15:08:36 +0100 Subject: [PATCH 47/55] reactivate Validator tests --- .../ui/src/app/pages/Validators/ValidatorList.stories.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/ui/src/app/pages/Validators/ValidatorList.stories.tsx b/packages/ui/src/app/pages/Validators/ValidatorList.stories.tsx index 1228913226..ba5c1a66d6 100644 --- a/packages/ui/src/app/pages/Validators/ValidatorList.stories.tsx +++ b/packages/ui/src/app/pages/Validators/ValidatorList.stories.tsx @@ -172,12 +172,12 @@ export const TestsFilters: Story = { await selectFromDropdown(screen, stateFilter, 'active') await waitFor(() => expect(screen.queryAllByRole('button', { name: 'Nominate' })).toHaveLength(3)) await userEvent.click(screen.getByText('Clear all filters')) - //await waitFor(() => expect(screen.queryAllByRole('button', { name: 'Nominate' })).toHaveLength(7)) + await waitFor(() => expect(screen.queryAllByRole('button', { name: 'Nominate' })).toHaveLength(7)) await userEvent.type(searchElement, 'alice{enter}') await waitFor(() => expect(screen.queryAllByRole('button', { name: 'Nominate' })).toHaveLength(2)) expect(screen.queryByText('Clear all filters')) await userEvent.click(screen.getByText('Clear all filters')) - //await waitFor(() => expect(screen.queryAllByRole('button', { name: 'Nominate' })).toHaveLength(7)) + await waitFor(() => expect(screen.queryAllByRole('button', { name: 'Nominate' })).toHaveLength(7)) }) await step('Sort', async () => { From 7562007d3dfd6559fb931cc1a085c550d1e06720 Mon Sep 17 00:00:00 2001 From: "l1.media" Date: Wed, 3 Dec 2025 15:17:05 +0100 Subject: [PATCH 48/55] lint --- .../components/MemberProfile/MemberRoleToggle.stories.tsx | 6 +++--- .../ui/src/working-groups/modals/PayWorkerModal/types.ts | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/ui/src/memberships/components/MemberProfile/MemberRoleToggle.stories.tsx b/packages/ui/src/memberships/components/MemberProfile/MemberRoleToggle.stories.tsx index 0980249a27..e3638fcf81 100644 --- a/packages/ui/src/memberships/components/MemberProfile/MemberRoleToggle.stories.tsx +++ b/packages/ui/src/memberships/components/MemberProfile/MemberRoleToggle.stories.tsx @@ -4,11 +4,11 @@ import BN from 'bn.js' import React from 'react' import { TemplateBlock, ModalBlock, WhiteBlock } from '@/common/components/storybookParts/previewStyles' -import { member } from '@/mocks/data/members' -import { MocksParameters } from '@/mocks/providers' +import { Member } from '@/memberships/types' import { MockApolloProvider } from '@/mocks/components/storybook/MockApolloProvider' +import { member } from '@/mocks/data/members' import { randomBlock } from '@/mocks/helpers/randomBlock' -import { Member } from '@/memberships/types' +import { MocksParameters } from '@/mocks/providers' import { GetRoleAccountsDocument } from '@/working-groups/queries' import { MemberRoleToggle, MemberRoleToggleProps } from './MemberRoleToggle' diff --git a/packages/ui/src/working-groups/modals/PayWorkerModal/types.ts b/packages/ui/src/working-groups/modals/PayWorkerModal/types.ts index 2dd2a9ca61..0027e34082 100644 --- a/packages/ui/src/working-groups/modals/PayWorkerModal/types.ts +++ b/packages/ui/src/working-groups/modals/PayWorkerModal/types.ts @@ -5,4 +5,3 @@ import { WorkerWithDetails } from '../../types' export type PayWorkerModalCall = ModalWithDataCall<'PayWorker', { worker: WorkerWithDetails }> export type PaymentType = 'discretionary' | 'vested' - From 440ecc36ba384b850f3f436bbc0a0e6f364dee53 Mon Sep 17 00:00:00 2001 From: Victor Date: Wed, 3 Dec 2025 10:54:08 +0100 Subject: [PATCH 49/55] await modal call assertion --- packages/ui/test/council/modals/AnnounceCandidacyModal.test.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui/test/council/modals/AnnounceCandidacyModal.test.tsx b/packages/ui/test/council/modals/AnnounceCandidacyModal.test.tsx index 6daa3e7720..affec1e279 100644 --- a/packages/ui/test/council/modals/AnnounceCandidacyModal.test.tsx +++ b/packages/ui/test/council/modals/AnnounceCandidacyModal.test.tsx @@ -113,7 +113,7 @@ describe('UI: Announce Candidacy Modal', () => { modal: 'OnBoardingModal', } - expect(showModal).toBeCalledTimes(1) + await waitFor(() => expect(showModal).toBeCalledTimes(1)) expect(showModal).toBeCalledWith({ ...onBoardingModalCall }) }) From 649fe4e0359307035904619af75e028980788b50 Mon Sep 17 00:00:00 2001 From: Victor Date: Wed, 3 Dec 2025 11:43:00 +0100 Subject: [PATCH 50/55] await async issues --- .../ui/test/forum/modals/CreateThreadModal.test.tsx | 12 +++++++----- .../working-groups/modals/ApplyForRoleModal.test.tsx | 8 +++++--- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/packages/ui/test/forum/modals/CreateThreadModal.test.tsx b/packages/ui/test/forum/modals/CreateThreadModal.test.tsx index f59dc32880..4b3d7dd826 100644 --- a/packages/ui/test/forum/modals/CreateThreadModal.test.tsx +++ b/packages/ui/test/forum/modals/CreateThreadModal.test.tsx @@ -1,4 +1,4 @@ -import { act, fireEvent, render, screen } from '@testing-library/react' +import { act, fireEvent, render, screen, waitFor } from '@testing-library/react' import BN from 'bn.js' import React from 'react' import { generatePath, MemoryRouter, Route } from 'react-router-dom' @@ -76,12 +76,14 @@ describe('CreateThreadModal', () => { }) describe('Requirements failed', () => { - it('No active member', () => { + it('No active member', async () => { useMyMemberships.active = undefined renderModal() - expect(useModal.showModal).toBeCalledWith({ - modal: 'OnBoardingModal', - }) + await waitFor(() => + expect(useModal.showModal).toBeCalledWith({ + modal: 'OnBoardingModal', + }) + ) }) it('Insufficient funds for minimum fee', async () => { diff --git a/packages/ui/test/working-groups/modals/ApplyForRoleModal.test.tsx b/packages/ui/test/working-groups/modals/ApplyForRoleModal.test.tsx index f412b6383e..372801107b 100644 --- a/packages/ui/test/working-groups/modals/ApplyForRoleModal.test.tsx +++ b/packages/ui/test/working-groups/modals/ApplyForRoleModal.test.tsx @@ -134,9 +134,11 @@ describe('UI: ApplyForRoleModal', () => { await renderModal() - expect(showModal).toBeCalledWith({ - modal: 'OnBoardingModal', - }) + await waitFor(() => + expect(showModal).toBeCalledWith({ + modal: 'OnBoardingModal', + }) + ) showModal.mockClear() }) From 3e07aa19429d568b579a28358a25d7675bec4827 Mon Sep 17 00:00:00 2001 From: Victor Date: Wed, 3 Dec 2025 12:42:33 +0100 Subject: [PATCH 51/55] used mock apollo providers for mention test --- .../test/common/components/Mention.test.tsx | 96 +++++++++++++++---- 1 file changed, 80 insertions(+), 16 deletions(-) diff --git a/packages/ui/test/common/components/Mention.test.tsx b/packages/ui/test/common/components/Mention.test.tsx index 9afa56f5aa..b4a1da1ebf 100644 --- a/packages/ui/test/common/components/Mention.test.tsx +++ b/packages/ui/test/common/components/Mention.test.tsx @@ -74,7 +74,11 @@ describe('UI: Mention', () => { beforeEach(() => { jest.clearAllMocks() - render() + render( + + + + ) }) it('should render component', () => { @@ -82,12 +86,20 @@ describe('UI: Mention', () => { }) it('should mount loader when no mention was provided', () => { - render() + render( + + + + ) expect(loaderSelector()).toBeInTheDocument() }) it('should call onMount when no mention was provided', () => { - render() + render( + + + + ) expect(onMount).toHaveBeenCalledTimes(1) }) @@ -127,7 +139,11 @@ describe('UI: Mention', () => { beforeEach(() => { jest.clearAllMocks() - render() + render( + + + + ) }) it('should render component', () => { @@ -135,12 +151,20 @@ describe('UI: Mention', () => { }) it('should mount loader when no mention was provided', () => { - render() + render( + + + + ) expect(loaderSelector()).toBeInTheDocument() }) it('should call onMount when no mention was provided', () => { - render() + render( + + + + ) expect(onMount).toHaveBeenCalledTimes(1) }) @@ -176,7 +200,11 @@ describe('UI: Mention', () => { beforeEach(() => { jest.clearAllMocks() - render() + render( + + + + ) }) it('should render component', () => { @@ -184,12 +212,20 @@ describe('UI: Mention', () => { }) it('should mount loader when no mention was provided', () => { - render() + render( + + + + ) expect(loaderSelector()).toBeInTheDocument() }) it('should call onMount when no mention was provided', () => { - render() + render( + + + + ) expect(onMount).toHaveBeenCalledTimes(1) }) @@ -237,7 +273,11 @@ describe('UI: Mention', () => { beforeEach(() => { jest.clearAllMocks() - renderResult = render() + renderResult = render( + + + + ) }) it('should render component', () => { @@ -245,12 +285,20 @@ describe('UI: Mention', () => { }) it('should mount loader when no mention was provided', () => { - render() + render( + + + + ) expect(loaderSelector()).toBeInTheDocument() }) it('should call onMount when no mention was provided', () => { - render() + render( + + + + ) expect(onMount).toHaveBeenCalledTimes(1) }) @@ -261,7 +309,11 @@ describe('UI: Mention', () => { it('should render correct distance to the ending date in the future', () => { const futureDate = addYears(new Date(), 3).toISOString() - renderResult.rerender() + renderResult.rerender( + + + + ) const expected = formatDistanceToNowStrict(new Date(futureDate)) expect(screen.getByText(`mentions.tooltips.opening.duration ${expected}`)).toBeInTheDocument() }) @@ -320,7 +372,11 @@ describe('UI: Mention', () => { beforeEach(() => { jest.clearAllMocks() - render() + render( + + + + ) }) it('should render component', () => { @@ -328,12 +384,20 @@ describe('UI: Mention', () => { }) it('should mount loader when no mention was provided', () => { - render() + render( + + + + ) expect(loaderSelector()).toBeInTheDocument() }) it('should call onMount when no mention was provided', () => { - render() + render( + + + + ) expect(onMount).toHaveBeenCalledTimes(1) }) From 7489c64e6090102683f6ee396ce9977febe47fc9 Mon Sep 17 00:00:00 2001 From: Victor Date: Wed, 3 Dec 2025 13:11:44 +0100 Subject: [PATCH 52/55] proposaldisccusion apollo provider wrapper --- .../ui/test/common/components/Mention.test.tsx | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/packages/ui/test/common/components/Mention.test.tsx b/packages/ui/test/common/components/Mention.test.tsx index b4a1da1ebf..84947d4f10 100644 --- a/packages/ui/test/common/components/Mention.test.tsx +++ b/packages/ui/test/common/components/Mention.test.tsx @@ -438,7 +438,11 @@ describe('UI: Mention', () => { beforeEach(() => { jest.clearAllMocks() - render() + render( + + + + ) }) it('should render component', () => { @@ -446,12 +450,20 @@ describe('UI: Mention', () => { }) it('should mount loader when no mention was provided', () => { - render() + render( + + + + ) expect(loaderSelector()).toBeInTheDocument() }) it('should call onMount when no mention was provided', () => { - render() + render( + + + + ) expect(onMount).toHaveBeenCalledTimes(1) }) From 47c6c40532d9158b3d68e39dd7826218a0fcd9f4 Mon Sep 17 00:00:00 2001 From: Victor Date: Wed, 3 Dec 2025 16:37:49 +0100 Subject: [PATCH 53/55] added success message to create post modal --- .../modals/PostActionModal/CreatePostModal/CreatePostModal.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui/src/forum/modals/PostActionModal/CreatePostModal/CreatePostModal.tsx b/packages/ui/src/forum/modals/PostActionModal/CreatePostModal/CreatePostModal.tsx index 3b9c82e26d..9767fe264f 100644 --- a/packages/ui/src/forum/modals/PostActionModal/CreatePostModal/CreatePostModal.tsx +++ b/packages/ui/src/forum/modals/PostActionModal/CreatePostModal/CreatePostModal.tsx @@ -21,7 +21,7 @@ export const CreatePostModal = () => { const { module = 'forum', postText, transaction, isEditable, onSuccess } = modalData const [state, send] = useMachine( - defaultTransactionModalMachine('There was a problem posting your message.', undefined), + defaultTransactionModalMachine('There was a problem posting your message.', 'Your post has been submitted.'), { context: { validateBeforeTransaction: true } } ) From cf8d40d8401f1b6e22f2ecdb7473878389100c04 Mon Sep 17 00:00:00 2001 From: "l1.media" Date: Wed, 3 Dec 2025 18:41:07 +0100 Subject: [PATCH 54/55] turn vetoed mock proposal dormant (#4932) --- packages/ui/test/_mocks/proposals/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui/test/_mocks/proposals/index.ts b/packages/ui/test/_mocks/proposals/index.ts index fb6cdd6623..624037574c 100644 --- a/packages/ui/test/_mocks/proposals/index.ts +++ b/packages/ui/test/_mocks/proposals/index.ts @@ -79,7 +79,7 @@ export const testProposals: ProposalMock[] = [ ...baseMock, id: '3', title: 'Quite Similar Named Proposal', - status: 'vetoed', + status: 'dormant', createdAt: '2021-07-08T10:00:00.000Z', statusSetAtTime: '2021-07-14T10:00:00.000Z', details: { From bef17c51c809e3723d4630d6eff61d4b2f7b00a9 Mon Sep 17 00:00:00 2001 From: "l1.media" Date: Wed, 3 Dec 2025 19:50:28 +0100 Subject: [PATCH 55/55] Upgrade ckeditor5 to 47.3.0 --- packages/markdown-editor/package.json | 42 +- packages/markdown-editor/webpack.config.js | 4 +- yarn.lock | 5180 +++++++++++++++----- 3 files changed, 3908 insertions(+), 1318 deletions(-) diff --git a/packages/markdown-editor/package.json b/packages/markdown-editor/package.json index 55427573a8..97ce85bf1e 100644 --- a/packages/markdown-editor/package.json +++ b/packages/markdown-editor/package.json @@ -13,29 +13,29 @@ "main": "dist/ckeditor.js", "types": "types/", "dependencies": { - "@ckeditor/ckeditor5-autoformat": "31.0.0", - "@ckeditor/ckeditor5-basic-styles": "31.0.0", - "@ckeditor/ckeditor5-block-quote": "31.0.0", - "@ckeditor/ckeditor5-editor-classic": "31.0.0", - "@ckeditor/ckeditor5-editor-inline": "31.0.0", - "@ckeditor/ckeditor5-essentials": "31.0.0", - "@ckeditor/ckeditor5-heading": "31.0.0", - "@ckeditor/ckeditor5-image": "31.0.0", - "@ckeditor/ckeditor5-indent": "31.0.0", - "@ckeditor/ckeditor5-link": "31.0.0", - "@ckeditor/ckeditor5-list": "31.0.0", - "@ckeditor/ckeditor5-markdown-gfm": "31.0.0", - "@ckeditor/ckeditor5-mention": "31.0.0", - "@ckeditor/ckeditor5-paragraph": "31.0.0", - "@ckeditor/ckeditor5-paste-from-office": "31.0.0", - "@ckeditor/ckeditor5-special-characters": "31.0.0", - "@ckeditor/ckeditor5-table": "31.0.0", - "@ckeditor/ckeditor5-theme-lark": "31.0.0", - "@ckeditor/ckeditor5-typing": "31.0.0" + "@ckeditor/ckeditor5-autoformat": "47.3.0", + "@ckeditor/ckeditor5-basic-styles": "47.3.0", + "@ckeditor/ckeditor5-block-quote": "47.3.0", + "@ckeditor/ckeditor5-editor-classic": "47.3.0", + "@ckeditor/ckeditor5-editor-inline": "47.3.0", + "@ckeditor/ckeditor5-essentials": "47.3.0", + "@ckeditor/ckeditor5-heading": "47.3.0", + "@ckeditor/ckeditor5-image": "47.3.0", + "@ckeditor/ckeditor5-indent": "47.3.0", + "@ckeditor/ckeditor5-link": "47.3.0", + "@ckeditor/ckeditor5-list": "47.3.0", + "@ckeditor/ckeditor5-markdown-gfm": "47.3.0", + "@ckeditor/ckeditor5-mention": "47.3.0", + "@ckeditor/ckeditor5-paragraph": "47.3.0", + "@ckeditor/ckeditor5-paste-from-office": "47.3.0", + "@ckeditor/ckeditor5-special-characters": "47.3.0", + "@ckeditor/ckeditor5-table": "47.3.0", + "@ckeditor/ckeditor5-theme-lark": "47.3.0", + "@ckeditor/ckeditor5-typing": "47.3.0" }, "devDependencies": { - "@ckeditor/ckeditor5-dev-utils": "^25.4.5", - "@ckeditor/ckeditor5-dev-webpack-plugin": "^25.4.5", + "@ckeditor/ckeditor5-dev-translations": "^43.1.0", + "@ckeditor/ckeditor5-dev-utils": "^43.1.0", "@typescript-eslint/eslint-plugin": "^4.33.0", "@typescript-eslint/parser": "^4.33.0", "prettier": "^2.8.8", diff --git a/packages/markdown-editor/webpack.config.js b/packages/markdown-editor/webpack.config.js index 87e205262a..8d197c1131 100644 --- a/packages/markdown-editor/webpack.config.js +++ b/packages/markdown-editor/webpack.config.js @@ -5,7 +5,7 @@ const path = require('path') const webpack = require('webpack') const { bundler, styles } = require('@ckeditor/ckeditor5-dev-utils') -const CKEditorWebpackPlugin = require('@ckeditor/ckeditor5-dev-webpack-plugin') +const { CKEditorTranslationsPlugin } = require( '@ckeditor/ckeditor5-dev-translations' ); const TerserPlugin = require('terser-webpack-plugin') module.exports = { @@ -39,7 +39,7 @@ module.exports = { }, plugins: [ - new CKEditorWebpackPlugin({ + new CKEditorTranslationsPlugin({ // UI language. Language codes follow the https://en.wikipedia.org/wiki/ISO_639-1 format. // When changing the built-in language, remember to also change it in the editor's configuration (src/ckeditor.js). language: 'en', diff --git a/yarn.lock b/yarn.lock index 97a4f824b4..331e3d0ee4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2017,347 +2017,917 @@ __metadata: languageName: node linkType: hard -"@ckeditor/ckeditor5-autoformat@npm:31.0.0": - version: 31.0.0 - resolution: "@ckeditor/ckeditor5-autoformat@npm:31.0.0" +"@ckeditor/ckeditor5-adapter-ckfinder@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-adapter-ckfinder@npm:47.3.0" dependencies: - ckeditor5: ^31.0.0 - checksum: 8deef468c0981f666c6cb626736917f8d4d0af62d1640ce2c24e933a881037d7841bc5c2fc4ac355ac11cb12802a6a5ab77b80218239c72d418b3e141781ebce + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-upload": 47.3.0 + ckeditor5: 47.3.0 + checksum: 55d5d9f8163559a11006c0175ffe3e5322be1956ee5bce1e16489769073177e00f67b6debfb03d66586b1f4acf8673fcba3353183fb3f4ab00f24eb142341c96 languageName: node linkType: hard -"@ckeditor/ckeditor5-basic-styles@npm:31.0.0": - version: 31.0.0 - resolution: "@ckeditor/ckeditor5-basic-styles@npm:31.0.0" +"@ckeditor/ckeditor5-alignment@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-alignment@npm:47.3.0" dependencies: - ckeditor5: ^31.0.0 - checksum: 9d41aa8aecb8708205d4d0d72e80091b6fc3dd198798f060dc03b9e2dc96aa551e0553c13aaa9aff866c527268eec1adea45fe6ea09c15f8d6f77f29e28b504c + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-icons": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + ckeditor5: 47.3.0 + checksum: a3c021d0803e0cbb673f99b00eb2c8cb4989a55300a1aa2063194e72fdf6cf7851dcd1fbf8c57359bf03e67ed49cf374c7494b56e9010baa3597900b15cea4f9 languageName: node linkType: hard -"@ckeditor/ckeditor5-block-quote@npm:31.0.0": - version: 31.0.0 - resolution: "@ckeditor/ckeditor5-block-quote@npm:31.0.0" +"@ckeditor/ckeditor5-autoformat@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-autoformat@npm:47.3.0" dependencies: - ckeditor5: ^31.0.0 - checksum: 08ea67e71e042e92782d399aeba15234229544c93561a3b61966876c0b54cf8575549ac1d5f0d89f2901f269461cdd7e35e9ee5f3111b4eff5d88d22d5039250 + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-engine": 47.3.0 + "@ckeditor/ckeditor5-heading": 47.3.0 + "@ckeditor/ckeditor5-typing": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + ckeditor5: 47.3.0 + checksum: 88de5ce340cdec4887f697291fdd372ef60b108649d20ea1b3b553cfb61bc806f8281eedb739c18b6a00d2a1263d1a6da70e151f4d4c9d21b629f19b771ddb44 languageName: node linkType: hard -"@ckeditor/ckeditor5-clipboard@npm:^31.0.0": - version: 31.0.0 - resolution: "@ckeditor/ckeditor5-clipboard@npm:31.0.0" +"@ckeditor/ckeditor5-autosave@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-autosave@npm:47.3.0" dependencies: - "@ckeditor/ckeditor5-core": ^31.0.0 - "@ckeditor/ckeditor5-engine": ^31.0.0 - "@ckeditor/ckeditor5-utils": ^31.0.0 - "@ckeditor/ckeditor5-widget": ^31.0.0 - lodash-es: ^4.17.11 - checksum: 031432f6b5467fccb1263a10f346546aa986f3b74e01f814cd20d71c16c5290a4cf59e7563be544f13b0766936b2f57c8bdff872caedf49bb212da42b94038f2 + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + ckeditor5: 47.3.0 + es-toolkit: 1.39.5 + checksum: bd6252136fcf4106b414f035b0c1590730c783b474445906f4fa4a996af77da8e37fbc1317baab53285696ee679e5cc3cbd4710e84d12732c4864ec8ec3ae5a9 languageName: node linkType: hard -"@ckeditor/ckeditor5-core@npm:^31.0.0": - version: 31.0.0 - resolution: "@ckeditor/ckeditor5-core@npm:31.0.0" +"@ckeditor/ckeditor5-basic-styles@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-basic-styles@npm:47.3.0" dependencies: - "@ckeditor/ckeditor5-engine": ^31.0.0 - "@ckeditor/ckeditor5-ui": ^31.0.0 - "@ckeditor/ckeditor5-utils": ^31.0.0 - lodash-es: ^4.17.15 - checksum: f0a363de9573d26f8b2b7949b5f0624b7d137023c21d49ea349163c97c01ccdf2a19d80f5eae53edab05eb23181d368e809d03e48859c66a739b2c6430e0b072 + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-icons": 47.3.0 + "@ckeditor/ckeditor5-typing": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + ckeditor5: 47.3.0 + checksum: a56a8fef75e847f10745c3f90c3f331f9274667556e675aace55f636d325165a72a7b9fa2fc46a15f3118a03d874782726ff58c1daf90ef4f222ea6d7903bf45 languageName: node linkType: hard -"@ckeditor/ckeditor5-dev-utils@npm:^25.4.5": - version: 25.4.5 - resolution: "@ckeditor/ckeditor5-dev-utils@npm:25.4.5" +"@ckeditor/ckeditor5-block-quote@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-block-quote@npm:47.3.0" dependencies: - "@ckeditor/ckeditor5-dev-webpack-plugin": ^25.4.5 - acorn: ^6.2.1 - acorn-walk: ^6.2.0 + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-enter": 47.3.0 + "@ckeditor/ckeditor5-icons": 47.3.0 + "@ckeditor/ckeditor5-typing": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + ckeditor5: 47.3.0 + checksum: 056a79bf12f51526537ebdb155270c7812ba77e2bda671bc4453df0f24b080fb0a7e446f753150d806c3db0172b10f04467f716f60d8ff69a8a55844f700cd30 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-bookmark@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-bookmark@npm:47.3.0" + dependencies: + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-icons": 47.3.0 + "@ckeditor/ckeditor5-link": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + "@ckeditor/ckeditor5-widget": 47.3.0 + ckeditor5: 47.3.0 + checksum: 4b181a6af3e67c4520b0aac8939df10157625612cd6e23fe6a0a2b9942b18a11224e22e0733a50c44f28e110e66bd66fa99964f39fe77ed50fde7ac071a10c48 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-ckbox@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-ckbox@npm:47.3.0" + dependencies: + "@ckeditor/ckeditor5-cloud-services": 47.3.0 + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-engine": 47.3.0 + "@ckeditor/ckeditor5-icons": 47.3.0 + "@ckeditor/ckeditor5-image": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-upload": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + blurhash: 2.0.5 + ckeditor5: 47.3.0 + es-toolkit: 1.39.5 + checksum: 07047692f11c5f1487a5f0e4f650eec699a9c7267f5fabcce8d9f15c69c18c0458a63b1abe4c5af9454c10c31775d402ad39864ebcb22aa086b6661189b6cff5 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-ckfinder@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-ckfinder@npm:47.3.0" + dependencies: + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-icons": 47.3.0 + "@ckeditor/ckeditor5-image": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + ckeditor5: 47.3.0 + checksum: efd4a5783ed28e01e3f64d1dfa72b9d606b9a1f46b2d5a2fd821c67915008ee0255f19fbd9d069fe82799d6e2f4e720df1788f84af69f27c9e59461e683a62c1 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-clipboard@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-clipboard@npm:47.3.0" + dependencies: + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-engine": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + "@ckeditor/ckeditor5-widget": 47.3.0 + es-toolkit: 1.39.5 + checksum: 255d342db97346b5f9a090c3f55375ec5492e6a37133fb98c1bad17a80bdfd9aa16d8700c07ab2cee913d518d4c7443f5724347b4b5b6342591cb9bebce233f9 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-cloud-services@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-cloud-services@npm:47.3.0" + dependencies: + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + ckeditor5: 47.3.0 + checksum: 49e50ed15fdb403099ed488011cc1ce514e4c9a6395b9f79176c3b4f7da687ddb23c65ce5440b02e4726be86173c5223fb838f6e75fc195e1eaa15d2570ed644 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-code-block@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-code-block@npm:47.3.0" + dependencies: + "@ckeditor/ckeditor5-clipboard": 47.3.0 + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-engine": 47.3.0 + "@ckeditor/ckeditor5-enter": 47.3.0 + "@ckeditor/ckeditor5-icons": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + ckeditor5: 47.3.0 + checksum: a836a6a0147a61eae43ab5491c9c936ae0ec3298ae9fbf75195ab307376e0661b13ca794d29334d26b3d31e68ae569a8b7b9234a2df8b21e3ea86d12ec5d46f5 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-core@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-core@npm:47.3.0" + dependencies: + "@ckeditor/ckeditor5-engine": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + "@ckeditor/ckeditor5-watchdog": 47.3.0 + es-toolkit: 1.39.5 + checksum: 3c6edf3fc4570bb5c1a06fc1f0c28e05a056624c79f0ad8a35a111dd4c672102f7f7391c399127706aa9c96f36bbf9974dd59ddb24762c2e9751670f0c8de3a7 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-dev-translations@npm:^43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-dev-translations@npm:43.1.0" + dependencies: + "@babel/parser": ^7.18.9 + "@babel/traverse": ^7.18.9 + chalk: ^4.0.0 + pofile: ^1.0.9 + rimraf: ^3.0.2 + webpack-sources: ^2.0.1 + checksum: 1970465ce9bbc0233ea3574ddc93d8f019c2a069605ea301cbf0ef3c71f2f20442039f6789e16695aba54f6a7412e5263ee00b36d0004b8effd53c802acf43c6 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-dev-utils@npm:^43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-dev-utils@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-dev-translations": ^43.1.0 chalk: ^3.0.0 - cssnano: ^4.0.0 + cli-cursor: ^3.1.0 + cli-spinners: ^2.6.1 + css-loader: ^5.2.7 + cssnano: ^6.0.3 del: ^5.0.0 - escodegen: ^1.9.0 - fs-extra: ^8.1.0 + esbuild-loader: ~3.0.1 + fs-extra: ^11.2.0 + is-interactive: ^1.0.0 javascript-stringify: ^1.6.0 - pofile: ^1.0.9 - postcss: ^7.0.36 - postcss-import: ^12.0.0 - postcss-loader: ^3.0.0 - postcss-mixins: ^6.2.0 - postcss-nesting: ^7.0.0 + mini-css-extract-plugin: ^2.4.2 + mocha: ^7.1.2 + postcss: ^8.4.12 + postcss-import: ^14.1.0 + postcss-loader: ^4.3.0 + postcss-mixins: ^9.0.2 + postcss-nesting: ^13.0.0 raw-loader: ^4.0.1 shelljs: ^0.8.1 - style-loader: ^1.2.1 - terser-webpack-plugin: ^3.0.2 + style-loader: ^2.0.0 + terser-webpack-plugin: ^4.2.3 through2: ^3.0.1 - checksum: cec242e13c09ee31c2e1e405837786f89832bcd3250d8c97b6cb9b2aff0d5f527eafc25b9ace67958a4eb4f0da5a3e3c20df7c15458350a4b2b55a4088ff2a9b + checksum: b73d5ccfa31ff6d80cc3451b7ae838e9b4b9723a0b857743e1c87edb5c783b65d2debe46a14d54ab2c8687f5e6174e6fce4bbb5addca77470e1e5a4513c45231 languageName: node linkType: hard -"@ckeditor/ckeditor5-dev-webpack-plugin@npm:^25.4.5": - version: 25.4.5 - resolution: "@ckeditor/ckeditor5-dev-webpack-plugin@npm:25.4.5" +"@ckeditor/ckeditor5-easy-image@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-easy-image@npm:47.3.0" dependencies: - "@ckeditor/ckeditor5-dev-utils": ^25.4.5 - chalk: ^4.0.0 - rimraf: ^3.0.2 - semver: ^7.3.4 - webpack-sources: ^2.0.1 - peerDependencies: - webpack: ^4.43.0 || ^5.24.0 - checksum: 007ac4a749af75411b08a7c604d1c25d5aff0384fe60fbc0e34b6093e9f1e570f9e28f915c4fcc84650a4fa87e3ca77476da6a8eb9a962b9eea0b4e24b2e9cf3 + "@ckeditor/ckeditor5-cloud-services": 47.3.0 + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-upload": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + ckeditor5: 47.3.0 + checksum: de0ec8cd713a1dcadd3f9b20b3f7dd77f74147098f5b48e0ca19c80745acde4c8ca810b9e8d001d3ec1a1afb46f4d75ff0a47bfd3d88f8c07637ada8013c22f6 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-editor-balloon@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-editor-balloon@npm:47.3.0" + dependencies: + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-engine": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + ckeditor5: 47.3.0 + es-toolkit: 1.39.5 + checksum: c8f0a36f29846bd5bccad43c5df655c5ad9e5b0f03ad061ffd455849eac71c8905fdc1630ac2429d92a2b2291cba8b0920afb2bc68d358dc5128b3990f098d07 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-editor-classic@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-editor-classic@npm:47.3.0" + dependencies: + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-engine": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + ckeditor5: 47.3.0 + es-toolkit: 1.39.5 + checksum: 92a944af9657a92be84850535a0f00d24bdd8e84ad2b39d97353e0f1caf2df0c114d4ee3875018a9225e45903fa02ab350301c8d944971d80e13d485bcd347d7 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-editor-decoupled@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-editor-decoupled@npm:47.3.0" + dependencies: + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-engine": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + ckeditor5: 47.3.0 + es-toolkit: 1.39.5 + checksum: c13441f4747783ba3b9455fa1bc44806e40091f67e88d128c91d03eafbd715f78f29347850ad68d62808bc8e87ae568d4b2fa6a1bd0dd15cd679f21e1ddaa316 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-editor-inline@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-editor-inline@npm:47.3.0" + dependencies: + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-engine": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + ckeditor5: 47.3.0 + es-toolkit: 1.39.5 + checksum: 1d7738b8abf8e2693008135ac81cab37e4b758e16596d6e549a6da09fa12823959a726945d3a3cb88794ba540fabe01e7c4333e5b1b993f774ffd04ee9baf9b3 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-editor-multi-root@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-editor-multi-root@npm:47.3.0" + dependencies: + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-engine": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + ckeditor5: 47.3.0 + es-toolkit: 1.39.5 + checksum: f81112ccad80b1e6cfa520b8c9006cb32bc126a87219e990e5c146ea50c288aba69572b298c6e2bc58c89f0df186785df4436fbe0c96c60247d22172b19ef218 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-emoji@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-emoji@npm:47.3.0" + dependencies: + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-icons": 47.3.0 + "@ckeditor/ckeditor5-mention": 47.3.0 + "@ckeditor/ckeditor5-typing": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + ckeditor5: 47.3.0 + es-toolkit: 1.39.5 + fuzzysort: 3.1.0 + checksum: 627a0480f0e9578217d99d61199a9b0601d042c36b69b599d0c4a20a6163c271f5f93aca2116498564d153bdf22bd05899b4870c5710d638f430b3731f194dfb + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-engine@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-engine@npm:47.3.0" + dependencies: + "@ckeditor/ckeditor5-utils": 47.3.0 + es-toolkit: 1.39.5 + checksum: 7184ed1f0b660fde39a2f8dba8388bbeafa059346008da2ce29a5b2abe582c700e3f5566c5911d7a7d901ab413a23d5af6f628f46069938f84c39bf1ca1bcbc4 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-enter@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-enter@npm:47.3.0" + dependencies: + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-engine": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + checksum: 2091556987d4fb5e74db96ac1de173f7ddf211d23306a7062ce66eeef6e20b559eb9e28dd77ba8d349d14b7d1db06f1ec08de1cac566d68e014b77dac3aa198c + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-essentials@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-essentials@npm:47.3.0" + dependencies: + "@ckeditor/ckeditor5-clipboard": 47.3.0 + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-enter": 47.3.0 + "@ckeditor/ckeditor5-select-all": 47.3.0 + "@ckeditor/ckeditor5-typing": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-undo": 47.3.0 + ckeditor5: 47.3.0 + checksum: 8cd45b8c3797882de0b89b774d06f7f6e1df91cd28125fee756bf0be974f3a9753d280da52c20713b9b193f78b6e09dac3fc2eb1079fb740adb2054ccf741225 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-find-and-replace@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-find-and-replace@npm:47.3.0" + dependencies: + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-icons": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + ckeditor5: 47.3.0 + es-toolkit: 1.39.5 + checksum: 992c1cca73651fb5e38dfe7a3e505ed73c6c7203c0d194ac31ed27b41555ce31f558d10ee5a83dcdfa6cafa37c7fb4a8ef068bdb7157cc88c5014867c29009f7 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-font@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-font@npm:47.3.0" + dependencies: + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-engine": 47.3.0 + "@ckeditor/ckeditor5-icons": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + ckeditor5: 47.3.0 + checksum: a50c945c38118dd47fc192b166ae0a447e363eb26f0f4c4d4bbc95e99f078e820af68f2f3f1e7c26616d4f9f2fc78f583e853f5831d966ef642a7dfbad9a1253 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-fullscreen@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-fullscreen@npm:47.3.0" + dependencies: + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-editor-classic": 47.3.0 + "@ckeditor/ckeditor5-editor-decoupled": 47.3.0 + "@ckeditor/ckeditor5-icons": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + ckeditor5: 47.3.0 + checksum: 6004a3c39cc05ea9d5942cad200f2f053855f56cd7667564e6ee2587ee961bafda524ee4769a4314a552cf7404139df96de55b5acac4ee282de2acbb7e64518d + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-heading@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-heading@npm:47.3.0" + dependencies: + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-engine": 47.3.0 + "@ckeditor/ckeditor5-icons": 47.3.0 + "@ckeditor/ckeditor5-paragraph": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + ckeditor5: 47.3.0 + checksum: dd43f3e5c054a7730fd6eb6ae34c455e33cecefd3d333b291c2ad104dbfff259edebdfa3c724c6b4228a25d072acb17af85715b1a2717a66b458d7acdf83ad71 languageName: node linkType: hard -"@ckeditor/ckeditor5-editor-classic@npm:31.0.0": - version: 31.0.0 - resolution: "@ckeditor/ckeditor5-editor-classic@npm:31.0.0" +"@ckeditor/ckeditor5-highlight@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-highlight@npm:47.3.0" dependencies: - ckeditor5: ^31.0.0 - lodash-es: ^4.17.15 - checksum: 96315a4281e0dfcd0103768ea4c0b7e24e18622e4660a7d7ed1c3a5347463994c8852d4018f2a76773b1f31e63397634f438b630c3d6309e5a3022591aee42c8 + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-icons": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + ckeditor5: 47.3.0 + checksum: 024804f0ea6718869418e998ac2985f5d65897ad4c480351ea5ec5f46c9beaf80798a85119bf30c569e248dd389406389283c15358f1a2111ba31c6c608f8bf8 languageName: node linkType: hard -"@ckeditor/ckeditor5-editor-inline@npm:31.0.0": - version: 31.0.0 - resolution: "@ckeditor/ckeditor5-editor-inline@npm:31.0.0" +"@ckeditor/ckeditor5-horizontal-line@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-horizontal-line@npm:47.3.0" dependencies: - ckeditor5: ^31.0.0 - lodash-es: ^4.17.15 - checksum: d6beca1f9a374c7d0a7f9670a0b6b6cd76befd72b39dd35bdebc9b493219087e015c164c5878c29ad2de97504176700d4dc582281d240211b9b58bbf9973714c + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-icons": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + "@ckeditor/ckeditor5-widget": 47.3.0 + ckeditor5: 47.3.0 + checksum: b9e849b2f30148ff79653b0bdc784c6c013b9c4f9106208541adbf78af0b93c8d0f127ae1354bc4596736ad574cc9550bf4763b6fd6c9ef7d2e9e1db2881e4aa languageName: node linkType: hard -"@ckeditor/ckeditor5-engine@npm:^31.0.0": - version: 31.0.0 - resolution: "@ckeditor/ckeditor5-engine@npm:31.0.0" +"@ckeditor/ckeditor5-html-embed@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-html-embed@npm:47.3.0" dependencies: - "@ckeditor/ckeditor5-utils": ^31.0.0 - lodash-es: ^4.17.15 - checksum: ca0bca07e4d803831260bca79ce6ef87a7787ea3ffbca9471c46b0fa7b90a1d7013c9cf107511125f8a47a3c1aeff32d2d7aacc68bf71a73aeded52ca4ecf25c + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-icons": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + "@ckeditor/ckeditor5-widget": 47.3.0 + ckeditor5: 47.3.0 + checksum: 2ac8f8b88a677e6c21c8fa121be119645ba29ddce4a747959eee303b76e47f2bb92b0f17dea8730df400a6dab398f5d353162d2fa39a5e8ba697b7584e539157 languageName: node linkType: hard -"@ckeditor/ckeditor5-enter@npm:^31.0.0": - version: 31.0.0 - resolution: "@ckeditor/ckeditor5-enter@npm:31.0.0" +"@ckeditor/ckeditor5-html-support@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-html-support@npm:47.3.0" dependencies: - "@ckeditor/ckeditor5-core": ^31.0.0 - "@ckeditor/ckeditor5-engine": ^31.0.0 - "@ckeditor/ckeditor5-utils": ^31.0.0 - checksum: fd9b62b4588432e85e9ba695f3f856ab939b958ae4c10171e502b2b484bebbe6f05c7f164da61f471f16b246707cbfa7c172ca3a06c540f79f050e0249fa737d + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-engine": 47.3.0 + "@ckeditor/ckeditor5-enter": 47.3.0 + "@ckeditor/ckeditor5-heading": 47.3.0 + "@ckeditor/ckeditor5-image": 47.3.0 + "@ckeditor/ckeditor5-list": 47.3.0 + "@ckeditor/ckeditor5-remove-format": 47.3.0 + "@ckeditor/ckeditor5-table": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + "@ckeditor/ckeditor5-widget": 47.3.0 + ckeditor5: 47.3.0 + es-toolkit: 1.39.5 + checksum: 108147490a2f348f2ec8a8c3e92fe77df17a5fc1cae5499168cec5055d66e882cef6e963231ee15ac655ae7dc19cd0f309b848f4bddd0546f54137a6b68b6a33 languageName: node linkType: hard -"@ckeditor/ckeditor5-essentials@npm:31.0.0": - version: 31.0.0 - resolution: "@ckeditor/ckeditor5-essentials@npm:31.0.0" +"@ckeditor/ckeditor5-icons@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-icons@npm:47.3.0" + checksum: 89051518fc82107b4382428d5c2d1b102a35d36ba2cb4b6f03207be889fbe609a9ce059368b908149d5c8cd1e947bf74a5b3a8afcb0bb85f1c164f6d7aa2fa8f + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-image@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-image@npm:47.3.0" + dependencies: + "@ckeditor/ckeditor5-clipboard": 47.3.0 + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-engine": 47.3.0 + "@ckeditor/ckeditor5-icons": 47.3.0 + "@ckeditor/ckeditor5-typing": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-undo": 47.3.0 + "@ckeditor/ckeditor5-upload": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + "@ckeditor/ckeditor5-widget": 47.3.0 + ckeditor5: 47.3.0 + es-toolkit: 1.39.5 + checksum: 125def22ca4cb8b28e821c26cc3e9ea4b2f865bb367f12628df733b8341f0a408d53a76d900c560275c0ce114d764de47edb25f23d7a2ccefdc1826074cc9009 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-indent@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-indent@npm:47.3.0" + dependencies: + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-engine": 47.3.0 + "@ckeditor/ckeditor5-heading": 47.3.0 + "@ckeditor/ckeditor5-icons": 47.3.0 + "@ckeditor/ckeditor5-list": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + ckeditor5: 47.3.0 + checksum: cfbe673bb01c59aa33cc6a5f093780bb601cefb1a0cf97bdbc948c759f30aab113aceaafbcdd68270f64826468da27976b233e01c1dd3fd189c8fbb1488aeec5 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-language@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-language@npm:47.3.0" + dependencies: + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + ckeditor5: 47.3.0 + checksum: 34141cd75629d1cb29f825b8aa1963a1bd9a6e2dca8afedc621e84d6395f3cff349eb2d10353c47568ab4de2b751de1cc56d5d2b4a4487b38f99180e2f4582fb + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-link@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-link@npm:47.3.0" + dependencies: + "@ckeditor/ckeditor5-clipboard": 47.3.0 + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-engine": 47.3.0 + "@ckeditor/ckeditor5-icons": 47.3.0 + "@ckeditor/ckeditor5-image": 47.3.0 + "@ckeditor/ckeditor5-typing": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + "@ckeditor/ckeditor5-widget": 47.3.0 + ckeditor5: 47.3.0 + es-toolkit: 1.39.5 + checksum: 45dec0397d8b84cd8ed3f46c463026dd7ea301f5121dab93e22770c9c528ddcfc311d4582e31cd6a41c85c6aae91ea18219f5ce1acd32fe0df3aa76eafb9529e + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-list@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-list@npm:47.3.0" + dependencies: + "@ckeditor/ckeditor5-clipboard": 47.3.0 + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-engine": 47.3.0 + "@ckeditor/ckeditor5-enter": 47.3.0 + "@ckeditor/ckeditor5-font": 47.3.0 + "@ckeditor/ckeditor5-icons": 47.3.0 + "@ckeditor/ckeditor5-typing": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + ckeditor5: 47.3.0 + checksum: eeda5ca3973e6e73bd64821d71f71f639d80733b19606bb27c82d3c99ef6dd89430dfead435ece33827043062115de4726ed626a5a3695fc3accd5c5a989729a + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-markdown-gfm@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-markdown-gfm@npm:47.3.0" + dependencies: + "@ckeditor/ckeditor5-clipboard": 47.3.0 + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-engine": 47.3.0 + "@types/hast": 3.0.4 + ckeditor5: 47.3.0 + hast-util-from-dom: 5.0.1 + hast-util-to-html: 9.0.5 + hast-util-to-mdast: 10.1.2 + hastscript: 9.0.1 + rehype-dom-parse: 5.0.2 + rehype-dom-stringify: 4.0.2 + rehype-remark: 10.0.1 + remark-breaks: 4.0.0 + remark-gfm: 4.0.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + remark-stringify: 11.0.0 + unified: 11.0.5 + unist-util-visit: 5.0.0 + checksum: 60d8ec116d39a8f21fdcacfc117f071e1644c44f07b213ef2e8f11ce18533e1362c0ae44a275e9b7ec98a6752be7acd3b7ad1d60bf4e4d3929d63c0b59e3a047 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-media-embed@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-media-embed@npm:47.3.0" + dependencies: + "@ckeditor/ckeditor5-clipboard": 47.3.0 + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-engine": 47.3.0 + "@ckeditor/ckeditor5-icons": 47.3.0 + "@ckeditor/ckeditor5-typing": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-undo": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + "@ckeditor/ckeditor5-widget": 47.3.0 + ckeditor5: 47.3.0 + checksum: 1e489f99f83f3b78d1fa9f5bf2a1eb5e49c41dcd0329fa775684604b6ded735b1aabb1528599ce6b6f47bc2da1379ef1dc78063f9574b923dec8b849d9366a2e + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-mention@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-mention@npm:47.3.0" + dependencies: + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-typing": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + ckeditor5: 47.3.0 + es-toolkit: 1.39.5 + checksum: 45719de34f17a6564738c0bc493872aad3446c5bb6d247ef1d7735e9ad3d6cc4d0d1800a459a8b3c1c23759f8ab93b4f4908ebf692501d6693ebaf8b44949903 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-minimap@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-minimap@npm:47.3.0" + dependencies: + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-engine": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + ckeditor5: 47.3.0 + checksum: 43cc26a4f912a18629b96df249049ea2c42d22c9610e30c3d1e059d45dbac4858842bae5d759b5ba3036fb27f9e4d48a0fcfb4b5647bdab830475d41140252a2 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-page-break@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-page-break@npm:47.3.0" dependencies: - ckeditor5: ^31.0.0 - checksum: ab76df9f03fc6fa727345c3b6552de3ed5139f891eb271e1e4d831ef6722cb80b0f5b4f0177a67b06502bb57dd0200453ad9bc689852737255fbbd82e55039a4 + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-icons": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + "@ckeditor/ckeditor5-widget": 47.3.0 + ckeditor5: 47.3.0 + checksum: cb45c5c47edb2f601076a32a4b3a6823a30a4d82356c76684c2c0435afb3d744b1c4cce0a8f05e9feea002b272f6ee983ba66b14e584792059409fb3d2b2d002 languageName: node linkType: hard -"@ckeditor/ckeditor5-heading@npm:31.0.0": - version: 31.0.0 - resolution: "@ckeditor/ckeditor5-heading@npm:31.0.0" +"@ckeditor/ckeditor5-paragraph@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-paragraph@npm:47.3.0" dependencies: - ckeditor5: ^31.0.0 - checksum: 11f82a453c881c8ef4ef34d2a3a646069260831ef0dcb390732a3fe564c2b57207dfaa602167538a1cbbd51017db6fdb47576adb85fb799091ea69b8eaa9d71e + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-engine": 47.3.0 + "@ckeditor/ckeditor5-icons": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + checksum: cc881d7f6e4a8f7df139c59e7fa7e87533a326ca8362ff60d2c72f305c0aa4816bdb090d6bd78ccb5f90cdb8c2eb22587cb721293ac1f3e9cda7cb2cc3d0248b languageName: node linkType: hard -"@ckeditor/ckeditor5-image@npm:31.0.0": - version: 31.0.0 - resolution: "@ckeditor/ckeditor5-image@npm:31.0.0" +"@ckeditor/ckeditor5-paste-from-office@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-paste-from-office@npm:47.3.0" dependencies: - "@ckeditor/ckeditor5-ui": ^31.0.0 - ckeditor5: ^31.0.0 - lodash-es: ^4.17.15 - checksum: 1326450a3422e13b98e644aab963d3dce0b9804b2650c8e43ab87db032d94b35994826b3d7572f07771d929a8f5392ab9046ab6512663571f29a1b237ea78aa7 + "@ckeditor/ckeditor5-clipboard": 47.3.0 + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-engine": 47.3.0 + ckeditor5: 47.3.0 + checksum: b0f4e06de8622a1a8ad6e83c3b96c42490324ff07cabce5ca77521794bce05ddc1f365edc45772aabb0d92bd29f1955996dea893d55343f36e0a2de7281d0c7e languageName: node linkType: hard -"@ckeditor/ckeditor5-indent@npm:31.0.0": - version: 31.0.0 - resolution: "@ckeditor/ckeditor5-indent@npm:31.0.0" +"@ckeditor/ckeditor5-remove-format@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-remove-format@npm:47.3.0" dependencies: - ckeditor5: ^31.0.0 - checksum: 933efb12ba5321dfc6cadff4eff9c6f6c58fb65c8940619fc049b2738f3cee8a4dc99147c7ce979f0b8aa76a619ae0cca279e51398ddb67fb091acdd1bf14a62 + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-icons": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + ckeditor5: 47.3.0 + checksum: f50337f86a9efc03ac6d35db89b5cda943dbd6acc79760e985f7031c1d0b68655d7364dd6264ab97abb376883c1b4867824e262bb00310425a996c3b16fc5a39 languageName: node linkType: hard -"@ckeditor/ckeditor5-link@npm:31.0.0": - version: 31.0.0 - resolution: "@ckeditor/ckeditor5-link@npm:31.0.0" +"@ckeditor/ckeditor5-restricted-editing@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-restricted-editing@npm:47.3.0" dependencies: - "@ckeditor/ckeditor5-ui": ^31.0.0 - ckeditor5: ^31.0.0 - lodash-es: ^4.17.15 - checksum: 00e715d08468ad3add7dd5a81f502b228c43b5be4acc77e45277a89458426b1b8c5bcbd2b7bb5793c23ba62233243c733e476d28b2287ff6470e74e0e8e8ce02 + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-engine": 47.3.0 + "@ckeditor/ckeditor5-icons": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + ckeditor5: 47.3.0 + checksum: 347b060af506e9443d9eed2b9b2f41bffcedafea9f16342172169679f78757f6f92685673e658670ca09d79b0130be18dead4c3237ddd3b03df28a7b8f38ca5c languageName: node linkType: hard -"@ckeditor/ckeditor5-list@npm:31.0.0": - version: 31.0.0 - resolution: "@ckeditor/ckeditor5-list@npm:31.0.0" +"@ckeditor/ckeditor5-select-all@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-select-all@npm:47.3.0" dependencies: - ckeditor5: ^31.0.0 - checksum: 6aa4978ed51aff673c08c9dc716bbb47cf42310a9acee0854bf6d3951bec5a65be6def9084991cd13eda6a29cf116b15c9b5198ff5ec436fafb50b3ccec9a98b + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-engine": 47.3.0 + "@ckeditor/ckeditor5-icons": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + checksum: 7b03797160a657beefdaffeeac6cc41ab25a7fef2a1055612847a7c719a81edb332c581e7a2bd47bf8c089ce7080bf9866fd8307f01bd4363ccafe3b865ceeb1 languageName: node linkType: hard -"@ckeditor/ckeditor5-markdown-gfm@npm:31.0.0": - version: 31.0.0 - resolution: "@ckeditor/ckeditor5-markdown-gfm@npm:31.0.0" +"@ckeditor/ckeditor5-show-blocks@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-show-blocks@npm:47.3.0" dependencies: - ckeditor5: ^31.0.0 - marked: 1.1.1 - turndown: ^6.0.0 - turndown-plugin-gfm: ^1.0.2 - checksum: 4cae962bd6247eff69b306b34e90d5810477dd291e2ffcba253c0574e0146f9ab3b95f314228e7acee019ab573b16c9811f53fb9d03910ce41a3376e3692aea9 + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-icons": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + ckeditor5: 47.3.0 + checksum: 8a327fcc053652ee99bb5a7fd6782ad33a543f88c7047a9b582f8a5953027b8b4ec16273db21b95686b9fddfb138cdccb9187bb731b41f1a8bd76ed0d962a96b languageName: node linkType: hard -"@ckeditor/ckeditor5-mention@npm:31.0.0": - version: 31.0.0 - resolution: "@ckeditor/ckeditor5-mention@npm:31.0.0" +"@ckeditor/ckeditor5-source-editing@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-source-editing@npm:47.3.0" dependencies: - ckeditor5: ^31.0.0 - lodash-es: ^4.17.15 - checksum: b8b75e50ad214d9ad87b944c66510758883de3101016ffde4f690d3f80511e615aec5955fbc7f68d7f002a169ce461f0d259a52e4830f37bf7c56f7d89ab524e + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-icons": 47.3.0 + "@ckeditor/ckeditor5-theme-lark": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + ckeditor5: 47.3.0 + checksum: a5b64602cdf313af5ee03f158212ec6fbfd989958a9161c01a17664e854d5045270b1854e644bee1d7712906dd68b04dc705edd8ab99a42569d0427555c4241f languageName: node linkType: hard -"@ckeditor/ckeditor5-paragraph@npm:31.0.0, @ckeditor/ckeditor5-paragraph@npm:^31.0.0": - version: 31.0.0 - resolution: "@ckeditor/ckeditor5-paragraph@npm:31.0.0" +"@ckeditor/ckeditor5-special-characters@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-special-characters@npm:47.3.0" dependencies: - "@ckeditor/ckeditor5-core": ^31.0.0 - "@ckeditor/ckeditor5-ui": ^31.0.0 - "@ckeditor/ckeditor5-utils": ^31.0.0 - checksum: d7e3ad650bdaaefd0deede7f93db20b89994f4c7328952bd337d0e0a56dcab7ca624ff2fa08b8e9c8678d5688a80d45df2a613f8eacb805e201285750ffb5232 + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-icons": 47.3.0 + "@ckeditor/ckeditor5-typing": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + ckeditor5: 47.3.0 + checksum: 3bac4cd565e49b7fda14f046880d09f23b075ac427faa3c57958fe51eb6dc98db8db3dc0e192f8eb33d84ff158df71e9275a4b26ed291fe4f29c4fbd8d231e45 languageName: node linkType: hard -"@ckeditor/ckeditor5-paste-from-office@npm:31.0.0": - version: 31.0.0 - resolution: "@ckeditor/ckeditor5-paste-from-office@npm:31.0.0" +"@ckeditor/ckeditor5-style@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-style@npm:47.3.0" dependencies: - ckeditor5: ^31.0.0 - checksum: 461001219cb5d38c5918df0e25c514dc746604f6a9e31e852d3dcd7c2c3a69f7ea4d9f1bae03b2f93619443ab5e60b8355ab57b84ccadc1b1fec2820b8848e91 + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-html-support": 47.3.0 + "@ckeditor/ckeditor5-list": 47.3.0 + "@ckeditor/ckeditor5-table": 47.3.0 + "@ckeditor/ckeditor5-typing": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + ckeditor5: 47.3.0 + es-toolkit: 1.39.5 + checksum: 2b44ae9060c81e565fd9abfbae91efca6ed3758947ca88358d43e20ac9e1c9853711331ddf52f11301b5ed4376ea5ea0b687fc5f045a4a2bac962d46d9e21fc8 languageName: node linkType: hard -"@ckeditor/ckeditor5-select-all@npm:^31.0.0": - version: 31.0.0 - resolution: "@ckeditor/ckeditor5-select-all@npm:31.0.0" +"@ckeditor/ckeditor5-table@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-table@npm:47.3.0" dependencies: - "@ckeditor/ckeditor5-core": ^31.0.0 - "@ckeditor/ckeditor5-ui": ^31.0.0 - "@ckeditor/ckeditor5-utils": ^31.0.0 - checksum: 772c2a031d999193fa616af00e584050e8ae90a04f58ae24941d3028bb98d174c3b2213143d65d5e0e49e63ee7d3ba619291fad715a771d5a13985918cfeecb1 + "@ckeditor/ckeditor5-clipboard": 47.3.0 + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-engine": 47.3.0 + "@ckeditor/ckeditor5-icons": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + "@ckeditor/ckeditor5-widget": 47.3.0 + ckeditor5: 47.3.0 + es-toolkit: 1.39.5 + checksum: d2bfa889e9d139eb5f8880d91f39b6c68188e6374f471e6ffd2ed957bccb45ef2049d22541876b92f260412d34d42651ecce4c09d3ab473d7a3380bc07bf7a2a languageName: node linkType: hard -"@ckeditor/ckeditor5-special-characters@npm:31.0.0": - version: 31.0.0 - resolution: "@ckeditor/ckeditor5-special-characters@npm:31.0.0" +"@ckeditor/ckeditor5-theme-lark@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-theme-lark@npm:47.3.0" dependencies: - ckeditor5: ^31.0.0 - checksum: 30a7140eb400b4ed6ca71781f5e9d011997812c75942f3ab6326170439f9dc948430b8537ca8bf1014c276aa4eaa8973d6a4cb7dd415e420d90906a5077147d0 + "@ckeditor/ckeditor5-ui": 47.3.0 + checksum: 6d169dcd4c2596d697dbba6489a384f9fe44aac30f1cc0f0302a168b25e5e8f48e100fd6b32684d01e628a03248804411196905997983f519f279c8f3decc0f5 languageName: node linkType: hard -"@ckeditor/ckeditor5-table@npm:31.0.0": - version: 31.0.0 - resolution: "@ckeditor/ckeditor5-table@npm:31.0.0" +"@ckeditor/ckeditor5-typing@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-typing@npm:47.3.0" dependencies: - ckeditor5: ^31.0.0 - lodash-es: ^4.17.15 - checksum: cafd804e273bcacbc8f15017b270ec4863210eac5dbe03c4a534f015de6721525a544eb2281c27c8c20627576f6aeba4d1cd2dfd470767689ff1d28cc0ecd31e + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-engine": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + es-toolkit: 1.39.5 + checksum: 13d944eb52f459744814cb32127bcf5b851ae1f8145e6d90445f70e45ddb5ed4b0b53d2dfbb8d7a4d4f9fbafe226b1f4d3ec538f4d8fde753aa00b38d777c351 languageName: node linkType: hard -"@ckeditor/ckeditor5-theme-lark@npm:31.0.0": - version: 31.0.0 - resolution: "@ckeditor/ckeditor5-theme-lark@npm:31.0.0" +"@ckeditor/ckeditor5-ui@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-ui@npm:47.3.0" dependencies: - "@ckeditor/ckeditor5-ui": ^31.0.0 - checksum: a2796c1613b966c4b79c4ef051945291d37b116b795cc5d0a87ba4bf1d4fe466de23afa92bcc564eb7701427805904815c0cd30b45220eab6e0e2428103ef8c4 + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-editor-multi-root": 47.3.0 + "@ckeditor/ckeditor5-engine": 47.3.0 + "@ckeditor/ckeditor5-icons": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + "@types/color-convert": 2.0.4 + color-convert: 3.1.0 + color-parse: 2.0.2 + es-toolkit: 1.39.5 + vanilla-colorful: 0.7.2 + checksum: 2e57adebb2f8316d1058d3ba968ac6a980157e810872e139bac59d70d79768b6812d464740339bce250929d9184700b4a190a78fb3284eb786474bfca404ef4d languageName: node linkType: hard -"@ckeditor/ckeditor5-typing@npm:31.0.0, @ckeditor/ckeditor5-typing@npm:^31.0.0": - version: 31.0.0 - resolution: "@ckeditor/ckeditor5-typing@npm:31.0.0" +"@ckeditor/ckeditor5-undo@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-undo@npm:47.3.0" dependencies: - "@ckeditor/ckeditor5-core": ^31.0.0 - "@ckeditor/ckeditor5-engine": ^31.0.0 - "@ckeditor/ckeditor5-utils": ^31.0.0 - lodash-es: ^4.17.15 - checksum: 430bfe853a18584602fdb12a223fa198822a66ab62b1724a919f54bce739629a9abcbaec31e24a72bfe4a125b151a8d3d9ffa57a1a7a502d57a6fdcef9f13cc3 + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-engine": 47.3.0 + "@ckeditor/ckeditor5-icons": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + checksum: 5ab5cdb6d8eef0482b7b3507a51e9bf197b3cf3e4c19370aa9cb26f87462e428ec145996f1479d8269782b5be4f441d0d4c2d20f50ed305c9310fdbbcde4adb6 languageName: node linkType: hard -"@ckeditor/ckeditor5-ui@npm:^31.0.0": - version: 31.0.0 - resolution: "@ckeditor/ckeditor5-ui@npm:31.0.0" +"@ckeditor/ckeditor5-upload@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-upload@npm:47.3.0" dependencies: - "@ckeditor/ckeditor5-core": ^31.0.0 - "@ckeditor/ckeditor5-utils": ^31.0.0 - lodash-es: ^4.17.15 - checksum: e10a2e16b68c450a66760ccb1bf06a5d19fab12072ad487085e8845f113dde9c3adc681653d1106f9b7812a2f0c1346384f5c39f326f67096e90245851472a0a + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + checksum: 00d35e53946439120db982086281835da854afe6bb5711f879734e278cade56d55f2dba1121c40f2a1a35bde462fd6d920eea15bb29c8a6067f170e686befcc6 languageName: node linkType: hard -"@ckeditor/ckeditor5-undo@npm:^31.0.0": - version: 31.0.0 - resolution: "@ckeditor/ckeditor5-undo@npm:31.0.0" +"@ckeditor/ckeditor5-utils@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-utils@npm:47.3.0" dependencies: - "@ckeditor/ckeditor5-core": ^31.0.0 - "@ckeditor/ckeditor5-engine": ^31.0.0 - "@ckeditor/ckeditor5-ui": ^31.0.0 - checksum: 3ec4bc08dc9024d98a8739e088dc9e62648fe32eedb744f01789772fa8af76959a6a7094970c458cd17a1c2149c1bf4c925868eded307e82f122e0b0d21346e4 + "@ckeditor/ckeditor5-ui": 47.3.0 + es-toolkit: 1.39.5 + checksum: b624035b3ff2ef20d1528d4ab7421f3307fa470c2a610af97ede11f9f536396aa23b30a9cacd1e2b3257a2ec820442bf828475dea49addf154e1c984f2c9e59c languageName: node linkType: hard -"@ckeditor/ckeditor5-upload@npm:^31.0.0": - version: 31.0.0 - resolution: "@ckeditor/ckeditor5-upload@npm:31.0.0" +"@ckeditor/ckeditor5-watchdog@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-watchdog@npm:47.3.0" dependencies: - "@ckeditor/ckeditor5-core": ^31.0.0 - "@ckeditor/ckeditor5-ui": ^31.0.0 - "@ckeditor/ckeditor5-utils": ^31.0.0 - checksum: bb6295c36715aa84faf1863661275cfe70ea259c1f5e1138d0fce20f1ac501446548153f1f6c6708a5c764225192068e02fd95579a62086fe17b274242227c06 + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-editor-multi-root": 47.3.0 + "@ckeditor/ckeditor5-engine": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + es-toolkit: 1.39.5 + checksum: 8e46ae4aac68323186eaefd7c66a22e168625385ce824280f652259d62dcf09e127af839da972fc3c1e1339d5dea0118f4f4088ee8e8aed194a4203bcae11c69 languageName: node linkType: hard -"@ckeditor/ckeditor5-utils@npm:^31.0.0": - version: 31.0.0 - resolution: "@ckeditor/ckeditor5-utils@npm:31.0.0" +"@ckeditor/ckeditor5-widget@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-widget@npm:47.3.0" dependencies: - lodash-es: ^4.17.15 - checksum: febc82cbe673669c4f22ce4d83f286bcd21070032d12de00f9e5e7dcd6dceb773f3f24794c89082481b6806bfcdbe0d7f8c9756bc5bfd4f8fa5259ff395cac4f + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-engine": 47.3.0 + "@ckeditor/ckeditor5-enter": 47.3.0 + "@ckeditor/ckeditor5-icons": 47.3.0 + "@ckeditor/ckeditor5-typing": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + es-toolkit: 1.39.5 + checksum: 2e792b9e95605f46c9c6037f15750bab393f78b99d98ec7c02b256dae1a0cde5a138b148a543636dce956c558518ba48a86ecb88b48921a16bfd3ea6a0496cde languageName: node linkType: hard -"@ckeditor/ckeditor5-widget@npm:^31.0.0": - version: 31.0.0 - resolution: "@ckeditor/ckeditor5-widget@npm:31.0.0" +"@ckeditor/ckeditor5-word-count@npm:47.3.0": + version: 47.3.0 + resolution: "@ckeditor/ckeditor5-word-count@npm:47.3.0" dependencies: - "@ckeditor/ckeditor5-core": ^31.0.0 - "@ckeditor/ckeditor5-engine": ^31.0.0 - "@ckeditor/ckeditor5-enter": ^31.0.0 - "@ckeditor/ckeditor5-typing": ^31.0.0 - "@ckeditor/ckeditor5-ui": ^31.0.0 - "@ckeditor/ckeditor5-utils": ^31.0.0 - lodash-es: ^4.17.15 - checksum: 55c0ffa4d7ee73874d451fe1667cb819205f7c1248332d6f1090a0deaf96e4c46d41a948f2c31169aa7080f5f0f1031e8d1b261edc7b3d61a57e77c06ba247da + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + ckeditor5: 47.3.0 + es-toolkit: 1.39.5 + checksum: 7ab83c9ffc8def03c3387ea4fe38d7071990489f3104aea7a615d8ac0d0de03a96647c878bdd5f7bd890a905ef0215fa04e5dbc2084cc6ac0a11240ad3bba506 languageName: node linkType: hard @@ -2402,6 +2972,24 @@ __metadata: languageName: node linkType: hard +"@csstools/selector-resolve-nested@npm:^3.1.0": + version: 3.1.0 + resolution: "@csstools/selector-resolve-nested@npm:3.1.0" + peerDependencies: + postcss-selector-parser: ^7.0.0 + checksum: eaad6a6c99345cae2849a2c73daf53381fabd75851eefd830ee743e4d454d4e2930aa99c8b9e651fed92b9a8361f352c6c754abf82c576bba4953f1e59c927e9 + languageName: node + linkType: hard + +"@csstools/selector-specificity@npm:^5.0.0": + version: 5.0.0 + resolution: "@csstools/selector-specificity@npm:5.0.0" + peerDependencies: + postcss-selector-parser: ^7.0.0 + checksum: 8df1a01a1fa52b66c7ba0286e1c77d1faff45009876f09ddcac542a1c4bca9f34ee92a10acf056b8e7b7ac93679c1635496c6cdfd7d88dbaff2b6afd1eb823ec + languageName: node + linkType: hard + "@discoveryjs/json-ext@npm:^0.5.0": version: 0.5.5 resolution: "@discoveryjs/json-ext@npm:0.5.5" @@ -4829,27 +5417,27 @@ __metadata: version: 0.0.0-use.local resolution: "@joystream/markdown-editor@workspace:packages/markdown-editor" dependencies: - "@ckeditor/ckeditor5-autoformat": 31.0.0 - "@ckeditor/ckeditor5-basic-styles": 31.0.0 - "@ckeditor/ckeditor5-block-quote": 31.0.0 - "@ckeditor/ckeditor5-dev-utils": ^25.4.5 - "@ckeditor/ckeditor5-dev-webpack-plugin": ^25.4.5 - "@ckeditor/ckeditor5-editor-classic": 31.0.0 - "@ckeditor/ckeditor5-editor-inline": 31.0.0 - "@ckeditor/ckeditor5-essentials": 31.0.0 - "@ckeditor/ckeditor5-heading": 31.0.0 - "@ckeditor/ckeditor5-image": 31.0.0 - "@ckeditor/ckeditor5-indent": 31.0.0 - "@ckeditor/ckeditor5-link": 31.0.0 - "@ckeditor/ckeditor5-list": 31.0.0 - "@ckeditor/ckeditor5-markdown-gfm": 31.0.0 - "@ckeditor/ckeditor5-mention": 31.0.0 - "@ckeditor/ckeditor5-paragraph": 31.0.0 - "@ckeditor/ckeditor5-paste-from-office": 31.0.0 - "@ckeditor/ckeditor5-special-characters": 31.0.0 - "@ckeditor/ckeditor5-table": 31.0.0 - "@ckeditor/ckeditor5-theme-lark": 31.0.0 - "@ckeditor/ckeditor5-typing": 31.0.0 + "@ckeditor/ckeditor5-autoformat": 47.3.0 + "@ckeditor/ckeditor5-basic-styles": 47.3.0 + "@ckeditor/ckeditor5-block-quote": 47.3.0 + "@ckeditor/ckeditor5-dev-translations": ^43.1.0 + "@ckeditor/ckeditor5-dev-utils": ^43.1.0 + "@ckeditor/ckeditor5-editor-classic": 47.3.0 + "@ckeditor/ckeditor5-editor-inline": 47.3.0 + "@ckeditor/ckeditor5-essentials": 47.3.0 + "@ckeditor/ckeditor5-heading": 47.3.0 + "@ckeditor/ckeditor5-image": 47.3.0 + "@ckeditor/ckeditor5-indent": 47.3.0 + "@ckeditor/ckeditor5-link": 47.3.0 + "@ckeditor/ckeditor5-list": 47.3.0 + "@ckeditor/ckeditor5-markdown-gfm": 47.3.0 + "@ckeditor/ckeditor5-mention": 47.3.0 + "@ckeditor/ckeditor5-paragraph": 47.3.0 + "@ckeditor/ckeditor5-paste-from-office": 47.3.0 + "@ckeditor/ckeditor5-special-characters": 47.3.0 + "@ckeditor/ckeditor5-table": 47.3.0 + "@ckeditor/ckeditor5-theme-lark": 47.3.0 + "@ckeditor/ckeditor5-typing": 47.3.0 "@typescript-eslint/eslint-plugin": ^4.33.0 "@typescript-eslint/parser": ^4.33.0 prettier: ^2.8.8 @@ -9359,6 +9947,13 @@ __metadata: languageName: node linkType: hard +"@trysound/sax@npm:0.2.0": + version: 0.2.0 + resolution: "@trysound/sax@npm:0.2.0" + checksum: 11226c39b52b391719a2a92e10183e4260d9651f86edced166da1d95f39a0a1eaa470e44d14ac685ccd6d3df7e2002433782872c0feeb260d61e80f21250e65c + languageName: node + linkType: hard + "@tsconfig/node10@npm:^1.0.7": version: 1.0.8 resolution: "@tsconfig/node10@npm:1.0.8" @@ -9516,6 +10111,22 @@ __metadata: languageName: node linkType: hard +"@types/color-convert@npm:2.0.4": + version: 2.0.4 + resolution: "@types/color-convert@npm:2.0.4" + dependencies: + "@types/color-name": ^1.1.0 + checksum: 694141a03d6dbddbe57dea71a45db89799a0a352516bbafbcc54dff6321734c6838f60672119e1d586043a9d1fcd220226ea9db7f296c1c08ffdaa04d613a83b + languageName: node + linkType: hard + +"@types/color-name@npm:^1.1.0": + version: 1.1.5 + resolution: "@types/color-name@npm:1.1.5" + checksum: ea889762fb0fbe1df5931d2b058316b2ad1209257dc8b9a3871c554fdf2f2ad28b610f5362d9dc449f699495e83206cd2889dfcbdc10bbf7fd84cc51c4b3c5be + languageName: node + linkType: hard + "@types/connect@npm:*": version: 3.4.35 resolution: "@types/connect@npm:3.4.35" @@ -9744,6 +10355,15 @@ __metadata: languageName: node linkType: hard +"@types/hast@npm:3.0.4, @types/hast@npm:^3.0.0": + version: 3.0.4 + resolution: "@types/hast@npm:3.0.4" + dependencies: + "@types/unist": "*" + checksum: 7a973e8d16fcdf3936090fa2280f408fb2b6a4f13b42edeb5fbd614efe042b82eac68e298e556d50f6b4ad585a3a93c353e9c826feccdc77af59de8dd400d044 + languageName: node + linkType: hard + "@types/hast@npm:^2.0.0": version: 2.3.4 resolution: "@types/hast@npm:2.3.4" @@ -9961,6 +10581,15 @@ __metadata: languageName: node linkType: hard +"@types/mdast@npm:^4.0.0": + version: 4.0.4 + resolution: "@types/mdast@npm:4.0.4" + dependencies: + "@types/unist": "*" + checksum: 20c4e9574cc409db662a35cba52b068b91eb696b3049e94321219d47d34c8ccc99a142be5c76c80a538b612457b03586bc2f6b727a3e9e7530f4c8568f6282ee + languageName: node + linkType: hard + "@types/mdurl@npm:^1.0.0": version: 1.0.2 resolution: "@types/mdurl@npm:1.0.2" @@ -10155,13 +10784,6 @@ __metadata: languageName: node linkType: hard -"@types/q@npm:^1.5.1": - version: 1.5.5 - resolution: "@types/q@npm:1.5.5" - checksum: 3bd386fb97a0e5f1ce1ed7a14e39b60e469b5ca9d920a7f69e0cdb58d22c0f5bdd16637d8c3a5bfeda76663c023564dd47a65389ee9aaabd65aee54803d5ba45 - languageName: node - linkType: hard - "@types/qs@npm:*, @types/qs@npm:^6.9.5": version: 6.9.7 resolution: "@types/qs@npm:6.9.7" @@ -10380,6 +11002,13 @@ __metadata: languageName: node linkType: hard +"@types/unist@npm:^3.0.0": + version: 3.0.3 + resolution: "@types/unist@npm:3.0.3" + checksum: 96e6453da9e075aaef1dc22482463898198acdc1eeb99b465e65e34303e2ec1e3b1ed4469a9118275ec284dc98019f63c3f5d49422f0e4ac707e5ab90fb3b71a + languageName: node + linkType: hard + "@types/vfile@npm:^4.0.0": version: 4.0.0 resolution: "@types/vfile@npm:4.0.0" @@ -10744,6 +11373,13 @@ __metadata: languageName: node linkType: hard +"@ungap/structured-clone@npm:^1.0.0": + version: 1.3.0 + resolution: "@ungap/structured-clone@npm:1.3.0" + checksum: 64ed518f49c2b31f5b50f8570a1e37bde3b62f2460042c50f132430b2d869c4a6586f13aa33a58a4722715b8158c68cae2827389d6752ac54da2893c83e480fc + languageName: node + linkType: hard + "@walletconnect/core@npm:2.11.0": version: 2.11.0 resolution: "@walletconnect/core@npm:2.11.0" @@ -11434,13 +12070,6 @@ __metadata: languageName: node linkType: hard -"acorn-walk@npm:^6.2.0": - version: 6.2.0 - resolution: "acorn-walk@npm:6.2.0" - checksum: ea241a5d96338f1e8030aafae72a91ff0ec4360e2775e44a2fdb2eb618b07fc309e000a5126056631ac7f00fe8bd9bbd23fcb6d018eee4ba11086eb36c1b2e61 - languageName: node - linkType: hard - "acorn-walk@npm:^7.0.0, acorn-walk@npm:^7.1.1, acorn-walk@npm:^7.2.0": version: 7.2.0 resolution: "acorn-walk@npm:7.2.0" @@ -11455,15 +12084,6 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^6.2.1": - version: 6.4.2 - resolution: "acorn@npm:6.4.2" - bin: - acorn: bin/acorn - checksum: 44b07053729db7f44d28343eed32247ed56dc4a6ec6dff2b743141ecd6b861406bbc1c20bf9d4f143ea7dd08add5dc8c290582756539bc03a8db605050ce2fb4 - languageName: node - linkType: hard - "acorn@npm:^7.0.0, acorn@npm:^7.1.1, acorn@npm:^7.4.1": version: 7.4.1 resolution: "acorn@npm:7.4.1" @@ -11482,6 +12102,15 @@ __metadata: languageName: node linkType: hard +"acorn@npm:^8.15.0": + version: 8.15.0 + resolution: "acorn@npm:8.15.0" + bin: + acorn: bin/acorn + checksum: 309c6b49aedf1a2e34aaf266de06de04aab6eb097c02375c66fdeb0f64556a6a823540409914fb364d9a11bc30d79d485a2eba29af47992d3490e9886c4391c3 + languageName: node + linkType: hard + "acorn@npm:^8.2.4, acorn@npm:^8.4.1, acorn@npm:^8.5.0": version: 8.6.0 resolution: "acorn@npm:8.6.0" @@ -11573,15 +12202,6 @@ __metadata: languageName: node linkType: hard -"ajv-errors@npm:^1.0.0": - version: 1.0.1 - resolution: "ajv-errors@npm:1.0.1" - peerDependencies: - ajv: ">=5.0.0" - checksum: 2c9fc02cf58f9aae5bace61ebd1b162e1ea372ae9db5999243ba5e32a9a78c0d635d29ae085f652c61c941a43af0b2b1acdb255e29d44dc43a6e021085716d8c - languageName: node - linkType: hard - "ajv-formats@npm:^2.1.1": version: 2.1.1 resolution: "ajv-formats@npm:2.1.1" @@ -11596,7 +12216,7 @@ __metadata: languageName: node linkType: hard -"ajv-keywords@npm:^3.1.0, ajv-keywords@npm:^3.5.2": +"ajv-keywords@npm:^3.5.2": version: 3.5.2 resolution: "ajv-keywords@npm:3.5.2" peerDependencies: @@ -11616,7 +12236,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^6.1.0, ajv@npm:^6.10.0, ajv@npm:^6.12.4, ajv@npm:^6.12.5": +"ajv@npm:^6.10.0, ajv@npm:^6.12.4, ajv@npm:^6.12.5": version: 6.12.6 resolution: "ajv@npm:6.12.6" dependencies: @@ -11640,13 +12260,6 @@ __metadata: languageName: node linkType: hard -"alphanum-sort@npm:^1.0.0": - version: 1.0.2 - resolution: "alphanum-sort@npm:1.0.2" - checksum: 5a32d0b3c0944e65d22ff3ae2f88d7a4f8d88a78a703033caeae33f2944915e053d283d02f630dc94823edc7757148ecdcf39fd687a5117bda5c10133a03a7d8 - languageName: node - linkType: hard - "ansi-align@npm:^3.0.0": version: 3.0.1 resolution: "ansi-align@npm:3.0.1" @@ -11656,6 +12269,13 @@ __metadata: languageName: node linkType: hard +"ansi-colors@npm:3.2.3": + version: 3.2.3 + resolution: "ansi-colors@npm:3.2.3" + checksum: 018a92fbf8b143feb9e00559655072598902ff2cdfa07dbe24b933c70ae04845e3dda2c091ab128920fc50b3db06c3f09947f49fcb287d53beb6c5869b8bb32b + languageName: node + linkType: hard + "ansi-escapes@npm:^3.0.0": version: 3.2.0 resolution: "ansi-escapes@npm:3.2.0" @@ -11804,7 +12424,7 @@ __metadata: languageName: node linkType: hard -"anymatch@npm:^3.1.3": +"anymatch@npm:^3.1.3, anymatch@npm:~3.1.1": version: 3.1.3 resolution: "anymatch@npm:3.1.3" dependencies: @@ -12099,6 +12719,16 @@ __metadata: languageName: node linkType: hard +"array-buffer-byte-length@npm:^1.0.1, array-buffer-byte-length@npm:^1.0.2": + version: 1.0.2 + resolution: "array-buffer-byte-length@npm:1.0.2" + dependencies: + call-bound: ^1.0.3 + is-array-buffer: ^3.0.5 + checksum: 0ae3786195c3211b423e5be8dd93357870e6fb66357d81da968c2c39ef43583ef6eece1f9cb1caccdae4806739c65dea832b44b8593414313cd76a89795fca63 + languageName: node + linkType: hard + "array-flatten@npm:1.1.1": version: 1.1.1 resolution: "array-flatten@npm:1.1.1" @@ -12200,6 +12830,22 @@ __metadata: languageName: node linkType: hard +"array.prototype.reduce@npm:^1.0.6": + version: 1.0.8 + resolution: "array.prototype.reduce@npm:1.0.8" + dependencies: + call-bind: ^1.0.8 + call-bound: ^1.0.4 + define-properties: ^1.2.1 + es-abstract: ^1.23.9 + es-array-method-boxes-properly: ^1.0.0 + es-errors: ^1.3.0 + es-object-atoms: ^1.1.1 + is-string: ^1.1.1 + checksum: a2a25e087a75e4caae09414acdfffb6ed69f7dd696d8c612d86dfaa5590bde4d7bc934db8bdd28625703f574aa93731848bfc24a7ba65c558aeb222b2a4fd4c4 + languageName: node + linkType: hard + "arraybuffer.prototype.slice@npm:^1.0.2": version: 1.0.2 resolution: "arraybuffer.prototype.slice@npm:1.0.2" @@ -12215,6 +12861,21 @@ __metadata: languageName: node linkType: hard +"arraybuffer.prototype.slice@npm:^1.0.4": + version: 1.0.4 + resolution: "arraybuffer.prototype.slice@npm:1.0.4" + dependencies: + array-buffer-byte-length: ^1.0.1 + call-bind: ^1.0.8 + define-properties: ^1.2.1 + es-abstract: ^1.23.5 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.6 + is-array-buffer: ^3.0.4 + checksum: b1d1fd20be4e972a3779b1569226f6740170dca10f07aa4421d42cefeec61391e79c557cda8e771f5baefe47d878178cd4438f60916ce831813c08132bced765 + languageName: node + linkType: hard + "arrify@npm:^1.0.1": version: 1.0.1 resolution: "arrify@npm:1.0.1" @@ -12305,6 +12966,20 @@ __metadata: languageName: node linkType: hard +"async-function@npm:^1.0.0": + version: 1.0.0 + resolution: "async-function@npm:1.0.0" + checksum: 9102e246d1ed9b37ac36f57f0a6ca55226876553251a31fc80677e71471f463a54c872dc78d5d7f80740c8ba624395cccbe8b60f7b690c4418f487d8e9fd1106 + languageName: node + linkType: hard + +"async-generator-function@npm:^1.0.0": + version: 1.0.0 + resolution: "async-generator-function@npm:1.0.0" + checksum: 74a71a4a2dd7afd06ebb612f6d612c7f4766a351bedffde466023bf6dae629e46b0d2cd38786239e0fbf245de0c7df76035465e16d1213774a0efb22fec0d713 + languageName: node + linkType: hard + "async-limiter@npm:~1.0.0": version: 1.0.1 resolution: "async-limiter@npm:1.0.1" @@ -12381,6 +13056,15 @@ __metadata: languageName: node linkType: hard +"available-typed-arrays@npm:^1.0.7": + version: 1.0.7 + resolution: "available-typed-arrays@npm:1.0.7" + dependencies: + possible-typed-array-names: ^1.0.0 + checksum: 1aa3ffbfe6578276996de660848b6e95669d9a95ad149e3dd0c0cda77db6ee1dbd9d1dd723b65b6d277b882dd0c4b91a654ae9d3cf9e1254b7e93e4908d78fd3 + languageName: node + linkType: hard + "axios@npm:^0.21.1": version: 0.21.4 resolution: "axios@npm:0.21.4" @@ -12840,6 +13524,15 @@ __metadata: languageName: node linkType: hard +"baseline-browser-mapping@npm:^2.9.0": + version: 2.9.0 + resolution: "baseline-browser-mapping@npm:2.9.0" + bin: + baseline-browser-mapping: dist/cli.js + checksum: bf357fb42ae0c41245f56494117b24831d674cd7977b9413d19e3e84db295758292e7a58edc7111720cc32611be44e24211e48314700ee101755d7ddbaac00a3 + languageName: node + linkType: hard + "batch@npm:0.6.1": version: 0.6.1 resolution: "batch@npm:0.6.1" @@ -12945,6 +13638,13 @@ __metadata: languageName: node linkType: hard +"blurhash@npm:2.0.5": + version: 2.0.5 + resolution: "blurhash@npm:2.0.5" + checksum: aa4d6855bbaae116065b118a7b1e889648c15047e72048c28bab3db426a042ce1dc032a30c55a52da6140c314534841b984ab11cc68303668dde446d6ca53bc6 + languageName: node + linkType: hard + "bn.js@npm:^4.11.9": version: 4.12.0 resolution: "bn.js@npm:4.12.0" @@ -13024,7 +13724,7 @@ __metadata: languageName: node linkType: hard -"boolbase@npm:^1.0.0, boolbase@npm:~1.0.0": +"boolbase@npm:^1.0.0": version: 1.0.0 resolution: "boolbase@npm:1.0.0" checksum: 3e25c80ef626c3a3487c73dbfc70ac322ec830666c9ad915d11b701142fab25ec1e63eff2c450c74347acfd2de854ccde865cd79ef4db1683f7c7b046ea43bb0 @@ -13109,6 +13809,15 @@ __metadata: languageName: node linkType: hard +"braces@npm:^3.0.3": + version: 3.0.3 + resolution: "braces@npm:3.0.3" + dependencies: + fill-range: ^7.1.1 + checksum: b95aa0b3bd909f6cd1720ffcf031aeaf46154dd88b4da01f9a1d3f7ea866a79eba76a6d01cbc3c422b2ee5cdc39a4f02491058d5df0d7bf6e6a162a832df1f69 + languageName: node + linkType: hard + "brorand@npm:^1.0.1, brorand@npm:^1.1.0": version: 1.1.0 resolution: "brorand@npm:1.1.0" @@ -13130,6 +13839,13 @@ __metadata: languageName: node linkType: hard +"browser-stdout@npm:1.3.1": + version: 1.3.1 + resolution: "browser-stdout@npm:1.3.1" + checksum: b717b19b25952dd6af483e368f9bcd6b14b87740c3d226c2977a65e84666ffd67000bddea7d911f111a9b6ddc822b234de42d52ab6507bce4119a4cc003ef7b3 + languageName: node + linkType: hard + "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" @@ -13232,6 +13948,21 @@ __metadata: languageName: node linkType: hard +"browserslist@npm:^4.23.0": + version: 4.28.1 + resolution: "browserslist@npm:4.28.1" + dependencies: + baseline-browser-mapping: ^2.9.0 + caniuse-lite: ^1.0.30001759 + electron-to-chromium: ^1.5.263 + node-releases: ^2.0.27 + update-browserslist-db: ^1.2.0 + bin: + browserslist: cli.js + checksum: 895357d912ae5a88a3fa454d2d280e9869e13432df30ca8918e206c0783b3b59375b178fdaf16d0041a1cf21ac45c8eb0a20f96f73dbd9662abf4cf613177a1e + languageName: node + linkType: hard + "bs-logger@npm:0.x": version: 0.2.6 resolution: "bs-logger@npm:0.2.6" @@ -13523,6 +14254,16 @@ __metadata: languageName: node linkType: hard +"call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2": + version: 1.0.2 + resolution: "call-bind-apply-helpers@npm:1.0.2" + dependencies: + es-errors: ^1.3.0 + function-bind: ^1.1.2 + checksum: b2863d74fcf2a6948221f65d95b91b4b2d90cfe8927650b506141e669f7d5de65cea191bf788838bc40d13846b7886c5bc5c84ab96c3adbcf88ad69a72fcdc6b + languageName: node + linkType: hard + "call-bind@npm:^1.0.0, call-bind@npm:^1.0.2": version: 1.0.2 resolution: "call-bind@npm:1.0.2" @@ -13544,35 +14285,32 @@ __metadata: languageName: node linkType: hard -"call-me-maybe@npm:^1.0.1": - version: 1.0.1 - resolution: "call-me-maybe@npm:1.0.1" - checksum: d19e9d6ac2c6a83fb1215718b64c5e233f688ebebb603bdfe4af59cde952df1f2b648530fab555bf290ea910d69d7d9665ebc916e871e0e194f47c2e48e4886b - languageName: node - linkType: hard - -"caller-callsite@npm:^2.0.0": - version: 2.0.0 - resolution: "caller-callsite@npm:2.0.0" +"call-bind@npm:^1.0.7, call-bind@npm:^1.0.8": + version: 1.0.8 + resolution: "call-bind@npm:1.0.8" dependencies: - callsites: ^2.0.0 - checksum: b685e9d126d9247b320cfdfeb3bc8da0c4be28d8fb98c471a96bc51aab3130099898a2fe3bf0308f0fe048d64c37d6d09f563958b9afce1a1e5e63d879c128a2 + call-bind-apply-helpers: ^1.0.0 + es-define-property: ^1.0.0 + get-intrinsic: ^1.2.4 + set-function-length: ^1.2.2 + checksum: aa2899bce917a5392fd73bd32e71799c37c0b7ab454e0ed13af7f6727549091182aade8bbb7b55f304a5bc436d543241c14090fb8a3137e9875e23f444f4f5a9 languageName: node linkType: hard -"caller-path@npm:^2.0.0": - version: 2.0.0 - resolution: "caller-path@npm:2.0.0" +"call-bound@npm:^1.0.2, call-bound@npm:^1.0.3, call-bound@npm:^1.0.4": + version: 1.0.4 + resolution: "call-bound@npm:1.0.4" dependencies: - caller-callsite: ^2.0.0 - checksum: 3e12ccd0c71ec10a057aac69e3ec175b721ca858c640df021ef0d25999e22f7c1d864934b596b7d47038e9b56b7ec315add042abbd15caac882998b50102fb12 + call-bind-apply-helpers: ^1.0.2 + get-intrinsic: ^1.3.0 + checksum: 2f6399488d1c272f56306ca60ff696575e2b7f31daf23bc11574798c84d9f2759dceb0cb1f471a85b77f28962a7ac6411f51d283ea2e45319009a19b6ccab3b2 languageName: node linkType: hard -"callsites@npm:^2.0.0": - version: 2.0.0 - resolution: "callsites@npm:2.0.0" - checksum: be2f67b247df913732b7dec1ec0bbfcdbaea263e5a95968b19ec7965affae9496b970e3024317e6d4baa8e28dc6ba0cec03f46fdddc2fdcc51396600e53c2623 +"call-me-maybe@npm:^1.0.1": + version: 1.0.1 + resolution: "call-me-maybe@npm:1.0.1" + checksum: d19e9d6ac2c6a83fb1215718b64c5e233f688ebebb603bdfe4af59cde952df1f2b648530fab555bf290ea910d69d7d9665ebc916e871e0e194f47c2e48e4886b languageName: node linkType: hard @@ -13667,6 +14405,13 @@ __metadata: languageName: node linkType: hard +"caniuse-lite@npm:^1.0.30001759": + version: 1.0.30001759 + resolution: "caniuse-lite@npm:1.0.30001759" + checksum: db200cf52ab976df18aaf75415e4c407a989bd538ac195f8ddd0993f0e158cfe0d048c26c0161b0409ed754745ea82830abbcbecace4afef9f1ecc9a4c0a0a50 + languageName: node + linkType: hard + "canvas-renderer@npm:~2.2.0": version: 2.2.0 resolution: "canvas-renderer@npm:2.2.0" @@ -13850,6 +14595,20 @@ __metadata: languageName: node linkType: hard +"character-entities-html4@npm:^2.0.0": + version: 2.1.0 + resolution: "character-entities-html4@npm:2.1.0" + checksum: 7034aa7c7fa90309667f6dd50499c8a760c3d3a6fb159adb4e0bada0107d194551cdbad0714302f62d06ce4ed68565c8c2e15fdef2e8f8764eb63fa92b34b11d + languageName: node + linkType: hard + +"character-entities-legacy@npm:^3.0.0": + version: 3.0.0 + resolution: "character-entities-legacy@npm:3.0.0" + checksum: 7582af055cb488b626d364b7d7a4e46b06abd526fb63c0e4eb35bcb9c9799cc4f76b39f34fdccef2d1174ac95e53e9ab355aae83227c1a2505877893fce77731 + languageName: node + linkType: hard + "character-entities@npm:^2.0.0": version: 2.0.1 resolution: "character-entities@npm:2.0.1" @@ -13873,6 +14632,25 @@ __metadata: languageName: node linkType: hard +"chokidar@npm:3.3.0": + version: 3.3.0 + resolution: "chokidar@npm:3.3.0" + dependencies: + anymatch: ~3.1.1 + braces: ~3.0.2 + fsevents: ~2.1.1 + glob-parent: ~5.1.0 + is-binary-path: ~2.1.0 + is-glob: ~4.0.1 + normalize-path: ~3.0.0 + readdirp: ~3.2.0 + dependenciesMeta: + fsevents: + optional: true + checksum: e9863256ebb29dbc5e58a7e2637439814beb63b772686cb9e94478312c24dcaf3d0570220c5e75ea29029f43b664f9956d87b716120d38cf755f32124f047e8e + languageName: node + linkType: hard + "chokidar@npm:3.5.3, chokidar@npm:^3.5.3": version: 3.5.3 resolution: "chokidar@npm:3.5.3" @@ -13981,23 +14759,72 @@ __metadata: languageName: node linkType: hard -"ckeditor5@npm:^31.0.0": - version: 31.0.0 - resolution: "ckeditor5@npm:31.0.0" - dependencies: - "@ckeditor/ckeditor5-clipboard": ^31.0.0 - "@ckeditor/ckeditor5-core": ^31.0.0 - "@ckeditor/ckeditor5-engine": ^31.0.0 - "@ckeditor/ckeditor5-enter": ^31.0.0 - "@ckeditor/ckeditor5-paragraph": ^31.0.0 - "@ckeditor/ckeditor5-select-all": ^31.0.0 - "@ckeditor/ckeditor5-typing": ^31.0.0 - "@ckeditor/ckeditor5-ui": ^31.0.0 - "@ckeditor/ckeditor5-undo": ^31.0.0 - "@ckeditor/ckeditor5-upload": ^31.0.0 - "@ckeditor/ckeditor5-utils": ^31.0.0 - "@ckeditor/ckeditor5-widget": ^31.0.0 - checksum: d49c677ccfcfc0501748a9f207449b4b82f8e44a59a989dcc81eecf9be8105da739791f73142dd56035a57db9b4e786c2372c016aa61e27554c3eba1787845c9 +"ckeditor5@npm:47.3.0": + version: 47.3.0 + resolution: "ckeditor5@npm:47.3.0" + dependencies: + "@ckeditor/ckeditor5-adapter-ckfinder": 47.3.0 + "@ckeditor/ckeditor5-alignment": 47.3.0 + "@ckeditor/ckeditor5-autoformat": 47.3.0 + "@ckeditor/ckeditor5-autosave": 47.3.0 + "@ckeditor/ckeditor5-basic-styles": 47.3.0 + "@ckeditor/ckeditor5-block-quote": 47.3.0 + "@ckeditor/ckeditor5-bookmark": 47.3.0 + "@ckeditor/ckeditor5-ckbox": 47.3.0 + "@ckeditor/ckeditor5-ckfinder": 47.3.0 + "@ckeditor/ckeditor5-clipboard": 47.3.0 + "@ckeditor/ckeditor5-cloud-services": 47.3.0 + "@ckeditor/ckeditor5-code-block": 47.3.0 + "@ckeditor/ckeditor5-core": 47.3.0 + "@ckeditor/ckeditor5-easy-image": 47.3.0 + "@ckeditor/ckeditor5-editor-balloon": 47.3.0 + "@ckeditor/ckeditor5-editor-classic": 47.3.0 + "@ckeditor/ckeditor5-editor-decoupled": 47.3.0 + "@ckeditor/ckeditor5-editor-inline": 47.3.0 + "@ckeditor/ckeditor5-editor-multi-root": 47.3.0 + "@ckeditor/ckeditor5-emoji": 47.3.0 + "@ckeditor/ckeditor5-engine": 47.3.0 + "@ckeditor/ckeditor5-enter": 47.3.0 + "@ckeditor/ckeditor5-essentials": 47.3.0 + "@ckeditor/ckeditor5-find-and-replace": 47.3.0 + "@ckeditor/ckeditor5-font": 47.3.0 + "@ckeditor/ckeditor5-fullscreen": 47.3.0 + "@ckeditor/ckeditor5-heading": 47.3.0 + "@ckeditor/ckeditor5-highlight": 47.3.0 + "@ckeditor/ckeditor5-horizontal-line": 47.3.0 + "@ckeditor/ckeditor5-html-embed": 47.3.0 + "@ckeditor/ckeditor5-html-support": 47.3.0 + "@ckeditor/ckeditor5-icons": 47.3.0 + "@ckeditor/ckeditor5-image": 47.3.0 + "@ckeditor/ckeditor5-indent": 47.3.0 + "@ckeditor/ckeditor5-language": 47.3.0 + "@ckeditor/ckeditor5-link": 47.3.0 + "@ckeditor/ckeditor5-list": 47.3.0 + "@ckeditor/ckeditor5-markdown-gfm": 47.3.0 + "@ckeditor/ckeditor5-media-embed": 47.3.0 + "@ckeditor/ckeditor5-mention": 47.3.0 + "@ckeditor/ckeditor5-minimap": 47.3.0 + "@ckeditor/ckeditor5-page-break": 47.3.0 + "@ckeditor/ckeditor5-paragraph": 47.3.0 + "@ckeditor/ckeditor5-paste-from-office": 47.3.0 + "@ckeditor/ckeditor5-remove-format": 47.3.0 + "@ckeditor/ckeditor5-restricted-editing": 47.3.0 + "@ckeditor/ckeditor5-select-all": 47.3.0 + "@ckeditor/ckeditor5-show-blocks": 47.3.0 + "@ckeditor/ckeditor5-source-editing": 47.3.0 + "@ckeditor/ckeditor5-special-characters": 47.3.0 + "@ckeditor/ckeditor5-style": 47.3.0 + "@ckeditor/ckeditor5-table": 47.3.0 + "@ckeditor/ckeditor5-theme-lark": 47.3.0 + "@ckeditor/ckeditor5-typing": 47.3.0 + "@ckeditor/ckeditor5-ui": 47.3.0 + "@ckeditor/ckeditor5-undo": 47.3.0 + "@ckeditor/ckeditor5-upload": 47.3.0 + "@ckeditor/ckeditor5-utils": 47.3.0 + "@ckeditor/ckeditor5-watchdog": 47.3.0 + "@ckeditor/ckeditor5-widget": 47.3.0 + "@ckeditor/ckeditor5-word-count": 47.3.0 + checksum: 73a568de9dc5b422c727d3d19ebbfc96853bc6cd77200ada4996c966fb1472873e4cd89a33dea8da1b45e712348492e7d10767bbe118c1710f77ca606625c93a languageName: node linkType: hard @@ -14100,6 +14927,13 @@ __metadata: languageName: node linkType: hard +"cli-spinners@npm:^2.6.1": + version: 2.9.2 + resolution: "cli-spinners@npm:2.9.2" + checksum: 1bd588289b28432e4676cb5d40505cfe3e53f2e4e10fbe05c8a710a154d6fe0ce7836844b00d6858f740f2ffe67cdc36e0fce9c7b6a8430e80e6388d5aa4956c + languageName: node + linkType: hard + "cli-table3@npm:^0.6.1, cli-table3@npm:^0.6.3": version: 0.6.3 resolution: "cli-table3@npm:0.6.3" @@ -14253,17 +15087,6 @@ __metadata: languageName: node linkType: hard -"coa@npm:^2.0.2": - version: 2.0.2 - resolution: "coa@npm:2.0.2" - dependencies: - "@types/q": ^1.5.1 - chalk: ^2.4.1 - q: ^1.1.2 - checksum: 44736914aac2160d3d840ed64432a90a3bb72285a0cd6a688eb5cabdf15d15a85eee0915b3f6f2a4659d5075817b1cb577340d3c9cbb47d636d59ab69f819552 - languageName: node - linkType: hard - "code-point-at@npm:^1.0.0": version: 1.1.0 resolution: "code-point-at@npm:1.1.0" @@ -14288,7 +15111,16 @@ __metadata: languageName: node linkType: hard -"color-convert@npm:^1.9.0, color-convert@npm:^1.9.3": +"color-convert@npm:3.1.0": + version: 3.1.0 + resolution: "color-convert@npm:3.1.0" + dependencies: + color-name: ^2.0.0 + checksum: 7fdcebff4b5c33596de4b7a14953fdadf17352b217821fa02c84dcb2f5b5da9ab179152e01a4d449027ba4aa02fc5ab587bcb2395a17dd0276be6e2d323b9353 + languageName: node + linkType: hard + +"color-convert@npm:^1.9.0": version: 1.9.3 resolution: "color-convert@npm:1.9.3" dependencies: @@ -14313,20 +15145,26 @@ __metadata: languageName: node linkType: hard -"color-name@npm:^1.0.0, color-name@npm:^1.1.4, color-name@npm:~1.1.4": +"color-name@npm:^1.1.4, color-name@npm:~1.1.4": version: 1.1.4 resolution: "color-name@npm:1.1.4" checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 languageName: node linkType: hard -"color-string@npm:^1.6.0": - version: 1.6.0 - resolution: "color-string@npm:1.6.0" +"color-name@npm:^2.0.0": + version: 2.1.0 + resolution: "color-name@npm:2.1.0" + checksum: eb014f71d87408e318e95d3f554f188370d354ba8e0ffa4341d0fd19de391bfe2bc96e563d4f6614644d676bc24f475560dffee3fe310c2d6865d007410a9a2b + languageName: node + linkType: hard + +"color-parse@npm:2.0.2": + version: 2.0.2 + resolution: "color-parse@npm:2.0.2" dependencies: - color-name: ^1.0.0 - simple-swizzle: ^0.2.2 - checksum: 33466a65277dd3d4ce24ef1991b47069292f75d1a43b0d2e7ea43076ba793728e965d50deed2b523f35519f4995a908253fcbcc774baceae8e439bc78c02e850 + color-name: ^2.0.0 + checksum: 4e9446a9b1320da14e9b552b9be767b4fa78c18fbadf8a5c37e83f7fc9687723e2083cf2a17cecc818dcc9d64771f74db7815f218251e18535d1e8f52951c841 languageName: node linkType: hard @@ -14339,16 +15177,6 @@ __metadata: languageName: node linkType: hard -"color@npm:^3.0.0": - version: 3.2.1 - resolution: "color@npm:3.2.1" - dependencies: - color-convert: ^1.9.3 - color-string: ^1.6.0 - checksum: f81220e8b774d35865c2561be921f5652117638dcda7ca4029262046e37fc2444ac7bbfdd110cf1fd9c074a4ee5eda8f85944ffbdda26186b602dd9bb05f6400 - languageName: node - linkType: hard - "colord@npm:^2.9.3": version: 2.9.3 resolution: "colord@npm:2.9.3" @@ -14438,6 +15266,13 @@ __metadata: languageName: node linkType: hard +"commander@npm:^7.2.0": + version: 7.2.0 + resolution: "commander@npm:7.2.0" + checksum: 53501cbeee61d5157546c0bef0fedb6cdfc763a882136284bed9a07225f09a14b82d2a84e7637edfd1a679fb35ed9502fd58ef1d091e6287f60d790147f68ddc + languageName: node + linkType: hard + "commander@npm:^8.3.0": version: 8.3.0 resolution: "commander@npm:8.3.0" @@ -14858,18 +15693,6 @@ __metadata: languageName: node linkType: hard -"cosmiconfig@npm:^5.0.0": - version: 5.2.1 - resolution: "cosmiconfig@npm:5.2.1" - dependencies: - import-fresh: ^2.0.0 - is-directory: ^0.3.1 - js-yaml: ^3.13.1 - parse-json: ^4.0.0 - checksum: 8b6f1d3c8a5ffdf663a952f17af0761adf210b7a5933d0fe8988f3ca3a1f0e1e5cbbb74d5b419c15933dd2fdcaec31dbc5cc85cb8259a822342b93b529eff89c - languageName: node - linkType: hard - "cosmiconfig@npm:^7.0.1": version: 7.1.0 resolution: "cosmiconfig@npm:7.1.0" @@ -15072,20 +15895,32 @@ __metadata: languageName: node linkType: hard -"css-color-names@npm:0.0.4, css-color-names@npm:^0.0.4": - version: 0.0.4 - resolution: "css-color-names@npm:0.0.4" - checksum: 9c6106320430a9da3a13daab8d8b4def39113edbfb68042444585d9a214af5fd5cb384b9be45124bc75f88261d461b517e00e278f4d2e0ab5a619b182f9f0e2d +"css-declaration-sorter@npm:^7.2.0": + version: 7.3.0 + resolution: "css-declaration-sorter@npm:7.3.0" + peerDependencies: + postcss: ^8.0.9 + checksum: 95c50616bfb60ad63855670b71139b9ee4c23da061e5d7b8beb65e991f141fa5cc69d90d089d88f50df6bde4ba7cae9c2b34b4cab02db62e72a0e772e29cb115 languageName: node linkType: hard -"css-declaration-sorter@npm:^4.0.1": - version: 4.0.1 - resolution: "css-declaration-sorter@npm:4.0.1" +"css-loader@npm:^5.2.7": + version: 5.2.7 + resolution: "css-loader@npm:5.2.7" dependencies: - postcss: ^7.0.1 - timsort: ^0.3.0 - checksum: c38c00245c6706bd1127a6a2807bbdea3a2621c1f4e4bcb4710f6736c15c4ec414e02213adeab2171623351616090cb96374f683b90ec2aad18903066c4526d7 + icss-utils: ^5.1.0 + loader-utils: ^2.0.0 + postcss: ^8.2.15 + postcss-modules-extract-imports: ^3.0.0 + postcss-modules-local-by-default: ^4.0.0 + postcss-modules-scope: ^3.0.0 + postcss-modules-values: ^4.0.0 + postcss-value-parser: ^4.1.0 + schema-utils: ^3.0.0 + semver: ^7.3.5 + peerDependencies: + webpack: ^4.27.0 || ^5.0.0 + checksum: fb0742b30ac0919f94b99a323bdefe6d48ae46d66c7d966aae59031350532f368f8bba5951fcd268f2e053c5e6e4655551076268e9073ccb58e453f98ae58f8e languageName: node linkType: hard @@ -15107,25 +15942,6 @@ __metadata: languageName: node linkType: hard -"css-select-base-adapter@npm:^0.1.1": - version: 0.1.1 - resolution: "css-select-base-adapter@npm:0.1.1" - checksum: c107e9cfa53a23427e4537451a67358375e656baa3322345a982d3c2751fb3904002aae7e5d72386c59f766fe6b109d1ffb43eeab1c16f069f7a3828eb17851c - languageName: node - linkType: hard - -"css-select@npm:^2.0.0": - version: 2.1.0 - resolution: "css-select@npm:2.1.0" - dependencies: - boolbase: ^1.0.0 - css-what: ^3.2.1 - domutils: ^1.7.0 - nth-check: ^1.0.2 - checksum: 0c4099910f2411e2a9103cf92ea6a4ad738b57da75bcf73d39ef2c14a00ef36e5f16cb863211c901320618b24ace74da6333442d82995cafd5040077307de462 - languageName: node - linkType: hard - "css-select@npm:^4.1.3": version: 4.1.3 resolution: "css-select@npm:4.1.3" @@ -15139,6 +15955,19 @@ __metadata: languageName: node linkType: hard +"css-select@npm:^5.1.0": + version: 5.2.2 + resolution: "css-select@npm:5.2.2" + dependencies: + boolbase: ^1.0.0 + css-what: ^6.1.0 + domhandler: ^5.0.2 + domutils: ^3.0.1 + nth-check: ^2.0.1 + checksum: 0ab672620c6bdfe4129dfecf202f6b90f92018b24a1a93cfbb295c24026d0163130ba4b98d7443f87246a2c1d67413798a7a5920cd102b0cfecfbc89896515aa + languageName: node + linkType: hard + "css-to-react-native@npm:^3.0.0": version: 3.0.0 resolution: "css-to-react-native@npm:3.0.0" @@ -15150,30 +15979,23 @@ __metadata: languageName: node linkType: hard -"css-tree@npm:1.0.0-alpha.37": - version: 1.0.0-alpha.37 - resolution: "css-tree@npm:1.0.0-alpha.37" +"css-tree@npm:^2.3.1": + version: 2.3.1 + resolution: "css-tree@npm:2.3.1" dependencies: - mdn-data: 2.0.4 - source-map: ^0.6.1 - checksum: 0e419a1388ec0fbbe92885fba4a557f9fb0e077a2a1fad629b7245bbf7b4ef5df49e6877401b952b09b9057ffe1a3dba74f6fdfbf7b2223a5a35bce27ff2307d + mdn-data: 2.0.30 + source-map-js: ^1.0.1 + checksum: 493cc24b5c22b05ee5314b8a0d72d8a5869491c1458017ae5ed75aeb6c3596637dbe1b11dac2548974624adec9f7a1f3a6cf40593dc1f9185eb0e8279543fbc0 languageName: node linkType: hard -"css-tree@npm:^1.1.2": - version: 1.1.3 - resolution: "css-tree@npm:1.1.3" +"css-tree@npm:~2.2.0": + version: 2.2.1 + resolution: "css-tree@npm:2.2.1" dependencies: - mdn-data: 2.0.14 - source-map: ^0.6.1 - checksum: 79f9b81803991b6977b7fcb1588799270438274d89066ce08f117f5cdb5e20019b446d766c61506dd772c839df84caa16042d6076f20c97187f5abe3b50e7d1f - languageName: node - linkType: hard - -"css-what@npm:^3.2.1": - version: 3.4.2 - resolution: "css-what@npm:3.4.2" - checksum: 26bb5ec3ae718393d418016365c849fa14bd0de408c735dea3ddf58146b6cc54f3b336fb4afd31d95c06ca79583acbcdfec7ee93d31ff5c1a697df135b38dfeb + mdn-data: 2.0.28 + source-map-js: ^1.0.1 + checksum: b94aa8cc2f09e6f66c91548411fcf74badcbad3e150345074715012d16333ce573596ff5dfca03c2a87edf1924716db765120f94247e919d72753628ba3aba27 languageName: node linkType: hard @@ -15184,6 +16006,13 @@ __metadata: languageName: node linkType: hard +"css-what@npm:^6.1.0": + version: 6.2.2 + resolution: "css-what@npm:6.2.2" + checksum: 4d1f07b348a638e1f8b4c72804a1e93881f35e0f541256aec5ac0497c5855df7db7ab02da030de950d4813044f6d029a14ca657e0f92c3987e4b604246235b2b + languageName: node + linkType: hard + "css.escape@npm:^1.5.1": version: 1.5.1 resolution: "css.escape@npm:1.5.1" @@ -15218,92 +16047,73 @@ __metadata: languageName: node linkType: hard -"cssnano-preset-default@npm:^4.0.8": - version: 4.0.8 - resolution: "cssnano-preset-default@npm:4.0.8" - dependencies: - css-declaration-sorter: ^4.0.1 - cssnano-util-raw-cache: ^4.0.1 - postcss: ^7.0.0 - postcss-calc: ^7.0.1 - postcss-colormin: ^4.0.3 - postcss-convert-values: ^4.0.1 - postcss-discard-comments: ^4.0.2 - postcss-discard-duplicates: ^4.0.2 - postcss-discard-empty: ^4.0.1 - postcss-discard-overridden: ^4.0.1 - postcss-merge-longhand: ^4.0.11 - postcss-merge-rules: ^4.0.3 - postcss-minify-font-values: ^4.0.2 - postcss-minify-gradients: ^4.0.2 - postcss-minify-params: ^4.0.2 - postcss-minify-selectors: ^4.0.2 - postcss-normalize-charset: ^4.0.1 - postcss-normalize-display-values: ^4.0.2 - postcss-normalize-positions: ^4.0.2 - postcss-normalize-repeat-style: ^4.0.2 - postcss-normalize-string: ^4.0.2 - postcss-normalize-timing-functions: ^4.0.2 - postcss-normalize-unicode: ^4.0.1 - postcss-normalize-url: ^4.0.1 - postcss-normalize-whitespace: ^4.0.2 - postcss-ordered-values: ^4.1.2 - postcss-reduce-initial: ^4.0.3 - postcss-reduce-transforms: ^4.0.2 - postcss-svgo: ^4.0.3 - postcss-unique-selectors: ^4.0.1 - checksum: eb32c9fdd8bd4683e33d62284b6a9c4eb705b745235f4bb51a5571e1eb6738f636958fc9a6218fb51de43e0e2f74386a705b4c7ff2d1dcc611647953ba6ce159 - languageName: node - linkType: hard - -"cssnano-util-get-arguments@npm:^4.0.0": - version: 4.0.0 - resolution: "cssnano-util-get-arguments@npm:4.0.0" - checksum: 34222a1e848d573b74892eda7d7560c5422efa56f87d2b5242f9791593c6aa4ddc9d55e8e1708fb2f0d6f87c456314b78d93d3eec97d946ff756c63b09b72222 - languageName: node - linkType: hard - -"cssnano-util-get-match@npm:^4.0.0": - version: 4.0.0 - resolution: "cssnano-util-get-match@npm:4.0.0" - checksum: 56eacea0eb3d923359c9714ab25edde5eb4859e495954615d5529e81cdfabc2d41b57055c7f6a2f08e7d89df3a2794ef659306b539505d7f4e7202b897396fc2 - languageName: node - linkType: hard - -"cssnano-util-raw-cache@npm:^4.0.1": - version: 4.0.1 - resolution: "cssnano-util-raw-cache@npm:4.0.1" - dependencies: - postcss: ^7.0.0 - checksum: 66a23e5e5255ff65d0f49f135d0ddfdb96433aeceb2708a31e4b4a652110755f103f6c91e0f439c8f3052818eb2b04ebf6334680a810296290e2c3467c14202b - languageName: node - linkType: hard - -"cssnano-util-same-parent@npm:^4.0.0": - version: 4.0.1 - resolution: "cssnano-util-same-parent@npm:4.0.1" - checksum: 97c6b3f670ee9d1d6342b6a1daf9867d5c08644365dc146bd76defd356069112148e382ca86fc3e6c55adf0687974f03535bba34df95efb468b266d2319c7b66 +"cssnano-preset-default@npm:^6.1.2": + version: 6.1.2 + resolution: "cssnano-preset-default@npm:6.1.2" + dependencies: + browserslist: ^4.23.0 + css-declaration-sorter: ^7.2.0 + cssnano-utils: ^4.0.2 + postcss-calc: ^9.0.1 + postcss-colormin: ^6.1.0 + postcss-convert-values: ^6.1.0 + postcss-discard-comments: ^6.0.2 + postcss-discard-duplicates: ^6.0.3 + postcss-discard-empty: ^6.0.3 + postcss-discard-overridden: ^6.0.2 + postcss-merge-longhand: ^6.0.5 + postcss-merge-rules: ^6.1.1 + postcss-minify-font-values: ^6.1.0 + postcss-minify-gradients: ^6.0.3 + postcss-minify-params: ^6.1.0 + postcss-minify-selectors: ^6.0.4 + postcss-normalize-charset: ^6.0.2 + postcss-normalize-display-values: ^6.0.2 + postcss-normalize-positions: ^6.0.2 + postcss-normalize-repeat-style: ^6.0.2 + postcss-normalize-string: ^6.0.2 + postcss-normalize-timing-functions: ^6.0.2 + postcss-normalize-unicode: ^6.1.0 + postcss-normalize-url: ^6.0.2 + postcss-normalize-whitespace: ^6.0.2 + postcss-ordered-values: ^6.0.2 + postcss-reduce-initial: ^6.1.0 + postcss-reduce-transforms: ^6.0.2 + postcss-svgo: ^6.0.3 + postcss-unique-selectors: ^6.0.4 + peerDependencies: + postcss: ^8.4.31 + checksum: 51d93e52df7141143947dc4695b5087c04b41ea153e4f4c0282ac012b62c7457c6aca244f604ae94fa3b4840903a30a1e7df38f8610e0b304d05e3065375ee56 + languageName: node + linkType: hard + +"cssnano-utils@npm:^4.0.2": + version: 4.0.2 + resolution: "cssnano-utils@npm:4.0.2" + peerDependencies: + postcss: ^8.4.31 + checksum: f04c6854e75d847c7a43aff835e003d5bc7387ddfc476f0ad3a2d63663d0cec41047d46604c1717bf6b5a8e24e54bb519e465ff78d62c7e073c7cbe2279bebaf languageName: node linkType: hard -"cssnano@npm:^4.0.0": - version: 4.1.11 - resolution: "cssnano@npm:4.1.11" +"cssnano@npm:^6.0.3": + version: 6.1.2 + resolution: "cssnano@npm:6.1.2" dependencies: - cosmiconfig: ^5.0.0 - cssnano-preset-default: ^4.0.8 - is-resolvable: ^1.0.0 - postcss: ^7.0.0 - checksum: 2453fbe9f9f9e2ffe87dc5c718578f1b801fc7b82eaad12f5564c84bb0faf1774ea52e01874ecd29d1782aa7d0d84f0dbc95001eed9866ebd9bc523638999c9b + cssnano-preset-default: ^6.1.2 + lilconfig: ^3.1.1 + peerDependencies: + postcss: ^8.4.31 + checksum: 65aad92c5ee0089ffd4cd933c18c65edbf7634f7c3cd833a499dc948aa7e4168be22130dfe83bde07fcdc87f7c45a02d09040b7f439498208bc90b8d5a9abcc8 languageName: node linkType: hard -"csso@npm:^4.0.2": - version: 4.2.0 - resolution: "csso@npm:4.2.0" +"csso@npm:^5.0.5": + version: 5.0.5 + resolution: "csso@npm:5.0.5" dependencies: - css-tree: ^1.1.2 - checksum: 380ba9663da3bcea58dee358a0d8c4468bb6539be3c439dc266ac41c047217f52fd698fb7e4b6b6ccdfb8cf53ef4ceed8cc8ceccb8dfca2aa628319826b5b998 + css-tree: ~2.2.0 + checksum: 0ad858d36bf5012ed243e9ec69962a867509061986d2ee07cc040a4b26e4d062c00d4c07e5ba8d430706ceb02dd87edd30a52b5937fd45b1b6f2119c4993d59a languageName: node linkType: hard @@ -15486,6 +16296,39 @@ __metadata: languageName: node linkType: hard +"data-view-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "data-view-buffer@npm:1.0.2" + dependencies: + call-bound: ^1.0.3 + es-errors: ^1.3.0 + is-data-view: ^1.0.2 + checksum: 1e1cd509c3037ac0f8ba320da3d1f8bf1a9f09b0be09394b5e40781b8cc15ff9834967ba7c9f843a425b34f9fe14ce44cf055af6662c44263424c1eb8d65659b + languageName: node + linkType: hard + +"data-view-byte-length@npm:^1.0.2": + version: 1.0.2 + resolution: "data-view-byte-length@npm:1.0.2" + dependencies: + call-bound: ^1.0.3 + es-errors: ^1.3.0 + is-data-view: ^1.0.2 + checksum: 3600c91ced1cfa935f19ef2abae11029e01738de8d229354d3b2a172bf0d7e4ed08ff8f53294b715569fdf72dfeaa96aa7652f479c0f60570878d88e7e8bddf6 + languageName: node + linkType: hard + +"data-view-byte-offset@npm:^1.0.1": + version: 1.0.1 + resolution: "data-view-byte-offset@npm:1.0.1" + dependencies: + call-bound: ^1.0.2 + es-errors: ^1.3.0 + is-data-view: ^1.0.1 + checksum: 8dd492cd51d19970876626b5b5169fbb67ca31ec1d1d3238ee6a71820ca8b80cafb141c485999db1ee1ef02f2cc3b99424c5eda8d59e852d9ebb79ab290eb5ee + languageName: node + linkType: hard + "dataloader@npm:2.0.0": version: 2.0.0 resolution: "dataloader@npm:2.0.0" @@ -15537,6 +16380,15 @@ __metadata: languageName: node linkType: hard +"debug@npm:3.2.6": + version: 3.2.6 + resolution: "debug@npm:3.2.6" + dependencies: + ms: ^2.1.1 + checksum: 07bc8b3a13ef3cfa6c06baf7871dfb174c291e5f85dbf566f086620c16b9c1a0e93bb8f1935ebbd07a683249e7e30286f2966e2ef461e8fd17b1b60732062d6b + languageName: node + linkType: hard + "debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1": version: 4.3.2 resolution: "debug@npm:4.3.2" @@ -15756,6 +16608,17 @@ __metadata: languageName: node linkType: hard +"define-data-property@npm:^1.1.4": + version: 1.1.4 + resolution: "define-data-property@npm:1.1.4" + dependencies: + es-define-property: ^1.0.0 + es-errors: ^1.3.0 + gopd: ^1.0.1 + checksum: 8068ee6cab694d409ac25936eb861eea704b7763f7f342adbdfe337fc27c78d7ae0eff2364b2917b58c508d723c7a074326d068eef2e45c4edcd85cf94d0313b + languageName: node + linkType: hard + "define-lazy-prop@npm:^2.0.0": version: 2.0.0 resolution: "define-lazy-prop@npm:2.0.0" @@ -15763,6 +16626,17 @@ __metadata: languageName: node linkType: hard +"define-properties@npm:^1.1.2, define-properties@npm:^1.2.1": + version: 1.2.1 + resolution: "define-properties@npm:1.2.1" + dependencies: + define-data-property: ^1.0.1 + has-property-descriptors: ^1.0.0 + object-keys: ^1.1.1 + checksum: b4ccd00597dd46cb2d4a379398f5b19fca84a16f3374e2249201992f36b30f6835949a9429669ee6b41b6e837205a163eadd745e472069e70dfc10f03e5fcc12 + languageName: node + linkType: hard + "define-properties@npm:^1.1.3": version: 1.1.3 resolution: "define-properties@npm:1.1.3" @@ -16044,6 +16918,15 @@ __metadata: languageName: node linkType: hard +"devlop@npm:^1.0.0, devlop@npm:^1.1.0": + version: 1.1.0 + resolution: "devlop@npm:1.1.0" + dependencies: + dequal: ^2.0.0 + checksum: d2ff650bac0bb6ef08c48f3ba98640bb5fec5cce81e9957eb620408d1bab1204d382a45b785c6b3314dc867bb0684936b84c6867820da6db97cbb5d3c15dd185 + languageName: node + linkType: hard + "diacritics@npm:1.3.0": version: 1.3.0 resolution: "diacritics@npm:1.3.0" @@ -16079,7 +16962,7 @@ __metadata: languageName: node linkType: hard -"diff@npm:^3.5.0": +"diff@npm:3.5.0, diff@npm:^3.5.0": version: 3.5.0 resolution: "diff@npm:3.5.0" checksum: 00842950a6551e26ce495bdbce11047e31667deea546527902661f25cc2e73358967ebc78cf86b1a9736ec3e14286433225f9970678155753a6291c3bca5227b @@ -16144,16 +17027,6 @@ __metadata: languageName: node linkType: hard -"dir-glob@npm:2.0.0": - version: 2.0.0 - resolution: "dir-glob@npm:2.0.0" - dependencies: - arrify: ^1.0.1 - path-type: ^3.0.0 - checksum: adc4dc5dd9d2cc0a9ce864e52f9ac1c93e34487720fbed68bdf94cef7a9d88be430cc565300750571589dd35e168d0b286120317c0797f83a7cd8e6d9c69fcb7 - languageName: node - linkType: hard - "dir-glob@npm:^2.2.2": version: 2.2.2 resolution: "dir-glob@npm:2.2.2" @@ -16354,7 +17227,7 @@ __metadata: languageName: node linkType: hard -"domutils@npm:^1.5.1, domutils@npm:^1.7.0": +"domutils@npm:^1.5.1": version: 1.7.0 resolution: "domutils@npm:1.7.0" dependencies: @@ -16396,7 +17269,7 @@ __metadata: languageName: node linkType: hard -"dot-prop@npm:^5.1.0, dot-prop@npm:^5.2.0": +"dot-prop@npm:^5.1.0": version: 5.3.0 resolution: "dot-prop@npm:5.3.0" dependencies: @@ -16447,6 +17320,17 @@ __metadata: languageName: node linkType: hard +"dunder-proto@npm:^1.0.0, dunder-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "dunder-proto@npm:1.0.1" + dependencies: + call-bind-apply-helpers: ^1.0.1 + es-errors: ^1.3.0 + gopd: ^1.2.0 + checksum: 149207e36f07bd4941921b0ca929e3a28f1da7bd6b6ff8ff7f4e2f2e460675af4576eeba359c635723dc189b64cdd4787e0255897d5b135ccc5d15cb8685fc90 + languageName: node + linkType: hard + "duplexer2@npm:~0.1.0, duplexer2@npm:~0.1.4": version: 0.1.4 resolution: "duplexer2@npm:0.1.4" @@ -16549,6 +17433,13 @@ __metadata: languageName: node linkType: hard +"electron-to-chromium@npm:^1.5.263": + version: 1.5.263 + resolution: "electron-to-chromium@npm:1.5.263" + checksum: 0ebdb43b8c94bdbf5ef285dd2ae0bacc9e8c37173f20e053f4172118f4e6e26fb3967899d286e0f2a22e89a45b8a5a6c39598ac5439abdc3666dc46d4b0bc02b + languageName: node + linkType: hard + "elegant-spinner@npm:^1.0.1": version: 1.0.1 resolution: "elegant-spinner@npm:1.0.1" @@ -16755,34 +17646,6 @@ __metadata: languageName: node linkType: hard -"es-abstract@npm:^1.17.2, es-abstract@npm:^1.19.1": - version: 1.19.1 - resolution: "es-abstract@npm:1.19.1" - dependencies: - call-bind: ^1.0.2 - es-to-primitive: ^1.2.1 - function-bind: ^1.1.1 - get-intrinsic: ^1.1.1 - get-symbol-description: ^1.0.0 - has: ^1.0.3 - has-symbols: ^1.0.2 - internal-slot: ^1.0.3 - is-callable: ^1.2.4 - is-negative-zero: ^2.0.1 - is-regex: ^1.1.4 - is-shared-array-buffer: ^1.0.1 - is-string: ^1.0.7 - is-weakref: ^1.0.1 - object-inspect: ^1.11.0 - object-keys: ^1.1.1 - object.assign: ^4.1.2 - string.prototype.trimend: ^1.0.4 - string.prototype.trimstart: ^1.0.4 - unbox-primitive: ^1.0.1 - checksum: b6be8410672c5364db3fb01eb786e30c7b4bb32b4af63d381c08840f4382c4a168e7855cd338bf59d4f1a1a1138f4d748d1fd40ec65aaa071876f9e9fbfed949 - languageName: node - linkType: hard - "es-abstract@npm:^1.22.1": version: 1.22.3 resolution: "es-abstract@npm:1.22.3" @@ -16830,6 +17693,89 @@ __metadata: languageName: node linkType: hard +"es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.5, es-abstract@npm:^1.23.9": + version: 1.24.0 + resolution: "es-abstract@npm:1.24.0" + dependencies: + array-buffer-byte-length: ^1.0.2 + arraybuffer.prototype.slice: ^1.0.4 + available-typed-arrays: ^1.0.7 + call-bind: ^1.0.8 + call-bound: ^1.0.4 + data-view-buffer: ^1.0.2 + data-view-byte-length: ^1.0.2 + data-view-byte-offset: ^1.0.1 + es-define-property: ^1.0.1 + es-errors: ^1.3.0 + es-object-atoms: ^1.1.1 + es-set-tostringtag: ^2.1.0 + es-to-primitive: ^1.3.0 + function.prototype.name: ^1.1.8 + get-intrinsic: ^1.3.0 + get-proto: ^1.0.1 + get-symbol-description: ^1.1.0 + globalthis: ^1.0.4 + gopd: ^1.2.0 + has-property-descriptors: ^1.0.2 + has-proto: ^1.2.0 + has-symbols: ^1.1.0 + hasown: ^2.0.2 + internal-slot: ^1.1.0 + is-array-buffer: ^3.0.5 + is-callable: ^1.2.7 + is-data-view: ^1.0.2 + is-negative-zero: ^2.0.3 + is-regex: ^1.2.1 + is-set: ^2.0.3 + is-shared-array-buffer: ^1.0.4 + is-string: ^1.1.1 + is-typed-array: ^1.1.15 + is-weakref: ^1.1.1 + math-intrinsics: ^1.1.0 + object-inspect: ^1.13.4 + object-keys: ^1.1.1 + object.assign: ^4.1.7 + own-keys: ^1.0.1 + regexp.prototype.flags: ^1.5.4 + safe-array-concat: ^1.1.3 + safe-push-apply: ^1.0.0 + safe-regex-test: ^1.1.0 + set-proto: ^1.0.0 + stop-iteration-iterator: ^1.1.0 + string.prototype.trim: ^1.2.10 + string.prototype.trimend: ^1.0.9 + string.prototype.trimstart: ^1.0.8 + typed-array-buffer: ^1.0.3 + typed-array-byte-length: ^1.0.3 + typed-array-byte-offset: ^1.0.4 + typed-array-length: ^1.0.7 + unbox-primitive: ^1.1.0 + which-typed-array: ^1.1.19 + checksum: 06b3d605e56e3da9d16d4db2629a42dac1ca31f2961a41d15c860422a266115e865b43e82d6b9da81a0fabbbb65ebc12fb68b0b755bc9dbddacb6bf7450e96df + languageName: node + linkType: hard + +"es-array-method-boxes-properly@npm:^1.0.0": + version: 1.0.0 + resolution: "es-array-method-boxes-properly@npm:1.0.0" + checksum: 2537fcd1cecf187083890bc6f5236d3a26bf39237433587e5bf63392e88faae929dbba78ff0120681a3f6f81c23fe3816122982c160d63b38c95c830b633b826 + languageName: node + linkType: hard + +"es-define-property@npm:^1.0.0, es-define-property@npm:^1.0.1": + version: 1.0.1 + resolution: "es-define-property@npm:1.0.1" + checksum: 0512f4e5d564021c9e3a644437b0155af2679d10d80f21adaf868e64d30efdfbd321631956f20f42d655fedb2e3a027da479fad3fa6048f768eb453a80a5f80a + languageName: node + linkType: hard + +"es-errors@npm:^1.3.0": + version: 1.3.0 + resolution: "es-errors@npm:1.3.0" + checksum: ec1414527a0ccacd7f15f4a3bc66e215f04f595ba23ca75cdae0927af099b5ec865f9f4d33e9d7e86f512f252876ac77d4281a7871531a50678132429b1271b5 + languageName: node + linkType: hard + "es-get-iterator@npm:^1.1.3": version: 1.1.3 resolution: "es-get-iterator@npm:1.1.3" @@ -16854,6 +17800,15 @@ __metadata: languageName: node linkType: hard +"es-object-atoms@npm:^1.0.0, es-object-atoms@npm:^1.1.1": + version: 1.1.1 + resolution: "es-object-atoms@npm:1.1.1" + dependencies: + es-errors: ^1.3.0 + checksum: 214d3767287b12f36d3d7267ef342bbbe1e89f899cfd67040309fc65032372a8e60201410a99a1645f2f90c1912c8c49c8668066f6bdd954bcd614dda2e3da97 + languageName: node + linkType: hard + "es-set-tostringtag@npm:^2.0.1": version: 2.0.2 resolution: "es-set-tostringtag@npm:2.0.2" @@ -16865,6 +17820,18 @@ __metadata: languageName: node linkType: hard +"es-set-tostringtag@npm:^2.1.0": + version: 2.1.0 + resolution: "es-set-tostringtag@npm:2.1.0" + dependencies: + es-errors: ^1.3.0 + get-intrinsic: ^1.2.6 + has-tostringtag: ^1.0.2 + hasown: ^2.0.2 + checksum: 789f35de4be3dc8d11fdcb91bc26af4ae3e6d602caa93299a8c45cf05d36cc5081454ae2a6d3afa09cceca214b76c046e4f8151e092e6fc7feeb5efb9e794fc6 + languageName: node + linkType: hard + "es-shim-unscopables@npm:^1.0.0": version: 1.0.2 resolution: "es-shim-unscopables@npm:1.0.2" @@ -16885,6 +17852,29 @@ __metadata: languageName: node linkType: hard +"es-to-primitive@npm:^1.3.0": + version: 1.3.0 + resolution: "es-to-primitive@npm:1.3.0" + dependencies: + is-callable: ^1.2.7 + is-date-object: ^1.0.5 + is-symbol: ^1.0.4 + checksum: 966965880356486cd4d1fe9a523deda2084c81b3702d951212c098f5f2ee93605d1b7c1840062efb48a07d892641c7ed1bc194db563645c0dd2b919cb6d65b93 + languageName: node + linkType: hard + +"es-toolkit@npm:1.39.5": + version: 1.39.5 + resolution: "es-toolkit@npm:1.39.5" + dependenciesMeta: + "@trivago/prettier-plugin-sort-imports@4.3.0": + unplugged: true + prettier-plugin-sort-re-exports@0.0.1: + unplugged: true + checksum: 92295637b10fb717c8b2cfd2423caa839a10636ed49d7b79bb2acfb364fe43769aa3c19fa9cc54e2638b6fe8acdc5035611096e4a53bdda65de1f8e62b02a2ad + languageName: node + linkType: hard + "es6-error@npm:^4.0.1": version: 4.1.1 resolution: "es6-error@npm:4.1.1" @@ -16899,6 +17889,20 @@ __metadata: languageName: node linkType: hard +"esbuild-loader@npm:~3.0.1": + version: 3.0.1 + resolution: "esbuild-loader@npm:3.0.1" + dependencies: + esbuild: ^0.17.6 + get-tsconfig: ^4.4.0 + loader-utils: ^2.0.4 + webpack-sources: ^1.4.3 + peerDependencies: + webpack: ^4.40.0 || ^5.0.0 + checksum: c8925eb3c04f53841bfc387fb6897e52735fbfb3bcfae2401c98aa076907ab85672cda520de1bc5db9c4ec5e0d4effdf12b04fa4c980b51a6af9192b70110697 + languageName: node + linkType: hard + "esbuild-plugin-alias@npm:^0.2.1": version: 0.2.1 resolution: "esbuild-plugin-alias@npm:0.2.1" @@ -16994,7 +17998,7 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:^0.17.0": +"esbuild@npm:^0.17.0, esbuild@npm:^0.17.6": version: 0.17.19 resolution: "esbuild@npm:0.17.19" dependencies: @@ -17078,6 +18082,13 @@ __metadata: languageName: node linkType: hard +"escalade@npm:^3.2.0": + version: 3.2.0 + resolution: "escalade@npm:3.2.0" + checksum: 47b029c83de01b0d17ad99ed766347b974b0d628e848de404018f3abee728e987da0d2d370ad4574aa3d5b5bfc368754fd085d69a30f8e75903486ec4b5b709e + languageName: node + linkType: hard + "escape-html@npm:~1.0.3": version: 1.0.3 resolution: "escape-html@npm:1.0.3" @@ -17085,6 +18096,13 @@ __metadata: languageName: node linkType: hard +"escape-string-regexp@npm:1.0.5, escape-string-regexp@npm:^1.0.2, escape-string-regexp@npm:^1.0.3, escape-string-regexp@npm:^1.0.5": + version: 1.0.5 + resolution: "escape-string-regexp@npm:1.0.5" + checksum: 6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410 + languageName: node + linkType: hard + "escape-string-regexp@npm:5.0.0, escape-string-regexp@npm:^5.0.0": version: 5.0.0 resolution: "escape-string-regexp@npm:5.0.0" @@ -17092,13 +18110,6 @@ __metadata: languageName: node linkType: hard -"escape-string-regexp@npm:^1.0.2, escape-string-regexp@npm:^1.0.3, escape-string-regexp@npm:^1.0.5": - version: 1.0.5 - resolution: "escape-string-regexp@npm:1.0.5" - checksum: 6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410 - languageName: node - linkType: hard - "escape-string-regexp@npm:^2.0.0": version: 2.0.0 resolution: "escape-string-regexp@npm:2.0.0" @@ -17113,7 +18124,7 @@ __metadata: languageName: node linkType: hard -"escodegen@npm:^1.8.1, escodegen@npm:^1.9.0": +"escodegen@npm:^1.8.1": version: 1.14.3 resolution: "escodegen@npm:1.14.3" dependencies: @@ -17880,7 +18891,7 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^2.0.2, fast-glob@npm:^2.2.6": +"fast-glob@npm:^2.2.6": version: 2.2.7 resolution: "fast-glob@npm:2.2.7" dependencies: @@ -17907,6 +18918,19 @@ __metadata: languageName: node linkType: hard +"fast-glob@npm:^3.2.11": + version: 3.3.3 + resolution: "fast-glob@npm:3.3.3" + dependencies: + "@nodelib/fs.stat": ^2.0.2 + "@nodelib/fs.walk": ^1.2.3 + glob-parent: ^5.1.2 + merge2: ^1.3.0 + micromatch: ^4.0.8 + checksum: 0704d7b85c0305fd2cef37777337dfa26230fdd072dce9fb5c82a4b03156f3ffb8ed3e636033e65d45d2a5805a4e475825369a27404c0307f2db0c8eb3366fbd + languageName: node + linkType: hard + "fast-glob@npm:^3.2.12": version: 3.3.1 resolution: "fast-glob@npm:3.3.1" @@ -18189,6 +19213,15 @@ __metadata: languageName: node linkType: hard +"fill-range@npm:^7.1.1": + version: 7.1.1 + resolution: "fill-range@npm:7.1.1" + dependencies: + to-regex-range: ^5.0.1 + checksum: b4abfbca3839a3d55e4ae5ec62e131e2e356bf4859ce8480c64c4876100f4df292a63e5bb1618e1d7460282ca2b305653064f01654474aa35c68000980f17798 + languageName: node + linkType: hard + "filter-obj@npm:^1.1.0": version: 1.1.0 resolution: "filter-obj@npm:1.1.0" @@ -18280,6 +19313,15 @@ __metadata: languageName: node linkType: hard +"find-up@npm:3.0.0, find-up@npm:^3.0.0": + version: 3.0.0 + resolution: "find-up@npm:3.0.0" + dependencies: + locate-path: ^3.0.0 + checksum: 38eba3fe7a66e4bc7f0f5a1366dc25508b7cfc349f852640e3678d26ad9a6d7e2c43eff0a472287de4a9753ef58f066a0ea892a256fa3636ad51b3fe1e17fae9 + languageName: node + linkType: hard + "find-up@npm:^2.0.0": version: 2.1.0 resolution: "find-up@npm:2.1.0" @@ -18289,15 +19331,6 @@ __metadata: languageName: node linkType: hard -"find-up@npm:^3.0.0": - version: 3.0.0 - resolution: "find-up@npm:3.0.0" - dependencies: - locate-path: ^3.0.0 - checksum: 38eba3fe7a66e4bc7f0f5a1366dc25508b7cfc349f852640e3678d26ad9a6d7e2c43eff0a472287de4a9753ef58f066a0ea892a256fa3636ad51b3fe1e17fae9 - languageName: node - linkType: hard - "find-up@npm:^4.0.0, find-up@npm:^4.1.0": version: 4.1.0 resolution: "find-up@npm:4.1.0" @@ -18347,6 +19380,17 @@ __metadata: languageName: node linkType: hard +"flat@npm:^4.1.0": + version: 4.1.1 + resolution: "flat@npm:4.1.1" + dependencies: + is-buffer: ~2.0.3 + bin: + flat: cli.js + checksum: 398be12185eb0f3c59797c3670a8c35d07020b673363175676afbaf53d6b213660e060488554cf82c25504986e1a6059bdbcc5d562e87ca3e972e8a33148e3ae + languageName: node + linkType: hard + "flatted@npm:^3.1.0": version: 3.2.4 resolution: "flatted@npm:3.2.4" @@ -18402,6 +19446,15 @@ __metadata: languageName: node linkType: hard +"for-each@npm:^0.3.5": + version: 0.3.5 + resolution: "for-each@npm:0.3.5" + dependencies: + is-callable: ^1.2.7 + checksum: 3c986d7e11f4381237cc98baa0a2f87eabe74719eee65ed7bed275163082b940ede19268c61d04c6260e0215983b12f8d885e3c8f9aa8c2113bf07c37051745c + languageName: node + linkType: hard + "for-in@npm:^1.0.2": version: 1.0.2 resolution: "for-in@npm:1.0.2" @@ -18643,6 +19696,17 @@ __metadata: languageName: node linkType: hard +"fs-extra@npm:^11.2.0": + version: 11.3.2 + resolution: "fs-extra@npm:11.3.2" + dependencies: + graceful-fs: ^4.2.0 + jsonfile: ^6.0.1 + universalify: ^2.0.0 + checksum: 24a7a6e09668add7f74bf6884086b860ce39c7883d94f564623d4ca5c904ff9e5e33fa6333bd3efbf3528333cdedf974e49fa0723e9debf952f0882e6553d81e + languageName: node + linkType: hard + "fs-extra@npm:^8.1.0": version: 8.1.0 resolution: "fs-extra@npm:8.1.0" @@ -18712,6 +19776,16 @@ __metadata: languageName: node linkType: hard +"fsevents@npm:~2.1.1": + version: 2.1.3 + resolution: "fsevents@npm:2.1.3" + dependencies: + node-gyp: latest + checksum: b5ec0516b44d75b60af5c01ff80a80cd995d175e4640d2a92fbabd02991dd664d76b241b65feef0775c23d531c3c74742c0fbacd6205af812a9c3cef59f04292 + conditions: os=darwin + languageName: node + linkType: hard + "fsevents@patch:fsevents@^2.3.2#~builtin, fsevents@patch:fsevents@~2.3.2#~builtin": version: 2.3.2 resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin::version=2.3.2&hash=df0bf1" @@ -18721,6 +19795,15 @@ __metadata: languageName: node linkType: hard +"fsevents@patch:fsevents@~2.1.1#~builtin": + version: 2.1.3 + resolution: "fsevents@patch:fsevents@npm%3A2.1.3#~builtin::version=2.1.3&hash=31d12a" + dependencies: + node-gyp: latest + conditions: os=darwin + languageName: node + linkType: hard + "fstream@npm:^1.0.12": version: 1.0.12 resolution: "fstream@npm:1.0.12" @@ -18759,6 +19842,20 @@ __metadata: languageName: node linkType: hard +"function.prototype.name@npm:^1.1.8": + version: 1.1.8 + resolution: "function.prototype.name@npm:1.1.8" + dependencies: + call-bind: ^1.0.8 + call-bound: ^1.0.3 + define-properties: ^1.2.1 + functions-have-names: ^1.2.3 + hasown: ^2.0.2 + is-callable: ^1.2.7 + checksum: 3a366535dc08b25f40a322efefa83b2da3cd0f6da41db7775f2339679120ef63b6c7e967266182609e655b8f0a8f65596ed21c7fd72ad8bd5621c2340edd4010 + languageName: node + linkType: hard + "functional-red-black-tree@npm:^1.0.1": version: 1.0.1 resolution: "functional-red-black-tree@npm:1.0.1" @@ -18773,6 +19870,13 @@ __metadata: languageName: node linkType: hard +"fuzzysort@npm:3.1.0": + version: 3.1.0 + resolution: "fuzzysort@npm:3.1.0" + checksum: 5cca05625976bde961812b7f6c03beb48a69fc9db07edce5cf16686cd48252c4b7ea88d3aaa055c8c7ad17c19a6eea834c40a73bcfb9823a4c3eccc8193538e2 + languageName: node + linkType: hard + "gauge@npm:^3.0.0": version: 3.0.2 resolution: "gauge@npm:3.0.2" @@ -18822,6 +19926,13 @@ __metadata: languageName: node linkType: hard +"generator-function@npm:^2.0.0": + version: 2.0.1 + resolution: "generator-function@npm:2.0.1" + checksum: 3bf87f7b0230de5d74529677e6c3ceb3b7b5d9618b5a22d92b45ce3876defbaf5a77791b25a61b0fa7d13f95675b5ff67a7769f3b9af33f096e34653519e873d + languageName: node + linkType: hard + "gensync@npm:^1.0.0-beta.2": version: 1.0.0-beta.2 resolution: "gensync@npm:1.0.0-beta.2" @@ -18836,7 +19947,7 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.0, get-intrinsic@npm:^1.1.1": +"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1": version: 1.1.1 resolution: "get-intrinsic@npm:1.1.1" dependencies: @@ -18871,6 +19982,27 @@ __metadata: languageName: node linkType: hard +"get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.2.7, get-intrinsic@npm:^1.3.0": + version: 1.3.1 + resolution: "get-intrinsic@npm:1.3.1" + dependencies: + async-function: ^1.0.0 + async-generator-function: ^1.0.0 + call-bind-apply-helpers: ^1.0.2 + es-define-property: ^1.0.1 + es-errors: ^1.3.0 + es-object-atoms: ^1.1.1 + function-bind: ^1.1.2 + generator-function: ^2.0.0 + get-proto: ^1.0.1 + gopd: ^1.2.0 + has-symbols: ^1.1.0 + hasown: ^2.0.2 + math-intrinsics: ^1.1.0 + checksum: c02b3b6a445f9cd53e14896303794ac60f9751f58a69099127248abdb0251957174c6524245fc68579dc8e6a35161d3d94c93e665f808274716f4248b269436a + languageName: node + linkType: hard + "get-npm-tarball-url@npm:^2.0.3": version: 2.0.3 resolution: "get-npm-tarball-url@npm:2.0.3" @@ -18899,6 +20031,16 @@ __metadata: languageName: node linkType: hard +"get-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "get-proto@npm:1.0.1" + dependencies: + dunder-proto: ^1.0.1 + es-object-atoms: ^1.0.0 + checksum: 4fc96afdb58ced9a67558698b91433e6b037aaa6f1493af77498d7c85b141382cf223c0e5946f334fb328ee85dfe6edd06d218eaf09556f4bc4ec6005d7f5f7b + languageName: node + linkType: hard + "get-stream@npm:^4.0.0, get-stream@npm:^4.1.0": version: 4.1.0 resolution: "get-stream@npm:4.1.0" @@ -18948,6 +20090,26 @@ __metadata: languageName: node linkType: hard +"get-symbol-description@npm:^1.1.0": + version: 1.1.0 + resolution: "get-symbol-description@npm:1.1.0" + dependencies: + call-bound: ^1.0.3 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.6 + checksum: 655ed04db48ee65ef2ddbe096540d4405e79ba0a7f54225775fef43a7e2afcb93a77d141c5f05fdef0afce2eb93bcbfb3597142189d562ac167ff183582683cd + languageName: node + linkType: hard + +"get-tsconfig@npm:^4.4.0": + version: 4.13.0 + resolution: "get-tsconfig@npm:4.13.0" + dependencies: + resolve-pkg-maps: ^1.0.0 + checksum: b3cfa1316dd8842e038f6a3dc02ae87d9f3a227f14b79ac4b1c81bf6fc75de4dfc3355c4117612e183f5147dad49c8132841c7fdd7a4508531d820a9b90acc51 + languageName: node + linkType: hard + "get-value@npm:^2.0.3, get-value@npm:^2.0.6": version: 2.0.6 resolution: "get-value@npm:2.0.6" @@ -19003,7 +20165,7 @@ __metadata: languageName: node linkType: hard -"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": +"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.0, glob-parent@npm:~5.1.2": version: 5.1.2 resolution: "glob-parent@npm:5.1.2" dependencies: @@ -19046,6 +20208,20 @@ __metadata: languageName: node linkType: hard +"glob@npm:7.1.3": + version: 7.1.3 + resolution: "glob@npm:7.1.3" + dependencies: + fs.realpath: ^1.0.0 + inflight: ^1.0.4 + inherits: 2 + minimatch: ^3.0.4 + once: ^1.3.0 + path-is-absolute: ^1.0.0 + checksum: d72a834a393948d6c4a5cacc6a29fe5fe190e1cd134e55dfba09aee0be6fe15be343e96d8ec43558ab67ff8af28e4420c7f63a4d4db1c779e515015e9c318616 + languageName: node + linkType: hard + "glob@npm:8.0.3, glob@npm:^8.0.1": version: 8.0.3 resolution: "glob@npm:8.0.3" @@ -19158,6 +20334,16 @@ __metadata: languageName: node linkType: hard +"globalthis@npm:^1.0.4": + version: 1.0.4 + resolution: "globalthis@npm:1.0.4" + dependencies: + define-properties: ^1.2.1 + gopd: ^1.0.1 + checksum: 39ad667ad9f01476474633a1834a70842041f70a55571e8dcef5fb957980a92da5022db5430fca8aecc5d47704ae30618c0bc877a579c70710c904e9ef06108a + languageName: node + linkType: hard + "globby@npm:^10.0.1": version: 10.0.2 resolution: "globby@npm:10.0.2" @@ -19229,21 +20415,6 @@ __metadata: languageName: node linkType: hard -"globby@npm:^8.0.1": - version: 8.0.2 - resolution: "globby@npm:8.0.2" - dependencies: - array-union: ^1.0.1 - dir-glob: 2.0.0 - fast-glob: ^2.0.2 - glob: ^7.1.2 - ignore: ^3.3.5 - pify: ^3.0.0 - slash: ^1.0.0 - checksum: 87dc31e0b812d3a6beee200555c252591d23ef12f8347bce3b61fa185a99fbe7ae1694ed30cc01a353e27369d6a8e1e50a97f1c5e2547fa7b1d87d8392ff9264 - languageName: node - linkType: hard - "globby@npm:^9.2.0": version: 9.2.0 resolution: "globby@npm:9.2.0" @@ -19276,6 +20447,13 @@ __metadata: languageName: node linkType: hard +"gopd@npm:^1.2.0": + version: 1.2.0 + resolution: "gopd@npm:1.2.0" + checksum: cc6d8e655e360955bdccaca51a12a474268f95bb793fc3e1f2bdadb075f28bfd1fd988dab872daf77a61d78cbaf13744bc8727a17cfb1d150d76047d805375f3 + languageName: node + linkType: hard + "got@npm:^9.6.0": version: 9.6.0 resolution: "got@npm:9.6.0" @@ -19468,6 +20646,13 @@ __metadata: languageName: node linkType: hard +"growl@npm:1.10.5": + version: 1.10.5 + resolution: "growl@npm:1.10.5" + checksum: 4b86685de6831cebcbb19f93870bea624afee61124b0a20c49017013987cd129e73a8c4baeca295728f41d21265e1f859d25ef36731b142ca59c655fea94bb1a + languageName: node + linkType: hard + "gunzip-maybe@npm:^1.4.2": version: 1.4.2 resolution: "gunzip-maybe@npm:1.4.2" @@ -19579,6 +20764,15 @@ __metadata: languageName: node linkType: hard +"has-property-descriptors@npm:^1.0.2": + version: 1.0.2 + resolution: "has-property-descriptors@npm:1.0.2" + dependencies: + es-define-property: ^1.0.0 + checksum: fcbb246ea2838058be39887935231c6d5788babed499d0e9d0cc5737494c48aba4fe17ba1449e0d0fbbb1e36175442faa37f9c427ae357d6ccb1d895fbcd3de3 + languageName: node + linkType: hard + "has-proto@npm:^1.0.1": version: 1.0.1 resolution: "has-proto@npm:1.0.1" @@ -19586,6 +20780,22 @@ __metadata: languageName: node linkType: hard +"has-proto@npm:^1.2.0": + version: 1.2.0 + resolution: "has-proto@npm:1.2.0" + dependencies: + dunder-proto: ^1.0.0 + checksum: f55010cb94caa56308041d77967c72a02ffd71386b23f9afa8447e58bc92d49d15c19bf75173713468e92fe3fb1680b03b115da39c21c32c74886d1d50d3e7ff + languageName: node + linkType: hard + +"has-symbols@npm:^1.0.0, has-symbols@npm:^1.1.0": + version: 1.1.0 + resolution: "has-symbols@npm:1.1.0" + checksum: b2316c7302a0e8ba3aaba215f834e96c22c86f192e7310bdf689dd0e6999510c89b00fbc5742571507cebf25764d68c988b3a0da217369a73596191ac0ce694b + languageName: node + linkType: hard + "has-symbols@npm:^1.0.1, has-symbols@npm:^1.0.2": version: 1.0.2 resolution: "has-symbols@npm:1.0.2" @@ -19609,6 +20819,15 @@ __metadata: languageName: node linkType: hard +"has-tostringtag@npm:^1.0.2": + version: 1.0.2 + resolution: "has-tostringtag@npm:1.0.2" + dependencies: + has-symbols: ^1.0.3 + checksum: 999d60bb753ad714356b2c6c87b7fb74f32463b8426e159397da4bde5bca7e598ab1073f4d8d4deafac297f2eb311484cd177af242776bf05f0d11565680468d + languageName: node + linkType: hard + "has-unicode@npm:^2.0.1": version: 2.0.1 resolution: "has-unicode@npm:2.0.1" @@ -19655,7 +20874,7 @@ __metadata: languageName: node linkType: hard -"has@npm:^1.0.0, has@npm:^1.0.3": +"has@npm:^1.0.3": version: 1.0.3 resolution: "has@npm:1.0.3" dependencies: @@ -19704,6 +20923,162 @@ __metadata: languageName: node linkType: hard +"hasown@npm:^2.0.2": + version: 2.0.2 + resolution: "hasown@npm:2.0.2" + dependencies: + function-bind: ^1.1.2 + checksum: e8516f776a15149ca6c6ed2ae3110c417a00b62260e222590e54aa367cbcd6ed99122020b37b7fbdf05748df57b265e70095d7bf35a47660587619b15ffb93db + languageName: node + linkType: hard + +"hast-util-embedded@npm:^3.0.0": + version: 3.0.0 + resolution: "hast-util-embedded@npm:3.0.0" + dependencies: + "@types/hast": ^3.0.0 + hast-util-is-element: ^3.0.0 + checksum: b5a1262f68d0f131bff4e8abaf3379f9318c5c825ad609cad3a4289da19d0cf636eab973a2ae716b49ca131eab2507ce2b4c73ac8d9cb0214eb0721da528cd27 + languageName: node + linkType: hard + +"hast-util-from-dom@npm:5.0.1, hast-util-from-dom@npm:^5.0.0": + version: 5.0.1 + resolution: "hast-util-from-dom@npm:5.0.1" + dependencies: + "@types/hast": ^3.0.0 + hastscript: ^9.0.0 + web-namespaces: ^2.0.0 + checksum: d79e91d90acd81ee00752b791ff3173f7bb29490a34b7156bcc8853743fd6e72702f314a19720d2c0cdf3ff794484be6f3804c93916f430f16b6f59539aa04b7 + languageName: node + linkType: hard + +"hast-util-has-property@npm:^3.0.0": + version: 3.0.0 + resolution: "hast-util-has-property@npm:3.0.0" + dependencies: + "@types/hast": ^3.0.0 + checksum: 3e515e95432c6251eefeb5aade4b9626f033d3ac0020e2f64aa38afbb345c7bb0c5d541fba6c53367245d7f5b555dc3c86543cd8231879d272cb0912808dfc19 + languageName: node + linkType: hard + +"hast-util-is-body-ok-link@npm:^3.0.0": + version: 3.0.1 + resolution: "hast-util-is-body-ok-link@npm:3.0.1" + dependencies: + "@types/hast": ^3.0.0 + checksum: ec265d0262f130d2e9b688024175aedb27c9e1402d175ed8834e79cb465934d99adf911cd5a9644ec3f3ce55c40fa2a314ee48c8dd928b85f6c5df83b3990d48 + languageName: node + linkType: hard + +"hast-util-is-element@npm:^3.0.0": + version: 3.0.0 + resolution: "hast-util-is-element@npm:3.0.0" + dependencies: + "@types/hast": ^3.0.0 + checksum: 82569a420eda5877c52fdbbdbe26675f012c02d70813dfd19acffdee328e42e4bd0b7ae34454cfcbcb932b2bedbd7ddc119f943a0cfb234120f9456d6c0c4331 + languageName: node + linkType: hard + +"hast-util-minify-whitespace@npm:^1.0.0": + version: 1.0.1 + resolution: "hast-util-minify-whitespace@npm:1.0.1" + dependencies: + "@types/hast": ^3.0.0 + hast-util-embedded: ^3.0.0 + hast-util-is-element: ^3.0.0 + hast-util-whitespace: ^3.0.0 + unist-util-is: ^6.0.0 + checksum: e74f883a52591798ef99a864a34905163f7754d9fafa2eba96956b5fde798b28e65990cefe056349285b96c3fd9ae50e5c9a2c3429f2af40799831b2a769ddfb + languageName: node + linkType: hard + +"hast-util-parse-selector@npm:^4.0.0": + version: 4.0.0 + resolution: "hast-util-parse-selector@npm:4.0.0" + dependencies: + "@types/hast": ^3.0.0 + checksum: 76087670d3b0b50b23a6cb70bca53a6176d6608307ccdbb3ed18b650b82e7c3513bfc40348f1389dc0c5ae872b9a768851f4335f44654abd7deafd6974c52402 + languageName: node + linkType: hard + +"hast-util-phrasing@npm:^3.0.0": + version: 3.0.1 + resolution: "hast-util-phrasing@npm:3.0.1" + dependencies: + "@types/hast": ^3.0.0 + hast-util-embedded: ^3.0.0 + hast-util-has-property: ^3.0.0 + hast-util-is-body-ok-link: ^3.0.0 + hast-util-is-element: ^3.0.0 + checksum: 8bc265e9534e8815aff2c34f14b3352fc758a1d29e3861fa5fa73cdd9b5c7adefe3fbeadd0a8de3529fa7694e8f30aee5bad9cd49131670001b306e7f309ec45 + languageName: node + linkType: hard + +"hast-util-to-dom@npm:^4.0.0": + version: 4.0.1 + resolution: "hast-util-to-dom@npm:4.0.1" + dependencies: + "@types/hast": ^3.0.0 + property-information: ^7.0.0 + web-namespaces: ^2.0.0 + checksum: 8cf42e536b44f1ebf7ddf37524da8e94982e586242152909cec454e6aeaa532865e224e7ee34e06852b1bd2d584f40647d053c8ca6827c4a193f5907b2522f32 + languageName: node + linkType: hard + +"hast-util-to-html@npm:9.0.5, hast-util-to-html@npm:^9.0.0": + version: 9.0.5 + resolution: "hast-util-to-html@npm:9.0.5" + dependencies: + "@types/hast": ^3.0.0 + "@types/unist": ^3.0.0 + ccount: ^2.0.0 + comma-separated-tokens: ^2.0.0 + hast-util-whitespace: ^3.0.0 + html-void-elements: ^3.0.0 + mdast-util-to-hast: ^13.0.0 + property-information: ^7.0.0 + space-separated-tokens: ^2.0.0 + stringify-entities: ^4.0.0 + zwitch: ^2.0.4 + checksum: 1ebd013ad340cf646ea944100427917747f69543800e79b2186521dc29c205b4fe75d8062f3eddedf6d66f6180ca06fe127b9e53ff15a8f3579e36637ca43e16 + languageName: node + linkType: hard + +"hast-util-to-mdast@npm:10.1.2, hast-util-to-mdast@npm:^10.0.0": + version: 10.1.2 + resolution: "hast-util-to-mdast@npm:10.1.2" + dependencies: + "@types/hast": ^3.0.0 + "@types/mdast": ^4.0.0 + "@ungap/structured-clone": ^1.0.0 + hast-util-phrasing: ^3.0.0 + hast-util-to-html: ^9.0.0 + hast-util-to-text: ^4.0.0 + hast-util-whitespace: ^3.0.0 + mdast-util-phrasing: ^4.0.0 + mdast-util-to-hast: ^13.0.0 + mdast-util-to-string: ^4.0.0 + rehype-minify-whitespace: ^6.0.0 + trim-trailing-lines: ^2.0.0 + unist-util-position: ^5.0.0 + unist-util-visit: ^5.0.0 + checksum: 38febec776a3b33120d44c6e6b4de150e4102c12b1967c094029968e4c7c72599fac3b0713f4f9b3d28a81a96d41b3d72264fdcf89c805bda46a1b4b92108933 + languageName: node + linkType: hard + +"hast-util-to-text@npm:^4.0.0": + version: 4.0.2 + resolution: "hast-util-to-text@npm:4.0.2" + dependencies: + "@types/hast": ^3.0.0 + "@types/unist": ^3.0.0 + hast-util-is-element: ^3.0.0 + unist-util-find-after: ^5.0.0 + checksum: 72cce08666b86511595d3eef52236b86897cfbac166f2a0752b70b16d1f590b5aa91ea1a553c0d1603f9e0c7e373ceacab381be3d8f176129ad6e301d2a56d94 + languageName: node + linkType: hard + "hast-util-whitespace@npm:^2.0.0": version: 2.0.0 resolution: "hast-util-whitespace@npm:2.0.0" @@ -19711,7 +21086,29 @@ __metadata: languageName: node linkType: hard -"he@npm:^1.2.0": +"hast-util-whitespace@npm:^3.0.0": + version: 3.0.0 + resolution: "hast-util-whitespace@npm:3.0.0" + dependencies: + "@types/hast": ^3.0.0 + checksum: 41d93ccce218ba935dc3c12acdf586193c35069489c8c8f50c2aa824c00dec94a3c78b03d1db40fa75381942a189161922e4b7bca700b3a2cc779634c351a1e4 + languageName: node + linkType: hard + +"hastscript@npm:9.0.1, hastscript@npm:^9.0.0": + version: 9.0.1 + resolution: "hastscript@npm:9.0.1" + dependencies: + "@types/hast": ^3.0.0 + comma-separated-tokens: ^2.0.0 + hast-util-parse-selector: ^4.0.0 + property-information: ^7.0.0 + space-separated-tokens: ^2.0.0 + checksum: 2bbb9a3c2dc43c9dec7f6599ef45e5eefb1c2a5f75d33d005dc432e92bf9d7cfb6c0d927f15a7592bb48601d2b582ea2e4b1131a716ac3f7b618a07d88f9a5d7 + languageName: node + linkType: hard + +"he@npm:1.2.0, he@npm:^1.2.0": version: 1.2.0 resolution: "he@npm:1.2.0" bin: @@ -19730,13 +21127,6 @@ __metadata: languageName: node linkType: hard -"hex-color-regex@npm:^1.1.0": - version: 1.1.0 - resolution: "hex-color-regex@npm:1.1.0" - checksum: 44fa1b7a26d745012f3bfeeab8015f60514f72d2fcf10dce33068352456b8d71a2e6bc5a17f933ab470da2c5ab1e3e04b05caf3fefe3c1cabd7e02e516fc8784 - languageName: node - linkType: hard - "hey-listen@npm:^1.0.8": version: 1.0.8 resolution: "hey-listen@npm:1.0.8" @@ -19840,20 +21230,6 @@ __metadata: languageName: node linkType: hard -"hsl-regex@npm:^1.0.0": - version: 1.0.0 - resolution: "hsl-regex@npm:1.0.0" - checksum: de9ee1bf39de1b83cc3fa0fa1cc337f29f14911e79411d66347365c54fab6b109eea2dd741eaa02486e24de31627ad7bf4453f22224fb55a2fe2b58166fa63b8 - languageName: node - linkType: hard - -"hsla-regex@npm:^1.0.0": - version: 1.0.0 - resolution: "hsla-regex@npm:1.0.0" - checksum: 9aa6eb9ff6c102d2395435aa5d1d91eae20043c4b1497c543d8db501c05f3edacd9a07fb34a987059d7902dba415af4cb4e610f751859ae8e7525df4ffcd085f - languageName: node - linkType: hard - "html-dom-parser@npm:3.1.3": version: 3.1.3 resolution: "html-dom-parser@npm:3.1.3" @@ -19956,6 +21332,13 @@ __metadata: languageName: node linkType: hard +"html-void-elements@npm:^3.0.0": + version: 3.0.0 + resolution: "html-void-elements@npm:3.0.0" + checksum: 59be397525465a7489028afa064c55763d9cccd1d7d9f630cca47137317f0e897a9ca26cef7e745e7cff1abc44260cfa407742b243a54261dfacd42230e94fce + languageName: node + linkType: hard + "html-webpack-plugin@npm:^5.3.2": version: 5.5.0 resolution: "html-webpack-plugin@npm:5.5.0" @@ -20352,13 +21735,6 @@ __metadata: languageName: node linkType: hard -"ignore@npm:^3.3.5": - version: 3.3.10 - resolution: "ignore@npm:3.3.10" - checksum: 23e8cc776e367b56615ab21b78decf973a35dfca5522b39d9b47643d8168473b0d1f18dd1321a1bab466a12ea11a2411903f3b21644f4d5461ee0711ec8678bd - languageName: node - linkType: hard - "ignore@npm:^4.0.3": version: 4.0.6 resolution: "ignore@npm:4.0.6" @@ -20394,25 +21770,6 @@ __metadata: languageName: node linkType: hard -"import-cwd@npm:^2.0.0": - version: 2.1.0 - resolution: "import-cwd@npm:2.1.0" - dependencies: - import-from: ^2.1.0 - checksum: b8786fa3578f3df55370352bf61f99c2d8e6ee9b5741a07503d5a73d99281d141330a8faf87078e67527be4558f758356791ee5efb4b0112ac5eaed0f07de544 - languageName: node - linkType: hard - -"import-fresh@npm:^2.0.0": - version: 2.0.0 - resolution: "import-fresh@npm:2.0.0" - dependencies: - caller-path: ^2.0.0 - resolve-from: ^3.0.0 - checksum: 610255f9753cc6775df00be08e9f43691aa39f7703e3636c45afe22346b8b545e600ccfe100c554607546fc8e861fa149a0d1da078c8adedeea30fff326eef79 - languageName: node - linkType: hard - "import-fresh@npm:^3.0.0, import-fresh@npm:^3.2.1": version: 3.3.0 resolution: "import-fresh@npm:3.3.0" @@ -20430,15 +21787,6 @@ __metadata: languageName: node linkType: hard -"import-from@npm:^2.1.0": - version: 2.1.0 - resolution: "import-from@npm:2.1.0" - dependencies: - resolve-from: ^3.0.0 - checksum: 91f6f89f46a07227920ef819181bb52eb93023ccc0bdf00224fdfb326f8f753e279ad06819f39a02bb88c9d3a4606adc85b0cc995285e5d65feeb59f1421a1d4 - languageName: node - linkType: hard - "import-local@npm:^3.0.2": version: 3.0.3 resolution: "import-local@npm:3.0.3" @@ -20479,13 +21827,6 @@ __metadata: languageName: node linkType: hard -"indexes-of@npm:^1.0.1": - version: 1.0.1 - resolution: "indexes-of@npm:1.0.1" - checksum: 4f9799b1739a62f3e02d09f6f4162cf9673025282af7fa36e790146e7f4e216dad3e776a25b08536c093209c9fcb5ea7bd04b082d42686a45f58ff401d6da32e - languageName: node - linkType: hard - "infer-owner@npm:^1.0.4": version: 1.0.4 resolution: "infer-owner@npm:1.0.4" @@ -20603,17 +21944,6 @@ __metadata: languageName: node linkType: hard -"internal-slot@npm:^1.0.3": - version: 1.0.3 - resolution: "internal-slot@npm:1.0.3" - dependencies: - get-intrinsic: ^1.1.0 - has: ^1.0.3 - side-channel: ^1.0.4 - checksum: 1944f92e981e47aebc98a88ff0db579fd90543d937806104d0b96557b10c1f170c51fb777b97740a8b6ddeec585fca8c39ae99fd08a8e058dfc8ab70937238bf - languageName: node - linkType: hard - "internal-slot@npm:^1.0.4": version: 1.0.5 resolution: "internal-slot@npm:1.0.5" @@ -20636,6 +21966,17 @@ __metadata: languageName: node linkType: hard +"internal-slot@npm:^1.1.0": + version: 1.1.0 + resolution: "internal-slot@npm:1.1.0" + dependencies: + es-errors: ^1.3.0 + hasown: ^2.0.2 + side-channel: ^1.1.0 + checksum: 8e0991c2d048cc08dab0a91f573c99f6a4215075887517ea4fa32203ce8aea60fa03f95b177977fa27eb502e5168366d0f3e02c762b799691411d49900611861 + languageName: node + linkType: hard + "internmap@npm:^1.0.0": version: 1.0.1 resolution: "internmap@npm:1.0.1" @@ -20735,13 +22076,6 @@ __metadata: languageName: node linkType: hard -"is-absolute-url@npm:^2.0.0": - version: 2.1.0 - resolution: "is-absolute-url@npm:2.1.0" - checksum: 781e8cf8a2af54b1b7a92f269244d96c66224030d91120e734ebeebbce044c167767e1389789d8aaf82f9e429cb20ae93d6d0acfe6c4b53d2bd6ebb47a236d76 - languageName: node - linkType: hard - "is-absolute-url@npm:^3.0.0": version: 3.0.3 resolution: "is-absolute-url@npm:3.0.3" @@ -20798,6 +22132,17 @@ __metadata: languageName: node linkType: hard +"is-array-buffer@npm:^3.0.4, is-array-buffer@npm:^3.0.5": + version: 3.0.5 + resolution: "is-array-buffer@npm:3.0.5" + dependencies: + call-bind: ^1.0.8 + call-bound: ^1.0.3 + get-intrinsic: ^1.2.6 + checksum: f137a2a6e77af682cdbffef1e633c140cf596f72321baf8bba0f4ef22685eb4339dde23dfe9e9ca430b5f961dee4d46577dcf12b792b68518c8449b134fb9156 + languageName: node + linkType: hard + "is-arrayish@npm:^0.2.1": version: 0.2.1 resolution: "is-arrayish@npm:0.2.1" @@ -20805,10 +22150,16 @@ __metadata: languageName: node linkType: hard -"is-arrayish@npm:^0.3.1": - version: 0.3.2 - resolution: "is-arrayish@npm:0.3.2" - checksum: 977e64f54d91c8f169b59afcd80ff19227e9f5c791fa28fa2e5bce355cbaf6c2c356711b734656e80c9dd4a854dd7efcf7894402f1031dfc5de5d620775b4d5f +"is-async-function@npm:^2.0.0": + version: 2.1.1 + resolution: "is-async-function@npm:2.1.1" + dependencies: + async-function: ^1.0.0 + call-bound: ^1.0.3 + get-proto: ^1.0.1 + has-tostringtag: ^1.0.2 + safe-regex-test: ^1.1.0 + checksum: 9bece45133da26636488ca127d7686b85ad3ca18927e2850cff1937a650059e90be1c71a48623f8791646bb7a241b0cabf602a0b9252dcfa5ab273f2399000e6 languageName: node linkType: hard @@ -20821,6 +22172,15 @@ __metadata: languageName: node linkType: hard +"is-bigint@npm:^1.1.0": + version: 1.1.0 + resolution: "is-bigint@npm:1.1.0" + dependencies: + has-bigints: ^1.0.2 + checksum: ee1544f0e664f253306786ed1dce494b8cf242ef415d6375d8545b4d8816b0f054bd9f948a8988ae2c6325d1c28260dd02978236b2f7b8fb70dfc4838a6c9fa7 + languageName: node + linkType: hard + "is-binary-path@npm:~2.1.0": version: 2.1.0 resolution: "is-binary-path@npm:2.1.0" @@ -20840,6 +22200,16 @@ __metadata: languageName: node linkType: hard +"is-boolean-object@npm:^1.2.1": + version: 1.2.2 + resolution: "is-boolean-object@npm:1.2.2" + dependencies: + call-bound: ^1.0.3 + has-tostringtag: ^1.0.2 + checksum: 0415b181e8f1bfd5d3f8a20f8108e64d372a72131674eea9c2923f39d065b6ad08d654765553bdbffbd92c3746f1007986c34087db1bd89a31f71be8359ccdaa + languageName: node + linkType: hard + "is-buffer@npm:^1.1.5": version: 1.1.6 resolution: "is-buffer@npm:1.1.6" @@ -20847,7 +22217,7 @@ __metadata: languageName: node linkType: hard -"is-buffer@npm:^2.0.0": +"is-buffer@npm:^2.0.0, is-buffer@npm:~2.0.3": version: 2.0.5 resolution: "is-buffer@npm:2.0.5" checksum: 764c9ad8b523a9f5a32af29bdf772b08eb48c04d2ad0a7240916ac2688c983bf5f8504bf25b35e66240edeb9d9085461f9b5dae1f3d2861c6b06a65fe983de42 @@ -20861,7 +22231,7 @@ __metadata: languageName: node linkType: hard -"is-callable@npm:^1.1.4, is-callable@npm:^1.2.4": +"is-callable@npm:^1.1.4": version: 1.2.4 resolution: "is-callable@npm:1.2.4" checksum: 1a28d57dc435797dae04b173b65d6d1e77d4f16276e9eff973f994eadcfdc30a017e6a597f092752a083c1103cceb56c91e3dadc6692fedb9898dfaba701575f @@ -20877,20 +22247,6 @@ __metadata: languageName: node linkType: hard -"is-color-stop@npm:^1.0.0": - version: 1.1.0 - resolution: "is-color-stop@npm:1.1.0" - dependencies: - css-color-names: ^0.0.4 - hex-color-regex: ^1.1.0 - hsl-regex: ^1.0.0 - hsla-regex: ^1.0.0 - rgb-regex: ^1.0.1 - rgba-regex: ^1.0.0 - checksum: 778dd52a603ab8da827925aa4200fe6733b667b216495a04110f038b925dc5ef58babe759b94ffc4e44fcf439328695770873937f59d6045f676322b97f3f92d - languageName: node - linkType: hard - "is-core-module@npm:^2.13.0": version: 2.13.0 resolution: "is-core-module@npm:2.13.0" @@ -20945,6 +22301,17 @@ __metadata: languageName: node linkType: hard +"is-data-view@npm:^1.0.1, is-data-view@npm:^1.0.2": + version: 1.0.2 + resolution: "is-data-view@npm:1.0.2" + dependencies: + call-bound: ^1.0.2 + get-intrinsic: ^1.2.6 + is-typed-array: ^1.1.13 + checksum: 31600dd19932eae7fd304567e465709ffbfa17fa236427c9c864148e1b54eb2146357fcf3aed9b686dee13c217e1bb5a649cb3b9c479e1004c0648e9febde1b2 + languageName: node + linkType: hard + "is-date-object@npm:^1.0.1, is-date-object@npm:^1.0.5": version: 1.0.5 resolution: "is-date-object@npm:1.0.5" @@ -20954,6 +22321,16 @@ __metadata: languageName: node linkType: hard +"is-date-object@npm:^1.1.0": + version: 1.1.0 + resolution: "is-date-object@npm:1.1.0" + dependencies: + call-bound: ^1.0.2 + has-tostringtag: ^1.0.2 + checksum: d6c36ab9d20971d65f3fc64cef940d57a4900a2ac85fb488a46d164c2072a33da1cb51eefcc039e3e5c208acbce343d3480b84ab5ff0983f617512da2742562a + languageName: node + linkType: hard + "is-deflate@npm:^1.0.0": version: 1.0.0 resolution: "is-deflate@npm:1.0.0" @@ -20983,13 +22360,6 @@ __metadata: languageName: node linkType: hard -"is-directory@npm:^0.3.1": - version: 0.3.1 - resolution: "is-directory@npm:0.3.1" - checksum: dce9a9d3981e38f2ded2a80848734824c50ee8680cd09aa477bef617949715cfc987197a2ca0176c58a9fb192a1a0d69b535c397140d241996a609d5906ae524 - languageName: node - linkType: hard - "is-docker@npm:^2.0.0, is-docker@npm:^2.1.1": version: 2.2.1 resolution: "is-docker@npm:2.2.1" @@ -21031,6 +22401,15 @@ __metadata: languageName: node linkType: hard +"is-finalizationregistry@npm:^1.1.0": + version: 1.1.1 + resolution: "is-finalizationregistry@npm:1.1.1" + dependencies: + call-bound: ^1.0.3 + checksum: 38c646c506e64ead41a36c182d91639833311970b6b6c6268634f109eef0a1a9d2f1f2e499ef4cb43c744a13443c4cdd2f0812d5afdcee5e9b65b72b28c48557 + languageName: node + linkType: hard + "is-fullwidth-code-point@npm:^1.0.0": version: 1.0.0 resolution: "is-fullwidth-code-point@npm:1.0.0" @@ -21068,6 +22447,19 @@ __metadata: languageName: node linkType: hard +"is-generator-function@npm:^1.0.10": + version: 1.1.2 + resolution: "is-generator-function@npm:1.1.2" + dependencies: + call-bound: ^1.0.4 + generator-function: ^2.0.0 + get-proto: ^1.0.1 + has-tostringtag: ^1.0.2 + safe-regex-test: ^1.1.0 + checksum: 0b81c613752a5e534939e5b3835ff722446837a5b94c3a3934af5ded36a651d9aa31c3f11f8a3453884b9658bf26dbfb7eb855e744d920b07f084bd890a43414 + languageName: node + linkType: hard + "is-generator-function@npm:^1.0.7": version: 1.0.10 resolution: "is-generator-function@npm:1.0.10" @@ -21159,6 +22551,13 @@ __metadata: languageName: node linkType: hard +"is-map@npm:^2.0.3": + version: 2.0.3 + resolution: "is-map@npm:2.0.3" + checksum: e6ce5f6380f32b141b3153e6ba9074892bbbbd655e92e7ba5ff195239777e767a976dcd4e22f864accaf30e53ebf961ab1995424aef91af68788f0591b7396cc + languageName: node + linkType: hard + "is-nan@npm:^1.2.1": version: 1.3.2 resolution: "is-nan@npm:1.3.2" @@ -21169,13 +22568,6 @@ __metadata: languageName: node linkType: hard -"is-negative-zero@npm:^2.0.1": - version: 2.0.1 - resolution: "is-negative-zero@npm:2.0.1" - checksum: a46f2e0cb5e16fdb8f2011ed488979386d7e68d381966682e3f4c98fc126efe47f26827912baca2d06a02a644aee458b9cba307fb389f6b161e759125db7a3b8 - languageName: node - linkType: hard - "is-negative-zero@npm:^2.0.2": version: 2.0.2 resolution: "is-negative-zero@npm:2.0.2" @@ -21183,6 +22575,13 @@ __metadata: languageName: node linkType: hard +"is-negative-zero@npm:^2.0.3": + version: 2.0.3 + resolution: "is-negative-zero@npm:2.0.3" + checksum: c1e6b23d2070c0539d7b36022d5a94407132411d01aba39ec549af824231f3804b1aea90b5e4e58e807a65d23ceb538ed6e355ce76b267bdd86edb757ffcbdcd + languageName: node + linkType: hard + "is-number-object@npm:^1.0.4": version: 1.0.6 resolution: "is-number-object@npm:1.0.6" @@ -21192,6 +22591,16 @@ __metadata: languageName: node linkType: hard +"is-number-object@npm:^1.1.1": + version: 1.1.1 + resolution: "is-number-object@npm:1.1.1" + dependencies: + call-bound: ^1.0.3 + has-tostringtag: ^1.0.2 + checksum: 6517f0a0e8c4b197a21afb45cd3053dc711e79d45d8878aa3565de38d0102b130ca8732485122c7b336e98c27dacd5236854e3e6526e0eb30cae64956535662f + languageName: node + linkType: hard + "is-number@npm:^3.0.0": version: 3.0.0 resolution: "is-number@npm:3.0.0" @@ -21317,6 +22726,18 @@ __metadata: languageName: node linkType: hard +"is-regex@npm:^1.2.1": + version: 1.2.1 + resolution: "is-regex@npm:1.2.1" + dependencies: + call-bound: ^1.0.2 + gopd: ^1.2.0 + has-tostringtag: ^1.0.2 + hasown: ^2.0.2 + checksum: 99ee0b6d30ef1bb61fa4b22fae7056c6c9b3c693803c0c284ff7a8570f83075a7d38cda53b06b7996d441215c27895ea5d1af62124562e13d91b3dbec41a5e13 + languageName: node + linkType: hard + "is-relative@npm:^1.0.0": version: 1.0.0 resolution: "is-relative@npm:1.0.0" @@ -21326,13 +22747,6 @@ __metadata: languageName: node linkType: hard -"is-resolvable@npm:^1.0.0": - version: 1.1.0 - resolution: "is-resolvable@npm:1.1.0" - checksum: 2ddff983be0cabc2c8d60246365755f8fb322f5fb9db834740d3e694c635c1b74c1bd674cf221e072fc4bd911ef3f08f2247d390e476f7e80af9092443193c68 - languageName: node - linkType: hard - "is-set@npm:^2.0.1, is-set@npm:^2.0.2": version: 2.0.2 resolution: "is-set@npm:2.0.2" @@ -21340,10 +22754,10 @@ __metadata: languageName: node linkType: hard -"is-shared-array-buffer@npm:^1.0.1": - version: 1.0.1 - resolution: "is-shared-array-buffer@npm:1.0.1" - checksum: 2ffb92533e64e2876e6cfe6906871d28400b6f1a53130fe652ec8007bc0e5044d05e7af8e31bdc992fbba520bd92938cfbeedd0f286be92f250c7c76191c4d90 +"is-set@npm:^2.0.3": + version: 2.0.3 + resolution: "is-set@npm:2.0.3" + checksum: 36e3f8c44bdbe9496c9689762cc4110f6a6a12b767c5d74c0398176aa2678d4467e3bf07595556f2dba897751bde1422480212b97d973c7b08a343100b0c0dfe languageName: node linkType: hard @@ -21356,6 +22770,15 @@ __metadata: languageName: node linkType: hard +"is-shared-array-buffer@npm:^1.0.4": + version: 1.0.4 + resolution: "is-shared-array-buffer@npm:1.0.4" + dependencies: + call-bound: ^1.0.3 + checksum: 1611fedc175796eebb88f4dfc393dd969a4a8e6c69cadaff424ee9d4464f9f026399a5f84a90f7c62d6d7ee04e3626a912149726de102b0bd6c1ee6a9868fa5a + languageName: node + linkType: hard + "is-stream@npm:^1.1.0": version: 1.1.0 resolution: "is-stream@npm:1.1.0" @@ -21386,6 +22809,16 @@ __metadata: languageName: node linkType: hard +"is-string@npm:^1.1.1": + version: 1.1.1 + resolution: "is-string@npm:1.1.1" + dependencies: + call-bound: ^1.0.3 + has-tostringtag: ^1.0.2 + checksum: 2eeaaff605250f5e836ea3500d33d1a5d3aa98d008641d9d42fb941e929ffd25972326c2ef912987e54c95b6f10416281aaf1b35cdf81992cfb7524c5de8e193 + languageName: node + linkType: hard + "is-symbol@npm:^1.0.2, is-symbol@npm:^1.0.3": version: 1.0.4 resolution: "is-symbol@npm:1.0.4" @@ -21395,6 +22828,17 @@ __metadata: languageName: node linkType: hard +"is-symbol@npm:^1.0.4, is-symbol@npm:^1.1.1": + version: 1.1.1 + resolution: "is-symbol@npm:1.1.1" + dependencies: + call-bound: ^1.0.2 + has-symbols: ^1.1.0 + safe-regex-test: ^1.1.0 + checksum: bfafacf037af6f3c9d68820b74be4ae8a736a658a3344072df9642a090016e281797ba8edbeb1c83425879aae55d1cb1f30b38bf132d703692b2570367358032 + languageName: node + linkType: hard + "is-text-path@npm:^2.0.0": version: 2.0.0 resolution: "is-text-path@npm:2.0.0" @@ -21426,6 +22870,15 @@ __metadata: languageName: node linkType: hard +"is-typed-array@npm:^1.1.13, is-typed-array@npm:^1.1.14, is-typed-array@npm:^1.1.15": + version: 1.1.15 + resolution: "is-typed-array@npm:1.1.15" + dependencies: + which-typed-array: ^1.1.16 + checksum: ea7cfc46c282f805d19a9ab2084fd4542fed99219ee9dbfbc26284728bd713a51eac66daa74eca00ae0a43b61322920ba334793607dc39907465913e921e0892 + languageName: node + linkType: hard + "is-typedarray@npm:^1.0.0": version: 1.0.0 resolution: "is-typedarray@npm:1.0.0" @@ -21472,12 +22925,10 @@ __metadata: languageName: node linkType: hard -"is-weakref@npm:^1.0.1": - version: 1.0.1 - resolution: "is-weakref@npm:1.0.1" - dependencies: - call-bind: ^1.0.0 - checksum: fdafb7b955671dd2f9658ff47c86e4025c0650fc68a3542a40e5a75898a763b1abd6b1e1f9f13207eed49541cdd76af67d73c44989ea358b201b70274cf8f6c1 +"is-weakmap@npm:^2.0.2": + version: 2.0.2 + resolution: "is-weakmap@npm:2.0.2" + checksum: f36aef758b46990e0d3c37269619c0a08c5b29428c0bb11ecba7f75203442d6c7801239c2f31314bc79199217ef08263787f3837d9e22610ad1da62970d6616d languageName: node linkType: hard @@ -21490,6 +22941,15 @@ __metadata: languageName: node linkType: hard +"is-weakref@npm:^1.1.1": + version: 1.1.1 + resolution: "is-weakref@npm:1.1.1" + dependencies: + call-bound: ^1.0.3 + checksum: 1769b9aed5d435a3a989ffc18fc4ad1947d2acdaf530eb2bd6af844861b545047ea51102f75901f89043bed0267ed61d914ee21e6e8b9aa734ec201cdfc0726f + languageName: node + linkType: hard + "is-weakset@npm:^2.0.1": version: 2.0.2 resolution: "is-weakset@npm:2.0.2" @@ -21500,6 +22960,16 @@ __metadata: languageName: node linkType: hard +"is-weakset@npm:^2.0.3": + version: 2.0.4 + resolution: "is-weakset@npm:2.0.4" + dependencies: + call-bound: ^1.0.3 + get-intrinsic: ^1.2.6 + checksum: 5c6c8415a06065d78bdd5e3a771483aa1cd928df19138aa73c4c51333226f203f22117b4325df55cc8b3085a6716870a320c2d757efee92d7a7091a039082041 + languageName: node + linkType: hard + "is-whitespace@npm:^0.3.0": version: 0.3.0 resolution: "is-whitespace@npm:0.3.0" @@ -23204,7 +24674,7 @@ __metadata: languageName: node linkType: hard -"jest-worker@npm:^26.2.1": +"jest-worker@npm:^26.5.0": version: 26.6.2 resolution: "jest-worker@npm:26.6.2" dependencies: @@ -23382,6 +24852,18 @@ __metadata: languageName: node linkType: hard +"js-yaml@npm:3.13.1": + version: 3.13.1 + resolution: "js-yaml@npm:3.13.1" + dependencies: + argparse: ^1.0.7 + esprima: ^4.0.0 + bin: + js-yaml: bin/js-yaml.js + checksum: 7511b764abb66d8aa963379f7d2a404f078457d106552d05a7b556d204f7932384e8477513c124749fa2de52eb328961834562bd09924902c6432e40daa408bc + languageName: node + linkType: hard + "js-yaml@npm:^3.13.1, js-yaml@npm:^3.6.1": version: 3.14.1 resolution: "js-yaml@npm:3.14.1" @@ -23445,7 +24927,7 @@ __metadata: languageName: node linkType: hard -"jsdom@npm:^16.2.0, jsdom@npm:^16.6.0": +"jsdom@npm:^16.6.0": version: 16.7.0 resolution: "jsdom@npm:16.7.0" dependencies: @@ -23870,6 +25352,13 @@ __metadata: languageName: node linkType: hard +"klona@npm:^2.0.4": + version: 2.0.6 + resolution: "klona@npm:2.0.6" + checksum: ac9ee3732e42b96feb67faae4d27cf49494e8a3bf3fa7115ce242fe04786788e0aff4741a07a45a2462e2079aa983d73d38519c85d65b70ef11447bbc3c58ce7 + languageName: node + linkType: hard + "latest-version@npm:5.1.0": version: 5.1.0 resolution: "latest-version@npm:5.1.0" @@ -24073,6 +25562,13 @@ __metadata: languageName: node linkType: hard +"lilconfig@npm:^3.1.1": + version: 3.1.3 + resolution: "lilconfig@npm:3.1.3" + checksum: 644eb10830350f9cdc88610f71a921f510574ed02424b57b0b3abb66ea725d7a082559552524a842f4e0272c196b88dfe1ff7d35ffcc6f45736777185cd67c9a + languageName: node + linkType: hard + "lines-and-columns@npm:^1.1.6": version: 1.2.4 resolution: "lines-and-columns@npm:1.2.4" @@ -24272,7 +25768,7 @@ __metadata: languageName: node linkType: hard -"loader-utils@npm:^1.1.0, loader-utils@npm:^1.4.0": +"loader-utils@npm:^1.4.0": version: 1.4.0 resolution: "loader-utils@npm:1.4.0" dependencies: @@ -24359,7 +25855,7 @@ __metadata: languageName: node linkType: hard -"lodash-es@npm:^4.17.11, lodash-es@npm:^4.17.15, lodash-es@npm:^4.17.21": +"lodash-es@npm:^4.17.21": version: 4.17.21 resolution: "lodash-es@npm:4.17.21" checksum: 05cbffad6e2adbb331a4e16fbd826e7faee403a1a04873b82b42c0f22090f280839f85b95393f487c1303c8a3d2a010048bf06151a6cbe03eee4d388fb0a12d2 @@ -24639,6 +26135,15 @@ __metadata: languageName: node linkType: hard +"log-symbols@npm:3.0.0": + version: 3.0.0 + resolution: "log-symbols@npm:3.0.0" + dependencies: + chalk: ^2.4.2 + checksum: f2322e1452d819050b11aad247660e1494f8b2219d40a964af91d5f9af1a90636f1b3d93f2952090e42af07cc5550aecabf6c1d8ec1181207e95cb66ba112361 + languageName: node + linkType: hard + "log-symbols@npm:4.1.0, log-symbols@npm:^4.0.0, log-symbols@npm:^4.1.0": version: 4.1.0 resolution: "log-symbols@npm:4.1.0" @@ -24987,15 +26492,6 @@ __metadata: languageName: node linkType: hard -"marked@npm:1.1.1": - version: 1.1.1 - resolution: "marked@npm:1.1.1" - bin: - marked: bin/marked - checksum: 441bea8ee14ec7c4c717c4335c8666e0617595333cab6bfffb99e43e7d5c6c9cb4d4342ba3fb9ee2f4cf55761f46eb78bb49f46b745bbc9c5af7c0252a831f4c - languageName: node - linkType: hard - "marked@npm:^5.0.0": version: 5.1.2 resolution: "marked@npm:5.1.2" @@ -25005,6 +26501,13 @@ __metadata: languageName: node linkType: hard +"math-intrinsics@npm:^1.1.0": + version: 1.1.0 + resolution: "math-intrinsics@npm:1.1.0" + checksum: 0e513b29d120f478c85a70f49da0b8b19bc638975eca466f2eeae0071f3ad00454c621bf66e16dd435896c208e719fc91ad79bbfba4e400fe0b372e7c1c9c9a2 + languageName: node + linkType: hard + "md5.js@npm:^1.3.4": version: 1.3.5 resolution: "md5.js@npm:1.3.5" @@ -25047,6 +26550,18 @@ __metadata: languageName: node linkType: hard +"mdast-util-find-and-replace@npm:^3.0.0": + version: 3.0.2 + resolution: "mdast-util-find-and-replace@npm:3.0.2" + dependencies: + "@types/mdast": ^4.0.0 + escape-string-regexp: ^5.0.0 + unist-util-is: ^6.0.0 + unist-util-visit-parents: ^6.0.0 + checksum: 00dde8aaf87d065034b911bdae20d17c107f5103c6ba5a3d117598c847ce005c6b03114b5603e0d07cc61fefcbb05bdb9f66100efeaa0278dbd80eda1087595f + languageName: node + linkType: hard + "mdast-util-from-markdown@npm:^1.0.0": version: 1.2.0 resolution: "mdast-util-from-markdown@npm:1.2.0" @@ -25067,6 +26582,26 @@ __metadata: languageName: node linkType: hard +"mdast-util-from-markdown@npm:^2.0.0": + version: 2.0.2 + resolution: "mdast-util-from-markdown@npm:2.0.2" + dependencies: + "@types/mdast": ^4.0.0 + "@types/unist": ^3.0.0 + decode-named-character-reference: ^1.0.0 + devlop: ^1.0.0 + mdast-util-to-string: ^4.0.0 + micromark: ^4.0.0 + micromark-util-decode-numeric-character-reference: ^2.0.0 + micromark-util-decode-string: ^2.0.0 + micromark-util-normalize-identifier: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + unist-util-stringify-position: ^4.0.0 + checksum: 1ad19f48b30ac6e0cb756070c210c78ad93c26876edfb3f75127783bc6df8b9402016d8f3e9964f3d1d5430503138ec65c145e869438727e1aa7f3cebf228fba + languageName: node + linkType: hard + "mdast-util-gfm-autolink-literal@npm:^1.0.0": version: 1.0.2 resolution: "mdast-util-gfm-autolink-literal@npm:1.0.2" @@ -25079,6 +26614,19 @@ __metadata: languageName: node linkType: hard +"mdast-util-gfm-autolink-literal@npm:^2.0.0": + version: 2.0.1 + resolution: "mdast-util-gfm-autolink-literal@npm:2.0.1" + dependencies: + "@types/mdast": ^4.0.0 + ccount: ^2.0.0 + devlop: ^1.0.0 + mdast-util-find-and-replace: ^3.0.0 + micromark-util-character: ^2.0.0 + checksum: 5630b12e072d7004cb132231c94f667fb5813486779cb0dfb0a196d7ae0e048897a43b0b37e080017adda618ddfcbea1d7bf23c0fa31c87bfc683e0898ea1cfe + languageName: node + linkType: hard + "mdast-util-gfm-footnote@npm:^1.0.0": version: 1.0.1 resolution: "mdast-util-gfm-footnote@npm:1.0.1" @@ -25090,6 +26638,19 @@ __metadata: languageName: node linkType: hard +"mdast-util-gfm-footnote@npm:^2.0.0": + version: 2.1.0 + resolution: "mdast-util-gfm-footnote@npm:2.1.0" + dependencies: + "@types/mdast": ^4.0.0 + devlop: ^1.1.0 + mdast-util-from-markdown: ^2.0.0 + mdast-util-to-markdown: ^2.0.0 + micromark-util-normalize-identifier: ^2.0.0 + checksum: a23c5531d63b254b46cbcb063b5731f56ccc9d1f038a17fa66d3994255868604a2b963f24e0f5b16dd3374743622afafcfe0c98cf90548d485bdc426ba77c618 + languageName: node + linkType: hard + "mdast-util-gfm-strikethrough@npm:^1.0.0": version: 1.0.1 resolution: "mdast-util-gfm-strikethrough@npm:1.0.1" @@ -25100,6 +26661,17 @@ __metadata: languageName: node linkType: hard +"mdast-util-gfm-strikethrough@npm:^2.0.0": + version: 2.0.0 + resolution: "mdast-util-gfm-strikethrough@npm:2.0.0" + dependencies: + "@types/mdast": ^4.0.0 + mdast-util-from-markdown: ^2.0.0 + mdast-util-to-markdown: ^2.0.0 + checksum: fe9b1d0eba9b791ff9001c008744eafe3dd7a81b085f2bf521595ce4a8e8b1b44764ad9361761ad4533af3e5d913d8ad053abec38172031d9ee32a8ebd1c7dbd + languageName: node + linkType: hard + "mdast-util-gfm-table@npm:^1.0.0": version: 1.0.4 resolution: "mdast-util-gfm-table@npm:1.0.4" @@ -25111,6 +26683,19 @@ __metadata: languageName: node linkType: hard +"mdast-util-gfm-table@npm:^2.0.0": + version: 2.0.0 + resolution: "mdast-util-gfm-table@npm:2.0.0" + dependencies: + "@types/mdast": ^4.0.0 + devlop: ^1.0.0 + markdown-table: ^3.0.0 + mdast-util-from-markdown: ^2.0.0 + mdast-util-to-markdown: ^2.0.0 + checksum: 063a627fd0993548fd63ca0c24c437baf91ba7d51d0a38820bd459bc20bf3d13d7365ef8d28dca99176dd5eb26058f7dde51190479c186dfe6af2e11202957c9 + languageName: node + linkType: hard + "mdast-util-gfm-task-list-item@npm:^1.0.0": version: 1.0.1 resolution: "mdast-util-gfm-task-list-item@npm:1.0.1" @@ -25121,6 +26706,18 @@ __metadata: languageName: node linkType: hard +"mdast-util-gfm-task-list-item@npm:^2.0.0": + version: 2.0.0 + resolution: "mdast-util-gfm-task-list-item@npm:2.0.0" + dependencies: + "@types/mdast": ^4.0.0 + devlop: ^1.0.0 + mdast-util-from-markdown: ^2.0.0 + mdast-util-to-markdown: ^2.0.0 + checksum: 37db90c59b15330fc54d790404abf5ef9f2f83e8961c53666fe7de4aab8dd5e6b3c296b6be19797456711a89a27840291d8871ff0438e9b4e15c89d170efe072 + languageName: node + linkType: hard + "mdast-util-gfm@npm:^2.0.0": version: 2.0.1 resolution: "mdast-util-gfm@npm:2.0.1" @@ -25136,6 +26733,41 @@ __metadata: languageName: node linkType: hard +"mdast-util-gfm@npm:^3.0.0": + version: 3.1.0 + resolution: "mdast-util-gfm@npm:3.1.0" + dependencies: + mdast-util-from-markdown: ^2.0.0 + mdast-util-gfm-autolink-literal: ^2.0.0 + mdast-util-gfm-footnote: ^2.0.0 + mdast-util-gfm-strikethrough: ^2.0.0 + mdast-util-gfm-table: ^2.0.0 + mdast-util-gfm-task-list-item: ^2.0.0 + mdast-util-to-markdown: ^2.0.0 + checksum: ecdadc0b46608d03eea53366cfee8c9441ddacc49fe4e12934eff8fea06f9377d2679d9d9e43177295c09c8d7def5f48d739f99b0f6144a0e228a77f5a1c76bc + languageName: node + linkType: hard + +"mdast-util-newline-to-break@npm:^2.0.0": + version: 2.0.0 + resolution: "mdast-util-newline-to-break@npm:2.0.0" + dependencies: + "@types/mdast": ^4.0.0 + mdast-util-find-and-replace: ^3.0.0 + checksum: 91e235e3629a83d6b7f1d713297da9f7fc394b1c88f2859f775bee78cd8de6a84d8657edac5f7b1fecfc07e4b5d06233f64f61e895b76642f1612530b2d7d88a + languageName: node + linkType: hard + +"mdast-util-phrasing@npm:^4.0.0": + version: 4.1.0 + resolution: "mdast-util-phrasing@npm:4.1.0" + dependencies: + "@types/mdast": ^4.0.0 + unist-util-is: ^6.0.0 + checksum: 3a97533e8ad104a422f8bebb34b3dde4f17167b8ed3a721cf9263c7416bd3447d2364e6d012a594aada40cac9e949db28a060bb71a982231693609034ed5324e + languageName: node + linkType: hard + "mdast-util-to-hast@npm:^11.0.0": version: 11.3.0 resolution: "mdast-util-to-hast@npm:11.3.0" @@ -25153,6 +26785,23 @@ __metadata: languageName: node linkType: hard +"mdast-util-to-hast@npm:^13.0.0": + version: 13.2.1 + resolution: "mdast-util-to-hast@npm:13.2.1" + dependencies: + "@types/hast": ^3.0.0 + "@types/mdast": ^4.0.0 + "@ungap/structured-clone": ^1.0.0 + devlop: ^1.0.0 + micromark-util-sanitize-uri: ^2.0.0 + trim-lines: ^3.0.0 + unist-util-position: ^5.0.0 + unist-util-visit: ^5.0.0 + vfile: ^6.0.0 + checksum: 20537df653be3653c3c6ea4be09ea1f67ca2f5e6afea027fcc3cde531656dc669a5e733d34a95b08b3ee71ab164c7b24352c8212891f723ddcec74d5a046bfd6 + languageName: node + linkType: hard + "mdast-util-to-markdown@npm:^1.0.0, mdast-util-to-markdown@npm:^1.3.0": version: 1.3.0 resolution: "mdast-util-to-markdown@npm:1.3.0" @@ -25168,6 +26817,23 @@ __metadata: languageName: node linkType: hard +"mdast-util-to-markdown@npm:^2.0.0": + version: 2.1.2 + resolution: "mdast-util-to-markdown@npm:2.1.2" + dependencies: + "@types/mdast": ^4.0.0 + "@types/unist": ^3.0.0 + longest-streak: ^3.0.0 + mdast-util-phrasing: ^4.0.0 + mdast-util-to-string: ^4.0.0 + micromark-util-classify-character: ^2.0.0 + micromark-util-decode-string: ^2.0.0 + unist-util-visit: ^5.0.0 + zwitch: ^2.0.0 + checksum: 288d152bd50c00632e6e01c610bb904a220d1e226c8086c40627877959746f83ab0b872f4150cb7d910198953b1bf756e384ac3fee3e7b0ddb4517f9084c5803 + languageName: node + linkType: hard + "mdast-util-to-string@npm:^1.0.0": version: 1.1.0 resolution: "mdast-util-to-string@npm:1.1.0" @@ -25182,17 +26848,26 @@ __metadata: languageName: node linkType: hard -"mdn-data@npm:2.0.14": - version: 2.0.14 - resolution: "mdn-data@npm:2.0.14" - checksum: 9d0128ed425a89f4cba8f787dca27ad9408b5cb1b220af2d938e2a0629d17d879a34d2cb19318bdb26c3f14c77dd5dfbae67211f5caaf07b61b1f2c5c8c7dc16 +"mdast-util-to-string@npm:^4.0.0": + version: 4.0.0 + resolution: "mdast-util-to-string@npm:4.0.0" + dependencies: + "@types/mdast": ^4.0.0 + checksum: 35489fb5710d58cbc2d6c8b6547df161a3f81e0f28f320dfb3548a9393555daf07c310c0c497708e67ed4dfea4a06e5655799e7d631ca91420c288b4525d6c29 languageName: node linkType: hard -"mdn-data@npm:2.0.4": - version: 2.0.4 - resolution: "mdn-data@npm:2.0.4" - checksum: add3c95e6d03d301b8a8bcfee3de33f4d07e4c5eee5b79f18d6d737de717e22472deadf67c1a8563983c0b603e10d7df40aa8e5fddf18884dfe118ccec7ae329 +"mdn-data@npm:2.0.28": + version: 2.0.28 + resolution: "mdn-data@npm:2.0.28" + checksum: f51d587a6ebe8e426c3376c74ea6df3e19ec8241ed8e2466c9c8a3904d5d04397199ea4f15b8d34d14524b5de926d8724ae85207984be47e165817c26e49e0aa + languageName: node + linkType: hard + +"mdn-data@npm:2.0.30": + version: 2.0.30 + resolution: "mdn-data@npm:2.0.30" + checksum: d6ac5ac7439a1607df44b22738ecf83f48e66a0874e4482d6424a61c52da5cde5750f1d1229b6f5fa1b80a492be89465390da685b11f97d62b8adcc6e88189aa languageName: node linkType: hard @@ -25376,6 +27051,30 @@ __metadata: languageName: node linkType: hard +"micromark-core-commonmark@npm:^2.0.0": + version: 2.0.3 + resolution: "micromark-core-commonmark@npm:2.0.3" + dependencies: + decode-named-character-reference: ^1.0.0 + devlop: ^1.0.0 + micromark-factory-destination: ^2.0.0 + micromark-factory-label: ^2.0.0 + micromark-factory-space: ^2.0.0 + micromark-factory-title: ^2.0.0 + micromark-factory-whitespace: ^2.0.0 + micromark-util-character: ^2.0.0 + micromark-util-chunked: ^2.0.0 + micromark-util-classify-character: ^2.0.0 + micromark-util-html-tag-name: ^2.0.0 + micromark-util-normalize-identifier: ^2.0.0 + micromark-util-resolve-all: ^2.0.0 + micromark-util-subtokenize: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: cfb0fd9c895f86a4e9344f7f0344fe6bd1018945798222835248146a42430b8c7bc0b2857af574cf4e1b4ce4e5c1a35a1479942421492e37baddde8de85814dc + languageName: node + linkType: hard + "micromark-extension-gfm-autolink-literal@npm:^1.0.0": version: 1.0.3 resolution: "micromark-extension-gfm-autolink-literal@npm:1.0.3" @@ -25389,6 +27088,18 @@ __metadata: languageName: node linkType: hard +"micromark-extension-gfm-autolink-literal@npm:^2.0.0": + version: 2.1.0 + resolution: "micromark-extension-gfm-autolink-literal@npm:2.1.0" + dependencies: + micromark-util-character: ^2.0.0 + micromark-util-sanitize-uri: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: e00a570c70c837b9cbbe94b2c23b787f44e781cd19b72f1828e3453abca2a9fb600fa539cdc75229fa3919db384491063645086e02249481e6ff3ec2c18f767c + languageName: node + linkType: hard + "micromark-extension-gfm-footnote@npm:^1.0.0": version: 1.0.4 resolution: "micromark-extension-gfm-footnote@npm:1.0.4" @@ -25405,6 +27116,22 @@ __metadata: languageName: node linkType: hard +"micromark-extension-gfm-footnote@npm:^2.0.0": + version: 2.1.0 + resolution: "micromark-extension-gfm-footnote@npm:2.1.0" + dependencies: + devlop: ^1.0.0 + micromark-core-commonmark: ^2.0.0 + micromark-factory-space: ^2.0.0 + micromark-util-character: ^2.0.0 + micromark-util-normalize-identifier: ^2.0.0 + micromark-util-sanitize-uri: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: ac6fb039e98395d37b71ebff7c7a249aef52678b5cf554c89c4f716111d4be62ef99a5d715a5bd5d68fa549778c977d85cb671d1d8506dc8a3a1b46e867ae52f + languageName: node + linkType: hard + "micromark-extension-gfm-strikethrough@npm:^1.0.0": version: 1.0.4 resolution: "micromark-extension-gfm-strikethrough@npm:1.0.4" @@ -25419,6 +27146,20 @@ __metadata: languageName: node linkType: hard +"micromark-extension-gfm-strikethrough@npm:^2.0.0": + version: 2.1.0 + resolution: "micromark-extension-gfm-strikethrough@npm:2.1.0" + dependencies: + devlop: ^1.0.0 + micromark-util-chunked: ^2.0.0 + micromark-util-classify-character: ^2.0.0 + micromark-util-resolve-all: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: cdb7a38dd6eefb6ceb6792a44a6796b10f951e8e3e45b8579f599f43e7ae26ccd048c0aa7e441b3c29dd0c54656944fe6eb0098de2bc4b5106fbc0a42e9e016c + languageName: node + linkType: hard + "micromark-extension-gfm-table@npm:^1.0.0": version: 1.0.5 resolution: "micromark-extension-gfm-table@npm:1.0.5" @@ -25432,6 +27173,19 @@ __metadata: languageName: node linkType: hard +"micromark-extension-gfm-table@npm:^2.0.0": + version: 2.1.1 + resolution: "micromark-extension-gfm-table@npm:2.1.1" + dependencies: + devlop: ^1.0.0 + micromark-factory-space: ^2.0.0 + micromark-util-character: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: 16a59c8c2381c8418d9cf36c605abb0b66cfebaad07e09c4c9b113298d13e0c517b652885529fcb74d149afec3f6e8ab065fd27a900073d5ec0a1d8f0c51b593 + languageName: node + linkType: hard + "micromark-extension-gfm-tagfilter@npm:^1.0.0": version: 1.0.1 resolution: "micromark-extension-gfm-tagfilter@npm:1.0.1" @@ -25441,6 +27195,15 @@ __metadata: languageName: node linkType: hard +"micromark-extension-gfm-tagfilter@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-extension-gfm-tagfilter@npm:2.0.0" + dependencies: + micromark-util-types: ^2.0.0 + checksum: cf21552f4a63592bfd6c96ae5d64a5f22bda4e77814e3f0501bfe80e7a49378ad140f827007f36044666f176b3a0d5fea7c2e8e7973ce4b4579b77789f01ae95 + languageName: node + linkType: hard + "micromark-extension-gfm-task-list-item@npm:^1.0.0": version: 1.0.3 resolution: "micromark-extension-gfm-task-list-item@npm:1.0.3" @@ -25454,6 +27217,19 @@ __metadata: languageName: node linkType: hard +"micromark-extension-gfm-task-list-item@npm:^2.0.0": + version: 2.1.0 + resolution: "micromark-extension-gfm-task-list-item@npm:2.1.0" + dependencies: + devlop: ^1.0.0 + micromark-factory-space: ^2.0.0 + micromark-util-character: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: b1ad86a4e9d68d9ad536d94fb25a5182acbc85cc79318f4a6316034342f6a71d67983cc13f12911d0290fd09b2bda43cdabe8781a2d9cca2ebe0d421e8b2b8a4 + languageName: node + linkType: hard + "micromark-extension-gfm@npm:^2.0.0": version: 2.0.1 resolution: "micromark-extension-gfm@npm:2.0.1" @@ -25470,6 +27246,22 @@ __metadata: languageName: node linkType: hard +"micromark-extension-gfm@npm:^3.0.0": + version: 3.0.0 + resolution: "micromark-extension-gfm@npm:3.0.0" + dependencies: + micromark-extension-gfm-autolink-literal: ^2.0.0 + micromark-extension-gfm-footnote: ^2.0.0 + micromark-extension-gfm-strikethrough: ^2.0.0 + micromark-extension-gfm-table: ^2.0.0 + micromark-extension-gfm-tagfilter: ^2.0.0 + micromark-extension-gfm-task-list-item: ^2.0.0 + micromark-util-combine-extensions: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: 2060fa62666a09532d6b3a272d413bc1b25bbb262f921d7402795ac021e1362c8913727e33d7528d5b4ccaf26922ec51208c43f795a702964817bc986de886c9 + languageName: node + linkType: hard + "micromark-factory-destination@npm:^1.0.0": version: 1.0.0 resolution: "micromark-factory-destination@npm:1.0.0" @@ -25481,6 +27273,17 @@ __metadata: languageName: node linkType: hard +"micromark-factory-destination@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-factory-destination@npm:2.0.1" + dependencies: + micromark-util-character: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: 9c4baa9ca2ed43c061bbf40ddd3d85154c2a0f1f485de9dea41d7dd2ad994ebb02034a003b2c1dbe228ba83a0576d591f0e90e0bf978713f84ee7d7f3aa98320 + languageName: node + linkType: hard + "micromark-factory-label@npm:^1.0.0": version: 1.0.2 resolution: "micromark-factory-label@npm:1.0.2" @@ -25493,6 +27296,18 @@ __metadata: languageName: node linkType: hard +"micromark-factory-label@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-factory-label@npm:2.0.1" + dependencies: + devlop: ^1.0.0 + micromark-util-character: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: bd03f5a75f27cdbf03b894ddc5c4480fc0763061fecf9eb927d6429233c930394f223969a99472df142d570c831236134de3dc23245d23d9f046f9d0b623b5c2 + languageName: node + linkType: hard + "micromark-factory-space@npm:^1.0.0": version: 1.0.0 resolution: "micromark-factory-space@npm:1.0.0" @@ -25503,6 +27318,16 @@ __metadata: languageName: node linkType: hard +"micromark-factory-space@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-factory-space@npm:2.0.1" + dependencies: + micromark-util-character: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: 1bd68a017c1a66f4787506660c1e1c5019169aac3b1cb075d49ac5e360e0b2065e984d4e1d6e9e52a9d44000f2fa1c98e66a743d7aae78b4b05616bf3242ed71 + languageName: node + linkType: hard + "micromark-factory-title@npm:^1.0.0": version: 1.0.2 resolution: "micromark-factory-title@npm:1.0.2" @@ -25516,6 +27341,18 @@ __metadata: languageName: node linkType: hard +"micromark-factory-title@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-factory-title@npm:2.0.1" + dependencies: + micromark-factory-space: ^2.0.0 + micromark-util-character: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: b4d2e4850a8ba0dff25ce54e55a3eb0d43dda88a16293f53953153288f9d84bcdfa8ca4606b2cfbb4f132ea79587bbb478a73092a349f893f5264fbcdbce2ee1 + languageName: node + linkType: hard + "micromark-factory-whitespace@npm:^1.0.0": version: 1.0.0 resolution: "micromark-factory-whitespace@npm:1.0.0" @@ -25528,6 +27365,18 @@ __metadata: languageName: node linkType: hard +"micromark-factory-whitespace@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-factory-whitespace@npm:2.0.1" + dependencies: + micromark-factory-space: ^2.0.0 + micromark-util-character: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: 67b3944d012a42fee9e10e99178254a04d48af762b54c10a50fcab988688799993efb038daf9f5dbc04001a97b9c1b673fc6f00e6a56997877ab25449f0c8650 + languageName: node + linkType: hard + "micromark-util-character@npm:^1.0.0": version: 1.1.0 resolution: "micromark-util-character@npm:1.1.0" @@ -25538,6 +27387,16 @@ __metadata: languageName: node linkType: hard +"micromark-util-character@npm:^2.0.0": + version: 2.1.1 + resolution: "micromark-util-character@npm:2.1.1" + dependencies: + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: e9e409efe4f2596acd44587e8591b722bfc041c1577e8fe0d9c007a4776fb800f9b3637a22862ad2ba9489f4bdf72bb547fce5767dbbfe0a5e6760e2a21c6495 + languageName: node + linkType: hard + "micromark-util-chunked@npm:^1.0.0": version: 1.0.0 resolution: "micromark-util-chunked@npm:1.0.0" @@ -25547,6 +27406,15 @@ __metadata: languageName: node linkType: hard +"micromark-util-chunked@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-chunked@npm:2.0.1" + dependencies: + micromark-util-symbol: ^2.0.0 + checksum: f8cb2a67bcefe4bd2846d838c97b777101f0043b9f1de4f69baf3e26bb1f9885948444e3c3aec66db7595cad8173bd4567a000eb933576c233d54631f6323fe4 + languageName: node + linkType: hard + "micromark-util-classify-character@npm:^1.0.0": version: 1.0.0 resolution: "micromark-util-classify-character@npm:1.0.0" @@ -25558,6 +27426,17 @@ __metadata: languageName: node linkType: hard +"micromark-util-classify-character@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-classify-character@npm:2.0.1" + dependencies: + micromark-util-character: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: 4d8bbe3a6dbf69ac0fc43516866b5bab019fe3f4568edc525d4feaaaf78423fa54e6b6732b5bccbeed924455279a3758ffc9556954aafb903982598a95a02704 + languageName: node + linkType: hard + "micromark-util-combine-extensions@npm:^1.0.0": version: 1.0.0 resolution: "micromark-util-combine-extensions@npm:1.0.0" @@ -25568,6 +27447,16 @@ __metadata: languageName: node linkType: hard +"micromark-util-combine-extensions@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-combine-extensions@npm:2.0.1" + dependencies: + micromark-util-chunked: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: 5d22fb9ee37e8143adfe128a72b50fa09568c2cc553b3c76160486c96dbbb298c5802a177a10a215144a604b381796071b5d35be1f2c2b2ee17995eda92f0c8e + languageName: node + linkType: hard + "micromark-util-decode-numeric-character-reference@npm:^1.0.0": version: 1.0.0 resolution: "micromark-util-decode-numeric-character-reference@npm:1.0.0" @@ -25577,6 +27466,15 @@ __metadata: languageName: node linkType: hard +"micromark-util-decode-numeric-character-reference@npm:^2.0.0": + version: 2.0.2 + resolution: "micromark-util-decode-numeric-character-reference@npm:2.0.2" + dependencies: + micromark-util-symbol: ^2.0.0 + checksum: ee11c8bde51e250e302050474c4a2adca094bca05c69f6cdd241af12df285c48c88d19ee6e022b9728281c280be16328904adca994605680c43af56019f4b0b6 + languageName: node + linkType: hard + "micromark-util-decode-string@npm:^1.0.0": version: 1.0.2 resolution: "micromark-util-decode-string@npm:1.0.2" @@ -25589,6 +27487,18 @@ __metadata: languageName: node linkType: hard +"micromark-util-decode-string@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-decode-string@npm:2.0.1" + dependencies: + decode-named-character-reference: ^1.0.0 + micromark-util-character: ^2.0.0 + micromark-util-decode-numeric-character-reference: ^2.0.0 + micromark-util-symbol: ^2.0.0 + checksum: e9546ae53f9b5a4f9aa6aaf3e750087100d3429485ca80dbacec99ff2bb15a406fa7d93784a0fc2fe05ad7296b9295e75160ef71faec9e90110b7be2ae66241a + languageName: node + linkType: hard + "micromark-util-encode@npm:^1.0.0": version: 1.0.0 resolution: "micromark-util-encode@npm:1.0.0" @@ -25596,6 +27506,13 @@ __metadata: languageName: node linkType: hard +"micromark-util-encode@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-encode@npm:2.0.1" + checksum: be890b98e78dd0cdd953a313f4148c4692cc2fb05533e56fef5f421287d3c08feee38ca679f318e740530791fc251bfe8c80efa926fcceb4419b269c9343d226 + languageName: node + linkType: hard + "micromark-util-html-tag-name@npm:^1.0.0": version: 1.0.0 resolution: "micromark-util-html-tag-name@npm:1.0.0" @@ -25603,6 +27520,13 @@ __metadata: languageName: node linkType: hard +"micromark-util-html-tag-name@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-html-tag-name@npm:2.0.1" + checksum: dea365f5ad28ad74ff29fcb581f7b74fc1f80271c5141b3b2bc91c454cbb6dfca753f28ae03730d657874fcbd89d0494d0e3965dfdca06d9855f467c576afa9d + languageName: node + linkType: hard + "micromark-util-normalize-identifier@npm:^1.0.0": version: 1.0.0 resolution: "micromark-util-normalize-identifier@npm:1.0.0" @@ -25612,6 +27536,15 @@ __metadata: languageName: node linkType: hard +"micromark-util-normalize-identifier@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-normalize-identifier@npm:2.0.1" + dependencies: + micromark-util-symbol: ^2.0.0 + checksum: 1eb9a289d7da067323df9fdc78bfa90ca3207ad8fd893ca02f3133e973adcb3743b233393d23d95c84ccaf5d220ae7f5a28402a644f135dcd4b8cfa60a7b5f84 + languageName: node + linkType: hard + "micromark-util-resolve-all@npm:^1.0.0": version: 1.0.0 resolution: "micromark-util-resolve-all@npm:1.0.0" @@ -25621,6 +27554,15 @@ __metadata: languageName: node linkType: hard +"micromark-util-resolve-all@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-resolve-all@npm:2.0.1" + dependencies: + micromark-util-types: ^2.0.0 + checksum: 9275f3ddb6c26f254dd2158e66215d050454b279707a7d9ce5a3cd0eba23201021cedcb78ae1a746c1b23227dcc418ee40dd074ade195359506797a5493550cc + languageName: node + linkType: hard + "micromark-util-sanitize-uri@npm:^1.0.0": version: 1.0.0 resolution: "micromark-util-sanitize-uri@npm:1.0.0" @@ -25632,6 +27574,17 @@ __metadata: languageName: node linkType: hard +"micromark-util-sanitize-uri@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-sanitize-uri@npm:2.0.1" + dependencies: + micromark-util-character: ^2.0.0 + micromark-util-encode: ^2.0.0 + micromark-util-symbol: ^2.0.0 + checksum: d01517840c17de67aaa0b0f03bfe05fac8a41d99723cd8ce16c62f6810e99cd3695364a34c335485018e5e2c00e69031744630a1b85c6868aa2f2ca1b36daa2f + languageName: node + linkType: hard + "micromark-util-subtokenize@npm:^1.0.0": version: 1.0.2 resolution: "micromark-util-subtokenize@npm:1.0.2" @@ -25644,6 +27597,18 @@ __metadata: languageName: node linkType: hard +"micromark-util-subtokenize@npm:^2.0.0": + version: 2.1.0 + resolution: "micromark-util-subtokenize@npm:2.1.0" + dependencies: + devlop: ^1.0.0 + micromark-util-chunked: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: 2e194bc8a5279d256582020500e5072a95c1094571be49043704343032e1fffbe09c862ef9c131cf5c762e296ddb54ff8bc767b3786a798524a68d1db6942934 + languageName: node + linkType: hard + "micromark-util-symbol@npm:^1.0.0": version: 1.0.0 resolution: "micromark-util-symbol@npm:1.0.0" @@ -25651,6 +27616,13 @@ __metadata: languageName: node linkType: hard +"micromark-util-symbol@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-symbol@npm:2.0.1" + checksum: fb7346950550bc85a55793dda94a8b3cb3abc068dbd7570d1162db7aee803411d06c0a5de4ae59cd945f46143bdeadd4bba02a02248fa0d18cc577babaa00044 + languageName: node + linkType: hard + "micromark-util-types@npm:^1.0.0, micromark-util-types@npm:^1.0.1": version: 1.0.2 resolution: "micromark-util-types@npm:1.0.2" @@ -25658,6 +27630,13 @@ __metadata: languageName: node linkType: hard +"micromark-util-types@npm:^2.0.0": + version: 2.0.2 + resolution: "micromark-util-types@npm:2.0.2" + checksum: 884f7974839e4bc6d2bd662e57c973a9164fd5c0d8fe16cddf07472b86a7e6726747c00674952c0321d17685d700cd3295e9f58a842a53acdf6c6d55ab051aab + languageName: node + linkType: hard + "micromark@npm:^3.0.0": version: 3.0.9 resolution: "micromark@npm:3.0.9" @@ -25683,6 +27662,31 @@ __metadata: languageName: node linkType: hard +"micromark@npm:^4.0.0": + version: 4.0.2 + resolution: "micromark@npm:4.0.2" + dependencies: + "@types/debug": ^4.0.0 + debug: ^4.0.0 + decode-named-character-reference: ^1.0.0 + devlop: ^1.0.0 + micromark-core-commonmark: ^2.0.0 + micromark-factory-space: ^2.0.0 + micromark-util-character: ^2.0.0 + micromark-util-chunked: ^2.0.0 + micromark-util-combine-extensions: ^2.0.0 + micromark-util-decode-numeric-character-reference: ^2.0.0 + micromark-util-encode: ^2.0.0 + micromark-util-normalize-identifier: ^2.0.0 + micromark-util-resolve-all: ^2.0.0 + micromark-util-sanitize-uri: ^2.0.0 + micromark-util-subtokenize: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: 5306c15dd12f543755bc627fc361d4255dfc430e7af6069a07ac0eacc338fbd761fe8e93f02a8bfab6097bab12ee903192fe31389222459d5029242a5aaba3b8 + languageName: node + linkType: hard + "micromatch@npm:^3.1.10": version: 3.1.10 resolution: "micromatch@npm:3.1.10" @@ -25724,6 +27728,16 @@ __metadata: languageName: node linkType: hard +"micromatch@npm:^4.0.8": + version: 4.0.8 + resolution: "micromatch@npm:4.0.8" + dependencies: + braces: ^3.0.3 + picomatch: ^2.3.1 + checksum: 79920eb634e6f400b464a954fcfa589c4e7c7143209488e44baf627f9affc8b1e306f41f4f0deedde97e69cb725920879462d3e750ab3bd3c1aed675bb3a8966 + languageName: node + linkType: hard + "miller-rabin@npm:^4.0.0": version: 4.0.1 resolution: "miller-rabin@npm:4.0.1" @@ -25852,6 +27866,18 @@ __metadata: languageName: node linkType: hard +"mini-css-extract-plugin@npm:^2.4.2": + version: 2.9.4 + resolution: "mini-css-extract-plugin@npm:2.9.4" + dependencies: + schema-utils: ^4.0.0 + tapable: ^2.2.1 + peerDependencies: + webpack: ^5.0.0 + checksum: 4ec46ebdcb5dae4b1c012debca90fea27b1e8e7790d408154232d77d25f56f839e7b1ec5401a962d6356e7b9301c760d2ef62e1cb0d4d7b6ec8209f812733dda + languageName: node + linkType: hard + "minimalistic-assert@npm:^1.0.0, minimalistic-assert@npm:^1.0.1": version: 1.0.1 resolution: "minimalistic-assert@npm:1.0.1" @@ -26123,25 +28149,25 @@ __metadata: languageName: node linkType: hard -"mkdirp@npm:>=0.5 0, mkdirp@npm:^0.5.4": - version: 0.5.6 - resolution: "mkdirp@npm:0.5.6" +"mkdirp@npm:0.5.5, mkdirp@npm:^0.5.5": + version: 0.5.5 + resolution: "mkdirp@npm:0.5.5" dependencies: - minimist: ^1.2.6 + minimist: ^1.2.5 bin: mkdirp: bin/cmd.js - checksum: 0c91b721bb12c3f9af4b77ebf73604baf350e64d80df91754dc509491ae93bf238581e59c7188360cec7cb62fc4100959245a42cfe01834efedc5e9d068376c2 + checksum: 3bce20ea525f9477befe458ab85284b0b66c8dc3812f94155af07c827175948cdd8114852ac6c6d82009b13c1048c37f6d98743eb019651ee25c39acc8aabe7d languageName: node linkType: hard -"mkdirp@npm:^0.5.5, mkdirp@npm:~0.5.1": - version: 0.5.5 - resolution: "mkdirp@npm:0.5.5" +"mkdirp@npm:>=0.5 0, mkdirp@npm:^0.5.4": + version: 0.5.6 + resolution: "mkdirp@npm:0.5.6" dependencies: - minimist: ^1.2.5 + minimist: ^1.2.6 bin: mkdirp: bin/cmd.js - checksum: 3bce20ea525f9477befe458ab85284b0b66c8dc3812f94155af07c827175948cdd8114852ac6c6d82009b13c1048c37f6d98743eb019651ee25c39acc8aabe7d + checksum: 0c91b721bb12c3f9af4b77ebf73604baf350e64d80df91754dc509491ae93bf238581e59c7188360cec7cb62fc4100959245a42cfe01834efedc5e9d068376c2 languageName: node linkType: hard @@ -26175,6 +28201,41 @@ __metadata: languageName: node linkType: hard +"mocha@npm:^7.1.2": + version: 7.2.0 + resolution: "mocha@npm:7.2.0" + dependencies: + ansi-colors: 3.2.3 + browser-stdout: 1.3.1 + chokidar: 3.3.0 + debug: 3.2.6 + diff: 3.5.0 + escape-string-regexp: 1.0.5 + find-up: 3.0.0 + glob: 7.1.3 + growl: 1.10.5 + he: 1.2.0 + js-yaml: 3.13.1 + log-symbols: 3.0.0 + minimatch: 3.0.4 + mkdirp: 0.5.5 + ms: 2.1.1 + node-environment-flags: 1.0.6 + object.assign: 4.1.0 + strip-json-comments: 2.0.1 + supports-color: 6.0.0 + which: 1.3.1 + wide-align: 1.1.3 + yargs: 13.3.2 + yargs-parser: 13.1.2 + yargs-unparser: 1.6.0 + bin: + _mocha: bin/_mocha + mocha: bin/mocha + checksum: d098484fe1b165bb964fdbf6b88b256c71fead47575ca7c5bcf8ed07db0dcff41905f6d2f0a05111a0441efaef9d09241a8cc1ddf7961056b28984ec63ba2874 + languageName: node + linkType: hard + "mock-local-storage@npm:^1.1.17": version: 1.1.17 resolution: "mock-local-storage@npm:1.1.17" @@ -26331,6 +28392,15 @@ __metadata: languageName: node linkType: hard +"nanoid@npm:^3.3.11": + version: 3.3.11 + resolution: "nanoid@npm:3.3.11" + bin: + nanoid: bin/nanoid.cjs + checksum: 3be20d8866a57a6b6d218e82549711c8352ed969f9ab3c45379da28f405363ad4c9aeb0b39e9abc101a529ca65a72ff9502b00bf74a912c4b64a9d62dfd26c29 + languageName: node + linkType: hard + "nanomatch@npm:^1.2.9": version: 1.2.13 resolution: "nanomatch@npm:1.2.13" @@ -26528,6 +28598,16 @@ __metadata: languageName: node linkType: hard +"node-environment-flags@npm:1.0.6": + version: 1.0.6 + resolution: "node-environment-flags@npm:1.0.6" + dependencies: + object.getownpropertydescriptors: ^2.0.3 + semver: ^5.7.0 + checksum: 268139ed0f7fabdca346dcb26931300ec7a1dc54a58085a849e5c78a82b94967f55df40177a69d4e819da278d98686d5c4fd49ab0d7bcff16fda25b6fffc4ca3 + languageName: node + linkType: hard + "node-fetch-native@npm:^1.0.2": version: 1.1.1 resolution: "node-fetch-native@npm:1.1.1" @@ -26734,6 +28814,13 @@ __metadata: languageName: node linkType: hard +"node-releases@npm:^2.0.27": + version: 2.0.27 + resolution: "node-releases@npm:2.0.27" + checksum: a9a54079d894704c2ec728a690b41fbc779a710f5d47b46fa3e460acff08a3e7dfa7108e5599b2db390aa31dac062c47c5118317201f12784188dc5b415f692d + languageName: node + linkType: hard + "nodemon@npm:^2.0.21": version: 2.0.22 resolution: "nodemon@npm:2.0.22" @@ -26851,13 +28938,6 @@ __metadata: languageName: node linkType: hard -"normalize-url@npm:^3.0.0": - version: 3.3.0 - resolution: "normalize-url@npm:3.3.0" - checksum: f6aa4a1a94c3b799812f3e7fc987fb4599d869bfa8e9a160b6f2c5a2b4e62ada998d64dca30d9e20769d8bd95d3da1da3d4841dba2cc3c4d85364e1eb46219a2 - languageName: node - linkType: hard - "normalize-url@npm:^4.1.0": version: 4.5.1 resolution: "normalize-url@npm:4.5.1" @@ -27113,15 +29193,6 @@ __metadata: languageName: node linkType: hard -"nth-check@npm:^1.0.2": - version: 1.0.2 - resolution: "nth-check@npm:1.0.2" - dependencies: - boolbase: ~1.0.0 - checksum: 59e115fdd75b971d0030f42ada3aac23898d4c03aa13371fa8b3339d23461d1badf3fde5aad251fb956aaa75c0a3b9bfcd07c08a34a83b4f9dadfdce1d19337c - languageName: node - linkType: hard - "nth-check@npm:^2.0.0": version: 2.0.1 resolution: "nth-check@npm:2.0.1" @@ -27131,6 +29202,15 @@ __metadata: languageName: node linkType: hard +"nth-check@npm:^2.0.1": + version: 2.1.1 + resolution: "nth-check@npm:2.1.1" + dependencies: + boolbase: ^1.0.0 + checksum: 5afc3dafcd1573b08877ca8e6148c52abd565f1d06b1eb08caf982e3fa289a82f2cae697ffb55b5021e146d60443f1590a5d6b944844e944714a5b549675bcd3 + languageName: node + linkType: hard + "nullthrows@npm:^1.1.1": version: 1.1.1 resolution: "nullthrows@npm:1.1.1" @@ -27224,13 +29304,6 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.11.0, object-inspect@npm:^1.9.0": - version: 1.11.0 - resolution: "object-inspect@npm:1.11.0" - checksum: 8c64f89ce3a7b96b6925879ad5f6af71d498abc217e136660efecd97452991216f375a7eb47cb1cb50643df939bf0c7cc391567b7abc6a924d04679705e58e27 - languageName: node - linkType: hard - "object-inspect@npm:^1.12.0": version: 1.12.0 resolution: "object-inspect@npm:1.12.0" @@ -27245,6 +29318,20 @@ __metadata: languageName: node linkType: hard +"object-inspect@npm:^1.13.3, object-inspect@npm:^1.13.4": + version: 1.13.4 + resolution: "object-inspect@npm:1.13.4" + checksum: 582810c6a8d2ef988ea0a39e69e115a138dad8f42dd445383b394877e5816eb4268489f316a6f74ee9c4e0a984b3eab1028e3e79d62b1ed67c726661d55c7a8b + languageName: node + linkType: hard + +"object-inspect@npm:^1.9.0": + version: 1.11.0 + resolution: "object-inspect@npm:1.11.0" + checksum: 8c64f89ce3a7b96b6925879ad5f6af71d498abc217e136660efecd97452991216f375a7eb47cb1cb50643df939bf0c7cc391567b7abc6a924d04679705e58e27 + languageName: node + linkType: hard + "object-is@npm:^1.0.1, object-is@npm:^1.1.5": version: 1.1.5 resolution: "object-is@npm:1.1.5" @@ -27255,7 +29342,7 @@ __metadata: languageName: node linkType: hard -"object-keys@npm:^1.0.12, object-keys@npm:^1.1.1": +"object-keys@npm:^1.0.11, object-keys@npm:^1.0.12, object-keys@npm:^1.1.1": version: 1.1.1 resolution: "object-keys@npm:1.1.1" checksum: b363c5e7644b1e1b04aa507e88dcb8e3a2f52b6ffd0ea801e4c7a62d5aa559affe21c55a07fd4b1fd55fc03a33c610d73426664b20032405d7b92a1414c34d6a @@ -27271,15 +29358,15 @@ __metadata: languageName: node linkType: hard -"object.assign@npm:^4.1.2": - version: 4.1.2 - resolution: "object.assign@npm:4.1.2" +"object.assign@npm:4.1.0": + version: 4.1.0 + resolution: "object.assign@npm:4.1.0" dependencies: - call-bind: ^1.0.0 - define-properties: ^1.1.3 - has-symbols: ^1.0.1 - object-keys: ^1.1.1 - checksum: d621d832ed7b16ac74027adb87196804a500d80d9aca536fccb7ba48d33a7e9306a75f94c1d29cbfa324bc091bfc530bc24789568efdaee6a47fcfa298993814 + define-properties: ^1.1.2 + function-bind: ^1.1.1 + has-symbols: ^1.0.0 + object-keys: ^1.0.11 + checksum: 648a9a463580bf48332d9a49a76fede2660ab1ee7104d9459b8a240562246da790b4151c3c073f28fda31c1fdc555d25a1d871e72be403e997e4468c91f4801f languageName: node linkType: hard @@ -27295,6 +29382,20 @@ __metadata: languageName: node linkType: hard +"object.assign@npm:^4.1.7": + version: 4.1.7 + resolution: "object.assign@npm:4.1.7" + dependencies: + call-bind: ^1.0.8 + call-bound: ^1.0.3 + define-properties: ^1.2.1 + es-object-atoms: ^1.0.0 + has-symbols: ^1.1.0 + object-keys: ^1.1.1 + checksum: 60e07d2651cf4f5528c485f1aa4dbded9b384c47d80e8187cefd11320abb1aebebf78df5483451dfa549059f8281c21f7b4bf7d19e9e5e97d8d617df0df298de + languageName: node + linkType: hard + "object.fromentries@npm:^2.0.7": version: 2.0.7 resolution: "object.fromentries@npm:2.0.7" @@ -27306,14 +29407,18 @@ __metadata: languageName: node linkType: hard -"object.getownpropertydescriptors@npm:^2.1.0": - version: 2.1.3 - resolution: "object.getownpropertydescriptors@npm:2.1.3" +"object.getownpropertydescriptors@npm:^2.0.3": + version: 2.1.8 + resolution: "object.getownpropertydescriptors@npm:2.1.8" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.3 - es-abstract: ^1.19.1 - checksum: 1467873456fd367a0eb91350caff359a8f05ceb069b4535a1846aa1f74f477a49ae704f6c89c0c14cc0ae1518ee3a0aa57c7f733a8e7b2b06b34a818e9593d2f + array.prototype.reduce: ^1.0.6 + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-abstract: ^1.23.2 + es-object-atoms: ^1.0.0 + gopd: ^1.0.1 + safe-array-concat: ^1.1.2 + checksum: 073e492700a7f61ff6c471a2ed96e72473b030a7a105617f03cab192fb4bbc0e6068ef76534ec56afd34baf26b5dc5408de59cb0140ec8abde781e00faa3e63e languageName: node linkType: hard @@ -27338,17 +29443,6 @@ __metadata: languageName: node linkType: hard -"object.values@npm:^1.1.0": - version: 1.1.5 - resolution: "object.values@npm:1.1.5" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.3 - es-abstract: ^1.19.1 - checksum: 0f17e99741ebfbd0fa55ce942f6184743d3070c61bd39221afc929c8422c4907618c8da694c6915bc04a83ab3224260c779ba37fc07bb668bdc5f33b66a902a4 - languageName: node - linkType: hard - "object.values@npm:^1.1.7": version: 1.1.7 resolution: "object.values@npm:1.1.7" @@ -27570,6 +29664,17 @@ __metadata: languageName: node linkType: hard +"own-keys@npm:^1.0.1": + version: 1.0.1 + resolution: "own-keys@npm:1.0.1" + dependencies: + get-intrinsic: ^1.2.6 + object-keys: ^1.1.1 + safe-push-apply: ^1.0.0 + checksum: cc9dd7d85c4ccfbe8109fce307d581ac7ede7b26de892b537873fbce2dc6a206d89aea0630dbb98e47ce0873517cefeaa7be15fcf94aaf4764a3b34b474a5b61 + languageName: node + linkType: hard + "p-cancelable@npm:^1.0.0": version: 1.1.0 resolution: "p-cancelable@npm:1.1.0" @@ -28178,13 +30283,6 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^0.2.1": - version: 0.2.1 - resolution: "picocolors@npm:0.2.1" - checksum: 3b0f441f0062def0c0f39e87b898ae7461c3a16ffc9f974f320b44c799418cabff17780ee647fda42b856a1dc45897e2c62047e1b546d94d6d5c6962f45427b2 - languageName: node - linkType: hard - "picocolors@npm:^1.0.0": version: 1.0.0 resolution: "picocolors@npm:1.0.0" @@ -28192,6 +30290,13 @@ __metadata: languageName: node linkType: hard +"picocolors@npm:^1.1.1": + version: 1.1.1 + resolution: "picocolors@npm:1.1.1" + checksum: e1cf46bf84886c79055fdfa9dcb3e4711ad259949e3565154b004b260cd356c5d54b31a1437ce9782624bf766272fe6b0154f5f0c744fb7af5d454d2b60db045 + languageName: node + linkType: hard + "picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.3": version: 2.3.0 resolution: "picomatch@npm:2.3.0" @@ -28451,37 +30556,48 @@ __metadata: languageName: node linkType: hard -"postcss-calc@npm:^7.0.1": - version: 7.0.5 - resolution: "postcss-calc@npm:7.0.5" +"possible-typed-array-names@npm:^1.0.0": + version: 1.1.0 + resolution: "possible-typed-array-names@npm:1.1.0" + checksum: cfcd4f05264eee8fd184cd4897a17890561d1d473434b43ab66ad3673d9c9128981ec01e0cb1d65a52cd6b1eebfb2eae1e53e39b2e0eca86afc823ede7a4f41b + languageName: node + linkType: hard + +"postcss-calc@npm:^9.0.1": + version: 9.0.1 + resolution: "postcss-calc@npm:9.0.1" dependencies: - postcss: ^7.0.27 - postcss-selector-parser: ^6.0.2 - postcss-value-parser: ^4.0.2 - checksum: 03640d493fb0e557634ab23e5d1eb527b014fb491ac3e62b45e28f5a6ef57e25a209f82040ce54c40d5a1a7307597a55d3fa6e8cece0888261a66bc75e39a68b + postcss-selector-parser: ^6.0.11 + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.2.2 + checksum: 7327ed83bfec544ab8b3e38353baa72ff6d04378b856db4ad82dbd68ce0b73668867ef182b5d4025f9dd9aa9c64aacc50cd1bd9db8d8b51ccc4cb97866b9d72b languageName: node linkType: hard -"postcss-colormin@npm:^4.0.3": - version: 4.0.3 - resolution: "postcss-colormin@npm:4.0.3" +"postcss-colormin@npm:^6.1.0": + version: 6.1.0 + resolution: "postcss-colormin@npm:6.1.0" dependencies: - browserslist: ^4.0.0 - color: ^3.0.0 - has: ^1.0.0 - postcss: ^7.0.0 - postcss-value-parser: ^3.0.0 - checksum: 9b2eab73cd227cbf296f1a2a6466047f6c70b918c3844535531fd87f31d7878e1a8d81e8803ffe2ee8c3330ea5bec65e358a0e0f33defcd758975064e07fe928 + browserslist: ^4.23.0 + caniuse-api: ^3.0.0 + colord: ^2.9.3 + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4.31 + checksum: 55a1525de345d953bc7f32ecaa5ee6275ef0277c27d1f97ff06a1bd1a2fedf7f254e36dc1500621f1df20c25a6d2485a74a0b527d8ff74eb90726c76efe2ac8e languageName: node linkType: hard -"postcss-convert-values@npm:^4.0.1": - version: 4.0.1 - resolution: "postcss-convert-values@npm:4.0.1" +"postcss-convert-values@npm:^6.1.0": + version: 6.1.0 + resolution: "postcss-convert-values@npm:6.1.0" dependencies: - postcss: ^7.0.0 - postcss-value-parser: ^3.0.0 - checksum: 71cac73f5befeb8bc16274e2aaabe1b8e0cb42a8b8641dc2aa61b1c502697b872a682c36f370cce325553bbfc859c38f2b064fae6f6469b1cada79e733559261 + browserslist: ^4.23.0 + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4.31 + checksum: 43e9f66af9bdec3c76695f9dde36885abc01f662c370c490b45d895459caab2c5792f906f3ddad107129133e41485a65634da7f699eef916a636e47f6a37a299 languageName: node linkType: hard @@ -28498,51 +30614,39 @@ __metadata: languageName: node linkType: hard -"postcss-discard-comments@npm:^4.0.2": - version: 4.0.2 - resolution: "postcss-discard-comments@npm:4.0.2" - dependencies: - postcss: ^7.0.0 - checksum: b087d47649160b7c6236aba028d27f1796a0dcb21e9ffd0da62271171fc31b7f150ee6c7a24fa97e3f5cd1af92e0dc41cb2e2680a175da53f1e536c441bda56a - languageName: node - linkType: hard - -"postcss-discard-duplicates@npm:^4.0.2": - version: 4.0.2 - resolution: "postcss-discard-duplicates@npm:4.0.2" - dependencies: - postcss: ^7.0.0 - checksum: bd83647a8e5ea34b0cfe563d0c1410a0c9e742011aa67955709c5ecd2d2bb03b7016053781e975e4c802127d2f9a0cd9c22f1f2783b9d7b1c35487d60f7ea540 +"postcss-discard-comments@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-discard-comments@npm:6.0.2" + peerDependencies: + postcss: ^8.4.31 + checksum: c1731ccc8d1e3d910412a61395988d3033365e6532d9e5432ad7c74add8c9dcb0af0c03d4e901bf0d2b59ea4e7297a0c77a547ff2ed1b1cc065559cc0de43b4e languageName: node linkType: hard -"postcss-discard-empty@npm:^4.0.1": - version: 4.0.1 - resolution: "postcss-discard-empty@npm:4.0.1" - dependencies: - postcss: ^7.0.0 - checksum: 529b177bd2417fa5c8887891369b4538b858d767461192974a796814265794e08e0e624a9f4c566ed9f841af3faddb7e7a9c05c45cbbe2fb1f092f65bd227f5c +"postcss-discard-duplicates@npm:^6.0.3": + version: 6.0.3 + resolution: "postcss-discard-duplicates@npm:6.0.3" + peerDependencies: + postcss: ^8.4.31 + checksum: 308e3fb84c35e4703532de1efa5d6e8444cc5f167d0e40f42d7ea3fa3a37d9d636fd10729847d078e0c303eee16f8548d14b6f88a3fce4e38a2b452648465175 languageName: node linkType: hard -"postcss-discard-overridden@npm:^4.0.1": - version: 4.0.1 - resolution: "postcss-discard-overridden@npm:4.0.1" - dependencies: - postcss: ^7.0.0 - checksum: b34d8cf58e4d13d99a3a9459f4833f1248ca897316bbb927375590feba35c24a0304084a6174a7bf3fe4ba3d5e5e9baf15ea938e7e5744e56915fa7ef6d91ee0 +"postcss-discard-empty@npm:^6.0.3": + version: 6.0.3 + resolution: "postcss-discard-empty@npm:6.0.3" + peerDependencies: + postcss: ^8.4.31 + checksum: bad305572faa066026a295faab37e718cee096589ab827b19c990c55620b2b2a1ce9f0145212651737a66086db01b2676c1927bbb8408c5f9cb42686d5959f00 languageName: node linkType: hard -"postcss-import@npm:^12.0.0": - version: 12.0.1 - resolution: "postcss-import@npm:12.0.1" - dependencies: - postcss: ^7.0.1 - postcss-value-parser: ^3.2.3 - read-cache: ^1.0.0 - resolve: ^1.1.7 - checksum: f891e16ace33337627d64a2b37a1c285f06aef6aa9d780768db96b7c509a649e8fa7f686768f9b96d42ff364f8a4c0d06c9e850d83bd00cbe625abdbf9fa046f +"postcss-discard-overridden@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-discard-overridden@npm:6.0.2" + peerDependencies: + postcss: ^8.4.31 + checksum: a38e0fe7a36f83cb9b73c1ba9ee2a48cf93c69ec0ea5753935824ffb71e958e58ae0393171c0f3d0014a397469d09bbb0d56bb5ab80f0280722967e2e273aebb languageName: node linkType: hard @@ -28559,16 +30663,6 @@ __metadata: languageName: node linkType: hard -"postcss-js@npm:^2.0.3": - version: 2.0.3 - resolution: "postcss-js@npm:2.0.3" - dependencies: - camelcase-css: ^2.0.1 - postcss: ^7.0.18 - checksum: ce794a627f9b8e4eabb9c8670eeacdc4b1b4b40665ba78d353830b31616eb7eecd129d76ccd82a5c958baeb9ff3b93fc97403064689fc3f33188051aa0aec2c4 - languageName: node - linkType: hard - "postcss-js@npm:^4.0.0": version: 4.0.1 resolution: "postcss-js@npm:4.0.1" @@ -28580,16 +30674,6 @@ __metadata: languageName: node linkType: hard -"postcss-load-config@npm:^2.0.0": - version: 2.1.2 - resolution: "postcss-load-config@npm:2.1.2" - dependencies: - cosmiconfig: ^5.0.0 - import-cwd: ^2.0.0 - checksum: 2e6d3a499512a03c19b0090f4143861612d613511d57122879d9fd545558d2a9fcbe85a2b0faf2ec32bbce0e62d22d2b544d91cbc4d4dfb3f22f841f8271fbc6 - languageName: node - linkType: hard - "postcss-load-config@npm:^3.1.4": version: 3.1.4 resolution: "postcss-load-config@npm:3.1.4" @@ -28608,102 +30692,107 @@ __metadata: languageName: node linkType: hard -"postcss-loader@npm:^3.0.0": - version: 3.0.0 - resolution: "postcss-loader@npm:3.0.0" +"postcss-loader@npm:^4.3.0": + version: 4.3.0 + resolution: "postcss-loader@npm:4.3.0" dependencies: - loader-utils: ^1.1.0 - postcss: ^7.0.0 - postcss-load-config: ^2.0.0 - schema-utils: ^1.0.0 - checksum: a6a922cbcc225ef57fb88c8248f91195869cd11e0d2b0b0fe84bc89a3074437d592d79a9fc39e50218677b7ba3a41b0e1c7e8f9666e59d41a196d7ab022c5805 + cosmiconfig: ^7.0.0 + klona: ^2.0.4 + loader-utils: ^2.0.0 + schema-utils: ^3.0.0 + semver: ^7.3.4 + peerDependencies: + postcss: ^7.0.0 || ^8.0.1 + webpack: ^4.0.0 || ^5.0.0 + checksum: b8ba29789d48512c7ce10e9391b1e1512a4b8f8b4063ebff0f9ebdd0a3a01e433ccfa0d2db6dbdd63b126acf7692330f0773bef75e78d53f38eba556ca5f2aee languageName: node linkType: hard -"postcss-merge-longhand@npm:^4.0.11": - version: 4.0.11 - resolution: "postcss-merge-longhand@npm:4.0.11" +"postcss-merge-longhand@npm:^6.0.5": + version: 6.0.5 + resolution: "postcss-merge-longhand@npm:6.0.5" dependencies: - css-color-names: 0.0.4 - postcss: ^7.0.0 - postcss-value-parser: ^3.0.0 - stylehacks: ^4.0.0 - checksum: 45082b492d4d771c1607707d04dbcaece85a100011109886af9460a7868720de1121e290a6442360e2668db510edef579194197d1b534e9fb6c8df7a6cb86a4d + postcss-value-parser: ^4.2.0 + stylehacks: ^6.1.1 + peerDependencies: + postcss: ^8.4.31 + checksum: 9ae5acf47dc0c1f494684ae55672d55bba7f5ee11c9c0f266aabd7c798e9f7394c6096363cd95685fd21ef088740389121a317772cf523ca22c915009bca2617 languageName: node linkType: hard -"postcss-merge-rules@npm:^4.0.3": - version: 4.0.3 - resolution: "postcss-merge-rules@npm:4.0.3" +"postcss-merge-rules@npm:^6.1.1": + version: 6.1.1 + resolution: "postcss-merge-rules@npm:6.1.1" dependencies: - browserslist: ^4.0.0 + browserslist: ^4.23.0 caniuse-api: ^3.0.0 - cssnano-util-same-parent: ^4.0.0 - postcss: ^7.0.0 - postcss-selector-parser: ^3.0.0 - vendors: ^1.0.0 - checksum: ed0f3880e1076e5b2a08e4cff35b50dc7dfbd337e6ba16a0ca157e28268cfa1d6c6d821e902d319757f32a7d36f944cad51be76f8b34858d1d7a637e7b585919 + cssnano-utils: ^4.0.2 + postcss-selector-parser: ^6.0.16 + peerDependencies: + postcss: ^8.4.31 + checksum: 43f60a1c88806491cf752ae7871676de0e7a2a9d6d2fc6bc894068cc35a910a63d30f7c7d79545e0926c8b3a9ec583e5e8357203c40b5bad5ff58133b0c900f6 languageName: node linkType: hard -"postcss-minify-font-values@npm:^4.0.2": - version: 4.0.2 - resolution: "postcss-minify-font-values@npm:4.0.2" +"postcss-minify-font-values@npm:^6.1.0": + version: 6.1.0 + resolution: "postcss-minify-font-values@npm:6.1.0" dependencies: - postcss: ^7.0.0 - postcss-value-parser: ^3.0.0 - checksum: add296b3bc88501283d65b54ad83552f47c98dd403740a70d8dfeef6d30a21d4a1f40191ffef1029a9474e9580a73e84ef644e99ede76c5a2474579b583f4b34 + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4.31 + checksum: 985e4dd2f89220a4442a822aad7dff016ab58a9dbb7bbca9d01c2d07d5a1e7d8c02e1c6e836abb4c9b4e825b4b80d99ee1f5899e74bf0d969095037738e6e452 languageName: node linkType: hard -"postcss-minify-gradients@npm:^4.0.2": - version: 4.0.2 - resolution: "postcss-minify-gradients@npm:4.0.2" +"postcss-minify-gradients@npm:^6.0.3": + version: 6.0.3 + resolution: "postcss-minify-gradients@npm:6.0.3" dependencies: - cssnano-util-get-arguments: ^4.0.0 - is-color-stop: ^1.0.0 - postcss: ^7.0.0 - postcss-value-parser: ^3.0.0 - checksum: b83de019cc392192d64182fa6f609383904ef69013d71cda5d06fadab92b4daa73f5be0d0254c5eb0805405e5e1b9c44e49ca6bc629c4c7a24a8164a30b40d46 + colord: ^2.9.3 + cssnano-utils: ^4.0.2 + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4.31 + checksum: 89b95088c3830f829f6d4636d1be4d4f13300bf9f1577c48c25169c81e11ec0026760b9abb32112b95d2c622f09d3b737f4d2975a7842927ccb567e1002ef7b3 languageName: node linkType: hard -"postcss-minify-params@npm:^4.0.2": - version: 4.0.2 - resolution: "postcss-minify-params@npm:4.0.2" +"postcss-minify-params@npm:^6.1.0": + version: 6.1.0 + resolution: "postcss-minify-params@npm:6.1.0" dependencies: - alphanum-sort: ^1.0.0 - browserslist: ^4.0.0 - cssnano-util-get-arguments: ^4.0.0 - postcss: ^7.0.0 - postcss-value-parser: ^3.0.0 - uniqs: ^2.0.0 - checksum: 15e7f196b3408ab3f55f1a7c9fa8aeea7949fdd02be28af232dd2e47bb7722e0e0a416d6b2c4550ba333a485b775da1bc35c19c9be7b6de855166d2e85d7b28f + browserslist: ^4.23.0 + cssnano-utils: ^4.0.2 + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4.31 + checksum: 1e1cc3057d9bcc532c70e40628e96e3aea0081d8072dffe983a270a8cd59c03ac585e57d036b70e43d4ee725f274a05a6a8efac5a715f448284e115c13f82a46 languageName: node linkType: hard -"postcss-minify-selectors@npm:^4.0.2": - version: 4.0.2 - resolution: "postcss-minify-selectors@npm:4.0.2" +"postcss-minify-selectors@npm:^6.0.4": + version: 6.0.4 + resolution: "postcss-minify-selectors@npm:6.0.4" dependencies: - alphanum-sort: ^1.0.0 - has: ^1.0.0 - postcss: ^7.0.0 - postcss-selector-parser: ^3.0.0 - checksum: a214809b620e50296417838804c3978d5f0a5ddfd48916780d77c1e0348c9ed0baa4b1f3905511b0f06b77340b5378088cc3188517c0848e8b7a53a71ef36c2b + postcss-selector-parser: ^6.0.16 + peerDependencies: + postcss: ^8.4.31 + checksum: 150221a84422ca7627c67ee691ee51e0fe2c3583c8108801e9fc93d3be8b538c2eb04fcfdc908270d7eeaeaf01594a20b81311690a873efccb8a23aeafe1c354 languageName: node linkType: hard -"postcss-mixins@npm:^6.2.0": - version: 6.2.3 - resolution: "postcss-mixins@npm:6.2.3" +"postcss-mixins@npm:^9.0.2": + version: 9.0.4 + resolution: "postcss-mixins@npm:9.0.4" dependencies: - globby: ^8.0.1 - postcss: ^7.0.21 - postcss-js: ^2.0.3 - postcss-simple-vars: ^5.0.2 - sugarss: ^2.0.0 - checksum: afaf5516c87ccbdd5b1e5d69141756580e7fdd6b9a0d13e4c0a99183eba1301837ca045aa82fbbba00f493ac30c3a0499049e16630c8e6436f5ee22884f47b48 + fast-glob: ^3.2.11 + postcss-js: ^4.0.0 + postcss-simple-vars: ^7.0.0 + sugarss: ^4.0.1 + peerDependencies: + postcss: ^8.2.14 + checksum: 71b850cf5ebf55f92668ce6b927f0859f4aec199c8425a660562c25d757cc13be86a0dec8f32a5757094356d8b49e724a109b3f2b97118e79958b11bbcd5d0e0 languageName: node linkType: hard @@ -28716,6 +30805,19 @@ __metadata: languageName: node linkType: hard +"postcss-modules-local-by-default@npm:^4.0.0": + version: 4.2.0 + resolution: "postcss-modules-local-by-default@npm:4.2.0" + dependencies: + icss-utils: ^5.0.0 + postcss-selector-parser: ^7.0.0 + postcss-value-parser: ^4.1.0 + peerDependencies: + postcss: ^8.1.0 + checksum: 720d145453f82ad5f1c1d0ff7386d64722f0812808e4132e573c1a49909745e109fcce3792a0b0cb18770dbeb3d9741867e81c698dc8353a18bc664b7d6d9533 + languageName: node + linkType: hard + "postcss-modules-local-by-default@npm:^4.0.3": version: 4.0.3 resolution: "postcss-modules-local-by-default@npm:4.0.3" @@ -28762,157 +30864,149 @@ __metadata: languageName: node linkType: hard -"postcss-nesting@npm:^7.0.0": - version: 7.0.1 - resolution: "postcss-nesting@npm:7.0.1" +"postcss-nesting@npm:^13.0.0": + version: 13.0.2 + resolution: "postcss-nesting@npm:13.0.2" dependencies: - postcss: ^7.0.2 - checksum: 4056be95759e8b25477f19aff7202b57dd27eeef41d31f7ca14e4c87d16ffb40e4db3f518fc85bd28b20e183f5e5399b56b52fcc79affd556e13a98bbc678169 + "@csstools/selector-resolve-nested": ^3.1.0 + "@csstools/selector-specificity": ^5.0.0 + postcss-selector-parser: ^7.0.0 + peerDependencies: + postcss: ^8.4 + checksum: fce488a2e77d9a8183a4e014caf047e41cb2422c07de1d49a092734fc90feeb8ced21090e3e284cfb2956afdba73e4a3547065ede228b209003bac5e1de62f0a languageName: node linkType: hard -"postcss-normalize-charset@npm:^4.0.1": - version: 4.0.1 - resolution: "postcss-normalize-charset@npm:4.0.1" - dependencies: - postcss: ^7.0.0 - checksum: f233f48d61eb005da217e5bfa58f4143165cb525ceea2de4fd88e4172a33712e8b63258ffa089c867875a498c408f293a380ea9e6f40076de550d8053f50e5bc +"postcss-normalize-charset@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-charset@npm:6.0.2" + peerDependencies: + postcss: ^8.4.31 + checksum: 5b8aeb17d61578a8656571cd5d5eefa8d4ee7126a99a41fdd322078002a06f2ae96f649197b9c01067a5f3e38a2e4b03e0e3fda5a0ec9e3d7ad056211ce86156 languageName: node linkType: hard -"postcss-normalize-display-values@npm:^4.0.2": - version: 4.0.2 - resolution: "postcss-normalize-display-values@npm:4.0.2" +"postcss-normalize-display-values@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-display-values@npm:6.0.2" dependencies: - cssnano-util-get-match: ^4.0.0 - postcss: ^7.0.0 - postcss-value-parser: ^3.0.0 - checksum: c5b857ca05f30a3efc6211cdaa5c9306f3eb0dbac141047d451a418d2bfd3e54be0bd4481d61c640096152d3078881a8dc3dec61913ff7f01ab4fc6df1a14732 + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4.31 + checksum: da30a9394b0e4a269ccad8d240693a6cd564bcc60e24db67caee00f70ddfbc070ad76faed64c32e6eec9ed02e92565488b7879d4fd6c40d877c290eadbb0bb28 languageName: node linkType: hard -"postcss-normalize-positions@npm:^4.0.2": - version: 4.0.2 - resolution: "postcss-normalize-positions@npm:4.0.2" +"postcss-normalize-positions@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-positions@npm:6.0.2" dependencies: - cssnano-util-get-arguments: ^4.0.0 - has: ^1.0.0 - postcss: ^7.0.0 - postcss-value-parser: ^3.0.0 - checksum: 291612d0879e6913010937f1193ab56ae1cfd8a274665330ccbedbe72f59c36db3f688b0a3faa4c6689cfd03dff0c27702c6acfce9b1f697a022bfcee3cd4fc4 + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4.31 + checksum: 44fb77583fae4d71b76e38226cf770570876bcf5af6940dc9aeac7a7e2252896b361e0249044766cff8dad445f925378f06a005d6541597573c20e599a62b516 languageName: node linkType: hard -"postcss-normalize-repeat-style@npm:^4.0.2": - version: 4.0.2 - resolution: "postcss-normalize-repeat-style@npm:4.0.2" +"postcss-normalize-repeat-style@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-repeat-style@npm:6.0.2" dependencies: - cssnano-util-get-arguments: ^4.0.0 - cssnano-util-get-match: ^4.0.0 - postcss: ^7.0.0 - postcss-value-parser: ^3.0.0 - checksum: 2160b2a6fe4f9671ad5d044755f0e04cfb5f255db607505fd4c74e7c806315c9dca914e74bb02f5f768de7b70939359d05c3f9b23ae8f72551d8fdeabf79a1fb + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4.31 + checksum: bebdac63bec6777ead3e265fc12527b261cf8d0da1b7f0abb12bda86fd53b7058e4afe392210ac74dac012e413bb1c2a46a1138c89f82b8bf70b81711f620f8c languageName: node linkType: hard -"postcss-normalize-string@npm:^4.0.2": - version: 4.0.2 - resolution: "postcss-normalize-string@npm:4.0.2" +"postcss-normalize-string@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-string@npm:6.0.2" dependencies: - has: ^1.0.0 - postcss: ^7.0.0 - postcss-value-parser: ^3.0.0 - checksum: 9d40753ceb4f7854ed690ecd5fe4ea142280b14441dd11e188e573e58af93df293efdc77311f1c599431df785a3bb614dfe4bdacc3081ee3fe8c95916c849b2f + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4.31 + checksum: 5e8e253c528b542accafc142846fb33643c342a787c86e5b68c6287c7d8f63c5ae7d4d3fc28e3daf80821cc26a91add135e58bdd62ff9c735fca65d994898c7d languageName: node linkType: hard -"postcss-normalize-timing-functions@npm:^4.0.2": - version: 4.0.2 - resolution: "postcss-normalize-timing-functions@npm:4.0.2" +"postcss-normalize-timing-functions@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-timing-functions@npm:6.0.2" dependencies: - cssnano-util-get-match: ^4.0.0 - postcss: ^7.0.0 - postcss-value-parser: ^3.0.0 - checksum: 8dfd711f5cdb49b823a92d1cd56d40f66f3686e257804495ef59d5d7f71815b6d19412a1ff25d40971bf6e146b1fa0517a6cc1a4c286b36c5cee6ed08a1952db + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4.31 + checksum: 1970f5aad04be11f99d51c59e27debb6fd7b49d0fa4a8879062b42c82113f8e520a284448727add3b54de85deefb8bd5fe554f618406586e9ad8fc9d060609f1 languageName: node linkType: hard -"postcss-normalize-unicode@npm:^4.0.1": - version: 4.0.1 - resolution: "postcss-normalize-unicode@npm:4.0.1" +"postcss-normalize-unicode@npm:^6.1.0": + version: 6.1.0 + resolution: "postcss-normalize-unicode@npm:6.1.0" dependencies: - browserslist: ^4.0.0 - postcss: ^7.0.0 - postcss-value-parser: ^3.0.0 - checksum: 2b1da17815f8402651a72012fd385b5111e84002baf98b649e0c1fc91298b65bb0e431664f6df8a99b23217259ecec242b169c0f18bf26e727af02eaf475fb07 + browserslist: ^4.23.0 + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4.31 + checksum: 69ef35d06242061f0c504c128b83752e0f8daa30ebb26734de7d090460910be0b2efd8b17b1d64c3c85b95831a041faad9ad0aaba80e239406a79cfad3d63568 languageName: node linkType: hard -"postcss-normalize-url@npm:^4.0.1": - version: 4.0.1 - resolution: "postcss-normalize-url@npm:4.0.1" +"postcss-normalize-url@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-url@npm:6.0.2" dependencies: - is-absolute-url: ^2.0.0 - normalize-url: ^3.0.0 - postcss: ^7.0.0 - postcss-value-parser: ^3.0.0 - checksum: fcaab832d8b773568197b41406517a9e5fc7704f2fac7185bd0e13b19961e1ce9f1c762e4ffa470de7baa6a82ae8ae5ccf6b1bbeec6e95216d22ce6ab514fe04 + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4.31 + checksum: bef51a18bbfee4fbf0381fec3c91e6c0dace36fca053bbd5f228e653d2732b6df3985525d79c4f7fc89f840ed07eb6d226e9d7503ecdc6f16d6d80cacae9df33 languageName: node linkType: hard -"postcss-normalize-whitespace@npm:^4.0.2": - version: 4.0.2 - resolution: "postcss-normalize-whitespace@npm:4.0.2" +"postcss-normalize-whitespace@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-whitespace@npm:6.0.2" dependencies: - postcss: ^7.0.0 - postcss-value-parser: ^3.0.0 - checksum: 378a6eadb09ccc5ca2289e8daf98ce7366ae53342c4df7898ef5fae68138884d6c1241493531635458351b2805218bf55ceecae0fd289e5696ab15c78966abbb + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4.31 + checksum: 6081eb3a4b305749eec02c00a95c2d236336a77ee636bb1d939f18d5dfa5ba82b7cf7fa072e83f9133d0bc984276596af3fe468bdd67c742ce69e9c63dbc218d languageName: node linkType: hard -"postcss-ordered-values@npm:^4.1.2": - version: 4.1.2 - resolution: "postcss-ordered-values@npm:4.1.2" +"postcss-ordered-values@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-ordered-values@npm:6.0.2" dependencies: - cssnano-util-get-arguments: ^4.0.0 - postcss: ^7.0.0 - postcss-value-parser: ^3.0.0 - checksum: 4a6f6a427a0165e1fa4f04dbe53a88708c73ea23e5b23ce312366ca8d85d83af450154a54f0e5df6c5712f945c180b6a364c3682dc995940b93228bb26658a96 + cssnano-utils: ^4.0.2 + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4.31 + checksum: c3d96177b4ffa43754e835e30c40043cc75ab1e95eb6c55ac8723eb48c13a12e986250e63d96619bbbd1a098876a1c0c1b3b7a8e1de1108a009cf7aa0beac834 languageName: node linkType: hard -"postcss-reduce-initial@npm:^4.0.3": - version: 4.0.3 - resolution: "postcss-reduce-initial@npm:4.0.3" +"postcss-reduce-initial@npm:^6.1.0": + version: 6.1.0 + resolution: "postcss-reduce-initial@npm:6.1.0" dependencies: - browserslist: ^4.0.0 + browserslist: ^4.23.0 caniuse-api: ^3.0.0 - has: ^1.0.0 - postcss: ^7.0.0 - checksum: 5ad1a955cb20f5b1792ff8cc35894621edc23ee77397cc7e9692d269882fb4451655633947e0407fe20bd127d09d0b7e693034c64417bf8bf1034a83c6e71668 - languageName: node - linkType: hard - -"postcss-reduce-transforms@npm:^4.0.2": - version: 4.0.2 - resolution: "postcss-reduce-transforms@npm:4.0.2" - dependencies: - cssnano-util-get-match: ^4.0.0 - has: ^1.0.0 - postcss: ^7.0.0 - postcss-value-parser: ^3.0.0 - checksum: e6a351d5da7ecf276ddda350635b15bce8e14af08aee1c8a0e8d9c2ab2631eab33b06f3c2f31c6f9c76eedbfc23f356d86da3539e011cde3e335a2cac9d91dc1 + peerDependencies: + postcss: ^8.4.31 + checksum: 39e4034ffbf62a041b66944c5cebc4b17f656e76b97568f7f6230b0b886479e5c75b02ae4ba48c472cb0bde47489f9ed1fe6110ae8cff0d7b7165f53c2d64a12 languageName: node linkType: hard -"postcss-selector-parser@npm:^3.0.0": - version: 3.1.2 - resolution: "postcss-selector-parser@npm:3.1.2" +"postcss-reduce-transforms@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-reduce-transforms@npm:6.0.2" dependencies: - dot-prop: ^5.2.0 - indexes-of: ^1.0.1 - uniq: ^1.0.1 - checksum: 85b754bf3b5f671cddd75a199589e5b03da114ec119aa4628ab7f35f76134b25296d18a68f745e39780c379d66d3919ae7a1b6129aeec5049cedb9ba4c660803 + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.4.31 + checksum: c424cc554eb5d253b7687b64925a13fc16759f058795d223854f5a20d9bca641b5f25d0559d03287e63f07a4629c24ac78156adcf604483fcad3c51721da0a08 languageName: node linkType: hard @@ -28936,6 +31030,16 @@ __metadata: languageName: node linkType: hard +"postcss-selector-parser@npm:^6.0.16": + version: 6.1.2 + resolution: "postcss-selector-parser@npm:6.1.2" + dependencies: + cssesc: ^3.0.0 + util-deprecate: ^1.0.2 + checksum: ce9440fc42a5419d103f4c7c1847cb75488f3ac9cbe81093b408ee9701193a509f664b4d10a2b4d82c694ee7495e022f8f482d254f92b7ffd9ed9dea696c6f84 + languageName: node + linkType: hard + "postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4": version: 6.0.6 resolution: "postcss-selector-parser@npm:6.0.6" @@ -28946,41 +31050,45 @@ __metadata: languageName: node linkType: hard -"postcss-simple-vars@npm:^5.0.2": - version: 5.0.2 - resolution: "postcss-simple-vars@npm:5.0.2" +"postcss-selector-parser@npm:^7.0.0": + version: 7.1.1 + resolution: "postcss-selector-parser@npm:7.1.1" dependencies: - postcss: ^7.0.14 - checksum: 6d9e72bd9646b4080393f1819e47158df72bbdcbfa9d3a949c247ee8756a3f3d72a36f18a9033f2d67723a05f914f921e22fadcf821556c3598a65d7752e12e6 + cssesc: ^3.0.0 + util-deprecate: ^1.0.2 + checksum: 36d71bd8e1c9db9c3d4ecefd3f8c30aace141a3a1a266473bc9a1b7a0c1c2dfbaef2ac20cc8ea287b17131cbb3690c1c0fe7a4d9272db9f09b136da2413bc3ea languageName: node linkType: hard -"postcss-svgo@npm:^4.0.3": - version: 4.0.3 - resolution: "postcss-svgo@npm:4.0.3" - dependencies: - postcss: ^7.0.0 - postcss-value-parser: ^3.0.0 - svgo: ^1.0.0 - checksum: 6f5264241193ca3ba748fdf43c88ef692948d2ae38787398dc90089061fed884064ec14ee244fce07f19c419d1b058c77e135407d0932b09e93e528581ce3e10 +"postcss-simple-vars@npm:^7.0.0": + version: 7.0.1 + resolution: "postcss-simple-vars@npm:7.0.1" + peerDependencies: + postcss: ^8.2.1 + checksum: cfe3b481bdbe83726e136a451a22e8e8a019822aada2041c21898661d3cf32f4b527ffa9b289e018d23678cfac02582d31204296a2d1d0a0f3a5fd974ff34678 languageName: node linkType: hard -"postcss-unique-selectors@npm:^4.0.1": - version: 4.0.1 - resolution: "postcss-unique-selectors@npm:4.0.1" +"postcss-svgo@npm:^6.0.3": + version: 6.0.3 + resolution: "postcss-svgo@npm:6.0.3" dependencies: - alphanum-sort: ^1.0.0 - postcss: ^7.0.0 - uniqs: ^2.0.0 - checksum: 272eb1fa17d6ea513b5f4d2f694ef30fa690795ce388aef7bf3967fd3bcec7a9a3c8da380e74961ded8d98253a6ed18fb380b29da00e2fe03e74813e7765ea71 + postcss-value-parser: ^4.2.0 + svgo: ^3.2.0 + peerDependencies: + postcss: ^8.4.31 + checksum: 1a7d1c8dea555884a7791e28ec2c22ea92331731067584ff5a23042a0e615f88fefde04e1140f11c262a728ef9fab6851423b40b9c47f9ae05353bd3c0ff051a languageName: node linkType: hard -"postcss-value-parser@npm:^3.0.0, postcss-value-parser@npm:^3.2.3": - version: 3.3.1 - resolution: "postcss-value-parser@npm:3.3.1" - checksum: 62cd26e1cdbcf2dcc6bcedf3d9b409c9027bc57a367ae20d31dd99da4e206f730689471fd70a2abe866332af83f54dc1fa444c589e2381bf7f8054c46209ce16 +"postcss-unique-selectors@npm:^6.0.4": + version: 6.0.4 + resolution: "postcss-unique-selectors@npm:6.0.4" + dependencies: + postcss-selector-parser: ^6.0.16 + peerDependencies: + postcss: ^8.4.31 + checksum: b09df9943b4e858e88b30f3d279ce867a0490df806f1f947d286b0a4e95ba923f1229c385e5bf365f4f124f1edccda41ec18ccad4ba8798d829279d6dc971203 languageName: node linkType: hard @@ -29009,16 +31117,6 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^7.0.0, postcss@npm:^7.0.1, postcss@npm:^7.0.14, postcss@npm:^7.0.18, postcss@npm:^7.0.2, postcss@npm:^7.0.21, postcss@npm:^7.0.27, postcss@npm:^7.0.36": - version: 7.0.39 - resolution: "postcss@npm:7.0.39" - dependencies: - picocolors: ^0.2.1 - source-map: ^0.6.1 - checksum: 4ac793f506c23259189064bdc921260d869a115a82b5e713973c5af8e94fbb5721a5cc3e1e26840500d7e1f1fa42a209747c5b1a151918a9bc11f0d7ed9048e3 - languageName: node - linkType: hard - "postcss@npm:^8.0.9": version: 8.4.29 resolution: "postcss@npm:8.4.29" @@ -29030,6 +31128,17 @@ __metadata: languageName: node linkType: hard +"postcss@npm:^8.2.15, postcss@npm:^8.4.12": + version: 8.5.6 + resolution: "postcss@npm:8.5.6" + dependencies: + nanoid: ^3.3.11 + picocolors: ^1.1.1 + source-map-js: ^1.2.1 + checksum: 20f3b5d673ffeec2b28d65436756d31ee33f65b0a8bedb3d32f556fbd5973be38c3a7fb5b959a5236c60a5db7b91b0a6b14ffaac0d717dce1b903b964ee1c1bb + languageName: node + linkType: hard + "postcss@npm:^8.4.21": version: 8.4.24 resolution: "postcss@npm:8.4.24" @@ -29308,6 +31417,13 @@ __metadata: languageName: node linkType: hard +"property-information@npm:^7.0.0": + version: 7.1.0 + resolution: "property-information@npm:7.1.0" + checksum: 3875161d204bac89d75181f6d3ebc3ecaeb2699b4e2ecfcf5452201d7cdd275168c6742d7ff8cec5ab0c342fae72369ac705e1f8e9680a9acd911692e80dfb88 + languageName: node + linkType: hard + "proto-list@npm:~1.2.1": version: 1.2.4 resolution: "proto-list@npm:1.2.4" @@ -29508,13 +31624,6 @@ __metadata: languageName: node linkType: hard -"q@npm:^1.1.2": - version: 1.5.1 - resolution: "q@npm:1.5.1" - checksum: 147baa93c805bc1200ed698bdf9c72e9e42c05f96d007e33a558b5fdfd63e5ea130e99313f28efc1783e90e6bdb4e48b67a36fcc026b7b09202437ae88a1fb12 - languageName: node - linkType: hard - "qrcode-terminal@npm:^0.12.0": version: 0.12.0 resolution: "qrcode-terminal@npm:0.12.0" @@ -30260,6 +32369,15 @@ __metadata: languageName: node linkType: hard +"readdirp@npm:~3.2.0": + version: 3.2.0 + resolution: "readdirp@npm:3.2.0" + dependencies: + picomatch: ^2.0.4 + checksum: 0456a4465a13eb5eaf40f0e0836b1bc6b9ebe479b48ba6f63a738b127a1990fb7b38f3ec4b4b6052f9230f976bc0558f12812347dc6b42ce4d548cfe82a9b6f3 + languageName: node + linkType: hard + "readdirp@npm:~3.6.0": version: 3.6.0 resolution: "readdirp@npm:3.6.0" @@ -30354,6 +32472,22 @@ __metadata: languageName: node linkType: hard +"reflect.getprototypeof@npm:^1.0.6, reflect.getprototypeof@npm:^1.0.9": + version: 1.0.10 + resolution: "reflect.getprototypeof@npm:1.0.10" + dependencies: + call-bind: ^1.0.8 + define-properties: ^1.2.1 + es-abstract: ^1.23.9 + es-errors: ^1.3.0 + es-object-atoms: ^1.0.0 + get-intrinsic: ^1.2.7 + get-proto: ^1.0.1 + which-builtin-type: ^1.2.1 + checksum: ccc5debeb66125e276ae73909cecb27e47c35d9bb79d9cc8d8d055f008c58010ab8cb401299786e505e4aab733a64cba9daf5f312a58e96a43df66adad221870 + languageName: node + linkType: hard + "regenerate-unicode-properties@npm:^10.1.0": version: 10.1.0 resolution: "regenerate-unicode-properties@npm:10.1.0" @@ -30442,6 +32576,20 @@ __metadata: languageName: node linkType: hard +"regexp.prototype.flags@npm:^1.5.4": + version: 1.5.4 + resolution: "regexp.prototype.flags@npm:1.5.4" + dependencies: + call-bind: ^1.0.8 + define-properties: ^1.2.1 + es-errors: ^1.3.0 + get-proto: ^1.0.1 + gopd: ^1.2.0 + set-function-name: ^2.0.2 + checksum: 18cb667e56cb328d2dda569d7f04e3ea78f2683135b866d606538cf7b1d4271f7f749f09608c877527799e6cf350e531368f3c7a20ccd1bb41048a48926bdeeb + languageName: node + linkType: hard + "regexpp@npm:^3.1.0, regexpp@npm:^3.2.0": version: 3.2.0 resolution: "regexpp@npm:3.2.0" @@ -30501,6 +32649,51 @@ __metadata: languageName: node linkType: hard +"rehype-dom-parse@npm:5.0.2": + version: 5.0.2 + resolution: "rehype-dom-parse@npm:5.0.2" + dependencies: + "@types/hast": ^3.0.0 + hast-util-from-dom: ^5.0.0 + unified: ^11.0.0 + checksum: a756f4734c1b72d4c0dda445fb681c4f8503c3e09d3d1a4326d94c86a9bf7811b2a7e37143c387eda8e109b2e43fbf308adf45efee23b2c778efc08400046ab5 + languageName: node + linkType: hard + +"rehype-dom-stringify@npm:4.0.2": + version: 4.0.2 + resolution: "rehype-dom-stringify@npm:4.0.2" + dependencies: + "@types/hast": ^3.0.0 + hast-util-to-dom: ^4.0.0 + unified: ^11.0.0 + checksum: 48664cc0a353fc0eb7d83089b0c1537d8028f5758784f90ec21039a743db64265dcc216c4e895bee667464be95c1fa765705037d1337d0235d18a6355500bab7 + languageName: node + linkType: hard + +"rehype-minify-whitespace@npm:^6.0.0": + version: 6.0.2 + resolution: "rehype-minify-whitespace@npm:6.0.2" + dependencies: + "@types/hast": ^3.0.0 + hast-util-minify-whitespace: ^1.0.0 + checksum: 3ebceb08af1ce08dab68860ecbf56dc804ede3200a4757e1681c967e8390cbf615e662862a92154c565c3841f847425fcc0fdce8ecd46696c58eb55facfce7f1 + languageName: node + linkType: hard + +"rehype-remark@npm:10.0.1": + version: 10.0.1 + resolution: "rehype-remark@npm:10.0.1" + dependencies: + "@types/hast": ^3.0.0 + "@types/mdast": ^4.0.0 + hast-util-to-mdast: ^10.0.0 + unified: ^11.0.0 + vfile: ^6.0.0 + checksum: 2b0441cf02dba8b72c4e3ddb473c69a45bb74e36e0e2179799c9648dc0b2427f45009bee57f665866a2e61eeaf0e700525168521455bcfa3948c0ddcf421414c + languageName: node + linkType: hard + "relateurl@npm:^0.2.7": version: 0.2.7 resolution: "relateurl@npm:0.2.7" @@ -30557,6 +32750,17 @@ __metadata: languageName: node linkType: hard +"remark-breaks@npm:4.0.0": + version: 4.0.0 + resolution: "remark-breaks@npm:4.0.0" + dependencies: + "@types/mdast": ^4.0.0 + mdast-util-newline-to-break: ^2.0.0 + unified: ^11.0.0 + checksum: 222883db314a2842fa0a5f59a571b66df722c6bdf284938a7463e892228820b72d6827b38b55de8f87577a50a1c4b7502573b0e6a403003815c210a18fd04a51 + languageName: node + linkType: hard + "remark-external-links@npm:^8.0.0": version: 8.0.0 resolution: "remark-external-links@npm:8.0.0" @@ -30570,6 +32774,20 @@ __metadata: languageName: node linkType: hard +"remark-gfm@npm:4.0.1": + version: 4.0.1 + resolution: "remark-gfm@npm:4.0.1" + dependencies: + "@types/mdast": ^4.0.0 + mdast-util-gfm: ^3.0.0 + micromark-extension-gfm: ^3.0.0 + remark-parse: ^11.0.0 + remark-stringify: ^11.0.0 + unified: ^11.0.0 + checksum: b278f51c4496f15ad868b72bf2eb2066c23a0892b5885544d3a4c233c964d44e51a0efe22d3fb33db4fbac92aefd51bb33453b8e73077b041a12b8269a02c17d + languageName: node + linkType: hard + "remark-gfm@npm:^3.0.1": version: 3.0.1 resolution: "remark-gfm@npm:3.0.1" @@ -30582,6 +32800,18 @@ __metadata: languageName: node linkType: hard +"remark-parse@npm:11.0.0, remark-parse@npm:^11.0.0": + version: 11.0.0 + resolution: "remark-parse@npm:11.0.0" + dependencies: + "@types/mdast": ^4.0.0 + mdast-util-from-markdown: ^2.0.0 + micromark-util-types: ^2.0.0 + unified: ^11.0.0 + checksum: d83d245290fa84bb04fb3e78111f09c74f7417e7c012a64dd8dc04fccc3699036d828fbd8eeec8944f774b6c30cc1d925c98f8c46495ebcee7c595496342ab7f + languageName: node + linkType: hard + "remark-parse@npm:^10.0.0": version: 10.0.1 resolution: "remark-parse@npm:10.0.1" @@ -30593,6 +32823,19 @@ __metadata: languageName: node linkType: hard +"remark-rehype@npm:11.1.2": + version: 11.1.2 + resolution: "remark-rehype@npm:11.1.2" + dependencies: + "@types/hast": ^3.0.0 + "@types/mdast": ^4.0.0 + mdast-util-to-hast: ^13.0.0 + unified: ^11.0.0 + vfile: ^6.0.0 + checksum: 6eab55cb3464ec01d8e002cc9fe02ae57f48162899693fd53b5ba553ac8699dae7b55fce9df7131a5981313b19b495d6fbfa98a9d6bd243e7485591364d9b5b3 + languageName: node + linkType: hard + "remark-rehype@npm:^9.0.0": version: 9.1.0 resolution: "remark-rehype@npm:9.1.0" @@ -30616,6 +32859,17 @@ __metadata: languageName: node linkType: hard +"remark-stringify@npm:11.0.0, remark-stringify@npm:^11.0.0": + version: 11.0.0 + resolution: "remark-stringify@npm:11.0.0" + dependencies: + "@types/mdast": ^4.0.0 + mdast-util-to-markdown: ^2.0.0 + unified: ^11.0.0 + checksum: 59e07460eb629d6c3b3c0f438b0b236e7e6858fd5ab770303078f5a556ec00354d9c7fb9ef6d5f745a4617ac7da1ab618b170fbb4dac120e183fecd9cc86bce6 + languageName: node + linkType: hard + "remedial@npm:^1.0.7": version: 1.0.8 resolution: "remedial@npm:1.0.8" @@ -30732,13 +32986,6 @@ __metadata: languageName: node linkType: hard -"resolve-from@npm:^3.0.0": - version: 3.0.0 - resolution: "resolve-from@npm:3.0.0" - checksum: fff9819254d2d62b57f74e5c2ca9c0bdd425ca47287c4d801bc15f947533148d858229ded7793b0f59e61e49e782fffd6722048add12996e1bd4333c29669062 - languageName: node - linkType: hard - "resolve-from@npm:^4.0.0": version: 4.0.0 resolution: "resolve-from@npm:4.0.0" @@ -30753,6 +33000,13 @@ __metadata: languageName: node linkType: hard +"resolve-pkg-maps@npm:^1.0.0": + version: 1.0.0 + resolution: "resolve-pkg-maps@npm:1.0.0" + checksum: 1012afc566b3fdb190a6309cc37ef3b2dcc35dff5fa6683a9d00cd25c3247edfbc4691b91078c97adc82a29b77a2660c30d791d65dab4fc78bfc473f60289977 + languageName: node + linkType: hard + "resolve-url@npm:^0.2.1": version: 0.2.1 resolution: "resolve-url@npm:0.2.1" @@ -30910,20 +33164,6 @@ __metadata: languageName: node linkType: hard -"rgb-regex@npm:^1.0.1": - version: 1.0.1 - resolution: "rgb-regex@npm:1.0.1" - checksum: b270ce8bc14782d2d21d3184c1e6c65b465476d8f03e72b93ef57c95710a452b2fe280e1d516c88873aec06efd7f71373e673f114b9d99f3a4f9a0393eb00126 - languageName: node - linkType: hard - -"rgba-regex@npm:^1.0.0": - version: 1.0.0 - resolution: "rgba-regex@npm:1.0.0" - checksum: 7f2cd271572700faea50753d82524cb2b98f17a5b9722965c7076f6cd674fe545f28145b7ef2cccabc9eca2475c793db16862cd5e7b3784a9f4b8d6496431057 - languageName: node - linkType: hard - "rimraf@npm:2, rimraf@npm:^2.6.1, rimraf@npm:^2.6.3": version: 2.7.1 resolution: "rimraf@npm:2.7.1" @@ -31058,6 +33298,19 @@ __metadata: languageName: node linkType: hard +"safe-array-concat@npm:^1.1.2, safe-array-concat@npm:^1.1.3": + version: 1.1.3 + resolution: "safe-array-concat@npm:1.1.3" + dependencies: + call-bind: ^1.0.8 + call-bound: ^1.0.2 + get-intrinsic: ^1.2.6 + has-symbols: ^1.1.0 + isarray: ^2.0.5 + checksum: 00f6a68140e67e813f3ad5e73e6dedcf3e42a9fa01f04d44b0d3f7b1f4b257af876832a9bfc82ac76f307e8a6cc652e3cf95876048a26cbec451847cf6ae3707 + languageName: node + linkType: hard + "safe-buffer@npm:5.1.1": version: 5.1.1 resolution: "safe-buffer@npm:5.1.1" @@ -31079,6 +33332,16 @@ __metadata: languageName: node linkType: hard +"safe-push-apply@npm:^1.0.0": + version: 1.0.0 + resolution: "safe-push-apply@npm:1.0.0" + dependencies: + es-errors: ^1.3.0 + isarray: ^2.0.5 + checksum: 8c11cbee6dc8ff5cc0f3d95eef7052e43494591384015902e4292aef4ae9e539908288520ed97179cee17d6ffb450fe5f05a46ce7a1749685f7524fd568ab5db + languageName: node + linkType: hard + "safe-regex-test@npm:^1.0.0": version: 1.0.0 resolution: "safe-regex-test@npm:1.0.0" @@ -31090,6 +33353,17 @@ __metadata: languageName: node linkType: hard +"safe-regex-test@npm:^1.1.0": + version: 1.1.0 + resolution: "safe-regex-test@npm:1.1.0" + dependencies: + call-bound: ^1.0.2 + es-errors: ^1.3.0 + is-regex: ^1.2.1 + checksum: 3c809abeb81977c9ed6c869c83aca6873ea0f3ab0f806b8edbba5582d51713f8a6e9757d24d2b4b088f563801475ea946c8e77e7713e8c65cdd02305b6caedab + languageName: node + linkType: hard + "safe-regex@npm:^1.1.0": version: 1.1.0 resolution: "safe-regex@npm:1.1.0" @@ -31113,13 +33387,6 @@ __metadata: languageName: node linkType: hard -"sax@npm:~1.2.4": - version: 1.2.4 - resolution: "sax@npm:1.2.4" - checksum: d3df7d32b897a2c2f28e941f732c71ba90e27c24f62ee918bd4d9a8cfb3553f2f81e5493c7f0be94a11c1911b643a9108f231dd6f60df3fa9586b5d2e3e9e1fe - languageName: node - linkType: hard - "saxes@npm:^5.0.1": version: 5.0.1 resolution: "saxes@npm:5.0.1" @@ -31148,18 +33415,7 @@ __metadata: languageName: node linkType: hard -"schema-utils@npm:^1.0.0": - version: 1.0.0 - resolution: "schema-utils@npm:1.0.0" - dependencies: - ajv: ^6.1.0 - ajv-errors: ^1.0.0 - ajv-keywords: ^3.1.0 - checksum: e8273b4f6eff9ddf4a4f4c11daf7b96b900237bf8859c86fa1e9b4fab416b72d7ea92468f8db89c18a3499a1070206e1c8a750c83b42d5325fc659cbb55eee88 - languageName: node - linkType: hard - -"schema-utils@npm:^2.6.5, schema-utils@npm:^2.6.6, schema-utils@npm:^2.7.0": +"schema-utils@npm:^2.6.5": version: 2.7.1 resolution: "schema-utils@npm:2.7.1" dependencies: @@ -31318,6 +33574,15 @@ __metadata: languageName: node linkType: hard +"semver@npm:^5.7.0": + version: 5.7.2 + resolution: "semver@npm:5.7.2" + bin: + semver: bin/semver + checksum: fb4ab5e0dd1c22ce0c937ea390b4a822147a9c53dbd2a9a0132f12fe382902beef4fbf12cf51bb955248d8d15874ce8cd89532569756384f994309825f10b686 + languageName: node + linkType: hard + "semver@npm:^6.0.0, semver@npm:^6.1.1, semver@npm:^6.1.2, semver@npm:^6.2.0, semver@npm:^6.3.0": version: 6.3.0 resolution: "semver@npm:6.3.0" @@ -31453,12 +33718,12 @@ __metadata: languageName: node linkType: hard -"serialize-javascript@npm:^4.0.0": - version: 4.0.0 - resolution: "serialize-javascript@npm:4.0.0" +"serialize-javascript@npm:^5.0.1": + version: 5.0.1 + resolution: "serialize-javascript@npm:5.0.1" dependencies: randombytes: ^2.1.0 - checksum: 3273b3394b951671fcf388726e9577021870dfbf85e742a1183fb2e91273e6101bdccea81ff230724f6659a7ee4cef924b0ff9baca32b79d9384ec37caf07302 + checksum: bb45a427690c3d2711e28499de0fbf25036af1e23c63c6a9237ed0aa572fd0941fcdefe50a2dccf26d9df8c8b86ae38659e19d8ba7afd3fbc1f1c7539a2a48d2 languageName: node linkType: hard @@ -31610,6 +33875,20 @@ __metadata: languageName: node linkType: hard +"set-function-length@npm:^1.2.2": + version: 1.2.2 + resolution: "set-function-length@npm:1.2.2" + dependencies: + define-data-property: ^1.1.4 + es-errors: ^1.3.0 + function-bind: ^1.1.2 + get-intrinsic: ^1.2.4 + gopd: ^1.0.1 + has-property-descriptors: ^1.0.2 + checksum: a8248bdacdf84cb0fab4637774d9fb3c7a8e6089866d04c817583ff48e14149c87044ce683d7f50759a8c50fb87c7a7e173535b06169c87ef76f5fb276dfff72 + languageName: node + linkType: hard + "set-function-name@npm:^2.0.0": version: 2.0.1 resolution: "set-function-name@npm:2.0.1" @@ -31621,6 +33900,29 @@ __metadata: languageName: node linkType: hard +"set-function-name@npm:^2.0.2": + version: 2.0.2 + resolution: "set-function-name@npm:2.0.2" + dependencies: + define-data-property: ^1.1.4 + es-errors: ^1.3.0 + functions-have-names: ^1.2.3 + has-property-descriptors: ^1.0.2 + checksum: d6229a71527fd0404399fc6227e0ff0652800362510822a291925c9d7b48a1ca1a468b11b281471c34cd5a2da0db4f5d7ff315a61d26655e77f6e971e6d0c80f + languageName: node + linkType: hard + +"set-proto@npm:^1.0.0": + version: 1.0.0 + resolution: "set-proto@npm:1.0.0" + dependencies: + dunder-proto: ^1.0.1 + es-errors: ^1.3.0 + es-object-atoms: ^1.0.0 + checksum: ec27cbbe334598547e99024403e96da32aca3e530583e4dba7f5db1c43cbc4affa9adfbd77c7b2c210b9b8b2e7b2e600bad2a6c44fd62e804d8233f96bbb62f4 + languageName: node + linkType: hard + "set-value@npm:^2.0.0, set-value@npm:^2.0.1": version: 2.0.1 resolution: "set-value@npm:2.0.1" @@ -31767,6 +34069,41 @@ __metadata: languageName: node linkType: hard +"side-channel-list@npm:^1.0.0": + version: 1.0.0 + resolution: "side-channel-list@npm:1.0.0" + dependencies: + es-errors: ^1.3.0 + object-inspect: ^1.13.3 + checksum: 603b928997abd21c5a5f02ae6b9cc36b72e3176ad6827fab0417ead74580cc4fb4d5c7d0a8a2ff4ead34d0f9e35701ed7a41853dac8a6d1a664fcce1a044f86f + languageName: node + linkType: hard + +"side-channel-map@npm:^1.0.1": + version: 1.0.1 + resolution: "side-channel-map@npm:1.0.1" + dependencies: + call-bound: ^1.0.2 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.5 + object-inspect: ^1.13.3 + checksum: 42501371cdf71f4ccbbc9c9e2eb00aaaab80a4c1c429d5e8da713fd4d39ef3b8d4a4b37ed4f275798a65260a551a7131fd87fe67e922dba4ac18586d6aab8b06 + languageName: node + linkType: hard + +"side-channel-weakmap@npm:^1.0.2": + version: 1.0.2 + resolution: "side-channel-weakmap@npm:1.0.2" + dependencies: + call-bound: ^1.0.2 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.5 + object-inspect: ^1.13.3 + side-channel-map: ^1.0.1 + checksum: a815c89bc78c5723c714ea1a77c938377ea710af20d4fb886d362b0d1f8ac73a17816a5f6640f354017d7e292a43da9c5e876c22145bac00b76cfb3468001736 + languageName: node + linkType: hard + "side-channel@npm:^1.0.4": version: 1.0.4 resolution: "side-channel@npm:1.0.4" @@ -31778,6 +34115,19 @@ __metadata: languageName: node linkType: hard +"side-channel@npm:^1.1.0": + version: 1.1.0 + resolution: "side-channel@npm:1.1.0" + dependencies: + es-errors: ^1.3.0 + object-inspect: ^1.13.3 + side-channel-list: ^1.0.0 + side-channel-map: ^1.0.1 + side-channel-weakmap: ^1.0.2 + checksum: bf73d6d6682034603eb8e99c63b50155017ed78a522d27c2acec0388a792c3ede3238b878b953a08157093b85d05797217d270b7666ba1f111345fbe933380ff + languageName: node + linkType: hard + "signal-exit@npm:^3.0.0, signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3": version: 3.0.6 resolution: "signal-exit@npm:3.0.6" @@ -31839,15 +34189,6 @@ __metadata: languageName: node linkType: hard -"simple-swizzle@npm:^0.2.2": - version: 0.2.2 - resolution: "simple-swizzle@npm:0.2.2" - dependencies: - is-arrayish: ^0.3.1 - checksum: a7f3f2ab5c76c4472d5c578df892e857323e452d9f392e1b5cf74b74db66e6294a1e1b8b390b519fa1b96b5b613f2a37db6cffef52c3f1f8f3c5ea64eb2d54c0 - languageName: node - linkType: hard - "simple-update-notifier@npm:^1.0.0, simple-update-notifier@npm:^1.0.7": version: 1.1.0 resolution: "simple-update-notifier@npm:1.1.0" @@ -31864,13 +34205,6 @@ __metadata: languageName: node linkType: hard -"slash@npm:^1.0.0": - version: 1.0.0 - resolution: "slash@npm:1.0.0" - checksum: 4b6e21b1fba6184a7e2efb1dd173f692d8a845584c1bbf9dc818ff86f5a52fc91b413008223d17cc684604ee8bb9263a420b1182027ad9762e35388434918860 - languageName: node - linkType: hard - "slash@npm:^2.0.0": version: 2.0.0 resolution: "slash@npm:2.0.0" @@ -32042,6 +34376,13 @@ __metadata: languageName: node linkType: hard +"source-map-js@npm:^1.0.1, source-map-js@npm:^1.2.1": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 4eb0cd997cdf228bc253bcaff9340afeb706176e64868ecd20efbe6efea931465f43955612346d6b7318789e5265bdc419bc7669c1cebe3db0eb255f57efa76b + languageName: node + linkType: hard + "source-map-js@npm:^1.0.2": version: 1.0.2 resolution: "source-map-js@npm:1.0.2" @@ -32082,7 +34423,7 @@ __metadata: languageName: node linkType: hard -"source-map-support@npm:^0.5.16, source-map-support@npm:^0.5.17, source-map-support@npm:^0.5.6, source-map-support@npm:~0.5.12, source-map-support@npm:~0.5.20": +"source-map-support@npm:^0.5.16, source-map-support@npm:^0.5.17, source-map-support@npm:^0.5.6, source-map-support@npm:~0.5.20": version: 0.5.21 resolution: "source-map-support@npm:0.5.21" dependencies: @@ -32312,13 +34653,6 @@ __metadata: languageName: node linkType: hard -"stable@npm:^0.1.8": - version: 0.1.8 - resolution: "stable@npm:0.1.8" - checksum: 2ff482bb100285d16dd75cd8f7c60ab652570e8952c0bfa91828a2b5f646a0ff533f14596ea4eabd48bb7f4aeea408dce8f8515812b975d958a4cc4fa6b9dfeb - languageName: node - linkType: hard - "stack-utils@npm:^2.0.3": version: 2.0.5 resolution: "stack-utils@npm:2.0.5" @@ -32391,6 +34725,16 @@ __metadata: languageName: node linkType: hard +"stop-iteration-iterator@npm:^1.1.0": + version: 1.1.0 + resolution: "stop-iteration-iterator@npm:1.1.0" + dependencies: + es-errors: ^1.3.0 + internal-slot: ^1.1.0 + checksum: be944489d8829fb3bdec1a1cc4a2142c6b6eb317305eeace1ece978d286d6997778afa1ae8cb3bd70e2b274b9aa8c69f93febb1e15b94b1359b11058f9d3c3a1 + languageName: node + linkType: hard + "store2@npm:^2.14.2": version: 2.14.2 resolution: "store2@npm:2.14.2" @@ -32514,7 +34858,7 @@ __metadata: languageName: node linkType: hard -"string-width@npm:^2.1.1": +"string-width@npm:^1.0.2 || 2, string-width@npm:^2.1.1": version: 2.1.1 resolution: "string-width@npm:2.1.1" dependencies: @@ -32546,6 +34890,21 @@ __metadata: languageName: node linkType: hard +"string.prototype.trim@npm:^1.2.10": + version: 1.2.10 + resolution: "string.prototype.trim@npm:1.2.10" + dependencies: + call-bind: ^1.0.8 + call-bound: ^1.0.2 + define-data-property: ^1.1.4 + define-properties: ^1.2.1 + es-abstract: ^1.23.5 + es-object-atoms: ^1.0.0 + has-property-descriptors: ^1.0.2 + checksum: 87659cd8561237b6c69f5376328fda934693aedde17bb7a2c57008e9d9ff992d0c253a391c7d8d50114e0e49ff7daf86a362f7961cf92f7564cd01342ca2e385 + languageName: node + linkType: hard + "string.prototype.trim@npm:^1.2.8": version: 1.2.8 resolution: "string.prototype.trim@npm:1.2.8" @@ -32557,16 +34916,6 @@ __metadata: languageName: node linkType: hard -"string.prototype.trimend@npm:^1.0.4": - version: 1.0.4 - resolution: "string.prototype.trimend@npm:1.0.4" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.3 - checksum: 17e5aa45c3983f582693161f972c1c1fa4bbbdf22e70e582b00c91b6575f01680dc34e83005b98e31abe4d5d29e0b21fcc24690239c106c7b2315aade6a898ac - languageName: node - linkType: hard - "string.prototype.trimend@npm:^1.0.7": version: 1.0.7 resolution: "string.prototype.trimend@npm:1.0.7" @@ -32578,13 +34927,15 @@ __metadata: languageName: node linkType: hard -"string.prototype.trimstart@npm:^1.0.4": - version: 1.0.4 - resolution: "string.prototype.trimstart@npm:1.0.4" +"string.prototype.trimend@npm:^1.0.9": + version: 1.0.9 + resolution: "string.prototype.trimend@npm:1.0.9" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.3 - checksum: 3fb06818d3cccac5fa3f5f9873d984794ca0e9f6616fae6fcc745885d9efed4e17fe15f832515d9af5e16c279857fdbffdfc489ca4ed577811b017721b30302f + call-bind: ^1.0.8 + call-bound: ^1.0.2 + define-properties: ^1.2.1 + es-object-atoms: ^1.0.0 + checksum: cb86f639f41d791a43627784be2175daa9ca3259c7cb83e7a207a729909b74f2ea0ec5d85de5761e6835e5f443e9420c6ff3f63a845378e4a61dd793177bc287 languageName: node linkType: hard @@ -32599,6 +34950,17 @@ __metadata: languageName: node linkType: hard +"string.prototype.trimstart@npm:^1.0.8": + version: 1.0.8 + resolution: "string.prototype.trimstart@npm:1.0.8" + dependencies: + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-object-atoms: ^1.0.0 + checksum: df1007a7f580a49d692375d996521dc14fd103acda7f3034b3c558a60b82beeed3a64fa91e494e164581793a8ab0ae2f59578a49896a7af6583c1f20472bce96 + languageName: node + linkType: hard + "string_decoder@npm:^1.1.1": version: 1.3.0 resolution: "string_decoder@npm:1.3.0" @@ -32617,6 +34979,16 @@ __metadata: languageName: node linkType: hard +"stringify-entities@npm:^4.0.0": + version: 4.0.4 + resolution: "stringify-entities@npm:4.0.4" + dependencies: + character-entities-html4: ^2.0.0 + character-entities-legacy: ^3.0.0 + checksum: ac1344ef211eacf6cf0a0a8feaf96f9c36083835b406560d2c6ff5a87406a41b13f2f0b4c570a3b391f465121c4fd6822b863ffb197e8c0601a64097862cc5b5 + languageName: node + linkType: hard + "strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:6, strip-ansi@npm:6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": version: 6.0.1 resolution: "strip-ansi@npm:6.0.1" @@ -32715,6 +35087,13 @@ __metadata: languageName: node linkType: hard +"strip-json-comments@npm:2.0.1, strip-json-comments@npm:~2.0.1": + version: 2.0.1 + resolution: "strip-json-comments@npm:2.0.1" + checksum: 1074ccb63270d32ca28edfb0a281c96b94dc679077828135141f27d52a5a398ef5e78bcf22809d23cadc2b81dfbe345eb5fd8699b385c8b1128907dec4a7d1e1 + languageName: node + linkType: hard + "strip-json-comments@npm:^3.0.1, strip-json-comments@npm:^3.1.0, strip-json-comments@npm:^3.1.1": version: 3.1.1 resolution: "strip-json-comments@npm:3.1.1" @@ -32722,22 +35101,15 @@ __metadata: languageName: node linkType: hard -"strip-json-comments@npm:~2.0.1": - version: 2.0.1 - resolution: "strip-json-comments@npm:2.0.1" - checksum: 1074ccb63270d32ca28edfb0a281c96b94dc679077828135141f27d52a5a398ef5e78bcf22809d23cadc2b81dfbe345eb5fd8699b385c8b1128907dec4a7d1e1 - languageName: node - linkType: hard - -"style-loader@npm:^1.2.1": - version: 1.3.0 - resolution: "style-loader@npm:1.3.0" +"style-loader@npm:^2.0.0": + version: 2.0.0 + resolution: "style-loader@npm:2.0.0" dependencies: loader-utils: ^2.0.0 - schema-utils: ^2.7.0 + schema-utils: ^3.0.0 peerDependencies: webpack: ^4.0.0 || ^5.0.0 - checksum: 1be9e8705307f5b8eb89e80f3703fa27296dccec349d790eace7aabe212f08c7c8f3ea6b6cb97bc53e82fbebfb9aa0689259671a8315f4655e24a850781e062a + checksum: 21425246a5a8f14d1625a657a3a56f8a323193fa341a71af818a2ed2a429efa2385a328b4381cf2f12c2d0e6380801eb9e0427ed9c3a10ff95c86e383184d632 languageName: node linkType: hard @@ -32831,14 +35203,15 @@ __metadata: languageName: node linkType: hard -"stylehacks@npm:^4.0.0": - version: 4.0.3 - resolution: "stylehacks@npm:4.0.3" +"stylehacks@npm:^6.1.1": + version: 6.1.1 + resolution: "stylehacks@npm:6.1.1" dependencies: - browserslist: ^4.0.0 - postcss: ^7.0.0 - postcss-selector-parser: ^3.0.0 - checksum: 8acf28ea609bee6d7ba40121bcf53af8d899c1ec04f2c08de9349b8292b84b8aa7f82e14c623ae6956decf5b7a7eeea5472ab8e48de7bdcdb6d76640444f6753 + browserslist: ^4.23.0 + postcss-selector-parser: ^6.0.16 + peerDependencies: + postcss: ^8.4.31 + checksum: 7bef69822280a23817caa43969de76d77ba34042e9f1f7baaeda8f22b1d8c20f1f839ad028552c169e158e387830f176feccd0324b07ef6ec657cba1dd0b2466 languageName: node linkType: hard @@ -32857,12 +35230,21 @@ __metadata: languageName: node linkType: hard -"sugarss@npm:^2.0.0": - version: 2.0.0 - resolution: "sugarss@npm:2.0.0" +"sugarss@npm:^4.0.1": + version: 4.0.1 + resolution: "sugarss@npm:4.0.1" + peerDependencies: + postcss: ^8.3.3 + checksum: 9dd4c89fd00d885e415f74759e02f477b2cc5ab833935124e23ed26e07adbb9319afa3cb15d050aa65f4c8d78a0ca87b03efbf96eb12ba333469cbdb6ddb0f7d + languageName: node + linkType: hard + +"supports-color@npm:6.0.0": + version: 6.0.0 + resolution: "supports-color@npm:6.0.0" dependencies: - postcss: ^7.0.2 - checksum: 777abf31671b67aafc5bb6dbca0853070ff9c129b7a52e90cfbe1a24ff069765e53b03767f85407386edf01c26fe2c2861aae2841f9a391751df891694137839 + has-flag: ^3.0.0 + checksum: 005b4a7e5d78a9a703454f5b7da34336b82825747724d1f3eefea6c3956afcb33b79b31854a93cef0fc1f2449919ae952f79abbfd09a5b5b43ecd26407d3a3a1 languageName: node linkType: hard @@ -32941,26 +35323,20 @@ __metadata: languageName: node linkType: hard -"svgo@npm:^1.0.0": - version: 1.3.2 - resolution: "svgo@npm:1.3.2" - dependencies: - chalk: ^2.4.1 - coa: ^2.0.2 - css-select: ^2.0.0 - css-select-base-adapter: ^0.1.1 - css-tree: 1.0.0-alpha.37 - csso: ^4.0.2 - js-yaml: ^3.13.1 - mkdirp: ~0.5.1 - object.values: ^1.1.0 - sax: ~1.2.4 - stable: ^0.1.8 - unquote: ~1.1.1 - util.promisify: ~1.0.0 +"svgo@npm:^3.2.0": + version: 3.3.2 + resolution: "svgo@npm:3.3.2" + dependencies: + "@trysound/sax": 0.2.0 + commander: ^7.2.0 + css-select: ^5.1.0 + css-tree: ^2.3.1 + css-what: ^6.1.0 + csso: ^5.0.5 + picocolors: ^1.0.0 bin: svgo: ./bin/svgo - checksum: 28a5680a61245eb4a1603bc03459095bb01ad5ebd23e95882d886c3c81752313c0a9a9fe48dd0bcbb9a27c52e11c603640df952971573b2b550d9e15a9ee6116 + checksum: a3f8aad597dec13ab24e679c4c218147048dc1414fe04e99447c5f42a6e077b33d712d306df84674b5253b98c9b84dfbfb41fdd08552443b04946e43d03e054e languageName: node linkType: hard @@ -33209,22 +35585,22 @@ __metadata: languageName: node linkType: hard -"terser-webpack-plugin@npm:^3.0.2": - version: 3.1.0 - resolution: "terser-webpack-plugin@npm:3.1.0" +"terser-webpack-plugin@npm:^4.2.3": + version: 4.2.3 + resolution: "terser-webpack-plugin@npm:4.2.3" dependencies: cacache: ^15.0.5 find-cache-dir: ^3.3.1 - jest-worker: ^26.2.1 + jest-worker: ^26.5.0 p-limit: ^3.0.2 - schema-utils: ^2.6.6 - serialize-javascript: ^4.0.0 + schema-utils: ^3.0.0 + serialize-javascript: ^5.0.1 source-map: ^0.6.1 - terser: ^4.8.0 + terser: ^5.3.4 webpack-sources: ^1.4.3 peerDependencies: webpack: ^4.0.0 || ^5.0.0 - checksum: 1633a716b63bb7f3cd157b4fe767ae970ac2bc553ecb25fca818f5c1fc197c285a1abc6507f85d2a305ae7c1504b72febdc93e1aeaba75174fc4eb0ed573fb45 + checksum: ec1b3a85e2645c57e359d5e4831f3e1d78eca2a0c94b156db70eb846ae35b5e6e98ad8784b12e153fc273e57445ce69d017075bbe9fc42868a258ef121f11537 languageName: node linkType: hard @@ -33272,19 +35648,6 @@ __metadata: languageName: node linkType: hard -"terser@npm:^4.8.0": - version: 4.8.0 - resolution: "terser@npm:4.8.0" - dependencies: - commander: ^2.20.0 - source-map: ~0.6.1 - source-map-support: ~0.5.12 - bin: - terser: bin/terser - checksum: f980789097d4f856c1ef4b9a7ada37beb0bb022fb8aa3057968862b5864ad7c244253b3e269c9eb0ab7d0caf97b9521273f2d1cf1e0e942ff0016e0583859c71 - languageName: node - linkType: hard - "terser@npm:^5.10.0, terser@npm:^5.7.2": version: 5.10.0 resolution: "terser@npm:5.10.0" @@ -33317,6 +35680,20 @@ __metadata: languageName: node linkType: hard +"terser@npm:^5.3.4": + version: 5.44.1 + resolution: "terser@npm:5.44.1" + dependencies: + "@jridgewell/source-map": ^0.3.3 + acorn: ^8.15.0 + commander: ^2.20.0 + source-map-support: ~0.5.20 + bin: + terser: bin/terser + checksum: 1113c5711bb53127f9886e3c906fde8a93a665b532db9c7e36ff7bf287e032ed48ea0e5a3a1a27f6a27c3c0f934e47e7590fcd15c76b7b7bd44ad751b8a9ede4 + languageName: node + linkType: hard + "test-exclude@npm:^6.0.0": version: 6.0.0 resolution: "test-exclude@npm:6.0.0" @@ -33399,13 +35776,6 @@ __metadata: languageName: node linkType: hard -"timsort@npm:^0.3.0": - version: 0.3.0 - resolution: "timsort@npm:0.3.0" - checksum: 1a66cb897dacabd7dd7c91b7e2301498ca9e224de2edb9e42d19f5b17c4b6dc62a8d4cbc64f28be82aaf1541cb5a78ab49aa818f42a2989ebe049a64af731e2a - languageName: node - linkType: hard - "tiny-invariant@npm:^1.0.2": version: 1.2.0 resolution: "tiny-invariant@npm:1.2.0" @@ -33639,6 +36009,13 @@ __metadata: languageName: node linkType: hard +"trim-lines@npm:^3.0.0": + version: 3.0.1 + resolution: "trim-lines@npm:3.0.1" + checksum: e241da104682a0e0d807222cc1496b92e716af4db7a002f4aeff33ae6a0024fef93165d49eab11aa07c71e1347c42d46563f91dfaa4d3fb945aa535cdead53ed + languageName: node + linkType: hard + "trim-newlines@npm:^3.0.0": version: 3.0.1 resolution: "trim-newlines@npm:3.0.1" @@ -33646,6 +36023,13 @@ __metadata: languageName: node linkType: hard +"trim-trailing-lines@npm:^2.0.0": + version: 2.1.0 + resolution: "trim-trailing-lines@npm:2.1.0" + checksum: 4bfed49a8c064c93d15e560bec81083fdbb0a525300f07006b76bcc753816091c5ef25e6a82d1bb6fe678e4e1ecde5a7f8dd7f6fa1c9da74b80d3a64497a87f6 + languageName: node + linkType: hard + "trough@npm:^2.0.0": version: 2.0.2 resolution: "trough@npm:2.0.2" @@ -33944,22 +36328,6 @@ __metadata: languageName: node linkType: hard -"turndown-plugin-gfm@npm:^1.0.2": - version: 1.0.2 - resolution: "turndown-plugin-gfm@npm:1.0.2" - checksum: 18191dc18d731ec16bb1f1a477af6471ce2acf152b882a7eccef8e0101e09628fec0f8499f352f0a291ce798f1f30d799b5a72bd5d2cde30a2a28070de24495c - languageName: node - linkType: hard - -"turndown@npm:^6.0.0": - version: 6.0.0 - resolution: "turndown@npm:6.0.0" - dependencies: - jsdom: ^16.2.0 - checksum: c2d494d226223489045d2bac05ef171893911d81894e60c58165ee06eb2d5388a1dce0595d4e7b4b00761d3b85cdfd337e081d0b53b26aefc02c7fa9a22eeb2e - languageName: node - linkType: hard - "tw-to-css@npm:0.0.11": version: 0.0.11 resolution: "tw-to-css@npm:0.0.11" @@ -34094,6 +36462,17 @@ __metadata: languageName: node linkType: hard +"typed-array-buffer@npm:^1.0.3": + version: 1.0.3 + resolution: "typed-array-buffer@npm:1.0.3" + dependencies: + call-bound: ^1.0.3 + es-errors: ^1.3.0 + is-typed-array: ^1.1.14 + checksum: 3fb91f0735fb413b2bbaaca9fabe7b8fc14a3fa5a5a7546bab8a57e755be0e3788d893195ad9c2b842620592de0e68d4c077d4c2c41f04ec25b8b5bb82fa9a80 + languageName: node + linkType: hard + "typed-array-byte-length@npm:^1.0.0": version: 1.0.0 resolution: "typed-array-byte-length@npm:1.0.0" @@ -34106,6 +36485,19 @@ __metadata: languageName: node linkType: hard +"typed-array-byte-length@npm:^1.0.3": + version: 1.0.3 + resolution: "typed-array-byte-length@npm:1.0.3" + dependencies: + call-bind: ^1.0.8 + for-each: ^0.3.3 + gopd: ^1.2.0 + has-proto: ^1.2.0 + is-typed-array: ^1.1.14 + checksum: cda9352178ebeab073ad6499b03e938ebc30c4efaea63a26839d89c4b1da9d2640b0d937fc2bd1f049eb0a38def6fbe8a061b601292ae62fe079a410ce56e3a6 + languageName: node + linkType: hard + "typed-array-byte-offset@npm:^1.0.0": version: 1.0.0 resolution: "typed-array-byte-offset@npm:1.0.0" @@ -34119,6 +36511,21 @@ __metadata: languageName: node linkType: hard +"typed-array-byte-offset@npm:^1.0.4": + version: 1.0.4 + resolution: "typed-array-byte-offset@npm:1.0.4" + dependencies: + available-typed-arrays: ^1.0.7 + call-bind: ^1.0.8 + for-each: ^0.3.3 + gopd: ^1.2.0 + has-proto: ^1.2.0 + is-typed-array: ^1.1.15 + reflect.getprototypeof: ^1.0.9 + checksum: 670b7e6bb1d3c2cf6160f27f9f529e60c3f6f9611c67e47ca70ca5cfa24ad95415694c49d1dbfeda016d3372cab7dfc9e38c7b3e1bb8d692cae13a63d3c144d7 + languageName: node + linkType: hard + "typed-array-length@npm:^1.0.4": version: 1.0.4 resolution: "typed-array-length@npm:1.0.4" @@ -34130,6 +36537,20 @@ __metadata: languageName: node linkType: hard +"typed-array-length@npm:^1.0.7": + version: 1.0.7 + resolution: "typed-array-length@npm:1.0.7" + dependencies: + call-bind: ^1.0.7 + for-each: ^0.3.3 + gopd: ^1.0.1 + is-typed-array: ^1.1.13 + possible-typed-array-names: ^1.0.0 + reflect.getprototypeof: ^1.0.6 + checksum: deb1a4ffdb27cd930b02c7030cb3e8e0993084c643208e52696e18ea6dd3953dfc37b939df06ff78170423d353dc8b10d5bae5796f3711c1b3abe52872b3774c + languageName: node + linkType: hard + "typedarray-to-buffer@npm:^3.1.5": version: 3.1.5 resolution: "typedarray-to-buffer@npm:3.1.5" @@ -34218,18 +36639,6 @@ __metadata: languageName: node linkType: hard -"unbox-primitive@npm:^1.0.1": - version: 1.0.1 - resolution: "unbox-primitive@npm:1.0.1" - dependencies: - function-bind: ^1.1.1 - has-bigints: ^1.0.1 - has-symbols: ^1.0.2 - which-boxed-primitive: ^1.0.2 - checksum: 89d950e18fb45672bc6b3c961f1e72c07beb9640c7ceed847b571ba6f7d2af570ae1a2584cfee268b9d9ea1e3293f7e33e0bc29eaeb9f8e8a0bab057ff9e6bba - languageName: node - linkType: hard - "unbox-primitive@npm:^1.0.2": version: 1.0.2 resolution: "unbox-primitive@npm:1.0.2" @@ -34242,6 +36651,18 @@ __metadata: languageName: node linkType: hard +"unbox-primitive@npm:^1.1.0": + version: 1.1.0 + resolution: "unbox-primitive@npm:1.1.0" + dependencies: + call-bound: ^1.0.3 + has-bigints: ^1.0.2 + has-symbols: ^1.1.0 + which-boxed-primitive: ^1.1.1 + checksum: 729f13b84a5bfa3fead1d8139cee5c38514e63a8d6a437819a473e241ba87eeb593646568621c7fc7f133db300ef18d65d1a5a60dc9c7beb9000364d93c581df + languageName: node + linkType: hard + "unc-path-regex@npm:^0.1.2": version: 0.1.2 resolution: "unc-path-regex@npm:0.1.2" @@ -34335,6 +36756,21 @@ __metadata: languageName: node linkType: hard +"unified@npm:11.0.5, unified@npm:^11.0.0": + version: 11.0.5 + resolution: "unified@npm:11.0.5" + dependencies: + "@types/unist": ^3.0.0 + bail: ^2.0.0 + devlop: ^1.0.0 + extend: ^3.0.0 + is-plain-obj: ^4.0.0 + trough: ^2.0.0 + vfile: ^6.0.0 + checksum: b3bf7fd6f568cc261e074dae21188483b0f2a8ab858d62e6e85b75b96cc655f59532906ae3c64d56a9b257408722d71f1d4135292b3d7ee02907c8b592fb3cf0 + languageName: node + linkType: hard + "unified@npm:^10.0.0": version: 10.1.1 resolution: "unified@npm:10.1.1" @@ -34362,20 +36798,6 @@ __metadata: languageName: node linkType: hard -"uniq@npm:^1.0.1": - version: 1.0.1 - resolution: "uniq@npm:1.0.1" - checksum: 8206535f83745ea83f9da7035f3b983fd6ed5e35b8ed7745441944e4065b616bc67cf0d0a23a86b40ee0074426f0607f0a138f9b78e124eb6a7a6a6966055709 - languageName: node - linkType: hard - -"uniqs@npm:^2.0.0": - version: 2.0.0 - resolution: "uniqs@npm:2.0.0" - checksum: 5ace63e0521fd1ae2c161b3fa167cf6846fc45a71c00496729e0146402c3ae467c6f025a68fbd6766300a9bfbac9f240f2f0198164283bef48012b39db83f81f - languageName: node - linkType: hard - "unique-filename@npm:^1.1.1": version: 1.1.1 resolution: "unique-filename@npm:1.1.1" @@ -34457,6 +36879,16 @@ __metadata: languageName: node linkType: hard +"unist-util-find-after@npm:^5.0.0": + version: 5.0.0 + resolution: "unist-util-find-after@npm:5.0.0" + dependencies: + "@types/unist": ^3.0.0 + unist-util-is: ^6.0.0 + checksum: e64bd5ebee7ac021cf990bf33e9ec29fc6452159187d4a7fa0f77334bea8e378fea7a7fb0bcf957300b2ffdba902ff25b62c165fc8b86309613da35ad793ada0 + languageName: node + linkType: hard + "unist-util-generated@npm:^2.0.0": version: 2.0.0 resolution: "unist-util-generated@npm:2.0.0" @@ -34478,6 +36910,15 @@ __metadata: languageName: node linkType: hard +"unist-util-is@npm:^6.0.0": + version: 6.0.1 + resolution: "unist-util-is@npm:6.0.1" + dependencies: + "@types/unist": ^3.0.0 + checksum: e57733e1766b55c9a873a42d2f34daa211580788b1bba26af2fc22e48e147bdcff0f9a752ed2a19238864823735fbbe27a1804d6a5a22b182c23aa0191e41c12 + languageName: node + linkType: hard + "unist-util-position@npm:^4.0.0": version: 4.0.1 resolution: "unist-util-position@npm:4.0.1" @@ -34485,6 +36926,15 @@ __metadata: languageName: node linkType: hard +"unist-util-position@npm:^5.0.0": + version: 5.0.0 + resolution: "unist-util-position@npm:5.0.0" + dependencies: + "@types/unist": ^3.0.0 + checksum: f89b27989b19f07878de9579cd8db2aa0194c8360db69e2c99bd2124a480d79c08f04b73a64daf01a8fb3af7cba65ff4b45a0b978ca243226084ad5f5d441dde + languageName: node + linkType: hard + "unist-util-stringify-position@npm:^3.0.0": version: 3.0.0 resolution: "unist-util-stringify-position@npm:3.0.0" @@ -34494,6 +36944,15 @@ __metadata: languageName: node linkType: hard +"unist-util-stringify-position@npm:^4.0.0": + version: 4.0.0 + resolution: "unist-util-stringify-position@npm:4.0.0" + dependencies: + "@types/unist": ^3.0.0 + checksum: e2e7aee4b92ddb64d314b4ac89eef7a46e4c829cbd3ee4aee516d100772b490eb6b4974f653ba0717a0071ca6ea0770bf22b0a2ea62c65fcba1d071285e96324 + languageName: node + linkType: hard + "unist-util-visit-parents@npm:^3.0.0": version: 3.1.1 resolution: "unist-util-visit-parents@npm:3.1.1" @@ -34524,6 +36983,27 @@ __metadata: languageName: node linkType: hard +"unist-util-visit-parents@npm:^6.0.0": + version: 6.0.2 + resolution: "unist-util-visit-parents@npm:6.0.2" + dependencies: + "@types/unist": ^3.0.0 + unist-util-is: ^6.0.0 + checksum: cf28578a6f0b81877965e261fe82460f83b8c3a9cab3b2080c046b215f3223c6195b01064256619ca3411a1930face93a1a2a72d34d8716e684d6cd59f53cd9a + languageName: node + linkType: hard + +"unist-util-visit@npm:5.0.0, unist-util-visit@npm:^5.0.0": + version: 5.0.0 + resolution: "unist-util-visit@npm:5.0.0" + dependencies: + "@types/unist": ^3.0.0 + unist-util-is: ^6.0.0 + unist-util-visit-parents: ^6.0.0 + checksum: 9ec42e618e7e5d0202f3c191cd30791b51641285732767ee2e6bcd035931032e3c1b29093f4d7fd0c79175bbc1f26f24f26ee49770d32be76f8730a652a857e6 + languageName: node + linkType: hard + "unist-util-visit@npm:^2.0.0": version: 2.0.3 resolution: "unist-util-visit@npm:2.0.3" @@ -34606,13 +37086,6 @@ __metadata: languageName: node linkType: hard -"unquote@npm:~1.1.1": - version: 1.1.1 - resolution: "unquote@npm:1.1.1" - checksum: 71745867d09cba44ba2d26cb71d6dda7045a98b14f7405df4faaf2b0c90d24703ad027a9d90ba9a6e0d096de2c8d56f864fd03f1c0498c0b7a3990f73b4c8f5f - languageName: node - linkType: hard - "unset-value@npm:^1.0.0": version: 1.0.0 resolution: "unset-value@npm:1.0.0" @@ -34732,6 +37205,20 @@ __metadata: languageName: node linkType: hard +"update-browserslist-db@npm:^1.2.0": + version: 1.2.0 + resolution: "update-browserslist-db@npm:1.2.0" + dependencies: + escalade: ^3.2.0 + picocolors: ^1.1.1 + peerDependencies: + browserslist: ">= 4.21.0" + bin: + update-browserslist-db: cli.js + checksum: b3c0720f1947dd7c4ec32ec3c7cb4b95996b2587a883cc9d4307a86f69c9cc82bd1dd62aceb83da02c0a46f27d7d31cb35920240ceeb17c1c34cabd588f36388 + languageName: node + linkType: hard + "upper-case-first@npm:^2.0.2": version: 2.0.2 resolution: "upper-case-first@npm:2.0.2" @@ -34890,18 +37377,6 @@ __metadata: languageName: node linkType: hard -"util.promisify@npm:~1.0.0": - version: 1.0.1 - resolution: "util.promisify@npm:1.0.1" - dependencies: - define-properties: ^1.1.3 - es-abstract: ^1.17.2 - has-symbols: ^1.0.1 - object.getownpropertydescriptors: ^2.1.0 - checksum: d823c75b3fc66510018596f128a6592c98991df38bc0464a633bdf9134e2de0a1a33199c5c21cc261048a3982d7a19e032ecff8835b3c587f843deba96063e37 - languageName: node - linkType: hard - "util@npm:^0.12.0, util@npm:^0.12.4": version: 0.12.5 resolution: "util@npm:0.12.5" @@ -35065,6 +37540,13 @@ __metadata: languageName: node linkType: hard +"vanilla-colorful@npm:0.7.2": + version: 0.7.2 + resolution: "vanilla-colorful@npm:0.7.2" + checksum: 02bcdc1c8c316caa4efcf0067938638e6c1c194f45530bbc907c17fd4e689752c7fe2faaa052e7af3e7ac032f196b71e51a0e4eee884bb570efc4fdcab7a912c + languageName: node + linkType: hard + "varint@npm:^5.0.2": version: 5.0.2 resolution: "varint@npm:5.0.2" @@ -35079,13 +37561,6 @@ __metadata: languageName: node linkType: hard -"vendors@npm:^1.0.0": - version: 1.0.4 - resolution: "vendors@npm:1.0.4" - checksum: 4b16e0bc18dbdd7ac8dd745c776c08f6c73e9a7f620ffd9faf94a3d86a35feaf4c6cb1bbdb304d2381548a30d0abe69b83eeb1b7b1bf5bb33935e64b28812681 - languageName: node - linkType: hard - "vfile-message@npm:^3.0.0": version: 3.0.2 resolution: "vfile-message@npm:3.0.2" @@ -35096,6 +37571,16 @@ __metadata: languageName: node linkType: hard +"vfile-message@npm:^4.0.0": + version: 4.0.3 + resolution: "vfile-message@npm:4.0.3" + dependencies: + "@types/unist": ^3.0.0 + unist-util-stringify-position: ^4.0.0 + checksum: f5e8516f2aa0feb4c866d507543d4e90f9ab309e2c988577dbf4ebd268d495f72f2b48149849d14300164d5d60b5f74b5641cd285bb4408a3942b758683d9276 + languageName: node + linkType: hard + "vfile@npm:*": version: 5.3.0 resolution: "vfile@npm:5.3.0" @@ -35120,6 +37605,16 @@ __metadata: languageName: node linkType: hard +"vfile@npm:^6.0.0": + version: 6.0.3 + resolution: "vfile@npm:6.0.3" + dependencies: + "@types/unist": ^3.0.0 + vfile-message: ^4.0.0 + checksum: 152b6729be1af70df723efb65c1a1170fd483d41086557da3651eea69a1dd1f0c22ea4344834d56d30734b9185bcab63e22edc81d3f0e9bed8aa4660d61080af + languageName: node + linkType: hard + "void-elements@npm:3.1.0": version: 3.1.0 resolution: "void-elements@npm:3.1.0" @@ -35245,6 +37740,13 @@ __metadata: languageName: node linkType: hard +"web-namespaces@npm:^2.0.0": + version: 2.0.1 + resolution: "web-namespaces@npm:2.0.1" + checksum: b6d9f02f1a43d0ef0848a812d89c83801d5bbad57d8bb61f02eb6d7eb794c3736f6cc2e1191664bb26136594c8218ac609f4069722c6f56d9fc2d808fa9271c6 + languageName: node + linkType: hard + "web-streams-polyfill@npm:4.0.0-beta.1": version: 4.0.0-beta.1 resolution: "web-streams-polyfill@npm:4.0.0-beta.1" @@ -35624,6 +38126,40 @@ __metadata: languageName: node linkType: hard +"which-boxed-primitive@npm:^1.1.0, which-boxed-primitive@npm:^1.1.1": + version: 1.1.1 + resolution: "which-boxed-primitive@npm:1.1.1" + dependencies: + is-bigint: ^1.1.0 + is-boolean-object: ^1.2.1 + is-number-object: ^1.1.1 + is-string: ^1.1.1 + is-symbol: ^1.1.1 + checksum: ee41d0260e4fd39551ad77700c7047d3d281ec03d356f5e5c8393fe160ba0db53ef446ff547d05f76ffabfd8ad9df7c9a827e12d4cccdbc8fccf9239ff8ac21e + languageName: node + linkType: hard + +"which-builtin-type@npm:^1.2.1": + version: 1.2.1 + resolution: "which-builtin-type@npm:1.2.1" + dependencies: + call-bound: ^1.0.2 + function.prototype.name: ^1.1.6 + has-tostringtag: ^1.0.2 + is-async-function: ^2.0.0 + is-date-object: ^1.1.0 + is-finalizationregistry: ^1.1.0 + is-generator-function: ^1.0.10 + is-regex: ^1.2.1 + is-weakref: ^1.0.2 + isarray: ^2.0.5 + which-boxed-primitive: ^1.1.0 + which-collection: ^1.0.2 + which-typed-array: ^1.1.16 + checksum: 7a3617ba0e7cafb795f74db418df889867d12bce39a477f3ee29c6092aa64d396955bf2a64eae3726d8578440e26777695544057b373c45a8bcf5fbe920bf633 + languageName: node + linkType: hard + "which-collection@npm:^1.0.1": version: 1.0.1 resolution: "which-collection@npm:1.0.1" @@ -35636,6 +38172,18 @@ __metadata: languageName: node linkType: hard +"which-collection@npm:^1.0.2": + version: 1.0.2 + resolution: "which-collection@npm:1.0.2" + dependencies: + is-map: ^2.0.3 + is-set: ^2.0.3 + is-weakmap: ^2.0.2 + is-weakset: ^2.0.3 + checksum: c51821a331624c8197916598a738fc5aeb9a857f1e00d89f5e4c03dc7c60b4032822b8ec5696d28268bb83326456a8b8216344fb84270d18ff1d7628051879d9 + languageName: node + linkType: hard + "which-module@npm:^2.0.0": version: 2.0.0 resolution: "which-module@npm:2.0.0" @@ -35656,6 +38204,21 @@ __metadata: languageName: node linkType: hard +"which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.19": + version: 1.1.19 + resolution: "which-typed-array@npm:1.1.19" + dependencies: + available-typed-arrays: ^1.0.7 + call-bind: ^1.0.8 + call-bound: ^1.0.4 + for-each: ^0.3.5 + get-proto: ^1.0.1 + gopd: ^1.2.0 + has-tostringtag: ^1.0.2 + checksum: 162d2a07f68ea323f88ed9419861487ce5d02cb876f2cf9dd1e428d04a63133f93a54f89308f337b27cabd312ee3d027cae4a79002b2f0a85b79b9ef4c190670 + languageName: node + linkType: hard + "which-typed-array@npm:^1.1.2, which-typed-array@npm:^1.1.9": version: 1.1.9 resolution: "which-typed-array@npm:1.1.9" @@ -35670,7 +38233,7 @@ __metadata: languageName: node linkType: hard -"which@npm:^1.2.12, which@npm:^1.2.9": +"which@npm:1.3.1, which@npm:^1.2.12, which@npm:^1.2.9": version: 1.3.1 resolution: "which@npm:1.3.1" dependencies: @@ -35703,6 +38266,15 @@ __metadata: languageName: node linkType: hard +"wide-align@npm:1.1.3": + version: 1.1.3 + resolution: "wide-align@npm:1.1.3" + dependencies: + string-width: ^1.0.2 || 2 + checksum: d09c8012652a9e6cab3e82338d1874a4d7db2ad1bd19ab43eb744acf0b9b5632ec406bdbbbb970a8f4771a7d5ef49824d038ba70aa884e7723f5b090ab87134d + languageName: node + linkType: hard + "wide-align@npm:^1.1.2, wide-align@npm:^1.1.5": version: 1.1.5 resolution: "wide-align@npm:1.1.5" @@ -36075,7 +38647,7 @@ __metadata: languageName: node linkType: hard -"yargs-parser@npm:^13.1.2": +"yargs-parser@npm:13.1.2, yargs-parser@npm:^13.1.2": version: 13.1.2 resolution: "yargs-parser@npm:13.1.2" dependencies: @@ -36116,7 +38688,18 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^13.0.0": +"yargs-unparser@npm:1.6.0": + version: 1.6.0 + resolution: "yargs-unparser@npm:1.6.0" + dependencies: + flat: ^4.1.0 + lodash: ^4.17.15 + yargs: ^13.3.0 + checksum: ca662bb94af53d816d47f2162f0a1d135783f09de9fd47645a5cb18dd25532b0b710432b680d2c065ff45de122ba4a96433c41595fa7bfcc08eb12e889db95c1 + languageName: node + linkType: hard + +"yargs@npm:13.3.2, yargs@npm:^13.0.0, yargs@npm:^13.3.0": version: 13.3.2 resolution: "yargs@npm:13.3.2" dependencies: @@ -36281,3 +38864,10 @@ __metadata: checksum: 8edd7af8375f12f64d8dbef815af32cd77bd9237d0b013210ba4e3aef25fdc460fe264cd0a19deabe9f86ef0c607240ebac1a336bf4a70bf06ef53e0652de116 languageName: node linkType: hard + +"zwitch@npm:^2.0.4": + version: 2.0.4 + resolution: "zwitch@npm:2.0.4" + checksum: f22ec5fc2d5f02c423c93d35cdfa83573a3a3bd98c66b927c368ea4d0e7252a500df2a90a6b45522be536a96a73404393c958e945fdba95e6832c200791702b6 + languageName: node + linkType: hard