From e609a831978779480f2522cdc5397a3106e8c964 Mon Sep 17 00:00:00 2001 From: Mohamed EL AYADI Date: Thu, 24 Nov 2022 12:22:22 +0100 Subject: [PATCH 1/4] fix devtools css issues --- .../devtools-extension/src/DevModeApp.tsx | 1 - .../DevtoolsView/CurrentJournalDisplay.tsx | 19 ++++++++++++------ .../src/DevtoolsView/CurrentStateDisplay.tsx | 12 +++++------ .../src/DevtoolsView/SiderDisplay.tsx | 5 ++--- .../src/DevtoolsView/index.tsx | 20 ++++++++++--------- packages/devtools-extension/src/index.css | 3 +++ 6 files changed, 34 insertions(+), 26 deletions(-) diff --git a/packages/devtools-extension/src/DevModeApp.tsx b/packages/devtools-extension/src/DevModeApp.tsx index 93b638a5..ebd25f52 100644 --- a/packages/devtools-extension/src/DevModeApp.tsx +++ b/packages/devtools-extension/src/DevModeApp.tsx @@ -2,7 +2,6 @@ import * as React from "react"; import {createSource, useSource} from "react-async-states"; -const counterSource = createSource("counter", null, {initialValue: 0}); let meter = 0; export default function DevModeApp() { diff --git a/packages/devtools-extension/src/DevtoolsView/CurrentJournalDisplay.tsx b/packages/devtools-extension/src/DevtoolsView/CurrentJournalDisplay.tsx index 112be324..28c6fecc 100644 --- a/packages/devtools-extension/src/DevtoolsView/CurrentJournalDisplay.tsx +++ b/packages/devtools-extension/src/DevtoolsView/CurrentJournalDisplay.tsx @@ -21,13 +21,19 @@ const CurrentJournalDisplay = React.memo(function Journal({lane}: { lane: string padding: 8, overflow: 'auto', borderRight: '1px dashed #C3C3C3', - }} className='main-bg scroll-y-auto'> -
- + }} className='main-bg'> +
+
+ +
+ style={{ + height: '100%', + overflowY: 'auto', + width: '100%', + }}>
); @@ -194,11 +200,12 @@ function CurrentJson() { return null; } return ( -
+
+
@@ -58,15 +58,13 @@ function CurrentTreeDisplay() { style={{ borderRight: "1px dashed #C3C3C3", }} - className="main-bg" + className="main-bg scroll-y-auto" >
diff --git a/packages/devtools-extension/src/DevtoolsView/SiderDisplay.tsx b/packages/devtools-extension/src/DevtoolsView/SiderDisplay.tsx index 6278ccbc..87363596 100644 --- a/packages/devtools-extension/src/DevtoolsView/SiderDisplay.tsx +++ b/packages/devtools-extension/src/DevtoolsView/SiderDisplay.tsx @@ -151,7 +151,6 @@ const SiderDisplay = React.memo(function () {
@@ -135,26 +135,28 @@ function AutoConfiguredDevtoolsImpl({ <> {!visible && ( )} - {visible && (
- {allowResize && } - setVisible(false)}/> -
)} + {visible && ( +
+ {allowResize && } + setVisible(false)}/> +
+ )} ); } diff --git a/packages/devtools-extension/src/index.css b/packages/devtools-extension/src/index.css index e80df572..44f571e0 100644 --- a/packages/devtools-extension/src/index.css +++ b/packages/devtools-extension/src/index.css @@ -172,6 +172,9 @@ body{ .resizer { z-index: 99; + position: absolute; + top: 0; + width: 100%; height: 4px; background-color: black; cursor: row-resize; From 41f859932765f2abb729c0488d47c77e786d5b47 Mon Sep 17 00:00:00 2001 From: Mohamed EL AYADI Date: Thu, 24 Nov 2022 12:32:35 +0100 Subject: [PATCH 2/4] add main animation --- .../src/DevtoolsView/index.tsx | 6 ++++-- packages/devtools-extension/src/index.css | 20 +++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/packages/devtools-extension/src/DevtoolsView/index.tsx b/packages/devtools-extension/src/DevtoolsView/index.tsx index 5ee110f0..1dc9570f 100644 --- a/packages/devtools-extension/src/DevtoolsView/index.tsx +++ b/packages/devtools-extension/src/DevtoolsView/index.tsx @@ -96,6 +96,7 @@ export function autoConfigureDevtools(props?: { open?: boolean }) { }, 'auto-devtools'); ReactDomRender(hostContainer, { @@ -152,7 +154,7 @@ function AutoConfiguredDevtoolsImpl({ )} {visible && ( -
+
{allowResize && } setVisible(false)}/>
diff --git a/packages/devtools-extension/src/index.css b/packages/devtools-extension/src/index.css index 44f571e0..184d3dcf 100644 --- a/packages/devtools-extension/src/index.css +++ b/packages/devtools-extension/src/index.css @@ -180,3 +180,23 @@ body{ cursor: row-resize; transition: all 200ms ease; } + +.root-devtools-animated { + transition: all; + animation: root-devtools-animation 600ms; +} + +@keyframes root-devtools-animation { + 0% { + opacity: 0; + } + /*25% {*/ + /* opacity: 1;*/ + /*}*/ + /*50% {*/ + /* opacity: 0;*/ + /*}*/ + 100% { + opacity: 1; + } +} From 1468ce6302054d1f5dddcf567cda320e530587a3 Mon Sep 17 00:00:00 2001 From: Mohamed EL AYADI Date: Thu, 24 Nov 2022 13:18:53 +0100 Subject: [PATCH 3/4] devtools : publish alpha-6 --- packages/devtools-extension/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/devtools-extension/package.json b/packages/devtools-extension/package.json index 3524b625..d7a72250 100644 --- a/packages/devtools-extension/package.json +++ b/packages/devtools-extension/package.json @@ -1,7 +1,7 @@ { "sideEffects": false, "types": "dist/index", - "version": "0.0.1-alpha-5", + "version": "0.0.1-alpha-6", "main": "dist/index.umd.js", "name": "async-states-devtools", "module": "dist/index.development.mjs", From 898685ef48faff4a01c2d52e0a7a59a5cc2283b3 Mon Sep 17 00:00:00 2001 From: EL AYADI Mohamed Date: Mon, 28 Nov 2022 14:38:18 +0100 Subject: [PATCH 4/4] rewrite useAsyncState and hook to use bitwise operators & renamings (#103) * rewrite hooks to use bitwise flags and scan config * some devtools fixes and enhancements * enhance subscriptions and subscribe props * display new subscriptions in devtools * remove supports in concurrent mode and small refactor * rename hoistToProvider to hoist, rename AsyncStateStatus to Status, rename ProducerRunEffects to producerEffects, and export state hook to its own file * small refactorings * move wrapProducerFn to protottype & reduce_funcs set to false in terser options & state hook resolve flags enhacenements --- .gitignore | 1 + README.MD | 10 +- .../devtools-extension/src/DevModeApp.tsx | 7 +- .../DevtoolsView/CurrentJournalDisplay.tsx | 21 +- .../src/DevtoolsView/CurrentStateDisplay.tsx | 118 ++- .../src/DevtoolsView/sources.ts | 24 +- packages/devtools-extension/src/index.css | 4 + packages/docs/docs/api/0-the-whole-api.md | 4 +- packages/docs/docs/api/1-producer-function.md | 4 +- packages/docs/docs/api/4-use-async-state.md | 65 +- .../docs/docs/faq/how-the-library-works.md | 14 +- packages/docs/docs/tutorial/state-sharing.md | 2 +- packages/react-async-states/README.MD | 22 +- packages/react-async-states/package.json | 2 +- .../rollup/rollup.config.js | 18 +- .../async-state/AsyncState.fork.test.ts | 10 +- .../async-state/AsyncState.run.abort.test.ts | 40 +- .../async-state/AsyncState.run.test.ts | 20 +- .../async-state/AsyncState.setState.test.ts | 6 +- .../AsyncState.subscription.test.ts | 30 +- .../src/__tests__/other/read-source.test.ts | 6 +- .../other/supports-concurrent-mode.no.test.ts | 11 - .../supports-concurrent-mode.yes.test.ts | 13 - .../Provider/provider.test.tsx | 30 +- .../StateBoundary/index.test.tsx | 28 +- .../react-async-state/cache/index.test.ts | 10 +- .../useAsyncState/auto-run/index.test.tsx | 6 +- .../lanes/lanes.provider.test.tsx | 2 +- .../useAsyncState/lanes/lanes.test.tsx | 20 +- .../useAsyncState/payload/index.test.tsx | 7 +- .../useAsyncState/props/effects.emit.test.tsx | 4 +- .../useAsyncState/props/effects.run.test.tsx | 2 +- .../useAsyncState/props/effects.runp.test.tsx | 12 +- .../props/effects.select.test.tsx | 2 +- .../useAsyncState/run/generator.test.tsx | 12 +- .../useAsyncState/run/index.test.tsx | 18 +- .../subscription/events/index.test.tsx | 9 +- .../subscription/fork/index.test.tsx | 11 +- .../subscription/hoist/index.test.tsx | 17 +- .../subscription/listen/index.test.tsx | 13 +- .../outside-provider/index.test.tsx | 10 +- .../outside-provider/source.test.tsx | 7 +- .../post-subscribe/index.test.tsx | 6 +- .../subscription/standalone/index.test.tsx | 15 +- .../useProducer/index.test.tsx | 17 +- .../useSelector/index.test.tsx | 2 +- .../useSource/index.test.tsx | 9 +- .../src/__tests__/v2/get-flags.test.ts | 276 +++++ .../src/__tests__/v2/resolve-instance.test.ts | 162 +++ .../src/async-state/AsyncState.ts | 341 +++--- .../src/async-state/AsyncStateManager.ts | 28 +- .../src/async-state/index.ts | 6 +- .../src/async-state/utils.ts | 2 +- .../src/devtools/Devtools.ts | 99 +- packages/react-async-states/src/index.ts | 17 +- .../{AsyncStateProvider.tsx => Provider.tsx} | 2 +- .../src/react/StateBoundary.tsx | 14 +- .../react-async-states/src/react/StateHook.ts | 651 ++++++++++++ .../src/react/StateHookFlags.ts | 21 + .../src/react/helpers/configuration-warn.ts | 65 -- .../react/helpers/supports-concurrent-mode.ts | 6 - .../src/react/helpers/useCallerName.ts | 73 -- .../src/react/loader-producer.ts | 48 - .../src/react/useAsyncState.ts | 234 ++++- .../src/react/useAsyncStateBase.ts | 990 ------------------ .../react-async-states/src/react/useRun.ts | 4 +- .../src/react/useSelector.ts | 29 +- .../react-async-states/src/react/utils.ts | 21 + .../react-async-states/src/types.internal.ts | 58 +- pnpm-lock.yaml | 506 +-------- 70 files changed, 2050 insertions(+), 2324 deletions(-) delete mode 100644 packages/react-async-states/src/__tests__/other/supports-concurrent-mode.no.test.ts delete mode 100644 packages/react-async-states/src/__tests__/other/supports-concurrent-mode.yes.test.ts create mode 100644 packages/react-async-states/src/__tests__/v2/get-flags.test.ts create mode 100644 packages/react-async-states/src/__tests__/v2/resolve-instance.test.ts rename packages/react-async-states/src/react/{AsyncStateProvider.tsx => Provider.tsx} (98%) create mode 100644 packages/react-async-states/src/react/StateHook.ts create mode 100644 packages/react-async-states/src/react/StateHookFlags.ts delete mode 100644 packages/react-async-states/src/react/helpers/configuration-warn.ts delete mode 100644 packages/react-async-states/src/react/helpers/supports-concurrent-mode.ts delete mode 100644 packages/react-async-states/src/react/loader-producer.ts delete mode 100644 packages/react-async-states/src/react/useAsyncStateBase.ts create mode 100644 packages/react-async-states/src/react/utils.ts diff --git a/.gitignore b/.gitignore index e1f33a79..dbae2f3b 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ build node_modules stats.json dist +packages/example # Cruft .DS_Store diff --git a/README.MD b/README.MD index e6d45030..00889f37 100644 --- a/README.MD +++ b/README.MD @@ -121,7 +121,7 @@ runc({ #### Dynamic creation and sharing of states at runtime Under the `AsyncStateProvider`, you can create and share state instances -and access them by their `key` via the `hoistToProvider` option. +and access them by their `key` via the `hoist` option. You can even start listening to a state before it gets hoisted to the provider, and get notified once it gets added. @@ -140,12 +140,12 @@ variables. It just works in the core of the library. Of course, this requires you to be in an environment where `setTimeout` exists. ```tsx -import {useAsyncState, ProducerRunEffects} from "react-async-states"; +import {useAsyncState, RunEffect} from "react-async-states"; const {run} = useAsyncState({ producer: userSearchByUsername, // debounce runs - runEffect: ProducerRunEffects.debounce, + runEffect: RunEffect.debounce, runEffectDurationMs: 300, // skip pending status if it answers less than 200ms skipPendingDelayMs: 200, @@ -163,14 +163,14 @@ and `payload`. Let's add cache support to the previous example: ```tsx -import {useAsyncState, ProducerRunEffects} from "react-async-states"; +import {useAsyncState, RunEffect} from "react-async-states"; // note that the whole configuration object does not depend on render // and can be moved to module level static object. const {run} = useAsyncState({ producer: userSearchByUsername, // debounce runs - runEffect: ProducerRunEffects.debounce, + runEffect: RunEffect.debounce, runEffectDurationMs: 300, // skip pending status if it answers less than 200ms skipPendingDelayMs: 200, diff --git a/packages/devtools-extension/src/DevModeApp.tsx b/packages/devtools-extension/src/DevModeApp.tsx index ebd25f52..e3a11193 100644 --- a/packages/devtools-extension/src/DevModeApp.tsx +++ b/packages/devtools-extension/src/DevModeApp.tsx @@ -1,12 +1,13 @@ import * as React from "react"; -import {createSource, useSource} from "react-async-states"; +import {createSource, useSource, useSourceLane, useProducer, useSelector} from "react-async-states"; +import {State} from "react-async-states/src"; let meter = 0; export default function DevModeApp() { const source = React.useMemo(() => createSource("devmodeapp", null, {initialValue: 0}), []); - const {state} = useSource(source); + const state: State = useSelector(source); return + onClick={() => source!.run(old => old.data + 1)}>{state.data} } diff --git a/packages/devtools-extension/src/DevtoolsView/CurrentJournalDisplay.tsx b/packages/devtools-extension/src/DevtoolsView/CurrentJournalDisplay.tsx index 28c6fecc..bd3bf66f 100644 --- a/packages/devtools-extension/src/DevtoolsView/CurrentJournalDisplay.tsx +++ b/packages/devtools-extension/src/DevtoolsView/CurrentJournalDisplay.tsx @@ -13,23 +13,30 @@ const CurrentJournalDisplay = React.memo(function Journal({lane}: { lane: string display: 'flex', flexDirection: 'row', height: '100%', - padding: 0 + padding: 0, + borderRadius: 8, }}>
-
-
+
+
-
@@ -81,34 +84,34 @@ type SiderDisplayProps = { lanes?: string; }; -function getBackgroundColorFromStatus(status: AsyncStateStatus | undefined) { +function getBackgroundColorFromStatus(status: Status | undefined) { switch (status) { - case AsyncStateStatus.error: + case Status.error: return "#EB6774"; - case AsyncStateStatus.initial: + case Status.initial: return "#DEDEDE"; - case AsyncStateStatus.aborted: + case Status.aborted: return "#787878"; - case AsyncStateStatus.pending: + case Status.pending: return "#5B95DB"; - case AsyncStateStatus.success: + case Status.success: return "#17A449"; default: return undefined; } } -function getColorFromStatus(status: AsyncStateStatus | undefined) { +function getColorFromStatus(status: Status | undefined) { switch (status) { - case AsyncStateStatus.error: + case Status.error: return "white"; - case AsyncStateStatus.initial: + case Status.initial: return "black"; - case AsyncStateStatus.aborted: + case Status.aborted: return "white"; - case AsyncStateStatus.pending: + case Status.pending: return "white"; - case AsyncStateStatus.success: + case Status.success: return "white"; default: return undefined; @@ -132,7 +135,7 @@ export const SideKey = React.memo(function SiderKey({ ); }, [uniqueId, dev]); - const {state} = useSourceLane(journalSource, `${uniqueId}`); + const {state, devFlags, version, source} = useSourceLane(journalSource, `${uniqueId}`); const {status} = state.data?.state ?? {}; @@ -152,7 +155,7 @@ export const SideKey = React.memo(function SiderKey({ currentJournal.setState(null); currentState.setState(`${uniqueId}`); }} - disabled={status === AsyncStateStatus.pending} + disabled={status === Status.pending} >
No state information; } return ( -
- -
- +
+
+
+ +
+
+ +
+ +
); } @@ -387,7 +401,7 @@ function EditState({lane}) { const {dev} = React.useContext(DevtoolsContext); const [isJson, setIsJson] = React.useState(true); const [data, setData] = React.useState(""); - const [status, setStatus] = React.useState(AsyncStateStatus.success); + const [status, setStatus] = React.useState(Status.success); return ( <> ; } @@ -60,7 +60,7 @@ describe('dynamic provider states hoisting', () => { function SimpleSub({subKey, alias, subIndex}) { const { - mode, + devFlags, state, run } = useAsyncState({key: subKey}, [subKey]) as UseAsyncState; @@ -72,7 +72,7 @@ describe('dynamic provider states hoisting', () => { return (

) @@ -137,7 +137,7 @@ describe('dynamic provider states hoisting', () => { }); expect(screen.getByTestId("subscription-counter-1-global-0-button").innerHTML) - .toEqual("counter-1 - LISTEN - 9"); + .toEqual("counter-1 - [\"CONFIG_OBJECT\",\"INSIDE_PROVIDER\"] - 9"); act(() => { @@ -146,7 +146,7 @@ describe('dynamic provider states hoisting', () => { }); expect(screen.getByTestId("subscription-counter-1-dynamic-0-button").innerHTML) - .toEqual("counter-1 - LISTEN - 9"); + .toEqual("counter-1 - [\"CONFIG_OBJECT\",\"INSIDE_PROVIDER\"] - 9"); act(() => { // increment value @@ -155,9 +155,9 @@ describe('dynamic provider states hoisting', () => { expect(screen.getByTestId("subscription-counter-1-global-0-button").innerHTML) - .toEqual("counter-1 - LISTEN - 10"); + .toEqual("counter-1 - [\"CONFIG_OBJECT\",\"INSIDE_PROVIDER\"] - 10"); expect(screen.getByTestId("subscription-counter-1-dynamic-0-button").innerHTML) - .toEqual("counter-1 - LISTEN - 10"); + .toEqual("counter-1 - [\"CONFIG_OBJECT\",\"INSIDE_PROVIDER\"] - 10"); }); it('should add subscriber and wait for entries', async () => { // given @@ -185,7 +185,7 @@ describe('dynamic provider states hoisting', () => { expect(screen.getByTestId("subscription-counter-1-dynamic-0-button").innerHTML) - .toEqual("counter-1 - WAIT - "); + .toEqual("counter-1 - [\"CONFIG_OBJECT\",\"INSIDE_PROVIDER\",\"WAIT\"] - "); // then act(() => { @@ -194,14 +194,14 @@ describe('dynamic provider states hoisting', () => { }); expect(screen.getByTestId("subscription-counter-1-global-0-button").innerHTML) - .toEqual("counter-1 - LISTEN - 9"); + .toEqual("counter-1 - [\"CONFIG_OBJECT\",\"INSIDE_PROVIDER\"] - 9"); await act(async () => { await flushPromises(); }); expect(screen.getByTestId("subscription-counter-1-dynamic-0-button").innerHTML) - .toEqual("counter-1 - LISTEN - 9"); + .toEqual("counter-1 - [\"CONFIG_OBJECT\",\"INSIDE_PROVIDER\"] - 9"); act(() => { @@ -211,8 +211,8 @@ describe('dynamic provider states hoisting', () => { expect(screen.getByTestId("subscription-counter-1-global-0-button").innerHTML) - .toEqual("counter-1 - LISTEN - 10"); + .toEqual("counter-1 - [\"CONFIG_OBJECT\",\"INSIDE_PROVIDER\"] - 10"); expect(screen.getByTestId("subscription-counter-1-dynamic-0-button").innerHTML) - .toEqual("counter-1 - LISTEN - 10"); + .toEqual("counter-1 - [\"CONFIG_OBJECT\",\"INSIDE_PROVIDER\"] - 10"); }); }); diff --git a/packages/react-async-states/src/__tests__/react-async-state/StateBoundary/index.test.tsx b/packages/react-async-states/src/__tests__/react-async-state/StateBoundary/index.test.tsx index 509a6cf2..79519034 100644 --- a/packages/react-async-states/src/__tests__/react-async-state/StateBoundary/index.test.tsx +++ b/packages/react-async-states/src/__tests__/react-async-state/StateBoundary/index.test.tsx @@ -5,10 +5,10 @@ import { useCurrentState } from "../../../react/StateBoundary"; import { - AsyncStateStatus, + Status, createSource } from "../../../async-state"; -import {RenderStrategy, SubscriptionMode} from "../../../types.internal"; +import {RenderStrategy} from "../../../types.internal"; import {flushPromises} from "../utils/test-utils"; describe('StateBoundary', () => { @@ -19,10 +19,10 @@ describe('StateBoundary', () => { // when function Component() { - const {mode, state} = useCurrentState(); + const {devFlags, state} = useCurrentState(); return (
- {mode} + {JSON.stringify(devFlags)} {state.status}
); @@ -39,16 +39,16 @@ describe('StateBoundary', () => { // then expect(screen.getByTestId("current-mode").innerHTML) - .toEqual(SubscriptionMode.SRC); + .toEqual("[\"AUTO_RUN\",\"CONFIG_SOURCE\",\"SOURCE\"]"); expect(screen.getByTestId("current-status").innerHTML) - .toEqual(AsyncStateStatus.pending); + .toEqual(Status.pending); await act(async () => { await flushPromises(); }); expect(screen.getByTestId("current-status").innerHTML) - .toEqual(AsyncStateStatus.success); + .toEqual(Status.success); }); it('should render in FetchThenRender strategy', async () => { // given @@ -57,10 +57,10 @@ describe('StateBoundary', () => { // when function Component() { - const {mode, state} = useCurrentState(); + const {devFlags, state} = useCurrentState(); return (
- {mode} + {JSON.stringify(devFlags)} {state.status}
); @@ -86,9 +86,9 @@ describe('StateBoundary', () => { }); expect(screen.getByTestId("current-mode")?.innerHTML) - .toEqual(SubscriptionMode.SRC); + .toEqual("[\"CONFIG_SOURCE\",\"SOURCE\"]"); expect(screen.getByTestId("current-status").innerHTML) - .toEqual(AsyncStateStatus.success); + .toEqual(Status.success); }); it('should render in FetchAsYouRender strategy', async () => { // given @@ -97,10 +97,10 @@ describe('StateBoundary', () => { // when function Component() { - const {mode, state} = useCurrentState(); + const {devFlags, state} = useCurrentState(); return (
- {mode} + {JSON.stringify(devFlags)} {state.status}
); @@ -127,6 +127,6 @@ describe('StateBoundary', () => { }); expect(screen.getByTestId("current-status").innerHTML) - .toEqual(AsyncStateStatus.success); + .toEqual(Status.success); }); }); diff --git a/packages/react-async-states/src/__tests__/react-async-state/cache/index.test.ts b/packages/react-async-states/src/__tests__/react-async-state/cache/index.test.ts index 394873ea..d9b70a82 100644 --- a/packages/react-async-states/src/__tests__/react-async-state/cache/index.test.ts +++ b/packages/react-async-states/src/__tests__/react-async-state/cache/index.test.ts @@ -1,4 +1,4 @@ -import AsyncState, {AsyncStateStatus, CachedState} from "../../../async-state"; +import AsyncState, {Status, CachedState} from "../../../async-state"; import {flushPromises} from "../utils/test-utils"; import { standaloneProducerEffectsCreator @@ -28,7 +28,7 @@ describe('async state cache', () => { data: 1, timestamp: 122, props: {args: [1]}, - status: AsyncStateStatus.success, + status: Status.success, }, addedAt: 123, deadline: Infinity, @@ -67,7 +67,7 @@ describe('async state cache', () => { data: 1, timestamp: 122, props: {args: [1]}, - status: AsyncStateStatus.success, + status: Status.success, }, addedAt: 123, deadline: Infinity, @@ -99,7 +99,7 @@ describe('async state cache', () => { data: 1, timestamp: 122, props: {args: [1]}, - status: AsyncStateStatus.success, + status: Status.success, }, addedAt: 123, deadline: 125, @@ -109,7 +109,7 @@ describe('async state cache', () => { data: 1, timestamp: 122, props: {args: [1]}, - status: AsyncStateStatus.success, + status: Status.success, }, addedAt: 123, deadline: 125, diff --git a/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/auto-run/index.test.tsx b/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/auto-run/index.test.tsx index 03cc4264..40d205bc 100644 --- a/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/auto-run/index.test.tsx +++ b/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/auto-run/index.test.tsx @@ -2,7 +2,7 @@ import * as React from "react"; import {act, render, screen} from "@testing-library/react"; import {UseAsyncState} from "../../../../types.internal"; import {useAsyncState} from "../../../../react/useAsyncState"; -import {AsyncStateStatus} from "../../../../async-state"; +import {Status} from "../../../../async-state"; describe('should auto run async state', () => { it('should auto run -- sync with autoRunArgs', async () => { @@ -73,7 +73,7 @@ describe('should auto run async state', () => { ) expect(screen.getByTestId("status").innerHTML) - .toEqual(AsyncStateStatus.pending); + .toEqual(Status.pending); await act(async () => { await jest.advanceTimersByTime(100); @@ -81,7 +81,7 @@ describe('should auto run async state', () => { // then expect(screen.getByTestId("status").innerHTML) - .toEqual(AsyncStateStatus.success); + .toEqual(Status.success); expect(screen.getByTestId("result").innerHTML).toEqual("Hello"); expect(mockedProducer.mock.calls[0][0].payload).toEqual({content: "Hello"}); diff --git a/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/lanes/lanes.provider.test.tsx b/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/lanes/lanes.provider.test.tsx index 9d7dd0f2..97de95db 100644 --- a/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/lanes/lanes.provider.test.tsx +++ b/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/lanes/lanes.provider.test.tsx @@ -2,7 +2,7 @@ import * as React from "react"; import {act, fireEvent, render, screen} from "@testing-library/react"; import {mockDateNow} from "../../utils/setup"; import {useAsyncState} from "../../../../react/useAsyncState"; -import {AsyncStateProvider} from "../../../../react/AsyncStateProvider"; +import {AsyncStateProvider} from "../../../../react/Provider"; import {createSource} from "../../../../async-state"; mockDateNow(); diff --git a/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/lanes/lanes.test.tsx b/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/lanes/lanes.test.tsx index 17153c03..ca17346d 100644 --- a/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/lanes/lanes.test.tsx +++ b/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/lanes/lanes.test.tsx @@ -43,8 +43,11 @@ describe('subscribe to lane and operate on it', () => { function CounterSub({counterKey = "default", alias = "default"}) { const {state: {data}, run} = useAsyncState.lazy({ lane: counterKey, + subscriptionKey: alias, source: countersSource, }); + let formattedData = `counter-${counterKey}-${alias}-${data}`; + return (
); @@ -88,7 +91,6 @@ describe('subscribe to lane and operate on it', () => { const runDefaultCounter = screen.getByTestId("counter-sub-default-default-run"); const runCounter1 = screen.getByTestId("counter-sub-counter-1-1-run"); - const runCounter2 = screen.getByTestId("counter-sub-counter-2-2-run"); // then act(() => { @@ -174,13 +176,13 @@ describe('subscribe to lane and operate on it', () => { expect(screen.getByTestId("counter-sub-counter-2-extra-default-data").innerHTML) .toEqual("counter-counter-2-extra-default-0"); act(() => { - createSource( - "temporary-will-run-counter-2", - async function (props) { - props.run(countersSource, {lane: "counter-2-extra"}) - props.runp(countersSource, {lane: "counter-2"}) - } - ).run(); + createSource( + "temporary-will-run-counter-2", + async function (props) { + props.run(countersSource, {lane: "counter-2-extra"}) + props.runp(countersSource, {lane: "counter-2"}) + } + ).run(); }); await act(async () => { diff --git a/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/payload/index.test.tsx b/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/payload/index.test.tsx index a71e9fee..6e5d74dd 100644 --- a/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/payload/index.test.tsx +++ b/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/payload/index.test.tsx @@ -1,7 +1,6 @@ import * as React from "react"; import {fireEvent, render, screen} from "@testing-library/react"; import { - SubscriptionMode, UseAsyncState } from "../../../../types.internal"; import {useAsyncState} from "../../../../react/useAsyncState"; @@ -19,7 +18,7 @@ describe('should add static payload to async state', () => { function Component() { const { run, - mode, + devFlags, state, }: UseAsyncState = useAsyncState({ initialValue: 0, @@ -36,7 +35,7 @@ describe('should add static payload to async state', () => { return (
- {mode} + {JSON.stringify(devFlags)} {state.data}
); } @@ -52,7 +51,7 @@ describe('should add static payload to async state', () => { const incrementBtn = screen.getByTestId("increment"); // then expect(screen.getByTestId("mode").innerHTML) - .toEqual(SubscriptionMode.OUTSIDE); + .toEqual("[\"CONFIG_OBJECT\",\"STANDALONE\"]"); // +1 fireEvent.click(incrementBtn); diff --git a/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/props/effects.emit.test.tsx b/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/props/effects.emit.test.tsx index 8d8217c3..fa2e94c0 100644 --- a/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/props/effects.emit.test.tsx +++ b/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/props/effects.emit.test.tsx @@ -3,7 +3,7 @@ import {act, render, screen, fireEvent} from "@testing-library/react"; import {useAsyncState} from "../../../../react/useAsyncState"; import {UseAsyncState} from "../../../../types.internal"; import {flushPromises} from "../../utils/test-utils"; -import {AsyncStateStatus} from "../../../../async-state"; +import {Status} from "../../../../async-state"; describe('should emit from producer', () => { it('should emit after resolve when sync', async () => { @@ -137,7 +137,7 @@ describe('should emit from producer', () => { expect(abortFn).toHaveBeenCalledTimes(2); // 1 strict mode expect(abortFn).toHaveBeenCalledWith("tt"); expect(screen.getByTestId("status").innerHTML) - .toEqual(AsyncStateStatus.success); + .toEqual(Status.success); await act(async () => { await jest.advanceTimersByTime(100); diff --git a/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/props/effects.run.test.tsx b/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/props/effects.run.test.tsx index 588da8d9..abc39971 100644 --- a/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/props/effects.run.test.tsx +++ b/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/props/effects.run.test.tsx @@ -2,7 +2,7 @@ import * as React from "react"; import {render} from "@testing-library/react"; import AsyncStateComponent from "../../utils/AsyncStateComponent"; import {createSource, Producer, ProducerProps} from "../../../../async-state"; -import {AsyncStateProvider} from "../../../../react/AsyncStateProvider"; +import {AsyncStateProvider} from "../../../../react/Provider"; describe('should run another producer from producer', () => { it('should run producer by source', () => { diff --git a/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/props/effects.runp.test.tsx b/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/props/effects.runp.test.tsx index bf5aa24d..f2c4e31b 100644 --- a/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/props/effects.runp.test.tsx +++ b/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/props/effects.runp.test.tsx @@ -1,12 +1,12 @@ import * as React from "react"; import {act, render, screen} from "@testing-library/react"; import { - AsyncStateStatus, createSource, + Status, createSource, Producer, ProducerProps } from "../../../../async-state"; import AsyncStateComponent from "../../utils/AsyncStateComponent"; -import {AsyncStateProvider} from "../../../../react/AsyncStateProvider"; +import {AsyncStateProvider} from "../../../../react/Provider"; import {UseAsyncState} from "../../../../types.internal"; import {flushPromises} from "../../utils/test-utils"; import {mockDateNow, TESTS_TS} from "../../utils/setup"; @@ -54,7 +54,7 @@ describe('should runp another producer from producer', () => { expect(source1Producer).toHaveBeenCalledTimes(2); // 1 strict mode expect(source2Producer).toHaveBeenCalledTimes(2); // 1 strict mode expect(screen.getByTestId("status").innerHTML) - .toEqual(AsyncStateStatus.pending); + .toEqual(Status.pending); await act(async () => { await flushPromises(); @@ -62,7 +62,7 @@ describe('should runp another producer from producer', () => { expect(screen.getByTestId("result").innerHTML).toEqual("1"); expect(screen.getByTestId("status").innerHTML) - .toEqual(AsyncStateStatus.success); + .toEqual(Status.success); expect(source1Producer.mock.calls[0][0].args[0]).toBe(1); }); it('should runp producer by source inside provider', async () => { @@ -105,7 +105,7 @@ describe('should runp another producer from producer', () => { expect(source1Producer).toHaveBeenCalledTimes(2); // 1 strict mode expect(source2Producer).toHaveBeenCalledTimes(2); // 1 strict mode expect(screen.getByTestId("status").innerHTML) - .toEqual(AsyncStateStatus.pending); + .toEqual(Status.pending); await act(async () => { await flushPromises(); @@ -113,7 +113,7 @@ describe('should runp another producer from producer', () => { expect(screen.getByTestId("result").innerHTML).toEqual("2"); expect(screen.getByTestId("status").innerHTML) - .toEqual(AsyncStateStatus.success); + .toEqual(Status.success); expect(source1Producer.mock.calls[0][0].args[0]).toBe(2); }); it('should runp producer by key', async () => { diff --git a/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/props/effects.select.test.tsx b/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/props/effects.select.test.tsx index b0295ea6..b3a741fd 100644 --- a/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/props/effects.select.test.tsx +++ b/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/props/effects.select.test.tsx @@ -2,7 +2,7 @@ import * as React from "react"; import {render, screen} from "@testing-library/react"; import {useAsyncState} from "../../../../react/useAsyncState"; import {UseAsyncState} from "../../../../types.internal"; -import {AsyncStateProvider} from "../../../../react/AsyncStateProvider"; +import {AsyncStateProvider} from "../../../../react/Provider"; import {createSource, Source, State} from "../../../../async-state"; describe('should select from another async state', () => { diff --git a/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/run/generator.test.tsx b/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/run/generator.test.tsx index 8404ef55..3905eca1 100644 --- a/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/run/generator.test.tsx +++ b/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/run/generator.test.tsx @@ -2,7 +2,7 @@ import * as React from "react"; import {act, fireEvent, render, screen} from "@testing-library/react"; import {UseAsyncState} from "../../../../types.internal"; import {useAsyncState} from "../../../../react/useAsyncState"; -import {AsyncStateStatus} from "../../../../async-state"; +import {Status} from "../../../../async-state"; describe('should run async state with generator', () => { it('should run sync generator', async () => { @@ -54,7 +54,7 @@ describe('should run async state with generator', () => { ) // then - expect(screen.getByTestId("status").innerHTML).toEqual(AsyncStateStatus.error); + expect(screen.getByTestId("status").innerHTML).toEqual(Status.error); expect(screen.getByTestId("result").innerHTML).toEqual("Error: Error there!"); }); it('should run sync generator try and catch', async () => { @@ -86,7 +86,7 @@ describe('should run async state with generator', () => { ) // then - expect(screen.getByTestId("status").innerHTML).toEqual(AsyncStateStatus.success); + expect(screen.getByTestId("status").innerHTML).toEqual(Status.success); expect(screen.getByTestId("result").innerHTML).toEqual("15"); }); it('should run async generator and throw', async () => { @@ -119,7 +119,7 @@ describe('should run async state with generator', () => { }); // then - expect(screen.getByTestId("status").innerHTML).toEqual(AsyncStateStatus.error); + expect(screen.getByTestId("status").innerHTML).toEqual(Status.error); expect(screen.getByTestId("result").innerHTML).toEqual("Error: Error there!!"); }); it('should run async generator and abort it and make sure it doesnt continute', async () => { @@ -172,7 +172,7 @@ describe('should run async state with generator', () => { // then expect(mockedFn).toHaveBeenCalledTimes(2); // 1 strict mode - expect(screen.getByTestId("status").innerHTML).toEqual(AsyncStateStatus.success); + expect(screen.getByTestId("status").innerHTML).toEqual(Status.success); expect(screen.getByTestId("result").innerHTML).toEqual(JSON.stringify({ "a": {}, "b": {}, @@ -189,7 +189,7 @@ describe('should run async state with generator', () => { fireEvent.click(screen.getByTestId("abort")); }); - expect(screen.getByTestId("status").innerHTML).toEqual(AsyncStateStatus.aborted); + expect(screen.getByTestId("status").innerHTML).toEqual(Status.aborted); expect(mockedFn).not.toHaveBeenCalled(); }); }); diff --git a/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/run/index.test.tsx b/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/run/index.test.tsx index 0718ebc8..ab6fb09f 100644 --- a/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/run/index.test.tsx +++ b/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/run/index.test.tsx @@ -4,9 +4,9 @@ import AsyncStateComponent from "../../utils/AsyncStateComponent"; import {UseAsyncState} from "../../../../types.internal"; import {flushPromises} from "../../utils/test-utils"; import { - AsyncStateStatus, + Status, createSource, - ProducerRunEffects + RunEffect } from "../../../../async-state"; describe('should run producer', () => { @@ -111,7 +111,7 @@ describe('should run producer', () => { let id = setTimeout(() => resolve(props.args[0]), 100); props.onAbort(() => clearTimeout(id)); }); - }, {runEffect: ProducerRunEffects.throttle, runEffectDurationMs: 100}); + }, {runEffect: RunEffect.throttle, runEffectDurationMs: 100}); function Test() { return ( @@ -134,7 +134,7 @@ describe('should run producer', () => { ) expect(screen.getByTestId("status").innerHTML) - .toEqual(AsyncStateStatus.initial); + .toEqual(Status.initial); expect(screen.getByTestId("result").innerHTML).toEqual(""); // then @@ -144,14 +144,14 @@ describe('should run producer', () => { }); expect(screen.getByTestId("status").innerHTML) - .toEqual(AsyncStateStatus.initial); // fires after 100ms + .toEqual(Status.initial); // fires after 100ms await act(async () => { await jest.advanceTimersByTime(200); }); expect(screen.getByTestId("status").innerHTML) - .toEqual(AsyncStateStatus.success); + .toEqual(Status.success); expect(screen.getByTestId("result").innerHTML).toEqual("1"); }); @@ -164,7 +164,7 @@ describe('should run producer', () => { let id = setTimeout(() => resolve(props.args[0]), 100); props.onAbort(() => clearTimeout(id)); }); - }, {runEffect: ProducerRunEffects.debounce, runEffectDurationMs: 100}); + }, {runEffect: RunEffect.debounce, runEffectDurationMs: 100}); function Test() { return ( @@ -195,14 +195,14 @@ describe('should run producer', () => { }); expect(screen.getByTestId("status").innerHTML) - .toEqual(AsyncStateStatus.initial); // fires after 100 millis + .toEqual(Status.initial); // fires after 100 millis await act(async () => { await jest.advanceTimersByTime(200); }); expect(screen.getByTestId("status").innerHTML) - .toEqual(AsyncStateStatus.success); + .toEqual(Status.success); expect(screen.getByTestId("result").innerHTML).toEqual("3"); }); }); diff --git a/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/subscription/events/index.test.tsx b/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/subscription/events/index.test.tsx index 26520cfa..26973186 100644 --- a/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/subscription/events/index.test.tsx +++ b/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/subscription/events/index.test.tsx @@ -1,11 +1,10 @@ import * as React from "react"; import {act, fireEvent, render, screen} from "@testing-library/react"; import { - SubscriptionMode, UseAsyncState } from "../../../../../types.internal"; import {useAsyncState} from "../../../../../react/useAsyncState"; -import {AsyncStateStatus, createSource} from "../../../../../async-state"; +import {Status, createSource} from "../../../../../async-state"; describe('useAsyncState - events', () => { it('add several change events with different forms', async () => { @@ -24,11 +23,11 @@ describe('useAsyncState - events', () => { mockedFn, { handler: mockedFn2, - status: AsyncStateStatus.success, + status: Status.success, }, { handler: mockedFn3, - status: AsyncStateStatus.error, + status: Status.error, } ], }, @@ -40,7 +39,7 @@ describe('useAsyncState - events', () => { onClick={() => run(old => old.data + 1)}>Increment {state.data} diff --git a/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/subscription/fork/index.test.tsx b/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/subscription/fork/index.test.tsx index 72615fdc..c5e4bca4 100644 --- a/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/subscription/fork/index.test.tsx +++ b/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/subscription/fork/index.test.tsx @@ -1,11 +1,10 @@ import * as React from "react"; import {act, fireEvent, render, screen} from "@testing-library/react"; import { - SubscriptionMode, UseAsyncState } from "../../../../../types.internal"; import {useAsyncState} from "../../../../../react/useAsyncState"; -import {AsyncStateProvider} from "../../../../../react/AsyncStateProvider"; +import {AsyncStateProvider} from "../../../../../react/Provider"; import {createSource, ForkConfig} from "../../../../../async-state"; describe('should fork an initially hoisted async state', () => { @@ -30,7 +29,7 @@ describe('should fork an initially hoisted async state', () => { const { key, run, - mode, + devFlags, state, }: UseAsyncState = useAsyncState({ fork, @@ -43,7 +42,7 @@ describe('should fork an initially hoisted async state', () => { - {mode} + {JSON.stringify(devFlags)} {state.data}
); @@ -58,9 +57,9 @@ describe('should fork an initially hoisted async state', () => { // then expect(screen.getByTestId("mode-counter").innerHTML) - .toEqual(SubscriptionMode.LISTEN); + .toEqual("[\"CONFIG_OBJECT\",\"INSIDE_PROVIDER\"]"); expect(screen.getByTestId("mode-counter-fork").innerHTML) - .toEqual(SubscriptionMode.FORK); + .toEqual("[\"CONFIG_OBJECT\",\"FORK\",\"INSIDE_PROVIDER\"]"); expect(screen.getByTestId("result-counter").innerHTML).toEqual("0"); expect(screen.getByTestId("result-counter-fork").innerHTML).toEqual("0"); diff --git a/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/subscription/hoist/index.test.tsx b/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/subscription/hoist/index.test.tsx index b7d3ccd9..f68ce225 100644 --- a/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/subscription/hoist/index.test.tsx +++ b/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/subscription/hoist/index.test.tsx @@ -1,11 +1,10 @@ import * as React from "react"; import {act, fireEvent, render, screen} from "@testing-library/react"; import { - SubscriptionMode, UseAsyncState } from "../../../../../types.internal"; import {useAsyncState} from "../../../../../react/useAsyncState"; -import {AsyncStateProvider} from "../../../../../react/AsyncStateProvider"; +import {AsyncStateProvider} from "../../../../../react/Provider"; import {flushPromises} from "../../../utils/test-utils"; import {mockDateNow, TESTS_TS} from "../../../utils/setup"; @@ -26,11 +25,11 @@ describe('should hoist an async state to provider', () => { } function Hoister() { - const {mode} = useAsyncState.hoist({ + const {devFlags} = useAsyncState.hoist({ key: "counter", initialValue: 0, }); - return {mode}; + return {JSON.stringify(devFlags)}; } function Wrapper({children, initialValue = false}) { @@ -50,13 +49,13 @@ describe('should hoist an async state to provider', () => { subscribesTo, }: { subscribesTo: string }) { const { - mode, + devFlags, state, }: UseAsyncState = useAsyncState(subscribesTo); return (
- {mode} + {JSON.stringify(devFlags)} {JSON.stringify(state)}
); @@ -72,7 +71,7 @@ describe('should hoist an async state to provider', () => { // then expect(screen.getByTestId("mode-counter").innerHTML) - .toEqual(SubscriptionMode.WAIT); + .toEqual("[\"CONFIG_STRING\",\"INSIDE_PROVIDER\",\"WAIT\"]"); act(() => { @@ -80,13 +79,13 @@ describe('should hoist an async state to provider', () => { }); expect(screen.getByTestId("hoister-mode").innerHTML) - .toEqual(SubscriptionMode.HOIST); + .toEqual("[\"CONFIG_OBJECT\",\"HOIST\",\"INSIDE_PROVIDER\"]"); await act(async () => { await flushPromises(); }); expect(screen.getByTestId("mode-counter").innerHTML) - .toEqual(SubscriptionMode.LISTEN); + .toEqual("[\"CONFIG_STRING\",\"INSIDE_PROVIDER\"]"); expect(screen.getByTestId("result-counter").innerHTML) .toEqual(JSON.stringify({ diff --git a/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/subscription/listen/index.test.tsx b/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/subscription/listen/index.test.tsx index a59c7e74..036ad897 100644 --- a/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/subscription/listen/index.test.tsx +++ b/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/subscription/listen/index.test.tsx @@ -1,11 +1,10 @@ import * as React from "react"; import {render, screen} from "@testing-library/react"; import { - SubscriptionMode, UseAsyncState } from "../../../../../types.internal"; import {useAsyncState} from "../../../../../react/useAsyncState"; -import {AsyncStateProvider} from "../../../../../react/AsyncStateProvider"; +import {AsyncStateProvider} from "../../../../../react/Provider"; import {mockDateNow, TESTS_TS} from "../../../utils/setup"; import {createSource} from "../../../../../async-state"; @@ -35,13 +34,13 @@ describe('should subscribe to an async state in provider', () => { subscribesTo, }: { subscribesTo: string }) { const { - mode, + devFlags, state, }: UseAsyncState = useAsyncState(subscribesTo); return (
- {mode} + {JSON.stringify(devFlags)} {JSON.stringify(state)}
); @@ -57,13 +56,13 @@ describe('should subscribe to an async state in provider', () => { // then expect(screen.getByTestId("mode-counter").innerHTML) - .toEqual(SubscriptionMode.LISTEN); + .toEqual("[\"CONFIG_STRING\",\"INSIDE_PROVIDER\"]"); expect(screen.getByTestId("mode-todos").innerHTML) - .toEqual(SubscriptionMode.LISTEN); + .toEqual("[\"CONFIG_STRING\",\"INSIDE_PROVIDER\"]"); expect(screen.getByTestId("mode-doesntExist").innerHTML) - .toEqual(SubscriptionMode.WAIT); + .toEqual("[\"CONFIG_STRING\",\"INSIDE_PROVIDER\",\"WAIT\"]"); expect(screen.getByTestId("result-todos").innerHTML) .toEqual(JSON.stringify({ diff --git a/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/subscription/outside-provider/index.test.tsx b/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/subscription/outside-provider/index.test.tsx index a273ecf9..92087625 100644 --- a/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/subscription/outside-provider/index.test.tsx +++ b/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/subscription/outside-provider/index.test.tsx @@ -4,7 +4,7 @@ import { UseAsyncState, } from "../../../../../types.internal"; import {useAsyncState} from "../../../../../react/useAsyncState"; -import {AsyncStateStatus} from "../../../../../async-state"; +import {Status} from "../../../../../async-state"; describe('should do basic subscription to an async state', () => { it('should subscribe and get initial value -- sync ' + @@ -112,7 +112,7 @@ describe('should do basic subscription to an async state', () => { run(data - 1); } - const isPending = status === AsyncStateStatus.pending; + const isPending = status === Status.pending; return (
@@ -142,7 +142,7 @@ describe('should do basic subscription to an async state', () => { fireEvent.click(incrementBtn); }); // pending state is now skipped! - expect(screen.getByTestId("status").innerHTML).toEqual(AsyncStateStatus.initial); + expect(screen.getByTestId("status").innerHTML).toEqual(Status.initial); expect(screen.getByTestId("result").innerHTML).toEqual("0"); expect(screen.getByTestId("pending").innerHTML).toEqual(""); @@ -151,7 +151,7 @@ describe('should do basic subscription to an async state', () => { }); // pending state is now !! - expect(screen.getByTestId("status").innerHTML).toEqual(AsyncStateStatus.pending); + expect(screen.getByTestId("status").innerHTML).toEqual(Status.pending); expect(screen.getByTestId("result").innerHTML).toEqual(""); expect(screen.getByTestId("pending").innerHTML).toEqual(pendingText); @@ -159,7 +159,7 @@ describe('should do basic subscription to an async state', () => { await jest.advanceTimersByTime(10); }); - expect(screen.getByTestId("status").innerHTML).toEqual(AsyncStateStatus.success); + expect(screen.getByTestId("status").innerHTML).toEqual(Status.success); expect(screen.getByTestId("result").innerHTML).toEqual("1"); expect(screen.getByTestId("pending").innerHTML).toEqual(""); }); diff --git a/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/subscription/outside-provider/source.test.tsx b/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/subscription/outside-provider/source.test.tsx index 7aabb906..96374e37 100644 --- a/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/subscription/outside-provider/source.test.tsx +++ b/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/subscription/outside-provider/source.test.tsx @@ -1,5 +1,5 @@ import * as React from "react"; -import {fireEvent, render, screen} from "@testing-library/react"; +import {fireEvent, render, screen, act} from "@testing-library/react"; import {UseAsyncState} from "../../../../../types.internal"; import {useAsyncState} from "../../../../../react/useAsyncState"; import AsyncStateComponent from "../../../utils/AsyncStateComponent"; @@ -61,7 +61,10 @@ describe('should subscribe to a module level source object', () => { expect(screen.getByTestId("count-a").innerHTML).toEqual("0"); expect(screen.getByTestId("count-b").innerHTML).toEqual("0"); - fireEvent.click(incrementBtn); + + act(() => { + fireEvent.click(incrementBtn); + }); expect(screen.getByTestId("count-a").innerHTML).toEqual("1"); diff --git a/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/subscription/post-subscribe/index.test.tsx b/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/subscription/post-subscribe/index.test.tsx index a81bd639..5e5c5049 100644 --- a/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/subscription/post-subscribe/index.test.tsx +++ b/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/subscription/post-subscribe/index.test.tsx @@ -2,7 +2,7 @@ import * as React from "react"; import {act, fireEvent, render, screen} from "@testing-library/react"; import AsyncStateComponent from "../../../utils/AsyncStateComponent"; import {UseAsyncState} from "../../../../../types.internal"; -import {AsyncStateStatus, createSource} from "../../../../../async-state"; +import {Status, createSource} from "../../../../../async-state"; import {mockDateNow, TESTS_TS} from "../../../utils/setup"; // @ts-ignore @@ -81,7 +81,7 @@ describe('should post subscribe', () => { ) expect(mocked).toHaveBeenCalledTimes(2); // 1 strict mode expect(mocked).toHaveBeenCalledWith({ - status: AsyncStateStatus.initial, + status: Status.initial, timestamp: TESTS_TS, props: null, data: 0 @@ -103,7 +103,7 @@ describe('should post subscribe', () => { await jest.advanceTimersByTime(9); }); - expect(screen.getByTestId("status").innerHTML).toEqual(AsyncStateStatus.pending); + expect(screen.getByTestId("status").innerHTML).toEqual(Status.pending); onAbort.mockClear(); act(() => { diff --git a/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/subscription/standalone/index.test.tsx b/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/subscription/standalone/index.test.tsx index c613d952..4b19d86f 100644 --- a/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/subscription/standalone/index.test.tsx +++ b/packages/react-async-states/src/__tests__/react-async-state/useAsyncState/subscription/standalone/index.test.tsx @@ -1,11 +1,10 @@ import * as React from "react"; import {fireEvent, render, screen} from "@testing-library/react"; import { - SubscriptionMode, UseAsyncState } from "../../../../../types.internal"; import {useAsyncState} from "../../../../../react/useAsyncState"; -import {AsyncStateProvider} from "../../../../../react/AsyncStateProvider"; +import {AsyncStateProvider} from "../../../../../react/Provider"; describe('should declare a standalone producer inside a provider', () => { it('should declare a standalone producer inside a provider ', async () => { @@ -21,7 +20,7 @@ describe('should declare a standalone producer inside a provider', () => { function Component() { const { run, - mode, + devFlags, state, }: UseAsyncState = useAsyncState({ selector: d => d.data, @@ -43,7 +42,7 @@ describe('should declare a standalone producer inside a provider', () => {
- {mode} + {JSON.stringify(devFlags)} {state}
); } @@ -60,7 +59,7 @@ describe('should declare a standalone producer inside a provider', () => { const decrementBtn = screen.getByTestId("decrement"); // then expect(screen.getByTestId("mode").innerHTML) - .toEqual(SubscriptionMode.ALONE); + .toEqual("[\"CONFIG_OBJECT\",\"INSIDE_PROVIDER\",\"SELECTOR\",\"STANDALONE\"]"); // +1 fireEvent.click(incrementBtn); @@ -82,7 +81,7 @@ describe('should declare a standalone producer inside a provider', () => { function Component() { const { - mode, + devFlags, }: UseAsyncState = useAsyncState({ key: "standalone", producer(props) { @@ -91,7 +90,7 @@ describe('should declare a standalone producer inside a provider', () => { initialValue: 0, selector: d => d.data, }); - return {mode}; + return {JSON.stringify(devFlags)}; } // when @@ -104,6 +103,6 @@ describe('should declare a standalone producer inside a provider', () => { // then expect(screen.getByTestId("mode").innerHTML) - .toEqual(SubscriptionMode.ALONE); + .toEqual("[\"CONFIG_OBJECT\",\"INSIDE_PROVIDER\",\"SELECTOR\",\"WAIT\"]"); }); }); diff --git a/packages/react-async-states/src/__tests__/react-async-state/useProducer/index.test.tsx b/packages/react-async-states/src/__tests__/react-async-state/useProducer/index.test.tsx index caf8af9d..f50aa13b 100644 --- a/packages/react-async-states/src/__tests__/react-async-state/useProducer/index.test.tsx +++ b/packages/react-async-states/src/__tests__/react-async-state/useProducer/index.test.tsx @@ -1,8 +1,7 @@ import * as React from "react"; import {fireEvent, render, screen} from "@testing-library/react"; -import {AsyncStateProvider} from "../../../react/AsyncStateProvider"; -import {SubscriptionMode} from "../../../types.internal"; -import {useProducer} from "../../../react/useAsyncStateBase"; +import {AsyncStateProvider} from "../../../react/Provider"; +import {useProducer} from "../../../react/useAsyncState"; describe('should useProducer', () => { it('should use a global producer ', async () => { @@ -20,8 +19,8 @@ describe('should useProducer', () => { function Component() { const { run, - mode, state, + devFlags, } = useProducer(producer); function increment() { @@ -31,7 +30,7 @@ describe('should useProducer', () => { return (
- {mode} + {JSON.stringify(devFlags)} {state.data}
); } @@ -48,7 +47,7 @@ describe('should useProducer', () => { // then expect(screen.getByTestId("result").innerHTML).toEqual(""); expect(screen.getByTestId("mode").innerHTML) - .toEqual(SubscriptionMode.ALONE); + .toEqual("[\"CONFIG_FUNCTION\",\"STANDALONE\"]"); // +1 fireEvent.click(incrementBtn); @@ -73,7 +72,7 @@ describe('should useProducer', () => { function Component() { const { run, - mode, + devFlags, state, } = useProducer(producer); @@ -84,7 +83,7 @@ describe('should useProducer', () => { return (
- {mode} + {JSON.stringify(devFlags)} {state.data}
); } @@ -101,7 +100,7 @@ describe('should useProducer', () => { // then expect(screen.getByTestId("result").innerHTML).toEqual(""); expect(screen.getByTestId("mode").innerHTML) - .toEqual(SubscriptionMode.ALONE); + .toEqual("[\"CONFIG_FUNCTION\",\"INSIDE_PROVIDER\",\"STANDALONE\"]"); // +1 fireEvent.click(incrementBtn); diff --git a/packages/react-async-states/src/__tests__/react-async-state/useSelector/index.test.tsx b/packages/react-async-states/src/__tests__/react-async-state/useSelector/index.test.tsx index 049c3d38..6c6a02b2 100644 --- a/packages/react-async-states/src/__tests__/react-async-state/useSelector/index.test.tsx +++ b/packages/react-async-states/src/__tests__/react-async-state/useSelector/index.test.tsx @@ -1,6 +1,6 @@ import * as React from "react"; import {act, fireEvent, render, screen} from "@testing-library/react"; -import {AsyncStateProvider} from "../../../react/AsyncStateProvider"; +import {AsyncStateProvider} from "../../../react/Provider"; import {useSelector} from "../../../react/useSelector"; import {useRun} from "../../../react/useRun"; import {createSource} from "../../../async-state"; diff --git a/packages/react-async-states/src/__tests__/react-async-state/useSource/index.test.tsx b/packages/react-async-states/src/__tests__/react-async-state/useSource/index.test.tsx index 9396387a..7b82990d 100644 --- a/packages/react-async-states/src/__tests__/react-async-state/useSource/index.test.tsx +++ b/packages/react-async-states/src/__tests__/react-async-state/useSource/index.test.tsx @@ -1,7 +1,6 @@ import * as React from "react"; import {act, render, screen} from "@testing-library/react"; -import {useSource} from "../../../react/useAsyncStateBase"; -import {SubscriptionMode} from "../../../types.internal"; +import {useSource} from "../../../react/useAsyncState"; import {createSource} from "../../../async-state"; describe('should useSource', () => { @@ -18,13 +17,13 @@ describe('should useSource', () => { function Component() { const { run, - mode, + devFlags, state, } = useSource(source); return (
- {mode} + {JSON.stringify(devFlags)} {state.data}
); } @@ -40,7 +39,7 @@ describe('should useSource', () => { // then expect(screen.getByTestId("result").innerHTML).toEqual("8"); expect(screen.getByTestId("mode").innerHTML) - .toEqual(SubscriptionMode.SRC); + .toEqual("[\"CONFIG_SOURCE\",\"SOURCE\"]"); act(() => { source.setState(5); diff --git a/packages/react-async-states/src/__tests__/v2/get-flags.test.ts b/packages/react-async-states/src/__tests__/v2/get-flags.test.ts new file mode 100644 index 00000000..214998b8 --- /dev/null +++ b/packages/react-async-states/src/__tests__/v2/get-flags.test.ts @@ -0,0 +1,276 @@ +import { + AUTO_RUN, + CONFIG_FUNCTION, + CONFIG_OBJECT, + CONFIG_SOURCE, + CONFIG_STRING, + FORK, + HOIST, + INSIDE_PROVIDER, + LANE, + SOURCE, + STANDALONE, + WAIT +} from "../../react/StateHookFlags"; +import {AsyncStateManager, createSource} from "../../async-state"; +import {resolveFlags} from "../../react/StateHook"; + +describe('resolveFlags', () => { + describe('get flags from config outside provider', () => { + it('should correctly infer configuration from key: -- string --', () => { + expect(resolveFlags("key", null)) + .toEqual(CONFIG_STRING | STANDALONE); + + expect(resolveFlags("key", null, { + lazy: false, + hoist: true + })) + .toEqual(CONFIG_STRING | AUTO_RUN | HOIST); + + expect(resolveFlags("key", null, {fork: true})) + .toEqual(CONFIG_STRING | STANDALONE | FORK); + + expect(resolveFlags("key", null, {lane: "lane"})) + .toEqual(CONFIG_STRING | STANDALONE | LANE); + }); + it('should correctly infer configuration from key: -- object with key --', () => { + let key = "key" + + expect(resolveFlags({key}, null)) + .toEqual(CONFIG_OBJECT | STANDALONE); + + expect(resolveFlags({key, lazy: false, hoist: true}, null)) + .toEqual(CONFIG_OBJECT | AUTO_RUN | HOIST); + + expect(resolveFlags({key}, null, {fork: true})) + .toEqual(CONFIG_OBJECT | STANDALONE | FORK); + + expect(resolveFlags({key, lane: "lane"}, null)) + .toEqual(CONFIG_OBJECT | STANDALONE | LANE); + + expect(resolveFlags({key, producer: () => 5}, null, {lazy: false})) + .toEqual(CONFIG_OBJECT | STANDALONE | AUTO_RUN); + }); + it('should correctly infer configuration from source: -- source --', () => { + let source = createSource("tmp"); + + expect(resolveFlags(source, null)) + .toEqual(CONFIG_SOURCE | SOURCE); + + expect(resolveFlags(source, null, {lazy: false})) + .toEqual(CONFIG_SOURCE | SOURCE | AUTO_RUN); + + expect(resolveFlags(source, null, {fork: true})) + .toEqual(CONFIG_SOURCE | SOURCE | FORK); + + expect(resolveFlags(source, null, {lane: "lane"})) + .toEqual(CONFIG_SOURCE | SOURCE | LANE); + + expect(resolveFlags(source, null, {producer: () => 5, lazy: false})) + .toEqual(CONFIG_SOURCE | SOURCE | AUTO_RUN); + }); + it('should correctly infer configuration from source: -- object with source --', () => { + let source = createSource("tmp"); + + expect(resolveFlags({source}, null)) + .toEqual(CONFIG_OBJECT | SOURCE); + + expect(resolveFlags({source}, null, {lazy: false})) + .toEqual(CONFIG_OBJECT | SOURCE | AUTO_RUN); + + expect(resolveFlags({source}, null, {fork: true})) + .toEqual(CONFIG_OBJECT | SOURCE | FORK); + + expect(resolveFlags({source}, null, {lane: "lane"})) + .toEqual(CONFIG_OBJECT | SOURCE | LANE); + + expect(resolveFlags({source, producer: () => 5, lazy: false}, null)) + .toEqual(CONFIG_OBJECT | SOURCE | AUTO_RUN); + }); + it('should correctly infer configuration from producer: -- producer --', () => { + let producer = () => 5; + + expect(resolveFlags(producer, null)) + .toEqual(CONFIG_FUNCTION | STANDALONE); + + expect(resolveFlags(producer, null, {lazy: false})) + .toEqual(CONFIG_FUNCTION | STANDALONE | AUTO_RUN); + + expect(resolveFlags(producer, null, {fork: true})) + .toEqual(CONFIG_FUNCTION | STANDALONE | FORK); + + expect(resolveFlags(producer, null, {lane: "lane"})) + .toEqual(CONFIG_FUNCTION | STANDALONE | LANE); + }); + it('should correctly infer configuration from producer: -- object with producer --', () => { + let producer = () => 5; + + expect(resolveFlags({producer}, null)) + .toEqual(CONFIG_OBJECT | STANDALONE); + + expect(resolveFlags({producer}, null, {lazy: false})) + .toEqual(CONFIG_OBJECT | STANDALONE | AUTO_RUN); + + expect(resolveFlags({producer}, null, {fork: true})) + .toEqual(CONFIG_OBJECT | STANDALONE | FORK); + + expect(resolveFlags({producer}, null, {lane: "lane"})) + .toEqual(CONFIG_OBJECT | STANDALONE | LANE); + }); + it('should correctly infer configuration from object: -- remaining cases --', () => { + + expect(resolveFlags({ + key: "test", + payload: {}, + lazy: false, + producer: () => 5, + }, null)) + .toEqual(CONFIG_OBJECT | AUTO_RUN | STANDALONE); + + }); + }); + + describe('get flags from config inside provider', () => { + it('should correctly infer configuration from key: -- string --', () => { + let manager = AsyncStateManager({key: {key: "key"}}); + + expect(resolveFlags("key", manager)) + .toEqual(CONFIG_STRING | INSIDE_PROVIDER); + + expect(resolveFlags("not-existing", manager)) + .toEqual(CONFIG_STRING | INSIDE_PROVIDER | WAIT); + + expect(resolveFlags("key", manager, { + lazy: false, + hoist: true + })) + .toEqual(CONFIG_STRING | INSIDE_PROVIDER | HOIST | AUTO_RUN); + + expect(resolveFlags("key", manager, {fork: true})) + .toEqual(CONFIG_STRING | INSIDE_PROVIDER | FORK); + + expect(resolveFlags("key", manager, {lane: "lane"})) + .toEqual(CONFIG_STRING | INSIDE_PROVIDER | LANE); + }); + it('should correctly infer configuration from key: -- object with key --', () => { + let key = "key"; + let manager = AsyncStateManager({key: {key}}); + + expect(resolveFlags({key}, manager)) + .toEqual(CONFIG_OBJECT | INSIDE_PROVIDER); + expect(resolveFlags({key: "not-existing", lazy: false}, manager)) + .toEqual(CONFIG_OBJECT | INSIDE_PROVIDER | WAIT | AUTO_RUN); + + expect(resolveFlags({key, lazy: false, hoist: true}, manager)) + .toEqual(CONFIG_OBJECT | INSIDE_PROVIDER | AUTO_RUN | HOIST); + + expect(resolveFlags({key}, manager, {fork: true})) + .toEqual(CONFIG_OBJECT | INSIDE_PROVIDER | FORK); + + expect(resolveFlags({key, lane: "lane"}, manager)) + .toEqual(CONFIG_OBJECT | INSIDE_PROVIDER | LANE); + + expect(resolveFlags({key, producer: () => 5}, manager, {lazy: false})) + .toEqual(CONFIG_OBJECT | INSIDE_PROVIDER | AUTO_RUN); + }); + it('should correctly infer configuration from source: -- source --', () => { + let source = createSource("tmp"); + let manager = AsyncStateManager({key: source}); + + expect(resolveFlags(source, manager)) + .toEqual(CONFIG_SOURCE | INSIDE_PROVIDER | SOURCE); + + expect(resolveFlags(source, manager, {lazy: false})) + .toEqual(CONFIG_SOURCE | INSIDE_PROVIDER | SOURCE | AUTO_RUN); + + expect(resolveFlags(source, manager, {fork: true})) + .toEqual(CONFIG_SOURCE | INSIDE_PROVIDER | SOURCE | FORK); + + expect(resolveFlags(source, manager, {lane: "lane"})) + .toEqual(CONFIG_SOURCE | INSIDE_PROVIDER | SOURCE | LANE); + + expect(resolveFlags(source, manager, {producer: () => 5, lazy: false})) + .toEqual(CONFIG_SOURCE | INSIDE_PROVIDER | SOURCE | AUTO_RUN); + }); + it('should correctly infer configuration from source: -- object with source --', () => { + let source = createSource("tmp"); + let manager = AsyncStateManager({key: source}); + + expect(resolveFlags({source}, manager)) + .toEqual(CONFIG_OBJECT | INSIDE_PROVIDER | SOURCE); + + expect(resolveFlags({source}, manager, {lazy: false})) + .toEqual(CONFIG_OBJECT | INSIDE_PROVIDER | SOURCE | AUTO_RUN); + + expect(resolveFlags({source}, manager, {fork: true})) + .toEqual(CONFIG_OBJECT | INSIDE_PROVIDER | SOURCE | FORK); + + expect(resolveFlags({source}, manager, {lane: "lane"})) + .toEqual(CONFIG_OBJECT | INSIDE_PROVIDER | SOURCE | LANE); + + expect(resolveFlags({source, producer: () => 5, lazy: false}, manager)) + .toEqual(CONFIG_OBJECT | INSIDE_PROVIDER | SOURCE | AUTO_RUN); + }); + it('should correctly infer configuration from producer: -- producer --', () => { + let producer = () => 5; + let manager = AsyncStateManager({key: {key: "key", producer}}); + + expect(resolveFlags(producer, manager)) + .toEqual(CONFIG_FUNCTION | INSIDE_PROVIDER | STANDALONE); + + expect(resolveFlags(producer, manager, {lazy: false})) + .toEqual(CONFIG_FUNCTION | INSIDE_PROVIDER | STANDALONE | AUTO_RUN); + + expect(resolveFlags(producer, manager, {fork: true})) + .toEqual(CONFIG_FUNCTION | INSIDE_PROVIDER | STANDALONE | FORK); + + expect(resolveFlags(producer, manager, {lane: "lane"})) + .toEqual(CONFIG_FUNCTION | INSIDE_PROVIDER | STANDALONE | LANE); + }); + it('should correctly infer configuration from producer: -- object with producer --', () => { + let producer = () => 5; + let manager = AsyncStateManager({key: {key: "key", producer}}); + + expect(resolveFlags({producer}, manager)) + .toEqual(CONFIG_OBJECT | INSIDE_PROVIDER | STANDALONE); + + expect(resolveFlags({producer}, manager, {lazy: false})) + .toEqual(CONFIG_OBJECT | INSIDE_PROVIDER | STANDALONE | AUTO_RUN); + + expect(resolveFlags({producer}, manager, {fork: true})) + .toEqual(CONFIG_OBJECT | INSIDE_PROVIDER | STANDALONE | FORK); + + expect(resolveFlags({producer}, manager, {lane: "lane"})) + .toEqual(CONFIG_OBJECT | INSIDE_PROVIDER | STANDALONE | LANE); + + // listen to the existing! + expect(resolveFlags({key: "key", producer}, manager, {hoist: true})) + .toEqual(CONFIG_OBJECT | INSIDE_PROVIDER | HOIST); + + expect(resolveFlags({key: "key2", producer}, manager, {hoist: true})) + .toEqual(CONFIG_OBJECT | INSIDE_PROVIDER | HOIST); + }); + it('should correctly infer configuration from object: -- remaining cases --', () => { + + let manager = AsyncStateManager({key: {key: "key"}}); + + expect(resolveFlags({ + key: "test", + payload: {}, + lazy: false, + producer: () => 5, + }, manager)) + .toEqual(CONFIG_OBJECT | AUTO_RUN | INSIDE_PROVIDER | WAIT); + + expect(resolveFlags({ + key: "key", + payload: {}, + lazy: false, + producer: () => 5, + }, manager)) + .toEqual(CONFIG_OBJECT | AUTO_RUN | INSIDE_PROVIDER); + + }); + }); + +}); diff --git a/packages/react-async-states/src/__tests__/v2/resolve-instance.test.ts b/packages/react-async-states/src/__tests__/v2/resolve-instance.test.ts new file mode 100644 index 00000000..672a2a8e --- /dev/null +++ b/packages/react-async-states/src/__tests__/v2/resolve-instance.test.ts @@ -0,0 +1,162 @@ +import {createStateHook} from "../../react/useAsyncState"; +import { + CONFIG_OBJECT, + CONFIG_SOURCE, CONFIG_STRING, FORK, HOIST, + INSIDE_PROVIDER, LANE, + SOURCE, STANDALONE, + WAIT +} from "../../react/StateHookFlags"; +import AsyncState, {AsyncStateManager} from "../../async-state"; +import {resolveInstance, StateHook} from "../../react/StateHook"; + +describe('resolveInstance', () => { + it('should resolve instance in WAIT mode', () => { + expect(resolveInstance(WAIT, "irrelevant", null, null)).toBe(null); + expect(resolveInstance(WAIT | INSIDE_PROVIDER, {}, null, null)).toBe(null); + }); + it('should resolve instance Sources', () => { + let instance = new AsyncState("key", null); + + expect(resolveInstance(CONFIG_SOURCE | SOURCE, instance._source, null, null)) + .toBe(instance); + + expect( + resolveInstance( + CONFIG_OBJECT | SOURCE | INSIDE_PROVIDER, + {source: instance._source}, + null, + null) + ).toBe(instance); + + expect( + resolveInstance( + CONFIG_OBJECT | SOURCE | INSIDE_PROVIDER | LANE, + {source: instance._source, lane: 'test'}, + null, + null) + ).toBe(instance.getLane('test')); + + expect( + resolveInstance( + CONFIG_OBJECT | SOURCE | INSIDE_PROVIDER | FORK, + {source: instance._source, fork: true}, + null, + null) + ).not.toBe(instance); + + expect( + resolveInstance( + CONFIG_SOURCE | SOURCE | INSIDE_PROVIDER | FORK, + instance._source, + null, + null) + ).not.toBe(instance); + }); + it('should resolve instance when inside provider', () => { + let instance = new AsyncState("key", null); + let manager = AsyncStateManager({ key: instance._source }); + + + expect( + resolveInstance( + CONFIG_OBJECT | INSIDE_PROVIDER | HOIST, + {key: "key", hoistConfig: {override: true}}, + manager, + null) + ).not.toBe(instance); + + expect( + resolveInstance( + CONFIG_STRING | INSIDE_PROVIDER | HOIST, + "key", + manager, + null) + ).toBe(instance); + + expect( + resolveInstance( + CONFIG_OBJECT | INSIDE_PROVIDER | HOIST, + {key: "key"}, + manager, + null) + ).toBe(instance); + + expect( + resolveInstance( + CONFIG_OBJECT | INSIDE_PROVIDER | HOIST | LANE, + {key: "key", lane: "test"}, + manager, + null) + ).toBe(instance.getLane("test")); + + expect( + resolveInstance( + CONFIG_OBJECT | INSIDE_PROVIDER | HOIST | FORK | LANE, + {key: "key", lane: "test"}, + manager, + null) + ).not.toBe(instance.getLane("test")); + + expect( + resolveInstance( + CONFIG_STRING | INSIDE_PROVIDER, + "key", + manager, + null) + ).toBe(instance); + }); + it('should resolve instance when standalone', () => { + let instance = new AsyncState("key", null); + let manager = AsyncStateManager({ key: instance._source }); + + expect( + resolveInstance( + CONFIG_OBJECT | INSIDE_PROVIDER | STANDALONE, + {initialValue: 5}, + manager, + null).config.initialValue + ).toBe(5); + + + expect( + resolveInstance( + STANDALONE, + undefined, + null, + null).key.startsWith("async-state-") + ).toBe(true); + + let hook: StateHook = createStateHook(); + + hook.flags = CONFIG_STRING | STANDALONE; + hook.instance = instance; + hook.config = "key"; + + + // reused instance with patches + let newInstance = resolveInstance( + CONFIG_OBJECT | STANDALONE, + {key: "key", initialValue: 15}, + null, + hook); + + expect(newInstance).toBe(instance); + expect(newInstance.config.initialValue).toBe(15); + expect(newInstance.originalProducer).toBe(undefined); + + // dont reuse becaue of flags + + hook.flags = CONFIG_STRING | WAIT; + hook.config = "key"; + + newInstance = resolveInstance( + CONFIG_OBJECT | STANDALONE, + {key: "key", initialValue: 15}, + null, + hook); + + expect(newInstance).not.toBe(instance); + expect(newInstance.config.initialValue).toBe(15); + expect(newInstance.originalProducer).toBe(undefined); + }); +}); diff --git a/packages/react-async-states/src/async-state/AsyncState.ts b/packages/react-async-states/src/async-state/AsyncState.ts index 3d8ca378..051adfdf 100644 --- a/packages/react-async-states/src/async-state/AsyncState.ts +++ b/packages/react-async-states/src/async-state/AsyncState.ts @@ -3,7 +3,7 @@ import { asyncStatesKey, didNotExpire, hash, - isAsyncStateSource, + isSource, sourceIsSourceSymbol, } from "./utils"; import devtools from "../devtools/Devtools"; @@ -34,7 +34,6 @@ class AsyncState implements StateInterface { subsIndex: number = 0; subscriptions: Record> | null = null; - producer: ProducerFunction; suspender: Promise | undefined = undefined; originalProducer: Producer | undefined; @@ -57,7 +56,6 @@ class AsyncState implements StateInterface { this.key = key; this.uniqueId = nextUniqueId(); this.config = shallowClone(config); - this.producer = wrapProducerFunction(this); this.originalProducer = producer ?? undefined; this.producerType = producer ? ProducerType.indeterminate : ProducerType.notProvided; @@ -79,6 +77,7 @@ class AsyncState implements StateInterface { this.abort = this.abort.bind(this); this.getState = this.getState.bind(this); this.setState = this.setState.bind(this); + this.producer = this.producer.bind(this); this.subscribe = this.subscribe.bind(this); this.getPayload = this.getPayload.bind(this); this.mergePayload = this.mergePayload.bind(this); @@ -109,10 +108,119 @@ class AsyncState implements StateInterface { return this.config; } - patchConfig(partialConfig: Partial>) { + patchConfig(partialConfig?: Partial>) { Object.assign(this.config, partialConfig); } + producer( + props: ProducerProps, + indicators: RunIndicators, + callbacks?: ProducerCallbacks, + ): AbortFn { + let instance = this; + const currentProducer = this.originalProducer; + if (typeof currentProducer !== "function") { + indicators.fulfilled = true; + instance.producerType = ProducerType.notProvided; + instance.setState(props.args[0], props.args[1]); + if (callbacks) { + switch (instance.state.status) { + case Status.success: { + callbacks.onSuccess?.(instance.state); + break; + } + case Status.aborted: { + callbacks.onAborted?.(instance.state); + break; + } + case Status.error: { + callbacks.onError?.(instance.state); + break; + } + } + } + return; + } + // the running promise is used to pass the status to pending and as suspender in react18+ + let runningPromise; + // the execution value is the return of the initial producer function + let executionValue; + // it is important to clone to capture properties and save only serializable stuff + const savedProps = cloneProducerProps(props); + + try { + executionValue = currentProducer(props); + } catch (e) { + if (__DEV__) devtools.emitRunSync(instance, savedProps); + indicators.fulfilled = true; + let errorState = StateBuilder.error(e, savedProps); + instance.replaceState(errorState); + callbacks?.onError?.(errorState); + return; + } + + if (isGenerator(executionValue)) { + instance.producerType = ProducerType.generator; + if (__DEV__) devtools.emitRunGenerator(instance, savedProps); + // generatorResult is either {done, value} or a promise + let generatorResult; + try { + generatorResult = wrapStartedGenerator(executionValue, props, indicators); + } catch (e) { + indicators.fulfilled = true; + let errorState = StateBuilder.error(e, savedProps); + instance.replaceState(errorState); + callbacks?.onError?.(errorState); + return; + } + if (generatorResult.done) { + indicators.fulfilled = true; + let successState = StateBuilder.success(generatorResult.value, savedProps); + instance.replaceState(successState); + callbacks?.onSuccess?.(successState); + return; + } else { + runningPromise = generatorResult; + instance.suspender = runningPromise; + instance.replaceState(StateBuilder.pending(savedProps) as State); + } + } else if (isPromise(executionValue)) { + instance.producerType = ProducerType.promise; + if (__DEV__) devtools.emitRunPromise(instance, savedProps); + runningPromise = executionValue; + instance.suspender = runningPromise; + instance.replaceState(StateBuilder.pending(savedProps) as State); + } else { // final value + if (__DEV__) devtools.emitRunSync(instance, savedProps); + indicators.fulfilled = true; + instance.producerType = ProducerType.sync; + let successState = StateBuilder.success(executionValue, savedProps); + instance.replaceState(successState); + callbacks?.onSuccess?.(successState); + return; + } + + runningPromise + .then(stateData => { + let aborted = indicators.aborted; + if (!aborted) { + indicators.fulfilled = true; + let successState = StateBuilder.success(stateData, savedProps); + instance.replaceState(successState); + callbacks?.onSuccess?.(successState); + } + }) + .catch(stateError => { + let aborted = indicators.aborted; + if (!aborted) { + indicators.fulfilled = true; + let errorState = StateBuilder.error(stateError, savedProps); + instance.replaceState(errorState); + callbacks?.onError?.(errorState); + } + }); + }; + getPayload(): Record { if (!this.payload) { this.payload = {}; @@ -154,7 +262,7 @@ class AsyncState implements StateInterface { notify: boolean = true ): void { - if (newState.status === AsyncStateStatus.pending && this.config.skipPendingStatus) { + if (newState.status === Status.pending && this.config.skipPendingStatus) { return; } @@ -166,7 +274,7 @@ class AsyncState implements StateInterface { this.pendingUpdate = null; } - if (newState.status === AsyncStateStatus.pending) { + if (newState.status === Status.pending) { if ( areRunEffectsSupported() && this.config.skipPendingDelayMs @@ -182,14 +290,14 @@ class AsyncState implements StateInterface { this.version += 1; if (__DEV__) devtools.emitUpdate(this); - if (this.state.status === AsyncStateStatus.success) { + if (this.state.status === Status.success) { this.lastSuccess = this.state; if (isCacheEnabled(this)) { saveCacheAfterSuccessfulUpdate(this); } } - if (this.state.status !== AsyncStateStatus.pending) { + if (this.state.status !== Status.pending) { this.suspender = undefined; } @@ -199,8 +307,7 @@ class AsyncState implements StateInterface { } subscribe( - cb, - subKey?: string | undefined + props: AsyncStateSubscribeProps ): AbortFn { if (!this.subscriptions) { this.subscriptions = {}; @@ -208,10 +315,11 @@ class AsyncState implements StateInterface { let that = this; this.subsIndex += 1; - let subscriptionKey: string | undefined = subKey; - if (subKey === undefined) { - subscriptionKey = `subscription-$${this.subsIndex}`; + let subscriptionKey: string | undefined = props.key; + + if (subscriptionKey === undefined) { + subscriptionKey = `$${this.subsIndex}`; } function cleanup() { @@ -225,26 +333,22 @@ class AsyncState implements StateInterface { } } - this.subscriptions[subscriptionKey!] = { - cleanup, - callback: cb, - key: subscriptionKey, - }; + this.subscriptions[subscriptionKey] = {props, cleanup}; this.locks += 1; - if (__DEV__) devtools.emitSubscription(this, subscriptionKey!); + if (__DEV__) devtools.emitSubscription(this, subscriptionKey); return cleanup; } setState( newValue: T | StateFunctionUpdater, - status = AsyncStateStatus.success, + status = Status.success, ): void { if (!StateBuilder[status]) { throw new Error(`Couldn't replace state to unknown status ${status}.`); } this.willUpdate = true; - if (this.state?.status === AsyncStateStatus.pending) { + if (this.state?.status === Status.pending) { this.abort(); this.currentAbort = undefined; } @@ -386,10 +490,10 @@ class AsyncState implements StateInterface { const now = Date.now(); switch (this.config.runEffect) { - case ProducerRunEffects.delay: - case ProducerRunEffects.debounce: - case ProducerRunEffects.takeLast: - case ProducerRunEffects.takeLatest: { + case RunEffect.delay: + case RunEffect.debounce: + case RunEffect.takeLast: + case RunEffect.takeLatest: { if (this.pendingTimeout) { const deadline = this.pendingTimeout.startDate + effectDurationMs; if (now < deadline) { @@ -398,9 +502,9 @@ class AsyncState implements StateInterface { } return scheduleDelayedRun(now); } - case ProducerRunEffects.throttle: - case ProducerRunEffects.takeFirst: - case ProducerRunEffects.takeLeading: { + case RunEffect.throttle: + case RunEffect.takeFirst: + case RunEffect.takeLeading: { if (this.pendingTimeout) { const deadline = this.pendingTimeout.startDate + effectDurationMs; if (now <= deadline) { @@ -431,7 +535,7 @@ class AsyncState implements StateInterface { ): AbortFn { this.willUpdate = true; - if (this.state.status === AsyncStateStatus.pending || this.pendingUpdate) { + if (this.state.status === Status.pending || this.pendingUpdate) { if (this.pendingUpdate) { clearTimeout(this.pendingUpdate.timeoutId); // this.pendingUpdate.callback(); skip the callback! @@ -619,9 +723,9 @@ function constructPropsObject( function emit( updater: T | StateFunctionUpdater, - status?: AsyncStateStatus + status?: Status ): void { - if (runIndicators.cleared && instance.state.status === AsyncStateStatus.aborted) { + if (runIndicators.cleared && instance.state.status === Status.aborted) { console.error("You are emitting while your producer is passing to aborted state." + "This has no effect and not supported by the library. The next " + "state value on aborted state is the reason of the abort."); @@ -687,7 +791,7 @@ function nextUniqueId() { return ++uniqueId; } -function readInstanceFromSource(possiblySource: Source): StateInterface { +function readSource(possiblySource: Source): StateInterface { try { const candidate = possiblySource.constructor(asyncStatesKey); if (!(candidate instanceof AsyncState)) { @@ -804,7 +908,7 @@ function notifySubscribers(instance: StateInterface) { return; } Object.values(instance.subscriptions).forEach(subscription => { - subscription.callback(instance.state); + subscription.props.cb(instance.state); }); } @@ -880,7 +984,7 @@ function isCacheEnabled(instance: StateInterface): boolean { function state( - status: AsyncStateStatus, + status: Status, data: T | any, props: ProducerSavedProps | null ): State { @@ -888,20 +992,20 @@ function state( } export const StateBuilder = Object.freeze({ - initial: (initialValue) => state(AsyncStateStatus.initial, initialValue, null), + initial: (initialValue) => state(Status.initial, initialValue, null), error: ( data, props - ) => state(AsyncStateStatus.error, data, props), + ) => state(Status.error, data, props), success: ( data, props - ) => state(AsyncStateStatus.success, data, props), - pending: props => state(AsyncStateStatus.pending, null, props), + ) => state(Status.success, data, props), + pending: props => state(Status.pending, null, props), aborted: ( reason, props - ) => state(AsyncStateStatus.aborted, reason, props), + ) => state(Status.aborted, reason, props), }) as StateBuilderInterface; //endregion @@ -912,8 +1016,8 @@ export function standaloneProducerRunEffectFunction( config: ProducerRunConfig | null, ...args: any[] ) { - if (isAsyncStateSource(input)) { - let instance = readInstanceFromSource(input as Source) + if (isSource(input)) { + let instance = readSource(input as Source) .getLane(config?.lane); return instance.run(standaloneProducerEffectsCreator, ...args); @@ -935,8 +1039,8 @@ export function standaloneProducerRunpEffectFunction( ...args: any[] ) { - if (isAsyncStateSource(input)) { - let instance = readInstanceFromSource(input as Source).getLane(config?.lane); + if (isSource(input)) { + let instance = readSource(input as Source).getLane(config?.lane); return runWhileSubscribingToNextResolve(instance, props, args); } else if (typeof input === "function") { @@ -957,15 +1061,15 @@ export function runWhileSubscribingToNextResolve( args ): Promise> { return new Promise(resolve => { - let unsubscribe = instance.subscribe(subscription); + let unsubscribe = instance.subscribe({cb: subscription}); props.onAbort(unsubscribe); let abort = instance.run(standaloneProducerEffectsCreator, ...args); props.onAbort(abort); function subscription(newState: State) { - if (newState.status === AsyncStateStatus.success - || newState.status === AsyncStateStatus.error) { + if (newState.status === Status.success + || newState.status === Status.error) { if (typeof unsubscribe === "function") { unsubscribe(); } @@ -979,7 +1083,7 @@ export function standaloneProducerSelectEffectFunction( input: ProducerRunInput, lane?: string, ) { - if (isAsyncStateSource(input)) { + if (isSource(input)) { return (input as Source).getLaneSource(lane).getState() } } @@ -997,119 +1101,6 @@ function standaloneProducerEffectsCreator(props: ProducerProps): ProducerE //region WRAP PRODUCER FUNCTION -export function wrapProducerFunction(instance: StateInterface): ProducerFunction { - // this is the real deal - return function producerFuncImpl( - props: ProducerProps, - indicators: RunIndicators, - callbacks?: ProducerCallbacks, - ): undefined { - - // this allows the developer to omit the producer attribute. - // and replaces state when there is no producer - const currentProducer = instance.originalProducer; - if (typeof currentProducer !== "function") { - indicators.fulfilled = true; - instance.producerType = ProducerType.notProvided; - instance.setState(props.args[0], props.args[1]); - if (callbacks) { - switch (instance.state.status) { - case AsyncStateStatus.success: { - callbacks.onSuccess?.(instance.state); - break; - } - case AsyncStateStatus.aborted: { - callbacks.onAborted?.(instance.state); - break; - } - case AsyncStateStatus.error: { - callbacks.onError?.(instance.state); - break; - } - } - } - return; - } - // the running promise is used to pass the status to pending and as suspender in react18+ - let runningPromise; - // the execution value is the return of the initial producer function - let executionValue; - // it is important to clone to capture properties and save only serializable stuff - const savedProps = cloneProducerProps(props); - - try { - executionValue = currentProducer(props); - } catch (e) { - if (__DEV__) devtools.emitRunSync(instance, savedProps); - indicators.fulfilled = true; - let errorState = StateBuilder.error(e, savedProps); - instance.replaceState(errorState); - callbacks?.onError?.(errorState); - return; - } - - if (isGenerator(executionValue)) { - instance.producerType = ProducerType.generator; - if (__DEV__) devtools.emitRunGenerator(instance, savedProps); - // generatorResult is either {done, value} or a promise - let generatorResult; - try { - generatorResult = wrapStartedGenerator(executionValue, props, indicators); - } catch (e) { - indicators.fulfilled = true; - let errorState = StateBuilder.error(e, savedProps); - instance.replaceState(errorState); - callbacks?.onError?.(errorState); - return; - } - if (generatorResult.done) { - indicators.fulfilled = true; - let successState = StateBuilder.success(generatorResult.value, savedProps); - instance.replaceState(successState); - callbacks?.onSuccess?.(successState); - return; - } else { - runningPromise = generatorResult; - instance.suspender = runningPromise; - instance.replaceState(StateBuilder.pending(savedProps) as State); - } - } else if (isPromise(executionValue)) { - instance.producerType = ProducerType.promise; - if (__DEV__) devtools.emitRunPromise(instance, savedProps); - runningPromise = executionValue; - instance.suspender = runningPromise; - instance.replaceState(StateBuilder.pending(savedProps) as State); - } else { // final value - if (__DEV__) devtools.emitRunSync(instance, savedProps); - indicators.fulfilled = true; - instance.producerType = ProducerType.sync; - let successState = StateBuilder.success(executionValue, savedProps); - instance.replaceState(successState); - callbacks?.onSuccess?.(successState); - return; - } - - runningPromise - .then(stateData => { - let aborted = indicators.aborted; - if (!aborted) { - indicators.fulfilled = true; - let successState = StateBuilder.success(stateData, savedProps); - instance.replaceState(successState); - callbacks?.onSuccess?.(successState); - } - }) - .catch(stateError => { - let aborted = indicators.aborted; - if (!aborted) { - indicators.fulfilled = true; - let errorState = StateBuilder.error(stateError, savedProps); - instance.replaceState(errorState); - callbacks?.onError?.(errorState); - } - }); - }; -} function wrapStartedGenerator( generatorInstance, @@ -1214,7 +1205,7 @@ function stepAsyncAndContinueStartedGenerator( //region Exports export default AsyncState; export { - readInstanceFromSource, + readSource, standaloneProducerEffectsCreator, }; //endregion @@ -1235,11 +1226,11 @@ export interface BaseSource { setState( updater: StateFunctionUpdater | T, - status?: AsyncStateStatus, + status?: Status, ): void; // subscriptions - subscribe(cb: Function, subscriptionKey?: string): AbortFn, + subscribe(AsyncStateSubscribeProps: AsyncStateSubscribeProps): AbortFn, // producer replay(): AbortFn, @@ -1253,11 +1244,18 @@ export interface BaseSource { replaceCache(cacheKey: string, cache: CachedState): void, - patchConfig(partialConfig: Partial>), + patchConfig(partialConfig?: Partial>), getConfig(): ProducerConfig, } +export type AsyncStateSubscribeProps = { + key?: string, + flags?: number, + origin?: number, + cb(s: State): void, +} + export interface StateInterface extends BaseSource { // identity version: number, @@ -1330,7 +1328,7 @@ export interface RUNCProps extends ProducerCallbacks { args?: any[], } -export enum AsyncStateStatus { +export enum Status { error = "error", pending = "pending", success = "success", @@ -1338,7 +1336,7 @@ export enum AsyncStateStatus { initial = "initial", } -export enum ProducerRunEffects { +export enum RunEffect { delay = "delay", debounce = "debounce", takeLast = "takeLast", @@ -1352,7 +1350,7 @@ export enum ProducerRunEffects { export type State = { data: T, timestamp: number, - status: AsyncStateStatus, + status: Status, props?: ProducerSavedProps | null, }; @@ -1413,7 +1411,7 @@ export type ProducerConfig = { initialValue?: T | ((cache: Record>) => T), cacheConfig?: CacheConfig, runEffectDurationMs?: number, - runEffect?: ProducerRunEffects, + runEffect?: RunEffect, skipPendingDelayMs?: number, resetStateOnDispose?: boolean, @@ -1425,7 +1423,7 @@ export type StateFunctionUpdater = (updater: State) => T; export type StateUpdater = ( updater: T | StateFunctionUpdater, - status?: AsyncStateStatus + status?: Status ) => void; export interface Source extends BaseSource { @@ -1447,15 +1445,14 @@ export type RunTask = { } export type StateSubscription = { - key: string, // subscription key cleanup: () => void, - callback: (newState: State) => void, + props: AsyncStateSubscribeProps }; export type OnCacheLoadProps = { cache: Record>, setState( - newValue: T | StateFunctionUpdater, status?: AsyncStateStatus): void + newValue: T | StateFunctionUpdater, status?: Status): void } export type CacheConfig = { diff --git a/packages/react-async-states/src/async-state/AsyncStateManager.ts b/packages/react-async-states/src/async-state/AsyncStateManager.ts index 2964be9a..4174a6e2 100644 --- a/packages/react-async-states/src/async-state/AsyncStateManager.ts +++ b/packages/react-async-states/src/async-state/AsyncStateManager.ts @@ -11,14 +11,14 @@ import AsyncState, { Source, State, StateInterface, - readInstanceFromSource, + readSource, runWhileSubscribingToNextResolve, standaloneProducerRunEffectFunction, standaloneProducerRunpEffectFunction, standaloneProducerSelectEffectFunction } from "./AsyncState"; -import {isAsyncStateSource,} from "./utils"; +import {isSource,} from "./utils"; const listenersKey = Symbol(); @@ -41,7 +41,7 @@ export function AsyncStateManager( let watchers: ManagerWatchers = Object.create(null); // @ts-ignore - // ts is yelling at producerEffectsCreator property which will be assigned + // ts is yelling at createEffects property which will be assigned // in the next statement. const output: AsyncStateManagerInterface = { entries: asyncStateEntries, @@ -54,7 +54,7 @@ export function AsyncStateManager( watchAll, getAllKeys, notifyWatchers, - setInitialStates, + setStates: setInitialStates, getPayload(): Record { return payload; }, @@ -62,7 +62,7 @@ export function AsyncStateManager( Object.assign(payload, partialPayload); } }; - output.producerEffectsCreator = createProducerEffectsCreator(output); + output.createEffects = createProducerEffectsCreator(output); return output; @@ -116,7 +116,7 @@ export function AsyncStateManager( asyncState: StateInterface, ...args: any[] ): AbortFn { - return asyncState.run(output.producerEffectsCreator, ...args); + return asyncState.run(output.createEffects, ...args); } function dispose( @@ -239,7 +239,7 @@ export function AsyncStateManager( function hoist( key: string, instance: StateInterface, - hoistConfig?: HoistToProviderConfig + hoistConfig?: hoistConfig ): StateInterface { const existing = get(key); @@ -281,10 +281,10 @@ function createInitialAsyncStatesReducer( result: AsyncStateEntries, current: ExtendedInitialAsyncState ): AsyncStateEntries { - if (isAsyncStateSource(current)) { + if (isSource(current)) { const key = current.key; const existingEntry = result[key]; - const asyncState = readInstanceFromSource( + const asyncState = readSource( current as Source); if (!existingEntry || asyncState !== existingEntry.instance) { @@ -343,7 +343,7 @@ function managerProducerRunFunction( if (config?.lane) { instance = instance.getLane(config.lane); } - return instance.run(manager.producerEffectsCreator, ...args); + return instance.run(manager.createEffects, ...args); } return standaloneProducerRunEffectFunction(input, config, ...args); } @@ -389,7 +389,7 @@ function managerProducerSelectFunction( //endregion //region TYPES -export type HoistToProviderConfig = { +export type hoistConfig = { override: boolean, } @@ -422,7 +422,7 @@ export type AsyncStateManagerInterface = { get(key: string): StateInterface, hoist( key: string, instance: StateInterface, - hoistConfig?: HoistToProviderConfig + hoistConfig?: hoistConfig ): StateInterface, dispose(asyncState: StateInterface): boolean, watch( @@ -435,12 +435,12 @@ export type AsyncStateManagerInterface = { ): void, getAllKeys(): string[], watchAll(cb: ManagerWatchCallback), - setInitialStates(initialStates?: InitialStates): AsyncStateEntry[], + setStates(initialStates?: InitialStates): AsyncStateEntry[], getPayload(): Record, mergePayload(partialPayload?: Record): void, - producerEffectsCreator(props: ProducerProps): ProducerEffects, + createEffects(props: ProducerProps): ProducerEffects, } export type InitialStatesObject = { [id: string]: ExtendedInitialAsyncState }; diff --git a/packages/react-async-states/src/async-state/index.ts b/packages/react-async-states/src/async-state/index.ts index 9fe24f91..fe49a9ba 100644 --- a/packages/react-async-states/src/async-state/index.ts +++ b/packages/react-async-states/src/async-state/index.ts @@ -6,8 +6,8 @@ export { createSource, StateBuilder, ProducerType, - AsyncStateStatus, - ProducerRunEffects, + Status, + RunEffect, } from "./AsyncState"; export type { @@ -44,7 +44,7 @@ export type { InitialAsyncState, AsyncStateSelector, InitialStatesObject, - HoistToProviderConfig, + hoistConfig, ExtendedInitialAsyncState, AsyncStateManagerInterface, diff --git a/packages/react-async-states/src/async-state/utils.ts b/packages/react-async-states/src/async-state/utils.ts index 5af7198f..9ce82ed1 100644 --- a/packages/react-async-states/src/async-state/utils.ts +++ b/packages/react-async-states/src/async-state/utils.ts @@ -23,7 +23,7 @@ export function didNotExpire(cachedState: CachedState) { export const sourceIsSourceSymbol: symbol = Symbol(); -export function isAsyncStateSource(possiblySource: any) { +export function isSource(possiblySource: any) { return possiblySource && possiblySource[sourceIsSourceSymbol] === true; } diff --git a/packages/react-async-states/src/devtools/Devtools.ts b/packages/react-async-states/src/devtools/Devtools.ts index 5b87d7af..18a559d3 100644 --- a/packages/react-async-states/src/devtools/Devtools.ts +++ b/packages/react-async-states/src/devtools/Devtools.ts @@ -1,5 +1,10 @@ import {ProducerSavedProps, State, StateInterface} from "../async-state"; import {DevtoolsEvent, DevtoolsJournalEvent, DevtoolsRequest} from "./index"; +import {humanizeDevFlags} from "../react/utils"; +import { + AsyncStateSubscribeProps, + StateSubscription +} from "../async-state/AsyncState"; let journalEventsId = 0; const source = "async-states-agent"; @@ -32,9 +37,11 @@ interface DevtoolsInterface { emitUnsubscription(instance: StateInterface, subscriptionKey: string), - emitRunSync(instance: StateInterface, props: ProducerSavedProps): void, + emitRunSync( + instance: StateInterface, props: ProducerSavedProps): void, - emitRunPromise(instance: StateInterface, props: ProducerSavedProps): void, + emitRunPromise( + instance: StateInterface, props: ProducerSavedProps): void, emitRunGenerator( instance: StateInterface, props: ProducerSavedProps): void, @@ -43,7 +50,8 @@ interface DevtoolsInterface { instance: StateInterface, props: ProducerSavedProps): void, emitRunConsumedFromCache( - instance: StateInterface, payload: Record | undefined | null, + instance: StateInterface, + payload: Record | undefined | null, args: any[] ): void, } @@ -126,6 +134,9 @@ function createDevtools(): DevtoolsInterface { } function emitKeys() { + if (!connected) { + return; + } emit({ source, payload: keys, @@ -192,6 +203,9 @@ function createDevtools(): DevtoolsInterface { return; } retainStateInstance(asyncState); + if (!connected) { + return; + } emit({ source, uniqueId: asyncState.uniqueId, @@ -204,15 +218,15 @@ function createDevtools(): DevtoolsInterface { uniqueId: asyncState.uniqueId, lastSuccess: asyncState.lastSuccess, producerType: asyncState.producerType, - subscriptions: asyncState.subscriptions ? Object.keys(asyncState.subscriptions) : [], + subscriptions: (asyncState.subscriptions ? Object.values(asyncState.subscriptions) : []).map(mapSubscriptionToDevtools), lanes: asyncState.lanes ? Object.keys(asyncState.lanes).map(key => ({ uniqueId: asyncState.lanes![key].uniqueId, key })) : [], - parent: { + parent: asyncState.parent ? { key: asyncState.parent?.key, uniqueId: asyncState.parent?.uniqueId - }, + }: null, }, type: DevtoolsEvent.setAsyncState }); @@ -234,6 +248,9 @@ function createDevtools(): DevtoolsInterface { } function emitPartialSync(uniqueId, evt) { + if (!connected) { + return; + } emit({ source, payload: evt, @@ -256,18 +273,6 @@ function createDevtools(): DevtoolsInterface { }, }); emitStateInterface(asyncState); - // listenToDevtoolsMessages(asyncState); - } - - function emitInsideProvider(asyncState: StateInterface, insideProvider = true) { - if (asyncState.config.hideFromDevtools) { - return; - } - retainStateInstance(asyncState); - emitJournalEvent(asyncState, { - payload: insideProvider, - type: DevtoolsJournalEvent.insideProvider, - }); } function emitRunSync(asyncState: StateInterface, props) { @@ -279,7 +284,11 @@ function createDevtools(): DevtoolsInterface { payload: {props, type: "sync"}, type: DevtoolsJournalEvent.run }; + emitJournalEvent(asyncState, evt); + if (!connected) { + return; + } emitPartialSync(asyncState.uniqueId, { key: asyncState.key, eventId: journalEventsId, @@ -291,7 +300,8 @@ function createDevtools(): DevtoolsInterface { }); } - function emitRunConsumedFromCache(asyncState: StateInterface, payload, execArgs) { + function emitRunConsumedFromCache( + asyncState: StateInterface, payload, execArgs) { if (asyncState.config.hideFromDevtools) { return; } @@ -305,6 +315,9 @@ function createDevtools(): DevtoolsInterface { type: DevtoolsJournalEvent.run }; emitJournalEvent(asyncState, evt); + if (!connected) { + return; + } emitPartialSync(asyncState.uniqueId, { key: asyncState.key, eventId: journalEventsId, @@ -326,6 +339,9 @@ function createDevtools(): DevtoolsInterface { type: DevtoolsJournalEvent.run }; emitJournalEvent(asyncState, evt); + if (!connected) { + return; + } emitPartialSync(asyncState.uniqueId, { key: asyncState.key, eventId: journalEventsId, @@ -347,6 +363,9 @@ function createDevtools(): DevtoolsInterface { type: DevtoolsJournalEvent.run }; emitJournalEvent(asyncState, evt); + if (!connected) { + return; + } emitPartialSync(asyncState.uniqueId, { key: asyncState.key, eventId: journalEventsId, @@ -368,6 +387,9 @@ function createDevtools(): DevtoolsInterface { type: DevtoolsJournalEvent.run }; emitJournalEvent(asyncState, evt); + if (!connected) { + return; + } emitPartialSync(asyncState.uniqueId, { key: asyncState.key, eventId: journalEventsId, @@ -398,11 +420,20 @@ function createDevtools(): DevtoolsInterface { return; } retainStateInstance(asyncState); + let subscription = asyncState.subscriptions![subKey]; let evt = { - payload: subKey, - type: DevtoolsJournalEvent.subscription + type: DevtoolsJournalEvent.subscription, + payload: { + key: subscription.props.key, + origin: subscription.props.origin, + flags: subscription.props.flags, + devFlags: humanizeDevFlags(subscription.props.flags || 0), + } }; emitJournalEvent(asyncState, evt); + if (!connected) { + return; + } emitPartialSync(asyncState.uniqueId, { key: asyncState.key, eventId: journalEventsId, @@ -510,6 +541,32 @@ function createDevtools(): DevtoolsInterface { } } +function mapSubscriptionToDevtools(sub: StateSubscription) { + return { + key: sub.props.key, + flags: sub.props.flags, + origin: getSubscriptionOrigin(sub.props.origin), + devFlags: humanizeDevFlags(sub.props.flags || 0), + } +} + +function getSubscriptionOrigin(origin?: number) { + switch (origin) { + case 1: + return "useAsyncState"; + case 2: + return "useSource"; + case 3: + return "useProducer"; + case 4: + return "useSelector"; + case undefined: + return "undefined"; + default: + return "unknown"; + } +} + let DEVTOOLS = createDevtools(); export default DEVTOOLS; diff --git a/packages/react-async-states/src/index.ts b/packages/react-async-states/src/index.ts index 2809dccc..9b7e3ad7 100644 --- a/packages/react-async-states/src/index.ts +++ b/packages/react-async-states/src/index.ts @@ -2,26 +2,23 @@ export {useSelector} from "./react/useSelector"; export {useRun, useRunLane} from "./react/useRun"; -export {useAsyncState} from "./react/useAsyncState"; - -export {AsyncStateProvider} from "./react/AsyncStateProvider"; - -export {useSource, useSourceLane, useProducer} from "./react/useAsyncStateBase"; +export {AsyncStateProvider} from "./react/Provider"; +export { + useAsyncState, useSource, useSourceLane, useProducer +} from "./react/useAsyncState"; export { createSource, + Status, + RunEffect, ProducerType, - AsyncStateStatus, - ProducerRunEffects, AsyncStateManager, } from "./async-state"; -export {createLoaderProducer} from "./react/loader-producer" export { RenderStrategy, - SubscriptionMode, } from "./types.internal"; export {StateBoundary, useCurrentState} from "./react/StateBoundary"; @@ -47,7 +44,7 @@ export type { InitialAsyncState, AsyncStateSelector, InitialStatesObject, - HoistToProviderConfig, + hoistConfig, ExtendedInitialAsyncState, AsyncStateManagerInterface, diff --git a/packages/react-async-states/src/react/AsyncStateProvider.tsx b/packages/react-async-states/src/react/Provider.tsx similarity index 98% rename from packages/react-async-states/src/react/AsyncStateProvider.tsx rename to packages/react-async-states/src/react/Provider.tsx index 6fdbdc16..6b7725bb 100644 --- a/packages/react-async-states/src/react/AsyncStateProvider.tsx +++ b/packages/react-async-states/src/react/Provider.tsx @@ -85,7 +85,7 @@ export function AsyncStateProvider( function onInitialStatesChange(): { data: AsyncStateEntry[] } { const output = Object.create(null); - output.data = manager.setInitialStates(initialStates); + output.data = manager.setStates(initialStates); return output; } diff --git a/packages/react-async-states/src/react/StateBoundary.tsx b/packages/react-async-states/src/react/StateBoundary.tsx index a8c91e15..8c016082 100644 --- a/packages/react-async-states/src/react/StateBoundary.tsx +++ b/packages/react-async-states/src/react/StateBoundary.tsx @@ -1,11 +1,12 @@ import * as React from "react"; -import {AsyncStateStatus, State} from "../async-state"; +import {Status, State} from "../async-state"; import { MixedConfig, RenderStrategy, StateBoundaryProps, UseAsyncState, UseAsyncStateConfiguration, } from "../types.internal"; import {useAsyncState} from "./useAsyncState"; +import {emptyArray} from "./utils"; const StateBoundaryContext = React.createContext(null); @@ -67,7 +68,6 @@ export function FetchAsYouRenderBoundary(props: StateBoundaryProps) ); } -const emptyArray = []; function FetchThenRenderInitialBoundary({ dependencies = emptyArray, result, config }: {dependencies?: any[], result: UseAsyncState, config: MixedConfig}) { @@ -95,17 +95,17 @@ export function FetchThenRenderBoundary(props: StateBoundaryProps) { const result = useAsyncState(props.config, props.dependencies); switch (result.source?.getState().status) { - case AsyncStateStatus.pending: - case AsyncStateStatus.aborted: - case AsyncStateStatus.initial: { + case Status.pending: + case Status.aborted: + case Status.initial: { return ; } - case AsyncStateStatus.error: - case AsyncStateStatus.success: { + case Status.error: + case Status.success: { const children = inferBoundaryChildren(result, props); return ( diff --git a/packages/react-async-states/src/react/StateHook.ts b/packages/react-async-states/src/react/StateHook.ts new file mode 100644 index 00000000..4f0f6b3a --- /dev/null +++ b/packages/react-async-states/src/react/StateHook.ts @@ -0,0 +1,651 @@ +import * as React from "react"; +import { + BaseConfig, + BaseUseAsyncState, + CleanupFn, + MixedConfig, + PartialUseAsyncStateConfiguration, + StateContextValue, + SubscribeEventProps, + UseAsyncState, + UseAsyncStateEventFn, + UseAsyncStateEvents, + UseAsyncStateEventSubscribe +} from "../types.internal"; +import AsyncState, { + AbortFn, + Status, + Producer, + Source, + State, + StateInterface +} from "../async-state"; +import { + AUTO_RUN, + CHANGE_EVENTS, + CONFIG_FUNCTION, + CONFIG_OBJECT, + CONFIG_SOURCE, + CONFIG_STRING, + EQUALITY_CHECK, + FORK, + HOIST, + INSIDE_PROVIDER, + LANE, + NO_MODE, + SELECTOR, + SOURCE, + STANDALONE, + SUBSCRIBE_EVENTS, + WAIT +} from "./StateHookFlags"; +import {__DEV__, shallowClone} from "../shared"; +import {humanizeDevFlags} from "./utils"; +import { + readSource, + standaloneProducerEffectsCreator +} from "../async-state/AsyncState"; +import {isSource} from "../async-state/utils"; +import {nextKey} from "../async-state/key-gen"; +import {computeCallerName} from "./helpers/useCallerName"; + +export interface StateHook { + current: E, + flags: number, + name: string | undefined; + config: MixedConfig, + origin: number | undefined; + version: number | undefined, + base: BaseUseAsyncState, + context: StateContextValue | null, + subscribe: ( + setGuard: React.Dispatch>, + onChange: () => void, + ) => AbortFn, + + instance: StateInterface | null, + + update( + origin: number, + newConfig: MixedConfig, + contextValue: StateContextValue | null, + overrides?: PartialUseAsyncStateConfiguration, + level?: number + ), +} + +export class StateHookImpl implements StateHook { + current: E; + flags: number; + name: string | undefined; + config: MixedConfig; + origin: number | undefined; + version: number | undefined; + base: BaseUseAsyncState; + context: StateContextValue | null; + instance: StateInterface | null; + + subscribe: ( + setGuard: React.Dispatch>, + onChange: () => void, + ) => AbortFn + + constructor() { + this.flags = NO_MODE; + this.context = null; + } + + update( + origin: number, + newConfig: MixedConfig, + contextValue: StateContextValue | null, + overrides?: PartialUseAsyncStateConfiguration, + level?: number + ) { + let nextFlags = resolveFlags(newConfig, contextValue, overrides); + let instance = resolveInstance(nextFlags, newConfig, contextValue, this, overrides); + + if (!instance && !(nextFlags & WAIT)) { + throw new Error("Mode isn't wait and instance isn't defined! this is a bug"); + } + + if (instance && (nextFlags & CONFIG_OBJECT && (newConfig as BaseConfig).payload)) { + instance.mergePayload((newConfig as BaseConfig).payload); + } + if (instance && (nextFlags & INSIDE_PROVIDER) && contextValue?.getPayload()) { + instance.mergePayload(contextValue.getPayload()); + } + + this.origin = origin; + this.flags = nextFlags; + this.config = newConfig; + this.instance = instance; + this.context = contextValue; + this.base = makeBaseReturn(this); + this.name = calculateSubscriptionKey(this, level); + this.subscribe = createSubscribeAndWatchFunction(this); + } +} + +export function resolveFlags( + mixedConfig: MixedConfig, + contextValue: StateContextValue | null, + overrides?: PartialUseAsyncStateConfiguration, +): number { + + let flags = NO_MODE; + if (contextValue !== null) { + flags |= INSIDE_PROVIDER; + } + + switch (typeof mixedConfig) { + case "function": { + return flags | CONFIG_FUNCTION | STANDALONE | getConfigFlags(overrides); + } + + case "string": { + flags |= CONFIG_STRING | getConfigFlags(overrides); + if (!(flags & HOIST) && !(flags & INSIDE_PROVIDER)) { + return flags | STANDALONE; + } + if (!(flags & HOIST) && !contextValue!.get(mixedConfig)) { + return flags | WAIT; + } + return flags; + } + + case "object": { + // attempt source first + let baseConfig = mixedConfig as BaseConfig; + if (isSource(baseConfig)) { + return flags | CONFIG_SOURCE | SOURCE | getConfigFlags(overrides); + } else if (isSource(baseConfig.source)) { + return flags | CONFIG_OBJECT | SOURCE | getConfigFlags(baseConfig) | getConfigFlags(overrides); + } else { + flags |= CONFIG_OBJECT | getConfigFlags(baseConfig) | getConfigFlags(overrides); + if (!(flags & HOIST) && !(flags & INSIDE_PROVIDER) || !baseConfig.key) { + return flags | STANDALONE; + } + if (!(flags & HOIST) && baseConfig.key && !contextValue!.get(baseConfig.key)) { + return flags | WAIT; + } + return flags; + } + } + default: { + return flags | STANDALONE | getConfigFlags(overrides); + } + } +} + +function getKeyFlags( + config: PartialUseAsyncStateConfiguration, + key: string, +) { + switch (key) { + case "hoist": return config.hoist ? HOIST : NO_MODE; + case "fork": return config.fork ? FORK : NO_MODE; + case "lane": return config.lane ? LANE : NO_MODE; + case "selector": return typeof config.selector === "function" ? SELECTOR : NO_MODE; + case "areEqual": return typeof config.areEqual === "function" ? EQUALITY_CHECK : NO_MODE; + + case "events": { + let flags = NO_MODE; + if (config.events!.change) { + flags |= CHANGE_EVENTS; + } + if (config.events!.subscribe) { + flags |= SUBSCRIBE_EVENTS; + } + return flags; + } + + case "lazy": + case "condition": { + if (config.lazy === false && config.condition !== false) { + return AUTO_RUN; + } + return NO_MODE; + } + default: return NO_MODE; + } +} + +export function getConfigFlags( + config?: PartialUseAsyncStateConfiguration +): number { + if (!config) { + return NO_MODE; + } + return Object.keys(config) + .reduce((flags, key) => + (flags | getKeyFlags(config, key)), NO_MODE); +} + + +export function resolveInstance( + flags: number, + config: MixedConfig, + contextValue: StateContextValue | null, + previousHook: StateHook, + overrides?: PartialUseAsyncStateConfiguration +): StateInterface | null { + + if (flags & WAIT) { + return null; + } + + if (flags & SOURCE) { + return resolveSourceInstance(flags, config, overrides); + } + + if (flags & STANDALONE) { + return resolveStandaloneInstance(previousHook, flags, config); + } + + if (flags & INSIDE_PROVIDER) { + return resolveProviderInstance(flags, contextValue, config); + } + + return null; +} + + +function resolveSourceInstance( + flags: number, + config: MixedConfig, + overrides?: PartialUseAsyncStateConfiguration +) { + if (flags & CONFIG_SOURCE) { + let instance = readSource(config as Source); + if (flags & FORK) { + instance = instance.fork(); + } + if (flags & LANE) { // config is a source, so ofc doesn't contain lane prop + let laneKey = overrides?.lane; + instance = instance.getLane(laneKey); + } + return instance; + } + + let givenConfig = config as BaseConfig; + let instance = readSource(givenConfig.source!); + if (flags & FORK) { + instance = instance.fork(givenConfig.forkConfig); + } + if (flags & LANE) { + let laneKey = (config as BaseConfig).lane || overrides?.lane; + return instance.getLane(laneKey) + } + return instance; +} + +function resolveStandaloneInstance( + hook: StateHook, + flags: number, + config: MixedConfig +) { + + let canReuse = hook && !!hook.instance && !!(hook.flags & STANDALONE); + if (canReuse) { + patchInstance(hook.instance!, flags, config); + return hook.instance; + } + + let key = readKeyFromConfig(flags, config, null); + let producer = readProducerFromConfig(flags, config); + let producerConfig = flags & CONFIG_OBJECT ? (config as BaseConfig) : undefined; + + return new AsyncState(key, producer, producerConfig); +} + +function resolveProviderInstance( + flags: number, + contextValue: StateContextValue | null, + config: MixedConfig +) { + let key: string = flags & CONFIG_STRING + ? (config as string) : (config as BaseConfig).key!; + + if ( + flags & HOIST && + flags & CONFIG_OBJECT && + (config as BaseConfig).hoistConfig?.override) { + // do not check on existing because it is guaranteed to exist + // or else we would have a WAIT flag and quit earlier! + let key = readKeyFromConfig(flags, config, null); + let producer = readProducerFromConfig(flags, config); + let producerConfig = flags & CONFIG_OBJECT ? (config as BaseConfig) : undefined; + + return new AsyncState(key, producer, producerConfig); + } + + let instance = contextValue!.get(key); + if (instance) { + if (flags & FORK) { + instance = instance.fork((config as BaseConfig).forkConfig); + } + if (flags & LANE) { + return instance.getLane((config as BaseConfig).lane!) + } + return instance; + } else { + let key = readKeyFromConfig(flags, config, null); + let producer = readProducerFromConfig(flags, config); + let producerConfig = flags & CONFIG_OBJECT ? (config as BaseConfig) : undefined; + + return new AsyncState(key, producer, producerConfig); + } +} + +function patchInstance( + instance: StateInterface, + flags: number, + config: MixedConfig +) { + let key = readKeyFromConfig(flags, config, instance); + let producer = readProducerFromConfig(flags, config); + let producerConfig = flags & CONFIG_OBJECT ? (config as BaseConfig) : undefined; + + instance.key = key; + instance.replaceProducer(producer); + instance.patchConfig(producerConfig); +} + +function readKeyFromConfig( + flags: number, + config: MixedConfig, + prevInstance: StateInterface | null +): string { + if (flags & CONFIG_STRING) { + return config as string; + } + + if (flags & CONFIG_OBJECT && (config as BaseConfig).key) { + return (config as BaseConfig).key!; + } + + if (!prevInstance) { + return nextKey(); + } + + return prevInstance.key; +} + + +function readProducerFromConfig( + flags: number, + config: MixedConfig, +): Producer | undefined { + if (flags & CONFIG_FUNCTION) { + return config as Producer; + } + + if (flags & CONFIG_OBJECT) { + return (config as BaseConfig).producer; + } + + return undefined; +} + + +export function makeBaseReturn(hook: StateHook) { + if (!hook.instance) { + let {flags, config} = hook; + let key = flags & CONFIG_STRING ? config : (config as BaseConfig).key; + let output = Object.assign({key, flags}) as BaseUseAsyncState; + if (__DEV__) { + output.devFlags = humanizeDevFlags(hook.flags); + } + return output; + } + + let {instance} = hook; + const effectsCreator = hook.context?.createEffects ?? standaloneProducerEffectsCreator; + + let output = Object.assign({}, + instance._source, + { + flags: hook.flags, + source: instance._source, + run: instance.run.bind(instance, effectsCreator), + runp: instance.runp.bind(instance, effectsCreator), + runc: instance.runc.bind(instance, effectsCreator) + } + ) as BaseUseAsyncState; + + if (__DEV__) { + output.devFlags = humanizeDevFlags(hook.flags); + } + return output; +} + + +function calculateSubscriptionKey( + hook: StateHook, level = 9): string | undefined { + if (hook.flags & CONFIG_OBJECT && (hook.config as BaseConfig).subscriptionKey) { + return (hook.config as BaseConfig).subscriptionKey; + } + if (hook.flags & WAIT) { + return; + } + if (__DEV__) { + let callerName = computeCallerName(level); + let index = ++((hook.instance! as AsyncState).subsIndex); + return `${callerName}-${index}`; + } +} + + +export function calculateStateValue( + hook: StateHook, +): Readonly> { + let instance = hook.instance; + + const newState = shallowClone(hook.base); + const newValue = readStateFromInstance(instance, hook.flags, hook.config); + if (instance) { + newState.read = createReadInConcurrentMode.bind(null, instance, newValue); + newState.version = instance?.version; + } + newState.state = newValue; + newState.lastSuccess = instance?.lastSuccess; + return newState; +} + +function createReadInConcurrentMode( + instance: StateInterface, + stateValue: E +) { + if ( + Status.pending === instance.state.status && + instance.suspender + ) { + throw instance.suspender; + } + return stateValue; +} + +function createSubscribeAndWatchFunction( + hook: StateHook, +): ((...args) => AbortFn) { + return function subscribeAndWatch( + setGuard: React.Dispatch>, + onChange: () => void, + ) { + let {flags, instance, config} = hook; + + if (flags & WAIT) { + let key: string = flags & CONFIG_STRING + ? (config as string) : (config as BaseConfig).key!; + + return hook.context!.watch(key, (maybeInstance) => { + if (maybeInstance !== instance) { + setGuard(old => old + 1); + } + }); + } + + let contextValue = hook.context; + + // if we are hoisting or forking, spread the instance for watchers + if (flags & INSIDE_PROVIDER && flags & (HOIST | FORK)) { + const hoistedInstance = contextValue!.hoist( + instance!.key, + instance!, + (config as BaseConfig).hoistConfig + ); + if (hoistedInstance !== instance) { + setGuard(old => old + 1); + return; + } + } + + let didClean = false; + let cleanups: AbortFn[] = [() => didClean = true]; + + function watch(mayBeNewAsyncState) { + if (didClean) { + return; + } + if (mayBeNewAsyncState !== instance) { + setGuard(old => old + 1); + } + } + + if ( + flags & INSIDE_PROVIDER && + !(flags & SOURCE) && + !(flags & STANDALONE) + ) { + cleanups.push(contextValue!.watch(instance!.key, watch)); + } + + // if inside provider and not source request context disposal of instance + if ( + flags & INSIDE_PROVIDER && + !(flags & SOURCE) && + (flags & (HOIST | FORK | STANDALONE)) + ) { + cleanups.push(() => contextValue!.dispose(instance!)); + } + + function onStateChange() { + let newSelectedState = readStateFromInstance(instance, flags, config); + + if (flags & EQUALITY_CHECK) { + let areEqual = (config as PartialUseAsyncStateConfiguration) + .areEqual!(newSelectedState, hook.current); + + if (!areEqual) { + onChange(); + } + } else { + onChange(); + } + + if (flags & CHANGE_EVENTS) { + invokeChangeEvents(instance!.state, (config as BaseConfig).events); + } + } + + // subscription + + cleanups.push(instance!.subscribe({ + key: hook.name, + flags: hook.flags, + cb: onStateChange, + origin: hook.origin, + })); + if (instance!.version !== hook.version) { + onChange(); + } + + if (flags & SUBSCRIBE_EVENTS) { + const effectsCreator = flags & INSIDE_PROVIDER ? + contextValue!.createEffects : standaloneProducerEffectsCreator; + + let unsubscribeFns = invokeSubscribeEvents( + (config as BaseConfig).events!.subscribe!, + instance!.run.bind(instance!, effectsCreator), + instance!, + ); + + if (unsubscribeFns) { + cleanups = cleanups.concat(unsubscribeFns); + } + } + + return function cleanup() { + cleanups.forEach(cb => { + if (cb) { + cb(); + } + }); + } + } +} + +function invokeSubscribeEvents( + events: UseAsyncStateEventSubscribe | undefined, + run: (...args: any[]) => AbortFn, + instance?: StateInterface, +): CleanupFn[] | null { + if (!events || !instance) { + return null; + } + + let eventProps: SubscribeEventProps = { + run, + getState: () => instance.state, + invalidateCache: instance.invalidateCache, + }; + + let handlers: ((props: SubscribeEventProps) => CleanupFn)[] + = Array.isArray(events) ? events : [events]; + + return handlers.map(handler => handler(eventProps)); +} + +function invokeChangeEvents( + nextState: State, + events: UseAsyncStateEvents | undefined +) { + if (!events?.change) { + return; + } + + const changeHandlers: UseAsyncStateEventFn[] + = Array.isArray(events.change) ? events.change : [events.change]; + + const eventProps = {state: nextState}; + + changeHandlers.forEach(event => { + if (typeof event === "object") { + const {handler, status} = event; + if (!status || nextState.status === status) { + handler(eventProps); + } + } else { + event(eventProps); + } + }); +} + +// come here only in standalone mode + + +function readStateFromInstance>( + asyncState: StateInterface | null, + flags: number, + config: MixedConfig +): E { + if (!asyncState) { + return undefined as E; + } + const selector = flags & SELECTOR + ? (config as PartialUseAsyncStateConfiguration).selector! + : + ((obj): K => obj); + return selector(asyncState.state, asyncState.lastSuccess, asyncState.cache); +} diff --git a/packages/react-async-states/src/react/StateHookFlags.ts b/packages/react-async-states/src/react/StateHookFlags.ts new file mode 100644 index 00000000..1f931985 --- /dev/null +++ b/packages/react-async-states/src/react/StateHookFlags.ts @@ -0,0 +1,21 @@ +export const NO_MODE /* */ = 0b00000_00000_00000_00000; + +export const CONFIG_STRING /* */ = 0b00000_00000_00000_00001; +export const CONFIG_FUNCTION /* */ = 0b00000_00000_00000_00010; +export const CONFIG_SOURCE /* */ = 0b00000_00000_00000_00100; +export const CONFIG_OBJECT /* */ = 0b00000_00000_00000_01000; + +export const STANDALONE /* */ = 0b00000_00000_00001_00000; +export const SOURCE /* */ = 0b00000_00000_00010_00000; +export const FORK /* */ = 0b00000_00000_00100_00000; +export const HOIST /* */ = 0b00000_00000_01000_00000; + +export const INSIDE_PROVIDER /* */ = 0b00000_00001_00000_00000; +export const AUTO_RUN /* */ = 0b00000_00010_00000_00000; +export const WAIT /* */ = 0b00000_00100_00000_00000; +export const LANE /* */ = 0b00000_01000_00000_00000; + +export const CHANGE_EVENTS /* */ = 0b00001_00000_00000_00000; +export const SUBSCRIBE_EVENTS/* */ = 0b00010_00000_00000_00000; +export const SELECTOR /* */ = 0b00100_00000_00000_00000; +export const EQUALITY_CHECK /* */ = 0b01000_00000_00000_00000; diff --git a/packages/react-async-states/src/react/helpers/configuration-warn.ts b/packages/react-async-states/src/react/helpers/configuration-warn.ts deleted file mode 100644 index 6033f089..00000000 --- a/packages/react-async-states/src/react/helpers/configuration-warn.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { - SubscriptionMode, - UseAsyncStateConfiguration -} from "../../types.internal"; -import {computeCallerName} from "./useCallerName"; -import {__DEV__} from "../../shared"; - -let creationProperties, hoistProperties, forkProperties, irrelevantPropertiesByMode; - -if (__DEV__) { - creationProperties = [ - "producer", - "runEffect", - "cacheConfig", - "initialValue", - "skipPendingDelayMs", - "runEffectDurationMs", - "resetStateOnDispose", - ]; - hoistProperties = [ - "hoistToProvider", - "hoistToProviderConfig", - ]; - forkProperties = [ - "fork", - "forkConfig", - ]; - irrelevantPropertiesByMode = { - LISTEN: [...creationProperties, ...hoistProperties, ...forkProperties], - HOIST: [...forkProperties], - ALONE: [...hoistProperties, ...forkProperties], - WAIT: [...creationProperties, ...hoistProperties, ...forkProperties], - FORK: [...creationProperties, ...hoistProperties], - NA: [], - SRC: [...creationProperties, ...hoistProperties, ...forkProperties], - SRC_FORK: [...creationProperties, ...hoistProperties], - OUTSIDE: [...hoistProperties, ...forkProperties], - }; -} - - - -export function warnInDevAboutIrrelevantUseAsyncStateConfiguration( - mode: SubscriptionMode, - userConfig: UseAsyncStateConfiguration -) { - if (__DEV__) { - const irrelevantProperties = irrelevantPropertiesByMode[mode]; - if (!irrelevantProperties.length) { - return; - } - - const usedIrrelevantProperties = irrelevantProperties.filter( - prop => userConfig[prop] !== undefined - ) - - if (usedIrrelevantProperties.length) { - const caller = computeCallerName(9); - console.error(`[Incompatible configuration] - Subscription to '${userConfig.key}' ` + - `${userConfig.subscriptionKey ? '(with subscriptionKey=' + - userConfig.subscriptionKey + ') ' : ''}from '${caller}' is using incompatible ` + - `['${usedIrrelevantProperties.join(", ")}'] properties with its mode '${mode}'`); - } - } -} diff --git a/packages/react-async-states/src/react/helpers/supports-concurrent-mode.ts b/packages/react-async-states/src/react/helpers/supports-concurrent-mode.ts deleted file mode 100644 index 48c6d990..00000000 --- a/packages/react-async-states/src/react/helpers/supports-concurrent-mode.ts +++ /dev/null @@ -1,6 +0,0 @@ -import * as React from "react"; - -export function supportsConcurrentMode(): boolean { - // @ts-ignore - return typeof React.useSyncExternalStore === "function"; -} diff --git a/packages/react-async-states/src/react/helpers/useCallerName.ts b/packages/react-async-states/src/react/helpers/useCallerName.ts index 09ee66a1..421f31ce 100644 --- a/packages/react-async-states/src/react/helpers/useCallerName.ts +++ b/packages/react-async-states/src/react/helpers/useCallerName.ts @@ -1,76 +1,3 @@ -import * as React from "react"; -import AsyncState, {StateInterface} from "../../async-state"; -import {__DEV__} from "../../shared"; - -const emptyArray = []; - -function newObj() { - return Object.create(Object.prototype); -} - -type WarnInDevSelf = { - subId?: number, - result?: string, - subKey?: string, - instance?: StateInterface, -} - -export default function useInDevSubscriptionKey( - subKey: string | undefined, - asyncState: StateInterface, - from: string, // 1: useAsyncState, 2: useSourceLane, 3: useProducer, 4: useSelector -): string | undefined { - if (__DEV__) { - let callerName = useCallerName(5); - let self = React.useRef>(); - - if (!self.current) { - self.current = {}; - } - - const didKeyChange = self.current.subKey !== subKey; - const didInstanceChange = self.current.instance !== asyncState; - if (didKeyChange || didInstanceChange) { - if (asyncState && !subKey) { - let nextId = self.current.subId; - - if (didInstanceChange) { - nextId = ++((asyncState as AsyncState).subsIndex); - } - - self.current = { - subId: nextId, - instance: asyncState, - result: `${callerName}-$${from}-$${nextId}`, - }; - } else { - self.current = { - result: subKey, - }; - } - } - - return self.current.result; - } -} - -export function useCallerName(level = 4): string | undefined { - if (!__DEV__) { - return; - } - - // using a lightweight mutable memo there that s assigned only one time - const self = React - .useMemo<{ callerName: string | undefined }>(newObj, emptyArray); - - // assign only if not already assigned, even undefined counts! - if (!Object.prototype.hasOwnProperty.call(self, "callerName")) { - self.callerName = computeCallerName(level); - } - - return self.callerName; -} - export function computeCallerName(level = 3): undefined | string { const stack = new Error().stack?.toString(); if (!stack) { diff --git a/packages/react-async-states/src/react/loader-producer.ts b/packages/react-async-states/src/react/loader-producer.ts deleted file mode 100644 index ca101263..00000000 --- a/packages/react-async-states/src/react/loader-producer.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { - createSource, - ProducerConfig, - ProducerProps, Source, State -} from "../async-state"; -import { - makeUseAsyncStateReturnValue, -} from "./useAsyncStateBase"; -import {readInstanceFromSource} from "../async-state/AsyncState"; -import {SubscriptionMode, UseAsyncState} from "../types.internal"; - -export function createLoaderProducer( - producer: Loader, loaderKey?: string, config?: ProducerConfig): LoaderProducer { - - const source = createSource(`loader-${loaderKey}`, undefined, config) as Source; - let instance = readInstanceFromSource(source); - - function wrapperProducer(props: ProducerProps) { - - const loaderProps: LoaderProps = props.args[0]; - const nextProps: LoaderProducerProps = Object.assign({}, props, loaderProps); - - return producer(nextProps); - } - - return async function loader(props: LoaderProps) { - source.replaceProducer(wrapperProducer); - const result = await source.runp(props); - let mode = SubscriptionMode.SRC; - - return makeUseAsyncStateReturnValue(instance, result, source.key, null, mode); - } -} - -type LoaderProps = { - signal: AbortSignal, - params: Record, -} -type Loader = { - (props: LoaderProps): T -} - -type LoaderProducer = (props: LoaderProps) => Promise>>> - -interface LoaderProducerProps extends ProducerProps { - signal: AbortSignal, - params: Record, -} diff --git a/packages/react-async-states/src/react/useAsyncState.ts b/packages/react-async-states/src/react/useAsyncState.ts index 40a5ea5f..24ac636e 100644 --- a/packages/react-async-states/src/react/useAsyncState.ts +++ b/packages/react-async-states/src/react/useAsyncState.ts @@ -1,34 +1,236 @@ -import {useAsyncStateBase} from "./useAsyncStateBase"; +import * as React from "react"; +import {Producer, Source, State} from "../async-state"; import { + BaseConfig, + CleanupFn, ConfigWithKeyWithoutSelector, ConfigWithKeyWithSelector, ConfigWithProducerWithoutSelector, ConfigWithProducerWithSelector, ConfigWithSourceWithoutSelector, ConfigWithSourceWithSelector, + MixedConfig, + PartialUseAsyncStateConfiguration, + StateContextValue, UseAsyncState, - MixedConfig } from "../types.internal"; -import {Source, Producer, State} from "../async-state"; +import {AsyncStateContext} from "./context"; +import {AUTO_RUN} from "./StateHookFlags"; +import {__DEV__} from "../shared"; +import {emptyArray, noop} from "./utils"; +import {calculateStateValue, StateHook, StateHookImpl} from "./StateHook"; -// the real implementation is in useAsyncStateBase.tsx +export function useCurrentHook(): StateHook { + return React.useMemo>(createStateHook, emptyArray); +} + +export function createStateHook(): StateHook { + return new StateHookImpl(); +} + +export const useAsyncStateBase = function useAsyncStateImpl>( + mixedConfig: MixedConfig, + deps: any[] = emptyArray, + overrides?: PartialUseAsyncStateConfiguration, +): UseAsyncState { + + const hook: StateHook = useCurrentHook(); + const [guard, setGuard] = React.useState(0); + const contextValue = React.useContext(AsyncStateContext); + + React.useMemo(() => hook.update(1, mixedConfig, contextValue, overrides, 8), + [contextValue, guard, ...deps]); + + const [selectedValue, setSelectedValue] = React + .useState>>(calculateStateValue.bind(null, hook)); + + if ( + selectedValue.version !== hook.instance?.version || + selectedValue.source !== hook.instance?._source + ) { + updateSelectedValue(); + } + + if (hook.current !== selectedValue.state) { + hook.current = selectedValue.state; + } + if (hook.version !== selectedValue.version) { + hook.version = selectedValue.version; + } + + React.useEffect( + hook.subscribe.bind(null, setGuard, updateSelectedValue), + [contextValue, hook.flags, hook.instance] + ); + + React.useEffect(autoRunAsyncState, deps); + + return selectedValue; + + + function updateSelectedValue() { + setSelectedValue(calculateStateValue(hook)); + hook.version = hook.instance?.version; + } + + function autoRunAsyncState(): CleanupFn { + // auto run only if condition is met, and it is not lazy + if (!(hook.flags & AUTO_RUN)) { + return; + } + // if dependencies change, if we run, the cleanup shall abort + let config = (hook.config as BaseConfig); + + if (config.autoRunArgs && Array.isArray(config.autoRunArgs)) { + return hook.base.run(...config.autoRunArgs); + } + return hook.base.run(); + } +} + + +// this is a mini version of useAsyncState +// this hook uses fewer hooks and has fewer capabilities that useAsyncState +// its usage should be when you want to have control over a source +// and you do not intend to have it auto run, dependencies, manage payload +// etc etc. +// this is like useSyncExternalStore, but returns an object with several +// functions that allows controlling the external source. So, may be better ? +// this hook can use directly useSES on the asyncState instance +// but this will require additional memoization to add the other properties +// that UseAsyncState has (abort, mergePayload, invalidateCache, run, replaceState ...) +export function useSource( + source: Source +): UseAsyncState> { + return useSourceLane(source, undefined, __DEV__ ? 9 : undefined); +} + +export function useSourceLane( + source: Source, + lane?: string, + level: number = 8, // used in dev mode only +): UseAsyncState> { + const hook: StateHook> = useCurrentHook(); + const contextValue = React.useContext(AsyncStateContext); -// default + React.useMemo(() => hook.update(2, source, contextValue, {lane}, level), + [contextValue, lane]); + + const [selectedValue, setSelectedValue] = React + .useState>>>(calculateStateValue.bind(null, hook)); + + if ( + selectedValue.version !== hook.instance?.version || + selectedValue.source !== hook.instance?._source + ) { + updateSelectedValue(); + } + + if (hook.current !== selectedValue.state) { + hook.current = selectedValue.state; + } + if (hook.version !== selectedValue.version) { + hook.version = selectedValue.version; + } + + React.useEffect( + hook.subscribe.bind(null, noop, updateSelectedValue), + [contextValue, hook.flags, hook.instance] + ); + + return selectedValue; + + + function updateSelectedValue() { + setSelectedValue(calculateStateValue(hook)); + hook.version = hook.instance?.version; + } + +} + +// this is a mini version of useAsyncState +// this hook uses fewer hooks and has fewer capabilities that useAsyncState +// its usage should be when you want to have control over a producer (may be inline) +// and you do not intend to have it auto run, dependencies, manage payload +// etc etc. +// this is like useSyncExternalStore, but returns an object with several +// functions that allows controlling the external source. So, may be better ? +// this hook can use directly useSES on the asyncState instance +// but this will require additional memoization to add the other properties +// that UseAsyncState has (abort, mergePayload, invalidateCache, run, replaceState ...) +export function useProducer( + producer: Producer, +): UseAsyncState> { + const hook: StateHook> = useCurrentHook(); + const contextValue = React.useContext(AsyncStateContext); + + React.useMemo(() => hook.update(3, producer, contextValue, undefined, 8), [contextValue]); + + const [selectedValue, setSelectedValue] = React + .useState>>>(calculateStateValue.bind(null, hook)); + + if ( + selectedValue.version !== hook.instance?.version || + selectedValue.source !== hook.instance?._source + ) { + updateSelectedValue(); + } + + if (hook.current !== selectedValue.state) { + hook.current = selectedValue.state; + } + if (hook.version !== selectedValue.version) { + hook.version = selectedValue.version; + } + + if (hook.instance!.originalProducer !== producer) { + hook.instance!.replaceProducer(producer); + } + + React.useEffect( + hook.subscribe.bind(null, noop, updateSelectedValue), + [contextValue, hook.flags, hook.instance] + ); + + return selectedValue; + + + function updateSelectedValue() { + setSelectedValue(calculateStateValue(hook)); + hook.version = hook.instance?.version; + } +} function useAsyncStateExport(key: string, deps?: any[]): UseAsyncState function useAsyncStateExport(source: Source, deps?: any[]) function useAsyncStateExport(producer: Producer, deps?: any[]) -function useAsyncStateExport(configWithKeyWithSelector: ConfigWithKeyWithSelector, deps?: any[]) -function useAsyncStateExport(configWithKeyWithoutSelector: ConfigWithKeyWithoutSelector, deps?: any[]) -function useAsyncStateExport(configWithSourceWithSelector: ConfigWithSourceWithSelector, deps?: any[]) -function useAsyncStateExport(configWithSourceWithoutSelector: ConfigWithSourceWithoutSelector, deps?: any[]) -function useAsyncStateExport(configWithProducerWithSelector: ConfigWithProducerWithSelector, deps?: any[]) -function useAsyncStateExport(configWithProducerWithoutSelector: ConfigWithProducerWithoutSelector, deps?: any[]): UseAsyncState -function useAsyncStateExport(mixedConfig: MixedConfig, deps?: any[]): UseAsyncState -function useAsyncStateExport>(mixedConfig: MixedConfig, deps?: any[]): UseAsyncState -{ +function useAsyncStateExport( + configWithKeyWithSelector: ConfigWithKeyWithSelector, deps?: any[]) +function useAsyncStateExport( + configWithKeyWithoutSelector: ConfigWithKeyWithoutSelector, deps?: any[]) +function useAsyncStateExport( + configWithSourceWithSelector: ConfigWithSourceWithSelector, + deps?: any[] +) +function useAsyncStateExport( + configWithSourceWithoutSelector: ConfigWithSourceWithoutSelector, + deps?: any[] +) +function useAsyncStateExport( + configWithProducerWithSelector: ConfigWithProducerWithSelector, + deps?: any[] +) +function useAsyncStateExport( + configWithProducerWithoutSelector: ConfigWithProducerWithoutSelector, + deps?: any[] +): UseAsyncState +function useAsyncStateExport( + mixedConfig: MixedConfig, deps?: any[]): UseAsyncState +function useAsyncStateExport>( + mixedConfig: MixedConfig, deps?: any[]): UseAsyncState { return useAsyncStateBase(mixedConfig, deps); } + // auto runs const autoConfigOverrides = Object.freeze({lazy: false}); @@ -86,7 +288,7 @@ function useForkAutoAsyncState>( } // hoist -const hoistConfigOverrides = Object.freeze({hoistToProvider: true}); +const hoistConfigOverrides = Object.freeze({hoist: true}); function useHoistAsyncState>( subscriptionConfig: MixedConfig, @@ -101,7 +303,7 @@ function useHoistAsyncState>( // hoistAuto const hoistAutoConfigOverrides = Object.freeze({ - hoistToProvider: true, + hoist: true, lazy: false }); diff --git a/packages/react-async-states/src/react/useAsyncStateBase.ts b/packages/react-async-states/src/react/useAsyncStateBase.ts deleted file mode 100644 index e8e968fd..00000000 --- a/packages/react-async-states/src/react/useAsyncStateBase.ts +++ /dev/null @@ -1,990 +0,0 @@ -import * as React from "react"; -import {__DEV__, shallowClone, shallowEqual} from "../shared"; -import {AsyncStateContext} from "./context"; -import { - BaseUseAsyncState, - CleanupFn, - MixedConfig, - PartialUseAsyncStateConfiguration, - StateContextValue, - SubscribeEventProps, - SubscriptionInfo, - SubscriptionMode, - UseAsyncState, - UseAsyncStateConfiguration, - UseAsyncStateContextType, - UseAsyncStateEventFn, - UseAsyncStateEvents, - UseAsyncStateEventSubscribe, - UseAsyncStateRef, - useSelector -} from "../types.internal"; -import AsyncState, { - AbortFn, - AsyncStateStatus, - Producer, - Source, - State, - StateInterface -} from "../async-state"; -import {nextKey} from "../async-state/key-gen"; -import { - warnInDevAboutIrrelevantUseAsyncStateConfiguration -} from "./helpers/configuration-warn"; -import {supportsConcurrentMode} from "./helpers/supports-concurrent-mode"; -import {isAsyncStateSource} from "../async-state/utils"; -import { - readInstanceFromSource, - standaloneProducerEffectsCreator -} from "../async-state/AsyncState"; -import useInDevSubscriptionKey from "./helpers/useCallerName"; - -const defaultDependencies: any[] = []; -export const useAsyncStateBase = function useAsyncStateImpl>( - subscriptionConfig: MixedConfig, - deps: any[] = defaultDependencies, - configOverrides?: PartialUseAsyncStateConfiguration, -): UseAsyncState { - - // When inside provider, the subscribed instance might change - // this gard serves to trigger the memo recalculation - const [guard, setGuard] = React.useState(0); - const contextValue = React.useContext(AsyncStateContext); - // this is similar to a ref, it is used a mutable object between renders - // Besides a ref (that may get reset according to the rumors), this won't - // get reset . And can keep track of the old configuration - // and pass it to the parseConfiguration function. - // We only mutate this during render, and we only assign a value to it if different - const selfMemo = React - .useMemo>(createEmptyObject, []); - - const subscriptionInfo = React - .useMemo>(parseConfiguration, [contextValue, guard, ...deps]); - - const {mode, asyncState, configuration} = subscriptionInfo; - const run = subscriptionInfo.baseReturn.run; - const {selector, areEqual, events} = configuration; - - let {subscriptionKey} = configuration; - if (__DEV__) { - subscriptionKey = useInDevSubscriptionKey(subscriptionKey, asyncState, "1"); - } - - - const [selectedValue, setSelectedValue] = React - .useState>>(calculateStateValue); - - // this reference inequality means that memo has been just recalculated - if (selfMemo.subscriptionInfo !== subscriptionInfo) { - selfMemo.subscriptionInfo = subscriptionInfo; - } - - if ( - selectedValue.version !== asyncState?.version || - selectedValue.source !== subscriptionInfo.asyncState?._source - ) { - updateSelectedValue(); - } - - if (selfMemo.latestData !== selectedValue.state) { - selfMemo.latestData = selectedValue.state; - } - if (selfMemo.latestVersion !== selectedValue.version) { - selfMemo.latestVersion = selectedValue.version; - } - // if inside provider: watch over the async state - // check if the effect should do a no-op early - // this hook is safe to be inside this precise condition, which, if changed - // react during reconciliation would throw the old tree to GC. - if (contextValue !== null) { - React.useEffect(subscribeToAsyncState, - [contextValue, subscriptionKey, areEqual, selector, asyncState, events]); - - React.useEffect(watchAsyncState, [contextValue, mode, asyncState, configuration]); - } else { - - React.useEffect(subscribeToAsyncState, - [contextValue, subscriptionKey, areEqual, selector, asyncState, events]); - } - - React.useEffect(autoRunAsyncState, deps); - - return selectedValue; - - function calculateStateValue(): Readonly> { - const newValue = (asyncState ? readStateFromAsyncState(asyncState, selector) : undefined) as E; - - const newState = shallowClone(subscriptionInfo.baseReturn); - newState.read = createReadInConcurrentMode(asyncState, newValue); - newState.state = newValue; - newState.version = asyncState?.version; - newState.lastSuccess = asyncState?.lastSuccess; - return newState; - } - - function updateSelectedValue() { - setSelectedValue(calculateStateValue()); - selfMemo.latestVersion = asyncState?.version; - } - - function parseConfiguration() { - return parseUseAsyncStateConfiguration( - subscriptionConfig, - contextValue, - guard, - selfMemo, - deps, - configOverrides - ); - } - - function autoRunAsyncState(): CleanupFn { - // auto run only if condition is met, and it is not lazy - const shouldAutoRun = configuration.condition && !configuration.lazy; - if (!shouldAutoRun) { - return; - } - // if dependencies change, if we run, the cleanup shall abort - if (configuration.autoRunArgs && Array.isArray(configuration.autoRunArgs)) { - return run(...configuration.autoRunArgs); - } - return run(); - } - - function subscribeToAsyncState() { - function onStateChange() { - const newState = asyncState.state; - const newSelectedState = readStateFromAsyncState(asyncState, selector); - - if (!areEqual(newSelectedState, selfMemo.latestData)) { - updateSelectedValue(); - } - invokeChangeEvents(newState, events); - } - - return newSubscribeToAsyncState( - mode, - run, - () => selfMemo.latestVersion, - asyncState, - subscriptionKey, - events, - onStateChange, - updateSelectedValue, - ); - } - - function watchAsyncState() { - return watchOverAsyncState( - asyncState, - contextValue!, - mode, - configuration, - setGuard, - subscriptionInfo.dispose - ); - } -} - -// this is a mini version of useAsyncState -// this hook uses fewer hooks and has fewer capabilities that useAsyncState -// its usage should be when you want to have control over a source -// and you do not intend to have it auto run, dependencies, manage payload -// etc etc. -// this is like useSyncExternalStore, but returns an object with several -// functions that allows controlling the external source. So, may be better ? -// this hook can use directly useSES on the asyncState instance -// but this will require additional memoization to add the other properties -// that UseAsyncState has (abort, mergePayload, invalidateCache, run, replaceState ...) -export function useSource( - source: Source -): UseAsyncState> { - return useSourceLane(source); -} - -export function useSourceLane( - source: Source, - lane?: string, -): UseAsyncState> { - let subscriptionKey; - const contextValue = React.useContext(AsyncStateContext); - const asyncState = readInstanceFromSource(source).getLane(lane); - const latestVersion = React.useRef(asyncState.version); - - // declare a state snapshot initialized by the initial selected value - // useState - const [selectedValue, setSelectedValue] = React - .useState>>>(calculateSelectedValue); - - if ( - selectedValue.version !== asyncState.version || - selectedValue.source !== asyncState._source - ) { - updateSelectedValue(); - } - - if (latestVersion.current !== selectedValue.version) { - latestVersion.current = selectedValue.version; - } - - if (__DEV__) { - subscriptionKey = useInDevSubscriptionKey(subscriptionKey, asyncState, "2"); - } - - // subscribe to async state - React.useEffect(subscribeToAsyncState, [contextValue, asyncState]); - - return selectedValue; - - function calculateSelectedValue(): Readonly>> { - return makeUseAsyncStateReturnValue( - asyncState, - asyncState.state, - source.key, - contextValue, - SubscriptionMode.SRC - ); - } - - function updateSelectedValue() { - setSelectedValue(calculateSelectedValue()); - } - - function subscribeToAsyncState() { - return newSubscribeToAsyncState( - SubscriptionMode.SRC, - asyncState.run.bind( - asyncState, - contextValue?.producerEffectsCreator ?? standaloneProducerEffectsCreator - ), - () => latestVersion.current, - asyncState, - subscriptionKey, - undefined, - updateSelectedValue, - updateSelectedValue, - ); - } -} - -// this is a mini version of useAsyncState -// this hook uses fewer hooks and has fewer capabilities that useAsyncState -// its usage should be when you want to have control over a producer (may be inline) -// and you do not intend to have it auto run, dependencies, manage payload -// etc etc. -// this is like useSyncExternalStore, but returns an object with several -// functions that allows controlling the external source. So, may be better ? -// this hook can use directly useSES on the asyncState instance -// but this will require additional memoization to add the other properties -// that UseAsyncState has (abort, mergePayload, invalidateCache, run, replaceState ...) -export function useProducer( - producer: Producer, -): UseAsyncState> { - let subscriptionKey: string | undefined = undefined; - const contextValue = React.useContext(AsyncStateContext); - const [asyncState] = React.useState>(createInstance); - const latestVersion = React.useRef(asyncState.version); - - // declare a state snapshot initialized by the initial selected value - // useState - const [selectedValue, setSelectedValue] = React - .useState>>>(calculateSelectedValue); - - if (latestVersion.current !== selectedValue.version) { - latestVersion.current = selectedValue.version; - } - - if (selectedValue.version !== asyncState.version) { - updateSelectedValue(); - } - - if (asyncState.originalProducer !== producer) { - asyncState.replaceProducer(producer); - } - - if (__DEV__) { - subscriptionKey = useInDevSubscriptionKey(subscriptionKey, asyncState, "3"); - } - - // subscribe to async state - React.useEffect(subscribeToAsyncState, [contextValue, asyncState]); - - return selectedValue; - - function createInstance() { - return new AsyncState(nextKey(), producer); - } - - function calculateSelectedValue(): Readonly>> { - return makeUseAsyncStateReturnValue( - asyncState, - asyncState.state, - asyncState.key, - contextValue, - SubscriptionMode.ALONE - ); - } - - function updateSelectedValue() { - setSelectedValue(calculateSelectedValue()); - } - - function subscribeToAsyncState() { - return newSubscribeToAsyncState( - SubscriptionMode.ALONE, - asyncState.run.bind( - asyncState, - contextValue?.producerEffectsCreator ?? standaloneProducerEffectsCreator - ), - () => latestVersion.current, - asyncState, - subscriptionKey, - undefined, - updateSelectedValue, - updateSelectedValue, - ); - } -} - -//region configuration parsing -const sourceConfigurationSecretSymbol = Symbol(); - -const defaultUseASConfig = Object.freeze({ - lazy: true, - condition: true, - - areEqual: shallowEqual, - selector: oneObjectIdentity, -}); - -function oneObjectIdentity(obj: T): T { - return obj; -} - - -// userConfig is the config the developer wrote -function readUserConfiguration( - // the configuration that the developer emitted, can be of many forms - userConfig: MixedConfig, - // overrides that the library may use to control something - overrides?: PartialUseAsyncStateConfiguration -): UseAsyncStateConfiguration { - // this is direct anonymous producer configuration - if (typeof userConfig === "function") { - return Object.assign( - {}, - defaultUseASConfig, - overrides, - {producer: userConfig} - ); - } - // subscription to a state inside provider by key (or wait) - // or a standalone outside provider with an undefined producer - if (typeof userConfig === "string") { - return Object.assign( - {}, - defaultUseASConfig, - overrides, - {key: userConfig} - ); - } - // subscription via source directly as configuration - if (isAsyncStateSource(userConfig)) { - return Object.assign( - {}, - defaultUseASConfig, - overrides, - {source: userConfig, [sourceConfigurationSecretSymbol]: true} - ); - } - // subscription via source using object configuration - if ( - isAsyncStateSource((userConfig as UseAsyncStateConfiguration)?.source) - ) { - return Object.assign( - {}, - defaultUseASConfig, - userConfig, - overrides, - { - [sourceConfigurationSecretSymbol]: true - } - ); - } - return Object.assign( - {}, - defaultUseASConfig, - overrides, - userConfig - ); -} - -function assignAutomaticKeyIfNotProvided(newConfig, newMode) { - if (newConfig.key !== undefined) { - return; - } - if ( - newMode === SubscriptionMode.SRC || - newMode === SubscriptionMode.SRC_FORK - ) { - newConfig.key = newConfig.source!.key; - } else { - newConfig.key = nextKey(); - } -} - -function parseUseAsyncStateConfiguration>( - // the configuration that the developer emitted, can be of many forms - mixedConfig: MixedConfig, - // the context value, nullable - contextValue: StateContextValue | null, - // the current version of the external calculation - guard: number, - // the ref holding previous configuration - ownRef: UseAsyncStateRef, - // the hook dependencies - dependencies: any[], - // overrides that the library may use to control something - overrides?: PartialUseAsyncStateConfiguration, -): SubscriptionInfo { - - const newConfig = readUserConfiguration(mixedConfig, overrides); - const newMode = inferSubscriptionMode(contextValue, newConfig); - - const recalculateInstance = shouldRecalculateInstance( - newConfig, newMode, guard, ownRef.subscriptionInfo); - - assignAutomaticKeyIfNotProvided(newConfig, newMode); - - if (__DEV__) { - warnInDevAboutIrrelevantUseAsyncStateConfiguration(newMode, newConfig); - } - - let newAsyncState: StateInterface; - let previousInstance = ownRef.subscriptionInfo?.asyncState; - - if (recalculateInstance) { - newAsyncState = inferStateInstance(newMode, newConfig, contextValue); - } else { - newAsyncState = previousInstance; - } - - if (newConfig.lane) { - newAsyncState = newAsyncState.getLane(newConfig.lane); - } - - let didInstanceChange = previousInstance !== newAsyncState; - let didModeChange = newMode !== ownRef.subscriptionInfo?.mode; - - let shouldCalculateNewOutput = didInstanceChange || didModeChange; - - let output: SubscriptionInfo; - - if (shouldCalculateNewOutput) { - let configKey: string = newConfig.key as string; // not falsy - let disposeFn = disposeAsyncStateSubscriptionFn(newMode, newAsyncState, contextValue); - - output = { - mode: newMode, - dispose: disposeFn, - asyncState: newAsyncState, - baseReturn: Object.freeze(makeUseAsyncStateBaseReturnValue( - newAsyncState, configKey, contextValue, newMode)), - - guard, - deps: dependencies, - configuration: newConfig, - }; - } else { - output = shallowClone(ownRef.subscriptionInfo); - - output.guard = guard; - output.deps = dependencies; - output.configuration = newConfig; - } - - // assign payload - if (output.asyncState) { - if (contextValue) { - const contextPayload = contextValue.getPayload(); - if (contextPayload) { - output.asyncState.mergePayload(contextPayload); - - } - } - if (newConfig.payload) { - output.asyncState.mergePayload(newConfig.payload); - } - } - - return output; -} - -// we only dispose what we hoist, other states are disposed -// automatically when their subscribers go to 0 -function disposeAsyncStateSubscriptionFn( - mode: SubscriptionMode, - asyncState: StateInterface, - contextValue: UseAsyncStateContextType -): () => (boolean | undefined) { - return function dispose() { - switch (mode) { - case SubscriptionMode.FORK: - case SubscriptionMode.HOIST: - case SubscriptionMode.LISTEN: - case SubscriptionMode.ALONE: - return contextValue!.dispose(asyncState); - // NoOp - should not happen - case SubscriptionMode.SRC: - case SubscriptionMode.SRC_FORK: - case SubscriptionMode.OUTSIDE: - case SubscriptionMode.NA: - case SubscriptionMode.WAIT: - default: - return undefined; - } - }; -} - -// this functions search for the instance that you desire to subscribe to -function inferStateInstance( - // the subscription mode - mode: SubscriptionMode, - // the configuration - configuration: UseAsyncStateConfiguration, - // the context, if applicable - contextValue: UseAsyncStateContextType -): StateInterface { - const candidate = contextValue - ?.get(configuration.key as string) as StateInterface; - - switch (mode) { - case SubscriptionMode.FORK: - const parentInstance = contextValue!.get(configuration.key!); - return parentInstance.fork(configuration.forkConfig); - case SubscriptionMode.HOIST: - if (candidate) { - return candidate; - } - - const {key, producer} = configuration; - - return new AsyncState( - key!, - producer, - configuration, - ); - case SubscriptionMode.LISTEN: - return candidate; - case SubscriptionMode.ALONE: - case SubscriptionMode.OUTSIDE: - return new AsyncState( - configuration.key as string, - configuration.producer, - configuration, - ); - case SubscriptionMode.SRC: - return readInstanceFromSource( - configuration.source as Source); - case SubscriptionMode.SRC_FORK: { - const sourceAsyncState = readInstanceFromSource( - configuration.source as Source); - return sourceAsyncState.fork(configuration.forkConfig); - } - case SubscriptionMode.NA: - case SubscriptionMode.WAIT: - // @ts-ignore - return null; - default: - return candidate; - } -} - -//endregion - -//region subscription functions - -function createEmptyObject(): UseAsyncStateRef { - return Object.create(null); -} - -function inferSubscriptionMode( - contextValue: UseAsyncStateContextType, - configuration: UseAsyncStateConfiguration -): SubscriptionMode { - // the subscription via source passes directly - if (configuration[sourceConfigurationSecretSymbol] === true) { - return configuration.fork - ? - SubscriptionMode.SRC_FORK - : - SubscriptionMode.SRC; - } - - if (contextValue === null) { - return SubscriptionMode.OUTSIDE; - } - - const {key, fork, hoistToProvider, producer} = configuration; - if (key === undefined && configuration.source?.key === undefined) { - return SubscriptionMode.ALONE; - } - - const existsInProvider = !!contextValue.get(key as string); - - // early decide that this is a listener and return it immediately - // because this is the most common use case that it will be - // we'll be optimizing this path first - if (existsInProvider && !hoistToProvider && !fork) { - return SubscriptionMode.LISTEN; - } - - // we dont want to hoist or fork - if (!hoistToProvider && !fork && producer) { - return SubscriptionMode.ALONE; - } - - // we want to hoist while (not in provider or we dont want to fork) - if (hoistToProvider && (!existsInProvider || !fork)) { - return SubscriptionMode.HOIST; - } - - // fork a hoisted - // the provider will hoist it again - if (fork && existsInProvider) { - return SubscriptionMode.FORK; - } - - // not found in provider; so either a mistake, or still not hoisted from - if (!existsInProvider) { - // waiting, or may be we should throw ? - return SubscriptionMode.WAIT; - } - - return SubscriptionMode.NA; // we should not be here -} - - -function shouldRecalculateInstance( - newConfig: UseAsyncStateConfiguration, - newMode: SubscriptionMode, - newGuard: Object, - oldSubscriptionInfo: SubscriptionInfo | undefined -): boolean { - // here we check on relevant information to decide on the asyncState instance - return !oldSubscriptionInfo || - newGuard !== oldSubscriptionInfo.guard || - newMode !== oldSubscriptionInfo.mode || - newConfig.producer !== oldSubscriptionInfo.configuration.producer || - newConfig.key !== undefined && newConfig.key !== oldSubscriptionInfo.configuration.key || - newConfig.source !== oldSubscriptionInfo.configuration.source || - newConfig.lane !== oldSubscriptionInfo.configuration.lane || - - newConfig.fork !== oldSubscriptionInfo.configuration.fork || - newConfig.resetStateOnDispose !== oldSubscriptionInfo.configuration.resetStateOnDispose || - newConfig.forkConfig?.keepState !== oldSubscriptionInfo.configuration.forkConfig?.keepState || - - newConfig.hoistToProvider !== oldSubscriptionInfo.configuration.hoistToProvider || - newConfig.hoistToProviderConfig?.override !== oldSubscriptionInfo.configuration.hoistToProviderConfig?.override; -} - -function watchOverAsyncState>( - // the instance - asyncState: StateInterface, - // this function only works inside provider, todo: remove the | null - contextValue: StateContextValue, - // the watching mode (waiting, listen, hoist..) - mode: SubscriptionMode, - // the configuration, will read key and hoistToProviderConfig in case of hoist - configuration: UseAsyncStateConfiguration, - // a callback that notifies when the watch decided that a recalculation is necessary - setGuard: (value: React.SetStateAction) => void, - // the dispose function that serves to destroy the old instance in case we need a new one for hoist mode - dispose: (() => (boolean | undefined)), -) { - let didClean = false; - - // if we are waiting and do not have an asyncState - // this case is when this renders before the component hoisting the state - // the notifyWatchers is scheduled via microTaskQueue, - // that occurs after the layoutEffect and before is effect - // This means that we will miss the notification about the awaited state - // so, if we are waiting without an asyncState, recalculate the memo - if (mode === SubscriptionMode.WAIT) { - let candidate = contextValue.get(configuration.key as string); - if (candidate) { - if (!asyncState || candidate !== asyncState) { - // schedule the recalculation of the memo - setGuard(old => old + 1); - return; - } - } - } - - if (mode === SubscriptionMode.HOIST) { - const hoistedInstance = contextValue.hoist( - configuration.key!, - asyncState, - configuration.hoistToProviderConfig - ); - if (hoistedInstance !== asyncState) { - setGuard(old => old + 1); - return; - } - - return dispose; - } - - if (mode === SubscriptionMode.FORK) { - const hoistedInstance = contextValue.hoist( - asyncState.key, - asyncState, - configuration.hoistToProviderConfig - ); - if (hoistedInstance !== asyncState) { - setGuard(old => old + 1); - return; - } - - return dispose; - } - - if ( - mode === SubscriptionMode.WAIT || - mode === SubscriptionMode.LISTEN - ) { - let watchedKey = SubscriptionMode.WAIT === mode - ? configuration.key : asyncState?.key; - - const unwatch = contextValue.watch( - watchedKey!, - function notify(mayBeNewAsyncState) { - if (didClean) { - return; - } - // only trigger a rerender if the newAsyncState is different - if (mayBeNewAsyncState !== asyncState) { - setGuard(old => old + 1); - } - } - ); - return function cleanup() { - didClean = true; - - if (typeof unwatch === "function") { - unwatch(); - } - - if (mode === SubscriptionMode.LISTEN) { - dispose(); - } - }; - } - - if (mode === SubscriptionMode.ALONE) { - dispose(); - } - - return undefined; -} - -function newSubscribeToAsyncState( - mode: SubscriptionMode, - run: (...args: any[]) => AbortFn, - getLatestRenderedVersion: () => number | undefined, - asyncState: StateInterface, - subscriptionKey: string | undefined, - events: UseAsyncStateEvents | undefined, - onUpdate: (newState: State) => void, - onVersionMismatch: () => void, -): CleanupFn { - if (!asyncState || !onUpdate) { - return; - } - let unsubscribe = asyncState.subscribe(onUpdate, subscriptionKey); - let unsubscribeFromEvents = invokeSubscribeEvents( - events?.subscribe, run, mode, asyncState); - - if (asyncState.version !== getLatestRenderedVersion() && typeof onVersionMismatch === "function") { - onVersionMismatch!(); - } - - return function cleanup() { - if (unsubscribeFromEvents) { - unsubscribeFromEvents.forEach(cb => { - if (typeof cb === "function") { - cb(); - } - }); - } - unsubscribe!(); - } -} - -function invokeChangeEvents( - nextState: State, - events: UseAsyncStateEvents | undefined -) { - if (!events?.change) { - return; - } - - const changeHandlers: UseAsyncStateEventFn[] - = Array.isArray(events.change) ? events.change : [events.change]; - - const eventProps = {state: nextState}; - - changeHandlers.forEach(event => { - if (typeof event === "object") { - const {handler, status} = event; - if (!status || nextState.status === status) { - handler(eventProps); - } - } else { - event(eventProps); - } - }); -} - -function invokeSubscribeEvents( - events: UseAsyncStateEventSubscribe | undefined, - run: (...args: any[]) => AbortFn, - mode: SubscriptionMode, - asyncState?: StateInterface, -): CleanupFn[] | null { - if (!events || !asyncState) { - return null; - } - - let eventProps: SubscribeEventProps = { - run, - mode, - getState: () => asyncState.state, - invalidateCache: asyncState.invalidateCache, - }; - - let handlers: ((props: SubscribeEventProps) => CleanupFn)[] - = Array.isArray(events) ? events : [events]; - - return handlers.map(handler => handler(eventProps)); -} - -function readStateFromAsyncState>( - asyncState: StateInterface, - selector: useSelector -): E { - return selector(asyncState.state, asyncState.lastSuccess, asyncState.cache); -} - -//endregion - -//region useAsyncState value construction -// @ts-ignore -function noop(): undefined { - // that's a noop fn -} - -function makeUseAsyncStateBaseReturnValue( - asyncState: StateInterface, - configurationKey: string, - contextValue: UseAsyncStateContextType, - mode: SubscriptionMode -) { - if (!asyncState) { - return { - mode, - run: noop, - runc: noop, - abort: noop, - replay: noop, - setState: noop, - mergePayload: noop, - uniqueId: undefined, - key: configurationKey, - invalidateCache: noop, - // @ts-ignore - runp: noop as ((...args: any[]) => Promise>), - // @ts-ignore - } as BaseUseAsyncState; - } - - const effectsCreator = contextValue?.producerEffectsCreator ?? standaloneProducerEffectsCreator; - - return { - mode, - key: asyncState.key, - abort: asyncState.abort, - replay: asyncState.replay, - source: asyncState._source, - version: asyncState.version, - setState: asyncState.setState, - uniqueId: asyncState.uniqueId, - mergePayload: asyncState.mergePayload, - invalidateCache: asyncState.invalidateCache, - - run: asyncState.run.bind(asyncState, effectsCreator), - runp: asyncState.runp.bind(asyncState, effectsCreator), - runc: asyncState.runc.bind(asyncState, effectsCreator), - }; -} - -export function makeUseAsyncStateReturnValue( - asyncState: StateInterface, - stateValue: E, - configurationKey: string, - contextValue: UseAsyncStateContextType, - mode: SubscriptionMode -): Readonly> { - - // @ts-ignore - // ok ts! I will append missing properties right now! - const base: UseAsyncState = makeUseAsyncStateBaseReturnValue( - asyncState, configurationKey, contextValue, mode); - - base.state = stateValue; - if (!asyncState) { - base.read = function () { - return stateValue; - }; - base.payload = null; - return Object.freeze(base); - } - base.payload = asyncState.payload; - base.lastSuccess = asyncState.lastSuccess; - base.read = createReadInConcurrentMode(asyncState, stateValue); - return Object.freeze(base); -} - -let didWarnAboutUnsupportedConcurrentFeatures = false; - -function createReadInConcurrentMode( - asyncState: StateInterface, - stateValue: E -) { - return function readInConcurrentMode() { - if (supportsConcurrentMode()) { - if ( - AsyncStateStatus.pending === asyncState.state?.status && - asyncState.suspender - ) { - throw asyncState.suspender; - } - } else { - if (__DEV__) { - if (!didWarnAboutUnsupportedConcurrentFeatures) { - console.error( - "[Warning] You are calling useAsyncState().read() without having" + - " react 18 or above. If the library throws, you will get an error" + - " in your app. You will be receiving the state value without" + - " any suspension.Please consider upgrading to " + - "react 18 or above to use concurrent features." - ); - didWarnAboutUnsupportedConcurrentFeatures = true; - } - } - } - return stateValue; - } -} - -//endregion diff --git a/packages/react-async-states/src/react/useRun.ts b/packages/react-async-states/src/react/useRun.ts index 0e542585..f69dff70 100644 --- a/packages/react-async-states/src/react/useRun.ts +++ b/packages/react-async-states/src/react/useRun.ts @@ -1,7 +1,7 @@ import * as React from "react"; import {AbortFn, AsyncStateKeyOrSource, Source} from "../async-state"; import {AsyncStateContext} from "./context"; -import {isAsyncStateSource} from "../async-state/utils"; +import {isSource} from "../async-state/utils"; import {StateContextValue} from "../types.internal"; type RunFunction = ((keyOrSource: AsyncStateKeyOrSource, ...args: any[]) => AbortFn); @@ -13,7 +13,7 @@ function runLaneFn( lane: string | undefined, ...args: any[] ) { - if (isAsyncStateSource(keyOrSource)) { + if (isSource(keyOrSource)) { return (keyOrSource as Source).getLaneSource(lane).run(...args); } if (contextValue !== null) { diff --git a/packages/react-async-states/src/react/useSelector.ts b/packages/react-async-states/src/react/useSelector.ts index cf152d37..7a594d49 100644 --- a/packages/react-async-states/src/react/useSelector.ts +++ b/packages/react-async-states/src/react/useSelector.ts @@ -7,8 +7,8 @@ import { StateContextValue, UseSelectorFunctionKeys, } from "../types.internal"; -import {isAsyncStateSource} from "../async-state/utils"; -import AsyncState, { +import {isSource} from "../async-state/utils"; +import { ManagerWatchCallbackValue, Source, StateInterface, @@ -17,8 +17,8 @@ import AsyncState, { FunctionSelectorItem, SimpleSelector } from "../async-state"; -import {readInstanceFromSource} from "../async-state/AsyncState"; -import {useCallerName} from "./helpers/useCallerName"; +import {readSource} from "../async-state/AsyncState"; +import {computeCallerName} from "./helpers/useCallerName"; import {__DEV__, shallowEqual} from "../shared"; type SelectorSelf = { @@ -27,7 +27,6 @@ type SelectorSelf = { currentInstances: Record | undefined>, } -// todo: enhance the typing of useSelector export function useSelector( keys: BaseSelectorKey, selector?: SimpleSelector, @@ -49,13 +48,8 @@ export function useSelector( selector?: SimpleSelector | ArraySelector | FunctionSelector = identity, areEqual?: EqualityFn = shallowEqual, ): T { - let caller; const contextValue = React.useContext(AsyncStateContext); - if (__DEV__) { - caller = useCallerName(3); - } - ensureParamsAreOk(contextValue, keys); // on every render, recheck the keys, because they are most likely to be inlined @@ -114,10 +108,15 @@ export function useSelector( .map(as => { let subscriptionKey: string | undefined = undefined; if (__DEV__) { - let nextMeter = (as as AsyncState).subsIndex; - subscriptionKey = `${caller}-$4-$${nextMeter}`;// 4: useSelector + let caller = computeCallerName(8); + subscriptionKey = `${caller}-$4`;// 4: useSelector } - return (as as StateInterface)!.subscribe(onUpdate, subscriptionKey); + return (as as StateInterface)!.subscribe({ + origin: 4, + cb: onUpdate, + flags: undefined, + key: subscriptionKey, + }); }); return () => { @@ -211,8 +210,8 @@ function computeInstancesMap( ): Record | undefined> { return fromKeys .reduce((result, current) => { - if (isAsyncStateSource(current)) { - const asyncState = readInstanceFromSource(current as Source); + if (isSource(current)) { + const asyncState = readSource(current as Source); result[asyncState.key] = asyncState; } else if (contextValue !== null) { result[current as string] = contextValue.get(current as string); diff --git a/packages/react-async-states/src/react/utils.ts b/packages/react-async-states/src/react/utils.ts new file mode 100644 index 00000000..8f7fadc0 --- /dev/null +++ b/packages/react-async-states/src/react/utils.ts @@ -0,0 +1,21 @@ +import * as Flags from './StateHookFlags'; + +export function humanizeDevFlags(flags: number) { + let out: string[] = []; + Object + .entries(Flags) + .forEach(([name, value]) => { + if (value & flags) { + out.push(name); + } + }); + return out; +} + +//region useAsyncState value construction +// @ts-ignore +export function noop(): undefined { + // that's a noop fn +} + +export const emptyArray = []; diff --git a/packages/react-async-states/src/types.internal.ts b/packages/react-async-states/src/types.internal.ts index f69e1f59..969aa93a 100644 --- a/packages/react-async-states/src/types.internal.ts +++ b/packages/react-async-states/src/types.internal.ts @@ -3,14 +3,14 @@ import {ReactNode} from "react"; import { AbortFn, AsyncStateManagerInterface, - AsyncStateStatus, + Status, CacheConfig, CachedState, ForkConfig, - HoistToProviderConfig, + hoistConfig, Producer, ProducerConfig, - ProducerRunEffects, + RunEffect, Source, State, StateInterface, @@ -24,39 +24,14 @@ export interface AsyncStateInitializer { config?: ProducerConfig } -export enum SubscriptionMode { - LISTEN = "LISTEN", // simple listener - HOIST = "HOIST", // hoisting a producer, for first time and intended to be shared, more like of an injection - ALONE = "ALONE", // working standalone even if inside provider - WAIT = "WAIT", // waits for the original to be hoisted - FORK = "FORK", // forking an existing one in the provider - NA = "NA", // a weird case that should not happen - SRC = "SRC", // subscription via source property - SRC_FORK = "SRC_FORK", // subscription via source property and fork - OUTSIDE = "OUTSIDE", // standalone outside provider -} - export type StateContextValue = AsyncStateManagerInterface; // use async state -export interface BaseUseAsyncState> { - key: string, - +export interface BaseUseAsyncState> extends Source{ + flags?: number, source?: Source, - mode: SubscriptionMode, - - replay(): AbortFn, - abort(reason?: any): void, - run(...args: any[]): AbortFn, - runp(...args: any[]): Promise>, - - runc(props: RUNCProps): AbortFn, - setState: StateUpdater, - mergePayload(argv: Record): void, - - uniqueId: number | undefined, - invalidateCache(cacheKey?: string): void, + devFlags?: string[], } export interface UseAsyncState> extends BaseUseAsyncState { @@ -64,14 +39,12 @@ export interface UseAsyncState> extends BaseUseAsyncState read(): E, version?: number, lastSuccess?: State, - payload: Record | null, } // interface NewUseAsyncState> extends Source { // // key: string, // version?: number, -// mode: SubscriptionMode, // uniqueId: number | undefined, // source?: Source | undefined, // @@ -90,7 +63,9 @@ export type EqualityFn = ( export interface BaseConfig extends ProducerConfig{ key?: string, lane?: string, + source?: Source, autoRunArgs?: any[], + producer?: Producer, subscriptionKey?: string, payload?: Record, events?: UseAsyncStateEvents, @@ -100,8 +75,8 @@ export interface BaseConfig extends ProducerConfig{ fork?: boolean, forkConfig?: ForkConfig, - hoistToProvider?: boolean, - hoistToProviderConfig?: HoistToProviderConfig, + hoist?: boolean, + hoistConfig?: hoistConfig, } export interface ConfigWithKeyWithSelector extends ConfigWithKeyWithoutSelector { @@ -152,13 +127,14 @@ export type UseAsyncStateConfiguration> = { runEffectDurationMs?: number, resetStateOnDispose?: boolean, payload?: Record, - runEffect?: ProducerRunEffects, + runEffect?: RunEffect, initialValue?: T | ((cache: Record>) => T), fork?: boolean, forkConfig?: ForkConfig, - hoistToProvider?: boolean, - hoistToProviderConfig?: HoistToProviderConfig, + + hoist?: boolean, + hoistConfig?: hoistConfig, lazy?: boolean, autoRunArgs?: any[], @@ -188,7 +164,7 @@ export type StateBoundaryProps = { render?: StateBoundaryRenderProp, } -export type StateBoundaryRenderProp = Record +export type StateBoundaryRenderProp = Record export type UseAsyncStateEventProps = { state: State, @@ -203,7 +179,7 @@ export type UseAsyncStateEventFn = UseAsyncStateChangeEventHandler; export type UseAsyncStateChangeEvent = { - status: AsyncStateStatus + status: Status handler: UseAsyncStateChangeEventHandler, } @@ -219,7 +195,6 @@ export type UseAsyncStateEvents = { export type SubscribeEventProps = { getState: () => State, run: (...args: any[]) => AbortFn, - mode: SubscriptionMode, invalidateCache: (cacheKey?: string) => void, } @@ -232,7 +207,6 @@ export type useSelector = export type PartialUseAsyncStateConfiguration = Partial> export type SubscriptionInfo = { - mode: SubscriptionMode, asyncState: StateInterface, configuration: UseAsyncStateConfiguration, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ae03278e..bd47d301 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -68,6 +68,28 @@ importers: react-dom: 18.2.0_react@18.2.0 url-loader: 4.1.1_p5dl6emkcwslbw72e37w4ug7em + packages/example: + specifiers: + async-states-devtools: workspace:* + axios: ^0.21.1 + lodash: ^4.17.21 + prop-types: ^15.6.2 + react: 18.2.0 + react-async-states: workspace:* + react-dom: 18.2.0 + react-router-dom: 6.4.3 + react-scripts: 5.0.1 + dependencies: + async-states-devtools: link:../devtools-extension + axios: 0.21.4 + lodash: 4.17.21 + prop-types: 15.8.1 + react: 18.2.0 + react-async-states: link:../react-async-states + react-dom: 18.2.0_react@18.2.0 + react-router-dom: 6.4.3_biqbaboplfbrettd7655fr4n2y + react-scripts: 5.0.1_uf773njghfwrphsm6ek7wep3um + packages/react-async-states: specifiers: '@rollup/plugin-babel': ^6.0.2 @@ -359,7 +381,6 @@ packages: json-schema: 0.4.0 jsonpointer: 5.0.1 leven: 3.1.0 - dev: true /@babel/code-frame/7.18.6: resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} @@ -429,7 +450,6 @@ packages: eslint: 8.27.0 eslint-visitor-keys: 2.1.0 semver: 6.3.0 - dev: true /@babel/generator/7.20.4: resolution: {integrity: sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==} @@ -735,7 +755,6 @@ packages: '@babel/plugin-syntax-decorators': 7.19.0_@babel+core@7.20.2 transitivePeerDependencies: - supports-color - dev: true /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.20.2: resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} @@ -893,7 +912,6 @@ packages: dependencies: '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 - dev: true /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.20.2: resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} @@ -920,7 +938,6 @@ packages: dependencies: '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 - dev: true /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.20.2: resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} @@ -946,7 +963,6 @@ packages: dependencies: '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 - dev: true /@babel/plugin-syntax-import-assertions/7.20.0_@babel+core@7.20.2: resolution: {integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==} @@ -964,7 +980,6 @@ packages: dependencies: '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 - dev: true /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.20.2: resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} @@ -1191,7 +1206,6 @@ packages: '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-syntax-flow': 7.18.6_@babel+core@7.20.2 - dev: true /@babel/plugin-transform-for-of/7.18.8_@babel+core@7.20.2: resolution: {integrity: sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==} @@ -1696,7 +1710,6 @@ packages: /@bcoe/v8-coverage/0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - dev: true /@colors/colors/1.5.0: resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} @@ -1713,7 +1726,6 @@ packages: /@csstools/normalize.css/12.0.0: resolution: {integrity: sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg==} - dev: true /@csstools/postcss-cascade-layers/1.1.1_postcss@8.4.19: resolution: {integrity: sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==} @@ -1724,7 +1736,6 @@ packages: '@csstools/selector-specificity': 2.0.2_45y636a2vqremknoajyxd5nkzy postcss: 8.4.19 postcss-selector-parser: 6.0.10 - dev: true /@csstools/postcss-color-function/1.1.1_postcss@8.4.19: resolution: {integrity: sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==} @@ -1735,7 +1746,6 @@ packages: '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.19 postcss: 8.4.19 postcss-value-parser: 4.2.0 - dev: true /@csstools/postcss-font-format-keywords/1.0.1_postcss@8.4.19: resolution: {integrity: sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==} @@ -1745,7 +1755,6 @@ packages: dependencies: postcss: 8.4.19 postcss-value-parser: 4.2.0 - dev: true /@csstools/postcss-hwb-function/1.0.2_postcss@8.4.19: resolution: {integrity: sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==} @@ -1755,7 +1764,6 @@ packages: dependencies: postcss: 8.4.19 postcss-value-parser: 4.2.0 - dev: true /@csstools/postcss-ic-unit/1.0.1_postcss@8.4.19: resolution: {integrity: sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==} @@ -1766,7 +1774,6 @@ packages: '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.19 postcss: 8.4.19 postcss-value-parser: 4.2.0 - dev: true /@csstools/postcss-is-pseudo-class/2.0.7_postcss@8.4.19: resolution: {integrity: sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==} @@ -1777,7 +1784,6 @@ packages: '@csstools/selector-specificity': 2.0.2_45y636a2vqremknoajyxd5nkzy postcss: 8.4.19 postcss-selector-parser: 6.0.10 - dev: true /@csstools/postcss-nested-calc/1.0.0_postcss@8.4.19: resolution: {integrity: sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==} @@ -1787,7 +1793,6 @@ packages: dependencies: postcss: 8.4.19 postcss-value-parser: 4.2.0 - dev: true /@csstools/postcss-normalize-display-values/1.0.1_postcss@8.4.19: resolution: {integrity: sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==} @@ -1797,7 +1802,6 @@ packages: dependencies: postcss: 8.4.19 postcss-value-parser: 4.2.0 - dev: true /@csstools/postcss-oklab-function/1.1.1_postcss@8.4.19: resolution: {integrity: sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==} @@ -1808,7 +1812,6 @@ packages: '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.19 postcss: 8.4.19 postcss-value-parser: 4.2.0 - dev: true /@csstools/postcss-progressive-custom-properties/1.3.0_postcss@8.4.19: resolution: {integrity: sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==} @@ -1818,7 +1821,6 @@ packages: dependencies: postcss: 8.4.19 postcss-value-parser: 4.2.0 - dev: true /@csstools/postcss-stepped-value-functions/1.0.1_postcss@8.4.19: resolution: {integrity: sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==} @@ -1828,7 +1830,6 @@ packages: dependencies: postcss: 8.4.19 postcss-value-parser: 4.2.0 - dev: true /@csstools/postcss-text-decoration-shorthand/1.0.0_postcss@8.4.19: resolution: {integrity: sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==} @@ -1838,7 +1839,6 @@ packages: dependencies: postcss: 8.4.19 postcss-value-parser: 4.2.0 - dev: true /@csstools/postcss-trigonometric-functions/1.0.2_postcss@8.4.19: resolution: {integrity: sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==} @@ -1848,7 +1848,6 @@ packages: dependencies: postcss: 8.4.19 postcss-value-parser: 4.2.0 - dev: true /@csstools/postcss-unset-value/1.0.2_postcss@8.4.19: resolution: {integrity: sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==} @@ -1857,7 +1856,6 @@ packages: postcss: ^8.2 dependencies: postcss: 8.4.19 - dev: true /@csstools/selector-specificity/2.0.2_45y636a2vqremknoajyxd5nkzy: resolution: {integrity: sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==} @@ -1868,7 +1866,6 @@ packages: dependencies: postcss: 8.4.19 postcss-selector-parser: 6.0.10 - dev: true /@ctrl/tinycolor/3.4.1: resolution: {integrity: sha512-ej5oVy6lykXsvieQtqZxCOaLT+xD4+QNarq78cIYISHmZXshCvROLudpQN3lfL8G0NL7plMSSK+zlyvCaIJ4Iw==} @@ -2929,7 +2926,6 @@ packages: strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - dev: true /@hapi/hoek/9.3.0: resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} @@ -2950,7 +2946,6 @@ packages: minimatch: 3.1.2 transitivePeerDependencies: - supports-color - dev: true /@humanwhocodes/config-array/0.6.0: resolution: {integrity: sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==} @@ -2966,11 +2961,9 @@ packages: /@humanwhocodes/module-importer/1.0.1: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - dev: true /@humanwhocodes/object-schema/1.2.1: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} - dev: true /@istanbuljs/load-nyc-config/1.1.0: resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} @@ -2981,12 +2974,10 @@ packages: get-package-type: 0.1.0 js-yaml: 3.14.1 resolve-from: 5.0.0 - dev: true /@istanbuljs/schema/0.1.3: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} - dev: true /@jest/console/27.5.1: resolution: {integrity: sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==} @@ -2998,7 +2989,6 @@ packages: jest-message-util: 27.5.1 jest-util: 27.5.1 slash: 3.0.0 - dev: true /@jest/console/28.1.3: resolution: {integrity: sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==} @@ -3010,7 +3000,6 @@ packages: jest-message-util: 28.1.3 jest-util: 28.1.3 slash: 3.0.0 - dev: true /@jest/core/27.5.1: resolution: {integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==} @@ -3055,7 +3044,6 @@ packages: - supports-color - ts-node - utf-8-validate - dev: true /@jest/environment/27.5.1: resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==} @@ -3065,7 +3053,6 @@ packages: '@jest/types': 27.5.1 '@types/node': 18.11.9 jest-mock: 27.5.1 - dev: true /@jest/expect-utils/29.3.1: resolution: {integrity: sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==} @@ -3084,7 +3071,6 @@ packages: jest-message-util: 27.5.1 jest-mock: 27.5.1 jest-util: 27.5.1 - dev: true /@jest/globals/27.5.1: resolution: {integrity: sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==} @@ -3093,7 +3079,6 @@ packages: '@jest/environment': 27.5.1 '@jest/types': 27.5.1 expect: 27.5.1 - dev: true /@jest/reporters/27.5.1: resolution: {integrity: sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==} @@ -3131,14 +3116,12 @@ packages: v8-to-istanbul: 8.1.1 transitivePeerDependencies: - supports-color - dev: true /@jest/schemas/28.1.3: resolution: {integrity: sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: '@sinclair/typebox': 0.24.51 - dev: true /@jest/schemas/29.0.0: resolution: {integrity: sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==} @@ -3153,7 +3136,6 @@ packages: callsites: 3.1.0 graceful-fs: 4.2.10 source-map: 0.6.1 - dev: true /@jest/test-result/27.5.1: resolution: {integrity: sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==} @@ -3163,7 +3145,6 @@ packages: '@jest/types': 27.5.1 '@types/istanbul-lib-coverage': 2.0.4 collect-v8-coverage: 1.0.1 - dev: true /@jest/test-result/28.1.3: resolution: {integrity: sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==} @@ -3173,7 +3154,6 @@ packages: '@jest/types': 28.1.3 '@types/istanbul-lib-coverage': 2.0.4 collect-v8-coverage: 1.0.1 - dev: true /@jest/test-sequencer/27.5.1: resolution: {integrity: sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==} @@ -3185,7 +3165,6 @@ packages: jest-runtime: 27.5.1 transitivePeerDependencies: - supports-color - dev: true /@jest/transform/27.5.1: resolution: {integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==} @@ -3208,7 +3187,6 @@ packages: write-file-atomic: 3.0.3 transitivePeerDependencies: - supports-color - dev: true /@jest/types/27.5.1: resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} @@ -3219,7 +3197,6 @@ packages: '@types/node': 18.11.9 '@types/yargs': 16.0.4 chalk: 4.1.2 - dev: true /@jest/types/28.1.3: resolution: {integrity: sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==} @@ -3231,7 +3208,6 @@ packages: '@types/node': 18.11.9 '@types/yargs': 17.0.13 chalk: 4.1.2 - dev: true /@jest/types/29.3.1: resolution: {integrity: sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==} @@ -3372,7 +3348,6 @@ packages: resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} dependencies: eslint-scope: 5.1.1 - dev: true /@nodelib/fs.scandir/2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -3445,7 +3420,6 @@ packages: source-map: 0.7.4 webpack: 5.75.0 webpack-dev-server: 4.11.1_webpack@5.75.0 - dev: true /@polka/url/1.0.0-next.21: resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} @@ -3485,7 +3459,6 @@ packages: '@babel/helper-module-imports': 7.18.6 '@rollup/pluginutils': 3.1.0_rollup@2.79.1 rollup: 2.79.1 - dev: true /@rollup/plugin-babel/6.0.2_lkvu63hzbahttaf34ikyu7tiyq: resolution: {integrity: sha512-Vnt8XIWYwCf3MD7qhBWYlP9pjSZvcE++nlPXhQYw6YNehl5742AzFbrV6h4BHb20VAOVUlIksVLymQCTwVCGDg==} @@ -3550,7 +3523,6 @@ packages: is-module: 1.0.0 resolve: 1.22.1 rollup: 2.79.1 - dev: true /@rollup/plugin-node-resolve/15.0.1_rollup@3.3.0: resolution: {integrity: sha512-ReY88T7JhJjeRVbfCyNj+NXAG3IIsVMsX9b5/9jC98dRP8/yxlZdz7mHZbHk5zHr24wZZICS5AcXsFZAXYUQEg==} @@ -3578,7 +3550,6 @@ packages: '@rollup/pluginutils': 3.1.0_rollup@2.79.1 magic-string: 0.25.9 rollup: 2.79.1 - dev: true /@rollup/plugin-replace/5.0.1: resolution: {integrity: sha512-Z3MfsJ4CK17BfGrZgvrcp/l6WXoKb0kokULO+zt/7bmcyayokDaQ2K3eDJcRLCTAlp5FPI4/gz9MHAsosz4Rag==} @@ -3630,7 +3601,6 @@ packages: estree-walker: 1.0.1 picomatch: 2.3.1 rollup: 2.79.1 - dev: true /@rollup/pluginutils/3.1.0_rollup@3.3.0: resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} @@ -3683,7 +3653,6 @@ packages: /@rushstack/eslint-patch/1.2.0: resolution: {integrity: sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==} - dev: true /@rushstack/node-core-library/3.53.2: resolution: {integrity: sha512-FggLe5DQs0X9MNFeJN3/EXwb+8hyZUTEp2i+V1e8r4Va4JgkjBNY0BuEaQI+3DW6S4apV3UtXU3im17MSY00DA==} @@ -3740,13 +3709,11 @@ packages: resolution: {integrity: sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA==} dependencies: type-detect: 4.0.8 - dev: true /@sinonjs/fake-timers/8.1.0: resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==} dependencies: '@sinonjs/commons': 1.8.5 - dev: true /@slorber/static-site-generator-webpack-plugin/4.0.7: resolution: {integrity: sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA==} @@ -3764,12 +3731,10 @@ packages: json5: 2.2.1 magic-string: 0.25.9 string.prototype.matchall: 4.0.8 - dev: true /@svgr/babel-plugin-add-jsx-attribute/5.4.0: resolution: {integrity: sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==} engines: {node: '>=10'} - dev: true /@svgr/babel-plugin-add-jsx-attribute/6.5.1_@babel+core@7.20.2: resolution: {integrity: sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==} @@ -3783,7 +3748,6 @@ packages: /@svgr/babel-plugin-remove-jsx-attribute/5.4.0: resolution: {integrity: sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==} engines: {node: '>=10'} - dev: true /@svgr/babel-plugin-remove-jsx-attribute/6.5.0_@babel+core@7.20.2: resolution: {integrity: sha512-8zYdkym7qNyfXpWvu4yq46k41pyNM9SOstoWhKlm+IfdCE1DdnRKeMUPsWIEO/DEkaWxJ8T9esNdG3QwQ93jBA==} @@ -3797,7 +3761,6 @@ packages: /@svgr/babel-plugin-remove-jsx-empty-expression/5.0.1: resolution: {integrity: sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==} engines: {node: '>=10'} - dev: true /@svgr/babel-plugin-remove-jsx-empty-expression/6.5.0_@babel+core@7.20.2: resolution: {integrity: sha512-NFdxMq3xA42Kb1UbzCVxplUc0iqSyM9X8kopImvFnB+uSDdzIHOdbs1op8ofAvVRtbg4oZiyRl3fTYeKcOe9Iw==} @@ -3811,7 +3774,6 @@ packages: /@svgr/babel-plugin-replace-jsx-attribute-value/5.0.1: resolution: {integrity: sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==} engines: {node: '>=10'} - dev: true /@svgr/babel-plugin-replace-jsx-attribute-value/6.5.1_@babel+core@7.20.2: resolution: {integrity: sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==} @@ -3825,7 +3787,6 @@ packages: /@svgr/babel-plugin-svg-dynamic-title/5.4.0: resolution: {integrity: sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==} engines: {node: '>=10'} - dev: true /@svgr/babel-plugin-svg-dynamic-title/6.5.1_@babel+core@7.20.2: resolution: {integrity: sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==} @@ -3839,7 +3800,6 @@ packages: /@svgr/babel-plugin-svg-em-dimensions/5.4.0: resolution: {integrity: sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==} engines: {node: '>=10'} - dev: true /@svgr/babel-plugin-svg-em-dimensions/6.5.1_@babel+core@7.20.2: resolution: {integrity: sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==} @@ -3853,7 +3813,6 @@ packages: /@svgr/babel-plugin-transform-react-native-svg/5.4.0: resolution: {integrity: sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==} engines: {node: '>=10'} - dev: true /@svgr/babel-plugin-transform-react-native-svg/6.5.1_@babel+core@7.20.2: resolution: {integrity: sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==} @@ -3867,7 +3826,6 @@ packages: /@svgr/babel-plugin-transform-svg-component/5.5.0: resolution: {integrity: sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==} engines: {node: '>=10'} - dev: true /@svgr/babel-plugin-transform-svg-component/6.5.1_@babel+core@7.20.2: resolution: {integrity: sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==} @@ -3890,7 +3848,6 @@ packages: '@svgr/babel-plugin-svg-em-dimensions': 5.4.0 '@svgr/babel-plugin-transform-react-native-svg': 5.4.0 '@svgr/babel-plugin-transform-svg-component': 5.5.0 - dev: true /@svgr/babel-preset/6.5.1_@babel+core@7.20.2: resolution: {integrity: sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==} @@ -3918,7 +3875,6 @@ packages: cosmiconfig: 7.0.1 transitivePeerDependencies: - supports-color - dev: true /@svgr/core/6.5.1: resolution: {integrity: sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==} @@ -3938,7 +3894,6 @@ packages: engines: {node: '>=10'} dependencies: '@babel/types': 7.20.2 - dev: true /@svgr/hast-util-to-babel-ast/6.5.1: resolution: {integrity: sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==} @@ -3958,7 +3913,6 @@ packages: svg-parser: 2.0.4 transitivePeerDependencies: - supports-color - dev: true /@svgr/plugin-jsx/6.5.1_@svgr+core@6.5.1: resolution: {integrity: sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==} @@ -3982,7 +3936,6 @@ packages: cosmiconfig: 7.0.1 deepmerge: 4.2.2 svgo: 1.3.2 - dev: true /@svgr/plugin-svgo/6.5.1_@svgr+core@6.5.1: resolution: {integrity: sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==} @@ -4010,7 +3963,6 @@ packages: loader-utils: 2.0.4 transitivePeerDependencies: - supports-color - dev: true /@svgr/webpack/6.5.1: resolution: {integrity: sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==} @@ -4090,7 +4042,6 @@ packages: /@tootallnate/once/1.1.2: resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} engines: {node: '>= 6'} - dev: true /@trysound/sax/0.2.0: resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} @@ -4133,26 +4084,22 @@ packages: '@types/babel__generator': 7.6.4 '@types/babel__template': 7.4.1 '@types/babel__traverse': 7.18.2 - dev: true /@types/babel__generator/7.6.4: resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} dependencies: '@babel/types': 7.20.2 - dev: true /@types/babel__template/7.4.1: resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: '@babel/parser': 7.20.3 '@babel/types': 7.20.2 - dev: true /@types/babel__traverse/7.18.2: resolution: {integrity: sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==} dependencies: '@babel/types': 7.20.2 - dev: true /@types/body-parser/1.19.2: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} @@ -4190,7 +4137,6 @@ packages: /@types/estree/0.0.39: resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} - dev: true /@types/estree/0.0.51: resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==} @@ -4230,7 +4176,6 @@ packages: resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==} dependencies: '@types/node': 18.11.9 - dev: true /@types/hast/2.3.4: resolution: {integrity: sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==} @@ -4275,7 +4220,6 @@ packages: /@types/json5/0.0.29: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - dev: true /@types/keyv/3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} @@ -4316,14 +4260,12 @@ packages: /@types/prettier/2.7.1: resolution: {integrity: sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==} - dev: true /@types/prop-types/15.7.5: resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} /@types/q/1.5.5: resolution: {integrity: sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==} - dev: true /@types/qs/6.9.7: resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} @@ -4379,7 +4321,6 @@ packages: resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} dependencies: '@types/node': 18.11.9 - dev: true /@types/resolve/1.20.2: resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} @@ -4405,7 +4346,6 @@ packages: /@types/semver/7.3.13: resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} - dev: true /@types/serve-index/1.9.1: resolution: {integrity: sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==} @@ -4425,11 +4365,9 @@ packages: /@types/stack-utils/2.0.1: resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} - dev: true /@types/trusted-types/2.0.2: resolution: {integrity: sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==} - dev: true /@types/unist/2.0.6: resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} @@ -4447,7 +4385,6 @@ packages: resolution: {integrity: sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==} dependencies: '@types/yargs-parser': 21.0.0 - dev: true /@types/yargs/17.0.13: resolution: {integrity: sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==} @@ -4505,7 +4442,6 @@ packages: typescript: 4.8.4 transitivePeerDependencies: - supports-color - dev: true /@typescript-eslint/experimental-utils/5.0.0_bgi3obguywoxv2bja646f7pg6q: resolution: {integrity: sha512-Dnp4dFIsZcPawD6CT1p5NibNUQyGSEz80sULJZkyhyna8AEqArmfwMwJPbmKzWVo4PabqNVzHYlzmcdLQWk+pg==} @@ -4536,7 +4472,6 @@ packages: transitivePeerDependencies: - supports-color - typescript - dev: true /@typescript-eslint/parser/5.42.1_bgi3obguywoxv2bja646f7pg6q: resolution: {integrity: sha512-kAV+NiNBWVQDY9gDJDToTE/NO8BHi4f6b7zTsVAJoTkmB/zlfOpiEVBzHOKtlgTndCKe8vj9F/PuolemZSh50Q==} @@ -4576,7 +4511,6 @@ packages: typescript: 4.8.4 transitivePeerDependencies: - supports-color - dev: true /@typescript-eslint/scope-manager/5.0.0: resolution: {integrity: sha512-5RFjdA/ain/MDUHYXdF173btOKncIrLuBmA9s6FJhzDrRAyVSA+70BHg0/MW6TE+UiKVyRtX91XpVS0gVNwVDQ==} @@ -4592,7 +4526,6 @@ packages: dependencies: '@typescript-eslint/types': 5.42.1 '@typescript-eslint/visitor-keys': 5.42.1 - dev: true /@typescript-eslint/type-utils/5.42.1_rmayb2veg2btbq6mbmnyivgasy: resolution: {integrity: sha512-WWiMChneex5w4xPIX56SSnQQo0tEOy5ZV2dqmj8Z371LJ0E+aymWD25JQ/l4FOuuX+Q49A7pzh/CGIQflxMVXg==} @@ -4612,7 +4545,6 @@ packages: typescript: 4.8.4 transitivePeerDependencies: - supports-color - dev: true /@typescript-eslint/types/5.0.0: resolution: {integrity: sha512-dU/pKBUpehdEqYuvkojmlv0FtHuZnLXFBn16zsDmlFF3LXkOpkAQ2vrKc3BidIIve9EMH2zfTlxqw9XM0fFN5w==} @@ -4622,7 +4554,6 @@ packages: /@typescript-eslint/types/5.42.1: resolution: {integrity: sha512-Qrco9dsFF5lhalz+lLFtxs3ui1/YfC6NdXu+RAGBa8uSfn01cjO7ssCsjIsUs484vny9Xm699FSKwpkCcqwWwA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true /@typescript-eslint/typescript-estree/5.0.0_typescript@4.8.4: resolution: {integrity: sha512-V/6w+PPQMhinWKSn+fCiX5jwvd1vRBm7AX7SJQXEGQtwtBvjMPjaU3YTQ1ik2UF1u96X7tsB96HMnulG3eLi9Q==} @@ -4664,7 +4595,6 @@ packages: typescript: 4.8.4 transitivePeerDependencies: - supports-color - dev: true /@typescript-eslint/utils/5.42.1_rmayb2veg2btbq6mbmnyivgasy: resolution: {integrity: sha512-Gxvf12xSp3iYZd/fLqiQRD4uKZjDNR01bQ+j8zvhPjpsZ4HmvEFL/tC4amGNyxN9Rq+iqvpHLhlqx6KTxz9ZyQ==} @@ -4684,7 +4614,6 @@ packages: transitivePeerDependencies: - supports-color - typescript - dev: true /@typescript-eslint/visitor-keys/5.0.0: resolution: {integrity: sha512-yRyd2++o/IrJdyHuYMxyFyBhU762MRHQ/bAGQeTnN3pGikfh+nEmM61XTqaDH1XDp53afZ+waXrk0ZvenoZ6xw==} @@ -4700,7 +4629,6 @@ packages: dependencies: '@typescript-eslint/types': 5.42.1 eslint-visitor-keys: 3.3.0 - dev: true /@vitejs/plugin-react/2.2.0_vite@3.2.3: resolution: {integrity: sha512-FFpefhvExd1toVRlokZgxgy2JtnBOdp4ZDsq7ldCWaqGSGn9UhWMAVm/1lxPL14JfNS5yGz+s9yFrQY6shoStA==} @@ -4819,7 +4747,6 @@ packages: /abab/2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} - dev: true /accepts/1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} @@ -4851,7 +4778,6 @@ packages: dependencies: acorn: 7.4.1 acorn-walk: 7.2.0 - dev: true /acorn-import-assertions/1.8.0_acorn@8.8.1: resolution: {integrity: sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==} @@ -4874,7 +4800,6 @@ packages: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: acorn: 8.8.1 - dev: true /acorn-node/1.8.2: resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==} @@ -4882,12 +4807,10 @@ packages: acorn: 7.4.1 acorn-walk: 7.2.0 xtend: 4.0.2 - dev: true /acorn-walk/7.2.0: resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} engines: {node: '>=0.4.0'} - dev: true /acorn-walk/8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} @@ -4903,7 +4826,6 @@ packages: resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} engines: {node: '>=0.4.0'} hasBin: true - dev: true /acorn/8.8.1: resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==} @@ -4920,7 +4842,6 @@ packages: dependencies: loader-utils: 2.0.4 regex-parser: 2.2.11 - dev: true /agent-base/6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} @@ -4929,7 +4850,6 @@ packages: debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: true /aggregate-error/3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} @@ -5023,7 +4943,6 @@ packages: engines: {node: '>=8'} dependencies: type-fest: 0.21.3 - dev: true /ansi-html-community/0.0.8: resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} @@ -5053,7 +4972,6 @@ packages: /ansi-styles/5.2.0: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} - dev: true /ansi-styles/6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} @@ -5140,7 +5058,6 @@ packages: dependencies: '@babel/runtime': 7.20.1 '@babel/runtime-corejs3': 7.20.1 - dev: true /aria-query/5.1.3: resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} @@ -5163,7 +5080,6 @@ packages: es-abstract: 1.20.4 get-intrinsic: 1.1.3 is-string: 1.0.7 - dev: true /array-tree-filter/2.1.0: resolution: {integrity: sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==} @@ -5181,7 +5097,6 @@ packages: define-properties: 1.1.4 es-abstract: 1.20.4 es-shim-unscopables: 1.0.0 - dev: true /array.prototype.flatmap/1.3.1: resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} @@ -5191,7 +5106,6 @@ packages: define-properties: 1.1.4 es-abstract: 1.20.4 es-shim-unscopables: 1.0.0 - dev: true /array.prototype.reduce/1.0.5: resolution: {integrity: sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==} @@ -5202,14 +5116,12 @@ packages: es-abstract: 1.20.4 es-array-method-boxes-properly: 1.0.0 is-string: 1.0.7 - dev: true /asap/2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} /ast-types-flow/0.0.7: resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} - dev: true /async-validator/4.2.5: resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} @@ -5217,7 +5129,6 @@ packages: /async/3.2.4: resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} - dev: true /asynckit/0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -5271,7 +5182,14 @@ packages: /axe-core/4.5.1: resolution: {integrity: sha512-1exVbW0X1O/HSr/WMwnaweyqcWOgZgLiVxdLG34pvSQk4NlYQr9OUy0JLwuhFfuVNQzzqgH57eYzkFBCb3bIsQ==} engines: {node: '>=4'} - dev: true + + /axios/0.21.4: + resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} + dependencies: + follow-redirects: 1.15.2 + transitivePeerDependencies: + - debug + dev: false /axios/0.25.0: resolution: {integrity: sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==} @@ -5293,7 +5211,6 @@ packages: /axobject-query/2.2.0: resolution: {integrity: sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==} - dev: true /babel-jest/27.5.1_@babel+core@7.20.2: resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==} @@ -5312,7 +5229,6 @@ packages: slash: 3.0.0 transitivePeerDependencies: - supports-color - dev: true /babel-loader/8.3.0_npabyccmuonwo2rku4k53xo3hi: resolution: {integrity: sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==} @@ -5361,7 +5277,6 @@ packages: test-exclude: 6.0.0 transitivePeerDependencies: - supports-color - dev: true /babel-plugin-jest-hoist/27.5.1: resolution: {integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==} @@ -5371,7 +5286,6 @@ packages: '@babel/types': 7.20.2 '@types/babel__core': 7.1.20 '@types/babel__traverse': 7.18.2 - dev: true /babel-plugin-macros/3.1.0: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} @@ -5380,7 +5294,6 @@ packages: '@babel/runtime': 7.20.1 cosmiconfig: 7.0.1 resolve: 1.22.1 - dev: true /babel-plugin-named-asset-import/0.3.8_@babel+core@7.20.2: resolution: {integrity: sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==} @@ -5388,7 +5301,6 @@ packages: '@babel/core': ^7.1.0 dependencies: '@babel/core': 7.20.2 - dev: true /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.20.2: resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} @@ -5425,7 +5337,6 @@ packages: /babel-plugin-transform-react-remove-prop-types/0.4.24: resolution: {integrity: sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==} - dev: true /babel-preset-current-node-syntax/1.0.1_@babel+core@7.20.2: resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} @@ -5445,7 +5356,6 @@ packages: '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.2 '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.2 '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.20.2 - dev: true /babel-preset-jest/27.5.1_@babel+core@7.20.2: resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==} @@ -5456,7 +5366,6 @@ packages: '@babel/core': 7.20.2 babel-plugin-jest-hoist: 27.5.1 babel-preset-current-node-syntax: 1.0.1_@babel+core@7.20.2 - dev: true /babel-preset-react-app/10.0.1: resolution: {integrity: sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==} @@ -5480,7 +5389,6 @@ packages: babel-plugin-transform-react-remove-prop-types: 0.4.24 transitivePeerDependencies: - supports-color - dev: true /bail/1.0.5: resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==} @@ -5504,7 +5412,6 @@ packages: check-types: 11.1.2 hoopy: 0.1.4 tryer: 1.0.1 - dev: true /big.js/5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} @@ -5515,7 +5422,6 @@ packages: /bluebird/3.7.2: resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} - dev: true /body-parser/1.20.1: resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} @@ -5585,7 +5491,6 @@ packages: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} dependencies: balanced-match: 1.0.2 - dev: true /braces/3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} @@ -5595,7 +5500,6 @@ packages: /browser-process-hrtime/1.0.0: resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} - dev: true /browserslist/4.21.4: resolution: {integrity: sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==} @@ -5611,7 +5515,6 @@ packages: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} dependencies: node-int64: 0.4.0 - dev: true /buble/0.19.6: resolution: {integrity: sha512-9kViM6nJA1Q548Jrd06x0geh+BG2ru2+RMDkIHHgJY/8AcyCs34lTHwra9BX7YdPrZXd5aarkpr/SY8bmPgPdg==} @@ -5631,7 +5534,6 @@ packages: /builtin-modules/3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} - dev: true /bytes/3.0.0: resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} @@ -5677,7 +5579,6 @@ packages: /camelcase/5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} - dev: true /camelcase/6.3.0: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} @@ -5697,7 +5598,6 @@ packages: /case-sensitive-paths-webpack-plugin/2.4.0: resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} engines: {node: '>=4'} - dev: true /ccount/1.1.0: resolution: {integrity: sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==} @@ -5721,12 +5621,10 @@ packages: /char-regex/1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} - dev: true /char-regex/2.0.1: resolution: {integrity: sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==} engines: {node: '>=12.20'} - dev: true /character-entities-legacy/1.1.4: resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} @@ -5742,7 +5640,6 @@ packages: /check-types/11.1.2: resolution: {integrity: sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ==} - dev: true /cheerio-select/2.1.0: resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} @@ -5804,7 +5701,6 @@ packages: /cjs-module-lexer/1.2.2: resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} - dev: true /classnames/2.3.2: resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==} @@ -5845,7 +5741,6 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - dev: true /clone-deep/4.0.1: resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} @@ -5875,7 +5770,6 @@ packages: /co/4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - dev: true /coa/2.0.2: resolution: {integrity: sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==} @@ -5884,7 +5778,6 @@ packages: '@types/q': 1.5.5 chalk: 2.4.2 q: 1.5.1 - dev: true /code-block-writer/11.0.3: resolution: {integrity: sha512-NiujjUFB4SwScJq2bwbYUtXbZhBSlY6vYzm++3Q6oC+U+injTqfPYFK8wS9COOmb2lueqp0ZRB4nK1VYeHgNyw==} @@ -5896,7 +5789,6 @@ packages: /collect-v8-coverage/1.0.1: resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} - dev: true /color-convert/1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -5964,12 +5856,10 @@ packages: /common-path-prefix/3.0.0: resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} - dev: true /common-tags/1.8.2: resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} engines: {node: '>=4.0.0'} - dev: true /commondir/1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} @@ -6023,7 +5913,6 @@ packages: /confusing-browser-globals/1.0.11: resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} - dev: true /connect-history-api-fallback/2.0.0: resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} @@ -6166,7 +6055,6 @@ packages: dependencies: postcss: 8.4.19 postcss-selector-parser: 6.0.10 - dev: true /css-declaration-sorter/6.3.1_postcss@8.4.19: resolution: {integrity: sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==} @@ -6185,7 +6073,6 @@ packages: dependencies: postcss: 8.4.19 postcss-selector-parser: 6.0.10 - dev: true /css-loader/6.7.1_webpack@5.75.0: resolution: {integrity: sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==} @@ -6229,7 +6116,6 @@ packages: serialize-javascript: 6.0.0 source-map: 0.6.1 webpack: 5.75.0 - dev: true /css-minimizer-webpack-plugin/4.2.2_2xq5u4vuzw4op42d4uqzx2gxfa: resolution: {integrity: sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA==} @@ -6274,11 +6160,9 @@ packages: postcss: ^8.4 dependencies: postcss: 8.4.19 - dev: true /css-select-base-adapter/0.1.1: resolution: {integrity: sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==} - dev: true /css-select/2.1.0: resolution: {integrity: sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==} @@ -6287,7 +6171,6 @@ packages: css-what: 3.4.2 domutils: 1.7.0 nth-check: 1.0.2 - dev: true /css-select/4.3.0: resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} @@ -6314,7 +6197,6 @@ packages: dependencies: mdn-data: 2.0.4 source-map: 0.6.1 - dev: true /css-tree/1.1.3: resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} @@ -6326,7 +6208,6 @@ packages: /css-what/3.4.2: resolution: {integrity: sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==} engines: {node: '>= 6'} - dev: true /css-what/6.1.0: resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} @@ -6334,7 +6215,6 @@ packages: /cssdb/7.1.0: resolution: {integrity: sha512-Sd99PrFgx28ez4GHu8yoQIufc/70h9oYowDf4EjeIKi8mac9whxRjhM3IaMr6EllP6KKKWtJrMfN6C7T9tIWvQ==} - dev: true /cssesc/3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} @@ -6420,25 +6300,21 @@ packages: /cssom/0.3.8: resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} - dev: true /cssom/0.4.4: resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} - dev: true /cssstyle/2.3.0: resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} engines: {node: '>=8'} dependencies: cssom: 0.3.8 - dev: true /csstype/3.1.1: resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} /damerau-levenshtein/1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - dev: true /data-urls/2.0.0: resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} @@ -6447,7 +6323,6 @@ packages: abab: 2.0.6 whatwg-mimetype: 2.3.0 whatwg-url: 8.7.0 - dev: true /date-fns/2.29.3: resolution: {integrity: sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==} @@ -6477,7 +6352,6 @@ packages: optional: true dependencies: ms: 2.1.3 - dev: true /debug/4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} @@ -6492,7 +6366,6 @@ packages: /decimal.js/10.4.2: resolution: {integrity: sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA==} - dev: true /decode-uri-component/0.2.0: resolution: {integrity: sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==} @@ -6508,7 +6381,6 @@ packages: /dedent/0.7.0: resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} - dev: true /deep-equal/2.1.0: resolution: {integrity: sha512-2pxgvWu3Alv1PoWEyVg7HS8YhGlUFUV7N5oOvfL6d+7xAmLSemMwv/c8Zv/i9KFzxV5Kt5CAvQc70fLwVuf4UA==} @@ -6537,7 +6409,6 @@ packages: /deep-is/0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true /deepmerge/4.2.2: resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==} @@ -6566,7 +6437,6 @@ packages: /defined/1.0.1: resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==} - dev: true /del/5.1.0: resolution: {integrity: sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==} @@ -6621,7 +6491,6 @@ packages: /detect-newline/3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} - dev: true /detect-node/2.1.0: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} @@ -6654,16 +6523,13 @@ packages: acorn-node: 1.8.2 defined: 1.0.1 minimist: 1.2.7 - dev: true /didyoumean/1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - dev: true /diff-sequences/27.5.1: resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dev: true /diff-sequences/29.3.1: resolution: {integrity: sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==} @@ -6682,7 +6548,6 @@ packages: /dlv/1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - dev: true /dns-equal/1.0.0: resolution: {integrity: sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==} @@ -6698,14 +6563,12 @@ packages: engines: {node: '>=0.10.0'} dependencies: esutils: 2.0.3 - dev: true /doctrine/3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} dependencies: esutils: 2.0.3 - dev: true /dom-accessibility-api/0.5.14: resolution: {integrity: sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg==} @@ -6732,7 +6595,6 @@ packages: dependencies: domelementtype: 2.3.0 entities: 2.2.0 - dev: true /dom-serializer/1.4.1: resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} @@ -6751,7 +6613,6 @@ packages: /domelementtype/1.3.1: resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} - dev: true /domelementtype/2.3.0: resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} @@ -6761,7 +6622,6 @@ packages: engines: {node: '>=8'} dependencies: webidl-conversions: 5.0.0 - dev: true /domhandler/4.3.1: resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} @@ -6781,7 +6641,6 @@ packages: dependencies: dom-serializer: 0.2.2 domelementtype: 1.3.1 - dev: true /domutils/2.8.0: resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} @@ -6813,12 +6672,10 @@ packages: /dotenv-expand/5.1.0: resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} - dev: true /dotenv/10.0.0: resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==} engines: {node: '>=10'} - dev: true /duplexer/0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} @@ -6840,7 +6697,6 @@ packages: hasBin: true dependencies: jake: 10.8.5 - dev: true /electron-to-chromium/1.4.284: resolution: {integrity: sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==} @@ -6848,12 +6704,10 @@ packages: /emittery/0.10.2: resolution: {integrity: sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==} engines: {node: '>=12'} - dev: true /emittery/0.8.1: resolution: {integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==} engines: {node: '>=10'} - dev: true /emoji-regex/8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -6910,7 +6764,6 @@ packages: resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} dependencies: stackframe: 1.3.4 - dev: true /es-abstract/1.20.4: resolution: {integrity: sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==} @@ -6940,11 +6793,9 @@ packages: string.prototype.trimend: 1.0.6 string.prototype.trimstart: 1.0.6 unbox-primitive: 1.0.2 - dev: true /es-array-method-boxes-properly/1.0.0: resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} - dev: true /es-get-iterator/1.1.2: resolution: {integrity: sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==} @@ -6966,7 +6817,6 @@ packages: resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} dependencies: has: 1.0.3 - dev: true /es-to-primitive/1.2.1: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} @@ -6975,7 +6825,6 @@ packages: is-callable: 1.2.7 is-date-object: 1.0.5 is-symbol: 1.0.4 - dev: true /esbuild-android-64/0.15.13: resolution: {integrity: sha512-yRorukXBlokwTip+Sy4MYskLhJsO0Kn0/Fj43s1krVblfwP+hMD37a4Wmg139GEsMLl+vh8WXp2mq/cTA9J97g==} @@ -7206,7 +7055,6 @@ packages: /escape-string-regexp/2.0.0: resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} engines: {node: '>=8'} - dev: true /escape-string-regexp/4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} @@ -7223,7 +7071,6 @@ packages: optionator: 0.8.3 optionalDependencies: source-map: 0.6.1 - dev: true /eslint-config-prettier/8.5.0_eslint@8.0.1: resolution: {integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==} @@ -7267,7 +7114,6 @@ packages: - eslint-import-resolver-webpack - jest - supports-color - dev: true /eslint-config-standard-react/12.0.0_crua5zzh5wtgko3a7bkv6w5n7m: resolution: {integrity: sha512-Bw0hN/9YtmrJrBB0l5DIX2YhDR2IkWHOCCZGB87AawgmBsQbcX2y9uec7R178BCPnuqhm6jiwBySPw3zvmKRTg==} @@ -7336,7 +7182,6 @@ packages: resolve: 1.22.1 transitivePeerDependencies: - supports-color - dev: true /eslint-module-utils/2.7.4_l3rkqmr6ujglf4zsfjyz5e7jai: resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} @@ -7365,7 +7210,6 @@ packages: eslint-import-resolver-node: 0.3.6 transitivePeerDependencies: - supports-color - dev: true /eslint-module-utils/2.7.4_zkioto4j4sh4mjr3kic2x662p4: resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} @@ -7431,7 +7275,6 @@ packages: eslint: 8.27.0 lodash: 4.17.21 string-natural-compare: 3.0.1 - dev: true /eslint-plugin-import/2.25.2_zaqbbelgc2zchk32qtn6ylzxpi: resolution: {integrity: sha512-qCwQr9TYfoBHOFcVGKY9C9unq05uOxxdklmBXLVvcwo68y5Hta6/GzCZEMx2zQiu0woKNEER0LE7ZgaOfBU14g==} @@ -7493,7 +7336,6 @@ packages: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - dev: true /eslint-plugin-jest/25.7.0_5hzdnpurunnvkypr2bvkyudjkm: resolution: {integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==} @@ -7515,7 +7357,6 @@ packages: transitivePeerDependencies: - supports-color - typescript - dev: true /eslint-plugin-jsx-a11y/6.6.1_eslint@8.27.0: resolution: {integrity: sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q==} @@ -7537,7 +7378,6 @@ packages: language-tags: 1.0.5 minimatch: 3.1.2 semver: 6.3.0 - dev: true /eslint-plugin-n/15.0.0_eslint@8.0.1: resolution: {integrity: sha512-cb70VSsNjteEL+sInXvlyewuE4OCW9CFmcOQKxyQzdAsoK+7pWpygf2q/Vsw/5dKSniO7qbawLjDqAakaILCIw==} @@ -7596,7 +7436,6 @@ packages: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 dependencies: eslint: 8.27.0 - dev: true /eslint-plugin-react/7.31.10_eslint@8.0.1: resolution: {integrity: sha512-e4N/nc6AAlg4UKW/mXeYWd3R++qUano5/o+t+wnWxIf+bLsOaH3a4q74kX3nDjYym3VBN4HyO9nEn1GcAqgQOA==} @@ -7642,7 +7481,6 @@ packages: resolve: 2.0.0-next.4 semver: 6.3.0 string.prototype.matchall: 4.0.8 - dev: true /eslint-plugin-testing-library/5.9.1_rmayb2veg2btbq6mbmnyivgasy: resolution: {integrity: sha512-6BQp3tmb79jLLasPHJmy8DnxREe+2Pgf7L+7o09TSWPfdqqtQfRZmZNetr5mOs3yqZk/MRNxpN3RUpJe0wB4LQ==} @@ -7655,7 +7493,6 @@ packages: transitivePeerDependencies: - supports-color - typescript - dev: true /eslint-scope/5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} @@ -7678,7 +7515,6 @@ packages: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - dev: true /eslint-utils/2.1.0: resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} @@ -7705,7 +7541,6 @@ packages: dependencies: eslint: 8.27.0 eslint-visitor-keys: 2.1.0 - dev: true /eslint-visitor-keys/1.3.0: resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} @@ -7715,12 +7550,10 @@ packages: /eslint-visitor-keys/2.1.0: resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} engines: {node: '>=10'} - dev: true /eslint-visitor-keys/3.3.0: resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true /eslint-webpack-plugin/3.2.0_5mastfusvewdnfotkrq73j4uja: resolution: {integrity: sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==} @@ -7736,7 +7569,6 @@ packages: normalize-path: 3.0.0 schema-utils: 4.0.0 webpack: 5.75.0 - dev: true /eslint/8.0.1: resolution: {integrity: sha512-LsgcwZgQ72vZ+SMp4K6pAnk2yFDWL7Ti4pJaRvsZ0Hsw2h8ZjUIW38a9AFn2cZXdBMlScMFYYgsSp4ttFI/0bA==} @@ -7831,7 +7663,6 @@ packages: text-table: 0.2.0 transitivePeerDependencies: - supports-color - dev: true /espree/9.4.1: resolution: {integrity: sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==} @@ -7840,7 +7671,6 @@ packages: acorn: 8.8.1 acorn-jsx: 5.3.2_acorn@8.8.1 eslint-visitor-keys: 3.3.0 - dev: true /esprima/4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} @@ -7852,7 +7682,6 @@ packages: engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 - dev: true /esrecurse/4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} @@ -7870,7 +7699,6 @@ packages: /estree-walker/1.0.1: resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} - dev: true /estree-walker/2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} @@ -7921,7 +7749,6 @@ packages: /exit/0.1.2: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} - dev: true /expect/27.5.1: resolution: {integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==} @@ -7931,7 +7758,6 @@ packages: jest-get-type: 27.5.1 jest-matcher-utils: 27.5.1 jest-message-util: 27.5.1 - dev: true /expect/29.3.1: resolution: {integrity: sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==} @@ -8011,7 +7837,6 @@ packages: /fast-levenshtein/2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true /fast-url-parser/1.1.3: resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==} @@ -8034,7 +7859,6 @@ packages: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} dependencies: bser: 2.1.1 - dev: true /fbemitter/3.0.0: resolution: {integrity: sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==} @@ -8074,7 +7898,6 @@ packages: engines: {node: ^10.12.0 || >=12.0.0} dependencies: flat-cache: 3.0.4 - dev: true /file-loader/6.2.0_webpack@5.75.0: resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} @@ -8090,7 +7913,6 @@ packages: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} dependencies: minimatch: 5.1.0 - dev: true /filesize/8.0.7: resolution: {integrity: sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==} @@ -8150,11 +7972,9 @@ packages: dependencies: flatted: 3.2.7 rimraf: 3.0.2 - dev: true /flatted/3.2.7: resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} - dev: true /flux/4.0.3_react@18.2.0: resolution: {integrity: sha512-yKAbrp7JhZhj6uiT1FTuVMlIAT1J4jqEyBpFApi1kxpGZCvacMVc/t1pMQyotqHhAgvoE3bNvAykhCo2CLjnYw==} @@ -8213,7 +8033,6 @@ packages: tapable: 1.1.3 typescript: 4.8.4 webpack: 5.75.0 - dev: true /fork-ts-checker-webpack-plugin/6.5.2_qw7fmzhoapcndkteb5rsc33stq: resolution: {integrity: sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA==} @@ -8253,7 +8072,6 @@ packages: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - dev: true /form-data/4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} @@ -8334,7 +8152,6 @@ packages: define-properties: 1.1.4 es-abstract: 1.20.4 functions-have-names: 1.2.3 - dev: true /functional-red-black-tree/1.0.1: resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} @@ -8342,7 +8159,6 @@ packages: /functions-have-names/1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: true /gensync/1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} @@ -8351,7 +8167,6 @@ packages: /get-caller-file/2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - dev: true /get-intrinsic/1.1.3: resolution: {integrity: sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==} @@ -8366,7 +8181,6 @@ packages: /get-package-type/0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} - dev: true /get-stream/4.1.0: resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} @@ -8392,7 +8206,6 @@ packages: dependencies: call-bind: 1.0.2 get-intrinsic: 1.1.3 - dev: true /github-slugger/1.5.0: resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} @@ -8464,7 +8277,6 @@ packages: engines: {node: '>=8'} dependencies: type-fest: 0.20.2 - dev: true /globby/10.0.1: resolution: {integrity: sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==} @@ -8546,7 +8358,6 @@ packages: /grapheme-splitter/1.0.4: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} - dev: true /gray-matter/4.0.3: resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} @@ -8569,11 +8380,9 @@ packages: /harmony-reflect/1.6.2: resolution: {integrity: sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==} - dev: true /has-bigints/1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: true /has-flag/3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} @@ -8597,7 +8406,6 @@ packages: engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 - dev: true /has-yarn/2.1.0: resolution: {integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==} @@ -8696,7 +8504,6 @@ packages: /hoopy/0.1.4: resolution: {integrity: sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==} engines: {node: '>= 6.0.0'} - dev: true /hpack.js/2.1.6: resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} @@ -8711,14 +8518,12 @@ packages: engines: {node: '>=10'} dependencies: whatwg-encoding: 1.0.5 - dev: true /html-entities/2.3.3: resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} /html-escaper/2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - dev: true /html-minifier-terser/6.1.0: resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} @@ -8810,7 +8615,6 @@ packages: debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: true /http-proxy-middleware/2.0.6_@types+express@4.17.14: resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} @@ -8848,7 +8652,6 @@ packages: debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: true /human-signals/2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} @@ -8865,7 +8668,6 @@ packages: engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 - dev: true /icss-utils/5.1.0_postcss@8.4.19: resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} @@ -8877,14 +8679,12 @@ packages: /idb/7.1.1: resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} - dev: true /identity-obj-proxy/3.0.0: resolution: {integrity: sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==} engines: {node: '>=4'} dependencies: harmony-reflect: 1.6.2 - dev: true /ignore/4.0.6: resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} @@ -8930,7 +8730,6 @@ packages: dependencies: pkg-dir: 4.2.0 resolve-cwd: 3.0.0 - dev: true /imurmurhash/0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} @@ -8976,7 +8775,6 @@ packages: get-intrinsic: 1.1.3 has: 1.0.3 side-channel: 1.0.4 - dev: true /interpret/1.4.0: resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} @@ -9023,7 +8821,6 @@ packages: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: has-bigints: 1.0.2 - dev: true /is-binary-path/2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} @@ -9037,7 +8834,6 @@ packages: dependencies: call-bind: 1.0.2 has-tostringtag: 1.0.0 - dev: true /is-buffer/2.0.5: resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} @@ -9054,7 +8850,6 @@ packages: /is-callable/1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - dev: true /is-ci/2.0.0: resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} @@ -9073,7 +8868,6 @@ packages: engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 - dev: true /is-decimal/1.0.4: resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} @@ -9100,7 +8894,6 @@ packages: /is-generator-fn/2.1.0: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} engines: {node: '>=6'} - dev: true /is-glob/4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} @@ -9126,12 +8919,10 @@ packages: /is-module/1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} - dev: true /is-negative-zero/2.0.2: resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} engines: {node: '>= 0.4'} - dev: true /is-npm/5.0.0: resolution: {integrity: sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==} @@ -9143,7 +8934,6 @@ packages: engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 - dev: true /is-number/7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} @@ -9189,7 +8979,6 @@ packages: /is-potential-custom-element-name/1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - dev: true /is-reference/1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} @@ -9203,7 +8992,6 @@ packages: dependencies: call-bind: 1.0.2 has-tostringtag: 1.0.0 - dev: true /is-regexp/1.0.0: resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} @@ -9221,7 +9009,6 @@ packages: resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} dependencies: call-bind: 1.0.2 - dev: true /is-stream/2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} @@ -9232,14 +9019,12 @@ packages: engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 - dev: true /is-symbol/1.0.4: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 - dev: true /is-typed-array/1.1.10: resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} @@ -9263,7 +9048,6 @@ packages: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: call-bind: 1.0.2 - dev: true /is-weakset/2.0.2: resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} @@ -9312,7 +9096,6 @@ packages: /istanbul-lib-coverage/3.2.0: resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} engines: {node: '>=8'} - dev: true /istanbul-lib-instrument/5.2.1: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} @@ -9325,7 +9108,6 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color - dev: true /istanbul-lib-report/3.0.0: resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} @@ -9334,7 +9116,6 @@ packages: istanbul-lib-coverage: 3.2.0 make-dir: 3.1.0 supports-color: 7.2.0 - dev: true /istanbul-lib-source-maps/4.0.1: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} @@ -9345,7 +9126,6 @@ packages: source-map: 0.6.1 transitivePeerDependencies: - supports-color - dev: true /istanbul-reports/3.1.5: resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} @@ -9353,7 +9133,6 @@ packages: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.0 - dev: true /jake/10.8.5: resolution: {integrity: sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==} @@ -9364,7 +9143,6 @@ packages: chalk: 4.1.2 filelist: 1.0.4 minimatch: 3.1.2 - dev: true /jest-changed-files/27.5.1: resolution: {integrity: sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==} @@ -9373,7 +9151,6 @@ packages: '@jest/types': 27.5.1 execa: 5.1.1 throat: 6.0.1 - dev: true /jest-circus/27.5.1: resolution: {integrity: sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==} @@ -9400,7 +9177,6 @@ packages: throat: 6.0.1 transitivePeerDependencies: - supports-color - dev: true /jest-cli/27.5.1: resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==} @@ -9430,7 +9206,6 @@ packages: - supports-color - ts-node - utf-8-validate - dev: true /jest-config/27.5.1: resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} @@ -9470,7 +9245,6 @@ packages: - canvas - supports-color - utf-8-validate - dev: true /jest-diff/27.5.1: resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} @@ -9480,7 +9254,6 @@ packages: diff-sequences: 27.5.1 jest-get-type: 27.5.1 pretty-format: 27.5.1 - dev: true /jest-diff/29.3.1: resolution: {integrity: sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==} @@ -9497,7 +9270,6 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: detect-newline: 3.1.0 - dev: true /jest-each/27.5.1: resolution: {integrity: sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==} @@ -9508,7 +9280,6 @@ packages: jest-get-type: 27.5.1 jest-util: 27.5.1 pretty-format: 27.5.1 - dev: true /jest-environment-jsdom/27.5.1: resolution: {integrity: sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==} @@ -9526,7 +9297,6 @@ packages: - canvas - supports-color - utf-8-validate - dev: true /jest-environment-node/27.5.1: resolution: {integrity: sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==} @@ -9538,12 +9308,10 @@ packages: '@types/node': 18.11.9 jest-mock: 27.5.1 jest-util: 27.5.1 - dev: true /jest-get-type/27.5.1: resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dev: true /jest-get-type/29.2.0: resolution: {integrity: sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==} @@ -9568,7 +9336,6 @@ packages: walker: 1.0.8 optionalDependencies: fsevents: 2.3.2 - dev: true /jest-jasmine2/27.5.1: resolution: {integrity: sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==} @@ -9593,7 +9360,6 @@ packages: throat: 6.0.1 transitivePeerDependencies: - supports-color - dev: true /jest-leak-detector/27.5.1: resolution: {integrity: sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==} @@ -9601,7 +9367,6 @@ packages: dependencies: jest-get-type: 27.5.1 pretty-format: 27.5.1 - dev: true /jest-matcher-utils/27.5.1: resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==} @@ -9611,7 +9376,6 @@ packages: jest-diff: 27.5.1 jest-get-type: 27.5.1 pretty-format: 27.5.1 - dev: true /jest-matcher-utils/29.3.1: resolution: {integrity: sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==} @@ -9636,7 +9400,6 @@ packages: pretty-format: 27.5.1 slash: 3.0.0 stack-utils: 2.0.6 - dev: true /jest-message-util/28.1.3: resolution: {integrity: sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==} @@ -9651,7 +9414,6 @@ packages: pretty-format: 28.1.3 slash: 3.0.0 stack-utils: 2.0.6 - dev: true /jest-message-util/29.3.1: resolution: {integrity: sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==} @@ -9674,7 +9436,6 @@ packages: dependencies: '@jest/types': 27.5.1 '@types/node': 18.11.9 - dev: true /jest-pnp-resolver/1.2.2_jest-resolve@27.5.1: resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==} @@ -9686,17 +9447,14 @@ packages: optional: true dependencies: jest-resolve: 27.5.1 - dev: true /jest-regex-util/27.5.1: resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dev: true /jest-regex-util/28.0.2: resolution: {integrity: sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - dev: true /jest-resolve-dependencies/27.5.1: resolution: {integrity: sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==} @@ -9707,7 +9465,6 @@ packages: jest-snapshot: 27.5.1 transitivePeerDependencies: - supports-color - dev: true /jest-resolve/27.5.1: resolution: {integrity: sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==} @@ -9723,7 +9480,6 @@ packages: resolve: 1.22.1 resolve.exports: 1.1.0 slash: 3.0.0 - dev: true /jest-runner/27.5.1: resolution: {integrity: sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==} @@ -9755,7 +9511,6 @@ packages: - canvas - supports-color - utf-8-validate - dev: true /jest-runtime/27.5.1: resolution: {integrity: sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==} @@ -9785,7 +9540,6 @@ packages: strip-bom: 4.0.0 transitivePeerDependencies: - supports-color - dev: true /jest-serializer/27.5.1: resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} @@ -9793,7 +9547,6 @@ packages: dependencies: '@types/node': 18.11.9 graceful-fs: 4.2.10 - dev: true /jest-snapshot/27.5.1: resolution: {integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==} @@ -9823,7 +9576,6 @@ packages: semver: 7.3.8 transitivePeerDependencies: - supports-color - dev: true /jest-util/27.5.1: resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==} @@ -9835,7 +9587,6 @@ packages: ci-info: 3.5.0 graceful-fs: 4.2.10 picomatch: 2.3.1 - dev: true /jest-util/28.1.3: resolution: {integrity: sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==} @@ -9847,7 +9598,6 @@ packages: ci-info: 3.5.0 graceful-fs: 4.2.10 picomatch: 2.3.1 - dev: true /jest-util/29.3.1: resolution: {integrity: sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==} @@ -9870,7 +9620,6 @@ packages: jest-get-type: 27.5.1 leven: 3.1.0 pretty-format: 27.5.1 - dev: true /jest-watch-typeahead/1.1.0_jest@27.5.1: resolution: {integrity: sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==} @@ -9886,7 +9635,6 @@ packages: slash: 4.0.0 string-length: 5.0.1 strip-ansi: 7.0.1 - dev: true /jest-watcher/27.5.1: resolution: {integrity: sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==} @@ -9899,7 +9647,6 @@ packages: chalk: 4.1.2 jest-util: 27.5.1 string-length: 4.0.2 - dev: true /jest-watcher/28.1.3: resolution: {integrity: sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==} @@ -9913,7 +9660,6 @@ packages: emittery: 0.10.2 jest-util: 28.1.3 string-length: 4.0.2 - dev: true /jest-worker/26.6.2: resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} @@ -9922,7 +9668,6 @@ packages: '@types/node': 18.11.9 merge-stream: 2.0.0 supports-color: 7.2.0 - dev: true /jest-worker/27.5.1: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} @@ -9939,7 +9684,6 @@ packages: '@types/node': 18.11.9 merge-stream: 2.0.0 supports-color: 8.1.1 - dev: true /jest-worker/29.3.1: resolution: {integrity: sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==} @@ -9970,7 +9714,6 @@ packages: - supports-color - ts-node - utf-8-validate - dev: true /jju/1.4.0: resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} @@ -9988,7 +9731,6 @@ packages: /js-sdsl/4.1.5: resolution: {integrity: sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==} - dev: true /js-tokens/4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -10046,7 +9788,6 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: true /jsesc/0.5.0: resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} @@ -10072,11 +9813,9 @@ packages: /json-schema/0.4.0: resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} - dev: true /json-stable-stringify-without-jsonify/1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true /json2mq/0.2.0: resolution: {integrity: sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==} @@ -10089,7 +9828,6 @@ packages: hasBin: true dependencies: minimist: 1.2.7 - dev: true /json5/2.2.1: resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==} @@ -10112,7 +9850,6 @@ packages: /jsonpointer/5.0.1: resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} engines: {node: '>=0.10.0'} - dev: true /jsx-ast-utils/3.3.3: resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==} @@ -10120,7 +9857,6 @@ packages: dependencies: array-includes: 3.1.6 object.assign: 4.1.4 - dev: true /keyv/3.1.0: resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==} @@ -10146,13 +9882,11 @@ packages: /language-subtag-registry/0.3.22: resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} - dev: true /language-tags/1.0.5: resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==} dependencies: language-subtag-registry: 0.3.22 - dev: true /latest-version/5.1.0: resolution: {integrity: sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==} @@ -10171,7 +9905,6 @@ packages: dependencies: prelude-ls: 1.1.2 type-check: 0.3.2 - dev: true /levn/0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} @@ -10179,7 +9912,6 @@ packages: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true /lilconfig/2.0.6: resolution: {integrity: sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==} @@ -10247,11 +9979,9 @@ packages: /lodash.merge/4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true /lodash.sortby/4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - dev: true /lodash.uniq/4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} @@ -10316,7 +10046,6 @@ packages: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} dependencies: tmpl: 1.0.5 - dev: true /markdown-escapes/1.0.4: resolution: {integrity: sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==} @@ -10356,7 +10085,6 @@ packages: /mdn-data/2.0.4: resolution: {integrity: sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==} - dev: true /mdurl/1.0.1: resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} @@ -10451,7 +10179,6 @@ packages: engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 - dev: true /minimist/1.2.7: resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} @@ -10461,7 +10188,6 @@ packages: hasBin: true dependencies: minimist: 1.2.7 - dev: true /mkdirp/1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} @@ -10501,11 +10227,9 @@ packages: /natural-compare-lite/1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - dev: true /natural-compare/1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true /negotiator/0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} @@ -10544,7 +10268,6 @@ packages: /node-int64/0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - dev: true /node-releases/2.0.6: resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==} @@ -10580,7 +10303,6 @@ packages: resolution: {integrity: sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==} dependencies: boolbase: 1.0.0 - dev: true /nth-check/2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} @@ -10589,7 +10311,6 @@ packages: /nwsapi/2.2.2: resolution: {integrity: sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==} - dev: true /object-assign/4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} @@ -10598,7 +10319,6 @@ packages: /object-hash/3.0.0: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} - dev: true /object-inspect/1.12.2: resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} @@ -10631,7 +10351,6 @@ packages: call-bind: 1.0.2 define-properties: 1.1.4 es-abstract: 1.20.4 - dev: true /object.fromentries/2.0.6: resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} @@ -10640,7 +10359,6 @@ packages: call-bind: 1.0.2 define-properties: 1.1.4 es-abstract: 1.20.4 - dev: true /object.getownpropertydescriptors/2.1.5: resolution: {integrity: sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw==} @@ -10650,14 +10368,12 @@ packages: call-bind: 1.0.2 define-properties: 1.1.4 es-abstract: 1.20.4 - dev: true /object.hasown/1.1.2: resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==} dependencies: define-properties: 1.1.4 es-abstract: 1.20.4 - dev: true /object.values/1.1.6: resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} @@ -10666,7 +10382,6 @@ packages: call-bind: 1.0.2 define-properties: 1.1.4 es-abstract: 1.20.4 - dev: true /obuf/1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} @@ -10715,7 +10430,6 @@ packages: prelude-ls: 1.1.2 type-check: 0.3.2 word-wrap: 1.2.3 - dev: true /optionator/0.9.1: resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} @@ -10727,7 +10441,6 @@ packages: prelude-ls: 1.2.1 type-check: 0.4.0 word-wrap: 1.2.3 - dev: true /os-homedir/1.0.2: resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} @@ -10912,11 +10625,9 @@ packages: /performance-now/2.1.0: resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} - dev: true /picocolors/0.2.1: resolution: {integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==} - dev: true /picocolors/1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} @@ -10928,12 +10639,10 @@ packages: /pify/2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} - dev: true /pirates/4.0.5: resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} engines: {node: '>= 6'} - dev: true /pkg-dir/4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} @@ -10955,7 +10664,6 @@ packages: dependencies: postcss: 8.4.19 postcss-selector-parser: 6.0.10 - dev: true /postcss-browser-comments/4.0.0_o3gvceo4mmkmipwqbduijhv2ui: resolution: {integrity: sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==} @@ -10966,7 +10674,6 @@ packages: dependencies: browserslist: 4.21.4 postcss: 8.4.19 - dev: true /postcss-calc/8.2.4_postcss@8.4.19: resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} @@ -10985,7 +10692,6 @@ packages: dependencies: postcss: 8.4.19 postcss-value-parser: 4.2.0 - dev: true /postcss-color-functional-notation/4.2.4_postcss@8.4.19: resolution: {integrity: sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==} @@ -10995,7 +10701,6 @@ packages: dependencies: postcss: 8.4.19 postcss-value-parser: 4.2.0 - dev: true /postcss-color-hex-alpha/8.0.4_postcss@8.4.19: resolution: {integrity: sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==} @@ -11005,7 +10710,6 @@ packages: dependencies: postcss: 8.4.19 postcss-value-parser: 4.2.0 - dev: true /postcss-color-rebeccapurple/7.1.1_postcss@8.4.19: resolution: {integrity: sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==} @@ -11015,7 +10719,6 @@ packages: dependencies: postcss: 8.4.19 postcss-value-parser: 4.2.0 - dev: true /postcss-colormin/5.3.0_postcss@8.4.19: resolution: {integrity: sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==} @@ -11047,7 +10750,6 @@ packages: dependencies: postcss: 8.4.19 postcss-value-parser: 4.2.0 - dev: true /postcss-custom-properties/12.1.10_postcss@8.4.19: resolution: {integrity: sha512-U3BHdgrYhCrwTVcByFHs9EOBoqcKq4Lf3kXwbTi4hhq0qWhl/pDWq2THbv/ICX/Fl9KqeHBb8OVrTf2OaYF07A==} @@ -11057,7 +10759,6 @@ packages: dependencies: postcss: 8.4.19 postcss-value-parser: 4.2.0 - dev: true /postcss-custom-selectors/6.0.3_postcss@8.4.19: resolution: {integrity: sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==} @@ -11067,7 +10768,6 @@ packages: dependencies: postcss: 8.4.19 postcss-selector-parser: 6.0.10 - dev: true /postcss-dir-pseudo-class/6.0.5_postcss@8.4.19: resolution: {integrity: sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==} @@ -11077,7 +10777,6 @@ packages: dependencies: postcss: 8.4.19 postcss-selector-parser: 6.0.10 - dev: true /postcss-discard-comments/5.1.2_postcss@8.4.19: resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} @@ -11130,7 +10829,6 @@ packages: '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.19 postcss: 8.4.19 postcss-value-parser: 4.2.0 - dev: true /postcss-env-function/4.0.6_postcss@8.4.19: resolution: {integrity: sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==} @@ -11140,7 +10838,6 @@ packages: dependencies: postcss: 8.4.19 postcss-value-parser: 4.2.0 - dev: true /postcss-flexbugs-fixes/5.0.2_postcss@8.4.19: resolution: {integrity: sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==} @@ -11148,7 +10845,6 @@ packages: postcss: ^8.1.4 dependencies: postcss: 8.4.19 - dev: true /postcss-focus-visible/6.0.4_postcss@8.4.19: resolution: {integrity: sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==} @@ -11158,7 +10854,6 @@ packages: dependencies: postcss: 8.4.19 postcss-selector-parser: 6.0.10 - dev: true /postcss-focus-within/5.0.4_postcss@8.4.19: resolution: {integrity: sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==} @@ -11168,7 +10863,6 @@ packages: dependencies: postcss: 8.4.19 postcss-selector-parser: 6.0.10 - dev: true /postcss-font-variant/5.0.0_postcss@8.4.19: resolution: {integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==} @@ -11176,7 +10870,6 @@ packages: postcss: ^8.1.0 dependencies: postcss: 8.4.19 - dev: true /postcss-gap-properties/3.0.5_postcss@8.4.19: resolution: {integrity: sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==} @@ -11185,7 +10878,6 @@ packages: postcss: ^8.2 dependencies: postcss: 8.4.19 - dev: true /postcss-image-set-function/4.0.7_postcss@8.4.19: resolution: {integrity: sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==} @@ -11195,7 +10887,6 @@ packages: dependencies: postcss: 8.4.19 postcss-value-parser: 4.2.0 - dev: true /postcss-import/14.1.0_postcss@8.4.18: resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==} @@ -11219,7 +10910,6 @@ packages: postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.1 - dev: true /postcss-initial/4.0.1_postcss@8.4.19: resolution: {integrity: sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==} @@ -11227,7 +10917,6 @@ packages: postcss: ^8.0.0 dependencies: postcss: 8.4.19 - dev: true /postcss-js/4.0.0_postcss@8.4.18: resolution: {integrity: sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==} @@ -11247,7 +10936,6 @@ packages: dependencies: camelcase-css: 2.0.1 postcss: 8.4.19 - dev: true /postcss-lab-function/4.2.1_postcss@8.4.19: resolution: {integrity: sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==} @@ -11258,7 +10946,6 @@ packages: '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.19 postcss: 8.4.19 postcss-value-parser: 4.2.0 - dev: true /postcss-load-config/3.1.4_neo3lunb2qpadwxplzw7r2isgm: resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} @@ -11293,7 +10980,6 @@ packages: lilconfig: 2.0.6 postcss: 8.4.19 yaml: 1.10.2 - dev: true /postcss-loader/6.2.1_upg3rk2kpasnbk27hkqapxaxfq: resolution: {integrity: sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==} @@ -11307,7 +10993,6 @@ packages: postcss: 8.4.19 semver: 7.3.8 webpack: 5.75.0 - dev: true /postcss-loader/7.0.1_upg3rk2kpasnbk27hkqapxaxfq: resolution: {integrity: sha512-VRviFEyYlLjctSM93gAZtcJJ/iSkPZ79zWbN/1fSH+NisBByEiVLqpdVDrPLVSi8DX0oJo12kL/GppTBdKVXiQ==} @@ -11330,7 +11015,6 @@ packages: postcss: ^8.4 dependencies: postcss: 8.4.19 - dev: true /postcss-media-minmax/5.0.0_postcss@8.4.19: resolution: {integrity: sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==} @@ -11339,7 +11023,6 @@ packages: postcss: ^8.1.0 dependencies: postcss: 8.4.19 - dev: true /postcss-merge-idents/5.1.1_postcss@8.4.19: resolution: {integrity: sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw==} @@ -11469,7 +11152,6 @@ packages: dependencies: postcss: 8.4.19 postcss-selector-parser: 6.0.10 - dev: true /postcss-nesting/10.2.0_postcss@8.4.19: resolution: {integrity: sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==} @@ -11480,7 +11162,6 @@ packages: '@csstools/selector-specificity': 2.0.2_45y636a2vqremknoajyxd5nkzy postcss: 8.4.19 postcss-selector-parser: 6.0.10 - dev: true /postcss-normalize-charset/5.1.0_postcss@8.4.19: resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} @@ -11576,12 +11257,10 @@ packages: postcss: 8.4.19 postcss-browser-comments: 4.0.0_o3gvceo4mmkmipwqbduijhv2ui sanitize.css: 13.0.0 - dev: true /postcss-opacity-percentage/1.1.2: resolution: {integrity: sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w==} engines: {node: ^12 || ^14 || >=16} - dev: true /postcss-ordered-values/5.1.3_postcss@8.4.19: resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} @@ -11601,7 +11280,6 @@ packages: dependencies: postcss: 8.4.19 postcss-value-parser: 4.2.0 - dev: true /postcss-page-break/3.0.4_postcss@8.4.19: resolution: {integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==} @@ -11609,7 +11287,6 @@ packages: postcss: ^8 dependencies: postcss: 8.4.19 - dev: true /postcss-place/7.0.5_postcss@8.4.19: resolution: {integrity: sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==} @@ -11619,7 +11296,6 @@ packages: dependencies: postcss: 8.4.19 postcss-value-parser: 4.2.0 - dev: true /postcss-preset-env/7.8.2_postcss@8.4.19: resolution: {integrity: sha512-rSMUEaOCnovKnwc5LvBDHUDzpGP+nrUeWZGWt9M72fBvckCi45JmnJigUr4QG4zZeOHmOCNCZnd2LKDvP++ZuQ==} @@ -11677,7 +11353,6 @@ packages: postcss-replace-overflow-wrap: 4.0.0_postcss@8.4.19 postcss-selector-not: 6.0.1_postcss@8.4.19 postcss-value-parser: 4.2.0 - dev: true /postcss-pseudo-class-any-link/7.1.6_postcss@8.4.19: resolution: {integrity: sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==} @@ -11687,7 +11362,6 @@ packages: dependencies: postcss: 8.4.19 postcss-selector-parser: 6.0.10 - dev: true /postcss-reduce-idents/5.2.0_postcss@8.4.19: resolution: {integrity: sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg==} @@ -11724,7 +11398,6 @@ packages: postcss: ^8.0.3 dependencies: postcss: 8.4.19 - dev: true /postcss-selector-not/6.0.1_postcss@8.4.19: resolution: {integrity: sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==} @@ -11734,7 +11407,6 @@ packages: dependencies: postcss: 8.4.19 postcss-selector-parser: 6.0.10 - dev: true /postcss-selector-parser/6.0.10: resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} @@ -11790,7 +11462,6 @@ packages: dependencies: picocolors: 0.2.1 source-map: 0.6.1 - dev: true /postcss/8.4.18: resolution: {integrity: sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==} @@ -11812,12 +11483,10 @@ packages: /prelude-ls/1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} engines: {node: '>= 0.8.0'} - dev: true /prelude-ls/1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - dev: true /prepend-http/2.0.0: resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==} @@ -11833,7 +11502,6 @@ packages: /pretty-bytes/5.6.0: resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} engines: {node: '>=6'} - dev: true /pretty-error/4.0.0: resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} @@ -11848,7 +11516,6 @@ packages: ansi-regex: 5.0.1 ansi-styles: 5.2.0 react-is: 17.0.2 - dev: true /pretty-format/28.1.3: resolution: {integrity: sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==} @@ -11858,7 +11525,6 @@ packages: ansi-regex: 5.0.1 ansi-styles: 5.2.0 react-is: 18.2.0 - dev: true /pretty-format/29.3.1: resolution: {integrity: sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==} @@ -11913,7 +11579,6 @@ packages: resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} dependencies: asap: 2.0.6 - dev: true /prompts/2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} @@ -11948,7 +11613,6 @@ packages: /psl/1.9.0: resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - dev: true /pump/3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} @@ -11979,7 +11643,6 @@ packages: /q/1.5.1: resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} engines: {node: '>=0.6.0', teleport: '>=0.2.0'} - dev: true /qs/6.11.0: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} @@ -11989,7 +11652,6 @@ packages: /querystringify/2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - dev: true /queue-microtask/1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -12003,13 +11665,11 @@ packages: /quick-lru/5.1.1: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} - dev: true /raf/3.4.1: resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} dependencies: performance-now: 2.1.0 - dev: true /randombytes/2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} @@ -12582,7 +12242,6 @@ packages: raf: 3.4.1 regenerator-runtime: 0.13.10 whatwg-fetch: 3.6.2 - dev: true /react-base16-styling/0.6.0: resolution: {integrity: sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==} @@ -12633,7 +12292,6 @@ packages: - eslint - supports-color - vue-template-compiler - dev: true /react-dev-utils/12.0.1_qw7fmzhoapcndkteb5rsc33stq: resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==} @@ -12735,11 +12393,9 @@ packages: /react-is/17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - dev: true /react-is/18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - dev: true /react-json-view/1.21.3_2zx2umvpluuhvlq44va5bta2da: resolution: {integrity: sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==} @@ -12812,7 +12468,6 @@ packages: /react-refresh/0.11.0: resolution: {integrity: sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==} engines: {node: '>=0.10.0'} - dev: true /react-refresh/0.14.0: resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} @@ -12992,7 +12647,6 @@ packages: - webpack-cli - webpack-hot-middleware - webpack-plugin-serve - dev: true /react-shallow-renderer/16.15.0_react@18.2.0: resolution: {integrity: sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==} @@ -13063,7 +12717,6 @@ packages: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} dependencies: pify: 2.3.0 - dev: true /readable-stream/2.3.7: resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} @@ -13133,7 +12786,6 @@ packages: /regex-parser/2.2.11: resolution: {integrity: sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==} - dev: true /regexp.prototype.flags/1.4.3: resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} @@ -13142,12 +12794,10 @@ packages: call-bind: 1.0.2 define-properties: 1.1.4 functions-have-names: 1.2.3 - dev: true /regexpp/3.2.0: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} engines: {node: '>=8'} - dev: true /regexpu-core/4.8.0: resolution: {integrity: sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==} @@ -13281,7 +12931,6 @@ packages: /require-directory/2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - dev: true /require-from-string/2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} @@ -13303,7 +12952,6 @@ packages: engines: {node: '>=8'} dependencies: resolve-from: 5.0.0 - dev: true /resolve-from/4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} @@ -13312,7 +12960,6 @@ packages: /resolve-from/5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} - dev: true /resolve-pathname/3.0.0: resolution: {integrity: sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==} @@ -13335,12 +12982,10 @@ packages: loader-utils: 2.0.4 postcss: 7.0.39 source-map: 0.6.1 - dev: true /resolve.exports/1.1.0: resolution: {integrity: sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==} engines: {node: '>=10'} - dev: true /resolve/1.17.0: resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} @@ -13370,7 +13015,6 @@ packages: is-core-module: 2.11.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: true /responselike/1.0.2: resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==} @@ -13445,7 +13089,6 @@ packages: rollup: 2.79.1 serialize-javascript: 4.0.0 terser: 5.15.1 - dev: true /rollup-plugin-typescript2/0.34.1_aoc4guvlpr5bfeyf2nus4ubkpu: resolution: {integrity: sha512-P4cHLtGikESmqi1CA+tdMDUv8WbQV48mzPYt77TSTOPJpERyZ9TXdDgjSDix8Fkqce6soYz3+fa4lrC93IEkcw==} @@ -13468,7 +13111,6 @@ packages: hasBin: true optionalDependencies: fsevents: 2.3.2 - dev: true /rollup/3.3.0: resolution: {integrity: sha512-wqOV/vUJCYEbWsXvwCkgGWvgaEnsbn4jxBQWKpN816CqsmCimDmCNJI83c6if7QVD4v/zlyRzxN7U2yDT5rfoA==} @@ -13515,14 +13157,12 @@ packages: call-bind: 1.0.2 get-intrinsic: 1.1.3 is-regex: 1.1.4 - dev: true /safer-buffer/2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} /sanitize.css/13.0.0: resolution: {integrity: sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==} - dev: true /sass-loader/12.6.0_webpack@5.75.0: resolution: {integrity: sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==} @@ -13546,7 +13186,6 @@ packages: klona: 2.0.5 neo-async: 2.6.2 webpack: 5.75.0 - dev: true /sax/1.2.4: resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} @@ -13556,7 +13195,6 @@ packages: engines: {node: '>=10'} dependencies: xmlchars: 2.2.0 - dev: true /scheduler/0.23.0: resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} @@ -13666,7 +13304,6 @@ packages: resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} dependencies: randombytes: 2.1.0 - dev: true /serialize-javascript/6.0.0: resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} @@ -13810,7 +13447,6 @@ packages: /source-list-map/2.0.1: resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} - dev: true /source-map-js/1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} @@ -13826,7 +13462,6 @@ packages: iconv-lite: 0.6.3 source-map-js: 1.0.2 webpack: 5.75.0 - dev: true /source-map-resolve/0.6.0: resolution: {integrity: sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==} @@ -13854,14 +13489,12 @@ packages: /source-map/0.7.4: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} - dev: true /source-map/0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} dependencies: whatwg-url: 7.1.0 - dev: true /sourcemap-codec/1.4.8: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} @@ -13906,11 +13539,9 @@ packages: engines: {node: '>=10'} dependencies: escape-string-regexp: 2.0.0 - dev: true /stackframe/1.3.4: resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} - dev: true /state-toggle/1.0.3: resolution: {integrity: sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==} @@ -13943,7 +13574,6 @@ packages: dependencies: char-regex: 1.0.2 strip-ansi: 6.0.1 - dev: true /string-length/5.0.1: resolution: {integrity: sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==} @@ -13951,11 +13581,9 @@ packages: dependencies: char-regex: 2.0.1 strip-ansi: 7.0.1 - dev: true /string-natural-compare/3.0.1: resolution: {integrity: sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==} - dev: true /string-width/4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} @@ -13985,7 +13613,6 @@ packages: internal-slot: 1.0.3 regexp.prototype.flags: 1.4.3 side-channel: 1.0.4 - dev: true /string.prototype.trimend/1.0.6: resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} @@ -13993,7 +13620,6 @@ packages: call-bind: 1.0.2 define-properties: 1.1.4 es-abstract: 1.20.4 - dev: true /string.prototype.trimstart/1.0.6: resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} @@ -14001,7 +13627,6 @@ packages: call-bind: 1.0.2 define-properties: 1.1.4 es-abstract: 1.20.4 - dev: true /string_decoder/1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} @@ -14041,17 +13666,14 @@ packages: /strip-bom/3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - dev: true /strip-bom/4.0.0: resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} engines: {node: '>=8'} - dev: true /strip-comments/2.0.1: resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==} engines: {node: '>=10'} - dev: true /strip-final-newline/2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} @@ -14073,7 +13695,6 @@ packages: webpack: ^5.0.0 dependencies: webpack: 5.75.0 - dev: true /style-to-object/0.3.0: resolution: {integrity: sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==} @@ -14115,7 +13736,6 @@ packages: dependencies: has-flag: 4.0.0 supports-color: 7.2.0 - dev: true /supports-preserve-symlinks-flag/1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} @@ -14143,7 +13763,6 @@ packages: stable: 0.1.8 unquote: 1.1.1 util.promisify: 1.0.1 - dev: true /svgo/2.8.0: resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} @@ -14160,7 +13779,6 @@ packages: /symbol-tree/3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - dev: true /tailwindcss/3.2.3_neo3lunb2qpadwxplzw7r2isgm: resolution: {integrity: sha512-Xt9D4PK4zuuQCEB8bwK9JUCKmTgUwyac/6b0/42Vqhgl6YJkep+Wf5wq+5uXYfmrupdAD0YY2NY1hyZp1HjRrg==} @@ -14228,7 +13846,6 @@ packages: resolve: 1.22.1 transitivePeerDependencies: - ts-node - dev: true /tapable/1.1.3: resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} @@ -14241,7 +13858,6 @@ packages: /temp-dir/2.0.0: resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} engines: {node: '>=8'} - dev: true /tempy/0.6.0: resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==} @@ -14251,7 +13867,6 @@ packages: temp-dir: 2.0.0 type-fest: 0.16.0 unique-string: 2.0.0 - dev: true /terminal-link/2.1.1: resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} @@ -14259,7 +13874,6 @@ packages: dependencies: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 - dev: true /terser-webpack-plugin/5.3.6_webpack@5.75.0: resolution: {integrity: sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==} @@ -14301,14 +13915,12 @@ packages: '@istanbuljs/schema': 0.1.3 glob: 7.2.3 minimatch: 3.1.2 - dev: true /text-table/0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} /throat/6.0.1: resolution: {integrity: sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==} - dev: true /thunky/1.1.0: resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} @@ -14323,7 +13935,6 @@ packages: /tmpl/1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - dev: true /to-fast-properties/2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} @@ -14361,7 +13972,6 @@ packages: punycode: 2.1.1 universalify: 0.2.0 url-parse: 1.5.10 - dev: true /tr46/0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} @@ -14371,14 +13981,12 @@ packages: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} dependencies: punycode: 2.1.1 - dev: true /tr46/2.1.0: resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} engines: {node: '>=8'} dependencies: punycode: 2.1.1 - dev: true /trim-trailing-lines/1.1.4: resolution: {integrity: sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==} @@ -14394,7 +14002,6 @@ packages: /tryer/1.0.1: resolution: {integrity: sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==} - dev: true /ts-morph/16.0.0: resolution: {integrity: sha512-jGNF0GVpFj0orFw55LTsQxVYEUOCWBAbR5Ls7fTYE5pQsbW18ssTb/6UXx/GYAEjS+DQTp8VoTw0vqYMiaaQuw==} @@ -14440,11 +14047,9 @@ packages: json5: 1.0.1 minimist: 1.2.7 strip-bom: 3.0.0 - dev: true /tslib/1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: true /tslib/2.4.1: resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} @@ -14457,31 +14062,26 @@ packages: dependencies: tslib: 1.14.1 typescript: 4.8.4 - dev: true /type-check/0.3.2: resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.1.2 - dev: true /type-check/0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 - dev: true /type-detect/4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} - dev: true /type-fest/0.16.0: resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} engines: {node: '>=10'} - dev: true /type-fest/0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} @@ -14490,7 +14090,6 @@ packages: /type-fest/0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} - dev: true /type-fest/2.19.0: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} @@ -14525,7 +14124,6 @@ packages: has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - dev: true /unescape/1.0.1: resolution: {integrity: sha512-O0+af1Gs50lyH1nUu3ZyYS1cRh01Q/kUKatTOkSs7jukXE6/NebucDVxyiDsA9AQ4JC1V1jUH9EO8JX2nMDgGQ==} @@ -14647,7 +14245,6 @@ packages: /universalify/0.2.0: resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} engines: {node: '>= 4.0.0'} - dev: true /universalify/2.0.0: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} @@ -14659,12 +14256,10 @@ packages: /unquote/1.1.1: resolution: {integrity: sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==} - dev: true /upath/1.2.0: resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} engines: {node: '>=4'} - dev: true /update-browserslist-db/1.0.10_browserslist@4.21.4: resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} @@ -14730,7 +14325,6 @@ packages: dependencies: querystringify: 2.2.0 requires-port: 1.0.0 - dev: true /use-composed-ref/1.3.0_react@18.2.0: resolution: {integrity: sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==} @@ -14802,7 +14396,6 @@ packages: es-abstract: 1.20.4 has-symbols: 1.0.3 object.getownpropertydescriptors: 2.1.5 - dev: true /utila/0.4.0: resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} @@ -14834,7 +14427,6 @@ packages: '@types/istanbul-lib-coverage': 2.0.4 convert-source-map: 1.9.0 source-map: 0.7.4 - dev: true /validator/13.7.0: resolution: {integrity: sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==} @@ -14957,14 +14549,12 @@ packages: deprecated: Use your platform's native performance.now() and performance.timeOrigin. dependencies: browser-process-hrtime: 1.0.0 - dev: true /w3c-xmlserializer/2.0.0: resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} engines: {node: '>=10'} dependencies: xml-name-validator: 3.0.0 - dev: true /wait-on/6.0.1: resolution: {integrity: sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==} @@ -14984,7 +14574,6 @@ packages: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} dependencies: makeerror: 1.0.12 - dev: true /watchpack/2.4.0: resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} @@ -15008,17 +14597,14 @@ packages: /webidl-conversions/4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - dev: true /webidl-conversions/5.0.0: resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} engines: {node: '>=8'} - dev: true /webidl-conversions/6.1.0: resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} engines: {node: '>=10.4'} - dev: true /webpack-bundle-analyzer/4.7.0: resolution: {integrity: sha512-j9b8ynpJS4K+zfO5GGwsAcQX4ZHpWV+yRiHDiL+bE0XHJ8NiPYLTNVQdlFYWxtpg9lfAQNlwJg16J9AJtFSXRg==} @@ -15108,7 +14694,6 @@ packages: tapable: 2.2.1 webpack: 5.75.0 webpack-sources: 2.3.1 - dev: true /webpack-merge/5.8.0: resolution: {integrity: sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==} @@ -15123,7 +14708,6 @@ packages: dependencies: source-list-map: 2.0.1 source-map: 0.6.1 - dev: true /webpack-sources/2.3.1: resolution: {integrity: sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==} @@ -15131,7 +14715,6 @@ packages: dependencies: source-list-map: 2.0.1 source-map: 0.6.1 - dev: true /webpack-sources/3.2.3: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} @@ -15205,15 +14788,12 @@ packages: resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} dependencies: iconv-lite: 0.4.24 - dev: true /whatwg-fetch/3.6.2: resolution: {integrity: sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==} - dev: true /whatwg-mimetype/2.3.0: resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} - dev: true /whatwg-url/5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} @@ -15228,7 +14808,6 @@ packages: lodash.sortby: 4.7.0 tr46: 1.0.1 webidl-conversions: 4.0.2 - dev: true /whatwg-url/8.7.0: resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==} @@ -15237,7 +14816,6 @@ packages: lodash: 4.17.21 tr46: 2.1.0 webidl-conversions: 6.1.0 - dev: true /which-boxed-primitive/1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} @@ -15247,7 +14825,6 @@ packages: is-number-object: 1.0.7 is-string: 1.0.7 is-symbol: 1.0.4 - dev: true /which-collection/1.0.1: resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} @@ -15304,20 +14881,17 @@ packages: /word-wrap/1.2.3: resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} engines: {node: '>=0.10.0'} - dev: true /workbox-background-sync/6.5.4: resolution: {integrity: sha512-0r4INQZMyPky/lj4Ou98qxcThrETucOde+7mRGJl13MPJugQNKeZQOdIJe/1AchOP23cTqHcN/YVpD6r8E6I8g==} dependencies: idb: 7.1.1 workbox-core: 6.5.4 - dev: true /workbox-broadcast-update/6.5.4: resolution: {integrity: sha512-I/lBERoH1u3zyBosnpPEtcAVe5lwykx9Yg1k6f8/BGEPGaMMgZrwVrqL1uA9QZ1NGGFoyE6t9i7lBjOlDhFEEw==} dependencies: workbox-core: 6.5.4 - dev: true /workbox-build/6.5.4: resolution: {integrity: sha512-kgRevLXEYvUW9WS4XoziYqZ8Q9j/2ziJYEtTrjdz5/L/cTUa2XfyMP2i7c3p34lgqJ03+mTiz13SdFef2POwbA==} @@ -15363,24 +14937,20 @@ packages: transitivePeerDependencies: - '@types/babel__core' - supports-color - dev: true /workbox-cacheable-response/6.5.4: resolution: {integrity: sha512-DCR9uD0Fqj8oB2TSWQEm1hbFs/85hXXoayVwFKLVuIuxwJaihBsLsp4y7J9bvZbqtPJ1KlCkmYVGQKrBU4KAug==} dependencies: workbox-core: 6.5.4 - dev: true /workbox-core/6.5.4: resolution: {integrity: sha512-OXYb+m9wZm8GrORlV2vBbE5EC1FKu71GGp0H4rjmxmF4/HLbMCoTFws87M3dFwgpmg0v00K++PImpNQ6J5NQ6Q==} - dev: true /workbox-expiration/6.5.4: resolution: {integrity: sha512-jUP5qPOpH1nXtjGGh1fRBa1wJL2QlIb5mGpct3NzepjGG2uFFBn4iiEBiI9GUmfAFR2ApuRhDydjcRmYXddiEQ==} dependencies: idb: 7.1.1 workbox-core: 6.5.4 - dev: true /workbox-google-analytics/6.5.4: resolution: {integrity: sha512-8AU1WuaXsD49249Wq0B2zn4a/vvFfHkpcFfqAFHNHwln3jK9QUYmzdkKXGIZl9wyKNP+RRX30vcgcyWMcZ9VAg==} @@ -15389,13 +14959,11 @@ packages: workbox-core: 6.5.4 workbox-routing: 6.5.4 workbox-strategies: 6.5.4 - dev: true /workbox-navigation-preload/6.5.4: resolution: {integrity: sha512-IIwf80eO3cr8h6XSQJF+Hxj26rg2RPFVUmJLUlM0+A2GzB4HFbQyKkrgD5y2d84g2IbJzP4B4j5dPBRzamHrng==} dependencies: workbox-core: 6.5.4 - dev: true /workbox-precaching/6.5.4: resolution: {integrity: sha512-hSMezMsW6btKnxHB4bFy2Qfwey/8SYdGWvVIKFaUm8vJ4E53JAY+U2JwLTRD8wbLWoP6OVUdFlXsTdKu9yoLTg==} @@ -15403,13 +14971,11 @@ packages: workbox-core: 6.5.4 workbox-routing: 6.5.4 workbox-strategies: 6.5.4 - dev: true /workbox-range-requests/6.5.4: resolution: {integrity: sha512-Je2qR1NXCFC8xVJ/Lux6saH6IrQGhMpDrPXWZWWS8n/RD+WZfKa6dSZwU+/QksfEadJEr/NfY+aP/CXFFK5JFg==} dependencies: workbox-core: 6.5.4 - dev: true /workbox-recipes/6.5.4: resolution: {integrity: sha512-QZNO8Ez708NNwzLNEXTG4QYSKQ1ochzEtRLGaq+mr2PyoEIC1xFW7MrWxrONUxBFOByksds9Z4//lKAX8tHyUA==} @@ -15420,30 +14986,25 @@ packages: workbox-precaching: 6.5.4 workbox-routing: 6.5.4 workbox-strategies: 6.5.4 - dev: true /workbox-routing/6.5.4: resolution: {integrity: sha512-apQswLsbrrOsBUWtr9Lf80F+P1sHnQdYodRo32SjiByYi36IDyL2r7BH1lJtFX8fwNHDa1QOVY74WKLLS6o5Pg==} dependencies: workbox-core: 6.5.4 - dev: true /workbox-strategies/6.5.4: resolution: {integrity: sha512-DEtsxhx0LIYWkJBTQolRxG4EI0setTJkqR4m7r4YpBdxtWJH1Mbg01Cj8ZjNOO8etqfA3IZaOPHUxCs8cBsKLw==} dependencies: workbox-core: 6.5.4 - dev: true /workbox-streams/6.5.4: resolution: {integrity: sha512-FXKVh87d2RFXkliAIheBojBELIPnWbQdyDvsH3t74Cwhg0fDheL1T8BqSM86hZvC0ZESLsznSYWw+Va+KVbUzg==} dependencies: workbox-core: 6.5.4 workbox-routing: 6.5.4 - dev: true /workbox-sw/6.5.4: resolution: {integrity: sha512-vo2RQo7DILVRoH5LjGqw3nphavEjK4Qk+FenXeUsknKn14eCNedHOXWbmnvP4ipKhlE35pvJ4yl4YYf6YsJArA==} - dev: true /workbox-webpack-plugin/6.5.4_webpack@5.75.0: resolution: {integrity: sha512-LmWm/zoaahe0EGmMTrSLUi+BjyR3cdGEfU3fS6PN1zKFYbqAKuQ+Oy/27e4VSXsyIwAw8+QDfk1XHNGtZu9nQg==} @@ -15460,14 +15021,12 @@ packages: transitivePeerDependencies: - '@types/babel__core' - supports-color - dev: true /workbox-window/6.5.4: resolution: {integrity: sha512-HnLZJDwYBE+hpG25AQBO8RUWBJRaCsI9ksQJEp3aCOFCaG5kqaToAYXFRAHxzRluM2cQbGzdQF5rjKPWPA1fug==} dependencies: '@types/trusted-types': 2.0.2 workbox-core: 6.5.4 - dev: true /wrap-ansi/7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} @@ -15535,11 +15094,9 @@ packages: /xml-name-validator/3.0.0: resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} - dev: true /xmlchars/2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - dev: true /xtend/4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} @@ -15548,7 +15105,6 @@ packages: /y18n/5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - dev: true /yallist/4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} @@ -15560,7 +15116,6 @@ packages: /yargs-parser/20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} - dev: true /yargs/16.2.0: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} @@ -15573,7 +15128,6 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 20.2.9 - dev: true /yn/3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==}