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/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", diff --git a/packages/devtools-extension/src/DevModeApp.tsx b/packages/devtools-extension/src/DevModeApp.tsx index 93b638a5..e3a11193 100644 --- a/packages/devtools-extension/src/DevModeApp.tsx +++ b/packages/devtools-extension/src/DevModeApp.tsx @@ -1,13 +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"; -const counterSource = createSource("counter", null, {initialValue: 0}); 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 112be324..bd3bf66f 100644 --- a/packages/devtools-extension/src/DevtoolsView/CurrentJournalDisplay.tsx +++ b/packages/devtools-extension/src/DevtoolsView/CurrentJournalDisplay.tsx @@ -13,21 +13,34 @@ const CurrentJournalDisplay = React.memo(function Journal({lane}: { lane: string display: 'flex', flexDirection: 'row', height: '100%', - padding: 0 + padding: 0, + borderRadius: 8, }}>
-
- + borderRadius: 8, + // backgroundColor: "red", + }} className='main-bg'> +
+
+ +
-
+
); @@ -194,11 +207,14 @@ function CurrentJson() { return null; } return ( -
+
+
@@ -83,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; @@ -134,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 ?? {}; @@ -154,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 ( -
- -
- +
+
+
+ +
+
+ +
+ +
); } @@ -389,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 ( <> )} - {visible && (
- {allowResize && } - setVisible(false)}/> -
)} + {visible && ( +
+ {allowResize && } + setVisible(false)}/> +
+ )} ); } diff --git a/packages/devtools-extension/src/DevtoolsView/sources.ts b/packages/devtools-extension/src/DevtoolsView/sources.ts index 269b03bc..819eda73 100644 --- a/packages/devtools-extension/src/DevtoolsView/sources.ts +++ b/packages/devtools-extension/src/DevtoolsView/sources.ts @@ -16,7 +16,7 @@ type Journal = { key: string, journal: any[], state: State, - subscriptions: string[] + subscriptions: any[] }; // stores data related to any async state export const journalSource = createSource("journal", null, {hideFromDevtools: true}); @@ -77,7 +77,8 @@ function gatewayProducer(props) { } case DevtoolsEvent.setAsyncState: { updatesMeter.setState(old => old.data + 1); - return journalSource.getLaneSource(`${message.uniqueId}`).setState(message.payload); + journalSource.getLaneSource(`${message.uniqueId}`).setState(message.payload); + return ; } case DevtoolsEvent.partialSync: { applyPartialUpdate(message); @@ -95,13 +96,14 @@ function gatewayProducer(props) { } function applyPartialUpdate(message) { + const {eventType} = message.payload; switch (eventType) { case DevtoolsJournalEvent.run: { journalSource.getLaneSource(`${message.uniqueId}`).setState(old => { return { - ...old.data, - journal: [...old.data.journal, message.payload], + ...(old.data ?? {}), + journal: [...(old.data?.journal ?? []), message.payload], } }); return; @@ -110,11 +112,11 @@ function applyPartialUpdate(message) { updatesMeter.setState(old => old.data + 1); journalSource.getLaneSource(`${message.uniqueId}`).setState(old => { return { - ...old.data, + ...(old.data ?? {}), state: message.payload.eventPayload.newState, oldState: message.payload.eventPayload.oldState, lastSuccess: message.payload.eventPayload.lastSuccess, - journal: [...old.data.journal, message.payload], + journal: [...(old.data?.journal ?? []), message.payload], } }); return; @@ -124,8 +126,8 @@ function applyPartialUpdate(message) { let prevData = old.data ?? {}; return { ...prevData, - subscriptions: [...prevData.subscriptions, message.payload.eventPayload], - journal: [...prevData.journal, message.payload], + subscriptions: [...(prevData.subscriptions ?? []), message.payload.eventPayload], + journal: [...(prevData.journal ?? []), message.payload], } }); return; @@ -133,10 +135,12 @@ function applyPartialUpdate(message) { case DevtoolsJournalEvent.unsubscription: { journalSource.getLaneSource(`${message.uniqueId}`).setState(old => { let prevData = old.data ?? {}; + + console.log('haha', prevData.subscriptions, message.payload.eventPayload) return { ...prevData, - subscriptions: prevData.subscriptions?.filter(t => t !== message.payload.eventPayload), - journal: [...prevData.journal, message.payload], + subscriptions: (prevData.subscriptions ?? [])?.filter(t => t.key !== message.payload.eventPayload), + journal: [...(prevData.journal ?? []), message.payload], } }); return; diff --git a/packages/devtools-extension/src/index.css b/packages/devtools-extension/src/index.css index e80df572..15d6660c 100644 --- a/packages/devtools-extension/src/index.css +++ b/packages/devtools-extension/src/index.css @@ -4,12 +4,16 @@ body{ :root { --bg-color: #1D2129; + --bg-2-color: #1a1c21; --text-color: white; } .main-bg { background-color: var(--bg-color); } +.main-bg-2 { + background-color: var(--bg-2-color); +} .main-color { color: var(--text-color); @@ -172,8 +176,31 @@ body{ .resizer { z-index: 99; + position: absolute; + top: 0; + width: 100%; height: 4px; background-color: black; 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; + } +} diff --git a/packages/docs/docs/api/0-the-whole-api.md b/packages/docs/docs/api/0-the-whole-api.md index 73959cf6..0ed302b5 100644 --- a/packages/docs/docs/api/0-the-whole-api.md +++ b/packages/docs/docs/api/0-the-whole-api.md @@ -51,8 +51,8 @@ const { keepState, // copy the state from the initial instance keepCache, // copy the cache from the initial instance }, - hoistToProvider, // whether to hoist the instance to the nearest provider - hoistToProviderConfig: { + hoist, // whether to hoist the instance to the nearest provider + hoistConfig: { override, // whether to override any existing instance }, lazy, // whether to automatically run the producer if the condition is truthy diff --git a/packages/docs/docs/api/1-producer-function.md b/packages/docs/docs/api/1-producer-function.md index 38ed258f..8a9a5e52 100644 --- a/packages/docs/docs/api/1-producer-function.md +++ b/packages/docs/docs/api/1-producer-function.md @@ -168,7 +168,7 @@ export type ProducerConfig = { initialValue?: T | ((cache: Record>) => T), cacheConfig?: CacheConfig, runEffectDurationMs?: number, - runEffect?: ProducerRunEffects, + runEffect?: RunEffect, skipPendingDelayMs?: number, resetStateOnDispose?: boolean, } @@ -331,7 +331,7 @@ instantly and imperatively to the desired value. Signature: ```typescript -emit: (updater: T | StateFunctionUpdater, status: AsyncStateStatus) => void +emit: (updater: T | StateFunctionUpdater, status: Status) => void ``` This feature allows the following easily: diff --git a/packages/docs/docs/api/4-use-async-state.md b/packages/docs/docs/api/4-use-async-state.md index 042e98c0..b7ad61d5 100644 --- a/packages/docs/docs/api/4-use-async-state.md +++ b/packages/docs/docs/api/4-use-async-state.md @@ -88,8 +88,8 @@ Let's see in details the supported configuration: | `skipPendingDelayMs` | `number > 0` | `undefined` | The duration under which a state update with a pending status may be skipped. The component in this case won't render with a pending status if it gets updated to something else under that delay. | | `initialValue` | `any` | `null` | The initial state value, the initializer receives the cache as unique parameter | | `events` | `UseAsyncStateEvents` | `undefined` | Defines events that will be invoked with this subscription. | -| `hoistToProvider` | `boolean` | `false` | Defines whether to hoist this state to the provider or not | -| `hoistToProviderConfig` | `HoistConfig` | `{override: false}` | Defines the configuration associated with `hoistToProvider = true` | +| `hoist` | `boolean` | `false` | Defines whether to hoist this state to the provider or not | +| `hoistConfig` | `HoistConfig` | `{override: false}` | Defines the configuration associated with `hoist = true` | The returned object from `useAsyncState` contains the following properties: @@ -138,7 +138,7 @@ const {state: {data, status}} = useAsyncState({key: "current-user", producer: cu const {state: {data: transactions, status}} = useAsyncState("transactions"); // injects the users list state -const {state: {data, status}} = useAsyncState({key: "users-list", producer: usersListPromise, lazy: false, payload: {storeId}, hoistToProvider: true}); +const {state: {data, status}} = useAsyncState({key: "users-list", producer: usersListPromise, lazy: false, payload: {storeId}, hoist: true}); // forks the list of transactions for another store (for preview for example) // this will create another async state issued from users-list -with a new key (forked)- without impacting its state @@ -205,7 +205,7 @@ useAsyncState({ } return {...props.lastSuccess.data, [name]: value}; }, - hoistToProvider: true, + hoist: true, initialValue: {} }); // later @@ -281,13 +281,13 @@ useAsyncState(function* myProducer() { The key received by `useAsyncState` works as the following: - If inside a provider - If the `key` matches something in the provider - - If neither `hoistToProvider` nor `fork` is truthy, + - If neither `hoist` nor `fork` is truthy, then we are `listening` to a state - - If `hoistToProvider = true`, attempts to override it with a new + - If `hoist = true`, attempts to override it with a new created state from given `producer` and `hositToProviderConfiguration`. - If `fork = true`, forks from the matched state. - If there is no such a `key` in the provider - - If `hoistToProvider = true`, hoists the created state with the given + - If `hoist = true`, hoists the created state with the given `producer` and other related properties. - If outside the provider, a new state is created. @@ -340,7 +340,7 @@ useAsyncState({ useAsyncState({ key: "my-key", producer: myProducer, - hoistToProvider: true, + hoist: true, }); // defines a new state with the given producer and hoists it to provider @@ -351,8 +351,8 @@ useAsyncState({ useAsyncState({ key: "my-key", producer: myProducer, - hoistToProvider: true, - hoistToProviderConfig: { + hoist: true, + hoistConfig: { override: true, } }); @@ -522,11 +522,11 @@ useAsyncState({ }) ``` -### `hoistToProvider` +### `hoist` This property is relevant only if inside a provider, -If set to true, it will `hoist` the state with the given `hoistToProviderConfig`. +If set to true, it will `hoist` the state with the given `hoistConfig`. -### `hoistToProviderConfig` +### `hoistConfig` A configuration object containing the following: | Property | Type | Default Value | Description | @@ -546,7 +546,7 @@ It is a function with the following in order parameters: ```typescript // extend the given state -import {State, AsyncStateStatus, useAsyncState, UseAsyncState} from "react-async-states"; +import {State, Status, useAsyncState, UseAsyncState} from "react-async-states"; // syncSelector // if you want that your state is always synchronous @@ -559,7 +559,7 @@ function syncSelector(state: State): E { // error boundary function errorBoundarySelector(state: State): E { // assuming you have an error boundary - if (state.status === AsyncStateStatus.error) { + if (state.status === Status.error) { throw state.data; } return state; @@ -567,7 +567,7 @@ function errorBoundarySelector(state: State): E { // this selector gives the last success data function keepPreviousDataSelector(state: State, lastSuccess): E { - if (state.status === AsyncStateStatus.pending) { + if (state.status === Status.pending) { return { ...state, data: lastSuccess.data, @@ -588,8 +588,8 @@ function errorBoundarySelector(state, lastSuccess, cache): E { function lazyDeveloperSelector(state: State) { return { ...state, - isError: state.status === AsyncStateStatus.error, - isPending: state.status === AsyncStateStatus.pending, + isError: state.status === Status.error, + isPending: state.status === Status.pending, isWeird: false, ... } @@ -860,29 +860,6 @@ const {source} = useAsyncState(); ### `uniqueId` This is only used in development mode and was originally added with the devtools. -### `mode` -This corresponds to `AsyncStateSubscriptionMode` - -Here is the full list: - -```typescript - -enum AsyncStateSubscriptionMode { - LISTEN = "LISTEN", - HOIST = "HOIST", - STANDALONE = "STANDALONE", - WAITING = "WAITING", - FORK = "FORK", - NOOP = "NOOP", - SOURCE = "SOURCE", - SOURCE_FORK = "SOURCE_FORK", - OUTSIDE_PROVIDER = "OUTSIDE_PROVIDER", -} - -``` - -Read more about it [here](/docs/faq/how-the-library-works#how-useasyncstate-subscription-mode-works-). - In general, you would never use this (unless you are a contributor and debugging things). ### `state` @@ -1098,7 +1075,7 @@ replaceState is of type : `StateUpdater`: ```typescript type StateUpdater = ( updater: T | StateFunctionUpdater, - status?: AsyncStateStatus + status?: Status ) => void; ``` @@ -1137,8 +1114,8 @@ The following are all hooks with the same signature as `useAsyncState`, but each - `useAsyncState.auto`: adds `lazy: false` to configuration - `useAsyncState.lazy`: adds `lazy: true` to configuration - `useAsyncState.fork`: adds `fork: true` to configuration -- `useAsyncState.hoist`: adds `hoistToProvider: true` to configuration -- `useAsyncState.hoistAuto`: adds `lazy: false, hoistToProvider: true` to configuration +- `useAsyncState.hoist`: adds `hoist: true` to configuration +- `useAsyncState.hoistAuto`: adds `lazy: false, hoist: true` to configuration - `useAsyncState.forkAudo`: adds `lazy: false, fork: true` to configuration The following snippets results from the previous hooks: diff --git a/packages/docs/docs/faq/how-the-library-works.md b/packages/docs/docs/faq/how-the-library-works.md index 531a35f3..809e03bf 100644 --- a/packages/docs/docs/faq/how-the-library-works.md +++ b/packages/docs/docs/faq/how-the-library-works.md @@ -98,7 +98,7 @@ function runImmediately( ...execArgs: any[] ): AbortFn { - if (this.currentState.status === AsyncStateStatus.pending) { + if (this.currentState.status === Status.pending) { this.abort(); this.currentAborter = undefined; } else if (isFn(this.currentAborter)) { @@ -130,7 +130,7 @@ function runImmediately( function emit( updater: T | StateFunctionUpdater, - status?: AsyncStateStatus + status?: Status ): void { // (...) warning and quit execution that.replaceState(updater, status); @@ -273,12 +273,12 @@ export function standaloneProducerEffectsCreator(props: ProducerProps): Pr ```typescript function replaceState( newValue: T | StateFunctionUpdater, - status = AsyncStateStatus.success + status = Status.success ): void { if (!StateBuilder[status]) { throw new Error(`Couldn't replace state to unknown status ${status}.`); } - if (this.currentState.status === AsyncStateStatus.pending) { + if (this.currentState.status === Status.pending) { this.abort(); this.currentAborter = undefined; } @@ -381,7 +381,7 @@ function makeContextValue(): AsyncStateContextValue { watchAll: manager.watchAll, getAllKeys: manager.getAllKeys, notifyWatchers: manager.notifyWatchers, - producerEffectsCreator: manager.producerEffectsCreator, + createEffects: manager.createEffects, }; } ``` @@ -428,9 +428,9 @@ const asyncStateEntries: AsyncStateEntries = Object watchAll, getAllKeys, notifyWatchers, - setInitialStates + setStates }; - output.producerEffectsCreator = createProducerEffectsCreator(output); + output.createEffects = createProducerEffectsCreator(output); return output; ``` diff --git a/packages/docs/docs/tutorial/state-sharing.md b/packages/docs/docs/tutorial/state-sharing.md index d5793692..03073d6a 100644 --- a/packages/docs/docs/tutorial/state-sharing.md +++ b/packages/docs/docs/tutorial/state-sharing.md @@ -182,7 +182,7 @@ This is a basic example of how to share state using the provider. :::tip The provider also supports adding dynamically states at runtime, -in fact, useAsyncState accepts a configuration property [`hoistToProvider`](/docs/api/use-async-state#hoisttoprovider). +in fact, useAsyncState accepts a configuration property [`hoist`](/docs/api/use-async-state#hoist). When provided while inside provider, the state will become available. diff --git a/packages/react-async-states/README.MD b/packages/react-async-states/README.MD index e6d45030..a6df3f07 100644 --- a/packages/react-async-states/README.MD +++ b/packages/react-async-states/README.MD @@ -31,7 +31,7 @@ The library can work with the following modes: #### Easy to use and Minimal API (`useAsyncState`). The library has one main hook: `useAsyncState` which allows the creation, subscription and manipulation of the desired state. -[Here is a sneak peek](https://incepter.github.io/react-async-states/docs/api/the-whole-api#useasyncstate) +[Here is a sneak peek](https://incepter.github.io/react-async-states/docs/api/the-whole-api#useasyncstate) at this hook's full API. #### Tiny library with no dependencies and works in all environments @@ -52,11 +52,11 @@ hook configuration, while also providing a multiple imperative `run` functions with different signatures to answer your needs. #### Promises, async/await & generators support -The `producer`, the core concept of the library can be of different forms (you +The `producer`, the core concept of the library can be of different forms (you can even omit it and manipulate the state directly, without a producer function): -Either return a promise (thenable) to your state, use async/await syntax or go -generators. All of these are supported by the library out of the box and +Either return a promise (thenable) to your state, use async/await syntax or go +generators. All of these are supported by the library out of the box and no configuration is needed. ```typescript @@ -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. @@ -134,18 +134,18 @@ The library can work without the provider and still share state via the To avoid creating additional state pieces and third party utilities, the library has out-of-the box support for effects that can be applied to runs: such as `debounce`, and `throttle` and `delay`. -This support allows you to create awesome user experience natively with the +This support allows you to create awesome user experience natively with the minimum CPU and RAM fingerprints, without additional libraries or managed 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,18 +163,18 @@ 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, - + // cache config: cacheConfig: { enabled: true, // enable cache diff --git a/packages/react-async-states/package.json b/packages/react-async-states/package.json index 2c9fab8e..dcf86179 100644 --- a/packages/react-async-states/package.json +++ b/packages/react-async-states/package.json @@ -17,7 +17,7 @@ "test:watch": "react-scripts test --env=jsdom", "clean:dist": "rimraf dist", "start": "pnpm dev", - "prebuild": "rimraf dist", + "prebuild": "pnpm test && rimraf dist", "build": "pnpm clean:dist && rollup -c rollup/rollup.config.js", "dev": "pnpm clean:dist && rollup -c rollup/rollup.config.dev.js -w" }, diff --git a/packages/react-async-states/rollup/rollup.config.js b/packages/react-async-states/rollup/rollup.config.js index 6e273261..ff2e1012 100644 --- a/packages/react-async-states/rollup/rollup.config.js +++ b/packages/react-async-states/rollup/rollup.config.js @@ -119,7 +119,11 @@ const webModulesBuild = [ } }), commonjs(), - terser(), + terser({ + compress: { + reduce_funcs: false, + } + }), replace({ preventAssignment: true, values: {"process.env.NODE_ENV": JSON.stringify("production")}, @@ -208,7 +212,11 @@ const umdBuild = [ }), commonjs(), gzipPlugin.default(), - terser(), + terser({ + compress: { + reduce_funcs: false, + } + }), copy({ targets: [ { @@ -259,7 +267,11 @@ const devtoolsSharedBuild = [ } }), commonjs(), - terser(), + terser({ + compress: { + reduce_funcs: false, + } + }), // copy({ // hook: 'closeBundle', diff --git a/packages/react-async-states/src/__tests__/async-state/AsyncState.fork.test.ts b/packages/react-async-states/src/__tests__/async-state/AsyncState.fork.test.ts index fceadbc5..a668d9a5 100644 --- a/packages/react-async-states/src/__tests__/async-state/AsyncState.fork.test.ts +++ b/packages/react-async-states/src/__tests__/async-state/AsyncState.fork.test.ts @@ -1,4 +1,4 @@ -import AsyncState, { AsyncStateStatus } from "../../async-state"; +import AsyncState, { Status } from "../../async-state"; import { shallowClone } from "../../shared"; import { act } from "@testing-library/react-hooks"; import { timeout } from "./test-utils"; @@ -24,8 +24,8 @@ describe('AsyncState - fork', () => { expect(myAsyncState.subscriptions).toBe(null); expect(typeof myAsyncState.run).toBe("function"); expect(myAsyncState.config).toEqual(shallowClone(myConfig)); - expect(myAsyncState.lastSuccess).toEqual({props: null, data: null, status: AsyncStateStatus.initial, timestamp: TESTS_TS}); - expect(myAsyncState.state).toEqual({data: null, status: AsyncStateStatus.initial, props: null, timestamp: TESTS_TS}); + expect(myAsyncState.lastSuccess).toEqual({props: null, data: null, status: Status.initial, timestamp: TESTS_TS}); + expect(myAsyncState.state).toEqual({data: null, status: Status.initial, props: null, timestamp: TESTS_TS}); let forkedAsyncState = myAsyncState.fork(); expect(myAsyncState.forksIndex).toBe(1); @@ -53,7 +53,7 @@ describe('AsyncState - fork', () => { await jest.advanceTimersByTime(100); }); - expect(myAsyncState.state.status).toBe(AsyncStateStatus.success); // make sure it resolved + expect(myAsyncState.state.status).toBe(Status.success); // make sure it resolved let forkedAsyncState = myAsyncState.fork({keepState: true}); // then @@ -80,7 +80,7 @@ describe('AsyncState - fork', () => { await jest.advanceTimersByTime(100); }); - expect(forkedAsyncState.state.status).toBe(AsyncStateStatus.success); // make sure it resolved + expect(forkedAsyncState.state.status).toBe(Status.success); // make sure it resolved // then expect(myAsyncState.lastSuccess).not.toEqual(forkedAsyncState.lastSuccess);// forked async state moved independently diff --git a/packages/react-async-states/src/__tests__/async-state/AsyncState.run.abort.test.ts b/packages/react-async-states/src/__tests__/async-state/AsyncState.run.abort.test.ts index e93a01f3..ca14440f 100644 --- a/packages/react-async-states/src/__tests__/async-state/AsyncState.run.abort.test.ts +++ b/packages/react-async-states/src/__tests__/async-state/AsyncState.run.abort.test.ts @@ -1,5 +1,5 @@ import { act } from "@testing-library/react-hooks"; -import AsyncState, { AsyncStateStatus } from "../../async-state"; +import AsyncState, { Status } from "../../async-state"; import { rejectionTimeout, timeout } from "./test-utils"; import { mockDateNow, TESTS_TS } from "../react-async-state/utils/setup"; import {standaloneProducerEffectsCreator} from "../../async-state/AsyncState"; @@ -19,14 +19,14 @@ describe('AsyncState - run - abort', () => { // when let myAsyncState = new AsyncState(key, producer, myConfig); - myAsyncState.subscribe(subscription); + myAsyncState.subscribe({cb: subscription}); // then // should have initial status expect(myAsyncState.state).toEqual({ props: null, data: null, timestamp: TESTS_TS, - status: AsyncStateStatus.initial, + status: Status.initial, }); const abort = myAsyncState.run(standaloneProducerEffectsCreator); @@ -43,12 +43,12 @@ describe('AsyncState - run - abort', () => { payload: {}, lastSuccess: { timestamp: TESTS_TS, - data: null, status: AsyncStateStatus.initial, + data: null, status: Status.initial, }, }, data: null, timestamp: TESTS_TS, - status: AsyncStateStatus.pending, + status: Status.pending, }); subscription.mockClear(); @@ -59,13 +59,13 @@ describe('AsyncState - run - abort', () => { props: { args: [], lastSuccess: { - data: null, status: AsyncStateStatus.initial, timestamp: TESTS_TS, + data: null, status: Status.initial, timestamp: TESTS_TS, }, payload: {} }, data: "reason", timestamp: TESTS_TS, - status: AsyncStateStatus.aborted, + status: Status.aborted, }); expect(myAsyncState.state).toEqual({ @@ -73,13 +73,13 @@ describe('AsyncState - run - abort', () => { args: [], lastSuccess: { timestamp: TESTS_TS, - data: null, status: AsyncStateStatus.initial + data: null, status: Status.initial }, payload: {} }, timestamp: TESTS_TS, data: "reason", - status: AsyncStateStatus.aborted, + status: Status.aborted, }); await act(async () => { @@ -92,12 +92,12 @@ describe('AsyncState - run - abort', () => { args: [], lastSuccess: { timestamp: TESTS_TS, - data: null, status: AsyncStateStatus.initial + data: null, status: Status.initial }, payload: {} }, timestamp: TESTS_TS, - status: AsyncStateStatus.aborted, + status: Status.aborted, data: "reason", }); }); @@ -111,7 +111,7 @@ describe('AsyncState - run - abort', () => { // when let myAsyncState = new AsyncState(key, producer, myConfig); - myAsyncState.subscribe(subscription); + myAsyncState.subscribe({cb: subscription}); // then const abort = myAsyncState.run(standaloneProducerEffectsCreator); @@ -122,7 +122,7 @@ describe('AsyncState - run - abort', () => { subscription.mockClear(); abort("reason"); - expect(subscription.mock.calls[0][0].status).toBe(AsyncStateStatus.aborted); + expect(subscription.mock.calls[0][0].status).toBe(Status.aborted); // now, let's check that a second call to the abort function does not update state or subscribers subscription.mockClear(); @@ -144,11 +144,11 @@ describe('AsyncState - run - abort', () => { lastSuccess: { data: null, timestamp: TESTS_TS, - status: AsyncStateStatus.initial, + status: Status.initial, }, }, timestamp: TESTS_TS, - status: AsyncStateStatus.aborted, + status: Status.aborted, data: "reason", }); }); @@ -162,7 +162,7 @@ describe('AsyncState - run - abort', () => { // when let myAsyncState = new AsyncState(key, producer, myConfig); - myAsyncState.subscribe(subscription); + myAsyncState.subscribe({cb: subscription}); // then myAsyncState.run(standaloneProducerEffectsCreator); @@ -171,13 +171,13 @@ describe('AsyncState - run - abort', () => { await jest.advanceTimersByTime(50); }); - expect(myAsyncState.state.status).toBe(AsyncStateStatus.pending); + expect(myAsyncState.state.status).toBe(Status.pending); // rerun while pending should interrupt previous subscription.mockClear(); myAsyncState.run(standaloneProducerEffectsCreator); - expect(subscription.mock.calls[0][0].status).toBe(AsyncStateStatus.pending); + expect(subscription.mock.calls[0][0].status).toBe(Status.pending); expect(subscription).toHaveBeenCalledTimes(1); @@ -192,12 +192,12 @@ describe('AsyncState - run - abort', () => { args: [], lastSuccess: { timestamp: TESTS_TS, - data: null, status: AsyncStateStatus.initial + data: null, status: Status.initial }, payload: {} }, timestamp: TESTS_TS, - status: AsyncStateStatus.success, + status: Status.success, data: "value", }); }); diff --git a/packages/react-async-states/src/__tests__/async-state/AsyncState.run.test.ts b/packages/react-async-states/src/__tests__/async-state/AsyncState.run.test.ts index c410037c..3ab68cf9 100644 --- a/packages/react-async-states/src/__tests__/async-state/AsyncState.run.test.ts +++ b/packages/react-async-states/src/__tests__/async-state/AsyncState.run.test.ts @@ -1,5 +1,5 @@ import { act } from "@testing-library/react-hooks"; -import AsyncState, { AsyncStateStatus } from "../../async-state"; +import AsyncState, { Status } from "../../async-state"; import { rejectionTimeout, timeout } from "./test-utils"; import { mockDateNow, TESTS_TS } from "../react-async-state/utils/setup"; import {standaloneProducerEffectsCreator} from "../../async-state/AsyncState"; @@ -24,7 +24,7 @@ describe('AsyncState - run', () => { props: null, data: null, timestamp: TESTS_TS, - status: AsyncStateStatus.initial, + status: Status.initial, }); myAsyncState.run(standaloneProducerEffectsCreator); @@ -36,12 +36,12 @@ describe('AsyncState - run', () => { lastSuccess: { data: null, timestamp: TESTS_TS, - status: AsyncStateStatus.initial, + status: Status.initial, }, }, data: null, timestamp: TESTS_TS, - status: AsyncStateStatus.pending, + status: Status.pending, }); await act(async () => { @@ -55,12 +55,12 @@ describe('AsyncState - run', () => { lastSuccess: { data: null, timestamp: TESTS_TS, - status: AsyncStateStatus.initial, + status: Status.initial, }, }, data: null, timestamp: TESTS_TS, - status: AsyncStateStatus.pending, + status: Status.pending, }); await act(async () => { @@ -74,11 +74,11 @@ describe('AsyncState - run', () => { lastSuccess: { data: null, timestamp: TESTS_TS, - status: AsyncStateStatus.initial, + status: Status.initial, }, }, timestamp: TESTS_TS, - status: AsyncStateStatus.success, + status: Status.success, data: [{id: 1, description: "value"}], }); }); @@ -104,11 +104,11 @@ describe('AsyncState - run', () => { lastSuccess: { data: null, timestamp: TESTS_TS, - status: AsyncStateStatus.initial, + status: Status.initial, }, }, timestamp: TESTS_TS, - status: AsyncStateStatus.error, + status: Status.error, data: "Some Error", }); }); diff --git a/packages/react-async-states/src/__tests__/async-state/AsyncState.setState.test.ts b/packages/react-async-states/src/__tests__/async-state/AsyncState.setState.test.ts index 3d1afa90..9a624fd1 100644 --- a/packages/react-async-states/src/__tests__/async-state/AsyncState.setState.test.ts +++ b/packages/react-async-states/src/__tests__/async-state/AsyncState.setState.test.ts @@ -1,4 +1,4 @@ -import AsyncState, { AsyncStateStatus, StateBuilder } from "../../async-state"; +import AsyncState, { Status, StateBuilder } from "../../async-state"; import { timeout } from "./test-utils"; import { mockDateNow, TESTS_TS } from "../react-async-state/utils/setup"; @@ -13,7 +13,7 @@ describe('AsyncState - setState', () => { let myConfig = {initialValue: null}; let myAsyncState = new AsyncState(key, producer, myConfig); let subscription = jest.fn(); - myAsyncState.subscribe(subscription); + myAsyncState.subscribe({cb: subscription}); beforeEach(() => { subscription.mockClear(); @@ -27,7 +27,7 @@ describe('AsyncState - setState', () => { props: {}, data: null, timestamp: TESTS_TS, - status: AsyncStateStatus.pending, + status: Status.pending, }; expect(myAsyncState.state).toEqual(expectedState); diff --git a/packages/react-async-states/src/__tests__/async-state/AsyncState.subscription.test.ts b/packages/react-async-states/src/__tests__/async-state/AsyncState.subscription.test.ts index 6e43fe05..18a38553 100644 --- a/packages/react-async-states/src/__tests__/async-state/AsyncState.subscription.test.ts +++ b/packages/react-async-states/src/__tests__/async-state/AsyncState.subscription.test.ts @@ -1,5 +1,5 @@ import { act } from "@testing-library/react-hooks"; -import AsyncState, { AsyncStateStatus } from "../../async-state"; +import AsyncState, { Status } from "../../async-state"; import { timeout } from "./test-utils"; import { mockDateNow, TESTS_TS } from "../react-async-state/utils/setup"; import {standaloneProducerEffectsCreator} from "../../async-state/AsyncState"; @@ -22,7 +22,7 @@ describe('AsyncState - subscriptions', () => { // then expect(myAsyncState.subsIndex).toBe(0); - let unsubscribe = myAsyncState.subscribe(subscriptionFn); + let unsubscribe = myAsyncState.subscribe({cb: subscriptionFn}); expect(typeof unsubscribe).toBe("function"); myAsyncState.run(standaloneProducerEffectsCreator); @@ -38,12 +38,12 @@ describe('AsyncState - subscriptions', () => { payload: {}, lastSuccess: { timestamp: TESTS_TS, - data: null, status: AsyncStateStatus.initial + data: null, status: Status.initial }, }, data: null, timestamp: TESTS_TS, - status: AsyncStateStatus.pending + status: Status.pending }], [{ props: { @@ -51,12 +51,12 @@ describe('AsyncState - subscriptions', () => { payload: {}, lastSuccess: { timestamp: TESTS_TS, - data: null, status: AsyncStateStatus.initial + data: null, status: Status.initial }, }, data: "Some Value", timestamp: TESTS_TS, - status: AsyncStateStatus.success + status: Status.success }] ] ); @@ -67,10 +67,10 @@ describe('AsyncState - subscriptions', () => { payload: {}, lastSuccess: { timestamp: TESTS_TS, - data: null, status: AsyncStateStatus.initial + data: null, status: Status.initial }, }, - status: AsyncStateStatus.success, + status: Status.success, data: "Some Value", timestamp: TESTS_TS, }); @@ -84,7 +84,7 @@ describe('AsyncState - subscriptions', () => { // when let myAsyncState = new AsyncState(key, producer, myConfig); - let unsubscribe = myAsyncState.subscribe(subscriptionFn); + let unsubscribe = myAsyncState.subscribe({cb: subscriptionFn}); // then @@ -105,16 +105,16 @@ describe('AsyncState - subscriptions', () => { payload: {}, lastSuccess: { timestamp: TESTS_TS, - data: null, status: AsyncStateStatus.initial + data: null, status: Status.initial }, - }, data: null, status: AsyncStateStatus.pending, timestamp: TESTS_TS, + }, data: null, status: Status.pending, timestamp: TESTS_TS, }], ] ); expect(subscriptionFn).toHaveBeenCalledTimes(1); expect(myAsyncState.state).toEqual({ props: null, - status: AsyncStateStatus.initial, + status: Status.initial, data: null, timestamp: TESTS_TS, }); @@ -128,7 +128,7 @@ describe('AsyncState - subscriptions', () => { // when let myAsyncState = new AsyncState(key, producer, myConfig); - let unsubscribe = myAsyncState.subscribe(subscriptionFn); + let unsubscribe = myAsyncState.subscribe({cb: subscriptionFn}); unsubscribe(); // then @@ -146,10 +146,10 @@ describe('AsyncState - subscriptions', () => { payload: {}, lastSuccess: { timestamp: TESTS_TS, - data: null, status: AsyncStateStatus.initial + data: null, status: Status.initial }, }, - status: AsyncStateStatus.success, + status: Status.success, data: "Some Value", timestamp: TESTS_TS, }); diff --git a/packages/react-async-states/src/__tests__/other/read-source.test.ts b/packages/react-async-states/src/__tests__/other/read-source.test.ts index 49dfdadf..38e48549 100644 --- a/packages/react-async-states/src/__tests__/other/read-source.test.ts +++ b/packages/react-async-states/src/__tests__/other/read-source.test.ts @@ -1,5 +1,5 @@ import { - readInstanceFromSource + readSource } from "../../async-state/AsyncState"; import {createSource} from "../../async-state"; @@ -9,7 +9,7 @@ describe('readSource', () => { const source = createSource("test", null, {initialValue: 0}); // when - const asyncState = readInstanceFromSource(source); + const asyncState = readSource(source); // then expect(asyncState.state.data).toEqual(0); @@ -20,7 +20,7 @@ describe('readSource', () => { // then // @ts-ignore - expect(() => readInstanceFromSource(source)) + expect(() => readSource(source)) .toThrow("You ve passed an incompatible source object. Please make sure to pass the received source object."); }); }); diff --git a/packages/react-async-states/src/__tests__/other/supports-concurrent-mode.no.test.ts b/packages/react-async-states/src/__tests__/other/supports-concurrent-mode.no.test.ts deleted file mode 100644 index 7821f137..00000000 --- a/packages/react-async-states/src/__tests__/other/supports-concurrent-mode.no.test.ts +++ /dev/null @@ -1,11 +0,0 @@ -import {supportsConcurrentMode} from "../../react/helpers/supports-concurrent-mode"; - -jest.mock("react", () => ({ - ...jest.requireActual("react"), - useSyncExternalStore: undefined, -})); -describe('supportsConcurrentMode', () => { - it('should say no', () => { - expect(supportsConcurrentMode()).toEqual(false); - }); -}); diff --git a/packages/react-async-states/src/__tests__/other/supports-concurrent-mode.yes.test.ts b/packages/react-async-states/src/__tests__/other/supports-concurrent-mode.yes.test.ts deleted file mode 100644 index 36ce3ac5..00000000 --- a/packages/react-async-states/src/__tests__/other/supports-concurrent-mode.yes.test.ts +++ /dev/null @@ -1,13 +0,0 @@ -import {supportsConcurrentMode} from "../../react/helpers/supports-concurrent-mode"; - -jest.mock("react", () => ({ - ...jest.requireActual("react"), - useSyncExternalStore: () => { - }, -})); -describe('supportsConcurrentMode', () => { - it('should say yes', () => { - expect(supportsConcurrentMode()).toEqual(true); - jest.unmock("react"); - }); -}); diff --git a/packages/react-async-states/src/__tests__/react-async-state/Provider/provider.test.tsx b/packages/react-async-states/src/__tests__/react-async-state/Provider/provider.test.tsx index e296a152..738c04ad 100644 --- a/packages/react-async-states/src/__tests__/react-async-state/Provider/provider.test.tsx +++ b/packages/react-async-states/src/__tests__/react-async-state/Provider/provider.test.tsx @@ -1,7 +1,7 @@ import * as React from "react"; import {act, fireEvent, render, screen} from "@testing-library/react"; import {mockDateNow} from "../utils/setup"; -import {AsyncStateProvider} from "../../../react/AsyncStateProvider"; +import {AsyncStateProvider} from "../../../react/Provider"; import {useAsyncState} from "../../../react/useAsyncState"; import {UseAsyncState} from "../../../types.internal"; import {flushPromises} from "../utils/test-utils"; @@ -23,13 +23,13 @@ describe('dynamic provider states hoisting', () => { function Father() { const run = useRunLane(); - const {key, mode, state, uniqueId} = useAsyncState({ + const {key, devFlags, state} = useAsyncState({ key: "counter", initialValue: 0, - hoistToProvider: true + hoist: true }); 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==}