diff --git a/ui/lib/nance/constants.ts b/ui/lib/nance/constants.ts index e1de8911..07228fd5 100644 --- a/ui/lib/nance/constants.ts +++ b/ui/lib/nance/constants.ts @@ -1,8 +1,11 @@ // use chainId as env var for detecting dev mode -const prod = process.env.NEXT_PUBLIC_CHAIN === 'mainnet' -export const NANCE_SPACE_NAME = prod ? 'moondao' : 'waterbox' -export const SNAPSHOT_SPACE_NAME = prod ? 'tomoondao.eth' : 'jigglyjams.eth' +const mainnet = process.env.NEXT_PUBLIC_CHAIN === 'mainnet' +const dev = process.env.NEXT_PUBLIC_ENV === 'dev' +export const NANCE_SPACE_NAME = mainnet || dev ? 'moondao' : 'waterbox' +export const SNAPSHOT_SPACE_NAME = + mainnet || dev ? 'tomoondao.eth' : 'jigglyjams.eth' -export const proposalIdPrefix = 'MDP-'; +export const proposalIdPrefix = 'MDP-' -export const NANCE_API_URL = prod ? 'https://api.nance.app' : 'http://localhost:3003' +export const NANCE_API_URL = + mainnet || dev ? 'https://api.nance.app' : 'http://localhost:3003' diff --git a/ui/lib/nance/index.ts b/ui/lib/nance/index.ts index f68eb0c1..88ea3023 100644 --- a/ui/lib/nance/index.ts +++ b/ui/lib/nance/index.ts @@ -15,32 +15,79 @@ export function formatNumberUSStyle( } export const TEMPLATE = `\n*Note: Please remove the italicized instructions before submitting*\n -## Abstract -*This is a high-level description of the idea. Please use ELI5 (explain like I'm five years old) wording and summarize things for anyone to understand what you want to achieve.* -## Problem +**Author:** +**Date:** + +# Abstract + +*This is a high-level description of the idea. Please use ELI5 (explain like I’m five years old) wording and summarize things for anyone to understand what you want to achieve.* + +# Problem + *Describe the problem your proposal solves.* -## Solution -*Describe the "meat & potatoes" of the proposal. Go into necessary detail about the work that needs to be done, alternative solutions considered, open questions, and future directions. Keep it concise.* +# Solution + +*Describe the “meat & potatoes” of the proposal. Go into necessary detail about the work that needs to be done, alternative solutions considered, open questions, and future directions. Keep it concise.* + +# Benefits -## Benefits *Point out the core benefits of the proposal implementation and how it will affect MoonDAO. If the proposal can create revenue please create justification for how much revenue it could generate.* -## Risks +# Risks + *Highlight any risks from implementing the proposal, how could this go wrong? How are you addressing those risks?* -## Objectives +# Objectives + *You can write as many OKRs as you think are needed. One focused goal is preferred instead of many. OKRs should use SMART principles (Specific, Measurable, Achievable, Relevant, and Time-Bound).* -**Objective #1:** *What do you want to achieve with this project. Be specific.* +**Objective \#1:** *What do you want to achieve with this project. Be specific.* +**Key Results for Objective \#1**: + +- *What is a measurable result that indicates this objective has been met?* +- *Include 3-4 relevant metrics that indicate success for the objective* + +**Member(s) responsible for OKR** **and their role:** + +- *Is there a specific member or set of members that are responsible for this particular objective? If all of them are responsible for this just say “All”* + +# Team (Table A) + +***Project Lead:** The Project Lead and representative for the project within the MoonDAO Senate. The Project Lead is responsible for:* + +1. *Attending weekly town hall meetings, reviewing incoming proposals and voting on them within the Senate. Missed attendance will result in a 5% penalty to the rocketeer’s retroactive rewards.* +2. *Creating weekly updates to the community on the progress of the project in the “progress” channel on DIscord.* +3. *Adding team members, removing team members, and making decisions about the use of the budget throughout the lifetime of the project.* +4. *Creating and managing the multi-sig Treasury for the project as well as the payments for each of the members.* +5. *Creating the Final Report and returning unused funds to the MoonDAO Treasury.* + +***Initial Team:** Projects may not need an initial team. It can just be an individual submitting a proposal. You may also create generic roles and hire other teammates after the project is approved. As a general rule of thumb, try to keep teams small and focused in the beginning, **with clear roles, deliverables, and OKRs for each member**. Team members are responsible for:* + +1. *Posting a weekly update in the “progress” channel on Discord with their contributions that week. Not posting a weekly update will result in a 5% penalty to their retroactive rewards.* + +| Project Lead | *@DiscordUsername* | +| :---- | :---- | +| **Initial Team** | *Role 1: “Developer” @DiscordUsername1. “Description of the role and deliverable for this member” Role 2: “Designer” @DiscordUsername2. “Description of the role and deliverable for this member”* | +| **Multi-sig signers\*** | *Five required with their ETH addresses listed. “@DiscordUsername1: eth:0x0...1” “@DiscordUsername2: eth:0x0...2” “@DiscordUsername3: eth:0x0...3” “@DiscordUsername4: eth:0x0...4” “@DiscordUsername5: eth:0x0...5” You can create a multi-sig [here](https://app.safe.global/welcome)* | +| **Multi-sig Address\*** | *ETH address with the multi-sig* | + +# Timeline (Table B) + +| Days after Proposal Passes | Description | +| :---- | :---- | +| 0 | Proposal Passes | +| 7 | *Insert your milestones here.* | +| | | + +**Deadline for the project: End of Q3.** -**Key Results for Objective #1:** -* *What is a measurable result that indicates this objective has been met?* -* *Include 3-4 relevant metrics that indicate success for the objective* +# Transactions (Table C) -**Member(s) responsible for OKR and their role:** -* *Is there a specific member or set of members that are responsible for this particular objective? If all of them are responsible for this just say "All"* +*Please write out the specific transactions that need to be executed if this proposal passes. Please include the exact amount and token type and the receiving address (this is the multi-sig if there is more than one transaction that needs to be executed throughout the lifetime of this project.)* -## Deadline -*Enter the expected completion date for this project..*`; +| Transaction Type | Amount | Token Type | Receiving Address | +| :---- | :---- | :---- | :---- | +| *Send* | *0* | *ETH* | *TBD* | +` diff --git a/ui/lib/project/useProjectData.tsx b/ui/lib/project/useProjectData.tsx index 05e65138..b9453151 100644 --- a/ui/lib/project/useProjectData.tsx +++ b/ui/lib/project/useProjectData.tsx @@ -33,10 +33,13 @@ export default function useProjectData( const [isLoading, setIsLoading] = useState(false) - const [snapshotProposal, setSnapshotProposal] = useState() - const proposalJSON = useProposalJSON( - snapshotProposal?.data?.message?.body as string - ) + const { data: nanceProposalResponse } = useProposal({ + space: NANCE_SPACE_NAME, + uuid: String(project?.MDP) || '', + }) + const nanceProposal = nanceProposalResponse?.data + + const proposalJSON = useProposalJSON(nanceProposal?.body as string) const [isManager, setIsManager] = useState(false) const [hatTreeId, setHatTreeId] = useState() @@ -51,12 +54,6 @@ export default function useProjectData( [project?.id || ''] ) - const { data: nanceProposalResponse } = useProposal({ - space: NANCE_SPACE_NAME, - uuid: String(project?.MDP) || '', - }) - const nanceProposal = nanceProposalResponse?.data - const totalBudget = useMemo(() => { let budget = 0 if (nanceProposal?.actions && nanceProposal.actions.length > 0) { @@ -71,21 +68,6 @@ export default function useProjectData( return budget }, [nanceProposal]) - const isActive = useMemo(() => { - return project?.active === 1 - }, [project?.active]) - - useEffect(() => { - async function getProposal() { - const res = await fetch( - `https://ipfs.io/ipfs/${project?.proposalIPFS.split('ipfs://')[1]}` - ) - const data = await res.json() - setSnapshotProposal(data) - } - if (project?.proposalIPFS) getProposal() - }, [project?.proposalIPFS]) - useEffect(() => { async function checkManager() { try { @@ -116,12 +98,10 @@ export default function useProjectData( return { ...project, - isActive, isManager, hatTreeId, adminHatId, managerHatId, - snapshotData: snapshotProposal, nanceProposal, proposalJSON, totalBudget, diff --git a/ui/lib/utils/voting.ts b/ui/lib/utils/voting.ts index 8f09c191..7276ba8d 100644 --- a/ui/lib/utils/voting.ts +++ b/ui/lib/utils/voting.ts @@ -1,6 +1,6 @@ import { Solve } from '@bygdle/javascript-lp-solver' import _ from 'lodash' -import { Distribution, Project } from '@/components/nance/RetroactiveRewards' +import { Distribution } from '@/components/nance/RetroactiveRewards' // Function to minimize L1 distance function minimizeL1Distance(D: number[], V: number[][]) { diff --git a/ui/next.config.js b/ui/next.config.js index 90b10244..c0cfd194 100644 --- a/ui/next.config.js +++ b/ui/next.config.js @@ -148,11 +148,6 @@ module.exports = nextTranslate({ destination: '/zero-gravity', permanent: true, }, - { - source: '/contribute', - destination: 'https://discord.gg/moondao', - permanent: true, - }, { source: '/es', destination: '/', @@ -203,6 +198,26 @@ module.exports = nextTranslate({ destination: '/submit?tag=contribution', permanent: true, }, + { + source: '/contribution', + destination: '/submit?tag=contribution', + permanent: true, + }, + { + source: '/citizens', + destination: '/network?tab=citizens', + permanent: true, + }, + { + source: '/propose', + destination: '/submit?tag=proposal', + permanent: true, + }, + { + source: '/teams', + destination: '/network?tab=teams', + permanent: true, + }, ] }, webpack: (config, { isServer }) => { diff --git a/ui/package.json b/ui/package.json index a8ca2051..01a3fc99 100644 --- a/ui/package.json +++ b/ui/package.json @@ -22,7 +22,7 @@ "@headlessui/react": "^2.0.4", "@heroicons/react": "^2.0.18", "@hookform/error-message": "^2.0.1", - "@nance/nance-editor": "^1.8.3", + "@nance/nance-editor": "^1.8.4", "@nance/nance-hooks": "^4.1.6", "@nance/nance-sdk": "^4.1.6", "@privy-io/react-auth": "^1.92.1", diff --git a/ui/pages/contribution.tsx b/ui/pages/contribution.tsx deleted file mode 100644 index 3d76b7e2..00000000 --- a/ui/pages/contribution.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import { GetMarkdown } from '@nance/nance-editor' -import { usePrivy } from '@privy-io/react-auth' -import dynamic from 'next/dynamic' -import { useState } from 'react' -import { toast } from 'react-hot-toast' -import { pinBlobOrFile } from '@/lib/ipfs/pinBlobOrFile' -import useAccount from '@/lib/nance/useAccountAddress' -import '@nance/nance-editor/lib/css/dark.css' -import '@nance/nance-editor/lib/css/editor.css' -import Container from '@/components/layout/Container' -import ContentLayout from '@/components/layout/ContentLayout' -import WebsiteHead from '@/components/layout/Head' -import { LoadingSpinner } from '@/components/layout/LoadingSpinner' -import { NoticeFooter } from '@/components/layout/NoticeFooter' - -let getMarkdown: GetMarkdown - -const NanceEditor = dynamic( - async () => { - getMarkdown = (await import('@nance/nance-editor')).getMarkdown - return import('@nance/nance-editor').then((mod) => mod.NanceEditor) - }, - { - ssr: false, - loading: () => , - } -) - -const SuccessState = ({ coordinapeLink }: { coordinapeLink: string }) => ( -
-

Contribution submitted!

-

- View and edit your contribution{' '} - - here - -

-
-) - -const UnauthenticatedState = () => ( -

Please sign in to submit a contribution!

-) - -const ContributionForm = ({ onSubmit }: { onSubmit: () => Promise }) => { - const [submitting, setSubmitting] = useState(false) - - const handleSubmit = async () => { - setSubmitting(true) - await onSubmit() - setSubmitting(false) - } - - return ( -
-
- { - const res = await pinBlobOrFile(val) - return res.url - }} - darkMode={true} - /> -
-
- -
-
- ) -} - -export default function NewContribution() { - const { authenticated } = usePrivy() - const [coordinapeLink, setCoordinapeLink] = useState(null) - const { address } = useAccount() - - const handleSubmitContribution = async () => { - const loadingToast = toast.loading('Submitting contribution...') - try { - const body = JSON.stringify({ - description: getMarkdown(), - address, - }) - - const res = await fetch('/api/coordinape/createContribution', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body, - }) - const data = await res.json() - if (!res.ok) { - toast.dismiss(loadingToast) - toast.error(data.error) - return - } - - toast.dismiss(loadingToast) - toast.success('Contribution submitted successfully!') - setCoordinapeLink( - `https://app.coordinape.com/circles/${data.insert_contributions_one.circle_id}` - ) - } catch (err) { - toast.dismiss(loadingToast) - toast.error('Failed to submit contribution') - } - } - - const renderContent = () => { - if (!authenticated) { - return - } - if (coordinapeLink) { - return - } - return - } - - const title = 'New Contribution' - const description = ( - -

Submit a contribution to be included in the Coordinape circle.

-
- ) - - return ( -
- - - -
- {renderContent()} -
-
- -
-
- ) -} diff --git a/ui/pages/propose.tsx b/ui/pages/propose.tsx deleted file mode 100644 index bc882a6a..00000000 --- a/ui/pages/propose.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import React from 'react'; -import { NanceProvider } from "@nance/nance-hooks"; -import ProposalEditor from "../components/nance/ProposalEditor"; -import { NANCE_API_URL } from "../lib/nance/constants"; -import Container from '../components/layout/Container'; -import ContentLayout from '../components/layout/ContentLayout'; -import WebsiteHead from '../components/layout/Head'; -import { useRouter } from 'next/router'; // Add this import -import { NoticeFooter } from '../components/layout/NoticeFooter'; -import Link from 'next/link' - -export default function NewProposal() { - const router = useRouter(); // Initialize the router - const { proposalId } = router.query; // Get the proposalId from the URL - - // Determine the header text based on the presence of proposalId - const headerText = proposalId ? "Edit Proposal" : "New Proposal"; - - const title = 'New Proposal'; - const description = ( - -

- Submit a proposal to receive financing or support from the MoonDAO community. Please refer to our documentation for more details on the project system and governance processes before getting started. We recommend starting your draft with the Google doc template. -

-
- ); - - return ( - <> - - - - - - - - - - - ) -} diff --git a/ui/pages/submit.tsx b/ui/pages/submit.tsx index 2c31ea2d..a835f1b6 100644 --- a/ui/pages/submit.tsx +++ b/ui/pages/submit.tsx @@ -1,76 +1,129 @@ -import React, { useEffect, useState } from 'react'; -import { Tab } from '@headlessui/react'; -import { NanceProvider } from "@nance/nance-hooks"; -import { NANCE_API_URL } from "../lib/nance/constants"; -import Container from '../components/layout/Container'; -import ContentLayout from '../components/layout/ContentLayout'; -import ProposalEditor from '../components/nance/ProposalEditor'; -import ContributionEditor from '../components/contribution/ContributionEditor'; -import WebsiteHead from '../components/layout/Head'; -import { NoticeFooter } from '../components/layout/NoticeFooter'; -import { useRouter } from 'next/router'; +import { Tab } from '@headlessui/react' +import { NanceProvider } from '@nance/nance-hooks' +import { useRouter } from 'next/router' +import React, { useEffect, useState } from 'react' +import { NANCE_API_URL } from '../lib/nance/constants' +import { useShallowQueryRoute } from '@/lib/utils/hooks' +import ContributionEditor from '../components/contribution/ContributionEditor' +import Container from '../components/layout/Container' +import ContentLayout from '../components/layout/ContentLayout' +import WebsiteHead from '../components/layout/Head' +import { NoticeFooter } from '../components/layout/NoticeFooter' +import ProposalEditor from '../components/nance/ProposalEditor' +import Image from 'next/image'; +import Link from 'next/link'; const SubmissionPage: React.FC = () => { - const router = useRouter(); - const { tag } = router.query; - const [selectedIndex, setSelectedIndex] = useState(0); - const title = 'Collaborate with MoonDAO'; + const router = useRouter() + const { tag } = router.query + const shallowQueryRoute = useShallowQueryRoute() + const [selectedIndex, setSelectedIndex] = useState(0) + const title = 'Collaborate with MoonDAO' useEffect(() => { - if (tag === 'contribution') { - setSelectedIndex(1); - } else { - setSelectedIndex(0); + if (selectedIndex === 1) { + shallowQueryRoute({ tag: 'contribution' }) + } else if (selectedIndex === 0) { + shallowQueryRoute({ tag: 'proposal' }) } - }, [tag]); + }, [selectedIndex]) - const headerContent = ( -
-
- ); + useEffect(() => { + if (tag === 'contribution') { + setSelectedIndex(1) + } else if (!tag || tag === 'proposal') { + setSelectedIndex(0) + } + }, [tag]) return ( <> - +
} mainPadding mode="compact" isProfile={true} >
- + - - `rounded-lg py-2.5 px-5 font-GoodTimes leading-5 focus:outline-none - ${selected - ? 'bg-gradient-to-r from-[#5757ec] to-[#6b3d79] text-white shadow' - : 'text-white/70 hover:text-white'}` - }> + + `rounded-lg py-2.5 px-5 font-GoodTimes leading-5 focus:outline-none + ${ + selected + ? 'bg-gradient-to-r from-[#5757ec] to-[#6b3d79] text-white shadow' + : 'text-white/70 hover:text-white' + }` + } + > Submit Proposal - - `rounded-lg py-2.5 font-GoodTimes leading-5 px-5 focus:outline-none - ${selected - ? 'bg-gradient-to-r from-[#5757ec] to-[#6b3d79] text-white shadow' - : 'text-white/70 hover:text-white'}` - }> + + `rounded-lg py-2.5 font-GoodTimes leading-5 px-5 focus:outline-none + ${ + selected + ? 'bg-gradient-to-r from-[#5757ec] to-[#6b3d79] text-white shadow' + : 'text-white/70 hover:text-white' + }` + } + > Submit Contribution -
+
+
+
+ Step 1 +

+ (optional)

Post to #ideation +

+
+
+ Step 1 +

+ Submit your

proposal below +

+
+
+ Step 1 +

+ Present Proposal

at Townhall +

+
+

- Submit a proposal to receive financing or special permissions from the MoonDAO community. Please refer to {' '} + Submit a proposal to receive financing or special permissions from voting MoonDAO members. Please refer to {' '} our documentation - - {' '}for more details before getting started. + {' '} + for more details before getting started.

@@ -80,11 +133,16 @@ const SubmissionPage: React.FC = () => {

- What have you done to accelerate the impact of MoonDAO's mission? Submit your results for senate review and potential rewards. Please refer to {' '} - + What have you done to accelerate the impact of MoonDAO's + mission? Submit your results for senate review and + potential rewards. Please refer to{' '} + our documentation - - {' '}for more details. + {' '} + for more details.

@@ -97,7 +155,7 @@ const SubmissionPage: React.FC = () => {
- ); -}; + ) +} -export default SubmissionPage; +export default SubmissionPage diff --git a/ui/public/assets/icon-number-1.svg b/ui/public/assets/icon-number-1.svg new file mode 100644 index 00000000..ad9571ed --- /dev/null +++ b/ui/public/assets/icon-number-1.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ui/public/assets/icon-number-2.svg b/ui/public/assets/icon-number-2.svg new file mode 100644 index 00000000..ba210030 --- /dev/null +++ b/ui/public/assets/icon-number-2.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/ui/public/assets/icon-number-3.svg b/ui/public/assets/icon-number-3.svg new file mode 100644 index 00000000..511b59c7 --- /dev/null +++ b/ui/public/assets/icon-number-3.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/ui/yarn.lock b/ui/yarn.lock index a18d43ce..c2778225 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -3084,10 +3084,10 @@ resolved "https://registry.yarnpkg.com/@multiformats/base-x/-/base-x-4.0.1.tgz#95ff0fa58711789d53aefb2590a8b7a4e715d121" integrity sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw== -"@nance/nance-editor@^1.8.3": - version "1.8.3" - resolved "https://registry.yarnpkg.com/@nance/nance-editor/-/nance-editor-1.8.3.tgz#7c2d8d076aa4c54b13356a73e9da12cd9917488c" - integrity sha512-NW/epLAl3auKlcFqKItDtCFkwJ7Z79d7F6N67NifP2sZ+zpaMHwAC0xzX2NIW9tmLkM7fJnM+jjuyQcoCfQYPQ== +"@nance/nance-editor@^1.8.4": + version "1.8.4" + resolved "https://registry.yarnpkg.com/@nance/nance-editor/-/nance-editor-1.8.4.tgz#b4bbc67912f28b57b4923f0e431f8bc17d15947e" + integrity sha512-OIThUEn5ppQ9CQynIjnMDYuA5fBx2Lu8q54DdSQ3RcW7Vo9BHjReOIvMsAiPLkdPu/GtlfePI7CHrZezOipTew== dependencies: "@toast-ui/react-editor" "^3.2.3" @@ -16718,7 +16718,7 @@ strict-uri-encode@^2.0.0: resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ== -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -16736,6 +16736,15 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" @@ -16829,7 +16838,7 @@ stringify-entities@^4.0.0: character-entities-html4 "^2.0.0" character-entities-legacy "^3.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -16843,6 +16852,13 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -18723,7 +18739,7 @@ word-wrap@^1.2.5: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -18750,6 +18766,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"