diff --git a/.changeset/mighty-walls-know.md b/.changeset/mighty-walls-know.md new file mode 100644 index 0000000000..c6cd5bc5fe --- /dev/null +++ b/.changeset/mighty-walls-know.md @@ -0,0 +1,38 @@ +--- +'@xstate/store': patch +--- + +Initial release of `@xstate/store` + +```ts +import { createStore } from '@xstate/store'; + +const store = createStore( + // initial context + { count: 0, greeting: 'hello' }, + // transitions + { + inc: { + count: (context) => context.count + 1 + }, + updateBoth: { + count: () => 42, + greeting: 'hi' + } + } +); + +store.send({ + type: 'inc' +}); + +console.log(store.getSnapshot()); +// Logs: +// { +// status: 'active', +// context: { +// count: 1, +// greeting: 'hello' +// } +// } +``` diff --git a/packages/xstate-react/package.json b/packages/xstate-react/package.json index d971830d64..72e22d8eb8 100644 --- a/packages/xstate-react/package.json +++ b/packages/xstate-react/package.json @@ -64,10 +64,10 @@ }, "dependencies": { "use-isomorphic-layout-effect": "^1.1.2", - "use-sync-external-store": "^1.0.0" + "use-sync-external-store": "^1.2.0" }, "devDependencies": { - "@testing-library/react": "^13.4.0", + "@testing-library/react": "^14.2.1", "@types/jsdom": "^12.2.3", "@types/react": "^17.0.43", "@types/react-dom": "^17.0.14", diff --git a/packages/xstate-store/LICENSE b/packages/xstate-store/LICENSE new file mode 100644 index 0000000000..fc1fe941e2 --- /dev/null +++ b/packages/xstate-store/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 David Khourshid + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/packages/xstate-store/README.md b/packages/xstate-store/README.md new file mode 100644 index 0000000000..08c159e9da --- /dev/null +++ b/packages/xstate-store/README.md @@ -0,0 +1 @@ +# `@xstate/store` diff --git a/packages/xstate-store/package.json b/packages/xstate-store/package.json new file mode 100644 index 0000000000..666123c7f5 --- /dev/null +++ b/packages/xstate-store/package.json @@ -0,0 +1,72 @@ +{ + "name": "@xstate/store", + "version": "0.0.1", + "description": "Simple stores", + "keywords": [ + "store", + "state" + ], + "author": "David Khourshid ", + "homepage": "https://github.com/statelyai/xstate/tree/main/packages/xstate-store#readme", + "license": "MIT", + "main": "dist/xstate-store.cjs.js", + "module": "dist/xstate-store.esm.js", + "exports": { + ".": { + "types": { + "import": "./dist/xstate-store.cjs.mjs", + "default": "./dist/xstate-store.cjs.js" + }, + "module": "./dist/xstate-store.esm.js", + "import": "./dist/xstate-store.cjs.mjs", + "default": "./dist/xstate-store.cjs.js" + }, + "./react": { + "types": { + "import": "./react/dist/xstate-store-react.cjs.mjs", + "default": "./react/dist/xstate-store-react.cjs.js" + }, + "module": "./react/dist/xstate-store-react.esm.js", + "import": "./react/dist/xstate-store-react.cjs.mjs", + "default": "./react/dist/xstate-store-react.cjs.js" + }, + "./package.json": "./package.json" + }, + "sideEffects": false, + "files": [ + "dist", + "react" + ], + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/statelyai/xstate.git" + }, + "scripts": {}, + "bugs": { + "url": "https://github.com/statelyai/xstate/issues" + }, + "dependencies": { + "use-sync-external-store": "^1.2.0" + }, + "devDependencies": { + "@testing-library/react": "^14.2.1", + "immer": "^10.0.2", + "react": "^18.0.0", + "xstate": "^5.9.1" + }, + "peerDependencies": { + "react": "^18.2.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } + }, + "preconstruct": { + "umdName": "XStateStore", + "entrypoints": [ + "./index.ts", + "./react.ts" + ] + } +} diff --git a/packages/xstate-store/react/package.json b/packages/xstate-store/react/package.json new file mode 100644 index 0000000000..7c686e77da --- /dev/null +++ b/packages/xstate-store/react/package.json @@ -0,0 +1,4 @@ +{ + "main": "dist/xstate-store-react.cjs.js", + "module": "dist/xstate-store-react.esm.js" +} diff --git a/packages/xstate-store/src/fromStore.ts b/packages/xstate-store/src/fromStore.ts new file mode 100644 index 0000000000..516839dfb1 --- /dev/null +++ b/packages/xstate-store/src/fromStore.ts @@ -0,0 +1,44 @@ +import { createStore, createStoreTransition } from './store'; +import { + EventPayloadMap, + StoreContext, + StoreSnapshot, + Snapshot +} from './types'; + +/** + * An actor logic creator which creates store actor logic. + * + * @param initialContext The initial context for the store, either a function that returns context based on input, or the context itself + * @param transitions The transitions object defining how the context updates due to events + * @returns An actor logic creator function that creates store actor logic + */ +export function fromStore< + TContext extends StoreContext, + TEventPayloadMap extends EventPayloadMap, + TInput +>( + initialContext: ((input: TInput) => TContext) | TContext, + transitions: Parameters>[1] +) { + const transition = createStoreTransition( + transitions + ); + return { + transition, + start: () => {}, + getInitialSnapshot: (_: any, input: TInput) => { + return { + status: 'active', + context: + typeof initialContext === 'function' + ? initialContext(input) + : initialContext, + output: undefined, + error: undefined + } satisfies StoreSnapshot; + }, + getPersistedSnapshot: (s: StoreSnapshot) => s, + restoreSnapshot: (s: Snapshot) => s as StoreSnapshot + }; +} diff --git a/packages/xstate-store/src/index.ts b/packages/xstate-store/src/index.ts new file mode 100644 index 0000000000..1126b217b0 --- /dev/null +++ b/packages/xstate-store/src/index.ts @@ -0,0 +1,2 @@ +export { fromStore } from './fromStore'; +export { createStore, createStoreWithProducer } from './store'; diff --git a/packages/xstate-store/src/react.ts b/packages/xstate-store/src/react.ts new file mode 100644 index 0000000000..d8aba47d64 --- /dev/null +++ b/packages/xstate-store/src/react.ts @@ -0,0 +1,45 @@ +import { useCallback } from 'react'; +import { useSyncExternalStoreWithSelector } from 'use-sync-external-store/shim/with-selector'; +import { Store, SnapshotFromStore } from './types'; + +type SyncExternalStoreSubscribe = Parameters< + typeof useSyncExternalStoreWithSelector +>[0]; + +function defaultCompare(a: T, b: T) { + return a === b; +} + +export function useSelector | undefined, T>( + actor: TStore, + selector: ( + emitted: TStore extends Store + ? SnapshotFromStore + : undefined + ) => T, + compare: (a: T, b: T) => boolean = defaultCompare +): T { + const subscribe: SyncExternalStoreSubscribe = useCallback( + (handleStoreChange) => { + if (!actor) { + return () => {}; + } + const { unsubscribe } = actor.subscribe(handleStoreChange); + return unsubscribe; + }, + [actor] + ); + + const boundGetSnapshot = useCallback(() => actor?.getSnapshot(), [actor]); + + const selectedSnapshot = useSyncExternalStoreWithSelector( + subscribe, + // @ts-ignore + boundGetSnapshot, + boundGetSnapshot, + selector, + compare + ); + + return selectedSnapshot; +} diff --git a/packages/xstate-store/src/store.ts b/packages/xstate-store/src/store.ts new file mode 100644 index 0000000000..66362954fc --- /dev/null +++ b/packages/xstate-store/src/store.ts @@ -0,0 +1,273 @@ +import { + Recipe, + EventPayloadMap, + Store, + ExtractEventsFromPayloadMap, + StoreSnapshot, + StorePartialAssigner, + StoreCompleteAssigner, + StoreAssigner, + StorePropertyAssigner, + Observer, + StoreContext, + InteropSubscribable +} from './types'; + +const symbolObservable: typeof Symbol.observable = (() => + (typeof Symbol === 'function' && Symbol.observable) || + '@@observable')() as any; + +function toObserver( + nextHandler?: Observer | ((value: T) => void), + errorHandler?: (error: any) => void, + completionHandler?: () => void +): Observer { + const isObserver = typeof nextHandler === 'object'; + const self = isObserver ? nextHandler : undefined; + + return { + next: (isObserver ? nextHandler.next : nextHandler)?.bind(self), + error: (isObserver ? nextHandler.error : errorHandler)?.bind(self), + complete: (isObserver ? nextHandler.complete : completionHandler)?.bind( + self + ) + }; +} + +function setter( + context: TContext, + recipe: Recipe +): TContext { + return recipe(context); +} + +function createStoreCore< + TContext extends StoreContext, + TEventPayloadMap extends EventPayloadMap +>( + initialContext: TContext, + transitions: { + [K in keyof TEventPayloadMap & string]: + | StoreAssigner, { type: K } & TEventPayloadMap[K]> + | StorePropertyAssigner< + NoInfer, + { type: K } & TEventPayloadMap[K] + >; + }, + updater?: ( + context: NoInfer, + recipe: (context: NoInfer) => NoInfer + ) => NoInfer +): Store> { + type StoreEvent = ExtractEventsFromPayloadMap; + let observers: Set>> | undefined; + const initialSnapshot = { + context: initialContext, + status: 'active', + output: undefined, + error: undefined + } satisfies StoreSnapshot as StoreSnapshot; + let currentSnapshot = initialSnapshot; + const transition = createStoreTransition( + transitions, + updater + ); + + function receive(event: StoreEvent) { + currentSnapshot = transition(currentSnapshot, event); + + observers?.forEach((o) => o.next?.(currentSnapshot)); + } + + const store: Store = { + send(event) { + receive(event as unknown as StoreEvent); + }, + getSnapshot() { + return currentSnapshot; + }, + getInitialSnapshot() { + return initialSnapshot; + }, + subscribe(observerOrFn) { + const observer = toObserver(observerOrFn); + observers ??= new Set(); + observers.add(observer); + + return { + unsubscribe() { + return observers?.delete(observer); + } + }; + }, + [symbolObservable](): InteropSubscribable> { + return this; + } + }; + + return store; +} + +/** + * Creates a `Store` that has its own internal state and can receive events. + * + * @example + ```ts + const store = createStore({ + // initial context + { count: 0 }, + // transitions + { + on: { + inc: (context, event: { by: number }) => { + return { + count: context.count + event.by + } + } + } + } + }); + + store.getSnapshot(); // { context: { count: 0 } } + store.send({ type: 'inc', by: 5 }); + store.getSnapshot(); // { context: { count: 5 } } + ``` + */ +export function createStore< + TContext extends StoreContext, + TEventPayloadMap extends EventPayloadMap +>( + initialContext: TContext, + transitions: { + [K in keyof TEventPayloadMap & string]: + | StoreAssigner, { type: K } & TEventPayloadMap[K]> + | StorePropertyAssigner< + NoInfer, + { type: K } & TEventPayloadMap[K] + >; + } +): Store> { + return createStoreCore(initialContext, transitions); +} + +/** + * Creates a `Store` with a provided producer (such as Immer's `producer(…)` + * A store has its own internal state and can receive events. + * + * @example + ```ts + import { produce } from 'immer'; + + const store = createStoreWithProducer(produce, { + // initial context + { count: 0 }, + // transitions + { + on: { + inc: (context, event: { by: number }) => { + context.count += event.by; + } + } + } + }); + + store.getSnapshot(); // { context: { count: 0 } } + store.send({ type: 'inc', by: 5 }); + store.getSnapshot(); // { context: { count: 5 } } + ``` + */ +export function createStoreWithProducer< + TContext extends StoreContext, + TEventPayloadMap extends EventPayloadMap +>( + producer: ( + context: TContext, + recipe: (context: TContext) => void + ) => TContext, + initialContext: TContext, + transitions: { + [K in keyof TEventPayloadMap & string]: ( + context: NoInfer, + event: { type: K } & TEventPayloadMap[K] + ) => void; + } +): Store> { + return createStoreCore(initialContext, transitions as any, producer); +} + +declare global { + interface SymbolConstructor { + readonly observable: symbol; + } +} + +export function createStoreTransition< + TContext extends StoreContext, + TEventPayloadMap extends EventPayloadMap +>( + transitions: { + [K in keyof TEventPayloadMap & string]: + | StoreAssigner, { type: K } & TEventPayloadMap[K]> + | StorePropertyAssigner< + NoInfer, + { type: K } & TEventPayloadMap[K] + >; + }, + updater?: ( + context: NoInfer, + recipe: (context: NoInfer) => NoInfer + ) => NoInfer +) { + return ( + snapshot: StoreSnapshot, + event: ExtractEventsFromPayloadMap + ): StoreSnapshot => { + type StoreEvent = ExtractEventsFromPayloadMap; + let currentContext = snapshot.context; + const assigner = transitions?.[event.type as StoreEvent['type']]; + + if (!assigner) { + return snapshot; + } + + if (typeof assigner === 'function') { + currentContext = updater + ? updater( + currentContext, + (draftContext) => + (assigner as StoreCompleteAssigner)?.( + draftContext, + event + ) + ) + : setter(currentContext, (draftContext) => + Object.assign( + {}, + currentContext, + assigner?.( + draftContext, + event as any // TODO: help me + ) + ) + ); + } else { + const partialUpdate: Record = {}; + for (const key of Object.keys(assigner)) { + const propAssignment = assigner[key]; + partialUpdate[key] = + typeof propAssignment === 'function' + ? ( + propAssignment as StorePartialAssigner< + TContext, + StoreEvent, + typeof key + > + )(currentContext, event) + : propAssignment; + } + currentContext = Object.assign({}, currentContext, partialUpdate); + } + + return { ...snapshot, context: currentContext }; + }; +} diff --git a/packages/xstate-store/src/types.ts b/packages/xstate-store/src/types.ts new file mode 100644 index 0000000000..631d9a5154 --- /dev/null +++ b/packages/xstate-store/src/types.ts @@ -0,0 +1,114 @@ +export type EventPayloadMap = Record; + +export type ExtractEventsFromPayloadMap = Values<{ + [K in keyof T & string]: T[K] & { type: K }; +}>; + +export type Recipe = (state: T) => TReturn; + +export type StoreAssigner< + TContext extends StoreContext, + TEvent extends EventObject +> = (context: TContext, event: TEvent) => Partial; +export type StoreCompleteAssigner = ( + ctx: TContext, + ev: TEvent +) => TContext; +export type StorePartialAssigner< + TContext, + TEvent extends EventObject, + K extends keyof TContext +> = (ctx: TContext, ev: TEvent) => Partial[K]; +export type StorePropertyAssigner = { + [K in keyof TContext]?: + | TContext[K] + | StorePartialAssigner; +}; + +export type Snapshot = + | { + status: 'active'; + output: undefined; + error: undefined; + } + | { + status: 'done'; + output: TOutput; + error: undefined; + } + | { + status: 'error'; + output: undefined; + error: unknown; + } + | { + status: 'stopped'; + output: undefined; + error: undefined; + }; + +export type StoreSnapshot = Snapshot & { + context: TContext; +}; + +/** + * An actor-like object that: + * - has its own state + * - can receive events + * - is observable + */ +export interface Store + extends Subscribable>, + InteropObservable> { + send: (event: Ev) => void; + getSnapshot: () => StoreSnapshot; + getInitialSnapshot: () => StoreSnapshot; +} + +export type SnapshotFromStore> = + TStore extends Store ? StoreSnapshot : never; + +// Copied from XState core +// ----------------------- + +export interface InteropSubscribable { + subscribe(observer: Observer): Subscription; +} + +interface InteropObservable { + [Symbol.observable]: () => InteropSubscribable; +} + +// Based on RxJS types +export type Observer = { + next?: (value: T) => void; + error?: (err: unknown) => void; + complete?: () => void; +}; + +export interface Subscription { + unsubscribe(): void; +} + +export interface Subscribable extends InteropSubscribable { + subscribe(observer: Observer): Subscription; + subscribe( + next: (value: T) => void, + error?: (error: any) => void, + complete?: () => void + ): Subscription; +} + +// Same as MachineContext (for now) +export type StoreContext = Record; + +/** + * The full definition of an event, with a string `type`. + */ +export type EventObject = { + /** + * The type of event that is sent. + */ + type: string; +}; +type Values = T[keyof T]; diff --git a/packages/xstate-store/test/fromStore.test.ts b/packages/xstate-store/test/fromStore.test.ts new file mode 100644 index 0000000000..3f46cc5670 --- /dev/null +++ b/packages/xstate-store/test/fromStore.test.ts @@ -0,0 +1,24 @@ +import { createActor } from 'xstate'; +import { fromStore } from '../src/index.ts'; + +describe('fromStore', () => { + it('creates an actor from store logic with input', () => { + const storeLogic = fromStore((count: number) => ({ count }), { + inc: { + count: (ctx, ev: { by: number }) => { + return ctx.count + ev.by; + } + } + }); + + const actor = createActor(storeLogic, { + input: 42 + }); + + actor.start(); + + actor.send({ type: 'inc', by: 8 }); + + expect(actor.getSnapshot().context.count).toEqual(50); + }); +}); diff --git a/packages/xstate-store/test/react.test.tsx b/packages/xstate-store/test/react.test.tsx new file mode 100644 index 0000000000..3dd9c31fe1 --- /dev/null +++ b/packages/xstate-store/test/react.test.tsx @@ -0,0 +1,148 @@ +import { fireEvent, screen, render } from '@testing-library/react'; +import { createStore } from '../src/index.ts'; +import { useSelector } from '../src/react.ts'; +import ReactDOM from 'react-dom'; + +it('useSelector should work', () => { + const store = createStore( + { + count: 0 + }, + { + inc: { + count: (ctx) => ctx.count + 1 + } + } + ); + + const Counter = () => { + const count = useSelector(store, (s) => s.context.count); + + return ( +
{ + store.send({ type: 'inc' }); + }} + > + {count} +
+ ); + }; + + render(); + + const countDiv = screen.getByTestId('count'); + + expect(countDiv.textContent).toEqual('0'); + + fireEvent.click(countDiv); + + expect(countDiv.textContent).toEqual('1'); +}); + +it('useSelector can take in a custom comparator', () => { + const store = createStore( + { + items: [1, 2] + }, + { + same: { + items: () => [1, 2] // different array, same items + }, + different: { + items: () => [3, 4] + } + } + ); + + let renderCount = 0; + const Items = () => { + renderCount++; + const items = useSelector( + store, + (s) => s.context.items, + (a, b) => JSON.stringify(a) === JSON.stringify(b) + ); + + return ( + <> +
{ + store.send({ type: 'same' }); + }} + > + {items.join(',')} +
+ + + ); + }; + + render(); + + const itemsDiv = screen.getByTestId('items'); + + expect(itemsDiv.textContent).toEqual('1,2'); + + expect(renderCount).toBe(1); + + fireEvent.click(itemsDiv); + + expect(itemsDiv.textContent).toEqual('1,2'); + + expect(renderCount).toBe(1); + + fireEvent.click(screen.getByTestId('different')); + + expect(itemsDiv.textContent).toEqual('3,4'); + + expect(renderCount).toBe(2); +}); + +it('can batch updates', () => { + const store = createStore( + { + count: 0 + }, + { + inc: { + count: (ctx) => ctx.count + 1 + } + } + ); + + const Counter = () => { + const count = useSelector(store, (s) => s.context.count); + + return ( +
{ + ReactDOM.unstable_batchedUpdates(() => { + store.send({ type: 'inc' }); + store.send({ type: 'inc' }); + }); + }} + > + {count} +
+ ); + }; + + render(); + + const countDiv = screen.getByTestId('count'); + + expect(countDiv.textContent).toEqual('0'); + + fireEvent.click(countDiv); + + expect(countDiv.textContent).toEqual('2'); +}); diff --git a/packages/xstate-store/test/store.test.ts b/packages/xstate-store/test/store.test.ts new file mode 100644 index 0000000000..b3fe3fb8f6 --- /dev/null +++ b/packages/xstate-store/test/store.test.ts @@ -0,0 +1,152 @@ +import { produce } from 'immer'; +import { createStore, createStoreWithProducer } from '../src/index.ts'; + +it('updates a store with an event without mutating original context', () => { + const context = { count: 0 }; + const store = createStore(context, { + inc: (context, event: { by: number }) => { + return { + count: context.count + event.by + }; + } + }); + + const initial = store.getInitialSnapshot(); + + store.send({ type: 'inc', by: 1 }); + + const next = store.getSnapshot(); + + expect(initial.context).toEqual({ count: 0 }); + expect(next.context).toEqual({ count: 1 }); + expect(context.count).toEqual(0); +}); + +it('can update context with a property assigner', () => { + const store = createStore( + { count: 0, greeting: 'hello' }, + { + inc: { + count: (ctx) => ctx.count + 1 + }, + updateBoth: { + count: () => 42, + greeting: 'hi' + } + } + ); + + store.send({ + type: 'inc' + }); + expect(store.getSnapshot().context).toEqual({ count: 1, greeting: 'hello' }); + + store.send({ + type: 'updateBoth' + }); + expect(store.getSnapshot().context).toEqual({ count: 42, greeting: 'hi' }); +}); + +it('handles unknown events (does not do anything)', () => { + const store = createStore( + { count: 0 }, + { + inc: { + count: (ctx) => ctx.count + 1 + } + } + ); + + store.send({ + // @ts-expect-error + type: 'unknown' + }); + expect(store.getSnapshot().context).toEqual({ count: 0 }); +}); + +it('updates state from sent events', () => { + const store = createStore( + { + count: 0 + }, + { + inc: (ctx, ev: { by: number }) => { + return { + count: ctx.count + ev.by + }; + }, + dec: (ctx, ev: { by: number }) => { + return { + count: ctx.count - ev.by + }; + }, + clear: () => { + return { + count: 0 + }; + } + } + ); + + store.send({ type: 'inc', by: 9 }); + store.send({ type: 'dec', by: 3 }); + + expect(store.getSnapshot().context).toEqual({ count: 6 }); + store.send({ type: 'clear' }); + + expect(store.getSnapshot().context).toEqual({ count: 0 }); +}); + +it('works with immer', () => { + const store = createStoreWithProducer( + produce, + { + count: 0 + }, + { + inc: (ctx, ev: { by: number }) => { + ctx.count += ev.by; + } + } + ); + + store.send({ type: 'inc', by: 3 }); + store.send({ + // @ts-expect-error + type: 'whatever' + }); + + expect(store.getSnapshot().context).toEqual({ count: 3 }); + expect(store.getInitialSnapshot().context).toEqual({ count: 0 }); +}); + +it('can be observed', () => { + const store = createStore( + { + count: 0 + }, + { + inc: { + count: (ctx) => ctx.count + 1 + } + } + ); + + const counts: number[] = []; + + const sub = store.subscribe((s) => counts.push(s.context.count)); + + store.send({ type: 'inc' }); // 1 + store.send({ type: 'inc' }); // 2 + store.send({ type: 'inc' }); // 3 + + expect(counts).toEqual([1, 2, 3]); + + sub.unsubscribe(); + + store.send({ type: 'inc' }); // 4 + store.send({ type: 'inc' }); // 5 + store.send({ type: 'inc' }); // 6 + + expect(counts).toEqual([1, 2, 3]); +}); diff --git a/yarn.lock b/yarn.lock index ac115ee6fa..0385aada7b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1916,6 +1916,20 @@ lz-string "^1.4.4" pretty-format "^27.0.2" +"@testing-library/dom@^9.0.0": + version "9.3.4" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-9.3.4.tgz#50696ec28376926fec0a1bf87d9dbac5e27f60ce" + integrity sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/runtime" "^7.12.5" + "@types/aria-query" "^5.0.1" + aria-query "5.1.3" + chalk "^4.1.0" + dom-accessibility-api "^0.5.9" + lz-string "^1.5.0" + pretty-format "^27.0.2" + "@testing-library/jest-dom@^6.1.4": version "6.1.4" resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.1.4.tgz#cf0835c33bc5ef00befb9e672b1e3e6a710e30e3" @@ -1930,13 +1944,13 @@ lodash "^4.17.15" redent "^3.0.0" -"@testing-library/react@^13.4.0": - version "13.4.0" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-13.4.0.tgz#6a31e3bf5951615593ad984e96b9e5e2d9380966" - integrity sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw== +"@testing-library/react@^14.2.1": + version "14.2.1" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-14.2.1.tgz#bf69aa3f71c36133349976a4a2da3687561d8310" + integrity sha512-sGdjws32ai5TLerhvzThYFbpnF9XtL65Cjf+gB0Dhr29BGqK+mAeN7SURSdu+eqgET4ANcWoC7FQpkaiGvBr+A== dependencies: "@babel/runtime" "^7.12.5" - "@testing-library/dom" "^8.5.0" + "@testing-library/dom" "^9.0.0" "@types/react-dom" "^18.0.0" "@testing-library/svelte@^3.2.2": @@ -2529,6 +2543,13 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +aria-query@5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" + integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== + dependencies: + deep-equal "^2.0.5" + aria-query@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" @@ -2557,6 +2578,14 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= +array-buffer-byte-length@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== + dependencies: + call-bind "^1.0.5" + is-array-buffer "^3.0.4" + array-differ@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" @@ -2668,6 +2697,13 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== +available-typed-arrays@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" @@ -2967,6 +3003,17 @@ call-bind@^1.0.0, call-bind@^1.0.2: function-bind "^1.1.1" get-intrinsic "^1.0.2" +call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" + call-me-maybe@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" @@ -3559,6 +3606,30 @@ dedent@^1.0.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.1.tgz#4f3fc94c8b711e9bb2800d185cd6ad20f2a90aff" integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg== +deep-equal@^2.0.5: + version "2.2.3" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.3.tgz#af89dafb23a396c7da3e862abc0be27cf51d56e1" + integrity sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.5" + es-get-iterator "^1.1.3" + get-intrinsic "^1.2.2" + is-arguments "^1.1.1" + is-array-buffer "^3.0.2" + is-date-object "^1.0.5" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + isarray "^2.0.5" + object-is "^1.1.5" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.1" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.13" + deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" @@ -3604,6 +3675,15 @@ defer-to-connect@^1.0.1: resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== +define-data-property@^1.0.1, define-data-property@^1.1.2, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + define-lazy-prop@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" @@ -3617,6 +3697,15 @@ define-properties@^1.1.3, define-properties@^1.1.4: has-property-descriptors "^1.0.0" object-keys "^1.1.1" +define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" @@ -3829,6 +3918,33 @@ es-abstract@^1.19.0, es-abstract@^1.19.2, es-abstract@^1.19.5: string.prototype.trimstart "^1.0.5" unbox-primitive "^1.0.2" +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-get-iterator@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" + integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + is-arguments "^1.1.1" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.7" + isarray "^2.0.5" + stop-iteration-iterator "^1.0.0" + es-shim-unscopables@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" @@ -4296,6 +4412,13 @@ follow-redirects@0.0.7: debug "^2.2.0" stream-consume "^0.1.0" +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -4404,6 +4527,11 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + function.prototype.name@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" @@ -4414,7 +4542,7 @@ function.prototype.name@^1.1.5: es-abstract "^1.19.0" functions-have-names "^1.2.2" -functions-have-names@^1.2.2: +functions-have-names@^1.2.2, functions-have-names@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== @@ -4454,6 +4582,17 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@ has "^1.0.3" has-symbols "^1.0.3" +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + get-own-enumerable-property-symbols@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" @@ -4669,6 +4808,13 @@ globby@^9.2.0: pify "^4.0.1" slash "^2.0.0" +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + got@^9.6.0: version "9.6.0" resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" @@ -4821,6 +4967,18 @@ has-property-descriptors@^1.0.0: dependencies: get-intrinsic "^1.1.1" +has-property-descriptors@^1.0.1, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" @@ -4833,6 +4991,13 @@ has-tostringtag@^1.0.0: dependencies: has-symbols "^1.0.2" +has-tostringtag@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" @@ -4876,6 +5041,13 @@ hash-sum@^2.0.0: resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-2.0.0.tgz#81d01bb5de8ea4a214ad5d6ead1b523460b0b45a" integrity sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg== +hasown@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.1.tgz#26f48f039de2c0f8d3356c223fb8d50253519faa" + integrity sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA== + dependencies: + function-bind "^1.1.2" + homedir-polyfill@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" @@ -5131,6 +5303,15 @@ internal-slot@^1.0.3: has "^1.0.3" side-channel "^1.0.4" +internal-slot@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.0" + side-channel "^1.0.4" + interpret@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" @@ -5163,6 +5344,22 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" +is-arguments@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-array-buffer@^3.0.2, is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -5195,6 +5392,11 @@ is-buffer@^1.1.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== +is-callable@^1.1.3: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + is-callable@^1.1.4, is-callable@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" @@ -5235,7 +5437,7 @@ is-data-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" -is-date-object@^1.0.1: +is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== @@ -5352,6 +5554,11 @@ is-inside-container@^1.0.0: dependencies: is-docker "^3.0.0" +is-map@^2.0.1, is-map@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + is-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" @@ -5461,6 +5668,11 @@ is-relative@^1.0.0: dependencies: is-unc-path "^1.0.0" +is-set@^2.0.1, is-set@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + is-shared-array-buffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" @@ -5516,6 +5728,11 @@ is-unc-path@^1.0.0: dependencies: unc-path-regex "^0.1.2" +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" @@ -5523,6 +5740,14 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" +is-weakset@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" + integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + is-windows@^1.0.0, is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -5545,6 +5770,11 @@ isarray@1.0.0, isarray@~1.0.0: resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -6552,6 +6782,11 @@ lz-string@^1.4.4: resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" integrity sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY= +lz-string@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" + integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== + magic-string@^0.25.7: version "0.25.7" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" @@ -7054,6 +7289,14 @@ object-inspect@^1.12.2, object-inspect@^1.9.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== +object-is@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07" + integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" @@ -7534,6 +7777,11 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + postcss-modules-extract-imports@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" @@ -7933,6 +8181,16 @@ regexp.prototype.flags@^1.4.3: define-properties "^1.1.3" functions-have-names "^1.2.2" +regexp.prototype.flags@^1.5.1: + version "1.5.2" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" + integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== + dependencies: + call-bind "^1.0.6" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.1" + regexpu-core@^5.3.1: version "5.3.2" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" @@ -8298,6 +8556,28 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= +set-function-length@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.1.tgz#47cc5945f2c771e2cf261c6737cf9684a2a5e425" + integrity sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g== + dependencies: + define-data-property "^1.1.2" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.1" + +set-function-name@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + set-value@^2.0.0, set-value@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" @@ -8622,6 +8902,13 @@ stealthy-require@^1.1.1: resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= +stop-iteration-iterator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" + integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== + dependencies: + internal-slot "^1.0.4" + stream-consume@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.1.tgz#d3bdb598c2bd0ae82b8cac7ac50b1107a7996c48" @@ -9342,10 +9629,10 @@ use-isomorphic-layout-effect@^1.1.2: resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== -use-sync-external-store@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.0.0.tgz#d98f4a9c2e73d0f958e7e2d2c2bfb5f618cbd8fd" - integrity sha512-AFVsxg5GkFg8GDcxnl+Z0lMAz9rE8DGJCc28qnBuQF7lac57B5smLcT37aXpXIIPz75rW4g3eXHPjhHwdGskOw== +use-sync-external-store@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" + integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== use@^3.1.0: version "3.1.1" @@ -9539,6 +9826,16 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" @@ -9552,6 +9849,17 @@ which-pm@2.0.0: load-yaml-file "^0.2.0" path-exists "^4.0.0" +which-typed-array@^1.1.13: + version "1.1.14" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.14.tgz#1f78a111aee1e131ca66164d8bdc3ab062c95a06" + integrity sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg== + dependencies: + available-typed-arrays "^1.0.6" + call-bind "^1.0.5" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.1" + which@^1.2.10, which@^1.2.14, which@^1.2.9, which@~1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"