diff --git a/docusaurus/docs/React/components/contexts/component-context.mdx b/docusaurus/docs/React/components/contexts/component-context.mdx index 0dedce6ab..6e4318f2f 100644 --- a/docusaurus/docs/React/components/contexts/component-context.mdx +++ b/docusaurus/docs/React/components/contexts/component-context.mdx @@ -18,6 +18,35 @@ Pull values from context with our custom hook: const { Attachment, Avatar, Message } = useComponentContext(); ``` +## WithComponents + +A component override functionality which utilises `ComponentContext` under the hood. This is direct replacement for a prop-based component overrides which are now slowly being deprecated. + +### Basic Usage of WithComponents + +In this case, top-level [`MessageInput`](../message-input-components/message-input.mdx) component reaches for the closest overrides and applies `MessageInputUi1`, the [`Thread`](../core-components/thread.mdx) component uses [`MessageInput`](../message-input-components/message-input.mdx) internally and its UI can be also overriden - in this case, the closest one provides override with component `MessageInputUi2`. If we were to remove this `WithComponents` wrapper over [`Thread`](../core-components/thread.mdx) component, the closest override for [`Thread`](../core-components/thread.mdx)'s [`MessageInput`](../message-input-components/message-input.mdx) component would be `MessageInputUi1`. + +```tsx +const MessageInputUi1 = () => { + /*...*/ +}; +const MessageInputUi2 = () => { + /*...*/ +}; + + + + + + + + + + + +; +``` + ## Values ### Attachment diff --git a/docusaurus/docs/React/components/contexts/thread-context.mdx b/docusaurus/docs/React/components/contexts/thread-context.mdx new file mode 100644 index 000000000..c45f0d1d1 --- /dev/null +++ b/docusaurus/docs/React/components/contexts/thread-context.mdx @@ -0,0 +1,22 @@ +--- +id: thread-context +title: ThreadContext +--- + +`ThreadContext` - just like any other React context - is used for dependency injection. What makes it different in this case is `ThreadProvider`. + +## ThreadProvider + +Is a provider which wraps [`Channel`](../core-components/channel.mdx) component and takes [`Thread` instance]() as a value. The [`Channel`](../core-components/channel.mdx) wrapper acts as a temporary measure to make [`Thread` component](../core-components/thread.mdx) compatible with the new architecture which relies on [`Thread` instance](). The reliance on channel is temporary and will become deprecated in the future. + +Thread component newly prioritizes [`Thread` instance]() if rendered under [`ThreadProvider`](../contexts/thread-context.mdx#threadprovider) otherwise falls back to accessing thread from [`Channel` state](../contexts/channel-state-context.mdx). + +### Basic Usage + +```tsx +import { Thread, ThreadProvider } from 'stream-chat-react'; + + + +; +``` diff --git a/docusaurus/docs/React/components/core-components/thread-list-item.mdx b/docusaurus/docs/React/components/core-components/thread-list-item.mdx new file mode 100644 index 000000000..b0d8f0bac --- /dev/null +++ b/docusaurus/docs/React/components/core-components/thread-list-item.mdx @@ -0,0 +1,21 @@ +--- +id: thread-list-item +title: ThreadListItem +--- + +An item component rendered within [`ThreadList` component](./thread-list.mdx). The item is divided into two components: + +`ThreadListItem` - a component and provider which renders `ThreadListItemUi` +`ThreadListItemUi` - a component which renders the actual UI elements + +The goal is that as integrator you can provide a different look to your component while preserving the behavior or you can replace the behavior while keeping the default UI or you can change both if you require so. + +## Props + +### thread + +A thread instance provided by the [`ThreadList`](../core-components/thread-list.mdx). + +| Type | +| ------ | +| Thread | diff --git a/docusaurus/docs/React/components/core-components/thread-list.mdx b/docusaurus/docs/React/components/core-components/thread-list.mdx new file mode 100644 index 000000000..a57778c41 --- /dev/null +++ b/docusaurus/docs/React/components/core-components/thread-list.mdx @@ -0,0 +1,27 @@ +--- +id: thread-list +title: ThreadList +--- + +`ThreadList` is a component which renders individual thread instances ([`Thread`](https://github.com/GetStream/stream-chat-js/blob/master/src/thread.ts)) stored within `ThreadManager`. It handles pagination triggers and virtualization through the help of the [Virtuoso](https://virtuoso.dev) virtualized list component. The rest of the business logic lives within ThreadManager and Thread classes. ThreadManager instance gets activated whenever ThreadList renders - activation is necessary as it tells the SDK that user "sees" this list and can update state accordingly whenever appropriate events arrive. + +If used in default form and rendered within `ThreadView` component it also allows to set active thread and handles `Thread` activation (similar to `ThreadManager` activation). + +## Basic Usage + +```tsx + + {/*...*/} + + +``` + +## Props + +### virtuosoProps + +Props to be passed to the underlying [`react-virtuoso` virtualized list dependency](https://virtuoso.dev/virtuoso-api/interfaces/VirtuosoProps). + +| Type | +| ------ | +| object | diff --git a/docusaurus/docs/React/components/utility-components/chat-view.mdx b/docusaurus/docs/React/components/utility-components/chat-view.mdx new file mode 100644 index 000000000..f62d694a6 --- /dev/null +++ b/docusaurus/docs/React/components/utility-components/chat-view.mdx @@ -0,0 +1,53 @@ +--- +id: chat-view +title: ChatView +keywords: [example, chat view, channel view, thread view, thread adapter] +--- + +`ChatView` is component itself and a set of components which allow for a drop-in implementation of different chat views - the channel view and thread view. This drop-in solution allows your users to easily switch between said views without having to implement such mechanism yourself. It consists of: + +- `ChatView` - a provider that holds information about the selected view +- `ChatView.Selector` - selector which allows to set the required view +- `ChatView.Channels` - a wrapper that renders its children when `ChatView` value is equal to `channels` +- `ChatView.Threads` - a provider and a wrapper that renders its children when `ChatView` value is equal to `threads`, exposes `ThreadsViewContext` under which `ThreadList` can set an active thread +- `ChatView.ThreadAdapter` - a wrapper which can access an active thread from the `ThreadsViewContext` and forwards it to the [`ThreadProvider`](../contexts/thread-context.mdx) + +## Basic Usage + +```tsx +import { + Chat, + ChatView, + ChannelList, + Channel, + ThreadList, + Thread, + useCreateChatClient, +} from 'stream-chat-react'; + +const App = () => { + const chatClient = useCreateChatClient(/*...*/); + + if (!chatClient) return null; + + return ( + + + + {/* Channel View */} + + + {/*...*/} + + {/* Thread View */} + + + + + + + + + ); +}; +``` diff --git a/docusaurus/docs/React/components/utility-components/view-components.mdx b/docusaurus/docs/React/components/utility-components/view-components.mdx new file mode 100644 index 000000000..7a250c012 --- /dev/null +++ b/docusaurus/docs/React/components/utility-components/view-components.mdx @@ -0,0 +1,97 @@ +--- +id: view-components-and-thread-adapter +title: View Components and Thread Adapter +--- + +ChatView set of components is a view switching mechanism that can be utilised by integrators to quickly implement switching between thread and channel views. + +Available components: + +- `ChatView` - wrapper with context holding the information about currently active view (`channels` & `threads`) +- `ChatView.Threads` - view used for thread-focused application structure with `ThreadsViewContext` that _can be_ utilised by `ThreadList` to set active thread +- `ChatView.Channels` - view used for channel-focused application structure +- `ChatView.Selector` - list with buttons with bound actions for switching views +- `ChatView.ThreadAdapter` - utilises `ThreadsViewContext` and wraps `Thread` component in necessary `ThreadProvider` + +This set of components is provided as-is and offers very limited customizability as the underlying logic is super simple. Integrators are encouraged to build their own switching system if they require it. + +### Usage + +```tsx +import { + Chat, + ChatView, + ChannelList, + Channel, + ThreadList, + Thread, + Window, +} from 'stream-chat-react'; + +// application structure which allows users to switch between views + + + + {/* channel-focused structure */} + + + + + + + + + + + + {/* thread-focused structure */} + + + + + + + +; +``` + +### Custom Thread-focused Structure + +To build your custom thread-focused structure you'll need these four baseline components; `Thread`, `ThreadList`, `ThreadProvier` and `WithComponents` for component overrides. + +:::note +For presentation purposes our custom `ThreadListItemUi` component is loosely defined within `CustomThreadsView` and thus it isn't stable. To achieve best performance make sure your components +are stable and defined outside other component's scope. +::: + +```tsx +import { WithComponents, ThreadListItemUi, ThreadList, ThreadProvider } from 'stream-chat-react'; + +export const CustomThreadsView = () => { + const [activeThread, setActiveThread] = useState(undefined); + + return ( +
+ { + const thread = useThreadListItemContext()!; + return ( + setActiveThread(thread)} + aria-selected={thread === activeThread} + /> + ); + }, + }} + > + + + + + + +
+ ); +}; +``` diff --git a/docusaurus/docs/React/guides/custom-threads-view.mdx b/docusaurus/docs/React/guides/custom-threads-view.mdx new file mode 100644 index 000000000..f9c7f9c4a --- /dev/null +++ b/docusaurus/docs/React/guides/custom-threads-view.mdx @@ -0,0 +1,62 @@ +--- +id: custom-threads-view +title: Custom Threads View +keywords: [cookbook, threads, view] +--- + +Our SDK comes with [`ChatView`](../components/utility-components/chat-view.mdx) which allows for an easy integration of different views. In this guide we'll show how to implement custom threads view while utilising core components and hooks. + +## Required Components & Hooks + +These components and hooks are required for your own implementation to work properly: + +- `ThreadList` +- `ThreadListItem` - a provider for `ThreadListItemUi` with thread information, will be used to forward custom click event to the `ThreadListItemUi` button +- `ThreadProvider` - "adapter" for Thread component to work properly with [`Thread` instance](https://github.com/GetStream/stream-chat-js/blob/master/src/thread.ts) +- `Thread` - provides [`MessageList`](../components/core-components/message-list.mdx) with [`MessageInput`](../components/message-input-components/message-input.mdx) adjusted for threads +- `useActiveThread` - takes your selected thread instance and handles its activity state (`Thread.activate()` & `Thread.deactivate()`) based on document focus and visibility + +## Building Custom Threads View + +```tsx +import { + ThreadList, + ThreadListItem, + ThreadProvider, + Thread, + WithComponents, + useActiveThread, +} from 'stream-chat-react'; + +export const CustomThreadsView = () => { + const [activeThread, setActiveThread] = useState(undefined); + + useActiveThread({ activeThread }); + + return ( +
+ ( + { + setActiveThread(thread); + }, + }} + /> + ), + }} + /> + + {activeThread && ( + + + + )} +
+ ); +}; +``` diff --git a/docusaurus/docs/React/guides/sdk-state-management.mdx b/docusaurus/docs/React/guides/sdk-state-management.mdx index 22ec7e1ee..89881ac7c 100644 --- a/docusaurus/docs/React/guides/sdk-state-management.mdx +++ b/docusaurus/docs/React/guides/sdk-state-management.mdx @@ -134,6 +134,146 @@ export const CustomChannelList = (props: ChannelListProps) => { }; ``` +## Thread and ThreadManager + +With the new [threads feature]() we've decided to refresh our state management and moved to a subscribable POJO with selector based system to make developer experience better when it came to rendering information provided by our `StreamChat` client. + +:::note +This change is currently only available within `StreamChat.threads` but will be reused across the whole SDK later on. +::: + +### Why POJO (State Object) + +Our SDK holds and provides A LOT of information to our integrators and each of those integrators sometimes require different data or forms of data to display to their users. All of this important data now lives within something we call state object and through custom-tailored selectors our integrators can access the combination of data they require without any extra overhead and performance to match. + +### What are Selectors + +Selectors are functions provided by integrators that run whenever state object changes. These selectors should return piece of that state that is important for the appropriate component that renders that piece of information. Selectors itself should not do any heavy data computations that could resolve in generating new data each time the selector runs (arrays and objects), use pre-built hooks with computed state values or build your own if your codebase requires it. + +#### Rules of Selectors + +1. Selectors should return array of data sorted by their "change factor"; meaning values that change often should come first for the best performance. + +```ts +const selector = (nextValue: ThreadManagerState) => [ + nextValue.unreadThreadsCount, // <-- changes often + nextValue.active, // <-- changes less often + nextvalue.lastConnectionDownAt, // <-- changes rarely +]; +``` + +2. Selectors should live outside components scope or should be memoized if it requires "outside" information (`userId` for `read` object for example). Not memoizing selectors (or not stabilizing them) will lead to bad performance as each time your component re-renders, the selector function is created anew and `useSimpleStateStore` goes through unsubscribe and resubscribe process unnecessarily. + +```tsx +// ❌ not okay +const Component1 = () => { + const [latestReply] = useThreadState((nextValue: ThreadState) => [ + nextValue.latestReplies.at(-1), + ]); + + return
{latestReply.text}
; +}; + +// ✅ okay +const selector = (nextValue: ThreadState) => [nextValue.latestReplies.at(-1)]; + +const Component2 = () => { + const [latestReply] = useThreadState(selector); + + return
{latestReply.text}
; +}; + +// ✅ also okay +const Component3 = ({ userId }: { userId: string }) => { + const selector = useCallback( + (nextValue: ThreadState) => [nextValue.read[userId].unread_messages], + [userId], + ); + + const [unreadMessagesCount] = useThreadState(selector); + + return
{unreadMessagesCount}
; +}; +``` + +3. Break your components down to the smallest reasonable parts that each take care of the apropriate piece of state if it makes sense to do so. + +### Accessing Reactive State + +Our SDK currently allows to access two of these state structures - in [Thread]() and [ThreadManager]() instances under `state` property. + +#### Vanilla + +```ts +import { StreamChat } from 'stream-chat'; + +const client = new StreamChat(/*...*/); + +// calls console.log with the whole state object whenever it changes +client.threads.state.subscribe(console.log); + +let latestThreads; +client.threads.state.subscribeWithSelector( + // called each time theres a change in the state object + (nextValue) => [nextValue.threads], + // called only when threads change (selected value) + ([threads]) => { + latestThreads = threads; + }, +); + +// returns lastest state object +const state = client.threads.state.getLatestValue(); + +const [thread] = latestThreads; + +// thread instances come with the same functionality +thread?.state.subscribe(/*...*/); +thread?.state.subscribeWithSelector(/*...*/); +thread?.state.getLatestValue(/*...*/); +``` + +#### useSimpleStateStore Hook + +For the ease of use - the React SDK comes with the appropriate state acesss hook which wraps `SimpleStateStore.subscribeWithSelector` API for the React-based applications. + +```tsx +import { useSimpleStateStore } from 'stream-chat-react'; +import type { ThreadManagerState } from 'stream-chat'; + +const selector = (nextValue: ThreadManagerState) => [nextValue.threads] as const; + +const CustomThreadList = () => { + const { client } = useChatContext(); + const [threads] = useSimpleStateStore(client.threads.state, selector); + + return ( + + ); +}; +``` + +#### useThreadState and useThreadManagerState + +Both of these hooks use `useSimpleStateStore` under the hood but access their respective states through appropriate contexts; for `ThreadManagerState` it's `ChatContext` (accessing `client.threads.state`) and for `ThreadState` it's `ThreadListItemContext` first and `ThreadContext` second meaning that the former is prioritized. While these hooks make it sligthly easier for our integrators to reach reactive state + +```ts +// memoized or living outside component's scope +const threadStateSelector = (nextValue: ThreadState) => [nextValue.replyCount] as const; +const threadManagerStateSelector = (nextValue: ThreadState) => [nextValue.threads.length] as const; + +const MyComponent = () => { + const [replyCount] = useThreadState(threadStateSelector); + const [threadsCount] = useThreadManagerState(threadManagerStateSelector); + + return null; +}; +``` + ## Conclusion This guide covers the biggest and most important state stores, see other React stateful contexts exported by our SDK for more information. diff --git a/docusaurus/docs/React/release-guides/upgrade-to-v12.mdx b/docusaurus/docs/React/release-guides/upgrade-to-v12.mdx index 48de7c7dc..f5d52acbc 100644 --- a/docusaurus/docs/React/release-guides/upgrade-to-v12.mdx +++ b/docusaurus/docs/React/release-guides/upgrade-to-v12.mdx @@ -4,6 +4,91 @@ title: Upgrade to v12 keywords: [migration guide, upgrade, v12, breaking changes] --- +## Introducing Threads 2.0 + +With the release of v12 of our SDK we're also releasing new thread functionality - specifically "thread view", which consists of [`ThreadList`](../components/core-components/thread-list.mdx) and [`Thread`](../components/core-components/thread.mdx) components allowing your users to quickly go over threaded conversations they're part of. To implement this simple view see [thread and channel view guide](../guides/chat-view.mdx). + +### Thread & ThreadManager + +Both [`Thread`](https://github.com/GetStream/stream-chat-js/blob/master/src/thread.ts) and [`ThreadManager`](https://github.com/GetStream/stream-chat-js/blob/master/src/thread.ts) are new classes within [`stream-chat` package](https://www.npmjs.com/package/stream-chat) with own logic which updates their respective state objects to which integrators can subscribe to and render their UI accordingly. These classes (or rather instances of these classes) are utilised within React SDK. Read more about accessing state of these classes in our [SDK State Management documentation](../guides/sdk-state-management.mdx#thread-and-threadmanager). + +### ThreadList & ThreadListItem + +[`ThreadList`](../components/core-components/thread-list.mdx) component represents a [`ThreadManager`](https://github.com/GetStream/stream-chat-js/blob/master/src/thread.ts) instance while [`ThreadListItem`](../components/core-components/thread-list-item.mdx) represents individual [`Thread`](https://github.com/GetStream/stream-chat-js/blob/master/src/thread.ts) instances. UI of both of these components reflects latest state of their appropriate "controllers" but apart from communicating with their controllers via available methods these components do not manage any extra logic. + +### ThreadProvider + +[`ThreadProvider`](../components/contexts/thread-context.mdx#threadprovider) is an "adapter" which allows existing [`Thread`](../components/core-components/thread.mdx) component to consume methods and state of the [`Thread`](https://github.com/GetStream/stream-chat-js/blob/master/src/thread.ts) instance. + +```tsx + + + +``` + +### ChatView & ChatView.ThreadAdapter + +`ChatView` is component itself and a set of components which allow for a drop-in implementation of different chat views - the channel view and thread view. This drop-in solution allows your users to easily switch between said views without having to implement such mechanism yourself. Read more about it in our [`ChatView` documentation](../components/utility-components/view-components.mdx). + +## Introducing WithComponents & Dropping Defaults + +We know that component overrides are 90% of our SDK and providing these overrides only through [`Channel`](../components/core-components/channel.mdx) component isn't optimal. In the upcoming minor releases we'll be deprecating component overrides through individual component props and rather provide these overrides through `WithComponents`, you can read more about this component in our [`WithComponents` documentation](../components/contexts/component-context.mdx#with-components). + +## Dropped ComponentContext Defaults + +These components are no longer provided through the [`ComponentContext`](../components/contexts/component-context.mdx) as default values but have moved to their respective components: + +- `Attachment` +- `DateSeparator` +- `Message` +- `MessageSystem` +- `reactionOptions` +- `UnreadMessagesSeparator` + +### Before and After + +Previous solution for component overrides: + +```tsx +const MessageInputUi1 = () => { + /*...*/ +}; +const MessageInputUi2 = () => { + /*...*/ +}; + + + + + + + +; +``` + +Current solution utilising `WithComponents`: + +```tsx +const MessageInputUi1 = () => { + /*...*/ +}; +const MessageInputUi2 = () => { + /*...*/ +}; + + + + + + + + + + + +; +``` + ## Audio recordings transcoding Until now, the audio recordings were transcoded to `audio/mp3` format for inter-browser compatibility and size reduction. However, as of the v12, the MIME type `audio/wav` will be the default. The MP3 encoder use is opt-in from now on. diff --git a/examples/vite/.gitignore b/examples/vite/.gitignore index a547bf36d..fc5ae9f0c 100644 --- a/examples/vite/.gitignore +++ b/examples/vite/.gitignore @@ -22,3 +22,4 @@ dist-ssr *.njsproj *.sln *.sw? +.vercel diff --git a/examples/vite/src/App.tsx b/examples/vite/src/App.tsx index 468c323e1..3fbcdb6b7 100644 --- a/examples/vite/src/App.tsx +++ b/examples/vite/src/App.tsx @@ -9,6 +9,8 @@ import { Thread, Window, useCreateChatClient, + ThreadList, + ChatView, } from 'stream-chat-react'; import 'stream-chat-react/css/v2/index.css'; @@ -16,15 +18,23 @@ const params = (new Proxy(new URLSearchParams(window.location.search), { get: (searchParams, property) => searchParams.get(property as string), }) as unknown) as Record; -const apiKey = import.meta.env.VITE_STREAM_KEY as string; -const userId = params.uid ?? (import.meta.env.VITE_USER_ID as string); +const parseUserIdFromToken = (token: string) => { + const [, payload] = token.split('.'); + + if (!payload) throw new Error('Token is missing'); + + return JSON.parse(atob(payload))?.user_id; +}; + +const apiKey = params.key ?? (import.meta.env.VITE_STREAM_KEY as string); const userToken = params.ut ?? (import.meta.env.VITE_USER_TOKEN as string); +const userId = parseUserIdFromToken(userToken); const filters: ChannelFilters = { members: { $in: [userId] }, type: 'messaging', }; -const options: ChannelOptions = { limit: 10, presence: true, state: true }; +const options: ChannelOptions = { limit: 3, presence: true, state: true }; const sort: ChannelSort = { last_message_at: -1, updated_at: -1 }; type LocalAttachmentType = Record; @@ -60,15 +70,26 @@ const App = () => { return ( - - - - - - - - - + + + + + + + + + + + + + + + + + + + + ); }; diff --git a/examples/vite/src/index.scss b/examples/vite/src/index.scss index adfdcad27..036d9caa6 100644 --- a/examples/vite/src/index.scss +++ b/examples/vite/src/index.scss @@ -12,18 +12,23 @@ body, height: 100%; } - #root { display: flex; height: 100%; + & > div.str-chat { + height: 100%; + width: 100%; + display: flex; + } + .str-chat__channel-list { position: fixed; z-index: 1; height: 100%; width: 0; flex-shrink: 0; - box-shadow: 0 0 8px rgba(0, 0, 0, 0.15);; + box-shadow: 0 0 8px rgba(0, 0, 0, 0.15); &--open { width: 30%; @@ -49,7 +54,7 @@ body, .str-chat__thread { flex: 1; height: 100%; - position: fixed; + position: absolute; z-index: 1; } @@ -72,7 +77,6 @@ body, } } - @media screen and (min-width: 768px) { .str-chat__channel-list { width: 30%; @@ -80,9 +84,11 @@ body, z-index: 0; } - .str-chat__thread { - position: initial; - z-index: 0; + .str-chat__chat-view__channels { + .str-chat__thread { + position: initial; + z-index: 0; + } } .str-chat__channel-header .str-chat__header-hamburger { @@ -100,12 +106,18 @@ body, } } - .str-chat__thread { - max-width: 45%; + .str-chat__chat-view__channels { + .str-chat__thread { + max-width: 45%; + } } .str-chat__channel-header .str-chat__header-hamburger { display: none; } } + + .str-chat__thread-list-container { + max-width: 350px; + } } diff --git a/examples/vite/src/main.tsx b/examples/vite/src/main.tsx index 4f6ed354f..bb66b680f 100644 --- a/examples/vite/src/main.tsx +++ b/examples/vite/src/main.tsx @@ -1,10 +1,5 @@ -import React from 'react' -import ReactDOM from 'react-dom/client' -import App from './App.tsx' -import './index.scss' +import ReactDOM from 'react-dom/client'; +import App from './App.tsx'; +import './index.scss'; -ReactDOM.createRoot(document.getElementById('root')!).render( - - - , -) +ReactDOM.createRoot(document.getElementById('root')!).render(); diff --git a/examples/vite/yarn.lock b/examples/vite/yarn.lock index dfa66cefa..a99ea6a09 100644 --- a/examples/vite/yarn.lock +++ b/examples/vite/yarn.lock @@ -14,10 +14,39 @@ resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz#923ca57e173c6b232bbbb07347b1be982f03e783" integrity sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A== -"@breezystack/lamejs@^1.2.7": - version "1.2.7" - resolved "https://registry.yarnpkg.com/@breezystack/lamejs/-/lamejs-1.2.7.tgz#c4779f7f0b6b685da675ebbaaff85e52187a51ad" - integrity sha512-6wc7ck65ctA75Hq7FYHTtTvGnYs6msgdxiSUICQ+A01nVOWg6rqouZB8IdyteRlfpYYiFovkf67dIeOgWIUzTA== +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@edge-runtime/format@2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@edge-runtime/format/-/format-2.2.1.tgz#10dcedb0d7c2063c9ee360fbab23846c8720f986" + integrity sha512-JQTRVuiusQLNNLe2W9tnzBlV/GvSVcozLl4XZHk5swnRZ/v6jp8TqR8P7sqmJsQqblDZ3EztcWmLDbhRje/+8g== + +"@edge-runtime/node-utils@2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@edge-runtime/node-utils/-/node-utils-2.3.0.tgz#17ac98dd8a39e194c4fd49d66f3579ec5b125a78" + integrity sha512-uUtx8BFoO1hNxtHjp3eqVPC/mWImGb2exOfGjMLUoipuWgjej+f4o/VP4bUI8U40gu7Teogd5VTeZUkGvJSPOQ== + +"@edge-runtime/ponyfill@2.4.2": + version "2.4.2" + resolved "https://registry.yarnpkg.com/@edge-runtime/ponyfill/-/ponyfill-2.4.2.tgz#9bec9feff18623f9f3ebe2f4ad8f0475c644ed07" + integrity sha512-oN17GjFr69chu6sDLvXxdhg0Qe8EZviGSuqzR9qOiKh4MhFYGdBBcqRNzdmYeAdeRzOW2mM9yil4RftUQ7sUOA== + +"@edge-runtime/primitives@4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@edge-runtime/primitives/-/primitives-4.1.0.tgz#43c6e793362f3333acf0955a75b5735b34035494" + integrity sha512-Vw0lbJ2lvRUqc7/soqygUX216Xb8T3WBZ987oywz6aJqRxcwSVWwr9e+Nqo2m9bxobA9mdbWNNoRY6S9eko1EQ== + +"@edge-runtime/vm@3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@edge-runtime/vm/-/vm-3.2.0.tgz#8a735241d14e9fdad85497b8b17d0ea157df4710" + integrity sha512-0dEVyRLM/lG4gp1R/Ik5bfPl/1wX00xFwd5KcNH602tzBa09oF7pbTKETEhR1GjZ75K6OJnYFu8II2dyMhONMw== + dependencies: + "@edge-runtime/primitives" "4.1.0" "@esbuild/aix-ppc64@0.20.2": version "0.20.2" @@ -166,6 +195,11 @@ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== +"@fastify/busboy@^2.0.0": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d" + integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA== + "@humanwhocodes/config-array@^0.11.14": version "0.11.14" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" @@ -185,6 +219,39 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@mapbox/node-pre-gyp@^1.0.5": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz#417db42b7f5323d79e93b34a6d7a2a12c0df43fa" + integrity sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ== + dependencies: + detect-libc "^2.0.0" + https-proxy-agent "^5.0.0" + make-dir "^3.1.0" + node-fetch "^2.6.7" + nopt "^5.0.0" + npmlog "^5.0.1" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.11" + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -267,6 +334,14 @@ resolved "https://registry.yarnpkg.com/@rgrove/parse-xml/-/parse-xml-3.0.0.tgz#29d45eadeb6c9a701038cfb9fab2356a7bdc71d5" integrity sha512-GFGDywRwGbuGq9yeL8wTjjLOsZ5Ps4O5tQ71eDcAfaZrZeA7Oe8QJzrnmFgplWtnoaBIBaFBB3n5Ht9iU4jLLw== +"@rollup/pluginutils@^4.0.0": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz#e6c6c3aba0744edce3fb2074922d3776c0af2a6d" + integrity sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ== + dependencies: + estree-walker "^2.0.1" + picomatch "^2.2.2" + "@rollup/rollup-android-arm-eabi@4.17.2": version "4.17.2" resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz#1a32112822660ee104c5dd3a7c595e26100d4c2d" @@ -347,6 +422,11 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.17.2.tgz#5a2d08b81e8064b34242d5cc9973ef8dd1e60503" integrity sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w== +"@sinclair/typebox@0.25.24": + version "0.25.24" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" + integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== + "@stream-io/escape-string-regexp@^5.0.1": version "5.0.1" resolved "https://registry.yarnpkg.com/@stream-io/escape-string-regexp/-/escape-string-regexp-5.0.1.tgz#362505c92799fea6afe4e369993fbbda8690cc37" @@ -448,6 +528,41 @@ dependencies: "@swc/counter" "^0.1.3" +"@tootallnate/once@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + +"@ts-morph/common@~0.11.0": + version "0.11.1" + resolved "https://registry.yarnpkg.com/@ts-morph/common/-/common-0.11.1.tgz#281af2a0642b19354d8aa07a0d50dfdb4aa8164e" + integrity sha512-7hWZS0NRpEsNV8vWJzg7FEz6V8MaLNeJOmwmghqUXTpzk16V1LLZhdo+4QvE/+zv4cVci0OviuJFnqhEfoV3+g== + dependencies: + fast-glob "^3.2.7" + minimatch "^3.0.4" + mkdirp "^1.0.4" + path-browserify "^1.0.1" + +"@tsconfig/node10@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" + integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + "@types/debug@^4.0.0": version "4.1.12" resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" @@ -474,7 +589,7 @@ dependencies: "@types/unist" "*" -"@types/json-schema@^7.0.15": +"@types/json-schema@^7.0.15", "@types/json-schema@^7.0.6": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== @@ -498,6 +613,11 @@ resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== +"@types/node@16.18.11": + version "16.18.11" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.11.tgz#cbb15c12ca7c16c85a72b6bdc4d4b01151bb3cae" + integrity sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA== + "@types/prop-types@*", "@types/prop-types@^15.0.0": version "15.7.12" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" @@ -630,6 +750,184 @@ resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== +"@vercel/build-utils@8.3.6": + version "8.3.6" + resolved "https://registry.yarnpkg.com/@vercel/build-utils/-/build-utils-8.3.6.tgz#f85ebb753433500f177c04c0f4c784108a4afda8" + integrity sha512-EPwr8tXu41aoXg9QBiF98clu5AHbKtwbp3SeX/W6c8L0fhLwiT+H/s3WDuOL/UMz0TT3B8JAdY4PZioWNEAf6g== + +"@vercel/error-utils@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@vercel/error-utils/-/error-utils-2.0.2.tgz#d75ccce100dbdfc9cb85700767b59d4257a91113" + integrity sha512-Sj0LFafGpYr6pfCqrQ82X6ukRl5qpmVrHM/191kNYFqkkB9YkjlMAj6QcEsvCG259x4QZ7Tya++0AB85NDPbKQ== + +"@vercel/fun@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@vercel/fun/-/fun-1.1.0.tgz#5bac83585a736b6bfe4616017fe5f0a46562c3ba" + integrity sha512-SpuPAo+MlAYMtcMcC0plx7Tv4Mp7SQhJJj1iIENlOnABL24kxHpL09XLQMGzZIzIW7upR8c3edwgfpRtp+dhVw== + dependencies: + "@tootallnate/once" "2.0.0" + async-listen "1.2.0" + debug "4.1.1" + execa "3.2.0" + fs-extra "8.1.0" + generic-pool "3.4.2" + micro "9.3.5-canary.3" + ms "2.1.1" + node-fetch "2.6.7" + path-match "1.2.4" + promisepipe "3.0.0" + semver "7.3.5" + stat-mode "0.3.0" + stream-to-promise "2.2.0" + tar "4.4.18" + tree-kill "1.2.2" + uid-promise "1.0.0" + uuid "3.3.2" + xdg-app-paths "5.1.0" + yauzl-promise "2.1.3" + +"@vercel/gatsby-plugin-vercel-analytics@1.0.11": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@vercel/gatsby-plugin-vercel-analytics/-/gatsby-plugin-vercel-analytics-1.0.11.tgz#07e6a02665c340ad31ad9d9d3b0df00a30a32aed" + integrity sha512-iTEA0vY6RBPuEzkwUTVzSHDATo1aF6bdLLspI68mQ/BTbi5UQEGjpjyzdKOVcSYApDtFU6M6vypZ1t4vIEnHvw== + dependencies: + web-vitals "0.2.4" + +"@vercel/gatsby-plugin-vercel-builder@2.0.40": + version "2.0.40" + resolved "https://registry.yarnpkg.com/@vercel/gatsby-plugin-vercel-builder/-/gatsby-plugin-vercel-builder-2.0.40.tgz#b67f48b84a4c3d77bd1801bf990fda3c23e3ea4f" + integrity sha512-j3pZch8Qk2jfM87+dXX+xZXtdD+T2cMOmHhQWzO4oX3issxfBkkk2mAmY4o3Cxry5Xxe5iDQo6VsvY2IrWpCuA== + dependencies: + "@sinclair/typebox" "0.25.24" + "@vercel/build-utils" "8.3.6" + "@vercel/routing-utils" "3.1.0" + esbuild "0.14.47" + etag "1.8.1" + fs-extra "11.1.0" + +"@vercel/go@3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@vercel/go/-/go-3.1.1.tgz#0894a836ef000e90ef78cee02544dc975dec6bc4" + integrity sha512-mrzomNYltxkjvtUmaYry5YEyvwTz6c/QQHE5Gr/pPGRIniUiP6T6OFOJ49RBN7e6pRXaNzHPVuidiuBhvHh5+Q== + +"@vercel/hydrogen@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@vercel/hydrogen/-/hydrogen-1.0.4.tgz#77dd94c86e967d587a929ef3d74e15beea1f4b9b" + integrity sha512-Sc0lpmI/J6O3o2cL75k8klL7ir2gi6kYI92O5+MrR3hh4fwz/atUIL9UWsTGuFjKTm69VAoJrmn3VKf0/0SGLw== + dependencies: + "@vercel/static-config" "3.0.0" + ts-morph "12.0.0" + +"@vercel/next@4.3.6": + version "4.3.6" + resolved "https://registry.yarnpkg.com/@vercel/next/-/next-4.3.6.tgz#f8bfa3f1088adc2a2b3cc3ebe4100776636c0cbc" + integrity sha512-qUHp79xX07qYtz7DGSogyWgEMrf+eu/IGV/92YnVA1xzDBogIFc8XFvMlN8QwDrsWWsR+I2eMSiGD+P8znlsaA== + dependencies: + "@vercel/nft" "0.27.3" + +"@vercel/nft@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@vercel/nft/-/nft-0.27.3.tgz#03bc09fb0d7bd386c810ec0908a7c853ae73b999" + integrity sha512-oySTdDSzUAFDXpsSLk9Q943o+/Yu/+TCFxnehpFQEf/3khi2stMpTHPVNwFdvZq/Z4Ky93lE+MGHpXCRpMkSCA== + dependencies: + "@mapbox/node-pre-gyp" "^1.0.5" + "@rollup/pluginutils" "^4.0.0" + acorn "^8.6.0" + acorn-import-attributes "^1.9.5" + async-sema "^3.1.1" + bindings "^1.4.0" + estree-walker "2.0.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + micromatch "^4.0.2" + node-gyp-build "^4.2.2" + resolve-from "^5.0.0" + +"@vercel/node@3.2.8": + version "3.2.8" + resolved "https://registry.yarnpkg.com/@vercel/node/-/node-3.2.8.tgz#03ea22bea999c21ecb24cf40587ad26a987b8b12" + integrity sha512-mINg3ab1FHIqupZlLVpmCvyqGtkafnyNesgs7ZoCbNxqbb4ZrHtPj1kHv9cvTrFlDkFapkV/Ez8nbSsHeAxtOw== + dependencies: + "@edge-runtime/node-utils" "2.3.0" + "@edge-runtime/primitives" "4.1.0" + "@edge-runtime/vm" "3.2.0" + "@types/node" "16.18.11" + "@vercel/build-utils" "8.3.6" + "@vercel/error-utils" "2.0.2" + "@vercel/nft" "0.27.3" + "@vercel/static-config" "3.0.0" + async-listen "3.0.0" + cjs-module-lexer "1.2.3" + edge-runtime "2.5.9" + es-module-lexer "1.4.1" + esbuild "0.14.47" + etag "1.8.1" + node-fetch "2.6.9" + path-to-regexp "6.2.1" + ts-morph "12.0.0" + ts-node "10.9.1" + typescript "4.9.5" + undici "5.28.4" + +"@vercel/python@4.3.1": + version "4.3.1" + resolved "https://registry.yarnpkg.com/@vercel/python/-/python-4.3.1.tgz#7c5fbe63f34ccaaf9fb8e2e099105d70d374db5e" + integrity sha512-pWRApBwUsAQJS8oZ7eKMiaBGbYJO71qw2CZqDFvkTj34FNBZtNIUcWSmqGfJJY5m2pU/9wt8z1CnKIyT9dstog== + +"@vercel/redwood@2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@vercel/redwood/-/redwood-2.1.3.tgz#770a8edc076e11a2fedf5b4f93adb541c4b6d52b" + integrity sha512-lpsdQSHS2hvSX29/rJNm4q38dVXKstS4MVg875KE6zyXpACwviXuet0Cadyv0E60w7f2B6Ra+nJMpwKz6oJ5xg== + dependencies: + "@vercel/nft" "0.27.3" + "@vercel/routing-utils" "3.1.0" + "@vercel/static-config" "3.0.0" + semver "6.3.1" + ts-morph "12.0.0" + +"@vercel/remix-builder@2.2.3": + version "2.2.3" + resolved "https://registry.yarnpkg.com/@vercel/remix-builder/-/remix-builder-2.2.3.tgz#b496825bb0e67f7d0cc773f04b6cbc316bc192e2" + integrity sha512-rXb0cgCIe8xCSl6gw+j5cjMEcmgQc5nbnpyMuaQ8+lRBSN0eEl8RkufkVQ4FblGQbnPnPFBCmraUx58HxKxfZw== + dependencies: + "@vercel/error-utils" "2.0.2" + "@vercel/nft" "0.27.3" + "@vercel/static-config" "3.0.0" + ts-morph "12.0.0" + +"@vercel/routing-utils@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@vercel/routing-utils/-/routing-utils-3.1.0.tgz#6a71903f4106006b2cb52add9d3b708b59acaaaf" + integrity sha512-Ci5xTjVTJY/JLZXpCXpLehMft97i9fH34nu9PGav6DtwkVUF6TOPX86U0W0niQjMZ5n6/ZP0BwcJK2LOozKaGw== + dependencies: + path-to-regexp "6.1.0" + optionalDependencies: + ajv "^6.0.0" + +"@vercel/ruby@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@vercel/ruby/-/ruby-2.1.0.tgz#431400276bcb131ef0b9f6cad2e4242557b921a4" + integrity sha512-UZYwlSEEfVnfzTmgkD+kxex9/gkZGt7unOWNyWFN7V/ZnZSsGBUgv6hXLnwejdRi3EztgRQEBd1kUKlXdIeC0Q== + +"@vercel/static-build@2.5.18": + version "2.5.18" + resolved "https://registry.yarnpkg.com/@vercel/static-build/-/static-build-2.5.18.tgz#f350e45138277fb472df37b74c1562ce60416b00" + integrity sha512-UgF/wrx5j07PMidvCVTjlTw1C47Ly+tpWihQyAH42xzf9BHtM+8S9UwOPdM5GYhtBuq2fmpPxFi9DCQ5sg4g7Q== + dependencies: + "@vercel/gatsby-plugin-vercel-analytics" "1.0.11" + "@vercel/gatsby-plugin-vercel-builder" "2.0.40" + "@vercel/static-config" "3.0.0" + ts-morph "12.0.0" + +"@vercel/static-config@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@vercel/static-config/-/static-config-3.0.0.tgz#2bd56aa08d1293f0982ca3a5923412550bf64bfe" + integrity sha512-2qtvcBJ1bGY0dYGYh3iM7yGKkk971FujLEDXzuW5wcZsPr1GSEjO/w2iSr3qve6nDDtBImsGoDEnus5FI4+fIw== + dependencies: + ajv "8.6.3" + json-schema-to-ts "1.6.4" + ts-morph "12.0.0" + "@virtuoso.dev/react-urx@^0.2.12": version "0.2.13" resolved "https://registry.yarnpkg.com/@virtuoso.dev/react-urx/-/react-urx-0.2.13.tgz#e2cfc42d259d2a002695e7517d34cb97b64ee9c4" @@ -649,17 +947,51 @@ dependencies: "@swc/core" "^1.3.107" +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +acorn-import-attributes@^1.9.5: + version "1.9.5" + resolved "https://registry.yarnpkg.com/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz#7eb1557b1ba05ef18b5ed0ec67591bfab04688ef" + integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ== + acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.9.0: - version "8.11.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" - integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== +acorn-walk@^8.1.1: + version "8.3.3" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.3.tgz#9caeac29eefaa0c41e3d4c65137de4d6f34df43e" + integrity sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw== + dependencies: + acorn "^8.11.0" + +acorn@^8.11.0, acorn@^8.4.1, acorn@^8.6.0, acorn@^8.9.0: + version "8.12.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" + integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== -ajv@^6.12.4: +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +ajv@8.6.3: + version "8.6.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.3.tgz#11a66527761dc3e9a3845ea775d2d3c0414e8764" + integrity sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ajv@^6.0.0, ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -681,7 +1013,12 @@ ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -anymatch@~3.1.2: +any-promise@^1.1.0, any-promise@~1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + +anymatch@~3.1.1, anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== @@ -689,6 +1026,29 @@ anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" +"aproba@^1.0.3 || ^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + +are-we-there-yet@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c" + integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + +arg@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.0.tgz#583c518199419e0037abb74062c37f8519e575f0" + integrity sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg== + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + argparse@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" @@ -699,6 +1059,26 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== +async-listen@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/async-listen/-/async-listen-1.2.0.tgz#861ab6f92e1703ba54498b10ddb9b5da7b69f363" + integrity sha512-CcEtRh/oc9Jc4uWeUwdpG/+Mb2YUHKmdaTf0gUr7Wa+bfp4xx70HOb3RuSTJMvqKNB1TkdTfjLdrcz2X4rkkZA== + +async-listen@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/async-listen/-/async-listen-3.0.0.tgz#2e5941390b7d8c753d4dbe94bc6aecbdde52ec5e" + integrity sha512-V+SsTpDqkrWTimiotsyl33ePSjA5/KrithwupuvJ6ztsqPvGv6ge4OredFhPffVXiLN/QUWvE0XcqJaYgt6fOg== + +async-listen@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/async-listen/-/async-listen-3.0.1.tgz#cbe4edeace2b93ebf5cf8092899ee139457978b7" + integrity sha512-cWMaNwUJnf37C/S5TfCkk/15MwbPRwVYALA2jtjkbHjCmAPiDXyNJy2q3p1KAZzDLHAWyarUWSujUoHR4pEgrA== + +async-sema@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/async-sema/-/async-sema-3.1.1.tgz#e527c08758a0f8f6f9f15f799a173ff3c40ea808" + integrity sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg== + attr-accept@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/attr-accept/-/attr-accept-2.2.2.tgz#646613809660110749e92f2c10833b70968d929b" @@ -724,6 +1104,13 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== +bindings@^1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -739,12 +1126,22 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - fill-range "^7.0.1" + fill-range "^7.1.1" + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== callsites@^3.0.0: version "3.1.0" @@ -784,6 +1181,21 @@ character-reference-invalid@^1.0.0: resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== +chokidar@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450" + integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.3.0" + optionalDependencies: + fsevents "~2.1.2" + "chokidar@>=3.0.0 <4.0.0": version "3.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" @@ -799,11 +1211,31 @@ character-reference-invalid@^1.0.0: optionalDependencies: fsevents "~2.3.2" +chownr@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +cjs-module-lexer@1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" + integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== + clsx@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== +code-block-writer@^10.1.1: + version "10.1.1" + resolved "https://registry.yarnpkg.com/code-block-writer/-/code-block-writer-10.1.1.tgz#ad5684ed4bfb2b0783c8b131281ae84ee640a42f" + integrity sha512-67ueh2IRGst/51p0n6FvPrnRjAGHY5F8xdjkgrYE7DDzpJe6qA07RYQ9VcoUeo5ATOjSOiWpSL3SWBRRbempMw== + color-convert@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" @@ -816,6 +1248,11 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-support@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + comma-separated-tokens@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" @@ -826,7 +1263,27 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -cross-spawn@^7.0.2: +console-control-strings@^1.0.0, console-control-strings@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== + +content-type@1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-hrtime@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/convert-hrtime/-/convert-hrtime-3.0.0.tgz#62c7593f5809ca10be8da858a6d2f702bcda00aa" + integrity sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA== + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-spawn@^7.0.0, cross-spawn@^7.0.2: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -845,13 +1302,20 @@ dayjs@^1.10.4: resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.11.tgz#dfe0e9d54c5f8b68ccf8ca5f72ac603e7e5ed59e" integrity sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg== -debug@^4.0.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== +debug@4, debug@^4.0.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" + integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== dependencies: ms "2.1.2" +debug@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + decode-named-character-reference@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz#daabac9690874c394c81e4162a0304b35d824f0e" @@ -869,11 +1333,31 @@ deepmerge@^4.0.0: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + dequal@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== +detect-libc@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" + integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + diff@^5.0.0: version "5.2.0" resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" @@ -923,16 +1407,181 @@ domutils@^3.1.0: domelementtype "^2.3.0" domhandler "^5.0.3" +edge-runtime@2.5.9: + version "2.5.9" + resolved "https://registry.yarnpkg.com/edge-runtime/-/edge-runtime-2.5.9.tgz#9daeb329f0339b8377483f230789b3d68f45f1d9" + integrity sha512-pk+k0oK0PVXdlT4oRp4lwh+unuKB7Ng4iZ2HB+EZ7QCEQizX360Rp/F4aRpgpRgdP2ufB35N+1KppHmYjqIGSg== + dependencies: + "@edge-runtime/format" "2.2.1" + "@edge-runtime/ponyfill" "2.4.2" + "@edge-runtime/vm" "3.2.0" + async-listen "3.0.1" + mri "1.2.0" + picocolors "1.0.0" + pretty-ms "7.0.1" + signal-exit "4.0.2" + time-span "4.0.0" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + emoji-regex@^9.2.0: version "9.2.2" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +end-of-stream@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.1.0.tgz#e9353258baa9108965efc41cb0ef8ade2f3cfb07" + integrity sha512-EoulkdKF/1xa92q25PbjuDcgJ9RDHYU2Rs3SCIvs2/dSQ3BpmxneNHmA/M7fe60M3PrV7nNGTTNbkK62l6vXiQ== + dependencies: + once "~1.3.0" + entities@^4.2.0, entities@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== +es-module-lexer@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.4.1.tgz#41ea21b43908fe6a287ffcbe4300f790555331f5" + integrity sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w== + +esbuild-android-64@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.47.tgz#ef95b42c67bcf4268c869153fa3ad1466c4cea6b" + integrity sha512-R13Bd9+tqLVFndncMHssZrPWe6/0Kpv2/dt4aA69soX4PRxlzsVpCvoJeFE8sOEoeVEiBkI0myjlkDodXlHa0g== + +esbuild-android-arm64@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.47.tgz#4ebd7ce9fb250b4695faa3ee46fd3b0754ecd9e6" + integrity sha512-OkwOjj7ts4lBp/TL6hdd8HftIzOy/pdtbrNA4+0oVWgGG64HrdVzAF5gxtJufAPOsEjkyh1oIYvKAUinKKQRSQ== + +esbuild-darwin-64@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.47.tgz#e0da6c244f497192f951807f003f6a423ed23188" + integrity sha512-R6oaW0y5/u6Eccti/TS6c/2c1xYTb1izwK3gajJwi4vIfNs1s8B1dQzI1UiC9T61YovOQVuePDcfqHLT3mUZJA== + +esbuild-darwin-arm64@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.47.tgz#cd40fd49a672fca581ed202834239dfe540a9028" + integrity sha512-seCmearlQyvdvM/noz1L9+qblC5vcBrhUaOoLEDDoLInF/VQ9IkobGiLlyTPYP5dW1YD4LXhtBgOyevoIHGGnw== + +esbuild-freebsd-64@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.47.tgz#8da6a14c095b29c01fc8087a16cb7906debc2d67" + integrity sha512-ZH8K2Q8/Ux5kXXvQMDsJcxvkIwut69KVrYQhza/ptkW50DC089bCVrJZZ3sKzIoOx+YPTrmsZvqeZERjyYrlvQ== + +esbuild-freebsd-arm64@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.47.tgz#ad31f9c92817ff8f33fd253af7ab5122dc1b83f6" + integrity sha512-ZJMQAJQsIOhn3XTm7MPQfCzEu5b9STNC+s90zMWe2afy9EwnHV7Ov7ohEMv2lyWlc2pjqLW8QJnz2r0KZmeAEQ== + +esbuild-linux-32@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.47.tgz#de085e4db2e692ea30c71208ccc23fdcf5196c58" + integrity sha512-FxZOCKoEDPRYvq300lsWCTv1kcHgiiZfNrPtEhFAiqD7QZaXrad8LxyJ8fXGcWzIFzRiYZVtB3ttvITBvAFhKw== + +esbuild-linux-64@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.47.tgz#2a9321bbccb01f01b04cebfcfccbabeba3658ba1" + integrity sha512-nFNOk9vWVfvWYF9YNYksZptgQAdstnDCMtR6m42l5Wfugbzu11VpMCY9XrD4yFxvPo9zmzcoUL/88y0lfJZJJw== + +esbuild-linux-arm64@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.47.tgz#b9da7b6fc4b0ca7a13363a0c5b7bb927e4bc535a" + integrity sha512-ywfme6HVrhWcevzmsufjd4iT3PxTfCX9HOdxA7Hd+/ZM23Y9nXeb+vG6AyA6jgq/JovkcqRHcL9XwRNpWG6XRw== + +esbuild-linux-arm@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.47.tgz#56fec2a09b9561c337059d4af53625142aded853" + integrity sha512-ZGE1Bqg/gPRXrBpgpvH81tQHpiaGxa8c9Rx/XOylkIl2ypLuOcawXEAo8ls+5DFCcRGt/o3sV+PzpAFZobOsmA== + +esbuild-linux-mips64le@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.47.tgz#9db21561f8f22ed79ef2aedb7bbef082b46cf823" + integrity sha512-mg3D8YndZ1LvUiEdDYR3OsmeyAew4MA/dvaEJxvyygahWmpv1SlEEnhEZlhPokjsUMfRagzsEF/d/2XF+kTQGg== + +esbuild-linux-ppc64le@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.47.tgz#dc3a3da321222b11e96e50efafec9d2de408198b" + integrity sha512-WER+f3+szmnZiWoK6AsrTKGoJoErG2LlauSmk73LEZFQ/iWC+KhhDsOkn1xBUpzXWsxN9THmQFltLoaFEH8F8w== + +esbuild-linux-riscv64@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.47.tgz#9bd6dcd3dca6c0357084ecd06e1d2d4bf105335f" + integrity sha512-1fI6bP3A3rvI9BsaaXbMoaOjLE3lVkJtLxsgLHqlBhLlBVY7UqffWBvkrX/9zfPhhVMd9ZRFiaqXnB1T7BsL2g== + +esbuild-linux-s390x@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.47.tgz#a458af939b52f2cd32fc561410d441a51f69d41f" + integrity sha512-eZrWzy0xFAhki1CWRGnhsHVz7IlSKX6yT2tj2Eg8lhAwlRE5E96Hsb0M1mPSE1dHGpt1QVwwVivXIAacF/G6mw== + +esbuild-netbsd-64@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.47.tgz#6388e785d7e7e4420cb01348d7483ab511b16aa8" + integrity sha512-Qjdjr+KQQVH5Q2Q1r6HBYswFTToPpss3gqCiSw2Fpq/ua8+eXSQyAMG+UvULPqXceOwpnPo4smyZyHdlkcPppQ== + +esbuild-openbsd-64@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.47.tgz#309af806db561aa886c445344d1aacab850dbdc5" + integrity sha512-QpgN8ofL7B9z8g5zZqJE+eFvD1LehRlxr25PBkjyyasakm4599iroUpaj96rdqRlO2ShuyqwJdr+oNqWwTUmQw== + +esbuild-sunos-64@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.47.tgz#3f19612dcdb89ba6c65283a7ff6e16f8afbf8aaa" + integrity sha512-uOeSgLUwukLioAJOiGYm3kNl+1wJjgJA8R671GYgcPgCx7QR73zfvYqXFFcIO93/nBdIbt5hd8RItqbbf3HtAQ== + +esbuild-windows-32@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.47.tgz#a92d279c8458d5dc319abcfeb30aa49e8f2e6f7f" + integrity sha512-H0fWsLTp2WBfKLBgwYT4OTfFly4Im/8B5f3ojDv1Kx//kiubVY0IQunP2Koc/fr/0wI7hj3IiBDbSrmKlrNgLQ== + +esbuild-windows-64@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.47.tgz#2564c3fcf0c23d701edb71af8c52d3be4cec5f8a" + integrity sha512-/Pk5jIEH34T68r8PweKRi77W49KwanZ8X6lr3vDAtOlH5EumPE4pBHqkCUdELanvsT14yMXLQ/C/8XPi1pAtkQ== + +esbuild-windows-arm64@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.47.tgz#86d9db1a22d83360f726ac5fba41c2f625db6878" + integrity sha512-HFSW2lnp62fl86/qPQlqw6asIwCnEsEoNIL1h2uVMgakddf+vUuMcCbtUY1i8sst7KkgHrVKCJQB33YhhOweCQ== + +esbuild@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.47.tgz#0d6415f6bd8eb9e73a58f7f9ae04c5276cda0e4d" + integrity sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA== + optionalDependencies: + esbuild-android-64 "0.14.47" + esbuild-android-arm64 "0.14.47" + esbuild-darwin-64 "0.14.47" + esbuild-darwin-arm64 "0.14.47" + esbuild-freebsd-64 "0.14.47" + esbuild-freebsd-arm64 "0.14.47" + esbuild-linux-32 "0.14.47" + esbuild-linux-64 "0.14.47" + esbuild-linux-arm "0.14.47" + esbuild-linux-arm64 "0.14.47" + esbuild-linux-mips64le "0.14.47" + esbuild-linux-ppc64le "0.14.47" + esbuild-linux-riscv64 "0.14.47" + esbuild-linux-s390x "0.14.47" + esbuild-netbsd-64 "0.14.47" + esbuild-openbsd-64 "0.14.47" + esbuild-sunos-64 "0.14.47" + esbuild-windows-32 "0.14.47" + esbuild-windows-64 "0.14.47" + esbuild-windows-arm64 "0.14.47" + esbuild@^0.20.1: version "0.20.2" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.20.2.tgz#9d6b2386561766ee6b5a55196c6d766d28c87ea1" @@ -1067,11 +1716,42 @@ estraverse@^5.1.0, estraverse@^5.2.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== +estree-walker@2.0.2, estree-walker@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +etag@1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +events-intercept@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/events-intercept/-/events-intercept-2.0.0.tgz#adbf38681c5a4b2011c41ee41f61a34cba448897" + integrity sha512-blk1va0zol9QOrdZt0rFXo5KMkNPVSp92Eju/Qz8THwKWKRKeE0T8Br/1aW6+Edkyq9xHYgYxn2QtOnUKPUp+Q== + +execa@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-3.2.0.tgz#18326b79c7ab7fbd6610fd900c1b9e95fa48f90a" + integrity sha512-kJJfVbI/lZE1PZYDI5VPxp8zXPO9rtxOkhpZ0jMKha56AI9y2gGVC6bkukStQf0ka5Rh15BA5m7cCCH4jmHqkw== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + p-finally "^2.0.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + extend@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" @@ -1082,7 +1762,7 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^3.2.9: +fast-glob@^3.2.7, fast-glob@^3.2.9: version "3.3.2" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== @@ -1110,6 +1790,13 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== + dependencies: + pend "~1.2.0" + file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -1124,10 +1811,15 @@ file-selector@^0.6.0: dependencies: tslib "^2.4.0" -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" @@ -1158,17 +1850,81 @@ flatted@^3.2.9: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== +fs-extra@11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.0.tgz#5784b102104433bb0e090f48bfc4a30742c357ed" + integrity sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-minipass@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" + integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== + dependencies: + minipass "^2.6.0" + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== +fsevents@~2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" + integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== + fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== -glob-parent@^5.1.2, glob-parent@~5.1.2: +gauge@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395" + integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.2" + console-control-strings "^1.0.0" + has-unicode "^2.0.1" + object-assign "^4.1.1" + signal-exit "^3.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.2" + +generic-pool@3.4.2: + version "3.4.2" + resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-3.4.2.tgz#92ff7196520d670839a67308092a12aadf2f6a59" + integrity sha512-H7cUpwCQSiJmAHM4c/aFu6fUfrhWXW1ncyh8ftxEPMu6AiYkHw9K8br720TGPZJbk5eOH2bynjZD1yPvdDAmag== + +get-stream@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -1213,6 +1969,11 @@ globby@^11.1.0: merge2 "^1.4.1" slash "^3.0.0" +graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + graphemer@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" @@ -1223,6 +1984,11 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +has-unicode@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== + hast-util-find-and-replace@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/hast-util-find-and-replace/-/hast-util-find-and-replace-5.0.1.tgz#6dec7224659c2855555a7e4bb6b855a37729a4bc" @@ -1264,6 +2030,38 @@ htmlparser2@^9.0: domutils "^3.1.0" entities "^4.5.0" +http-errors@1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.4.0.tgz#6c0242dea6b3df7afda153c71089b31c6e82aabf" + integrity sha512-oLjPqve1tuOl5aRhv8GK5eHpqP1C9fb+Ol+XTLjKfLltE44zdDbEdjPSbU7Ch5rSNsVFqZn97SrMmZLdu1/YMw== + dependencies: + inherits "2.0.1" + statuses ">= 1.2.1 < 2" + +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + i18next@^21.6.14: version "21.10.0" resolved "https://registry.yarnpkg.com/i18next/-/i18next-21.10.0.tgz#85429af55fdca4858345d0e16b584ec29520197d" @@ -1283,6 +2081,13 @@ ical.js@^1.2.2: resolved "https://registry.yarnpkg.com/ical.js/-/ical.js-1.5.0.tgz#23213accd1d8f7248d01705acb06270a70d20662" integrity sha512-7ZxMkogUkkaCx810yp0ZGKvq1ZpRgJeornPttpoxe6nYZ3NLesZe1wWMXDdwTkj/b5NtXT+Y16Aakph/ao98ZQ== +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + ignore@^5.2.0, ignore@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" @@ -1314,11 +2119,16 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2: +inherits@2, inherits@2.0.4, inherits@^2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA== + inline-style-parser@0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" @@ -1359,6 +2169,11 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -1391,16 +2206,21 @@ is-plain-obj@^4.0.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -isomorphic-ws@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" - integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== - "js-tokens@^3.0.0 || ^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -1418,16 +2238,45 @@ json-buffer@3.0.1: resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== +json-schema-to-ts@1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/json-schema-to-ts/-/json-schema-to-ts-1.6.4.tgz#63e4fe854dff093923be9e8b59b39ee9a7971ba4" + integrity sha512-pR4yQ9DHz6itqswtHCm26mw45FSNfQ9rEQjosaZErhn5J3J2sIViQiz8rDaezjKAhFGpmsoczYVBgGHzFw/stA== + dependencies: + "@types/json-schema" "^7.0.6" + ts-toolbelt "^6.15.5" + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + keyv@^4.5.3: version "4.5.4" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" @@ -1529,6 +2378,18 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + markdown-table@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.3.tgz#e6331d30e493127e031dd385488b5bd326e4a6bd" @@ -1700,11 +2561,25 @@ memoize-one@^5.1.1: resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== +micro@9.3.5-canary.3: + version "9.3.5-canary.3" + resolved "https://registry.yarnpkg.com/micro/-/micro-9.3.5-canary.3.tgz#e957598abb9ab05aea8453e0150a521fe22135c3" + integrity sha512-viYIo9PefV+w9dvoIBh1gI44Mvx1BOk67B4BpC2QK77qdY0xZF0Q+vWLt/BII6cLkIc8rLmSIcJaB/OrXXKe1g== + dependencies: + arg "4.1.0" + content-type "1.0.4" + raw-body "2.4.1" + micromark-core-commonmark@^1.0.0, micromark-core-commonmark@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz#1386628df59946b2d39fb2edfd10f3e8e0a75bb8" @@ -1986,15 +2861,20 @@ micromark@~2.11.0: debug "^4.0.0" parse-entities "^2.0.0" -micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== +micromatch@^4.0.2, micromatch@^4.0.4: + version "4.0.7" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" + integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== dependencies: - braces "^3.0.2" + braces "^3.0.3" picomatch "^2.3.1" -minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -2008,6 +2888,58 @@ minimatch@^9.0.4: dependencies: brace-expansion "^2.0.1" +minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +minipass@^2.6.0, minipass@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" + integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minipass@^3.0.0: + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + +minizlib@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" + integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== + dependencies: + minipass "^2.9.0" + +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mkdirp@^0.5.5: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +mkdirp@^1.0.3, mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + mml-react@^0.4.7: version "0.4.7" resolved "https://registry.yarnpkg.com/mml-react/-/mml-react-0.4.7.tgz#c0646c4647ecdcf89a0818f6e02b2adc50712c21" @@ -2022,16 +2954,26 @@ mml-react@^0.4.7: react-markdown "^5.0.3" react-virtuoso "^2.10.2" -mri@^1.1.0: +mri@1.2.0, mri@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + nanoid@^3.3.4, nanoid@^3.3.7: version "3.3.7" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" @@ -2042,23 +2984,87 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== +node-fetch@2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + +node-fetch@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6" + integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== + dependencies: + whatwg-url "^5.0.0" + +node-fetch@^2.6.7: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + +node-gyp-build@^4.2.2: + version "4.8.1" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.1.tgz#976d3ad905e71b76086f4f0b0d3637fe79b6cda5" + integrity sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw== + +nopt@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" + integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== + dependencies: + abbrev "1" + normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +npm-run-path@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +npmlog@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" + integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== + dependencies: + are-we-there-yet "^2.0.0" + console-control-strings "^1.1.0" + gauge "^3.0.0" + set-blocking "^2.0.0" + object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -once@^1.3.0: +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" +once@~1.3.0: + version "1.3.3" + resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" + integrity sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w== + dependencies: + wrappy "1" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + optionator@^0.9.3: version "0.9.4" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" @@ -2071,6 +3077,16 @@ optionator@^0.9.3: type-check "^0.4.0" word-wrap "^1.2.5" +os-paths@^4.0.1: + version "4.4.0" + resolved "https://registry.yarnpkg.com/os-paths/-/os-paths-4.4.0.tgz#2908b5bcb60cbfe3afb869292281a2a6b2f77ebe" + integrity sha512-wrAwOeXp1RRMFfQY8Sy7VaGVmPocaLwSFOYCGKSyo8qmJ+/yaafCl5BCA1IQZWqFSRBrKDYFeR9d/VyQzfH/jg== + +p-finally@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" + integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== + p-limit@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" @@ -2104,6 +3120,16 @@ parse-entities@^2.0.0: is-decimal "^1.0.0" is-hexadecimal "^1.0.0" +parse-ms@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-2.1.0.tgz#348565a753d4391fa524029956b172cb7753097d" + integrity sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA== + +path-browserify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -2114,22 +3140,52 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-key@^3.1.0: +path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== +path-match@1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/path-match/-/path-match-1.2.4.tgz#a62747f3c7e0c2514762697f24443585b09100ea" + integrity sha512-UWlehEdqu36jmh4h5CWJ7tARp1OEVKGHKm6+dg9qMq5RKUTV5WJrGgaZ3dN2m7WFAXDbjlHzvJvL/IUpy84Ktw== + dependencies: + http-errors "~1.4.0" + path-to-regexp "^1.0.0" + +path-to-regexp@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.1.0.tgz#0b18f88b7a0ce0bfae6a25990c909ab86f512427" + integrity sha512-h9DqehX3zZZDCEm+xbfU0ZmwCGFCAAraPJWMXJ4+v32NjZJilVg3k1TcKsRgIb8IQ/izZSaydDc1OhJCZvs2Dw== + +path-to-regexp@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.2.1.tgz#d54934d6798eb9e5ef14e7af7962c945906918e5" + integrity sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw== + +path-to-regexp@^1.0.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -picocolors@^1.0.0: +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== + +picocolors@1.0.0, picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: +picomatch@^2.0.4, picomatch@^2.0.7, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -2148,6 +3204,18 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== +pretty-ms@7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-7.0.1.tgz#7d903eaab281f7d8e03c66f867e239dc32fb73e8" + integrity sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q== + dependencies: + parse-ms "^2.1.0" + +promisepipe@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/promisepipe/-/promisepipe-3.0.0.tgz#c9b6e5aa861ef5fcce6134f6f75e14f8f30bd3b2" + integrity sha512-V6TbZDJ/ZswevgkDNpGt/YqNCiZP9ASfgU+p83uJE6NrGtvSGoOcHLiDCqkMs2+yg7F5qHdLV8d0aS8O26G/KA== + prop-types@^15.0.0, prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" @@ -2162,6 +3230,14 @@ property-information@^6.0.0: resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.5.0.tgz#6212fbb52ba757e92ef4fb9d657563b933b7ffec" integrity sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig== +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + punycode@^2.1.0: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" @@ -2172,6 +3248,16 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +raw-body@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c" + integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA== + dependencies: + bytes "3.1.0" + http-errors "1.7.3" + iconv-lite "0.4.24" + unpipe "1.0.0" + "react-dom@link:../../node_modules/react-dom": version "0.0.0" uid "" @@ -2282,6 +3368,22 @@ react-virtuoso@^2.10.2, react-virtuoso@^2.16.5: version "0.0.0" uid "" +readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.3.0.tgz#984458d13a1e42e2e9f5841b129e162f369aff17" + integrity sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ== + dependencies: + picomatch "^2.0.7" + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -2330,11 +3432,21 @@ remark-rehype@^10.0.0: mdast-util-to-hast "^12.1.0" unified "^10.0.0" +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -2386,6 +3498,16 @@ sade@^1.7.3: dependencies: mri "^1.1.0" +safe-buffer@^5.1.2, safe-buffer@^5.2.1, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + sass@^1.75.0: version "1.75.0" resolved "https://registry.yarnpkg.com/sass/-/sass-1.75.0.tgz#91bbe87fb02dfcc34e052ddd6ab80f60d392be6c" @@ -2402,13 +3524,33 @@ scheduler@^0.23.0: dependencies: loose-envify "^1.1.0" -semver@^7.6.0: - version "7.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" - integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== +semver@6.3.1, semver@^6.0.0: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@7.3.5: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== dependencies: lru-cache "^6.0.0" +semver@^7.3.5, semver@^7.6.0: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -2421,6 +3563,16 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +signal-exit@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.0.2.tgz#ff55bb1d9ff2114c13b400688fa544ac63c36967" + integrity sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q== + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -2436,10 +3588,52 @@ space-separated-tokens@^2.0.0: resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== +stat-mode@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-0.3.0.tgz#69283b081f851582b328d2a4ace5f591ce52f54b" + integrity sha512-QjMLR0A3WwFY2aZdV0okfFEJB5TRjkggXZjxP3A1RsWsNHNu3YPv8btmtc6iCFZ0Rul3FE93OYogvhOUClU+ng== + +"statuses@>= 1.2.1 < 2", "statuses@>= 1.5.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + "stream-chat-react@link:../..": version "0.0.0" uid "" +stream-to-array@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/stream-to-array/-/stream-to-array-2.3.0.tgz#bbf6b39f5f43ec30bc71babcb37557acecf34353" + integrity sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA== + dependencies: + any-promise "^1.1.0" + +stream-to-promise@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/stream-to-promise/-/stream-to-promise-2.2.0.tgz#b1edb2e1c8cb11289d1b503c08d3f2aef51e650f" + integrity sha512-HAGUASw8NT0k8JvIVutB2Y/9iBk7gpgEyAudXwNJmZERdMITGdajOa4VJfD/kNiA3TppQpTP4J+CtcHwdzKBAw== + dependencies: + any-promise "~1.3.0" + end-of-stream "~1.1.0" + stream-to-array "~2.3.0" + +"string-width@^1.0.2 || 2 || 3 || 4", 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_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -2447,6 +3641,11 @@ strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" @@ -2466,6 +3665,31 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +tar@4.4.18: + version "4.4.18" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.18.tgz#a565090fdcf786ee08ed14b1739179451b3cc476" + integrity sha512-ZuOtqqmkV9RE1+4odd+MhBpibmCxNP6PJhH/h2OqNuotTX7/XHPZQJv2pKvWMplFH9SIZZhitehh6vBH6LO8Pg== + dependencies: + chownr "^1.1.4" + fs-minipass "^1.2.7" + minipass "^2.9.0" + minizlib "^1.3.3" + mkdirp "^0.5.5" + safe-buffer "^5.2.1" + yallist "^3.1.1" + +tar@^6.1.11: + version "6.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" + integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -2476,6 +3700,13 @@ textarea-caret@^3.1.0: resolved "https://registry.yarnpkg.com/textarea-caret/-/textarea-caret-3.1.0.tgz#5d5a35bb035fd06b2ff0e25d5359e97f2655087f" integrity sha512-cXAvzO9pP5CGa6NKx0WYHl+8CHKZs8byMkt3PCJBCmq2a34YA9pO1NrQET5pzeqnBjBdToF5No4rrmkDUgQC2Q== +time-span@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/time-span/-/time-span-4.0.0.tgz#fe74cd50a54e7998712f90ddfe47109040c985c4" + integrity sha512-MyqZCTGLDZ77u4k+jqg4UlrzPTPZ49NDlaekU6uuFaJLzPIN1woaRXCbGeqOfxwc3Y37ZROGAJ614Rdv7Olt+g== + dependencies: + convert-hrtime "^3.0.0" + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -2483,6 +3714,21 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +tree-kill@1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + trim-lines@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" @@ -2503,6 +3749,38 @@ ts-api-utils@^1.3.0: resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== +ts-morph@12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/ts-morph/-/ts-morph-12.0.0.tgz#a601c3538703755cbfa2d42b62c52df73e9dbbd7" + integrity sha512-VHC8XgU2fFW7yO1f/b3mxKDje1vmyzFXHWzOYmKEkCEwcLjDtbdLgBQviqj4ZwP4MJkQtRo6Ha2I29lq/B+VxA== + dependencies: + "@ts-morph/common" "~0.11.0" + code-block-writer "^10.1.1" + +ts-node@10.9.1: + version "10.9.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +ts-toolbelt@^6.15.5: + version "6.15.5" + resolved "https://registry.yarnpkg.com/ts-toolbelt/-/ts-toolbelt-6.15.5.tgz#cb3b43ed725cb63644782c64fbcad7d8f28c0a83" + integrity sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A== + tslib@^2.4.0, tslib@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" @@ -2520,11 +3798,28 @@ type-fest@^0.20.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== +typescript@4.9.5: + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + typescript@^5.4.5: version "5.4.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== +uid-promise@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/uid-promise/-/uid-promise-1.0.0.tgz#68ef7c70a19dea4d637c7e3df2e0e548106f1a37" + integrity sha512-R8375j0qwXyIu/7R0tjdF06/sElHqbmdmWC9M2qQHpEVbvE4I5+38KJI7LUUmQMp7NVq4tKHiBMkT0NFM453Ig== + +undici@5.28.4: + version "5.28.4" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.4.tgz#6b280408edb6a1a604a9b20340f45b422e373068" + integrity sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g== + dependencies: + "@fastify/busboy" "^2.0.0" + unified@^10.0.0: version "10.1.2" resolved "https://registry.yarnpkg.com/unified/-/unified-10.1.2.tgz#b1d64e55dafe1f0b98bb6c719881103ecf6c86df" @@ -2658,6 +3953,21 @@ unist-util-visit@^5.0.0: unist-util-is "^6.0.0" unist-util-visit-parents "^6.0.0" +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + +unpipe@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -2682,6 +3992,16 @@ use-latest@^1.2.1: dependencies: use-isomorphic-layout-effect "^1.1.1" +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +uuid@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== + uvu@^0.5.0: version "0.5.6" resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.6.tgz#2754ca20bcb0bb59b64e9985e84d2e81058502df" @@ -2692,6 +4012,29 @@ uvu@^0.5.0: kleur "^4.0.3" sade "^1.7.3" +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +vercel@^35.2.3: + version "35.2.3" + resolved "https://registry.yarnpkg.com/vercel/-/vercel-35.2.3.tgz#b9938d130118d03520ba2441eec80b691ef2d5c4" + integrity sha512-sfDUnP7dmerNZ/2PrUXLC9dJnJASFMy/UGW7Y2W0LVZbMtwH+jdLnViioRUEQaA2zbkkAipKza6w9rvD4sDvrA== + dependencies: + "@vercel/build-utils" "8.3.6" + "@vercel/fun" "1.1.0" + "@vercel/go" "3.1.1" + "@vercel/hydrogen" "1.0.4" + "@vercel/next" "4.3.6" + "@vercel/node" "3.2.8" + "@vercel/python" "4.3.1" + "@vercel/redwood" "2.1.3" + "@vercel/remix-builder" "2.2.3" + "@vercel/ruby" "2.1.0" + "@vercel/static-build" "2.5.18" + chokidar "3.3.1" + vfile-message@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" @@ -2746,6 +4089,24 @@ warning@^4.0.2: dependencies: loose-envify "^1.0.0" +web-vitals@0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-0.2.4.tgz#ec3df43c834a207fd7cdefd732b2987896e08511" + integrity sha512-6BjspCO9VriYy12z356nL6JBS0GYeEcA457YyRzD+dD6XYCQ75NKhcOHUMHentOE7OcVCIXXDvOm0jKFfQG2Gg== + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -2753,6 +4114,13 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +wide-align@^1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + word-wrap@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" @@ -2763,16 +4131,63 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +xdg-app-paths@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/xdg-app-paths/-/xdg-app-paths-5.1.0.tgz#f52f724f91e88244148c085c09bcd396443d8cae" + integrity sha512-RAQ3WkPf4KTU1A8RtFx3gWywzVKe00tfOPFfl2NDGqbIFENQO4kqAJp7mhQjNj/33W5x5hiWWUdyfPq/5SU3QA== + dependencies: + xdg-portable "^7.0.0" + +xdg-portable@^7.0.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/xdg-portable/-/xdg-portable-7.3.0.tgz#c6b1610de806a2ca1fe65727d5f8402c295d2e96" + integrity sha512-sqMMuL1rc0FmMBOzCpd0yuy9trqF2yTTVe+E9ogwCSWQCdDEtQUwrZPT6AxqtsFGRNxycgncbP/xmOOSPw5ZUw== + dependencies: + os-paths "^4.0.1" + xtend@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== +yallist@^3.0.0, yallist@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +yauzl-clone@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/yauzl-clone/-/yauzl-clone-1.0.4.tgz#8bc6d293b17cc98802bbbed2e289d18e7697c96c" + integrity sha512-igM2RRCf3k8TvZoxR2oguuw4z1xasOnA31joCqHIyLkeWrvAc2Jgay5ISQ2ZplinkoGaJ6orCz56Ey456c5ESA== + dependencies: + events-intercept "^2.0.0" + +yauzl-promise@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/yauzl-promise/-/yauzl-promise-2.1.3.tgz#17467845db89fc6592ca987ca2ecfee8c381ae3d" + integrity sha512-A1pf6fzh6eYkK0L4Qp7g9jzJSDrM6nN0bOn5T0IbY4Yo3w+YkWlHFkJP7mzknMXjqusHFHlKsK2N+4OLsK2MRA== + dependencies: + yauzl "^2.9.1" + yauzl-clone "^1.0.4" + +yauzl@^2.9.1: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" diff --git a/package.json b/package.json index 8ac0fe016..e70dd4918 100644 --- a/package.json +++ b/package.json @@ -130,7 +130,7 @@ "emoji-mart": "^5.4.0", "react": "^18.0.0 || ^17.0.0 || ^16.8.0", "react-dom": "^18.0.0 || ^17.0.0 || ^16.8.0", - "stream-chat": "^8.39.0" + "stream-chat": "^8.40.0" }, "peerDependenciesMeta": { "@breezystack/lamejs": { @@ -171,7 +171,7 @@ "@semantic-release/changelog": "^6.0.2", "@semantic-release/git": "^10.0.1", "@stream-io/rollup-plugin-node-builtins": "^2.1.5", - "@stream-io/stream-chat-css": "5.0.0-rc.2", + "@stream-io/stream-chat-css": "^5.0.0-rc.3", "@testing-library/jest-dom": "^6.1.4", "@testing-library/react": "^13.1.1", "@testing-library/react-hooks": "^8.0.0", @@ -240,7 +240,7 @@ "react-dom": "^18.1.0", "react-test-renderer": "^18.1.0", "semantic-release": "^19.0.5", - "stream-chat": "8.39.0", + "stream-chat": "^8.40.0", "ts-jest": "^29.1.4", "typescript": "^5.4.5" }, diff --git a/scripts/check-sidebar.mjs b/scripts/check-sidebar.mjs index 331406746..57e550605 100755 --- a/scripts/check-sidebar.mjs +++ b/scripts/check-sidebar.mjs @@ -42,7 +42,7 @@ const walkFiles = async (docsPath) => { while (files.length) { const fileOrDirectory = files.pop(); - const completePath = resolve(fileOrDirectory.path, fileOrDirectory.name); + const completePath = resolve(fileOrDirectory.parentPath, fileOrDirectory.name); if (fileOrDirectory.isDirectory()) { const d = await fsPromises.readdir(completePath, { withFileTypes: true }); @@ -58,11 +58,11 @@ const walkFiles = async (docsPath) => { } } - const paths = (await Promise.allSettled(extractIdPromises)) + const finalPaths = (await Promise.allSettled(extractIdPromises)) .filter((v) => v.status === 'fulfilled') .map((v) => v.value.replace(resolvedPath + path.sep, '')); - return paths; + return finalPaths; }; const extractIdFromFile = async (resolvedPath) => { @@ -72,18 +72,24 @@ const extractIdFromFile = async (resolvedPath) => { let limit = 8; const id = await new Promise((resolve, reject) => { rli.on('line', (line) => { - if (limit === 0) return reject('Line read limit reached'); - limit--; + if (!limit) return rli.pause(); if (!line.startsWith('id:')) return; const id = line.replace(/^(id:)\s*/, '').trim(); - rli.close(); resolve(id); }); + + rli.on('pause', () => { + // extractIdFromFile executed "sync" unless this is here + setTimeout(() => { + reject('EOF'); + }, 50); + }); }); + rli.close(); rs.close(); const d = resolvedPath.split(path.sep); diff --git a/src/components/Avatar/Avatar.tsx b/src/components/Avatar/Avatar.tsx index 942255a20..ce89f127e 100644 --- a/src/components/Avatar/Avatar.tsx +++ b/src/components/Avatar/Avatar.tsx @@ -1,9 +1,11 @@ import clsx from 'clsx'; import React, { useEffect, useState } from 'react'; -import { getWholeChar } from '../../utils'; import type { UserResponse } from 'stream-chat'; +import { Icon } from '../Threads/icons'; +import { getWholeChar } from '../../utils'; + import type { DefaultStreamChatGenerics } from '../../types/types'; export type AvatarProps< @@ -53,25 +55,32 @@ export const Avatar = <
1, + ['str-chat__avatar--no-letters']: !initials.length, ['str-chat__avatar--one-letter']: initials.length === 1, })} data-testid='avatar' onClick={onClick} onMouseOver={onMouseOver} + role='button' title={name} > {showImage ? ( {initials} setError(true)} src={image} /> ) : ( -
- {initials} -
+ <> + {!!initials.length && ( +
+ {initials} +
+ )} + {!initials.length && } + )}
); diff --git a/src/components/Avatar/__tests__/Avatar.test.js b/src/components/Avatar/__tests__/Avatar.test.js index e2ed64954..b45990d7c 100644 --- a/src/components/Avatar/__tests__/Avatar.test.js +++ b/src/components/Avatar/__tests__/Avatar.test.js @@ -16,15 +16,25 @@ describe('Avatar', () => { const tree = renderer.create().toJSON(); expect(tree).toMatchInlineSnapshot(`
-
+ + +
`); }); @@ -33,10 +43,11 @@ describe('Avatar', () => { const tree = renderer.create().toJSON(); expect(tree).toMatchInlineSnapshot(`
([]); const [quotedMessage, setQuotedMessage] = useState>(); @@ -1035,6 +1033,16 @@ const ChannelInner = < errorStatusCode: parsedError.status || undefined, status: 'failed', }); + + thread?.upsertReplyLocally({ + // @ts-expect-error + message: { + ...message, + error: parsedError, + errorStatusCode: parsedError.status || undefined, + status: 'failed', + }, + }); } } }; @@ -1052,20 +1060,24 @@ const ChannelInner = < channel.state.filterErrorMessages(); const messagePreview = { - __html: text, attachments, created_at: new Date(), html: text, id: customMessageData?.id ?? `${client.userID}-${nanoid()}`, mentioned_users, + parent_id: parent?.id, reactions: [], status: 'sending', text, type: 'regular', user: client.user, - ...(parent?.id ? { parent_id: parent.id } : null), }; + thread?.upsertReplyLocally({ + // @ts-expect-error + message: messagePreview, + }); + updateMessage(messagePreview); await doSendMessage(messagePreview, customMessageData, options); @@ -1239,9 +1251,10 @@ const ChannelInner = < ], ); - const componentContextValue: ComponentContextValue = useMemo( + // @ts-expect-error + const componentContextValue: Partial = useMemo( () => ({ - Attachment: props.Attachment || DefaultAttachment, + Attachment: props.Attachment, AttachmentPreviewList: props.AttachmentPreviewList, AudioRecorder: props.AudioRecorder, AutocompleteSuggestionItem: props.AutocompleteSuggestionItem, @@ -1250,7 +1263,7 @@ const ChannelInner = < BaseImage: props.BaseImage, CooldownTimer: props.CooldownTimer, CustomMessageActionsList: props.CustomMessageActionsList, - DateSeparator: props.DateSeparator || DateSeparator, + DateSeparator: props.DateSeparator, EditMessageInput: props.EditMessageInput, EmojiPicker: props.EmojiPicker, emojiSearchIndex: props.emojiSearchIndex, @@ -1261,7 +1274,7 @@ const ChannelInner = < Input: props.Input, LinkPreviewList: props.LinkPreviewList, LoadingIndicator: props.LoadingIndicator, - Message: props.Message || MessageSimple, + Message: props.Message, MessageBouncePrompt: props.MessageBouncePrompt, MessageDeleted: props.MessageDeleted, MessageListNotifications: props.MessageListNotifications, @@ -1269,13 +1282,13 @@ const ChannelInner = < MessageOptions: props.MessageOptions, MessageRepliesCountButton: props.MessageRepliesCountButton, MessageStatus: props.MessageStatus, - MessageSystem: props.MessageSystem || EventComponent, + MessageSystem: props.MessageSystem, MessageTimestamp: props.MessageTimestamp, ModalGallery: props.ModalGallery, PinIndicator: props.PinIndicator, QuotedMessage: props.QuotedMessage, QuotedMessagePreview: props.QuotedMessagePreview, - reactionOptions: props.reactionOptions ?? defaultReactionOptions, + reactionOptions: props.reactionOptions, ReactionSelector: props.ReactionSelector, ReactionsList: props.ReactionsList, SendButton: props.SendButton, @@ -1287,11 +1300,59 @@ const ChannelInner = < TriggerProvider: props.TriggerProvider, TypingIndicator: props.TypingIndicator, UnreadMessagesNotification: props.UnreadMessagesNotification, - UnreadMessagesSeparator: props.UnreadMessagesSeparator || UnreadMessagesSeparator, + UnreadMessagesSeparator: props.UnreadMessagesSeparator, VirtualMessage: props.VirtualMessage, }), - // eslint-disable-next-line react-hooks/exhaustive-deps - [props.reactionOptions], + [ + props.Attachment, + props.AttachmentPreviewList, + props.AudioRecorder, + props.AutocompleteSuggestionItem, + props.AutocompleteSuggestionList, + props.Avatar, + props.BaseImage, + props.CooldownTimer, + props.CustomMessageActionsList, + props.DateSeparator, + props.EditMessageInput, + props.EmojiPicker, + props.EmptyStateIndicator, + props.FileUploadIcon, + props.GiphyPreviewMessage, + props.HeaderComponent, + props.Input, + props.LinkPreviewList, + props.LoadingIndicator, + props.Message, + props.MessageBouncePrompt, + props.MessageDeleted, + props.MessageListNotifications, + props.MessageNotification, + props.MessageOptions, + props.MessageRepliesCountButton, + props.MessageStatus, + props.MessageSystem, + props.MessageTimestamp, + props.ModalGallery, + props.PinIndicator, + props.QuotedMessage, + props.QuotedMessagePreview, + props.ReactionSelector, + props.ReactionsList, + props.SendButton, + props.StartRecordingAudioButton, + props.ThreadHead, + props.ThreadHeader, + props.ThreadStart, + props.Timestamp, + props.TriggerProvider, + props.TypingIndicator, + props.UnreadMessagesNotification, + props.UnreadMessagesSeparator, + props.VirtualMessage, + props.emojiSearchIndex, + props.reactionOptions, + ], ); const typingContextValue = useCreateTypingContext({ @@ -1328,7 +1389,7 @@ const ChannelInner = <
- +
{dragAndDropWindow && ( @@ -1337,7 +1398,7 @@ const ChannelInner = < {!dragAndDropWindow && <>{children}}
-
+
diff --git a/src/components/ChannelPreview/__tests__/__snapshots__/ChannelPreviewMessenger.test.js.snap b/src/components/ChannelPreview/__tests__/__snapshots__/ChannelPreviewMessenger.test.js.snap index ebde4a742..b6c008eb9 100644 --- a/src/components/ChannelPreview/__tests__/__snapshots__/ChannelPreviewMessenger.test.js.snap +++ b/src/components/ChannelPreview/__tests__/__snapshots__/ChannelPreviewMessenger.test.js.snap @@ -20,6 +20,7 @@ exports[`ChannelPreviewMessenger should render correctly 1`] = ` data-testid="avatar" onClick={[Function]} onMouseOver={[Function]} + role="button" title="Channel name" > { - if (client) { - const userAgent = client.getUserAgent(); - if (!userAgent.includes('stream-chat-react')) { - // result looks like: 'stream-chat-react-2.3.2-stream-chat-javascript-client-browser-2.2.2' - client.setUserAgent(`stream-chat-react-${version}-${userAgent}`); - } + if (!client) return; + + const userAgent = client.getUserAgent(); + if (!userAgent.includes('stream-chat-react')) { + // result looks like: 'stream-chat-react-2.3.2-stream-chat-javascript-client-browser-2.2.2' + client.setUserAgent(`stream-chat-react-${version}-${userAgent}`); } + + client.threads.registerSubscriptions(); + + return () => { + client.threads.unregisterSubscriptions(); + }; }, [client]); useEffect(() => { diff --git a/src/components/ChatView/ChatView.tsx b/src/components/ChatView/ChatView.tsx new file mode 100644 index 000000000..5d6aea889 --- /dev/null +++ b/src/components/ChatView/ChatView.tsx @@ -0,0 +1,163 @@ +import React, { createContext, useContext, useEffect, useMemo, useState } from 'react'; + +import { ThreadProvider, useStateStore } from '../Threads'; +import { Icon } from '../Threads/icons'; +import { UnreadCountBadge } from '../Threads/UnreadCountBadge'; +import { useChatContext } from '../../context'; + +import type { PropsWithChildren } from 'react'; +import type { Thread, ThreadManagerState } from 'stream-chat'; + +const availableChatViews = ['channels', 'threads'] as const; + +type ChatViewContextValue = { + activeChatView: typeof availableChatViews[number]; + setActiveChatView: (cv: ChatViewContextValue['activeChatView']) => void; +}; + +const ChatViewContext = createContext({ + activeChatView: 'channels', + setActiveChatView: () => undefined, +}); + +export const ChatView = ({ children }: PropsWithChildren) => { + const [activeChatView, setActiveChatView] = useState( + 'channels', + ); + + const value = useMemo(() => ({ activeChatView, setActiveChatView }), [activeChatView]); + + return ( + +
{children}
+
+ ); +}; + +const ChannelsView = ({ children }: PropsWithChildren) => { + const { activeChatView } = useContext(ChatViewContext); + + if (activeChatView !== 'channels') return null; + + return
{children}
; +}; + +export type ThreadsViewContextValue = { + activeThread: Thread | undefined; + setActiveThread: (cv: ThreadsViewContextValue['activeThread']) => void; +}; + +const ThreadsViewContext = createContext({ + activeThread: undefined, + setActiveThread: () => undefined, +}); + +export const useThreadsViewContext = () => useContext(ThreadsViewContext); + +const ThreadsView = ({ children }: PropsWithChildren) => { + const { activeChatView } = useContext(ChatViewContext); + const [activeThread, setActiveThread] = useState( + undefined, + ); + + const value = useMemo(() => ({ activeThread, setActiveThread }), [activeThread]); + + if (activeChatView !== 'threads') return null; + + return ( + +
{children}
+
+ ); +}; + +// thread business logic that's impossible to keep within client but encapsulated for ease of use +export const useActiveThread = ({ activeThread }: { activeThread?: Thread }) => { + useEffect(() => { + if (!activeThread) return; + + const handleVisibilityChange = () => { + if (document.visibilityState === 'visible' && document.hasFocus()) { + activeThread.activate(); + } + if (document.visibilityState === 'hidden' || !document.hasFocus()) { + activeThread.deactivate(); + } + }; + + handleVisibilityChange(); + + window.addEventListener('focus', handleVisibilityChange); + window.addEventListener('blur', handleVisibilityChange); + return () => { + activeThread.deactivate(); + window.addEventListener('blur', handleVisibilityChange); + window.removeEventListener('focus', handleVisibilityChange); + }; + }, [activeThread]); +}; + +// ThreadList under View.Threads context, will access setting function and on item click will set activeThread +// which can be accessed for the ease of use by ThreadAdapter which forwards it to required ThreadProvider +// ThreadList can easily live without this context and click handler can be overriden, ThreadAdapter is then no longer needed +/** + * // this setup still works + * const MyCustomComponent = () => { + * const [activeThread, setActiveThread] = useState(); + * + * return <> + * // simplified + * + * + * + * + * + * } + * + */ +const ThreadAdapter = ({ children }: PropsWithChildren) => { + const { activeThread } = useThreadsViewContext(); + + useActiveThread({ activeThread }); + + return {children}; +}; + +const selector = (nextValue: ThreadManagerState) => [nextValue.unreadThreadCount]; + +const ChatViewSelector = () => { + const { client } = useChatContext(); + const [unreadThreadCount] = useStateStore(client.threads.state, selector); + + const { activeChatView, setActiveChatView } = useContext(ChatViewContext); + + return ( +
+ + +
+ ); +}; + +ChatView.Channels = ChannelsView; +ChatView.Threads = ThreadsView; +ChatView.ThreadAdapter = ThreadAdapter; +ChatView.Selector = ChatViewSelector; diff --git a/src/components/ChatView/index.tsx b/src/components/ChatView/index.tsx new file mode 100644 index 000000000..c9582c20c --- /dev/null +++ b/src/components/ChatView/index.tsx @@ -0,0 +1 @@ +export * from './ChatView'; diff --git a/src/components/Message/Message.tsx b/src/components/Message/Message.tsx index 3b6ce5e6a..b353e1d7b 100644 --- a/src/components/Message/Message.tsx +++ b/src/components/Message/Message.tsx @@ -28,6 +28,8 @@ import { useComponentContext, } from '../../context'; +import { MessageSimple as DefaultMessage } from './MessageSimple'; + import type { MessageProps } from './types'; import type { DefaultStreamChatGenerics } from '../../types/types'; @@ -84,7 +86,7 @@ const MessageWithContext = < const { Message: contextMessage } = useComponentContext('Message'); const actionsEnabled = message.type === 'regular' && message.status === 'received'; - const MessageUIComponent = propMessage || contextMessage; + const MessageUIComponent = propMessage ?? contextMessage ?? DefaultMessage; const { clearEdit, editing, setEdit } = useEditHandler(); diff --git a/src/components/Message/MessageSimple.tsx b/src/components/Message/MessageSimple.tsx index ecee1ef85..bf8ade888 100644 --- a/src/components/Message/MessageSimple.tsx +++ b/src/components/Message/MessageSimple.tsx @@ -18,6 +18,7 @@ import { } from './utils'; import { Avatar as DefaultAvatar } from '../Avatar'; +import { Attachment as DefaultAttachment } from '../Attachment'; import { CUSTOM_MESSAGE_TYPE } from '../../constants/messageTypes'; import { EditMessageForm as DefaultEditMessageForm, MessageInput } from '../MessageInput'; import { MML } from '../MML'; @@ -30,12 +31,12 @@ import { MessageBounceModal } from '../MessageBounce/MessageBounceModal'; import { useComponentContext } from '../../context/ComponentContext'; import { MessageContextValue, useMessageContext } from '../../context/MessageContext'; -import type { MessageUIComponentProps } from './types'; - -import type { DefaultStreamChatGenerics } from '../../types/types'; import { useTranslationContext } from '../../context'; import { MessageEditedTimestamp } from './MessageEditedTimestamp'; +import type { MessageUIComponentProps } from './types'; +import type { DefaultStreamChatGenerics } from '../../types/types'; + type MessageSimpleWithContextProps< StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics > = MessageContextValue; @@ -72,7 +73,7 @@ const MessageSimpleWithContext = < const [isEditedTimestampOpen, setEditedTimestampOpen] = useState(false); const { - Attachment, + Attachment = DefaultAttachment, Avatar = DefaultAvatar, EditMessageInput = DefaultEditMessageForm, MessageDeleted = DefaultMessageDeleted, diff --git a/src/components/Message/QuotedMessage.tsx b/src/components/Message/QuotedMessage.tsx index b94b6a239..93baa5b97 100644 --- a/src/components/Message/QuotedMessage.tsx +++ b/src/components/Message/QuotedMessage.tsx @@ -11,13 +11,15 @@ import { useChannelActionContext } from '../../context/ChannelActionContext'; import type { TranslationLanguages } from 'stream-chat'; import type { DefaultStreamChatGenerics } from '../../types/types'; +import { Attachment as DefaultAttachment } from '../Attachment'; export const QuotedMessage = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics >() => { - const { Attachment, Avatar: ContextAvatar } = useComponentContext( - 'QuotedMessage', - ); + const { + Attachment = DefaultAttachment, + Avatar: ContextAvatar, + } = useComponentContext('QuotedMessage'); const { isMyMessage, message } = useMessageContext('QuotedMessage'); const { t, userLanguage } = useTranslationContext('QuotedMessage'); const { jumpToMessage } = useChannelActionContext('QuotedMessage'); diff --git a/src/components/Message/__tests__/__snapshots__/MessageStatus.test.js.snap b/src/components/Message/__tests__/__snapshots__/MessageStatus.test.js.snap index abac79d65..9b9575f25 100644 --- a/src/components/Message/__tests__/__snapshots__/MessageStatus.test.js.snap +++ b/src/components/Message/__tests__/__snapshots__/MessageStatus.test.js.snap @@ -31,6 +31,7 @@ exports[`MessageStatus renders default read UI for the last message 1`] = `
( message?: StreamMessage, ) => { + const thread = useThreadContext(); const { updateMessage } = useChannelActionContext('useReactionHandler'); const { channel, channelCapabilities } = useChannelStateContext( 'useReactionHandler', @@ -93,15 +96,20 @@ export const useReactionHandler = < try { updateMessage(tempMessage); + // @ts-expect-error + thread?.upsertReplyLocally({ message: tempMessage }); const messageResponse = add ? await channel.sendReaction(id, { type } as Reaction) : await channel.deleteReaction(id, type); + // seems useless as we're expecting WS event to come in and replace this anyway updateMessage(messageResponse.message); } catch (error) { // revert to the original message if the API call fails updateMessage(message); + // @ts-expect-error + thread?.upsertReplyLocally({ message }); } }, 1000); diff --git a/src/components/Message/utils.tsx b/src/components/Message/utils.tsx index 9d659e4f8..6842728be 100644 --- a/src/components/Message/utils.tsx +++ b/src/components/Message/utils.tsx @@ -206,7 +206,6 @@ export const getMessageActions = ( export const ACTIONS_NOT_WORKING_IN_THREAD = [ MESSAGE_ACTIONS.pin, - MESSAGE_ACTIONS.react, MESSAGE_ACTIONS.reply, MESSAGE_ACTIONS.markUnread, ]; diff --git a/src/components/MessageInput/QuotedMessagePreview.tsx b/src/components/MessageInput/QuotedMessagePreview.tsx index 409e97884..9569c2ba9 100644 --- a/src/components/MessageInput/QuotedMessagePreview.tsx +++ b/src/components/MessageInput/QuotedMessagePreview.tsx @@ -1,6 +1,7 @@ import React, { useMemo } from 'react'; import type { TranslationLanguages } from 'stream-chat'; +import { Attachment as DefaultAttachment } from '../Attachment'; import { Avatar as DefaultAvatar } from '../Avatar'; import { CloseIcon } from './icons'; @@ -44,9 +45,10 @@ export const QuotedMessagePreview = < >({ quotedMessage, }: QuotedMessagePreviewProps) => { - const { Attachment, Avatar = DefaultAvatar } = useComponentContext( - 'QuotedMessagePreview', - ); + const { + Attachment = DefaultAttachment, + Avatar = DefaultAvatar, + } = useComponentContext('QuotedMessagePreview'); const { userLanguage } = useTranslationContext('QuotedMessagePreview'); const quotedMessageText = diff --git a/src/components/MessageList/MessageList.tsx b/src/components/MessageList/MessageList.tsx index 52bc86b74..a2a14eb97 100644 --- a/src/components/MessageList/MessageList.tsx +++ b/src/components/MessageList/MessageList.tsx @@ -227,18 +227,13 @@ const MessageListWithContext = < )}
{showEmptyStateIndicator ? ( - + ) : ( ['read']; }; @@ -226,13 +229,13 @@ const VirtualizedMessageListWithContext = < useCaptureResizeObserverExceededError(); const { - DateSeparator, + DateSeparator = DefaultDateSeparator, GiphyPreviewMessage = DefaultGiphyPreviewMessage, MessageListNotifications = DefaultMessageListNotifications, MessageNotification = DefaultMessageNotification, - MessageSystem, + MessageSystem = DefaultMessageSystem, UnreadMessagesNotification = DefaultUnreadMessagesNotification, - UnreadMessagesSeparator, + UnreadMessagesSeparator = DefaultUnreadMessagesSeparator, VirtualMessage: MessageUIComponentFromContext = MessageSimple, TypingIndicator, } = useComponentContext('VirtualizedMessageList'); @@ -525,6 +528,7 @@ export type VirtualizedMessageListProps< > = Partial, PropsDrilledToMessage>> & { /** Additional props to be passed the underlying [`react-virtuoso` virtualized list dependency](https://virtuoso.dev/virtuoso-api-reference/) */ additionalVirtuosoProps?: VirtuosoProps>; + channelUnreadUiState?: ChannelStateContextValue['channelUnreadUiState']; /** If true, picking a reaction from the `ReactionSelector` component will close the selector */ closeReactionSelectorOnClick?: boolean; /** Custom render function, if passed, certain UI props are ignored */ @@ -656,7 +660,7 @@ export function VirtualizedMessageList< return ( ( 'VirtualizedMessageListHeader', ); - if (!context?.loadingMore) return null; - return LoadingIndicator ? ( -
- -
- ) : ( - context?.head || null + + return ( + <> + {context?.head} + {context?.loadingMore && LoadingIndicator && ( +
+ +
+ )} + ); }; export const EmptyPlaceholder = < @@ -138,6 +141,7 @@ export const messageRenderer = < shouldGroupByUser, sortReactionDetails, sortReactions, + threadList, unreadMessageCount = 0, UnreadMessagesSeparator, virtuosoRef, @@ -225,6 +229,7 @@ export const messageRenderer = < readBy={ownMessagesReadByOthers[message.id] || []} sortReactionDetails={sortReactionDetails} sortReactions={sortReactions} + threadList={threadList} /> {showUnreadSeparatorBelow && (
diff --git a/src/components/MessageList/__tests__/VirtualizedMessageListComponents.test.js b/src/components/MessageList/__tests__/VirtualizedMessageListComponents.test.js index 48e59b5ca..7042e5513 100644 --- a/src/components/MessageList/__tests__/VirtualizedMessageListComponents.test.js +++ b/src/components/MessageList/__tests__/VirtualizedMessageListComponents.test.js @@ -141,7 +141,13 @@ describe('VirtualizedMessageComponents', () => { it('should not render custom head in Header when not loading more messages', () => { const context = { head }; const { container } = renderElements(
); - expect(container).toMatchInlineSnapshot(`
`); + expect(container).toMatchInlineSnapshot(` +
+
+ Custom head +
+
+ `); }); it('should render custom LoadingIndicator instead of head when loading more', () => { @@ -150,6 +156,9 @@ describe('VirtualizedMessageComponents', () => { const { container } = renderElements(
, componentContext); expect(container).toMatchInlineSnapshot(`
+
+ Custom head +
diff --git a/src/components/MessageList/__tests__/__snapshots__/VirtualizedMessageListComponents.test.js.snap b/src/components/MessageList/__tests__/__snapshots__/VirtualizedMessageListComponents.test.js.snap index 47619c06a..2054e8874 100644 --- a/src/components/MessageList/__tests__/__snapshots__/VirtualizedMessageListComponents.test.js.snap +++ b/src/components/MessageList/__tests__/__snapshots__/VirtualizedMessageListComponents.test.js.snap @@ -50,6 +50,9 @@ exports[`VirtualizedMessageComponents EmptyPlaceholder should render for main me exports[`VirtualizedMessageComponents Header should not render custom head in Header when loading more messages, but the LoadingIndicator 1`] = `
+
+ Custom head +
diff --git a/src/components/MessageList/renderMessages.tsx b/src/components/MessageList/renderMessages.tsx index 85948ffe4..d44a050b5 100644 --- a/src/components/MessageList/renderMessages.tsx +++ b/src/components/MessageList/renderMessages.tsx @@ -1,13 +1,18 @@ import React, { Fragment, ReactNode } from 'react'; +import type { UserResponse } from 'stream-chat'; + import { GroupStyle, isDateSeparatorMessage } from './utils'; -import { Message, MessageProps } from '../Message'; +import { Message } from '../Message'; +import { DateSeparator as DefaultDateSeparator } from '../DateSeparator'; +import { EventComponent as DefaultMessageSystem } from '../EventComponent'; +import { UnreadMessagesSeparator as DefaultUnreadMessagesSeparator } from './UnreadMessagesSeparator'; import { ComponentContextValue, CustomClasses } from '../../context'; import { CUSTOM_MESSAGE_TYPE } from '../../constants/messageTypes'; -import type { UserResponse } from 'stream-chat'; import type { ChannelUnreadUiState, DefaultStreamChatGenerics } from '../../types'; import type { StreamMessage } from '../../context/ChannelStateContext'; +import type { MessageProps } from '../Message'; export interface RenderMessagesOptions< StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics @@ -61,7 +66,13 @@ export function defaultRenderMessages< readData, sharedMessageProps: messageProps, }: RenderMessagesOptions) { - const { DateSeparator, HeaderComponent, MessageSystem, UnreadMessagesSeparator } = components; + const { + DateSeparator = DefaultDateSeparator, + HeaderComponent, + MessageSystem = DefaultMessageSystem, + UnreadMessagesSeparator = DefaultUnreadMessagesSeparator, + } = components; + const renderedMessages = []; let firstMessage; for (let index = 0; index < messages.length; index++) { diff --git a/src/components/Reactions/ReactionSelector.tsx b/src/components/Reactions/ReactionSelector.tsx index d8fa2b53d..4c5875ed0 100644 --- a/src/components/Reactions/ReactionSelector.tsx +++ b/src/components/Reactions/ReactionSelector.tsx @@ -1,15 +1,15 @@ import React, { useCallback, useEffect, useRef, useState } from 'react'; import clsx from 'clsx'; -import { isMutableRef } from './utils/utils'; - -import { AvatarProps, Avatar as DefaultAvatar } from '../Avatar'; +import type { ReactionGroupResponse, ReactionResponse } from 'stream-chat'; +import { isMutableRef } from './utils/utils'; +import { Avatar as DefaultAvatar } from '../Avatar'; import { useComponentContext } from '../../context/ComponentContext'; import { useMessageContext } from '../../context/MessageContext'; +import { defaultReactionOptions } from './reactionOptions'; -import type { ReactionGroupResponse, ReactionResponse } from 'stream-chat'; - +import type { AvatarProps } from '../Avatar'; import type { DefaultStreamChatGenerics } from '../../types/types'; import type { ReactionOptions } from './reactionOptions'; @@ -33,7 +33,10 @@ export type ReactionSelectorProps< reaction_counts?: Record; /** An object containing summary for each reaction type on a message */ reaction_groups?: Record; - /** A list of the currently supported reactions on a message */ + /** + * @deprecated + * A list of the currently supported reactions on a message + * */ reactionOptions?: ReactionOptions; /** If true, adds a CSS class that reverses the horizontal positioning of the selector */ reverse?: boolean; @@ -57,7 +60,7 @@ const UnMemoizedReactionSelector = React.forwardRef( const { Avatar: contextAvatar, - reactionOptions: contextReactionOptions, + reactionOptions: contextReactionOptions = defaultReactionOptions, } = useComponentContext('ReactionSelector'); const { handleReaction: contextHandleReaction, diff --git a/src/components/Reactions/ReactionsList.tsx b/src/components/Reactions/ReactionsList.tsx index 22c6c6182..d5974854a 100644 --- a/src/components/Reactions/ReactionsList.tsx +++ b/src/components/Reactions/ReactionsList.tsx @@ -29,7 +29,10 @@ export type ReactionsListProps< reaction_counts?: Record; /** An object containing summary for each reaction type on a message */ reaction_groups?: Record; - /** A list of the currently supported reactions on a message */ + /** + * @deprecated + * A list of the currently supported reactions on a message + * */ reactionOptions?: ReactionOptions; /** An array of the reaction objects to display in the list */ reactions?: ReactionResponse[]; diff --git a/src/components/Reactions/hooks/useProcessReactions.tsx b/src/components/Reactions/hooks/useProcessReactions.tsx index d84e70a1c..cded26fb5 100644 --- a/src/components/Reactions/hooks/useProcessReactions.tsx +++ b/src/components/Reactions/hooks/useProcessReactions.tsx @@ -1,6 +1,7 @@ import { useCallback, useMemo } from 'react'; import { useComponentContext, useMessageContext } from '../../../context'; +import { defaultReactionOptions } from '../reactionOptions'; import type { ReactionsListProps } from '../ReactionsList'; import type { DefaultStreamChatGenerics } from '../../../types/types'; @@ -40,9 +41,9 @@ export const useProcessReactions = < const { message, sortReactions: contextSortReactions } = useMessageContext( 'useProcessReactions', ); - const { reactionOptions: contextReactionOptions } = useComponentContext( - 'useProcessReactions', - ); + const { + reactionOptions: contextReactionOptions = defaultReactionOptions, + } = useComponentContext('useProcessReactions'); const reactionOptions = propReactionOptions ?? contextReactionOptions; const sortReactions = propSortReactions ?? contextSortReactions ?? defaultReactionsSort; diff --git a/src/components/Thread/Thread.tsx b/src/components/Thread/Thread.tsx index 8970f180c..6ede0894a 100644 --- a/src/components/Thread/Thread.tsx +++ b/src/components/Thread/Thread.tsx @@ -18,11 +18,13 @@ import { useChatContext, useComponentContext, } from '../../context'; +import { useStateStore, useThreadContext } from '../../components/Threads'; import type { MessageProps, MessageUIComponentProps } from '../Message/types'; import type { MessageActionsArray } from '../Message/utils'; import type { CustomTrigger, DefaultStreamChatGenerics } from '../../types/types'; +import type { ThreadState } from 'stream-chat'; export type ThreadProps< StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics, @@ -60,13 +62,25 @@ export const Thread = < props: ThreadProps, ) => { const { channel, channelConfig, thread } = useChannelStateContext('Thread'); + const threadInstance = useThreadContext(); - if (!thread || channelConfig?.replies === false) return null; + if ((!thread && !threadInstance) || channelConfig?.replies === false) return null; - // The wrapper ensures a key variable is set and the component recreates on thread switch - return ; + // the wrapper ensures a key variable is set and the component recreates on thread switch + return ( + // FIXME: TS is having trouble here as at least one of the two would always be defined + + ); }; +const selector = (nextValue: ThreadState) => + [ + nextValue.replies, + nextValue.pagination.isLoadingPrev, + nextValue.pagination.isLoadingNext, + nextValue.parentMessage, + ] as const; + const ThreadInner = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics, V extends CustomTrigger = CustomTrigger @@ -86,11 +100,15 @@ const ThreadInner = < virtualized, } = props; + const threadInstance = useThreadContext(); + const [latestReplies, isLoadingPrev, isLoadingNext, parentMessage] = + useStateStore(threadInstance?.state, selector) ?? []; + const { thread, threadHasMore, threadLoadingMore, - threadMessages, + threadMessages = [], threadSuppressAutoscroll, } = useChannelStateContext('Thread'); const { closeThread, loadMoreThread } = useChannelActionContext('Thread'); @@ -118,9 +136,35 @@ const ThreadInner = < loadMoreThread(); } // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - if (!thread) return null; + }, [thread, loadMoreThread]); + + const threadProps: Pick< + VirtualizedMessageListProps, + | 'hasMoreNewer' + | 'loadMoreNewer' + | 'loadingMoreNewer' + | 'hasMore' + | 'loadMore' + | 'loadingMore' + | 'messages' + > = threadInstance + ? { + loadingMore: isLoadingPrev, + loadingMoreNewer: isLoadingNext, + loadMore: threadInstance.loadPrevPage, + loadMoreNewer: threadInstance.loadNextPage, + messages: latestReplies, + } + : { + hasMore: threadHasMore, + loadingMore: threadLoadingMore, + loadMore: loadMoreThread, + messages: threadMessages, + }; + + const messageAsThread = thread ?? parentMessage; + + if (!messageAsThread) return null; const threadClass = customClasses?.thread || @@ -130,8 +174,8 @@ const ThreadInner = < const head = ( @@ -139,24 +183,21 @@ const ThreadInner = < return (
- + diff --git a/src/components/Threads/ThreadContext.tsx b/src/components/Threads/ThreadContext.tsx new file mode 100644 index 000000000..fb9235c67 --- /dev/null +++ b/src/components/Threads/ThreadContext.tsx @@ -0,0 +1,22 @@ +import React, { createContext, useContext } from 'react'; + +import { Channel } from '../../components'; + +import type { PropsWithChildren } from 'react'; +import { Thread } from 'stream-chat'; + +export type ThreadContextValue = Thread | undefined; + +export const ThreadContext = createContext(undefined); + +export const useThreadContext = () => { + const thread = useContext(ThreadContext); + + return thread ?? undefined; +}; + +export const ThreadProvider = ({ children, thread }: PropsWithChildren<{ thread?: Thread }>) => ( + + {children} + +); diff --git a/src/components/Threads/ThreadList/ThreadList.tsx b/src/components/Threads/ThreadList/ThreadList.tsx new file mode 100644 index 000000000..fdec3a520 --- /dev/null +++ b/src/components/Threads/ThreadList/ThreadList.tsx @@ -0,0 +1,76 @@ +import React, { useEffect } from 'react'; +import { ComputeItemKey, Virtuoso, VirtuosoProps } from 'react-virtuoso'; + +import type { Thread, ThreadManagerState } from 'stream-chat'; + +import { ThreadListItem as DefaultThreadListItem } from './ThreadListItem'; +import { ThreadListEmptyPlaceholder as DefaultThreadListEmptyPlaceholder } from './ThreadListEmptyPlaceholder'; +import { ThreadListUnseenThreadsBanner as DefaultThreadListUnseenThreadsBanner } from './ThreadListUnseenThreadsBanner'; +import { ThreadListLoadingIndicator as DefaultThreadListLoadingIndicator } from './ThreadListLoadingIndicator'; +import { useChatContext, useComponentContext } from '../../../context'; +import { useStateStore } from '../hooks/useStateStore'; + +const selector = (nextValue: ThreadManagerState) => [nextValue.threads] as const; + +const computeItemKey: ComputeItemKey = (_, item) => item.id; + +type ThreadListProps = { + virtuosoProps?: VirtuosoProps; +}; + +export const useThreadList = () => { + const { client } = useChatContext(); + + useEffect(() => { + const handleVisibilityChange = () => { + if (document.visibilityState === 'visible') { + client.threads.activate(); + } + if (document.visibilityState === 'hidden') { + client.threads.deactivate(); + } + }; + + handleVisibilityChange(); + + document.addEventListener('visibilitychange', handleVisibilityChange); + return () => { + client.threads.deactivate(); + document.removeEventListener('visibilitychange', handleVisibilityChange); + }; + }, [client]); +}; + +export const ThreadList = ({ virtuosoProps }: ThreadListProps) => { + const { client } = useChatContext(); + const { + ThreadListItem = DefaultThreadListItem, + ThreadListEmptyPlaceholder = DefaultThreadListEmptyPlaceholder, + ThreadListLoadingIndicator = DefaultThreadListLoadingIndicator, + ThreadListUnseenThreadsBanner = DefaultThreadListUnseenThreadsBanner, + } = useComponentContext(); + const [threads] = useStateStore(client.threads.state, selector); + + useThreadList(); + + return ( +
+ {/* TODO: allow re-load on stale ThreadManager state */} + + atBottom && client.threads.loadNextPage()} + className='str-chat__thread-list' + components={{ + EmptyPlaceholder: ThreadListEmptyPlaceholder, + Footer: ThreadListLoadingIndicator, + }} + computeItemKey={computeItemKey} + data={threads} + itemContent={(_, thread) => } + // TODO: handle visibility (for a button that scrolls to the unread thread) + // itemsRendered={(items) => console.log({ items })} + {...virtuosoProps} + /> +
+ ); +}; diff --git a/src/components/Threads/ThreadList/ThreadListEmptyPlaceholder.tsx b/src/components/Threads/ThreadList/ThreadListEmptyPlaceholder.tsx new file mode 100644 index 000000000..258185ced --- /dev/null +++ b/src/components/Threads/ThreadList/ThreadListEmptyPlaceholder.tsx @@ -0,0 +1,10 @@ +import React from 'react'; +import { Icon } from '../icons'; + +export const ThreadListEmptyPlaceholder = () => ( +
+ + {/* TODO: translate */} + No threads here yet... +
+); diff --git a/src/components/Threads/ThreadList/ThreadListItem.tsx b/src/components/Threads/ThreadList/ThreadListItem.tsx new file mode 100644 index 000000000..78370dbf6 --- /dev/null +++ b/src/components/Threads/ThreadList/ThreadListItem.tsx @@ -0,0 +1,73 @@ +import React, { createContext, useContext } from 'react'; + +import type { Thread } from 'stream-chat'; + +import { useComponentContext } from '../../../context'; +import { ThreadListItemUI as DefaultThreadListItemUI } from './ThreadListItemUI'; + +import type { ThreadListItemUIProps } from './ThreadListItemUI'; + +export type ThreadListItemProps = { + thread: Thread; + threadListItemUIProps?: ThreadListItemUIProps; +}; + +const ThreadListItemContext = createContext(undefined); + +export const useThreadListItemContext = () => useContext(ThreadListItemContext); + +export const ThreadListItem = ({ thread, threadListItemUIProps }: ThreadListItemProps) => { + const { ThreadListItemUI = DefaultThreadListItemUI } = useComponentContext(); + + return ( + + + + ); +}; + +// const App = () => { +// const route = useRouter(); + +// return ( +// +// {route === '/channels' && ( +// +// +// +// +// )} +// {route === '/threads' && ( +// +// +// +// +// +// +// )} +// +// ); +// }; + +// pre-built layout + +{ + /* + + + // has default + + + + + + + + <-- activeThread state + <-- uses context for click handler + <-- ThreadProvider + Channel combo + + +; +*/ +} diff --git a/src/components/Threads/ThreadList/ThreadListItemUI.tsx b/src/components/Threads/ThreadList/ThreadListItemUI.tsx new file mode 100644 index 000000000..f64ffdc86 --- /dev/null +++ b/src/components/Threads/ThreadList/ThreadListItemUI.tsx @@ -0,0 +1,140 @@ +import React, { useCallback } from 'react'; +import clsx from 'clsx'; + +import type { FormatMessageResponse, ThreadState } from 'stream-chat'; +import type { ComponentPropsWithoutRef } from 'react'; + +import { Timestamp } from '../../Message/Timestamp'; +import { Avatar } from '../../Avatar'; +import { Icon } from '../icons'; +import { UnreadCountBadge } from '../UnreadCountBadge'; +import { useChatContext } from '../../../context'; +import { useThreadsViewContext } from '../../ChatView'; +import { useThreadListItemContext } from './ThreadListItem'; +import { useStateStore } from '../hooks/useStateStore'; + +export type ThreadListItemUIProps = ComponentPropsWithoutRef<'button'>; + +/** + * TODO: + * - maybe hover state? ask design + * - move styling to CSS library and clean it up (separate layout and theme) + * - use Moment/DayJs for proper created_at formatting (replace toLocaleTimeString) + * - handle deleted message [in progress] + */ + +export const attachmentTypeIconMap = { + audio: '🔈', + file: '📄', + image: '📷', + video: '🎥', + voiceRecording: '🎙️', +} as const; + +// TODO: translations +const getTitleFromMessage = ({ + currentUserId, + message, +}: { + currentUserId?: string; + message?: FormatMessageResponse; +}) => { + const attachment = message?.attachments?.at(0); + + let attachmentIcon = ''; + + if (attachment) { + attachmentIcon += + attachmentTypeIconMap[(attachment.type as keyof typeof attachmentTypeIconMap) ?? 'file'] ?? + attachmentTypeIconMap.file; + } + + const messageBelongsToCurrentUser = message?.user?.id === currentUserId; + + if (message?.deleted_at && message.parent_id) + return clsx(messageBelongsToCurrentUser && 'You:', 'This reply was deleted.'); + + if (message?.deleted_at && !message.parent_id) + return clsx(messageBelongsToCurrentUser && 'You:', 'The source message was deleted.'); + + if (attachment?.type === 'voiceRecording') + return clsx(attachmentIcon, messageBelongsToCurrentUser && 'You:', 'Voice message'); + + return clsx( + attachmentIcon, + messageBelongsToCurrentUser && 'You:', + message?.text || attachment?.fallback || 'N/A', + ); +}; + +export const ThreadListItemUI = (props: ThreadListItemUIProps) => { + const { client } = useChatContext(); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const thread = useThreadListItemContext()!; + + const selector = useCallback( + (nextValue: ThreadState) => + [ + nextValue.replies.at(-1), + (client.userID && nextValue.read[client.userID]?.unreadMessageCount) || 0, + nextValue.parentMessage, + nextValue.channel, + nextValue.deletedAt, + ] as const, + [client], + ); + + const [latestReply, ownUnreadMessageCount, parentMessage, channelData, deletedAt] = useStateStore( + thread.state, + selector, + ); + + const { activeThread, setActiveThread } = useThreadsViewContext(); + + const avatarProps = deletedAt ? null : latestReply?.user; + + return ( + + ); +}; diff --git a/src/components/Threads/ThreadList/ThreadListLoadingIndicator.tsx b/src/components/Threads/ThreadList/ThreadListLoadingIndicator.tsx new file mode 100644 index 000000000..da9da4ea4 --- /dev/null +++ b/src/components/Threads/ThreadList/ThreadListLoadingIndicator.tsx @@ -0,0 +1,23 @@ +import React from 'react'; + +import type { ThreadManagerState } from 'stream-chat'; + +import { LoadingIndicator as DefaultLoadingIndicator } from '../../Loading'; +import { useChatContext, useComponentContext } from '../../../context'; +import { useStateStore } from '../hooks/useStateStore'; + +const selector = (nextValue: ThreadManagerState) => [nextValue.pagination.isLoadingNext]; + +export const ThreadListLoadingIndicator = () => { + const { LoadingIndicator = DefaultLoadingIndicator } = useComponentContext(); + const { client } = useChatContext(); + const [isLoadingNext] = useStateStore(client.threads.state, selector); + + if (!isLoadingNext) return null; + + return ( +
+ +
+ ); +}; diff --git a/src/components/Threads/ThreadList/ThreadListUnseenThreadsBanner.tsx b/src/components/Threads/ThreadList/ThreadListUnseenThreadsBanner.tsx new file mode 100644 index 000000000..5d2178002 --- /dev/null +++ b/src/components/Threads/ThreadList/ThreadListUnseenThreadsBanner.tsx @@ -0,0 +1,29 @@ +import React from 'react'; + +import type { ThreadManagerState } from 'stream-chat'; + +import { Icon } from '../icons'; +import { useChatContext } from '../../../context'; +import { useStateStore } from '../hooks/useStateStore'; + +const selector = (nextValue: ThreadManagerState) => [nextValue.unseenThreadIds] as const; + +export const ThreadListUnseenThreadsBanner = () => { + const { client } = useChatContext(); + const [unseenThreadIds] = useStateStore(client.threads.state, selector); + + if (!unseenThreadIds.length) return null; + + return ( +
+ {/* TODO: translate */} + {unseenThreadIds.length} unread threads + +
+ ); +}; diff --git a/src/components/Threads/ThreadList/index.ts b/src/components/Threads/ThreadList/index.ts new file mode 100644 index 000000000..2faf2a4b9 --- /dev/null +++ b/src/components/Threads/ThreadList/index.ts @@ -0,0 +1,3 @@ +export * from './ThreadList'; +export * from './ThreadListItem'; +export * from './ThreadListItemUI'; diff --git a/src/components/Threads/UnreadCountBadge.tsx b/src/components/Threads/UnreadCountBadge.tsx new file mode 100644 index 000000000..7096f6ad6 --- /dev/null +++ b/src/components/Threads/UnreadCountBadge.tsx @@ -0,0 +1,26 @@ +import clsx from 'clsx'; +import React from 'react'; +import type { PropsWithChildren } from 'react'; + +export const UnreadCountBadge = ({ + children, + count, + position, +}: PropsWithChildren<{ + count: number; + position?: 'top-right' | 'bottom-right' | 'bottom-left' | 'top-left'; +}>) => ( +
+ {children} + {count > 0 && ( +
+ {count} +
+ )} +
+); diff --git a/src/components/Threads/hooks/useStateStore.ts b/src/components/Threads/hooks/useStateStore.ts new file mode 100644 index 000000000..fbc0cfe3c --- /dev/null +++ b/src/components/Threads/hooks/useStateStore.ts @@ -0,0 +1,31 @@ +import { useEffect, useState } from 'react'; + +import type { StateStore } from 'stream-chat'; + +export function useStateStore, O extends readonly unknown[]>( + store: StateStore, + selector: (v: T) => O, +): O; +export function useStateStore, O extends readonly unknown[]>( + store: StateStore | undefined, + selector: (v: T) => O, +): O | undefined; +export function useStateStore, O extends readonly unknown[]>( + store: StateStore | undefined, + selector: (v: T) => O, +) { + const [state, setState] = useState(() => { + if (!store) return undefined; + return selector(store.getLatestValue()); + }); + + useEffect(() => { + if (!store) return; + + const unsubscribe = store.subscribeWithSelector(selector, setState); + + return unsubscribe; + }, [store, selector]); + + return state; +} diff --git a/src/components/Threads/hooks/useThreadManagerState.ts b/src/components/Threads/hooks/useThreadManagerState.ts new file mode 100644 index 000000000..1ee2e85b2 --- /dev/null +++ b/src/components/Threads/hooks/useThreadManagerState.ts @@ -0,0 +1,11 @@ +import { useChatContext } from 'context'; +import { useStateStore } from './useStateStore'; +import { ThreadManagerState } from 'stream-chat'; + +export const useThreadManagerState = ( + selector: (nextValue: ThreadManagerState) => T, +) => { + const { client } = useChatContext(); + + return useStateStore(client.threads.state, selector); +}; diff --git a/src/components/Threads/hooks/useThreadState.ts b/src/components/Threads/hooks/useThreadState.ts new file mode 100644 index 000000000..be02838ef --- /dev/null +++ b/src/components/Threads/hooks/useThreadState.ts @@ -0,0 +1,16 @@ +import { ThreadState } from 'stream-chat'; +import { useStateStore } from './useStateStore'; +import { useThreadListItemContext } from '../ThreadList'; +import { useThreadContext } from '../ThreadContext'; + +/** + * @description returns thread state, prioritizes `ThreadListItemContext` falls back to `ThreadContext` if not former is not present + */ +export const useThreadState = ( + selector: (nextValue: ThreadState) => T, +) => { + const listItemThread = useThreadListItemContext(); + const thread = useThreadContext(); + + return useStateStore(listItemThread?.state ?? thread?.state, selector); +}; diff --git a/src/components/Threads/icons.tsx b/src/components/Threads/icons.tsx new file mode 100644 index 000000000..d67e41627 --- /dev/null +++ b/src/components/Threads/icons.tsx @@ -0,0 +1,71 @@ +/* eslint-disable react/display-name */ +import React from 'react'; +import { ComponentPropsWithoutRef } from 'react'; + +// TODO: unify icons across SDK +export const Icon = { + MessageBubble: (props: ComponentPropsWithoutRef<'svg'>) => ( + + + + ), + MessageBubbleEmpty: (props: ComponentPropsWithoutRef<'svg'>) => ( + + + + ), + Reload: (props: ComponentPropsWithoutRef<'svg'>) => ( + + + + ), + User: (props: ComponentPropsWithoutRef<'svg'>) => ( + + + + ), +}; diff --git a/src/components/Threads/index.ts b/src/components/Threads/index.ts new file mode 100644 index 000000000..7347139bd --- /dev/null +++ b/src/components/Threads/index.ts @@ -0,0 +1,3 @@ +export * from './ThreadContext'; +export * from './ThreadList'; +export * from './hooks/useStateStore'; diff --git a/src/components/UserItem/__tests__/UserItem.test.js b/src/components/UserItem/__tests__/UserItem.test.js index aaf7527c7..1e6461f27 100644 --- a/src/components/UserItem/__tests__/UserItem.test.js +++ b/src/components/UserItem/__tests__/UserItem.test.js @@ -18,15 +18,25 @@ describe('UserItem', () => { className="str-chat__user-item" >
-
+ + +
= { - Attachment: React.ComponentType>; - DateSeparator: React.ComponentType; - Message: React.ComponentType>; - MessageSystem: React.ComponentType>; - reactionOptions: ReactionOptions; - UnreadMessagesSeparator: React.ComponentType; + Attachment?: React.ComponentType>; AttachmentPreviewList?: React.ComponentType; AudioRecorder?: React.ComponentType; AutocompleteSuggestionItem?: React.ComponentType>; @@ -67,6 +64,7 @@ export type ComponentContextValue< BaseImage?: React.ComponentType; CooldownTimer?: React.ComponentType; CustomMessageActionsList?: React.ComponentType>; + DateSeparator?: React.ComponentType; EditMessageInput?: React.ComponentType>; EmojiPicker?: React.ComponentType; emojiSearchIndex?: EmojiSearchIndex; @@ -77,6 +75,7 @@ export type ComponentContextValue< Input?: React.ComponentType>; LinkPreviewList?: React.ComponentType; LoadingIndicator?: React.ComponentType; + Message?: React.ComponentType>; MessageBouncePrompt?: React.ComponentType; MessageDeleted?: React.ComponentType>; MessageListNotifications?: React.ComponentType; @@ -84,11 +83,13 @@ export type ComponentContextValue< MessageOptions?: React.ComponentType>; MessageRepliesCountButton?: React.ComponentType; MessageStatus?: React.ComponentType; + MessageSystem?: React.ComponentType>; MessageTimestamp?: React.ComponentType>; ModalGallery?: React.ComponentType; PinIndicator?: React.ComponentType>; QuotedMessage?: React.ComponentType; QuotedMessagePreview?: React.ComponentType>; + reactionOptions?: ReactionOptions; ReactionSelector?: React.ForwardRefExoticComponent>; ReactionsList?: React.ComponentType>; RecordingPermissionDeniedNotification?: React.ComponentType; @@ -97,15 +98,21 @@ export type ComponentContextValue< ThreadHead?: React.ComponentType>; ThreadHeader?: React.ComponentType>; ThreadInput?: React.ComponentType>; + ThreadListEmptyPlaceholder?: React.ComponentType; + ThreadListItem?: React.ComponentType; + ThreadListItemUI?: React.ComponentType; + ThreadListLoadingIndicator?: React.ComponentType; + ThreadListUnseenThreadsBanner?: React.ComponentType; ThreadStart?: React.ComponentType; Timestamp?: React.ComponentType; TriggerProvider?: React.ComponentType; TypingIndicator?: React.ComponentType; UnreadMessagesNotification?: React.ComponentType; + UnreadMessagesSeparator?: React.ComponentType; VirtualMessage?: React.ComponentType>; }; -export const ComponentContext = React.createContext(undefined); +export const ComponentContext = React.createContext({}); export const ComponentProvider = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics, @@ -125,20 +132,12 @@ export const useComponentContext = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics, V extends CustomTrigger = CustomTrigger >( - componentName?: string, -) => { - const contextValue = useContext(ComponentContext); - - if (!contextValue) { - console.warn( - `The useComponentContext hook was called outside of the ComponentContext provider. Make sure this hook is called within a child of the Channel component. The errored call is located in the ${componentName} component.`, - ); - - return {} as ComponentContextValue; - } - - return contextValue as ComponentContextValue; -}; + /** + * @deprecated + */ + // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars + _componentName?: string, +) => (useContext(ComponentContext) as unknown) as ComponentContextValue; /** * Typescript currently does not support partial inference, so if ComponentContext diff --git a/src/context/MessageContext.tsx b/src/context/MessageContext.tsx index 77ac4ed9b..6af8d11d8 100644 --- a/src/context/MessageContext.tsx +++ b/src/context/MessageContext.tsx @@ -162,15 +162,12 @@ export const MessageProvider = < export const useMessageContext = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics >( - componentName?: string, + // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars + _componentName?: string, ) => { const contextValue = useContext(MessageContext); if (!contextValue) { - console.warn( - `The useMessageContext hook was called outside of the MessageContext provider. Make sure this hook is called within the Message's UI component. The errored call is located in the ${componentName} component.`, - ); - return {} as MessageContextValue; } diff --git a/src/context/WithComponents.tsx b/src/context/WithComponents.tsx new file mode 100644 index 000000000..6b55e83fb --- /dev/null +++ b/src/context/WithComponents.tsx @@ -0,0 +1,11 @@ +import React, { PropsWithChildren, useContext } from 'react'; +import { ComponentContext, ComponentContextValue } from './ComponentContext'; + +export function WithComponents({ + children, + overrides, +}: PropsWithChildren<{ overrides: Partial }>) { + const parentOverrides = useContext(ComponentContext); + const actualOverrides: ComponentContextValue = { ...parentOverrides, ...overrides }; + return {children}; +} diff --git a/src/context/index.ts b/src/context/index.ts index 21c075feb..8a1be8302 100644 --- a/src/context/index.ts +++ b/src/context/index.ts @@ -9,3 +9,4 @@ export * from './MessageInputContext'; export * from './MessageListContext'; export * from './TranslationContext'; export * from './TypingContext'; +export * from './WithComponents'; diff --git a/yarn.lock b/yarn.lock index 8936b8ca1..c3ad7cc26 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2356,10 +2356,10 @@ crypto-browserify "^3.11.0" process-es6 "^0.11.2" -"@stream-io/stream-chat-css@5.0.0-rc.2": - version "5.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@stream-io/stream-chat-css/-/stream-chat-css-5.0.0-rc.2.tgz#05c5195c316f1e0eedf8c2de5b95df96bc6076b5" - integrity sha512-YC21H7o4O8lvpCqhLw1aRnXF2b2GJjkLTjmOtLbhFPKRtkN86wlK6wdVyIhpexTS4+nMlImYL9yCAgxr3hmxSQ== +"@stream-io/stream-chat-css@^5.0.0-rc.3": + version "5.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@stream-io/stream-chat-css/-/stream-chat-css-5.0.0-rc.3.tgz#157eea9e1de3c1fc91b093d133db6fb79cfe7f27" + integrity sha512-ejQxUtwlu2Tf/cwNNhNHMOPd8qh0LhbukcS4Z+6zxzH4kdu9ibt0zs1NRF2j3JHXnDdvTJMV3L1w0zcPfDoO3g== "@stream-io/transliterate@^1.5.5": version "1.5.5" @@ -12200,10 +12200,10 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== -stream-chat@8.39.0: - version "8.39.0" - resolved "https://registry.yarnpkg.com/stream-chat/-/stream-chat-8.39.0.tgz#f4cb86bd5cac4c1272c24cd66ed4752bcda8d717" - integrity sha512-zQZR1tPrgGBbu+Gnv9F9KQx3OPUMvb0FN+39BEjkjgjRPm2JYhF78jfcYutQMiC538t3V+NgFGgj5N4sZvSsUA== +stream-chat@^8.40.0: + version "8.40.0" + resolved "https://registry.yarnpkg.com/stream-chat/-/stream-chat-8.40.0.tgz#4d6b8c65d766b7fe5d1e5070df2ffd523b591816" + integrity sha512-L2WPny35o6TNtM5xrE+uLaTmmWJy2I51GCD0qOOZnK6vkqdh9WqqORmhChZ4EjqPHKxFjcgNrkoIBzW1FQcyhg== dependencies: "@babel/runtime" "^7.16.3" "@types/jsonwebtoken" "~9.0.0" @@ -12213,7 +12213,7 @@ stream-chat@8.39.0: form-data "^4.0.0" isomorphic-ws "^4.0.1" jsonwebtoken "~9.0.0" - ws "^7.4.4" + ws "^7.5.10" stream-combiner2@~1.1.1: version "1.1.1" @@ -13587,10 +13587,10 @@ write@1.0.3: dependencies: mkdirp "^0.5.1" -ws@^7.4.4: - version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== +ws@^7.5.10: + version "7.5.10" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== ws@^8.18.0, ws@^8.2.3: version "8.18.0"