From 9f8765e1946d0991fe860cba1756aad7fe2c10cf Mon Sep 17 00:00:00 2001 From: John Rom Date: Mon, 8 Mar 2021 18:28:26 -0500 Subject: [PATCH 01/28] Started to reimplement subscriber. Added Ref State. Added useSelectorComparer. Starting to build subscriptions. --- packages/formik/src/Formik.tsx | 185 +++++++++++------- packages/formik/src/hooks/useFormikState.ts | 39 ++++ .../formik/src/hooks/useFormikSubscription.ts | 34 ++++ .../src/hooks/useIsomorphicLayoutEffect.ts | 13 ++ .../formik/src/hooks/useOptimizedSelector.ts | 23 +++ 5 files changed, 221 insertions(+), 73 deletions(-) create mode 100644 packages/formik/src/hooks/useFormikState.ts create mode 100644 packages/formik/src/hooks/useFormikSubscription.ts create mode 100644 packages/formik/src/hooks/useIsomorphicLayoutEffect.ts create mode 100644 packages/formik/src/hooks/useOptimizedSelector.ts diff --git a/packages/formik/src/Formik.tsx b/packages/formik/src/Formik.tsx index 02934fa90..e0119136a 100755 --- a/packages/formik/src/Formik.tsx +++ b/packages/formik/src/Formik.tsx @@ -51,72 +51,53 @@ type FormikMessage = payload: FormikState; }; -// State reducer -function formikReducer( + +export function formikReducer( state: FormikState, msg: FormikMessage -) { +): FormikState { + + /** + * Add Dirty + InitialX management to the FormikReducer + */ switch (msg.type) { case 'SET_VALUES': - return { ...state, values: msg.payload }; - case 'SET_TOUCHED': - return { ...state, touched: msg.payload }; - case 'SET_ERRORS': - if (isEqual(state.errors, msg.payload)) { - return state; - } - - return { ...state, errors: msg.payload }; - case 'SET_STATUS': - return { ...state, status: msg.payload }; - case 'SET_ISSUBMITTING': - return { ...state, isSubmitting: msg.payload }; - case 'SET_ISVALIDATING': - return { ...state, isValidating: msg.payload }; - case 'SET_FIELD_VALUE': return { ...state, - values: setIn(state.values, msg.payload.field, msg.payload.value), + dirty: !isEqual(state.initialValues, state.values), }; - case 'SET_FIELD_TOUCHED': + case 'RESET_VALUES': return { ...state, - touched: setIn(state.touched, msg.payload.field, msg.payload.value), + initialValues: msg.payload, + dirty: !isEqual(state.initialValues, state.values), }; - case 'SET_FIELD_ERROR': + case 'RESET_TOUCHED': return { ...state, - errors: setIn(state.errors, msg.payload.field, msg.payload.value), + initialTouched: msg.payload, }; - case 'RESET_FORM': - return { ...state, ...msg.payload }; - case 'SET_FORMIK_STATE': - return msg.payload(state); - case 'SUBMIT_ATTEMPT': + case 'RESET_ERRORS': return { ...state, - touched: setNestedObjectValues>( - state.values, - true - ), - isSubmitting: true, - submitCount: state.submitCount + 1, + initialErrors: msg.payload, }; - case 'SUBMIT_FAILURE': + case 'RESET_STATUS': return { ...state, - isSubmitting: false, + initialStatus: msg.payload, }; - case 'SUBMIT_SUCCESS': + case 'SET_FIELD_VALUE': return { ...state, - isSubmitting: false, + dirty: !isEqual(state.initialValues, state.values), }; default: return state; } } + // Initial empty states // objects const emptyErrors: FormikErrors = {}; const emptyTouched: FormikTouched = {}; @@ -129,33 +110,45 @@ interface FieldRegistry { }; } -export function useFormik({ - validateOnChange = true, - validateOnBlur = true, - validateOnMount = false, - isInitialValid, - enableReinitialize = false, - onSubmit, - ...rest -}: FormikConfig) { +export function useFormik( + rawProps: FormikConfig> +) { + const { + validateOnChange = true, + validateOnBlur = true, + validateOnMount = false, + enableReinitialize = false, + ...rest + } = rawProps; const props = { validateOnChange, validateOnBlur, validateOnMount, - onSubmit, ...rest, }; - const initialValues = React.useRef(props.initialValues); - const initialErrors = React.useRef(props.initialErrors || emptyErrors); - const initialTouched = React.useRef(props.initialTouched || emptyTouched); - const initialStatus = React.useRef(props.initialStatus); + + if (__DEV__) { + // eslint-disable-next-line react-hooks/rules-of-hooks + React.useEffect(() => { + invariant( + typeof props.isInitialValid === 'undefined', + 'isInitialValid has been deprecated and will be removed in future versions of Formik. Please use initialErrors or validateOnMount instead.' + ); + // eslint-disable-next-line + }, []); + } + + /** + * Refs + */ const isMounted = React.useRef(false); const fieldRegistry = React.useRef({}); + if (__DEV__) { // eslint-disable-next-line react-hooks/rules-of-hooks React.useEffect(() => { invariant( - typeof isInitialValid === 'undefined', + typeof props.isInitialValid === 'undefined', 'isInitialValid has been deprecated and will be removed in future versions of Formik. Please use initialErrors or validateOnMount instead.' ); // eslint-disable-next-line @@ -170,18 +163,63 @@ export function useFormik({ }; }, []); - const [state, dispatch] = React.useReducer< - React.Reducer, FormikMessage> - >(formikReducer, { + /** + * This is the true test of spacetime. Every method + * Formik uses must carefully consider whether it + * needs to use the ref or the render snapshot. + * + * The general rule is going to be, + * snapshot ref + * const [state, updateState] = useFormikThing(); + */ + const stateRef = React.useRef>({ + initialValues: props.initialValues, + initialErrors: props.initialErrors ?? emptyErrors, + initialTouched: props.initialTouched ?? emptyTouched, + initialStatus: props.initialStatus, values: props.initialValues, - errors: props.initialErrors || emptyErrors, - touched: props.initialTouched || emptyTouched, + errors: props.initialErrors ?? emptyErrors, + touched: props.initialTouched ?? emptyTouched, status: props.initialStatus, isSubmitting: false, isValidating: false, submitCount: 0, + dirty: false, }); + /** + * Breaking all the rules, re: "must be side-effect free" + * BUT that's probably OK + * + * The only things that should use stateRef are side effects / event callbacks + * + */ + const refBoundFormikReducer = React.useCallback( + ( + state: FormikState, + msg: FormikMessage + ) => { + // decorate the core Formik reducer with one which tracks dirty and initialX in state + const result = formikRefReducer(state, msg); + + stateRef.current = result; + + return result; + }, + [stateRef] + ); + + const getState = React.useCallback(() => stateRef.current, [stateRef]); + const [state, dispatch] = React.useReducer(refBoundFormikReducer, stateRef.current); + + React.useEffect(() => { + isMounted.current = true; + + return () => { + isMounted.current = false; + }; + }, []); + const runValidateHandler = React.useCallback( (values: Values, field?: string): Promise> => { return new Promise((resolve, reject) => { @@ -320,7 +358,7 @@ export function useFormik({ // Run all validations methods and update state accordingly const validateFormWithHighPriority = useEventCallback( - (values: Values = state.values) => { + (values: Values = getState().values) => { dispatch({ type: 'SET_ISVALIDATING', payload: true }); return runAllValidations(values).then(combinedErrors => { if (!!isMounted.current) { @@ -991,12 +1029,24 @@ export function Formik< Values extends FormikValues = FormikValues, ExtraProps = {} >(props: FormikConfig & ExtraProps) { - const formikbag = useFormik(props); + const formikApi = useFormik(props); const { component, children, render, innerRef } = props; + const formikState = useFullFormikState( + formikApi, + !!component || !!render || isFunction(children) + ); + + // This allows folks to pass a ref to React.useImperativeHandle(innerRef, () => formikbag); + const formikbag: FormikProps = { + ...formikApi, + ...formikState, + }; + + if (__DEV__) { // eslint-disable-next-line react-hooks/rules-of-hooks React.useEffect(() => { @@ -1008,7 +1058,7 @@ export function Formik< }, []); } return ( - + {component ? React.createElement(component as any, formikbag) : render @@ -1179,17 +1229,6 @@ function getValueForCheckbox( .concat(currentArrayOfValues.slice(index + 1)); } -// React currently throws a warning when using useLayoutEffect on the server. -// To get around it, we can conditionally useEffect on the server (no-op) and -// useLayoutEffect in the browser. -// @see https://gist.github.com/gaearon/e7d97cdf38a2907924ea12e4ebdf3c85 -const useIsomorphicLayoutEffect = - typeof window !== 'undefined' && - typeof window.document !== 'undefined' && - typeof window.document.createElement !== 'undefined' - ? React.useLayoutEffect - : React.useEffect; - function useEventCallback any>(fn: T): T { const ref: any = React.useRef(fn); diff --git a/packages/formik/src/hooks/useFormikState.ts b/packages/formik/src/hooks/useFormikState.ts new file mode 100644 index 000000000..dfca17d8f --- /dev/null +++ b/packages/formik/src/hooks/useFormikState.ts @@ -0,0 +1,39 @@ +import { useOptimizedSelector, Selector, Comparer } from './useOptimizedSelector'; +import { useFormikStateSubscription } from './useFormikSubscription'; +import { FormikApi, useFormikApi } from './useFormikApi'; +import { FormikState } from '../types'; + +/** + * `useFormikState`, but accepting `FormikApi` as a parameter. + * + * @param api FormikApi instance returned by `useFormik` or `useFormikApi` + */ +export const useFormikApiState = ( + api: FormikApi, + selector: Selector, Return>, + comparer: Comparer = Object.is, + shouldSubscribe = true +) => { + selector = useOptimizedSelector(selector, comparer); + + return useFormikStateSubscription( + api, + selector, + shouldSubscribe + ); +}; + +/** + * Subscribe to Formik State and Computed State updates. + */ +export const useFormikState = ( + selector: Selector, Return>, + comparer: Comparer = Object.is, + shouldSubscribe = true +): [Return, FormikApi] => { + const api = useFormikApi(); + return [ + useFormikApiState(api, selector, comparer, shouldSubscribe), + api, + ]; +}; diff --git a/packages/formik/src/hooks/useFormikSubscription.ts b/packages/formik/src/hooks/useFormikSubscription.ts new file mode 100644 index 000000000..739231476 --- /dev/null +++ b/packages/formik/src/hooks/useFormikSubscription.ts @@ -0,0 +1,34 @@ +import React from 'react'; +import { FormikState, FormikValues } from '../types'; +import { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect'; + +export type FormikSliceFn = ( + formState: FormikState +) => Result; + +/** + * Important! Use a stable or memoized subscriber. + */ +export const useFormikStateSubscription = < + Values extends FormikValues, + Return +>( + api: FormikApi, + selector: FormikSliceFn, + shouldSubscribe = true +) => { + const { subscribe, getState } = api; + const [sliceState, setSliceState] = React.useState(() => + selector(getState()) + ); + + useIsomorphicLayoutEffect(() => { + if (shouldSubscribe) { + return subscribe(selector, setSliceState); + } + + return; + }, [subscribe, selector, shouldSubscribe]); + + return sliceState; +}; diff --git a/packages/formik/src/hooks/useIsomorphicLayoutEffect.ts b/packages/formik/src/hooks/useIsomorphicLayoutEffect.ts new file mode 100644 index 000000000..ae09e3c59 --- /dev/null +++ b/packages/formik/src/hooks/useIsomorphicLayoutEffect.ts @@ -0,0 +1,13 @@ +import { useEffect, useLayoutEffect } from "react"; + +// React currently throws a warning when using useLayoutEffect on the server. +// To get around it, we can conditionally useEffect on the server (no-op) and +// useLayoutEffect in the browser. +// +// @see https://gist.github.com/gaearon/e7d97cdf38a2907924ea12e4ebdf3c85 +export const useIsomorphicLayoutEffect = + typeof window !== 'undefined' && + typeof window.document !== 'undefined' && + typeof window.document.createElement !== 'undefined' + ? useLayoutEffect + : useEffect; diff --git a/packages/formik/src/hooks/useOptimizedSelector.ts b/packages/formik/src/hooks/useOptimizedSelector.ts new file mode 100644 index 000000000..564d5676f --- /dev/null +++ b/packages/formik/src/hooks/useOptimizedSelector.ts @@ -0,0 +1,23 @@ +import { useCallback, useMemo } from 'react'; + +export type Selector = (value: Value) => Return; +export type Comparer = (prev: Return, next: Return) => boolean; + +const UNINITIALIZED_VALUE = Symbol(); + +export const useOptimizedSelector = ( + selector: Selector, + comparer: Comparer +): Selector => { + return useMemo(() => { + let cachedValue: Return | typeof UNINITIALIZED_VALUE = UNINITIALIZED_VALUE; + + return (value: Value) => { + const newValue = selector(value); + + return cachedValue !== UNINITIALIZED_VALUE && comparer(cachedValue, newValue) + ? cachedValue + : (cachedValue = newValue); + } + }, [selector, comparer]); +} From 4dc160b09f8fc803b383175c2be5f57e08267a7a Mon Sep 17 00:00:00 2001 From: John Rom Date: Tue, 9 Mar 2021 10:51:07 -0500 Subject: [PATCH 02/28] Grab types from other PR, to simplify later. --- packages/formik/package.json | 7 +- packages/formik/src/hooks/useFormikApi.ts | 15 + .../src/hooks/useFormikComputedState.ts | 35 ++ .../formik/src/hooks/useFullFormikState.ts | 34 ++ packages/formik/src/types.tsx | 356 ++++++++++++++---- 5 files changed, 363 insertions(+), 84 deletions(-) create mode 100644 packages/formik/src/hooks/useFormikApi.ts create mode 100644 packages/formik/src/hooks/useFormikComputedState.ts create mode 100644 packages/formik/src/hooks/useFullFormikState.ts diff --git a/packages/formik/package.json b/packages/formik/package.json index 984e66146..81a31df9e 100644 --- a/packages/formik/package.json +++ b/packages/formik/package.json @@ -30,7 +30,9 @@ "umd:main": "dist/formik.umd.production.js", "module": "dist/formik.esm.js", "typings": "dist/index.d.ts", - "files": ["dist"], + "files": [ + "dist" + ], "peerDependencies": { "react": ">=16.8.0" }, @@ -49,7 +51,8 @@ "lodash-es": "^4.17.14", "react-fast-compare": "^2.0.1", "tiny-warning": "^1.0.2", - "tslib": "^1.10.0" + "tslib": "^1.10.0", + "use-subscription": "^1.5.1" }, "devDependencies": { "@testing-library/react": "^11.1.0", diff --git a/packages/formik/src/hooks/useFormikApi.ts b/packages/formik/src/hooks/useFormikApi.ts new file mode 100644 index 000000000..48a5a1c7c --- /dev/null +++ b/packages/formik/src/hooks/useFormikApi.ts @@ -0,0 +1,15 @@ +import invariant from 'tiny-warning'; +import React from 'react'; +import { FormikValues, FormikApi } from '../types'; +import { FormikContext } from '../FormikContext'; + +export function useFormikApi(): FormikApi { + const formikApi = React.useContext(FormikContext); + + invariant( + !!formikApi, + `Formik context is undefined, please verify you are calling useFormikContext() as child of a component.` + ); + + return formikApi; +} diff --git a/packages/formik/src/hooks/useFormikComputedState.ts b/packages/formik/src/hooks/useFormikComputedState.ts new file mode 100644 index 000000000..6291d560a --- /dev/null +++ b/packages/formik/src/hooks/useFormikComputedState.ts @@ -0,0 +1,35 @@ +import { useMemo } from 'react'; +import { FormikApi } from './useFormikApi'; +import { FormikState } from '../types'; +import isEqual from 'react-fast-compare'; +import { useFormikState } from './useFormikState'; + +export const useFormikComputedStateInternal = ( + api: FormikApi, + state: Pick, 'errors' | 'dirty'> +): FormikComputedState => { + const { isFormValid } = api; + + const isValid = useMemo(() => { + return isFormValid(state.errors, state.dirty); + }, [isFormValid, state.errors, state.dirty]); + + return { + isValid, + dirty: state.dirty, + }; +}; + +const selectComputedState = (state: FormikState) => ({ + errors: state.errors, + dirty: state.dirty, +}); + +/** + * Subscribe to Formik State and Computed State updates. + */ +export const useFormikComputedState = () => { + const [computedState, api] = useFormikState(selectComputedState, isEqual); + + return useFormikComputedStateInternal(api, computedState); +}; diff --git a/packages/formik/src/hooks/useFullFormikState.ts b/packages/formik/src/hooks/useFullFormikState.ts new file mode 100644 index 000000000..83fd5599d --- /dev/null +++ b/packages/formik/src/hooks/useFullFormikState.ts @@ -0,0 +1,34 @@ +import { useFormikComputedStateInternal } from './useFormikComputedState'; +import { useMemo } from 'react'; +import { FormikApi } from './useFormikApi'; +import { FormikState } from '../types'; +import { useFormikApiState } from './useFormikState'; + +export type FullFormikState = FormikState & FormikComputedState; + +export type SelectFullStateFn = ( + state: FormikState +) => FormikState; + +export const selectFullState: SelectFullStateFn = state => state; + +export const useFullFormikState = ( + api: FormikApi, + shouldSubscribe = true +) => { + const state = useFormikApiState( + api, + selectFullState, + Object.is, + shouldSubscribe + ); + const computedState = useFormikComputedStateInternal(api, state); + + return useMemo( + () => ({ + ...state, + ...computedState, + }), + [state, computedState] + ); +}; diff --git a/packages/formik/src/types.tsx b/packages/formik/src/types.tsx index a531f405d..e7bb10859 100644 --- a/packages/formik/src/types.tsx +++ b/packages/formik/src/types.tsx @@ -1,4 +1,5 @@ import * as React from 'react'; + /** * Values of fields in the form */ @@ -53,127 +54,288 @@ export interface FormikState { submitCount: number; } +export interface FormikInitialState { + initialValues: FormikConfig['initialValues']; + initialErrors: FormikConfig['initialErrors']; + initialTouched: FormikConfig['initialTouched']; + initialStatus: FormikConfig['initialStatus']; +} + +type MakeRefs = { + [key in keyof T]: React.MutableRefObject; +}; + +export type FormikRefs = MakeRefs> & { + isMounted: React.MutableRefObject; +}; + +export type FormikMessage< + Values, + State extends FormikState = FormikState +> = + | { type: 'SUBMIT_ATTEMPT' } + | { type: 'SUBMIT_FAILURE' } + | { type: 'SUBMIT_SUCCESS' } + | { type: 'SET_ISVALIDATING'; payload: boolean } + | { type: 'SET_ISSUBMITTING'; payload: boolean } + | { type: 'SET_VALUES'; payload: Values } + | { type: 'RESET_VALUES'; payload: Values } + | { type: 'SET_FIELD_VALUE'; payload: { field: string; value?: any } } + | { type: 'SET_FIELD_TOUCHED'; payload: { field: string; value?: boolean } } + | { type: 'SET_FIELD_ERROR'; payload: { field: string; value?: string } } + | { type: 'SET_TOUCHED'; payload: FormikTouched } + | { type: 'RESET_TOUCHED'; payload: FormikTouched } + | { type: 'SET_ERRORS'; payload: FormikErrors } + | { type: 'RESET_ERRORS'; payload: FormikErrors } + | { type: 'SET_STATUS'; payload: any } + | { type: 'RESET_STATUS'; payload: any } + | { + type: 'SET_FORMIK_STATE'; + payload: (s: State) => State; + } + | { + type: 'RESET_FORM'; + payload: State; + }; + /** - * Formik computed properties. These are read-only. + * Formik computed state. These are read-only and + * result from updates to FormikState but do not live there. */ -export interface FormikComputedProps { - /** True if any input has been touched. False otherwise. */ +export interface FormikComputedState { + /** + * True if `!isEqual(initialValues, state.values)` + */ readonly dirty: boolean; - /** True if state.errors is empty */ + /** + * True if one of: + * `dirty && state.errors is empty` or + * `!dirty && isInitialValid` + */ readonly isValid: boolean; - /** The initial values of the form */ - readonly initialValues: Values; - /** The initial errors of the form */ - readonly initialErrors: FormikErrors; - /** The initial visited fields of the form */ - readonly initialTouched: FormikTouched; - /** The initial status of the form */ - readonly initialStatus?: any; } +/** + * @deprecated use FormikComputedState + */ +export type FormikComputedProps = FormikComputedState; + +export type GetStateFn< + Values, + State extends FormikState = FormikState +> = () => State; +export type UnregisterFieldFn = (name: string) => void; +export type RegisterFieldFn = (name: string, { validate }: any) => void; + /** * Formik state helpers */ -export interface FormikHelpers { + +export type SetStatusFn = (status: any) => void; + +export type SetErrorsFn = ( + errors: FormikErrors +) => void; + +export type IsFormValidFn = ( + errors: FormikErrors, + dirty: boolean +) => boolean; + +export type SetSubmittingFn = (isSubmitting: boolean) => void; + +export type SetTouchedFn = ( + touched: import('./types').FormikTouched, + shouldValidate?: boolean | undefined +) => Promise>; + +export type SetValuesFn = ( + values: Values, + shouldValidate?: boolean | undefined +) => Promise>; + +export type SetFieldValueFn = ( + field: string, + value: any, + shouldValidate?: boolean | undefined +) => Promise>; + +export type SetFieldErrorFn = ( + field: string, + value: string | undefined +) => void; + +export type SetFieldTouchedFn = ( + field: string, + touched?: boolean | undefined, + shouldValidate?: boolean | undefined +) => Promise>; + +export type ValidateFormFn = ( + values?: Values +) => Promise>; + +export type ValidateFieldFn = ( + name: string +) => Promise; + +export type ResetFormFn< + Values extends FormikValues, + State extends FormikState +> = (nextState?: Partial | undefined) => void; + +export type SetFormikStateFn = ( + stateOrCb: + | FormikState + | ((state: FormikState) => FormikState) +) => void; + +export type SubmitFormFn = () => Promise; + +export interface FormikHelpers< + Values, + State extends FormikState = FormikState +> { /** Manually set top level status. */ - setStatus: (status?: any) => void; + setStatus: SetStatusFn; /** Manually set errors object */ - setErrors: (errors: FormikErrors) => void; + setErrors: SetErrorsFn; /** Manually set isSubmitting */ - setSubmitting: (isSubmitting: boolean) => void; + setSubmitting: SetSubmittingFn; /** Manually set touched object */ - setTouched: ( - touched: FormikTouched, - shouldValidate?: boolean - ) => void; + setTouched: SetTouchedFn; /** Manually set values object */ - setValues: ( - values: React.SetStateAction, - shouldValidate?: boolean - ) => void; + setValues: SetValuesFn; /** Set value of form field directly */ - setFieldValue: (field: string, value: any, shouldValidate?: boolean) => void; + setFieldValue: SetFieldValueFn; /** Set error message of a form field directly */ - setFieldError: (field: string, message: string | undefined) => void; + setFieldError: SetFieldErrorFn; /** Set whether field has been touched directly */ - setFieldTouched: ( - field: string, - isTouched?: boolean, - shouldValidate?: boolean - ) => void; + setFieldTouched: SetFieldTouchedFn; + /** Detect whether a form is valid based on isInitialValid, errors and dirty */ + isFormValid: IsFormValidFn; /** Validate form values */ - validateForm: (values?: any) => Promise>; + validateForm: ValidateFormFn; /** Validate field value */ - validateField: (field: string) => void; + validateField: ValidateFieldFn; /** Reset form */ - resetForm: (nextState?: Partial>) => void; + resetForm: ResetFormFn; /** Submit the form imperatively */ - submitForm: () => Promise; + submitForm: SubmitFormFn; + /** Get Formik State from outside of Render. */ + getState: GetStateFn; /** Set Formik state, careful! */ - setFormikState: ( - f: - | FormikState - | ((prevState: FormikState) => FormikState), - cb?: () => void - ) => void; + setFormikState: SetFormikStateFn; } -/** - * Formik form event handlers - */ -export interface FormikHandlers { - /** Form submit handler */ - handleSubmit: (e?: React.FormEvent) => void; - /** Reset form event handler */ - handleReset: (e?: React.SyntheticEvent) => void; - handleBlur: { - /** Classic React blur handler, keyed by input name */ - (e: React.FocusEvent): void; - /** Preact-like linkState. Will return a handleBlur function. */ - (fieldOrEvent: T): T extends string - ? (e: any) => void - : void; - }; - handleChange: { - /** Classic React change handler, keyed by input name */ - (e: React.ChangeEvent): void; - /** Preact-like linkState. Will return a handleChange function. */ - >( - field: T - ): T extends React.ChangeEvent - ? void - : (e: string | React.ChangeEvent) => void; - }; +export type GetValueFromEventFn = ( + event: React.SyntheticEvent, + fieldName: string +) => any; + +export type GetFieldHelpersFn = ( + name: string +) => FieldHelperProps; +export interface FieldHelpers { + getValueFromEvent: GetValueFromEventFn; getFieldProps: (props: any) => FieldInputProps; getFieldMeta: (name: string) => FieldMetaProps; - getFieldHelpers: (name: string) => FieldHelperProps; + getFieldHelpers: GetFieldHelpersFn; } +export type HandleSubmitFn = ( + e?: React.FormEvent | undefined +) => void; + +export type HandleResetFn = (e?: any) => void; + /** - * Base formik configuration/props shared between the HoC and Component. + * Event callback returned by `formik.handleBlur`. + */ +export type HandleBlurEventFn = (event: React.FocusEvent) => void; + +/** + * Type of `formik.handleBlur`. + * May be an event callback, or accept a field name and return an event callback. + */ +export type HandleBlurFn = { + (eventOrString: string): HandleBlurEventFn; + // Must remain the same as HandleBlurEventFn + (event: React.FocusEvent): void; +}; + +/** + * Event callback returned by `formik.handleChange`. + */ +export type HandleChangeEventFn = (event: React.ChangeEvent) => void; + +/** + * Type of `formik.handleChange`. + * May be an event callback, or accept a field name and return an event callback. + */ +export type HandleChangeFn = { + (eventOrPath: React.ChangeEvent): void; + // Must remain the same as HandleChangeEventFn + (event: string): HandleChangeEventFn; +}; + +/** + * Formik form event handlers */ -export interface FormikSharedConfig { +export interface FormikHandlers { + handleSubmit: HandleSubmitFn; + handleReset: HandleResetFn; + handleBlur: HandleBlurFn; + handleChange: HandleChangeFn; +} + +export interface FormikValidationConfig { /** Tells Formik to validate the form on each input's onChange event */ validateOnChange?: boolean; /** Tells Formik to validate the form on each input's onBlur event */ validateOnBlur?: boolean; /** Tells Formik to validate upon mount */ validateOnMount?: boolean; +} + +export type FormikApi = FormikHelpers< + Values, + FormikState +> & + FieldHelpers & + FormikHandlers & + FormikValidationConfig & + > & { + unregisterField: UnregisterFieldFn; + registerField: RegisterFieldFn; + }; + +/** + * Base formik configuration/props shared between the HoC and Component. + */ +export type FormikSharedConfig = FormikValidationConfig & { /** Tell Formik if initial form values are valid or not on first render */ isInitialValid?: boolean | ((props: Props) => boolean); /** Should Formik reset the form when new initialValues change */ enableReinitialize?: boolean; -} +}; + +export type ValidateFn = ( + values?: Values | undefined +) => Promise>; /** * props */ -export interface FormikConfig extends FormikSharedConfig { +export interface FormikConfig< + Values, + State extends FormikState = FormikState +> extends FormikSharedConfig { /** * Form component to render */ - component?: React.ComponentType> | React.ReactNode; + component?: React.ComponentType>; /** * Render prop (works like React router's } />) @@ -207,14 +369,17 @@ export interface FormikConfig extends FormikSharedConfig { /** * Reset handler */ - onReset?: (values: Values, formikHelpers: FormikHelpers) => void; + onReset?: ( + values: Values, + formikHelpers: FormikHelpers + ) => void | Promise; /** * Submission handler */ onSubmit: ( values: Values, - formikHelpers: FormikHelpers + formikHelpers: FormikHelpers ) => void | Promise; /** * A Yup Schema or a function that returns a Yup schema @@ -225,10 +390,10 @@ export interface FormikConfig extends FormikSharedConfig { * Validation function. Must return an error object or promise that * throws an error object where that object keys map to corresponding value. */ - validate?: (values: Values) => void | object | Promise>; + validate?: (values: Values) => void | object | ValidateFn; /** Inner ref */ - innerRef?: React.Ref>; + innerRef?: React.Ref>; } /** @@ -237,10 +402,12 @@ export interface FormikConfig extends FormikSharedConfig { */ export type FormikProps = FormikSharedConfig & FormikState & + FormikInitialState & FormikHelpers & + FieldHelpers & FormikHandlers & - FormikComputedProps & - FormikRegistration & { submitForm: () => Promise }; + FormikComputedState & + FormikRegistration; /** Internal Formik registration methods that get passed down as props */ export interface FormikRegistration { @@ -292,6 +459,11 @@ export interface FieldMetaProps { initialError?: string; } +/** + * @deprecated use `SetFieldTouchedFn` + */ +export type SetFieldTouched = SetFieldTouchedFn; + /** Imperative handles to change a field's value, error and touched */ export interface FieldHelperProps { /** Set the field's value */ @@ -299,9 +471,16 @@ export interface FieldHelperProps { /** Set the field's touched value */ setTouched: (value: boolean, shouldValidate?: boolean) => void; /** Set the field's error value */ - setError: (value: Value) => void; + setError: (error: string) => void; } +export type FieldOnChangeProp = ( + eventOrValue: React.ChangeEvent | any +) => void; +export type FieldOnBlurProp = ( + eventOrValue: React.ChangeEvent | any +) => void; + /** Field input value, name, and event handlers */ export interface FieldInputProps { /** Value of the field */ @@ -313,11 +492,24 @@ export interface FieldInputProps { /** Is the field checked? */ checked?: boolean; /** Change event handler */ - onChange: FormikHandlers['handleChange']; + onChange: FieldOnChangeProp; /** Blur event handler */ - onBlur: FormikHandlers['handleBlur']; + onBlur: FieldOnBlurProp; } export type FieldValidator = ( value: any ) => string | void | Promise; + +// This is an object that contains a map of all registered fields +// and their validate functions +export interface FieldRegistry { + [field: string]: { + validate: (value: any) => string | Promise | undefined; + }; +} + +export type ValidationHandler = ( + values: Values, + field?: string +) => Promise>; From ef66e38ad106d3d2600caa159990ecb8d22d6a88 Mon Sep 17 00:00:00 2001 From: John Rom Date: Tue, 9 Mar 2021 10:51:07 -0500 Subject: [PATCH 03/28] Grab types from other PR, to simplify later. --- packages/formik/package.json | 7 +- packages/formik/src/hooks/useFormikApi.ts | 15 + .../src/hooks/useFormikComputedState.ts | 35 ++ .../formik/src/hooks/useFullFormikState.ts | 34 ++ packages/formik/src/types.tsx | 356 ++++++++++++++---- yarn.lock | 7 + 6 files changed, 370 insertions(+), 84 deletions(-) create mode 100644 packages/formik/src/hooks/useFormikApi.ts create mode 100644 packages/formik/src/hooks/useFormikComputedState.ts create mode 100644 packages/formik/src/hooks/useFullFormikState.ts diff --git a/packages/formik/package.json b/packages/formik/package.json index 984e66146..81a31df9e 100644 --- a/packages/formik/package.json +++ b/packages/formik/package.json @@ -30,7 +30,9 @@ "umd:main": "dist/formik.umd.production.js", "module": "dist/formik.esm.js", "typings": "dist/index.d.ts", - "files": ["dist"], + "files": [ + "dist" + ], "peerDependencies": { "react": ">=16.8.0" }, @@ -49,7 +51,8 @@ "lodash-es": "^4.17.14", "react-fast-compare": "^2.0.1", "tiny-warning": "^1.0.2", - "tslib": "^1.10.0" + "tslib": "^1.10.0", + "use-subscription": "^1.5.1" }, "devDependencies": { "@testing-library/react": "^11.1.0", diff --git a/packages/formik/src/hooks/useFormikApi.ts b/packages/formik/src/hooks/useFormikApi.ts new file mode 100644 index 000000000..48a5a1c7c --- /dev/null +++ b/packages/formik/src/hooks/useFormikApi.ts @@ -0,0 +1,15 @@ +import invariant from 'tiny-warning'; +import React from 'react'; +import { FormikValues, FormikApi } from '../types'; +import { FormikContext } from '../FormikContext'; + +export function useFormikApi(): FormikApi { + const formikApi = React.useContext(FormikContext); + + invariant( + !!formikApi, + `Formik context is undefined, please verify you are calling useFormikContext() as child of a component.` + ); + + return formikApi; +} diff --git a/packages/formik/src/hooks/useFormikComputedState.ts b/packages/formik/src/hooks/useFormikComputedState.ts new file mode 100644 index 000000000..6291d560a --- /dev/null +++ b/packages/formik/src/hooks/useFormikComputedState.ts @@ -0,0 +1,35 @@ +import { useMemo } from 'react'; +import { FormikApi } from './useFormikApi'; +import { FormikState } from '../types'; +import isEqual from 'react-fast-compare'; +import { useFormikState } from './useFormikState'; + +export const useFormikComputedStateInternal = ( + api: FormikApi, + state: Pick, 'errors' | 'dirty'> +): FormikComputedState => { + const { isFormValid } = api; + + const isValid = useMemo(() => { + return isFormValid(state.errors, state.dirty); + }, [isFormValid, state.errors, state.dirty]); + + return { + isValid, + dirty: state.dirty, + }; +}; + +const selectComputedState = (state: FormikState) => ({ + errors: state.errors, + dirty: state.dirty, +}); + +/** + * Subscribe to Formik State and Computed State updates. + */ +export const useFormikComputedState = () => { + const [computedState, api] = useFormikState(selectComputedState, isEqual); + + return useFormikComputedStateInternal(api, computedState); +}; diff --git a/packages/formik/src/hooks/useFullFormikState.ts b/packages/formik/src/hooks/useFullFormikState.ts new file mode 100644 index 000000000..83fd5599d --- /dev/null +++ b/packages/formik/src/hooks/useFullFormikState.ts @@ -0,0 +1,34 @@ +import { useFormikComputedStateInternal } from './useFormikComputedState'; +import { useMemo } from 'react'; +import { FormikApi } from './useFormikApi'; +import { FormikState } from '../types'; +import { useFormikApiState } from './useFormikState'; + +export type FullFormikState = FormikState & FormikComputedState; + +export type SelectFullStateFn = ( + state: FormikState +) => FormikState; + +export const selectFullState: SelectFullStateFn = state => state; + +export const useFullFormikState = ( + api: FormikApi, + shouldSubscribe = true +) => { + const state = useFormikApiState( + api, + selectFullState, + Object.is, + shouldSubscribe + ); + const computedState = useFormikComputedStateInternal(api, state); + + return useMemo( + () => ({ + ...state, + ...computedState, + }), + [state, computedState] + ); +}; diff --git a/packages/formik/src/types.tsx b/packages/formik/src/types.tsx index a531f405d..e7bb10859 100644 --- a/packages/formik/src/types.tsx +++ b/packages/formik/src/types.tsx @@ -1,4 +1,5 @@ import * as React from 'react'; + /** * Values of fields in the form */ @@ -53,127 +54,288 @@ export interface FormikState { submitCount: number; } +export interface FormikInitialState { + initialValues: FormikConfig['initialValues']; + initialErrors: FormikConfig['initialErrors']; + initialTouched: FormikConfig['initialTouched']; + initialStatus: FormikConfig['initialStatus']; +} + +type MakeRefs = { + [key in keyof T]: React.MutableRefObject; +}; + +export type FormikRefs = MakeRefs> & { + isMounted: React.MutableRefObject; +}; + +export type FormikMessage< + Values, + State extends FormikState = FormikState +> = + | { type: 'SUBMIT_ATTEMPT' } + | { type: 'SUBMIT_FAILURE' } + | { type: 'SUBMIT_SUCCESS' } + | { type: 'SET_ISVALIDATING'; payload: boolean } + | { type: 'SET_ISSUBMITTING'; payload: boolean } + | { type: 'SET_VALUES'; payload: Values } + | { type: 'RESET_VALUES'; payload: Values } + | { type: 'SET_FIELD_VALUE'; payload: { field: string; value?: any } } + | { type: 'SET_FIELD_TOUCHED'; payload: { field: string; value?: boolean } } + | { type: 'SET_FIELD_ERROR'; payload: { field: string; value?: string } } + | { type: 'SET_TOUCHED'; payload: FormikTouched } + | { type: 'RESET_TOUCHED'; payload: FormikTouched } + | { type: 'SET_ERRORS'; payload: FormikErrors } + | { type: 'RESET_ERRORS'; payload: FormikErrors } + | { type: 'SET_STATUS'; payload: any } + | { type: 'RESET_STATUS'; payload: any } + | { + type: 'SET_FORMIK_STATE'; + payload: (s: State) => State; + } + | { + type: 'RESET_FORM'; + payload: State; + }; + /** - * Formik computed properties. These are read-only. + * Formik computed state. These are read-only and + * result from updates to FormikState but do not live there. */ -export interface FormikComputedProps { - /** True if any input has been touched. False otherwise. */ +export interface FormikComputedState { + /** + * True if `!isEqual(initialValues, state.values)` + */ readonly dirty: boolean; - /** True if state.errors is empty */ + /** + * True if one of: + * `dirty && state.errors is empty` or + * `!dirty && isInitialValid` + */ readonly isValid: boolean; - /** The initial values of the form */ - readonly initialValues: Values; - /** The initial errors of the form */ - readonly initialErrors: FormikErrors; - /** The initial visited fields of the form */ - readonly initialTouched: FormikTouched; - /** The initial status of the form */ - readonly initialStatus?: any; } +/** + * @deprecated use FormikComputedState + */ +export type FormikComputedProps = FormikComputedState; + +export type GetStateFn< + Values, + State extends FormikState = FormikState +> = () => State; +export type UnregisterFieldFn = (name: string) => void; +export type RegisterFieldFn = (name: string, { validate }: any) => void; + /** * Formik state helpers */ -export interface FormikHelpers { + +export type SetStatusFn = (status: any) => void; + +export type SetErrorsFn = ( + errors: FormikErrors +) => void; + +export type IsFormValidFn = ( + errors: FormikErrors, + dirty: boolean +) => boolean; + +export type SetSubmittingFn = (isSubmitting: boolean) => void; + +export type SetTouchedFn = ( + touched: import('./types').FormikTouched, + shouldValidate?: boolean | undefined +) => Promise>; + +export type SetValuesFn = ( + values: Values, + shouldValidate?: boolean | undefined +) => Promise>; + +export type SetFieldValueFn = ( + field: string, + value: any, + shouldValidate?: boolean | undefined +) => Promise>; + +export type SetFieldErrorFn = ( + field: string, + value: string | undefined +) => void; + +export type SetFieldTouchedFn = ( + field: string, + touched?: boolean | undefined, + shouldValidate?: boolean | undefined +) => Promise>; + +export type ValidateFormFn = ( + values?: Values +) => Promise>; + +export type ValidateFieldFn = ( + name: string +) => Promise; + +export type ResetFormFn< + Values extends FormikValues, + State extends FormikState +> = (nextState?: Partial | undefined) => void; + +export type SetFormikStateFn = ( + stateOrCb: + | FormikState + | ((state: FormikState) => FormikState) +) => void; + +export type SubmitFormFn = () => Promise; + +export interface FormikHelpers< + Values, + State extends FormikState = FormikState +> { /** Manually set top level status. */ - setStatus: (status?: any) => void; + setStatus: SetStatusFn; /** Manually set errors object */ - setErrors: (errors: FormikErrors) => void; + setErrors: SetErrorsFn; /** Manually set isSubmitting */ - setSubmitting: (isSubmitting: boolean) => void; + setSubmitting: SetSubmittingFn; /** Manually set touched object */ - setTouched: ( - touched: FormikTouched, - shouldValidate?: boolean - ) => void; + setTouched: SetTouchedFn; /** Manually set values object */ - setValues: ( - values: React.SetStateAction, - shouldValidate?: boolean - ) => void; + setValues: SetValuesFn; /** Set value of form field directly */ - setFieldValue: (field: string, value: any, shouldValidate?: boolean) => void; + setFieldValue: SetFieldValueFn; /** Set error message of a form field directly */ - setFieldError: (field: string, message: string | undefined) => void; + setFieldError: SetFieldErrorFn; /** Set whether field has been touched directly */ - setFieldTouched: ( - field: string, - isTouched?: boolean, - shouldValidate?: boolean - ) => void; + setFieldTouched: SetFieldTouchedFn; + /** Detect whether a form is valid based on isInitialValid, errors and dirty */ + isFormValid: IsFormValidFn; /** Validate form values */ - validateForm: (values?: any) => Promise>; + validateForm: ValidateFormFn; /** Validate field value */ - validateField: (field: string) => void; + validateField: ValidateFieldFn; /** Reset form */ - resetForm: (nextState?: Partial>) => void; + resetForm: ResetFormFn; /** Submit the form imperatively */ - submitForm: () => Promise; + submitForm: SubmitFormFn; + /** Get Formik State from outside of Render. */ + getState: GetStateFn; /** Set Formik state, careful! */ - setFormikState: ( - f: - | FormikState - | ((prevState: FormikState) => FormikState), - cb?: () => void - ) => void; + setFormikState: SetFormikStateFn; } -/** - * Formik form event handlers - */ -export interface FormikHandlers { - /** Form submit handler */ - handleSubmit: (e?: React.FormEvent) => void; - /** Reset form event handler */ - handleReset: (e?: React.SyntheticEvent) => void; - handleBlur: { - /** Classic React blur handler, keyed by input name */ - (e: React.FocusEvent): void; - /** Preact-like linkState. Will return a handleBlur function. */ - (fieldOrEvent: T): T extends string - ? (e: any) => void - : void; - }; - handleChange: { - /** Classic React change handler, keyed by input name */ - (e: React.ChangeEvent): void; - /** Preact-like linkState. Will return a handleChange function. */ - >( - field: T - ): T extends React.ChangeEvent - ? void - : (e: string | React.ChangeEvent) => void; - }; +export type GetValueFromEventFn = ( + event: React.SyntheticEvent, + fieldName: string +) => any; + +export type GetFieldHelpersFn = ( + name: string +) => FieldHelperProps; +export interface FieldHelpers { + getValueFromEvent: GetValueFromEventFn; getFieldProps: (props: any) => FieldInputProps; getFieldMeta: (name: string) => FieldMetaProps; - getFieldHelpers: (name: string) => FieldHelperProps; + getFieldHelpers: GetFieldHelpersFn; } +export type HandleSubmitFn = ( + e?: React.FormEvent | undefined +) => void; + +export type HandleResetFn = (e?: any) => void; + /** - * Base formik configuration/props shared between the HoC and Component. + * Event callback returned by `formik.handleBlur`. + */ +export type HandleBlurEventFn = (event: React.FocusEvent) => void; + +/** + * Type of `formik.handleBlur`. + * May be an event callback, or accept a field name and return an event callback. + */ +export type HandleBlurFn = { + (eventOrString: string): HandleBlurEventFn; + // Must remain the same as HandleBlurEventFn + (event: React.FocusEvent): void; +}; + +/** + * Event callback returned by `formik.handleChange`. + */ +export type HandleChangeEventFn = (event: React.ChangeEvent) => void; + +/** + * Type of `formik.handleChange`. + * May be an event callback, or accept a field name and return an event callback. + */ +export type HandleChangeFn = { + (eventOrPath: React.ChangeEvent): void; + // Must remain the same as HandleChangeEventFn + (event: string): HandleChangeEventFn; +}; + +/** + * Formik form event handlers */ -export interface FormikSharedConfig { +export interface FormikHandlers { + handleSubmit: HandleSubmitFn; + handleReset: HandleResetFn; + handleBlur: HandleBlurFn; + handleChange: HandleChangeFn; +} + +export interface FormikValidationConfig { /** Tells Formik to validate the form on each input's onChange event */ validateOnChange?: boolean; /** Tells Formik to validate the form on each input's onBlur event */ validateOnBlur?: boolean; /** Tells Formik to validate upon mount */ validateOnMount?: boolean; +} + +export type FormikApi = FormikHelpers< + Values, + FormikState +> & + FieldHelpers & + FormikHandlers & + FormikValidationConfig & + > & { + unregisterField: UnregisterFieldFn; + registerField: RegisterFieldFn; + }; + +/** + * Base formik configuration/props shared between the HoC and Component. + */ +export type FormikSharedConfig = FormikValidationConfig & { /** Tell Formik if initial form values are valid or not on first render */ isInitialValid?: boolean | ((props: Props) => boolean); /** Should Formik reset the form when new initialValues change */ enableReinitialize?: boolean; -} +}; + +export type ValidateFn = ( + values?: Values | undefined +) => Promise>; /** * props */ -export interface FormikConfig extends FormikSharedConfig { +export interface FormikConfig< + Values, + State extends FormikState = FormikState +> extends FormikSharedConfig { /** * Form component to render */ - component?: React.ComponentType> | React.ReactNode; + component?: React.ComponentType>; /** * Render prop (works like React router's } />) @@ -207,14 +369,17 @@ export interface FormikConfig extends FormikSharedConfig { /** * Reset handler */ - onReset?: (values: Values, formikHelpers: FormikHelpers) => void; + onReset?: ( + values: Values, + formikHelpers: FormikHelpers + ) => void | Promise; /** * Submission handler */ onSubmit: ( values: Values, - formikHelpers: FormikHelpers + formikHelpers: FormikHelpers ) => void | Promise; /** * A Yup Schema or a function that returns a Yup schema @@ -225,10 +390,10 @@ export interface FormikConfig extends FormikSharedConfig { * Validation function. Must return an error object or promise that * throws an error object where that object keys map to corresponding value. */ - validate?: (values: Values) => void | object | Promise>; + validate?: (values: Values) => void | object | ValidateFn; /** Inner ref */ - innerRef?: React.Ref>; + innerRef?: React.Ref>; } /** @@ -237,10 +402,12 @@ export interface FormikConfig extends FormikSharedConfig { */ export type FormikProps = FormikSharedConfig & FormikState & + FormikInitialState & FormikHelpers & + FieldHelpers & FormikHandlers & - FormikComputedProps & - FormikRegistration & { submitForm: () => Promise }; + FormikComputedState & + FormikRegistration; /** Internal Formik registration methods that get passed down as props */ export interface FormikRegistration { @@ -292,6 +459,11 @@ export interface FieldMetaProps { initialError?: string; } +/** + * @deprecated use `SetFieldTouchedFn` + */ +export type SetFieldTouched = SetFieldTouchedFn; + /** Imperative handles to change a field's value, error and touched */ export interface FieldHelperProps { /** Set the field's value */ @@ -299,9 +471,16 @@ export interface FieldHelperProps { /** Set the field's touched value */ setTouched: (value: boolean, shouldValidate?: boolean) => void; /** Set the field's error value */ - setError: (value: Value) => void; + setError: (error: string) => void; } +export type FieldOnChangeProp = ( + eventOrValue: React.ChangeEvent | any +) => void; +export type FieldOnBlurProp = ( + eventOrValue: React.ChangeEvent | any +) => void; + /** Field input value, name, and event handlers */ export interface FieldInputProps { /** Value of the field */ @@ -313,11 +492,24 @@ export interface FieldInputProps { /** Is the field checked? */ checked?: boolean; /** Change event handler */ - onChange: FormikHandlers['handleChange']; + onChange: FieldOnChangeProp; /** Blur event handler */ - onBlur: FormikHandlers['handleBlur']; + onBlur: FieldOnBlurProp; } export type FieldValidator = ( value: any ) => string | void | Promise; + +// This is an object that contains a map of all registered fields +// and their validate functions +export interface FieldRegistry { + [field: string]: { + validate: (value: any) => string | Promise | undefined; + }; +} + +export type ValidationHandler = ( + values: Values, + field?: string +) => Promise>; diff --git a/yarn.lock b/yarn.lock index de5c8a713..a38f9534b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13547,6 +13547,13 @@ url@^0.11.0: punycode "1.3.2" querystring "0.2.0" +use-subscription@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/use-subscription/-/use-subscription-1.5.1.tgz#73501107f02fad84c6dd57965beb0b75c68c42d1" + integrity sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA== + dependencies: + object-assign "^4.1.1" + use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" From 3e6e20c0d6dd8809babada62bf126157057e6123 Mon Sep 17 00:00:00 2001 From: John Rom Date: Wed, 10 Mar 2021 18:38:55 -0500 Subject: [PATCH 04/28] Set up dev environment and implement Field. use-subscriptions might not work in React 17? Seems returning the previous value doesn't bail out the render. --- .vscode/launch.json | 49 + .vscode/settings.json | 3 +- app/next.config.js | 38 + app/package.json | 8 +- app/tsconfig.json | 8 +- lerna.json | 3 +- package.json | 8 +- packages/formik/package.json | 3 +- packages/formik/src/ErrorMessage.tsx | 67 +- packages/formik/src/Field.tsx | 75 +- packages/formik/src/Formik.tsx | 511 ++-- packages/formik/src/helpers/field-helpers.ts | 38 + .../src/hooks/useFormikComputedState.ts | 46 +- packages/formik/src/hooks/useFormikState.ts | 37 +- .../formik/src/hooks/useFormikSubscription.ts | 34 - .../formik/src/hooks/useFullFormikState.ts | 25 +- .../src/hooks/useIsomorphicLayoutEffect.ts | 2 +- .../formik/src/hooks/useOptimizedSelector.ts | 17 +- packages/formik/src/types.tsx | 100 +- yarn.lock | 2551 ++++++++++++++++- 20 files changed, 3021 insertions(+), 602 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 app/next.config.js create mode 100644 packages/formik/src/helpers/field-helpers.ts delete mode 100644 packages/formik/src/hooks/useFormikSubscription.ts diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 000000000..b03621422 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,49 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Run NPM Dev", + "request": "launch", + "type": "node", + "runtimeArgs": [ + "run", + "start:app" + ], + "runtimeExecutable": "npm", + "cwd": "${workspaceFolder}", + "skipFiles": [ + "/**" + ] + }, + { + "type": "node", + "name": "vscode-jest-tests", + "request": "launch", + "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/lerna", + "args": [ + "run", + "test", + "--", + "--runInBand", + // when filtering, every package not matching will have no tests + "--passWithNoTests", + "--testTimeout=9999" + ], + "cwd": "${workspaceFolder}", + "console": "integratedTerminal", + "protocol": "inspector", + "internalConsoleOptions": "neverOpen", + "disableOptimisticBPs": true + }, + { + "type": "chrome", + "request": "launch", + "name": "Launch Chrome against localhost", + "url": "http://localhost:3000", + "webRoot": "${workspaceFolder}/app" + } + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 25fa6215f..10e02695f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,4 @@ { - "typescript.tsdk": "node_modules/typescript/lib" + "typescript.tsdk": "node_modules/typescript/lib", + "jest.pathToJest": "npm run test:vscode --", } diff --git a/app/next.config.js b/app/next.config.js new file mode 100644 index 000000000..884caadf9 --- /dev/null +++ b/app/next.config.js @@ -0,0 +1,38 @@ +// +// Use Next Loaders on Linked Packages +// https://github.com/vercel/next.js/pull/13542#issuecomment-679085557 +// +// eslint-disable-next-line @typescript-eslint/no-var-requires +const path = require('path'); + +module.exports = { + webpack: (config, { defaultLoaders, webpack }) => { + if (config.mode === 'development') { + config.module.rules = [ + ...config.module.rules, + { + test: /\.(tsx|ts|js|mjs|jsx)$/, + include: [path.resolve(config.context, '../')], + use: defaultLoaders.babel, + exclude: excludePath => { + return /node_modules/.test(excludePath); + }, + }, + ]; + + // tsdx uses __DEV__ + config.plugins.push( + new webpack.DefinePlugin({ + __DEV__: process.env.NODE_ENV === 'development', + }) + ); + } + + return config; + }, + + onDemandEntries: { + // Make sure entries are not getting disposed. + maxInactiveAge: 1000 * 60 * 60, + }, +}; \ No newline at end of file diff --git a/app/package.json b/app/package.json index d29ce15bb..9b0cb0484 100644 --- a/app/package.json +++ b/app/package.json @@ -8,10 +8,10 @@ "start": "next start" }, "dependencies": { - "formik": "^2.1.5", + "formik": "^3.0.0-refs1", "next": "9.5.3", - "react": "16.13.1", - "react-dom": "16.13.1", - "yup": "^0.29.3" + "react": "^17.0.1", + "react-dom": "^17.0.1", + "yup": "^0.28.1" } } diff --git a/app/tsconfig.json b/app/tsconfig.json index 137de2f83..42255bd9c 100644 --- a/app/tsconfig.json +++ b/app/tsconfig.json @@ -14,7 +14,13 @@ "noEmit": true, "moduleResolution": "node", "resolveJsonModule": true, - "isolatedModules": true + "isolatedModules": true, + "baseUrl": "../", + "paths": { + "formik": [ + "packages/formik/src" + ], + } }, "include": [ "next-env.d.ts", diff --git a/lerna.json b/lerna.json index 0f87f948c..481e41d1b 100644 --- a/lerna.json +++ b/lerna.json @@ -2,7 +2,8 @@ "npmClient": "yarn", "useWorkspaces": true, "packages": [ - "packages/*" + "packages/*", + "./app" ], "command": { "version": { diff --git a/package.json b/package.json index 8b0e797c9..84398b116 100644 --- a/package.json +++ b/package.json @@ -16,12 +16,16 @@ "typescript": "^4.0.3" }, "workspaces": [ - "packages/*" + "packages/*", + "./app" ], "scripts": { "lerna": "lerna", "dev": "lerna run start --stream --parallel", "test": "lerna run test --", + "test:watch": "lerna run test --stream --no-sort -- --watch", + "test:watchAll": "lerna run test --stream --no-sort -- --watchAll", + "test:vscode": "lerna run test --stream --no-sort --", "build": "lerna run build", "prepublish": "lerna run prepublish", "format": "prettier --write 'examples/**/*' 'packages/*/src/**/*' 'website/src/**/*.{ts,tsx,js,jsx,md,mdx}' 'app/pages/**/*' 'packages/*/test/**/*' 'README.md'", @@ -32,7 +36,7 @@ "cypress": "cypress run", "precommit": "lint-staged", "cypress:open": "cypress open", - "start:app": "npm run build && yarn --cwd packages/formik link && yarn --cwd node_modules/react link && yarn --cwd ./app link react formik && yarn --cwd ./app && yarn --cwd ./app run dev" + "start:app": "yarn --cwd ./app run dev" }, "lint-staged": { "**/*.{ts,tsx,md,mdx,js,jsx}": [ diff --git a/packages/formik/package.json b/packages/formik/package.json index 81a31df9e..c3beae2f7 100644 --- a/packages/formik/package.json +++ b/packages/formik/package.json @@ -1,7 +1,7 @@ { "name": "formik", "description": "Build forms in React, without the tears", - "version": "2.2.6", + "version": "3.0.0-refs1", "license": "Apache-2.0", "author": "Jared Palmer (https://jaredpalmer.com)", "repository": "formium/formik", @@ -60,6 +60,7 @@ "@types/lodash": "^4.14.119", "@types/react": "^16.9.55", "@types/react-dom": "^16.9.9", + "@types/use-subscription": "^1.0.0", "@types/warning": "^3.0.0", "@types/yup": "^0.24.9", "just-debounce-it": "^1.1.0", diff --git a/packages/formik/src/ErrorMessage.tsx b/packages/formik/src/ErrorMessage.tsx index 028573f29..35c7fd585 100644 --- a/packages/formik/src/ErrorMessage.tsx +++ b/packages/formik/src/ErrorMessage.tsx @@ -1,7 +1,6 @@ import * as React from 'react'; -import { FormikContextType } from './types'; -import { getIn, isFunction } from './utils'; -import { connect } from './connect'; +import { isFunction } from './utils'; +import { useFieldMeta } from './Field'; export interface ErrorMessageProps { name: string; @@ -11,48 +10,24 @@ export interface ErrorMessageProps { render?: (errorMessage: string) => React.ReactNode; } -class ErrorMessageImpl extends React.Component< - ErrorMessageProps & { formik: FormikContextType } -> { - shouldComponentUpdate( - props: ErrorMessageProps & { formik: FormikContextType } - ) { - if ( - getIn(this.props.formik.errors, this.props.name) !== - getIn(props.formik.errors, this.props.name) || - getIn(this.props.formik.touched, this.props.name) !== - getIn(props.formik.touched, this.props.name) || - Object.keys(this.props).length !== Object.keys(props).length - ) { - return true; - } else { - return false; - } - } +export const ErrorMessage = (props: ErrorMessageProps) => { + const { component, render, children, name, ...rest } = props; + const fieldMeta = useFieldMeta(props.name); - render() { - let { component, formik, render, children, name, ...rest } = this.props; + const touch = fieldMeta.touched; + const error = fieldMeta.error; - const touch = getIn(formik.touched, name); - const error = getIn(formik.errors, name); - - return !!touch && !!error - ? render - ? isFunction(render) - ? render(error) - : null - : children - ? isFunction(children) - ? children(error) - : null - : component - ? React.createElement(component, rest as any, error) - : error - : null; - } -} - -export const ErrorMessage = connect< - ErrorMessageProps, - ErrorMessageProps & { formik: FormikContextType } ->(ErrorMessageImpl); + return !!touch && !!error + ? render + ? isFunction(render) + ? render(error) + : null + : children + ? isFunction(children) + ? children(error) + : null + : component + ? React.createElement(component, rest as any, error) + : error + : null; +}; diff --git a/packages/formik/src/Field.tsx b/packages/formik/src/Field.tsx index 281ead412..07f134717 100644 --- a/packages/formik/src/Field.tsx +++ b/packages/formik/src/Field.tsx @@ -7,9 +7,27 @@ import { FieldInputProps, FieldValidator, } from './types'; -import { useFormikContext } from './FormikContext'; import { isFunction, isEmptyChildren, isObject } from './utils'; import invariant from 'tiny-warning'; +import { useFormikState } from './hooks/useFormikState'; +import { + fieldMetaIsEqual, + selectFieldMetaByName, +} from './helpers/field-helpers'; +import { useFormikApi } from './hooks/useFormikApi'; +import { useFullFormikState } from './hooks/useFullFormikState'; + +/** + * Returns @see FieldMetaProps + */ +export const useFieldMeta = (name: string): FieldMetaProps => { + const [fieldMeta] = useFormikState( + React.useMemo(() => selectFieldMetaByName(name), [name]), + fieldMetaIsEqual + ); + + return fieldMeta; +}; export interface FieldProps { field: FieldInputProps; @@ -73,13 +91,12 @@ export type FieldAttributes = GenericFieldHTMLAttributes & export type FieldHookConfig = GenericFieldHTMLAttributes & FieldConfig; -export function useField( +export function useField( propsOrFieldName: string | FieldHookConfig ): [FieldInputProps, FieldMetaProps, FieldHelperProps] { - const formik = useFormikContext(); + const formik = useFormikApi(); const { getFieldProps, - getFieldMeta, getFieldHelpers, registerField, unregisterField, @@ -94,6 +111,8 @@ export function useField( const { name: fieldName, validate: validateFn } = props; + const fieldMeta = useFieldMeta(fieldName); + React.useEffect(() => { if (fieldName) { registerField(fieldName, { @@ -120,34 +139,26 @@ export function useField( ); return [ - getFieldProps(props), - getFieldMeta(fieldName), + // use fieldProps based on current render meta + getFieldProps(props, fieldMeta), + fieldMeta, getFieldHelpers(fieldName), ]; } -export function Field({ - validate, - name, +export function Field({ render, children, as: is, // `as` is reserved in typescript lol component, ...props }: FieldAttributes) { - const { - validate: _validate, - validationSchema: _validationSchema, - - ...formik - } = useFormikContext(); - if (__DEV__) { // eslint-disable-next-line react-hooks/rules-of-hooks React.useEffect(() => { invariant( !render, - ` has been deprecated and will be removed in future versions of Formik. Please use a child callback function instead. To get rid of this warning, replace ...} /> with {({field, form, meta}) => ...}` + ` has been deprecated and will be removed in future versions of Formik. Please use a child callback function instead. To get rid of this warning, replace ...} /> with {({field, form, meta}) => ...}` ); invariant( @@ -168,19 +179,21 @@ export function Field({ }, []); } - // Register field and field-level validation with parent - const { registerField, unregisterField } = formik; - React.useEffect(() => { - registerField(name, { - validate: validate, - }); - return () => { - unregisterField(name); - }; - }, [registerField, unregisterField, name, validate]); - const field = formik.getFieldProps({ name, ...props }); - const meta = formik.getFieldMeta(name); - const legacyBag = { field, form: formik }; + const [field, meta] = useField(props); + + /** + * If we use render function or use functional children, we continue to + * subscribe to the full FormikState because these do not have access to hooks. + * + * Otherwise, we will pointlessly get the initial values but never subscribe to updates. + */ + const formikApi = useFormikApi(); + const formikState = useFullFormikState( + formikApi, + !!render || isFunction(children) + ); + + const legacyBag = { field, form: { ...formikState, ...formikApi } }; if (render) { return render({ ...legacyBag, meta }); @@ -203,7 +216,7 @@ export function Field({ // We don't pass `meta` for backwards compat return React.createElement( component, - { field, form: formik, ...props }, + { field, form: formikApi, ...props }, children ); } diff --git a/packages/formik/src/Formik.tsx b/packages/formik/src/Formik.tsx index e0119136a..5c0f161ce 100755 --- a/packages/formik/src/Formik.tsx +++ b/packages/formik/src/Formik.tsx @@ -13,7 +13,11 @@ import { FieldHelperProps, FieldInputProps, FormikHelpers, - FormikHandlers, + FormikApi, + HandleBlurFn, + HandleBlurEventFn, + HandleChangeEventFn, + HandleChangeFn, } from './types'; import { isFunction, @@ -21,13 +25,23 @@ import { setIn, isEmptyChildren, isPromise, - setNestedObjectValues, getActiveElement, getIn, isObject, + setNestedObjectValues, } from './utils'; import { FormikProvider } from './FormikContext'; import invariant from 'tiny-warning'; +import { useFullFormikState } from './hooks/useFullFormikState'; +import { useIsomorphicLayoutEffect } from './hooks/useIsomorphicLayoutEffect'; +import { + Comparer, + Selector, + useOptimizedSelector, +} from './hooks/useOptimizedSelector'; +import { unstable_batchedUpdates } from 'react-dom'; +import { useSubscription } from 'use-subscription'; +import { selectFieldMetaByName } from './helpers/field-helpers'; type FormikMessage = | { type: 'SUBMIT_ATTEMPT' } @@ -48,56 +62,75 @@ type FormikMessage = } | { type: 'RESET_FORM'; - payload: FormikState; + payload: Partial>; }; - -export function formikReducer( +// State reducer +function formikReducer( state: FormikState, msg: FormikMessage -): FormikState { - - /** - * Add Dirty + InitialX management to the FormikReducer - */ +) { switch (msg.type) { case 'SET_VALUES': + return { ...state, values: msg.payload }; + case 'SET_TOUCHED': + return { ...state, touched: msg.payload }; + case 'SET_ERRORS': + if (isEqual(state.errors, msg.payload)) { + return state; + } + + return { ...state, errors: msg.payload }; + case 'SET_STATUS': + return { ...state, status: msg.payload }; + case 'SET_ISSUBMITTING': + return { ...state, isSubmitting: msg.payload }; + case 'SET_ISVALIDATING': + return { ...state, isValidating: msg.payload }; + case 'SET_FIELD_VALUE': return { ...state, - dirty: !isEqual(state.initialValues, state.values), + values: setIn(state.values, msg.payload.field, msg.payload.value), }; - case 'RESET_VALUES': + case 'SET_FIELD_TOUCHED': return { ...state, - initialValues: msg.payload, - dirty: !isEqual(state.initialValues, state.values), + touched: setIn(state.touched, msg.payload.field, msg.payload.value), }; - case 'RESET_TOUCHED': + case 'SET_FIELD_ERROR': return { ...state, - initialTouched: msg.payload, + errors: setIn(state.errors, msg.payload.field, msg.payload.value), }; - case 'RESET_ERRORS': + case 'RESET_FORM': + return { ...state, ...msg.payload }; + case 'SET_FORMIK_STATE': + return msg.payload(state); + case 'SUBMIT_ATTEMPT': return { ...state, - initialErrors: msg.payload, + touched: setNestedObjectValues>( + state.values, + true + ), + isSubmitting: true, + submitCount: state.submitCount + 1, }; - case 'RESET_STATUS': + case 'SUBMIT_FAILURE': return { ...state, - initialStatus: msg.payload, + isSubmitting: false, }; - case 'SET_FIELD_VALUE': + case 'SUBMIT_SUCCESS': return { ...state, - dirty: !isEqual(state.initialValues, state.values), + isSubmitting: false, }; default: return state; } } - // Initial empty states // objects const emptyErrors: FormikErrors = {}; const emptyTouched: FormikTouched = {}; @@ -111,8 +144,8 @@ interface FieldRegistry { } export function useFormik( - rawProps: FormikConfig> -) { + rawProps: FormikConfig +): FormikApi { const { validateOnChange = true, validateOnBlur = true, @@ -184,34 +217,25 @@ export function useFormik( isSubmitting: false, isValidating: false, submitCount: 0, - dirty: false, }); + const getState = React.useCallback(() => stateRef.current, [stateRef]); + const [state, internalDispatch] = React.useReducer< + React.Reducer, FormikMessage> + >(formikReducer, stateRef.current); + /** - * Breaking all the rules, re: "must be side-effect free" - * BUT that's probably OK - * - * The only things that should use stateRef are side effects / event callbacks - * + * Each call to dispatch _immediately_ updates the ref. It also dispatches to React's internal dispatcher. */ - const refBoundFormikReducer = React.useCallback( - ( - state: FormikState, - msg: FormikMessage - ) => { - // decorate the core Formik reducer with one which tracks dirty and initialX in state - const result = formikRefReducer(state, msg); - - stateRef.current = result; - - return result; + const dispatch = React.useCallback( + (msg: FormikMessage) => { + // double reducer + stateRef.current = formikReducer(stateRef.current, msg); + internalDispatch(msg); }, [stateRef] ); - const getState = React.useCallback(() => stateRef.current, [stateRef]); - const [state, dispatch] = React.useReducer(refBoundFormikReducer, stateRef.current); - React.useEffect(() => { isMounted.current = true; @@ -358,7 +382,7 @@ export function useFormik( // Run all validations methods and update state accordingly const validateFormWithHighPriority = useEventCallback( - (values: Values = getState().values) => { + (values: Values = state.values) => { dispatch({ type: 'SET_ISVALIDATING', payload: true }); return runAllValidations(values).then(combinedErrors => { if (!!isMounted.current) { @@ -372,53 +396,54 @@ export function useFormik( } ); - React.useEffect(() => { + const performValidationOnMount = useEventCallback(() => { if ( validateOnMount && isMounted.current === true && - isEqual(initialValues.current, props.initialValues) + isEqual(state.initialValues, props.initialValues) ) { - validateFormWithHighPriority(initialValues.current); + validateFormWithHighPriority(state.initialValues); } - }, [validateOnMount, validateFormWithHighPriority]); + }); + + React.useEffect(() => { + performValidationOnMount(); + }, [performValidationOnMount]); - const resetForm = React.useCallback( + const resetForm = useEventCallback( (nextState?: Partial>) => { const values = - nextState && nextState.values - ? nextState.values - : initialValues.current; + nextState?.values ?? nextState?.initialValues ?? state.initialValues; const errors = - nextState && nextState.errors - ? nextState.errors - : initialErrors.current - ? initialErrors.current - : props.initialErrors || {}; + nextState?.errors ?? + nextState?.initialErrors ?? + state?.initialErrors ?? + props.initialErrors ?? + {}; const touched = - nextState && nextState.touched - ? nextState.touched - : initialTouched.current - ? initialTouched.current - : props.initialTouched || {}; + nextState?.touched ?? + nextState?.initialTouched ?? + state.initialTouched ?? + props.initialTouched ?? + {}; const status = - nextState && nextState.status - ? nextState.status - : initialStatus.current - ? initialStatus.current - : props.initialStatus; - initialValues.current = values; - initialErrors.current = errors; - initialTouched.current = touched; - initialStatus.current = status; + nextState?.status ?? + nextState?.initialStatus ?? + state.initialStatus ?? + props.initialStatus; const dispatchFn = () => { dispatch({ type: 'RESET_FORM', payload: { isSubmitting: !!nextState && !!nextState.isSubmitting, + initialErrors: errors, errors, + initialTouched: touched, touched, + initialStatus: status, status, + initialValues: values, values, isValidating: !!nextState && !!nextState.isValidating, submitCount: @@ -445,73 +470,123 @@ export function useFormik( } else { dispatchFn(); } - }, - [props.initialErrors, props.initialStatus, props.initialTouched] + } ); - React.useEffect(() => { - if ( - isMounted.current === true && - !isEqual(initialValues.current, props.initialValues) - ) { - if (enableReinitialize) { - initialValues.current = props.initialValues; - resetForm(); - } + const maybeUpdateInitialValues = useEventCallback( + ( + nextInitialValuesProp: FormikConfig['initialValues'], + nextEnableReinitialize: FormikConfig['enableReinitialize'], + nextValidateOnMount: FormikConfig['validateOnMount'] + ) => { + if ( + isMounted.current === true && + !isEqual(state.initialValues, nextInitialValuesProp) + ) { + if (nextEnableReinitialize) { + resetForm({ initialValues: nextInitialValuesProp }); + } - if (validateOnMount) { - validateFormWithHighPriority(initialValues.current); + if (nextValidateOnMount) { + validateFormWithHighPriority(state.initialValues); + } } } + ); + + React.useEffect(() => { + maybeUpdateInitialValues( + props.initialValues, + enableReinitialize, + validateOnMount + ); }, [ + maybeUpdateInitialValues, enableReinitialize, props.initialValues, - resetForm, validateOnMount, - validateFormWithHighPriority, ]); - React.useEffect(() => { - if ( - enableReinitialize && - isMounted.current === true && - !isEqual(initialErrors.current, props.initialErrors) - ) { - initialErrors.current = props.initialErrors || emptyErrors; - dispatch({ - type: 'SET_ERRORS', - payload: props.initialErrors || emptyErrors, - }); + const maybeUpdateInitialErrors = useEventCallback( + ( + nextInitialErrorsProp: FormikConfig['initialErrors'], + nextEnableReinitialize: FormikConfig['enableReinitialize'] + ) => { + if ( + nextEnableReinitialize && + isMounted.current === true && + !isEqual(state.initialErrors, nextInitialErrorsProp) + ) { + const errors = nextInitialErrorsProp || emptyErrors; + + dispatch({ + type: 'RESET_FORM', + payload: { + initialErrors: errors, + errors, + }, + }); + } } - }, [enableReinitialize, props.initialErrors]); + ); React.useEffect(() => { - if ( - enableReinitialize && - isMounted.current === true && - !isEqual(initialTouched.current, props.initialTouched) - ) { - initialTouched.current = props.initialTouched || emptyTouched; - dispatch({ - type: 'SET_TOUCHED', - payload: props.initialTouched || emptyTouched, - }); + maybeUpdateInitialErrors(props.initialErrors, enableReinitialize); + }, [maybeUpdateInitialErrors, props.initialErrors, enableReinitialize]); + + const maybeUpdateInitialTouched = useEventCallback( + ( + nextInitialTouchedProp: FormikConfig['initialTouched'], + nextEnableReinitialize: FormikConfig['enableReinitialize'] + ) => { + if ( + nextEnableReinitialize && + isMounted.current === true && + !isEqual(state.initialTouched, nextInitialTouchedProp) + ) { + const touched = nextInitialTouchedProp || emptyTouched; + + dispatch({ + type: 'RESET_FORM', + payload: { + initialTouched: touched, + touched, + }, + }); + } } - }, [enableReinitialize, props.initialTouched]); + ); React.useEffect(() => { - if ( - enableReinitialize && - isMounted.current === true && - !isEqual(initialStatus.current, props.initialStatus) - ) { - initialStatus.current = props.initialStatus; - dispatch({ - type: 'SET_STATUS', - payload: props.initialStatus, - }); + maybeUpdateInitialTouched(props.initialTouched, enableReinitialize); + }, [maybeUpdateInitialTouched, enableReinitialize, props.initialTouched]); + + const maybeUpdateInitialStatus = useEventCallback( + ( + nextInitialStatusProp: FormikConfig['initialStatus'], + nextEnableReinitialize: FormikConfig['enableReinitialize'] + ) => { + if ( + nextEnableReinitialize && + isMounted.current === true && + !isEqual(state.initialStatus, nextInitialStatusProp) + ) { + const status = nextInitialStatusProp; + + dispatch({ + type: 'RESET_FORM', + payload: { + initialStatus: status, + status, + }, + }); + } } - }, [enableReinitialize, props.initialStatus, props.initialTouched]); + ); + + React.useEffect(() => { + maybeUpdateInitialStatus(props.initialStatus, enableReinitialize); + }, [maybeUpdateInitialStatus, enableReinitialize, props.initialStatus]); const validateField = useEventCallback((name: string) => { // This will efficiently validate a single field by avoiding state @@ -583,9 +658,12 @@ export function useFormik( } ); - const setErrors = React.useCallback((errors: FormikErrors) => { - dispatch({ type: 'SET_ERRORS', payload: errors }); - }, []); + const setErrors = React.useCallback( + (errors: FormikErrors) => { + dispatch({ type: 'SET_ERRORS', payload: errors }); + }, + [dispatch] + ); const setValues = useEventCallback( (values: React.SetStateAction, shouldValidate?: boolean) => { @@ -607,7 +685,7 @@ export function useFormik( payload: { field, value }, }); }, - [] + [dispatch] ); const setFieldValue = useEventCallback( @@ -683,17 +761,18 @@ export function useFormik( [setFieldValue, state.values] ); - const handleChange = useEventCallback( + const handleChange = useEventCallback( ( eventOrPath: string | React.ChangeEvent - ): void | ((eventOrTextValue: string | React.ChangeEvent) => void) => { + ): HandleChangeEventFn | void => { if (isString(eventOrPath)) { - return event => executeChange(event, eventOrPath); + return (event: string | React.ChangeEvent) => + executeChange(event, eventOrPath); } else { - executeChange(eventOrPath); + return executeChange(eventOrPath); } } - ); + ) as HandleChangeFn; const setFieldTouched = useEventCallback( (field: string, touched: boolean = true, shouldValidate?: boolean) => { @@ -733,15 +812,22 @@ export function useFormik( [setFieldTouched] ); - const handleBlur = useEventCallback( - (eventOrString: any): void | ((e: any) => void) => { - if (isString(eventOrString)) { - return event => executeBlur(event, eventOrString); + /** + * TypeScript doesn't currently allow you to infer overloads from a Type. + * + * Instead, we make sure this function returns any possibility of HandleBlurFn, + * and then cast it. + */ + const handleBlur = useEventCallback( + (eventOrPath: string | React.FocusEvent): HandleBlurEventFn | void => { + if (isString(eventOrPath)) { + return (event: React.FocusEvent) => + executeBlur(event, eventOrPath); } else { - executeBlur(eventOrString); + return executeBlur(eventOrPath); } } - ); + ) as HandleBlurFn; const setFormikState = React.useCallback( ( @@ -755,16 +841,22 @@ export function useFormik( dispatch({ type: 'SET_FORMIK_STATE', payload: () => stateOrCb }); } }, - [] + [dispatch] ); - const setStatus = React.useCallback((status: any) => { - dispatch({ type: 'SET_STATUS', payload: status }); - }, []); + const setStatus = React.useCallback( + (status: any) => { + dispatch({ type: 'SET_STATUS', payload: status }); + }, + [dispatch] + ); - const setSubmitting = React.useCallback((isSubmitting: boolean) => { - dispatch({ type: 'SET_ISSUBMITTING', payload: isSubmitting }); - }, []); + const setSubmitting = React.useCallback( + (isSubmitting: boolean) => { + dispatch({ type: 'SET_ISSUBMITTING', payload: isSubmitting }); + }, + [dispatch] + ); const submitForm = useEventCallback(() => { dispatch({ type: 'SUBMIT_ATTEMPT' }); @@ -886,7 +978,7 @@ export function useFormik( }; const executeSubmit = useEventCallback(() => { - return onSubmit(state.values, imperativeMethods); + return props.onSubmit(state.values, imperativeMethods); }); const handleReset = useEventCallback(e => { @@ -903,16 +995,23 @@ export function useFormik( const getFieldMeta = React.useCallback( (name: string): FieldMetaProps => { - return { - value: getIn(state.values, name), - error: getIn(state.errors, name), - touched: !!getIn(state.touched, name), - initialValue: getIn(initialValues.current, name), - initialTouched: !!getIn(initialTouched.current, name), - initialError: getIn(initialErrors.current, name), - }; + return selectFieldMetaByName(name)({ + errors: state.errors, + initialErrors: state.initialErrors, + initialTouched: state.initialTouched, + initialValues: state.initialValues, + touched: state.touched, + values: state.values, + }); }, - [state.errors, state.touched, state.values] + [ + state.errors, + state.initialErrors, + state.initialTouched, + state.initialValues, + state.touched, + state.values, + ] ); const getFieldHelpers = React.useCallback( @@ -929,10 +1028,14 @@ export function useFormik( ); const getFieldProps = React.useCallback( - (nameOrOptions): FieldInputProps => { + ( + nameOrOptions, + forFieldMeta?: FieldMetaProps + ): FieldInputProps => { const isAnObject = isObject(nameOrOptions); const name = isAnObject ? nameOrOptions.name : nameOrOptions; - const valueState = getIn(state.values, name); + const fieldMeta = forFieldMeta ?? getFieldMeta(name); + const valueState = fieldMeta.value; const field: FieldInputProps = { name, @@ -967,36 +1070,88 @@ export function useFormik( } return field; }, - [handleBlur, handleChange, state.values] + [getFieldMeta, handleBlur, handleChange] ); const dirty = React.useMemo( - () => !isEqual(initialValues.current, state.values), - [initialValues.current, state.values] + () => !isEqual(state.initialValues, state.values), + [state.initialValues, state.values] ); const isValid = React.useMemo( () => - typeof isInitialValid !== 'undefined' + typeof props.isInitialValid !== 'undefined' ? dirty ? state.errors && Object.keys(state.errors).length === 0 - : isInitialValid !== false && isFunction(isInitialValid) - ? (isInitialValid as (props: FormikConfig) => boolean)(props) - : (isInitialValid as boolean) + : props.isInitialValid !== false && isFunction(props.isInitialValid) + ? props.isInitialValid(props) + : props.isInitialValid : state.errors && Object.keys(state.errors).length === 0, - [isInitialValid, dirty, state.errors, props] + [dirty, state.errors, props] + ); + + const subscriptionsRef = React.useRef([]); + + const useState = React.useCallback( + ( + selector: Selector, Return>, + comparer: Comparer = Object.is, + shouldSubscribe = true + ) => { + // this is a hook, but meant to be used by other components + // eslint-disable-next-line react-hooks/rules-of-hooks + selector = useOptimizedSelector(selector, comparer); + + // eslint-disable-next-line react-hooks/rules-of-hooks + const subscription = React.useMemo( + () => ({ + getCurrentValue: () => selector(getState()), + subscribe: shouldSubscribe + ? (callback: Function) => { + subscriptionsRef.current.push(callback); + + return () => + subscriptionsRef.current.filter( + (cb: Function) => cb !== callback + ); + } + : () => () => {}, + }), + [selector, shouldSubscribe] + ); + + // eslint-disable-next-line react-hooks/rules-of-hooks + return useSubscription(subscription); + }, + [getState] ); - const ctx = { - ...state, - initialValues: initialValues.current, - initialErrors: initialErrors.current, - initialTouched: initialTouched.current, - initialStatus: initialStatus.current, + useIsomorphicLayoutEffect(() => { + unstable_batchedUpdates(() => { + subscriptionsRef.current.forEach(callback => callback()); + }); + }, [state]); + + const ctx: FormikApi = { + // config + initialValues: props.initialValues, + initialTouched: props.initialTouched, + initialErrors: props.initialErrors, + initialStatus: props.initialStatus, + validateOnBlur, + validateOnChange, + validateOnMount, + validationSchema: props.validationSchema, + validate: props.validate, + // computed props + dirty, + isValid, + // handlers handleBlur, handleChange, handleReset, handleSubmit, + // helpers resetForm, setErrors, setFormikState, @@ -1010,16 +1165,14 @@ export function useFormik( submitForm, validateForm: validateFormWithHighPriority, validateField, - isValid, - dirty, unregisterField, registerField, getFieldProps, getFieldMeta, getFieldHelpers, - validateOnBlur, - validateOnChange, - validateOnMount, + // state helpers + getState, + useState, }; return ctx; @@ -1032,20 +1185,18 @@ export function Formik< const formikApi = useFormik(props); const { component, children, render, innerRef } = props; - const formikState = useFullFormikState( + const formikState = useFullFormikState( formikApi, !!component || !!render || isFunction(children) ); - - // This allows folks to pass a ref to - React.useImperativeHandle(innerRef, () => formikbag); - const formikbag: FormikProps = { ...formikApi, ...formikState, }; + // This allows folks to pass a ref to + React.useImperativeHandle(innerRef, () => formikApi); if (__DEV__) { // eslint-disable-next-line react-hooks/rules-of-hooks diff --git a/packages/formik/src/helpers/field-helpers.ts b/packages/formik/src/helpers/field-helpers.ts new file mode 100644 index 000000000..9707759e2 --- /dev/null +++ b/packages/formik/src/helpers/field-helpers.ts @@ -0,0 +1,38 @@ +import { FieldMetaProps, FormikState } from '../types'; +import { getIn } from '../utils'; + +export const selectFieldMetaByName = (name: string) => < + Values, + State extends FormikState +>( + state: Pick< + State, + | 'values' + | 'errors' + | 'touched' + | 'initialValues' + | 'initialTouched' + | 'initialErrors' + > +) => ({ + value: getIn(state.values, name), + error: getIn(state.errors, name), + touched: !!getIn(state.touched, name), + initialValue: getIn(state.initialValues, name), + initialTouched: !!getIn(state.initialTouched, name), + initialError: getIn(state.initialErrors, name), +}); + +/** + * Example of an optimized comparer. + */ +export const fieldMetaIsEqual = ( + prev: FieldMetaProps, + next: FieldMetaProps +) => + prev.value === next.value && + prev.touched === next.touched && + prev.error === next.error && + prev.initialValue === next.initialValue && + prev.initialTouched === next.initialTouched && + prev.initialError === next.initialError; diff --git a/packages/formik/src/hooks/useFormikComputedState.ts b/packages/formik/src/hooks/useFormikComputedState.ts index 6291d560a..179466849 100644 --- a/packages/formik/src/hooks/useFormikComputedState.ts +++ b/packages/formik/src/hooks/useFormikComputedState.ts @@ -1,35 +1,15 @@ import { useMemo } from 'react'; -import { FormikApi } from './useFormikApi'; -import { FormikState } from '../types'; -import isEqual from 'react-fast-compare'; -import { useFormikState } from './useFormikState'; - -export const useFormikComputedStateInternal = ( - api: FormikApi, - state: Pick, 'errors' | 'dirty'> -): FormikComputedState => { - const { isFormValid } = api; - - const isValid = useMemo(() => { - return isFormValid(state.errors, state.dirty); - }, [isFormValid, state.errors, state.dirty]); - - return { - isValid, - dirty: state.dirty, - }; -}; - -const selectComputedState = (state: FormikState) => ({ - errors: state.errors, - dirty: state.dirty, -}); - -/** - * Subscribe to Formik State and Computed State updates. - */ -export const useFormikComputedState = () => { - const [computedState, api] = useFormikState(selectComputedState, isEqual); - - return useFormikComputedStateInternal(api, computedState); +import { FormikApi, FormikComputedState } from './../types'; + +export const useFormikComputedState = ({ + dirty, + isValid, +}: FormikApi): FormikComputedState => { + return useMemo( + () => ({ + dirty, + isValid, + }), + [dirty, isValid] + ); }; diff --git a/packages/formik/src/hooks/useFormikState.ts b/packages/formik/src/hooks/useFormikState.ts index dfca17d8f..4ebf2db47 100644 --- a/packages/formik/src/hooks/useFormikState.ts +++ b/packages/formik/src/hooks/useFormikState.ts @@ -1,39 +1,12 @@ -import { useOptimizedSelector, Selector, Comparer } from './useOptimizedSelector'; -import { useFormikStateSubscription } from './useFormikSubscription'; -import { FormikApi, useFormikApi } from './useFormikApi'; -import { FormikState } from '../types'; +import { Selector, Comparer } from './useOptimizedSelector'; +import { useFormikApi } from './useFormikApi'; +import { FormikApi, FormikState } from '../types'; -/** - * `useFormikState`, but accepting `FormikApi` as a parameter. - * - * @param api FormikApi instance returned by `useFormik` or `useFormikApi` - */ -export const useFormikApiState = ( - api: FormikApi, - selector: Selector, Return>, - comparer: Comparer = Object.is, - shouldSubscribe = true -) => { - selector = useOptimizedSelector(selector, comparer); - - return useFormikStateSubscription( - api, - selector, - shouldSubscribe - ); -}; - -/** - * Subscribe to Formik State and Computed State updates. - */ export const useFormikState = ( selector: Selector, Return>, - comparer: Comparer = Object.is, + comparer?: Comparer, shouldSubscribe = true ): [Return, FormikApi] => { const api = useFormikApi(); - return [ - useFormikApiState(api, selector, comparer, shouldSubscribe), - api, - ]; + return [api.useState(selector, comparer, shouldSubscribe), api]; }; diff --git a/packages/formik/src/hooks/useFormikSubscription.ts b/packages/formik/src/hooks/useFormikSubscription.ts deleted file mode 100644 index 739231476..000000000 --- a/packages/formik/src/hooks/useFormikSubscription.ts +++ /dev/null @@ -1,34 +0,0 @@ -import React from 'react'; -import { FormikState, FormikValues } from '../types'; -import { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect'; - -export type FormikSliceFn = ( - formState: FormikState -) => Result; - -/** - * Important! Use a stable or memoized subscriber. - */ -export const useFormikStateSubscription = < - Values extends FormikValues, - Return ->( - api: FormikApi, - selector: FormikSliceFn, - shouldSubscribe = true -) => { - const { subscribe, getState } = api; - const [sliceState, setSliceState] = React.useState(() => - selector(getState()) - ); - - useIsomorphicLayoutEffect(() => { - if (shouldSubscribe) { - return subscribe(selector, setSliceState); - } - - return; - }, [subscribe, selector, shouldSubscribe]); - - return sliceState; -}; diff --git a/packages/formik/src/hooks/useFullFormikState.ts b/packages/formik/src/hooks/useFullFormikState.ts index 83fd5599d..022f335fa 100644 --- a/packages/formik/src/hooks/useFullFormikState.ts +++ b/packages/formik/src/hooks/useFullFormikState.ts @@ -1,28 +1,15 @@ -import { useFormikComputedStateInternal } from './useFormikComputedState'; import { useMemo } from 'react'; -import { FormikApi } from './useFormikApi'; -import { FormikState } from '../types'; -import { useFormikApiState } from './useFormikState'; +import { FormikApi, FormikComputedState, FormikState } from '../types'; +import { useFormikComputedState } from './useFormikComputedState'; -export type FullFormikState = FormikState & FormikComputedState; - -export type SelectFullStateFn = ( - state: FormikState -) => FormikState; - -export const selectFullState: SelectFullStateFn = state => state; +export const selectFullState = (value: T) => value; export const useFullFormikState = ( api: FormikApi, shouldSubscribe = true -) => { - const state = useFormikApiState( - api, - selectFullState, - Object.is, - shouldSubscribe - ); - const computedState = useFormikComputedStateInternal(api, state); +): FormikState & FormikComputedState => { + const state = api.useState(selectFullState, Object.is, shouldSubscribe); + const computedState = useFormikComputedState(api); return useMemo( () => ({ diff --git a/packages/formik/src/hooks/useIsomorphicLayoutEffect.ts b/packages/formik/src/hooks/useIsomorphicLayoutEffect.ts index ae09e3c59..59ddc9e77 100644 --- a/packages/formik/src/hooks/useIsomorphicLayoutEffect.ts +++ b/packages/formik/src/hooks/useIsomorphicLayoutEffect.ts @@ -1,4 +1,4 @@ -import { useEffect, useLayoutEffect } from "react"; +import { useEffect, useLayoutEffect } from 'react'; // React currently throws a warning when using useLayoutEffect on the server. // To get around it, we can conditionally useEffect on the server (no-op) and diff --git a/packages/formik/src/hooks/useOptimizedSelector.ts b/packages/formik/src/hooks/useOptimizedSelector.ts index 564d5676f..5be379fe7 100644 --- a/packages/formik/src/hooks/useOptimizedSelector.ts +++ b/packages/formik/src/hooks/useOptimizedSelector.ts @@ -1,4 +1,4 @@ -import { useCallback, useMemo } from 'react'; +import { useMemo } from 'react'; export type Selector = (value: Value) => Return; export type Comparer = (prev: Return, next: Return) => boolean; @@ -15,9 +15,14 @@ export const useOptimizedSelector = ( return (value: Value) => { const newValue = selector(value); - return cachedValue !== UNINITIALIZED_VALUE && comparer(cachedValue, newValue) - ? cachedValue - : (cachedValue = newValue); - } + if ( + cachedValue === UNINITIALIZED_VALUE || + !comparer(cachedValue, newValue) + ) { + cachedValue = newValue; + } + + return cachedValue; + }; }, [selector, comparer]); -} +}; diff --git a/packages/formik/src/types.tsx b/packages/formik/src/types.tsx index e7bb10859..48943a4ac 100644 --- a/packages/formik/src/types.tsx +++ b/packages/formik/src/types.tsx @@ -1,4 +1,5 @@ import * as React from 'react'; +import { Comparer, Selector } from './hooks/useOptimizedSelector'; /** * Values of fields in the form @@ -37,7 +38,7 @@ export type FormikTouched = { /** * Formik state tree */ -export interface FormikState { +export interface FormikCurrentState { /** Form values */ values: Values; /** map of field names to specific error for that field */ @@ -61,13 +62,8 @@ export interface FormikInitialState { initialStatus: FormikConfig['initialStatus']; } -type MakeRefs = { - [key in keyof T]: React.MutableRefObject; -}; - -export type FormikRefs = MakeRefs> & { - isMounted: React.MutableRefObject; -}; +export type FormikState = FormikInitialState & + FormikCurrentState; export type FormikMessage< Values, @@ -137,11 +133,6 @@ export type SetErrorsFn = ( errors: FormikErrors ) => void; -export type IsFormValidFn = ( - errors: FormikErrors, - dirty: boolean -) => boolean; - export type SetSubmittingFn = (isSubmitting: boolean) => void; export type SetTouchedFn = ( @@ -179,10 +170,9 @@ export type ValidateFieldFn = ( name: string ) => Promise; -export type ResetFormFn< - Values extends FormikValues, - State extends FormikState -> = (nextState?: Partial | undefined) => void; +export type ResetFormFn = ( + nextState?: Partial> | undefined +) => void; export type SetFormikStateFn = ( stateOrCb: @@ -192,10 +182,7 @@ export type SetFormikStateFn = ( export type SubmitFormFn = () => Promise; -export interface FormikHelpers< - Values, - State extends FormikState = FormikState -> { +export interface FormikHelpers { /** Manually set top level status. */ setStatus: SetStatusFn; /** Manually set errors object */ @@ -212,22 +199,29 @@ export interface FormikHelpers< setFieldError: SetFieldErrorFn; /** Set whether field has been touched directly */ setFieldTouched: SetFieldTouchedFn; - /** Detect whether a form is valid based on isInitialValid, errors and dirty */ - isFormValid: IsFormValidFn; /** Validate form values */ validateForm: ValidateFormFn; /** Validate field value */ validateField: ValidateFieldFn; /** Reset form */ - resetForm: ResetFormFn; + resetForm: ResetFormFn; /** Submit the form imperatively */ submitForm: SubmitFormFn; - /** Get Formik State from outside of Render. */ - getState: GetStateFn; /** Set Formik state, careful! */ setFormikState: SetFormikStateFn; } +export interface FormikStateHelpers { + /** Get Formik State from outside of Render. */ + getState: GetStateFn; + /** Use Formik State from within Render. */ + useState: ( + selector: Selector, Return>, + comparer?: Comparer, + shouldSubscribe?: boolean + ) => Return; +} + export type GetValueFromEventFn = ( event: React.SyntheticEvent, fieldName: string @@ -238,8 +232,10 @@ export type GetFieldHelpersFn = ( ) => FieldHelperProps; export interface FieldHelpers { - getValueFromEvent: GetValueFromEventFn; - getFieldProps: (props: any) => FieldInputProps; + getFieldProps: ( + props: any, + forFieldMeta?: FieldMetaProps + ) => FieldInputProps; getFieldMeta: (name: string) => FieldMetaProps; getFieldHelpers: GetFieldHelpersFn; } @@ -290,23 +286,31 @@ export interface FormikHandlers { handleChange: HandleChangeFn; } -export interface FormikValidationConfig { +export interface FormikValidationConfig { /** Tells Formik to validate the form on each input's onChange event */ validateOnChange?: boolean; /** Tells Formik to validate the form on each input's onBlur event */ validateOnBlur?: boolean; /** Tells Formik to validate upon mount */ validateOnMount?: boolean; + /** + * A Yup Schema or a function that returns a Yup schema + */ + validationSchema?: any | (() => any); + /** + * Validation function. Must return an error object or promise that + * throws an error object where that object keys map to corresponding value. + */ + validate?: (values: Values) => void | object | ValidateFn; } -export type FormikApi = FormikHelpers< - Values, - FormikState -> & +export type FormikApi = FormikHelpers & + FormikStateHelpers & FieldHelpers & FormikHandlers & - FormikValidationConfig & - > & { + FormikValidationConfig & + FormikInitialState & + FormikComputedState & { unregisterField: UnregisterFieldFn; registerField: RegisterFieldFn; }; @@ -314,7 +318,10 @@ export type FormikApi = FormikHelpers< /** * Base formik configuration/props shared between the HoC and Component. */ -export type FormikSharedConfig = FormikValidationConfig & { +export type FormikSharedConfig< + Props = {}, + Values = any +> = FormikValidationConfig & { /** Tell Formik if initial form values are valid or not on first render */ isInitialValid?: boolean | ((props: Props) => boolean); /** Should Formik reset the form when new initialValues change */ @@ -328,10 +335,7 @@ export type ValidateFn = ( /** * props */ -export interface FormikConfig< - Values, - State extends FormikState = FormikState -> extends FormikSharedConfig { +export interface FormikConfig extends FormikSharedConfig { /** * Form component to render */ @@ -371,7 +375,7 @@ export interface FormikConfig< */ onReset?: ( values: Values, - formikHelpers: FormikHelpers + formikHelpers: FormikHelpers ) => void | Promise; /** @@ -379,18 +383,8 @@ export interface FormikConfig< */ onSubmit: ( values: Values, - formikHelpers: FormikHelpers + formikHelpers: FormikHelpers ) => void | Promise; - /** - * A Yup Schema or a function that returns a Yup schema - */ - validationSchema?: any | (() => any); - - /** - * Validation function. Must return an error object or promise that - * throws an error object where that object keys map to corresponding value. - */ - validate?: (values: Values) => void | object | ValidateFn; /** Inner ref */ innerRef?: React.Ref>; @@ -418,7 +412,7 @@ export interface FormikRegistration { /** * State, handlers, and helpers made available to Formik's primitive components through context. */ -export type FormikContextType = FormikProps & +export type FormikContextType = FormikApi & Pick, 'validate' | 'validationSchema'>; export interface SharedRenderProps { diff --git a/yarn.lock b/yarn.lock index a38f9534b..deca0c477 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,13 +2,71 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.5.5": +"@ampproject/toolbox-core@2.7.4", "@ampproject/toolbox-core@^2.6.0": + version "2.7.4" + resolved "https://registry.yarnpkg.com/@ampproject/toolbox-core/-/toolbox-core-2.7.4.tgz#8355136f16301458ce942acf6c55952c9a415627" + integrity sha512-qpBhcS4urB7IKc+jx2kksN7BuvvwCo7Y3IstapWo+EW+COY5EYAUwb2pil37v3TsaqHKgX//NloFP1SKzGZAnw== + dependencies: + cross-fetch "3.0.6" + lru-cache "6.0.0" + +"@ampproject/toolbox-optimizer@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@ampproject/toolbox-optimizer/-/toolbox-optimizer-2.6.0.tgz#e1bde0697d0fb25ab888bc0d0422998abaf6bad1" + integrity sha512-saToXVopb15a6zKK6kW4B1N/sYZZddkECcqmfTotRxJ2DaLE+wFB6jgWLbaPkgHwvLPQyA2IjV9BHJ/KUFuGzg== + dependencies: + "@ampproject/toolbox-core" "^2.6.0" + "@ampproject/toolbox-runtime-version" "^2.6.0" + "@ampproject/toolbox-script-csp" "^2.5.4" + "@ampproject/toolbox-validator-rules" "^2.5.4" + abort-controller "3.0.0" + cross-fetch "3.0.5" + cssnano-simple "1.0.5" + dom-serializer "1.0.1" + domhandler "3.0.0" + domutils "2.1.0" + htmlparser2 "4.1.0" + https-proxy-agent "5.0.0" + lru-cache "6.0.0" + node-fetch "2.6.0" + normalize-html-whitespace "1.0.0" + postcss "7.0.32" + postcss-safe-parser "4.0.2" + terser "4.8.0" + +"@ampproject/toolbox-runtime-version@^2.6.0": + version "2.7.4" + resolved "https://registry.yarnpkg.com/@ampproject/toolbox-runtime-version/-/toolbox-runtime-version-2.7.4.tgz#f49da0dab122101ef75ed3caed3a0142487b73e1" + integrity sha512-SAdOUOERp42thVNWaBJlnFvFVvnacMVnz5z9LyUZHSnoL1EqrAW5Sz5jv+Ly+gkA8NYsEaUxAdSCBAzE9Uzb4Q== + dependencies: + "@ampproject/toolbox-core" "2.7.4" + +"@ampproject/toolbox-script-csp@^2.5.4": + version "2.5.4" + resolved "https://registry.yarnpkg.com/@ampproject/toolbox-script-csp/-/toolbox-script-csp-2.5.4.tgz#d8b7b91a678ae8f263cb36d9b74e441b7d633aad" + integrity sha512-+knTYetI5nWllRZ9wFcj7mYxelkiiFVRAAW/hl0ad8EnKHMH82tRlk40CapEnUHhp6Er5sCYkumQ8dngs3Q4zQ== + +"@ampproject/toolbox-validator-rules@^2.5.4": + version "2.7.4" + resolved "https://registry.yarnpkg.com/@ampproject/toolbox-validator-rules/-/toolbox-validator-rules-2.7.4.tgz#a58b5eca723f6c3557ac83b696de0247f5f03ce4" + integrity sha512-z3JRcpIZLLdVC9XVe7YTZuB3a/eR9s2SjElYB9AWRdyJyL5Jt7+pGNv4Uwh1uHVoBXsWEVQzNOWSNtrO3mSwZA== + dependencies: + cross-fetch "3.0.6" + +"@babel/code-frame@7.10.4", "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.5.5": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== dependencies: "@babel/highlight" "^7.10.4" +"@babel/code-frame@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" + integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g== + dependencies: + "@babel/highlight" "^7.12.13" + "@babel/compat-data@^7.10.4", "@babel/compat-data@^7.11.0": version "7.11.0" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.11.0.tgz#e9f73efe09af1355b723a7f39b11bad637d7c99c" @@ -18,6 +76,26 @@ invariant "^2.2.4" semver "^5.5.0" +"@babel/core@7.7.7": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.7.7.tgz#ee155d2e12300bcc0cff6a8ad46f2af5063803e9" + integrity sha512-jlSjuj/7z138NLZALxVgrx13AOtqip42ATZP7+kYl53GvDV6+4dCek1mVUo8z8c8Xnw/mx2q3d9HWh3griuesQ== + dependencies: + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.7.7" + "@babel/helpers" "^7.7.4" + "@babel/parser" "^7.7.7" + "@babel/template" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" + convert-source-map "^1.7.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + "@babel/core@^7.0.0": version "7.12.3" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.3.tgz#1b436884e1e3bff6fb1328dc02b208759de92ad8" @@ -91,6 +169,15 @@ jsesc "^2.5.1" source-map "^0.5.0" +"@babel/generator@^7.13.0", "@babel/generator@^7.7.7": + version "7.13.9" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.13.9.tgz#3a7aa96f9efb8e2be42d38d80e2ceb4c64d8de39" + integrity sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw== + dependencies: + "@babel/types" "^7.13.0" + jsesc "^2.5.1" + source-map "^0.5.0" + "@babel/helper-annotate-as-pure@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz#5bf0d495a3f757ac3bda48b5bf3b3ba309c72ba3" @@ -98,6 +185,13 @@ dependencies: "@babel/types" "^7.10.4" +"@babel/helper-annotate-as-pure@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab" + integrity sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw== + dependencies: + "@babel/types" "^7.12.13" + "@babel/helper-builder-binary-assignment-operator-visitor@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz#bb0b75f31bf98cbf9ff143c1ae578b87274ae1a3" @@ -145,6 +239,17 @@ "@babel/helper-replace-supers" "^7.12.1" "@babel/helper-split-export-declaration" "^7.10.4" +"@babel/helper-create-class-features-plugin@^7.13.0": + version "7.13.10" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.10.tgz#073b2bbb925a097643c6fc5770e5f13394e887c9" + integrity sha512-YV7r2YxdTUaw84EwNkyrRke/TJHR/UXGiyvACRqvdVJ2/syV2rQuJNnaRLSuYiop8cMRXOgseTGoJCWX0q2fFg== + dependencies: + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-member-expression-to-functions" "^7.13.0" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/helper-replace-supers" "^7.13.0" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/helper-create-class-features-plugin@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.7.4.tgz#fce60939fd50618610942320a8d951b3b639da2d" @@ -205,6 +310,15 @@ "@babel/template" "^7.10.4" "@babel/types" "^7.10.4" +"@babel/helper-function-name@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz#93ad656db3c3c2232559fd7b2c3dbdcbe0eb377a" + integrity sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA== + dependencies: + "@babel/helper-get-function-arity" "^7.12.13" + "@babel/template" "^7.12.13" + "@babel/types" "^7.12.13" + "@babel/helper-get-function-arity@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" @@ -212,6 +326,13 @@ dependencies: "@babel/types" "^7.10.4" +"@babel/helper-get-function-arity@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" + integrity sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg== + dependencies: + "@babel/types" "^7.12.13" + "@babel/helper-hoist-variables@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz#d49b001d1d5a68ca5e6604dda01a6297f7c9381e" @@ -226,6 +347,13 @@ dependencies: "@babel/types" "^7.12.1" +"@babel/helper-member-expression-to-functions@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.0.tgz#6aa4bb678e0f8c22f58cdb79451d30494461b091" + integrity sha512-yvRf8Ivk62JwisqV1rFRMxiSMDGnN6KH1/mDMmIrij4jztpQNRoHqqMG3U6apYbGRPJpgPalhva9Yd06HlUxJQ== + dependencies: + "@babel/types" "^7.13.0" + "@babel/helper-member-expression-to-functions@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.4.tgz#356438e2569df7321a8326644d4b790d2122cb74" @@ -240,6 +368,13 @@ dependencies: "@babel/types" "^7.12.1" +"@babel/helper-module-imports@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz#ec67e4404f41750463e455cc3203f6a32e93fcb0" + integrity sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g== + dependencies: + "@babel/types" "^7.12.13" + "@babel/helper-module-transforms@^7.10.4", "@babel/helper-module-transforms@^7.11.0", "@babel/helper-module-transforms@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz#7954fec71f5b32c48e4b303b437c34453fd7247c" @@ -275,6 +410,13 @@ dependencies: "@babel/types" "^7.10.4" +"@babel/helper-optimise-call-expression@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea" + integrity sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA== + dependencies: + "@babel/types" "^7.12.13" + "@babel/helper-optimise-call-expression@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.4.tgz#034af31370d2995242aa4df402c3b7794b2dcdf2" @@ -292,6 +434,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== +"@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af" + integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ== + "@babel/helper-plugin-utils@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" @@ -323,6 +470,16 @@ "@babel/traverse" "^7.12.1" "@babel/types" "^7.12.1" +"@babel/helper-replace-supers@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.13.0.tgz#6034b7b51943094cb41627848cb219cb02be1d24" + integrity sha512-Segd5me1+Pz+rmN/NFBOplMbZG3SqRJOBlY+mA0SxAv6rjj7zJqr1AVr3SfzUVTLCv7ZLU5FycOM/SBGuLPbZw== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.13.0" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/traverse" "^7.13.0" + "@babel/types" "^7.13.0" + "@babel/helper-replace-supers@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.7.4.tgz#3c881a6a6a7571275a72d82e6107126ec9e2cdd2" @@ -354,11 +511,23 @@ dependencies: "@babel/types" "^7.11.0" +"@babel/helper-split-export-declaration@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05" + integrity sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg== + dependencies: + "@babel/types" "^7.12.13" + "@babel/helper-validator-identifier@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== +"@babel/helper-validator-identifier@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" + integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== + "@babel/helper-wrap-function@^7.10.4": version "7.12.3" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz#3332339fc4d1fbbf1c27d7958c27d34708e990d9" @@ -396,6 +565,15 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/highlight@^7.12.13": + version "7.13.10" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.13.10.tgz#a8b2a66148f5b27d666b15d81774347a731d52d1" + integrity sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg== + dependencies: + "@babel/helper-validator-identifier" "^7.12.11" + chalk "^2.0.0" + js-tokens "^4.0.0" + "@babel/parser@^7.0.0", "@babel/parser@^7.10.4", "@babel/parser@^7.11.5", "@babel/parser@^7.12.1", "@babel/parser@^7.12.3", "@babel/parser@^7.7.4": version "7.12.3" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.3.tgz#a305415ebe7a6c7023b40b5122a0662d928334cd" @@ -406,6 +584,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.5.tgz#cbf45321619ac12d83363fcf9c94bb67fa646d71" integrity sha512-KNlOe9+/nk4i29g0VXgl8PEXIRms5xKLJeuZ6UptN0fHv+jDiriG+y94X6qAgWTR0h3KaoM1wK5G5h7MHFRSig== +"@babel/parser@^7.12.13", "@babel/parser@^7.13.0", "@babel/parser@^7.7.7": + version "7.13.10" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.10.tgz#8f8f9bf7b3afa3eabd061f7a5bcdf4fec3c48409" + integrity sha512-0s7Mlrw9uTWkYua7xWr99Wpk2bnGa0ANleKfksYAES8LpWH4gW1OUr42vqKNf0us5UQNfru2wPqMqRITzq/SIQ== + "@babel/plugin-external-helpers@^7.0.0": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-external-helpers/-/plugin-external-helpers-7.12.1.tgz#df474775860b3b8bdfeaedd45596cd2c7f36a2be" @@ -422,6 +605,14 @@ "@babel/helper-remap-async-to-generator" "^7.10.4" "@babel/plugin-syntax-async-generators" "^7.8.0" +"@babel/plugin-proposal-class-properties@7.10.4", "@babel/plugin-proposal-class-properties@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz#a33bf632da390a59c7a8c570045d1115cd778807" + integrity sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-proposal-class-properties@^7.0.0": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz#a082ff541f2a29a4821065b8add9346c0c16e5de" @@ -430,14 +621,6 @@ "@babel/helper-create-class-features-plugin" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-proposal-class-properties@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz#a33bf632da390a59c7a8c570045d1115cd778807" - integrity sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-proposal-class-properties@^7.4.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.7.4.tgz#2f964f0cb18b948450362742e33e15211e77c2ba" @@ -462,7 +645,7 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-export-default-from" "^7.12.1" -"@babel/plugin-proposal-export-namespace-from@^7.10.4": +"@babel/plugin-proposal-export-namespace-from@7.10.4", "@babel/plugin-proposal-export-namespace-from@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz#570d883b91031637b3e2958eea3c438e62c05f54" integrity sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg== @@ -486,23 +669,23 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.0.0": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz#3ed4fff31c015e7f3f1467f190dbe545cd7b046c" - integrity sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg== +"@babel/plugin-proposal-nullish-coalescing-operator@7.10.4", "@babel/plugin-proposal-nullish-coalescing-operator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz#02a7e961fc32e6d5b2db0649e01bf80ddee7e04a" + integrity sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz#02a7e961fc32e6d5b2db0649e01bf80ddee7e04a" - integrity sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw== +"@babel/plugin-proposal-nullish-coalescing-operator@^7.0.0": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz#3ed4fff31c015e7f3f1467f190dbe545cd7b046c" + integrity sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" -"@babel/plugin-proposal-numeric-separator@^7.10.4": +"@babel/plugin-proposal-numeric-separator@7.10.4", "@babel/plugin-proposal-numeric-separator@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz#ce1590ff0a65ad12970a609d78855e9a4c1aef06" integrity sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA== @@ -510,6 +693,15 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-numeric-separator" "^7.10.4" +"@babel/plugin-proposal-object-rest-spread@7.11.0", "@babel/plugin-proposal-object-rest-spread@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz#bd81f95a1f746760ea43b6c2d3d62b11790ad0af" + integrity sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.10.4" + "@babel/plugin-proposal-object-rest-spread@^7.0.0": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069" @@ -519,15 +711,6 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.0" "@babel/plugin-transform-parameters" "^7.12.1" -"@babel/plugin-proposal-object-rest-spread@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz#bd81f95a1f746760ea43b6c2d3d62b11790ad0af" - integrity sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-transform-parameters" "^7.10.4" - "@babel/plugin-proposal-optional-catch-binding@^7.0.0": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz#ccc2421af64d3aae50b558a71cede929a5ab2942" @@ -544,6 +727,15 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" +"@babel/plugin-proposal-optional-chaining@7.11.0", "@babel/plugin-proposal-optional-chaining@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz#de5866d0646f6afdaab8a566382fe3a221755076" + integrity sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-skip-transparent-expression-wrappers" "^7.11.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-proposal-optional-chaining@^7.0.0": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz#cce122203fc8a32794296fc377c6dedaf4363797" @@ -553,15 +745,6 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" "@babel/plugin-syntax-optional-chaining" "^7.8.0" -"@babel/plugin-proposal-optional-chaining@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz#de5866d0646f6afdaab8a566382fe3a221755076" - integrity sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-skip-transparent-expression-wrappers" "^7.11.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.0" - "@babel/plugin-proposal-private-methods@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz#b160d972b8fdba5c7d111a145fc8c421fc2a6909" @@ -585,7 +768,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-bigint@^7.8.3": +"@babel/plugin-syntax-bigint@7.8.3", "@babel/plugin-syntax-bigint@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== @@ -606,7 +789,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-dynamic-import@^7.0.0", "@babel/plugin-syntax-dynamic-import@^7.8.0": +"@babel/plugin-syntax-dynamic-import@7.8.3", "@babel/plugin-syntax-dynamic-import@^7.0.0", "@babel/plugin-syntax-dynamic-import@^7.8.0": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== @@ -655,6 +838,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-syntax-jsx@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz#044fb81ebad6698fe62c478875575bcbb9b70f15" + integrity sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" @@ -711,6 +901,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-syntax-typescript@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz#9dff111ca64154cef0f4dc52cf843d9f12ce4474" + integrity sha512-cHP3u1JiUiG2LFDKbXnwVad81GvfyIOmCD6HIEId6ojrY0Drfy2q1jw7BwN7dE84+kTnBjLkXoL3IEy/3JPu2w== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-arrow-functions@^7.0.0": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz#8083ffc86ac8e777fbe24b5967c4b2521f3cb2b3" @@ -933,6 +1130,16 @@ "@babel/helper-plugin-utils" "^7.10.4" babel-plugin-dynamic-import-node "^2.3.3" +"@babel/plugin-transform-modules-commonjs@7.10.4", "@babel/plugin-transform-modules-commonjs@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz#66667c3eeda1ebf7896d41f1f16b17105a2fbca0" + integrity sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w== + dependencies: + "@babel/helper-module-transforms" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-simple-access" "^7.10.4" + babel-plugin-dynamic-import-node "^2.3.3" + "@babel/plugin-transform-modules-commonjs@^7.0.0": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz#fa403124542636c786cf9b460a0ffbb48a86e648" @@ -943,16 +1150,6 @@ "@babel/helper-simple-access" "^7.12.1" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz#66667c3eeda1ebf7896d41f1f16b17105a2fbca0" - integrity sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w== - dependencies: - "@babel/helper-module-transforms" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-simple-access" "^7.10.4" - babel-plugin-dynamic-import-node "^2.3.3" - "@babel/plugin-transform-modules-systemjs@^7.10.4": version "7.10.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz#6270099c854066681bae9e05f87e1b9cadbe8c85" @@ -1036,6 +1233,27 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-react-display-name@^7.10.4": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.13.tgz#c28effd771b276f4647411c9733dbb2d2da954bd" + integrity sha512-MprESJzI9O5VnJZrL7gg1MpdqmiFcUv41Jc7SahxYsNP2kDkFqClxxTZq+1Qv4AFCamm+GXMRDQINNn+qrxmiA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-react-jsx-development@^7.10.4": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.17.tgz#f510c0fa7cd7234153539f9a362ced41a5ca1447" + integrity sha512-BPjYV86SVuOaudFhsJR1zjgxxOhJDt6JHNoD48DxWEIxUCAMjV1ys6DYw4SDYZh0b1QsS2vfIA9t/ZsQGsDOUQ== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.12.17" + +"@babel/plugin-transform-react-jsx-self@^7.10.4": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.12.13.tgz#422d99d122d592acab9c35ea22a6cfd9bf189f60" + integrity sha512-FXYw98TTJ125GVCCkFLZXlZ1qGcsYqNQhVBQcZjyrwf8FEUtVfKIoidnO8S0q+KBQpDYNTmiGo1gn67Vti04lQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-react-jsx-source@^7.0.0": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.12.1.tgz#d07de6863f468da0809edcf79a1aa8ce2a82a26b" @@ -1043,6 +1261,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-react-jsx-source@^7.10.4": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.12.13.tgz#051d76126bee5c9a6aa3ba37be2f6c1698856bcb" + integrity sha512-O5JJi6fyfih0WfDgIJXksSPhGP/G0fQpfxYy87sDc+1sFmsCS6wr3aAn+whbzkhbjtq4VMqLRaSzR6IsshIC0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-react-jsx@^7.0.0": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.1.tgz#c2d96c77c2b0e4362cc4e77a43ce7c2539d478cb" @@ -1053,6 +1278,25 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-jsx" "^7.12.1" +"@babel/plugin-transform-react-jsx@^7.10.4", "@babel/plugin-transform-react-jsx@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.17.tgz#dd2c1299f5e26de584939892de3cfc1807a38f24" + integrity sha512-mwaVNcXV+l6qJOuRhpdTEj8sT/Z0owAVWf9QujTZ0d2ye9X/K+MTOTSizcgKOj18PGnTc/7g1I4+cIUjsKhBcw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-jsx" "^7.12.13" + "@babel/types" "^7.12.17" + +"@babel/plugin-transform-react-pure-annotations@^7.10.4": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz#05d46f0ab4d1339ac59adf20a1462c91b37a1a42" + integrity sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-transform-regenerator@^7.0.0": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz#5f0a28d842f6462281f06a964e88ba8d7ab49753" @@ -1074,6 +1318,16 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-runtime@7.11.5": + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.11.5.tgz#f108bc8e0cf33c37da031c097d1df470b3a293fc" + integrity sha512-9aIoee+EhjySZ6vY5hnLjigHzunBlscx9ANKutkeWTJTx6m5Rbq6Ic01tLvO54lSusR+BxV7u4UDdCmXv5aagg== + dependencies: + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + resolve "^1.8.1" + semver "^5.5.1" + "@babel/plugin-transform-runtime@^7.0.0": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.1.tgz#04b792057eb460389ff6a4198e377614ea1e7ba5" @@ -1161,6 +1415,15 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-typescript" "^7.12.1" +"@babel/plugin-transform-typescript@^7.10.4": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.13.0.tgz#4a498e1f3600342d2a9e61f60131018f55774853" + integrity sha512-elQEwluzaU8R8dbVuW2Q2Y8Nznf7hnjM7+DSCd14Lo5fF63C9qNLbwZYbmZrtV9/ySpSUpkRpQXvJb6xyu4hCQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.13.0" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-typescript" "^7.12.13" + "@babel/plugin-transform-unicode-escapes@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz#feae523391c7651ddac115dae0a9d06857892007" @@ -1184,7 +1447,7 @@ "@babel/helper-create-regexp-features-plugin" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/preset-env@^7.11.0": +"@babel/preset-env@7.11.5", "@babel/preset-env@^7.11.0": version "7.11.5" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.11.5.tgz#18cb4b9379e3e92ffea92c07471a99a2914e4272" integrity sha512-kXqmW1jVcnB2cdueV+fyBM8estd5mlNfaQi6lwLgRwCby4edpavgbFhiBNjmWA3JpB/yZGSISa7Srf+TwxDQoA== @@ -1258,7 +1521,7 @@ levenary "^1.1.1" semver "^5.5.0" -"@babel/preset-modules@^0.1.3": +"@babel/preset-modules@0.1.4", "@babel/preset-modules@^0.1.3": version "0.1.4" resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg== @@ -1269,6 +1532,27 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" +"@babel/preset-react@7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.10.4.tgz#92e8a66d816f9911d11d4cc935be67adfc82dbcf" + integrity sha512-BrHp4TgOIy4M19JAfO1LhycVXOPWdDbTRep7eVyatf174Hff+6Uk53sDyajqZPu8W1qXRBiYOfIamek6jA7YVw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-transform-react-display-name" "^7.10.4" + "@babel/plugin-transform-react-jsx" "^7.10.4" + "@babel/plugin-transform-react-jsx-development" "^7.10.4" + "@babel/plugin-transform-react-jsx-self" "^7.10.4" + "@babel/plugin-transform-react-jsx-source" "^7.10.4" + "@babel/plugin-transform-react-pure-annotations" "^7.10.4" + +"@babel/preset-typescript@7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.10.4.tgz#7d5d052e52a682480d6e2cc5aa31be61c8c25e36" + integrity sha512-SdYnvGPv+bLlwkF2VkJnaX/ni1sMNetcGI1+nThF1gyv6Ph8Qucc4ZZAjM5yZcE/AKRXIOTZz7eSRDWOEjPyRQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-transform-typescript" "^7.10.4" + "@babel/register@^7.0.0": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.12.1.tgz#cdb087bdfc4f7241c03231f22e15d211acf21438" @@ -1296,6 +1580,13 @@ core-js-pure "^3.0.0" regenerator-runtime "^0.13.2" +"@babel/runtime@7.11.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.2", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5": + version "7.11.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736" + integrity sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw== + dependencies: + regenerator-runtime "^0.13.4" + "@babel/runtime@^7.0.0", "@babel/runtime@^7.8.4": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.1.tgz#b4116a6b6711d010b2dad3b7b6e43bf1b9954740" @@ -1303,13 +1594,6 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.10.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.2", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5": - version "7.11.2" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736" - integrity sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw== - dependencies: - regenerator-runtime "^0.13.4" - "@babel/runtime@^7.4.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.4": version "7.7.6" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.7.6.tgz#d18c511121aff1b4f2cd1d452f1bac9601dd830f" @@ -1326,6 +1610,15 @@ "@babel/parser" "^7.10.4" "@babel/types" "^7.10.4" +"@babel/template@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327" + integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/parser" "^7.12.13" + "@babel/types" "^7.12.13" + "@babel/traverse@^7.0.0", "@babel/traverse@^7.10.4", "@babel/traverse@^7.11.5", "@babel/traverse@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.1.tgz#941395e0c5cc86d5d3e75caa095d3924526f0c1e" @@ -1356,6 +1649,39 @@ globals "^11.1.0" lodash "^4.17.13" +"@babel/traverse@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.13.0.tgz#6d95752475f86ee7ded06536de309a65fc8966cc" + integrity sha512-xys5xi5JEhzC3RzEmSGrs/b3pJW/o87SypZ+G/PhaE7uqVQNv/jlmVIBXuoh5atqQ434LfXV+sf23Oxj0bchJQ== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.13.0" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/parser" "^7.13.0" + "@babel/types" "^7.13.0" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.19" + +"@babel/types@7.11.5", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.5.tgz#d9de577d01252d77c6800cee039ee64faf75662d" + integrity sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + lodash "^4.17.19" + to-fast-properties "^2.0.0" + +"@babel/types@7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.3.tgz#5a383dffa5416db1b73dedffd311ffd0788fb31c" + integrity sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg== + dependencies: + esutils "^2.0.2" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + "@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.11.5", "@babel/types@^7.12.1", "@babel/types@^7.7.4": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.1.tgz#e109d9ab99a8de735be287ee3d6a9947a190c4ae" @@ -1365,6 +1691,15 @@ lodash "^4.17.19" to-fast-properties "^2.0.0" +"@babel/types@^7.12.13", "@babel/types@^7.12.17", "@babel/types@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.0.tgz#74424d2816f0171b4100f0ab34e9a374efdf7f80" + integrity sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA== + dependencies: + "@babel/helper-validator-identifier" "^7.12.11" + lodash "^4.17.19" + to-fast-properties "^2.0.0" + "@babel/types@^7.3.0": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.4.tgz#516570d539e44ddf308c07569c258ff94fde9193" @@ -1374,15 +1709,6 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" -"@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.11.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.5.tgz#d9de577d01252d77c6800cee039ee64faf75662d" - integrity sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q== - dependencies: - "@babel/helper-validator-identifier" "^7.10.4" - lodash "^4.17.19" - to-fast-properties "^2.0.0" - "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -2601,6 +2927,27 @@ call-me-maybe "^1.0.1" glob-to-regexp "^0.3.0" +"@next/react-dev-overlay@9.5.3": + version "9.5.3" + resolved "https://registry.yarnpkg.com/@next/react-dev-overlay/-/react-dev-overlay-9.5.3.tgz#3275301f08045ecc709e3273031973a1f5e81427" + integrity sha512-R2ZAyFjHHaMTBVi19ZZNRJNXiwn46paRi7EZvKNvMxbrzBcUYtSFj/edU3jQoF1UOcC6vGeMhtPqH55ONrIjCQ== + dependencies: + "@babel/code-frame" "7.10.4" + ally.js "1.4.1" + anser "1.4.9" + chalk "4.0.0" + classnames "2.2.6" + data-uri-to-buffer "3.0.0" + shell-quote "1.7.2" + source-map "0.8.0-beta.0" + stacktrace-parser "0.1.10" + strip-ansi "6.0.0" + +"@next/react-refresh-utils@9.5.3": + version "9.5.3" + resolved "https://registry.yarnpkg.com/@next/react-refresh-utils/-/react-refresh-utils-9.5.3.tgz#a14fb6489d412b201b98aa44716fb8727ca4c6ae" + integrity sha512-W3VKOqbg+4Kw+k6M/SODf+WIzwcx60nAemGV1nNPa/yrDtAS2YcJfqiswrJ3+2nJHzqefAFWn4XOfM0fy8ww2Q== + "@nodelib/fs.scandir@2.1.3": version "2.1.3" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" @@ -3025,6 +3372,11 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.3.tgz#bdfd69d61e464dcc81b25159c270d75a73c1a636" integrity sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A== +"@types/json-schema@^7.0.5": + version "7.0.7" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" + integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== + "@types/keyv@*": version "3.1.0" resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.0.tgz#1961f73b3bf1084c044f79a070b45a5bfa6578b9" @@ -3128,6 +3480,11 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== +"@types/use-subscription@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/use-subscription/-/use-subscription-1.0.0.tgz#d146f8d834f70f50d48bd8246a481d096f11db19" + integrity sha512-0WWZ5GUDKMXUY/1zy4Ur5/zsC0s/B+JjXfHdkvx6JgDNZzZV5eW+KKhDqsTGyqX56uh99gwGwbsKbVwkcVIKQA== + "@types/warning@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@types/warning/-/warning-3.0.0.tgz#0d2501268ad8f9962b740d387c4654f5f8e23e52" @@ -3231,6 +3588,161 @@ semver "^6.3.0" tsutils "^3.17.1" +"@webassemblyjs/ast@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" + integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== + dependencies: + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + +"@webassemblyjs/floating-point-hex-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" + integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== + +"@webassemblyjs/helper-api-error@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" + integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== + +"@webassemblyjs/helper-buffer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" + integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== + +"@webassemblyjs/helper-code-frame@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" + integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== + dependencies: + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/helper-fsm@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" + integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== + +"@webassemblyjs/helper-module-context@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" + integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== + dependencies: + "@webassemblyjs/ast" "1.9.0" + +"@webassemblyjs/helper-wasm-bytecode@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" + integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== + +"@webassemblyjs/helper-wasm-section@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" + integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + +"@webassemblyjs/ieee754@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" + integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" + integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" + integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== + +"@webassemblyjs/wasm-edit@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" + integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/helper-wasm-section" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-opt" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/wasm-gen@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" + integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wasm-opt@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" + integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + +"@webassemblyjs/wasm-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" + integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wast-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" + integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/floating-point-hex-parser" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-code-frame" "1.9.0" + "@webassemblyjs/helper-fsm" "1.9.0" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/wast-printer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" + integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + "@zkochan/cmd-shim@^3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@zkochan/cmd-shim/-/cmd-shim-3.1.0.tgz#2ab8ed81f5bb5452a85f25758eb9b8681982fd2e" @@ -3258,6 +3770,13 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== +abort-controller@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + absolute-path@^0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/absolute-path/-/absolute-path-0.0.0.tgz#a78762fbdadfb5297be99b15d35a785b2f095bf7" @@ -3294,11 +3813,27 @@ acorn@^6.0.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.0.tgz#b659d2ffbafa24baf5db1cdbb2c94a983ecd2784" integrity sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw== +acorn@^6.4.1: + version "6.4.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== + acorn@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== +adjust-sourcemap-loader@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz#6471143af75ec02334b219f54bc7970c52fb29a4" + integrity sha512-4hFsTsn58+YjrU9qKzML2JSSDqKvN8mUGQ0nNIrfPi8hmIONT4L3uUaT6MKdMsZ9AjsU6D2xDkZxCkbQPxChrA== + dependencies: + assert "1.4.1" + camelcase "5.0.0" + loader-utils "1.2.3" + object-path "0.11.4" + regex-parser "2.2.10" + after-all-results@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/after-all-results/-/after-all-results-2.0.0.tgz#6ac2fc202b500f88da8f4f5530cfa100f4c6a2d0" @@ -3311,6 +3846,13 @@ agent-base@4, agent-base@^4.3.0: dependencies: es6-promisify "^5.0.0" +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + agent-base@~4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" @@ -3333,6 +3875,16 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + ajv@^5.1.0: version "5.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" @@ -3343,6 +3895,16 @@ ajv@^5.1.0: fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.3.0" +ajv@^6.1.0, ajv@^6.12.0, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5: version "6.10.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" @@ -3363,6 +3925,19 @@ ajv@^6.12.3: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ally.js@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/ally.js/-/ally.js-1.4.1.tgz#9fb7e6ba58efac4ee9131cb29aa9ee3b540bcf1e" + integrity sha1-n7fmuljvrE7pExyymqnuO1QLzx4= + dependencies: + css.escape "^1.5.0" + platform "1.3.3" + +anser@1.4.9: + version "1.4.9" + resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.9.tgz#1f85423a5dcf8da4631a341665ff675b96845760" + integrity sha512-AI+BjTeGt2+WFk4eWcqbQ7snZpDBt8SaLlj0RT2h5xfdWaiy51OjYvqwMrNzJLGy8iOAL6nKDITWO+rd4MkYEA== + ansi-align@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" @@ -3490,7 +4065,7 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -anymatch@^3.0.3: +anymatch@^3.0.3, anymatch@~3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== @@ -3554,6 +4129,11 @@ aria-query@^4.2.2: "@babel/runtime" "^7.10.2" "@babel/runtime-corejs3" "^7.10.2" +arity-n@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/arity-n/-/arity-n-1.0.4.tgz#d9e76b11733e08569c0847ae7b39b2860b30b745" + integrity sha1-2edrEXM+CFacCEeuezmyhgswt0U= + arr-diff@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a" @@ -3697,6 +4277,16 @@ asap@^2.0.0, asap@~2.0.3: resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= +asn1.js@^5.2.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + asn1@~0.2.3: version "0.2.4" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" @@ -3709,6 +4299,21 @@ assert-plus@1.0.0, assert-plus@^1.0.0: resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= +assert@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" + integrity sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE= + dependencies: + util "0.10.3" + +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" @@ -3719,6 +4324,11 @@ ast-types-flow@0.0.7, ast-types-flow@^0.0.7: resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= +ast-types@0.13.2: + version "0.13.2" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.2.tgz#df39b677a911a83f3a049644fb74fdded23cea48" + integrity sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA== + astral-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" @@ -3729,6 +4339,11 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + async-limiter@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" @@ -3887,11 +4502,29 @@ babel-plugin-polyfill-regenerator@^0.0.4: dependencies: "@babel/helper-define-polyfill-provider" "^0.0.3" +babel-plugin-syntax-jsx@6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" + integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY= + babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: version "7.0.0-beta.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz#aa213c1435e2bffeb6fca842287ef534ad05d5cf" integrity sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ== +babel-plugin-transform-define@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-define/-/babel-plugin-transform-define-2.0.0.tgz#79c3536635f899aabaf830b194b25519465675a4" + integrity sha512-0dv5RNRUlUKxGYIIErl01lpvi8b7W2R04Qcl1mCj70ahwZcgiklfXnFlh4FGnRh6aayCfSZKdhiMryVzcq5Dmg== + dependencies: + lodash "^4.17.11" + traverse "0.6.6" + +babel-plugin-transform-react-remove-prop-types@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a" + integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== + babel-plugin-transform-rename-import@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-rename-import/-/babel-plugin-transform-rename-import-2.3.0.tgz#5d9d645f937b0ca5c26a24b2510a06277b6ffd9b" @@ -3960,6 +4593,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= +base64-js@^1.0.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + base64-js@^1.1.2, base64-js@^1.2.3: version "1.3.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" @@ -4014,6 +4652,21 @@ big-integer@^1.6.44: resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.48.tgz#8fd88bd1632cba4a1c8c3e3d7159f08bb95b4b9e" integrity sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w== +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + bindings@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" @@ -4031,6 +4684,16 @@ bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5, bluebird@^3.7.2: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.0.0, bn.js@^5.1.1: + version "5.2.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" + integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== + boom@4.x.x: version "4.3.1" resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" @@ -4089,7 +4752,7 @@ braces@^1.8.2: preserve "^0.2.0" repeat-element "^1.1.2" -braces@^2.3.1: +braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== @@ -4105,7 +4768,7 @@ braces@^2.3.1: split-string "^3.0.2" to-regex "^3.0.1" -braces@^3.0.1: +braces@^3.0.1, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== @@ -4119,6 +4782,11 @@ breakword@^1.0.5: dependencies: wcwidth "^1.0.1" +brorand@^1.0.1, brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + browser-process-hrtime@^0.1.2: version "0.1.3" resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4" @@ -4131,6 +4799,77 @@ browser-resolve@^1.11.3: dependencies: resolve "1.1.7" +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== + dependencies: + bn.js "^5.0.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" + integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== + dependencies: + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.3" + inherits "^2.0.4" + parse-asn1 "^5.1.5" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserslist@4.13.0: + version "4.13.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.13.0.tgz#42556cba011e1b0a2775b611cba6a8eca18e940d" + integrity sha512-MINatJ5ZNrLnQ6blGvePd/QOz9Xtu+Ne+x29iQSCHfkU5BugKVJwZKn/iiL8UbpIpa3JhviKjz+XxMo0m2caFQ== + dependencies: + caniuse-lite "^1.0.30001093" + electron-to-chromium "^1.3.488" + escalade "^3.0.1" + node-releases "^1.1.58" + browserslist@^4.12.0, browserslist@^4.8.5: version "4.14.4" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.4.tgz#66a18131439f9e16c3da7f352518dfa12f60b0e3" @@ -4165,16 +4904,43 @@ buffer-crc32@^0.2.13, buffer-crc32@~0.2.3: resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= -buffer-from@1.x, buffer-from@^1.0.0: +buffer-from@1.x, buffer-from@^1.0.0, buffer-from@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@5.6.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786" + integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + builtin-modules@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.1.0.tgz#aad97c15131eb76b65b50ef208e7584cd76a7484" integrity sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw== +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + builtins@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" @@ -4195,6 +4961,30 @@ bytes@3.0.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= +cacache@13.0.1: + version "13.0.1" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-13.0.1.tgz#a8000c21697089082f85287a1aec6e382024a71c" + integrity sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w== + dependencies: + chownr "^1.1.2" + figgy-pudding "^3.5.1" + fs-minipass "^2.0.0" + glob "^7.1.4" + graceful-fs "^4.2.2" + infer-owner "^1.0.4" + lru-cache "^5.1.1" + minipass "^3.0.0" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + p-map "^3.0.0" + promise-inflight "^1.0.1" + rimraf "^2.7.1" + ssri "^7.0.0" + unique-filename "^1.1.1" + cacache@^12.0.0, cacache@^12.0.3: version "12.0.3" resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390" @@ -4216,6 +5006,27 @@ cacache@^12.0.0, cacache@^12.0.3: unique-filename "^1.1.1" y18n "^4.0.0" +cacache@^12.0.2: + version "12.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" + integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== + dependencies: + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" + graceful-fs "^4.1.15" + infer-owner "^1.0.3" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" @@ -4315,6 +5126,11 @@ camelcase@5.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA== +camelcase@5.3.1, camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + camelcase@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" @@ -4325,16 +5141,16 @@ camelcase@^4.0.0, camelcase@^4.1.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= -camelcase@^5.0.0, camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - camelcase@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.0.0.tgz#5259f7c30e35e278f1bdc2a4d91230b37cad981e" integrity sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w== +caniuse-lite@^1.0.30001093, caniuse-lite@^1.0.30001113: + version "1.0.30001198" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001198.tgz#ed2d9b5f060322ba2efa42afdc56dee3255473f4" + integrity sha512-r5GGgESqOPZzwvdLVER374FpQu2WluCF1Z2DSiFJ89KSmGjT0LVKjgv4NcAqHmGWF9ihNpqRI9KXO9Ex4sKsgA== + caniuse-lite@^1.0.30001135: version "1.0.30001135" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001135.tgz#995b1eb94404a3c9a0d7600c113c9bb27f2cd8aa" @@ -4382,6 +5198,14 @@ chalk@2.4.0: escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.0.0.tgz#6e98081ed2d17faab615eb52ac66ec1fe6209e72" + integrity sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -4442,16 +5266,65 @@ child-process-promise@^2.1.3: node-version "^1.0.0" promise-polyfill "^6.0.1" +chokidar@2.1.8, chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chokidar@^3.4.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" + integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.5.0" + optionalDependencies: + fsevents "~2.3.1" + chownr@^1.1.1, chownr@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw== +chrome-trace-event@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" + integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== + dependencies: + tslib "^1.9.0" + ci-info@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" @@ -4462,6 +5335,11 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" +classnames@2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" + integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== + clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" @@ -4702,6 +5580,13 @@ component-emitter@^1.2.1: resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== +compose-function@3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/compose-function/-/compose-function-3.0.3.tgz#9ed675f13cc54501d30950a486ff6a7ba3ab185f" + integrity sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8= + dependencies: + arity-n "^1.0.4" + compressible@~2.0.16: version "2.0.18" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" @@ -4782,11 +5667,21 @@ connect@^3.6.5: parseurl "~1.3.3" utils-merge "1.0.1" +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + contains-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" @@ -4875,13 +5770,18 @@ conventional-recommended-bump@^5.0.0: meow "^4.0.0" q "^1.5.1" -convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: +convert-source-map@1.7.0, convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== dependencies: safe-buffer "~5.1.1" +convert-source-map@^0.3.3: + version "0.3.5" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190" + integrity sha1-8dgClQr33SYxof6+BZZVDIarMZA= + copy-concurrently@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" @@ -4954,6 +5854,37 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" +create-ecdh@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + create-react-class@^15.6.3: version "15.7.0" resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.7.0.tgz#7499d7ca2e69bb51d13faf59bd04f0c65a1d6c1e" @@ -4962,6 +5893,20 @@ create-react-class@^15.6.3: loose-envify "^1.3.1" object-assign "^4.1.1" +cross-fetch@3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.0.5.tgz#2739d2981892e7ab488a7ad03b92df2816e03f4c" + integrity sha512-FFLcLtraisj5eteosnX1gf01qYDCOc4fDy0+euOt8Kn9YBY2NtXL/pCoYPavw24NIQkQqm5ZOLsGD5Zzj0gyew== + dependencies: + node-fetch "2.6.0" + +cross-fetch@3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.0.6.tgz#3a4040bc8941e653e0e9cf17f29ebcd177d3365c" + integrity sha512-KBPUbqgFjzWlVcURG+Svp9TlhA5uliYtiNx/0r8nv0pdypeQCRJ9IaSIc3q/x3q8t3F75cHuwxVql1HFGHCNJQ== + dependencies: + node-fetch "2.6.1" + cross-spawn@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" @@ -4984,32 +5929,119 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" + integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cryptiles@3.x.x: + version "3.1.4" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.4.tgz#769a68c95612b56faadfcebf57ac86479cbe8322" + integrity sha512-8I1sgZHfVwcSOY6mSGpVU3lw/GSIZvusg8dD2+OGehCJpOhQRLNcH0qb9upQnOH4XhgxxFJSg6E2kx95deb1Tw== + dependencies: + boom "5.x.x" + +crypto-browserify@3.12.0, crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +crypto-random-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= + +css-loader@3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.5.3.tgz#95ac16468e1adcd95c844729e0bb167639eb0bcf" + integrity sha512-UEr9NH5Lmi7+dguAm+/JSPovNjYbm2k3TK58EiwQHzOHH5Jfq1Y+XoP2bQO6TMn7PptMd0opxxedAWcaSTRKHw== + dependencies: + camelcase "^5.3.1" + cssesc "^3.0.0" + icss-utils "^4.1.1" + loader-utils "^1.2.3" + normalize-path "^3.0.0" + postcss "^7.0.27" + postcss-modules-extract-imports "^2.0.0" + postcss-modules-local-by-default "^3.0.2" + postcss-modules-scope "^2.2.0" + postcss-modules-values "^3.0.0" + postcss-value-parser "^4.0.3" + schema-utils "^2.6.6" + semver "^6.3.0" + +css.escape@^1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" + integrity sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s= + +css@^2.0.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" + integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== + dependencies: + inherits "^2.0.3" + source-map "^0.6.1" + source-map-resolve "^0.5.2" + urix "^0.1.0" + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-simple@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/cssnano-preset-simple/-/cssnano-preset-simple-1.1.4.tgz#7b287a31df786348565d02342df71af8f758ac82" + integrity sha512-EYKDo65W+AxMViUijv/hvhbEnxUjmu3V7omcH1MatPOwjRLrAgVArUOE8wTUyc1ePFEtvV8oCT4/QSRJDorm/A== + dependencies: + postcss "^7.0.32" -cross-spawn@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" - integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg== +cssnano-preset-simple@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/cssnano-preset-simple/-/cssnano-preset-simple-1.2.0.tgz#afcf13eb076e8ebd91c4f311cd449781c14c7371" + integrity sha512-zojGlY+KasFeQT/SnD/WqYXHcKddz2XHRDtIwxrWpGqGHp5IyLWsWFS3UW7pOf3AWvfkpYSRdxOSlYuJPz8j8g== dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" + caniuse-lite "^1.0.30001093" + postcss "^7.0.32" -cryptiles@3.x.x: - version "3.1.4" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.4.tgz#769a68c95612b56faadfcebf57ac86479cbe8322" - integrity sha512-8I1sgZHfVwcSOY6mSGpVU3lw/GSIZvusg8dD2+OGehCJpOhQRLNcH0qb9upQnOH4XhgxxFJSg6E2kx95deb1Tw== +cssnano-simple@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/cssnano-simple/-/cssnano-simple-1.0.5.tgz#66ee528f3a4e60754e2625ea9f51ac315f5f0a92" + integrity sha512-NJjx2Er1C3pa75v1GwMKm0w6xAp1GsW2Ql1As4CWPNFxTgYFN5e8wblYeHfna13sANAhyIdSIPqKJjBO4CU5Eg== dependencies: - boom "5.x.x" + cssnano-preset-simple "1.1.4" + postcss "^7.0.32" -crypto-random-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" - integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= +cssnano-simple@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/cssnano-simple/-/cssnano-simple-1.2.0.tgz#b8cc5f52c2a52e6513b4636d0da165ec9d48d327" + integrity sha512-pton9cZ70/wOCWMAbEGHO1ACsW1KggTB6Ikj7k71uOEsz6SfByH++86+WAmXjRSc9q/g9gxkpFP9bDX9vRotdA== + dependencies: + cssnano-preset-simple "1.2.0" + postcss "^7.0.32" cssom@^0.4.1: version "0.4.4" @@ -5121,6 +6153,14 @@ cypress@^5.2.0: url "^0.11.0" yauzl "^2.10.0" +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + damerau-levenshtein@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.5.tgz#780cf7144eb2e8dbd1c3bb83ae31100ccc31a414" @@ -5140,6 +6180,13 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +data-uri-to-buffer@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.0.tgz#8a3088a5efd3f53c3682343313c6895d498eb8d7" + integrity sha512-MJ6mFTZ+nPQO+39ua/ltwNePXrfdF3Ww0wP1Od7EePySXN1cP9XNqRQOG3FxTfipp8jx898LUCgBCEP11Qw/ZQ== + dependencies: + buffer-from "^1.1.1" + data-urls@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" @@ -5178,6 +6225,13 @@ debug@3.1.0: dependencies: ms "2.0.0" +debug@4: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + dependencies: + ms "2.1.2" + debug@^3.1.0: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" @@ -5337,6 +6391,14 @@ deprecation@^2.0.0: resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== +des.js@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" @@ -5365,6 +6427,15 @@ diff-sequences@^25.2.6: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.2.6.tgz#5f467c00edd35352b7bca46d7927d60e687a76dd" integrity sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg== +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + dir-glob@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" @@ -5406,11 +6477,47 @@ dom-accessibility-api@^0.5.1: resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.3.tgz#0ea493c924d4070dfbf531c4aaca3d7a2c601aab" integrity sha512-yfqzAi1GFxK6EoJIZKgxqJyK6j/OjEFEUi2qkNThD/kUhoCFSG1izq31B5xuxzbJBGw9/67uPtkPMYAzWL7L7Q== +dom-serializer@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.0.1.tgz#79695eb49af3cd8abc8d93a73da382deb1ca0795" + integrity sha512-1Aj1Qy3YLbdslkI75QEOfdp9TkQ3o8LRISAzxOibjBs/xWwr1WxZFOQphFkZuepHFGo+kB8e5FVJSS0faAJ4Rw== + dependencies: + domelementtype "^2.0.1" + domhandler "^3.0.0" + entities "^2.0.0" + +dom-serializer@^0.2.1: + version "0.2.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +dom-serializer@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.2.0.tgz#3433d9136aeb3c627981daa385fc7f32d27c48f1" + integrity sha512-n6kZFH/KlCrqs/1GHMOd5i2fd/beQHuehKdWvNNffbGHTr/almdhuVvTVFb3V7fglz+nC50fFusu3lY33h12pA== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + entities "^2.0.0" + dom-walk@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +domelementtype@^2.0.1, domelementtype@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.1.0.tgz#a851c080a6d1c3d94344aed151d99f669edf585e" + integrity sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w== + domexception@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" @@ -5418,6 +6525,45 @@ domexception@^1.0.1: dependencies: webidl-conversions "^4.0.2" +domhandler@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-3.0.0.tgz#51cd13efca31da95bbb0c5bee3a48300e333b3e9" + integrity sha512-eKLdI5v9m67kbXQbJSNn1zjh0SDzvzWVWtX+qEI3eMjZw8daH9k8rlj1FZY9memPwjiskQFbe7vHVVJIAqoEhw== + dependencies: + domelementtype "^2.0.1" + +domhandler@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-3.3.0.tgz#6db7ea46e4617eb15cf875df68b2b8524ce0037a" + integrity sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA== + dependencies: + domelementtype "^2.0.1" + +domhandler@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.0.0.tgz#01ea7821de996d85f69029e81fa873c21833098e" + integrity sha512-KPTbnGQ1JeEMQyO1iYXoagsI6so/C96HZiFyByU3T6iAzpXn8EGEvct6unm1ZGoed8ByO2oirxgwxBmqKF9haA== + dependencies: + domelementtype "^2.1.0" + +domutils@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.1.0.tgz#7ade3201af43703fde154952e3a868eb4b635f16" + integrity sha512-CD9M0Dm1iaHfQ1R/TI+z3/JWp/pgub0j4jIQKH89ARR4ATAV2nbaOQS5XxU9maJP5jHaPdDDQSEHuE2UmpUTKg== + dependencies: + dom-serializer "^0.2.1" + domelementtype "^2.0.1" + domhandler "^3.0.0" + +domutils@^2.0.0: + version "2.4.4" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.4.4.tgz#282739c4b150d022d34699797369aad8d19bbbd3" + integrity sha512-jBC0vOsECI4OMdD0GC9mGn7NXPLb+Qt6KW1YDQzeQYRUFKmNG8lh7mO5HiELfr+lLQE7loDVI4QcAxV80HS+RA== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.0.1" + domhandler "^4.0.0" + dot-prop@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177" @@ -5470,6 +6616,11 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= +electron-to-chromium@^1.3.488: + version "1.3.684" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.684.tgz#053fbb0a4b2d5c076dfa6e1d8ecd06a3075a558a" + integrity sha512-GV/vz2EmmtRSvfGSQ5A0Lucic//IRSDijgL15IgzbBEEnp4rfbxeUSZSlBfmsj7BQvE4sBdgfsvPzLCnp6L21w== + electron-to-chromium@^1.3.570: version "1.3.571" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.571.tgz#e57977f1569f8326ae2a7905e26f3943536ba28f" @@ -5480,6 +6631,19 @@ elegant-spinner@^1.0.1: resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4= +elliptic@^6.5.3: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + emoji-regex@^7.0.1, emoji-regex@^7.0.2: version "7.0.3" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" @@ -5490,6 +6654,16 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" @@ -5509,6 +6683,15 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: dependencies: once "^1.4.0" +enhanced-resolve@^4.3.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" + integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + enquirer@^2.3.0, enquirer@^2.3.4, enquirer@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" @@ -5516,6 +6699,11 @@ enquirer@^2.3.0, enquirer@^2.3.4, enquirer@^2.3.6: dependencies: ansi-colors "^4.1.1" +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + env-paths@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-1.0.0.tgz#4168133b42bb05c38a35b1ae4397c8298ab369e0" @@ -5531,6 +6719,13 @@ err-code@^1.0.0: resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" integrity sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA= +errno@^0.1.3, errno@~0.1.7: + version "0.1.8" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== + dependencies: + prr "~1.0.1" + error-ex@^1.2.0, error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -5588,6 +6783,24 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +es5-ext@^0.10.35, es5-ext@^0.10.50: + version "0.10.53" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" + integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.3" + next-tick "~1.0.0" + +es6-iterator@2.0.3, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + es6-promise@^4.0.3: version "4.2.8" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" @@ -5600,6 +6813,19 @@ es6-promisify@^5.0.0: dependencies: es6-promise "^4.0.3" +es6-symbol@^3.1.1, es6-symbol@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + dependencies: + d "^1.0.1" + ext "^1.1.2" + +escalade@^3.0.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + escalade@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.0.tgz#e8e2d7c7a8b76f6ee64c2181d6b8151441602d4e" @@ -5801,7 +7027,7 @@ eslint-scope@3.7.1: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-scope@^4.0.0: +eslint-scope@^4.0.0, eslint-scope@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== @@ -5930,6 +7156,11 @@ event-target-shim@^1.0.5: resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-1.1.1.tgz#a86e5ee6bdaa16054475da797ccddf0c55698491" integrity sha1-qG5e5r2qFgVEddp5fM3fDFVphJE= +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + eventemitter2@^6.4.2: version "6.4.3" resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.3.tgz#35c563619b13f3681e7eb05cbdaf50f56ba58820" @@ -5940,6 +7171,19 @@ eventemitter3@^3.0.0, eventemitter3@^3.1.0: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== +events@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + exec-sh@^0.2.0: version "0.2.2" resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.2.tgz#2a5e7ffcbd7d0ba2755bdecb16e5a427dfbdec36" @@ -6072,6 +7316,13 @@ expect@^25.5.0: jest-message-util "^25.5.0" jest-regex-util "^25.2.6" +ext@^1.1.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244" + integrity sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A== + dependencies: + type "^2.0.0" + extend-shallow@^1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-1.1.4.tgz#19d6bf94dfc09d76ba711f39b872d21ff4dd9071" @@ -6380,16 +7631,7 @@ finalhandler@1.1.2: statuses "~1.5.0" unpipe "~1.0.0" -find-cache-dir@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" - integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== - dependencies: - commondir "^1.0.1" - make-dir "^2.0.0" - pkg-dir "^3.0.0" - -find-cache-dir@^3.3.1: +find-cache-dir@3.3.1, find-cache-dir@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== @@ -6398,6 +7640,15 @@ find-cache-dir@^3.3.1: make-dir "^3.0.2" pkg-dir "^4.1.0" +find-cache-dir@^2.0.0, find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + find-file-up@^0.1.2: version "0.1.3" resolved "https://registry.yarnpkg.com/find-file-up/-/find-file-up-0.1.3.tgz#cf68091bcf9f300a40da411b37da5cce5a2fbea0" @@ -6519,6 +7770,19 @@ form-data@~2.3.1, form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" +formik@2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/formik/-/formik-2.2.6.tgz#378a4bafe4b95caf6acf6db01f81f3fe5147559d" + integrity sha512-Kxk2zQRafy56zhLmrzcbryUpMBvT0tal5IvcifK5+4YNGelKsnrODFJ0sZQRMQboblWNym4lAW3bt+tf2vApSA== + dependencies: + deepmerge "^2.1.1" + hoist-non-react-statics "^3.3.0" + lodash "^4.17.14" + lodash-es "^4.17.14" + react-fast-compare "^2.0.1" + tiny-warning "^1.0.2" + tslib "^1.10.0" + fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" @@ -6597,6 +7861,13 @@ fs-minipass@^1.2.5: dependencies: minipass "^2.6.0" +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + fs-write-stream-atomic@^1.0.8: version "1.0.10" resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" @@ -6612,7 +7883,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.2.3: +fsevents@^1.2.3, fsevents@^1.2.7: version "1.2.13" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== @@ -6625,6 +7896,11 @@ fsevents@^2.1.2: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== +fsevents@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -6906,11 +8182,23 @@ glob-parent@^5.1.0: dependencies: is-glob "^4.0.1" +glob-parent@~5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + glob-to-regexp@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" @@ -7054,6 +8342,11 @@ graceful-fs@^4.1.15, graceful-fs@^4.2.0: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== +graceful-fs@^4.2.2: + version "4.2.6" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" + integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== + grapheme-splitter@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" @@ -7181,6 +8474,23 @@ has@^1.0.1, has@^1.0.3: dependencies: function-bind "^1.1.1" +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + hawk@~6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" @@ -7191,6 +8501,20 @@ hawk@~6.0.2: hoek "4.x.x" sntp "2.x.x" +he@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + hoek@4.x.x: version "4.2.1" resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" @@ -7232,6 +8556,16 @@ html-escaper@^2.0.0: resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== +htmlparser2@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-4.1.0.tgz#9a4ef161f2e4625ebf7dfbe6c0a2f52d18a59e78" + integrity sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q== + dependencies: + domelementtype "^2.0.1" + domhandler "^3.0.0" + domutils "^2.0.0" + entities "^2.0.0" + http-cache-semantics@^3.8.1: version "3.8.1" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" @@ -7270,6 +8604,19 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +https-proxy-agent@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + dependencies: + agent-base "6" + debug "4" + https-proxy-agent@^2.2.0, https-proxy-agent@^2.2.3: version "2.2.4" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" @@ -7330,6 +8677,18 @@ iconv-lite@^0.6.2: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" +icss-utils@^4.0.0, icss-utils@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" + integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== + dependencies: + postcss "^7.0.14" + +ieee754@^1.1.4: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + iferr@^0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" @@ -7411,6 +8770,11 @@ indent-string@^4.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + infer-owner@^1.0.3, infer-owner@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" @@ -7424,11 +8788,21 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + ini@^1.3.2, ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" @@ -7571,6 +8945,20 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" @@ -7724,7 +9112,7 @@ is-glob@^3.1.0: dependencies: is-extglob "^2.1.0" -is-glob@^4.0.0, is-glob@^4.0.1: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== @@ -8424,7 +9812,7 @@ jest-worker@24.0.0-alpha.6: dependencies: merge-stream "^1.0.1" -jest-worker@^24.0.0-alpha.6, jest-worker@^24.6.0: +jest-worker@24.9.0, jest-worker@^24.0.0-alpha.6, jest-worker@^24.6.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== @@ -8519,7 +9907,7 @@ json-buffer@3.0.0: resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= -json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1: +json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== @@ -8563,6 +9951,13 @@ json5@2.x, json5@^2.1.0: dependencies: minimist "^1.2.0" +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + json5@^2.1.2: version "2.1.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" @@ -8888,6 +10283,38 @@ load-yaml-file@^0.2.0: pify "^4.0.1" strip-bom "^3.0.0" +loader-runner@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== + +loader-utils@1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + +loader-utils@2.0.0, loader-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" + integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +loader-utils@^1.2.3: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" @@ -9119,6 +10546,13 @@ lowercase-keys@^2.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== +lru-cache@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + lru-cache@^4.0.1: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" @@ -9243,6 +10677,15 @@ math-random@^1.0.1: resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + mem@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" @@ -9250,6 +10693,22 @@ mem@^1.1.0: dependencies: mimic-fn "^1.0.0" +memory-fs@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + meow@^3.3.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" @@ -9631,6 +11090,14 @@ micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + mime-db@1.42.0: version "1.42.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.42.0.tgz#3e252907b4c7adb906597b4b65636272cf9e7bac" @@ -9704,6 +11171,16 @@ min-document@^2.19.0: dependencies: dom-walk "^0.1.0" +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -9739,6 +11216,27 @@ minimist@~0.0.1: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.2: + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + minipass@^2.3.5, minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" @@ -9747,6 +11245,13 @@ minipass@^2.3.5, minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: safe-buffer "^5.1.2" yallist "^3.0.0" +minipass@^3.0.0, minipass@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" + integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== + dependencies: + yallist "^4.0.0" + minizlib@^1.2.1: version "1.3.3" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" @@ -9797,7 +11302,14 @@ mkdirp@*, mkdirp@0.x, mkdirp@^0.5.0: dependencies: minimist "0.0.8" -mkdirp@^0.5.1, mkdirp@^0.5.4: +mkdirp@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.3.tgz#5a514b7179259287952881e94410ec5465659f8c" + integrity sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg== + dependencies: + minimist "^1.2.5" + +mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.4: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== @@ -9918,6 +11430,13 @@ native-or-bluebird@^1.2.0: resolved "https://registry.yarnpkg.com/native-or-bluebird/-/native-or-bluebird-1.2.0.tgz#39c47bfd7825d1fb9ffad32210ae25daadf101c9" integrity sha1-OcR7/Xgl0fuf+tMiEK4l2q3xAck= +native-url@0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/native-url/-/native-url-0.3.4.tgz#29c943172aed86c63cee62c8c04db7f5756661f8" + integrity sha512-6iM8R99ze45ivyH8vybJ7X0yekIcPf5GgLV5K0ENCbmRcaRIDoj37BC8iLEmaaBfqqb8enuZ5p0uhY+lVAbAcA== + dependencies: + querystring "^0.2.0" + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -9928,11 +11447,86 @@ negotiator@0.6.2: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== -neo-async@^2.6.0: +neo-async@2.6.1, neo-async@^2.6.0: version "2.6.1" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== +neo-async@^2.5.0, neo-async@^2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +next-tick@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= + +next@9.5.3: + version "9.5.3" + resolved "https://registry.yarnpkg.com/next/-/next-9.5.3.tgz#7af5270631f98d330a7f75a6e8e1ac202aa155e2" + integrity sha512-DGrpTNGV2RNMwLaSzpgbkbaUuVk30X71/roXHS10isSXo2Gm+qWcjonDyOxf1KmOvHZRHA/Fa+LaAR7ysdYS3A== + dependencies: + "@ampproject/toolbox-optimizer" "2.6.0" + "@babel/code-frame" "7.10.4" + "@babel/core" "7.7.7" + "@babel/plugin-proposal-class-properties" "7.10.4" + "@babel/plugin-proposal-export-namespace-from" "7.10.4" + "@babel/plugin-proposal-nullish-coalescing-operator" "7.10.4" + "@babel/plugin-proposal-numeric-separator" "7.10.4" + "@babel/plugin-proposal-object-rest-spread" "7.11.0" + "@babel/plugin-proposal-optional-chaining" "7.11.0" + "@babel/plugin-syntax-bigint" "7.8.3" + "@babel/plugin-syntax-dynamic-import" "7.8.3" + "@babel/plugin-transform-modules-commonjs" "7.10.4" + "@babel/plugin-transform-runtime" "7.11.5" + "@babel/preset-env" "7.11.5" + "@babel/preset-modules" "0.1.4" + "@babel/preset-react" "7.10.4" + "@babel/preset-typescript" "7.10.4" + "@babel/runtime" "7.11.2" + "@babel/types" "7.11.5" + "@next/react-dev-overlay" "9.5.3" + "@next/react-refresh-utils" "9.5.3" + ast-types "0.13.2" + babel-plugin-syntax-jsx "6.18.0" + babel-plugin-transform-define "2.0.0" + babel-plugin-transform-react-remove-prop-types "0.4.24" + browserslist "4.13.0" + buffer "5.6.0" + cacache "13.0.1" + caniuse-lite "^1.0.30001113" + chokidar "2.1.8" + crypto-browserify "3.12.0" + css-loader "3.5.3" + cssnano-simple "1.2.0" + find-cache-dir "3.3.1" + jest-worker "24.9.0" + loader-utils "2.0.0" + mkdirp "0.5.3" + native-url "0.3.4" + neo-async "2.6.1" + node-html-parser "^1.2.19" + path-browserify "1.0.1" + pnp-webpack-plugin "1.6.4" + postcss "7.0.32" + process "0.11.10" + prop-types "15.7.2" + react-is "16.13.1" + react-refresh "0.8.3" + resolve-url-loader "3.1.1" + sass-loader "8.0.2" + schema-utils "2.6.6" + stream-browserify "3.0.0" + style-loader "1.2.1" + styled-jsx "3.3.0" + use-subscription "1.4.1" + vm-browserify "1.1.2" + watchpack "2.0.0-beta.13" + web-vitals "0.2.1" + webpack "4.44.1" + webpack-sources "1.4.3" + nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -9955,24 +11549,24 @@ node-fetch-npm@^2.0.2: json-parse-better-errors "^1.0.0" safe-buffer "^5.1.1" -node-fetch@^1.0.1: - version "1.7.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" - integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== - dependencies: - encoding "^0.1.11" - is-stream "^1.0.1" - -node-fetch@^2.1.1, node-fetch@^2.3.0, node-fetch@^2.5.0: +node-fetch@2.6.0, node-fetch@^2.1.1, node-fetch@^2.3.0, node-fetch@^2.5.0: version "2.6.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== -node-fetch@^2.2.0: +node-fetch@2.6.1, node-fetch@^2.2.0: version "2.6.1" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== +node-fetch@^1.0.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + node-gyp@^5.0.2: version "5.0.5" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-5.0.5.tgz#f6cf1da246eb8c42b097d7cd4d6c3ce23a4163af" @@ -9990,11 +11584,47 @@ node-gyp@^5.0.2: tar "^4.4.12" which "1" +node-html-parser@^1.2.19: + version "1.4.9" + resolved "https://registry.yarnpkg.com/node-html-parser/-/node-html-parser-1.4.9.tgz#3c8f6cac46479fae5800725edb532e9ae8fd816c" + integrity sha512-UVcirFD1Bn0O+TSmloHeHqZZCxHjvtIeGdVdGMhyZ8/PWlEiZaZ5iJzR189yKZr8p0FXN58BUeC7RHRkf/KYGw== + dependencies: + he "1.2.0" + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "^1.0.1" + node-modules-regexp@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" @@ -10022,6 +11652,11 @@ node-notifier@^6.0.0: shellwords "^0.1.1" which "^1.3.1" +node-releases@^1.1.58: + version "1.1.71" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" + integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== + node-releases@^1.1.61: version "1.1.61" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.61.tgz#707b0fca9ce4e11783612ba4a2fcba09047af16e" @@ -10044,6 +11679,11 @@ node-version@^1.0.0: dependencies: abbrev "1" +normalize-html-whitespace@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/normalize-html-whitespace/-/normalize-html-whitespace-1.0.0.tgz#5e3c8e192f1b06c3b9eee4b7e7f28854c7601e34" + integrity sha512-9ui7CGtOOlehQu0t/OhhlmDyc71mKVlv+4vF+me4iZLPrNtRL2xoquEdfZxasC/bdQi/Hr3iTrpyRKIG+ocabA== + normalize-package-data@^2.0.0, normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.3.5, normalize-package-data@^2.4.0, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -10061,7 +11701,7 @@ normalize-path@^2.0.1, normalize-path@^2.1.1: dependencies: remove-trailing-separator "^1.0.1" -normalize-path@^3.0.0: +normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== @@ -10216,6 +11856,11 @@ object-keys@~0.4.0: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY= +object-path@0.11.4: + version "0.11.4" + resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.4.tgz#370ae752fbf37de3ea70a861c23bba8915691949" + integrity sha1-NwrnUvvzfePqcKhhwju6iRVpGUk= + object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" @@ -10409,6 +12054,11 @@ ora@^4.0.3: strip-ansi "^6.0.0" wcwidth "^1.0.1" +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + os-homedir@^1.0.0, os-homedir@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" @@ -10554,6 +12204,13 @@ p-map@^2.0.0, p-map@^2.1.0: resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== +p-map@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" + integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== + dependencies: + aggregate-error "^3.0.0" + p-map@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" @@ -10602,6 +12259,11 @@ p-waterfall@^1.0.0: dependencies: p-reduce "^1.0.0" +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + parallel-transform@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" @@ -10618,6 +12280,17 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parse-asn1@^5.0.0, parse-asn1@^5.1.5: + version "5.1.6" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== + dependencies: + asn1.js "^5.2.0" + browserify-aes "^1.0.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + parse-git-config@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/parse-git-config/-/parse-git-config-1.1.1.tgz#d3a9984317132f57398712bba438e129590ddf8c" @@ -10724,6 +12397,16 @@ pascalcase@^0.1.1: resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-browserify@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + path-dirname@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" @@ -10794,6 +12477,17 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pbkdf2@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" + integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + pend@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" @@ -10864,6 +12558,11 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" +platform@1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.3.tgz#646c77011899870b6a0903e75e997e8e51da7461" + integrity sha1-ZGx3ARiZhwtqCQPnXpl+jlHadGE= + please-upgrade-node@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" @@ -10896,11 +12595,100 @@ pn@^1.1.0: resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== +pnp-webpack-plugin@1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" + integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg== + dependencies: + ts-pnp "^1.1.6" + posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= +postcss-modules-extract-imports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" + integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== + dependencies: + postcss "^7.0.5" + +postcss-modules-local-by-default@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0" + integrity sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw== + dependencies: + icss-utils "^4.1.1" + postcss "^7.0.32" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" + integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^6.0.0" + +postcss-modules-values@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" + integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== + dependencies: + icss-utils "^4.0.0" + postcss "^7.0.6" + +postcss-safe-parser@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz#a6d4e48f0f37d9f7c11b2a581bf00f8ba4870b96" + integrity sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g== + dependencies: + postcss "^7.0.26" + +postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: + version "6.0.4" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz#56075a1380a04604c38b063ea7767a129af5c2b3" + integrity sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw== + dependencies: + cssesc "^3.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.0.3, postcss-value-parser@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" + integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== + +postcss@7.0.21: + version "7.0.21" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.21.tgz#06bb07824c19c2021c5d056d5b10c35b989f7e17" + integrity sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +postcss@7.0.32: + version "7.0.32" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d" + integrity sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +postcss@^7.0.14, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.35" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24" + integrity sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + preferred-pm@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/preferred-pm/-/preferred-pm-3.0.2.tgz#bbdbef1014e34a7490349bf70d6d244b8d57a5e1" @@ -10986,7 +12774,7 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -process@^0.11.10: +process@0.11.10, process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= @@ -11046,7 +12834,7 @@ promzard@^0.3.0: dependencies: read "1" -prop-types@^15.5.8, prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@15.7.2, prop-types@^15.5.8, prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -11077,6 +12865,11 @@ protoduck@^5.0.1: dependencies: genfun "^5.0.0" +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" @@ -11087,6 +12880,18 @@ psl@^1.1.24, psl@^1.1.28: resolved "https://registry.yarnpkg.com/psl/-/psl-1.6.0.tgz#60557582ee23b6c43719d9890fb4170ecd91e110" integrity sha512-SYKKmVel98NCOYXpkwUqZqh0ahZeeKfmisiLIcEZdsb+WbLv02g/dI5BUmZnIyOe7RzZtLax81nnb2HbvC2tzA== +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + pump@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" @@ -11117,7 +12922,7 @@ punycode@1.3.2: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= -punycode@^1.4.1: +punycode@^1.2.4, punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= @@ -11137,11 +12942,21 @@ qs@~6.5.1, qs@~6.5.2: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + querystring@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= +querystring@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd" + integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg== + quick-lru@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" @@ -11166,6 +12981,21 @@ randomatic@^3.0.0: kind-of "^6.0.0" math-random "^1.0.1" +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" @@ -11213,7 +13043,7 @@ react-fast-compare@^2.0.1: resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9" integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw== -react-is@^16.12.0, react-is@^16.8.1: +react-is@16.13.1, react-is@^16.12.0, react-is@^16.8.1: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== @@ -11286,6 +13116,11 @@ react-proxy@^1.1.7: lodash "^4.6.1" react-deep-force-update "^1.0.0" +react-refresh@0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.3.tgz#721d4657672d400c5e3c75d063c4a85fb2d5d68f" + integrity sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg== + react-transform-hmr@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/react-transform-hmr/-/react-transform-hmr-1.0.4.tgz#e1a40bd0aaefc72e8dfd7a7cda09af85066397bb" @@ -11439,7 +13274,7 @@ read@1, read@~1.0.1: string_decoder "^1.1.1" util-deprecate "^1.0.1" -readable-stream@^2.0.1, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@~2.3.6: +readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -11452,6 +13287,15 @@ readable-stream@^2.0.1, readable-stream@^2.0.6, readable-stream@^2.2.2, readable string_decoder "~1.1.1" util-deprecate "~1.0.1" +readable-stream@^3.5.0, readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readable-stream@~1.0.17: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" @@ -11472,6 +13316,22 @@ readdir-scoped-modules@^1.0.0: graceful-fs "^4.1.2" once "^1.3.0" +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +readdirp@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" + integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== + dependencies: + picomatch "^2.2.1" + realpath-native@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-2.0.0.tgz#7377ac429b6e1fd599dc38d08ed942d0d7beb866" @@ -11544,6 +13404,11 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" +regex-parser@2.2.10: + version "2.2.10" + resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.10.tgz#9e66a8f73d89a107616e63b39d4deddfee912b37" + integrity sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA== + regexpp@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" @@ -11830,6 +13695,22 @@ resolve-from@^5.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== +resolve-url-loader@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz#28931895fa1eab9be0647d3b2958c100ae3c0bf0" + integrity sha512-K1N5xUjj7v0l2j/3Sgs5b8CjrrgtC70SmdCuZiJ8tSyb5J+uk3FoeZ4b7yTnH6j7ngI+Bc5bldHJIa8hYdu2gQ== + dependencies: + adjust-sourcemap-loader "2.0.0" + camelcase "5.3.1" + compose-function "3.0.3" + convert-source-map "1.7.0" + es6-iterator "2.0.3" + loader-utils "1.2.3" + postcss "7.0.21" + rework "1.0.1" + rework-visit "1.0.0" + source-map "0.6.1" + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" @@ -11908,7 +13789,20 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@2, rimraf@^2.5.4, rimraf@^2.6.2, rimraf@^2.6.3: +rework-visit@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rework-visit/-/rework-visit-1.0.0.tgz#9945b2803f219e2f7aca00adb8bc9f640f842c9a" + integrity sha1-mUWygD8hni96ygCtuLyfZA+ELJo= + +rework@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rework/-/rework-1.0.1.tgz#30806a841342b54510aa4110850cd48534144aa7" + integrity sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc= + dependencies: + convert-source-map "^0.3.3" + css "^2.0.0" + +rimraf@2, rimraf@^2.5.4, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -11934,6 +13828,14 @@ rimraf@~2.2.6: resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" integrity sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI= +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + rollup-plugin-sourcemaps@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/rollup-plugin-sourcemaps/-/rollup-plugin-sourcemaps-0.6.2.tgz#1eed5a3e07b833dc14c4cdb1e63b300d340f4a74" @@ -12057,6 +13959,11 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== +safe-buffer@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" @@ -12101,6 +14008,17 @@ sane@^4.0.3: minimist "^1.1.1" walker "~1.0.5" +sass-loader@8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-8.0.2.tgz#debecd8c3ce243c76454f2e8290482150380090d" + integrity sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ== + dependencies: + clone-deep "^4.0.1" + loader-utils "^1.2.3" + neo-async "^2.6.1" + schema-utils "^2.6.1" + semver "^6.3.0" + sax@~1.1.1: version "1.1.6" resolved "https://registry.yarnpkg.com/sax/-/sax-1.1.6.tgz#5d616be8a5e607d54e114afae55b7eaf2fcc3240" @@ -12121,6 +14039,32 @@ scheduler@^0.20.1: loose-envify "^1.1.0" object-assign "^4.1.1" +schema-utils@2.6.6: + version "2.6.6" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.6.tgz#299fe6bd4a3365dc23d99fd446caff8f1d6c330c" + integrity sha512-wHutF/WPSbIi9x6ctjGGk2Hvl0VOz5l3EKEuKbjPlB30mKZUzb9A5k9yEXRX3pwyqVLPvpfZZEllaFq/M718hA== + dependencies: + ajv "^6.12.0" + ajv-keywords "^3.4.1" + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +schema-utils@^2.6.1, schema-utils@^2.6.6: + version "2.7.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + semver-compare@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" @@ -12190,6 +14134,13 @@ serialize-javascript@^1.7.0: resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.9.1.tgz#cfc200aef77b600c47da9bb8149c943e798c2fdb" integrity sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A== +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + dependencies: + randombytes "^2.1.0" + serve-static@^1.13.1: version "1.14.1" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" @@ -12215,7 +14166,7 @@ set-value@^2.0.0, set-value@^2.0.1: is-plain-object "^2.0.3" split-string "^3.0.1" -setimmediate@^1.0.5: +setimmediate@^1.0.4, setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= @@ -12225,6 +14176,14 @@ setprototypeof@1.1.1: resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + shallow-clone@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" @@ -12266,7 +14225,7 @@ shell-quote@1.6.1: array-reduce "~0.0.0" jsonify "~0.0.0" -shell-quote@^1.6.1: +shell-quote@1.7.2, shell-quote@^1.6.1: version "1.7.2" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== @@ -12427,7 +14386,12 @@ sort-keys@^2.0.0: dependencies: is-plain-obj "^1.0.0" -source-map-resolve@^0.5.0: +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: version "0.5.3" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== @@ -12467,21 +14431,28 @@ source-map-url@^0.4.0: resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= -source-map@^0.5.0, source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: +source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@^0.7.3: +source-map@0.7.3, source-map@^0.7.3: version "0.7.3" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== +source-map@0.8.0-beta.0: + version "0.8.0-beta.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.8.0-beta.0.tgz#d4c1bb42c3f7ee925f005927ba10709e0d1d1f11" + integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== + dependencies: + whatwg-url "^7.0.0" + +source-map@^0.5.0, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + sourcemap-codec@^1.4.4: version "1.4.6" resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz#e30a74f0402bad09807640d39e971090a08ce1e9" @@ -12577,11 +14548,26 @@ ssri@^6.0.0, ssri@^6.0.1: dependencies: figgy-pudding "^3.5.1" +ssri@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-7.1.0.tgz#92c241bf6de82365b5c7fb4bd76e975522e1294d" + integrity sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g== + dependencies: + figgy-pudding "^3.5.1" + minipass "^3.1.1" + stack-utils@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== +stacktrace-parser@0.1.10: + version "0.1.10" + resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" + integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== + dependencies: + type-fest "^0.7.1" + stacktrace-parser@0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.4.tgz#01397922e5f62ecf30845522c95c4fe1d25e7d4e" @@ -12605,6 +14591,22 @@ stealthy-require@^1.1.0, stealthy-require@^1.1.1: resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= +stream-browserify@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" + integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== + dependencies: + inherits "~2.0.4" + readable-stream "^3.5.0" + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + stream-buffers@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-2.2.0.tgz#91d5f5130d1cef96dcfa7f726945188741d09ee4" @@ -12618,6 +14620,17 @@ stream-each@^1.1.0: end-of-stream "^1.1.0" stream-shift "^1.0.0" +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + stream-shift@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" @@ -12635,6 +14648,11 @@ string-argv@0.3.1: resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== +string-hash@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" + integrity sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs= + string-length@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/string-length/-/string-length-3.1.0.tgz#107ef8c23456e187a8abd4a61162ff4ac6e25837" @@ -12710,7 +14728,7 @@ string.prototype.trimstart@^1.0.1: define-properties "^1.1.3" es-abstract "^1.17.5" -string_decoder@^1.1.1: +string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== @@ -12743,6 +14761,13 @@ stringstream@~0.0.5: resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.6.tgz#7880225b0d4ad10e30927d167a1d6f2fd3b33a72" integrity sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA== +strip-ansi@6.0.0, strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -12764,13 +14789,6 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" -strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== - dependencies: - ansi-regex "^5.0.0" - strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" @@ -12829,6 +14847,38 @@ strong-log-transformer@^2.0.0: minimist "^1.2.0" through "^2.3.4" +style-loader@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.2.1.tgz#c5cbbfbf1170d076cfdd86e0109c5bba114baa1a" + integrity sha512-ByHSTQvHLkWE9Ir5+lGbVOXhxX10fbprhLvdg96wedFZb4NDekDPxVKv5Fwmio+QcMlkkNfuK+5W1peQ5CUhZg== + dependencies: + loader-utils "^2.0.0" + schema-utils "^2.6.6" + +styled-jsx@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-3.3.0.tgz#32335c1a3ecfc923ba4f9c056eeb3d4699006b09" + integrity sha512-sh8BI5eGKyJlwL4kNXHjb27/a/GJV8wP4ElRIkRXrGW3sHKOsY9Pa1VZRNxyvf3+lisdPwizD9JDkzVO9uGwZw== + dependencies: + "@babel/types" "7.8.3" + babel-plugin-syntax-jsx "6.18.0" + convert-source-map "1.7.0" + loader-utils "1.2.3" + source-map "0.7.3" + string-hash "1.1.3" + stylis "3.5.4" + stylis-rule-sheet "0.0.10" + +stylis-rule-sheet@0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz#44e64a2b076643f4b52e5ff71efc04d8c3c4a430" + integrity sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw== + +stylis@3.5.4: + version "3.5.4" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-3.5.4.tgz#f665f25f5e299cf3d64654ab949a57c768b73fbe" + integrity sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q== + supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -12901,6 +14951,11 @@ tagged-versions@1.3.0: child-process-promise "^2.1.3" semver "^5.3.0" +tapable@^1.0.0, tapable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + tar@^4.4.10, tar@^4.4.12, tar@^4.4.8: version "4.4.13" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" @@ -12959,6 +15014,30 @@ terminal-link@^2.0.0: ansi-escapes "^4.2.1" supports-hyperlinks "^2.0.0" +terser-webpack-plugin@^1.4.3: + version "1.4.5" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" + integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^4.0.0" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + +terser@4.8.0, terser@^4.1.2: + version "4.8.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" + integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + terser@^4.1.0: version "4.4.2" resolved "https://registry.yarnpkg.com/terser/-/terser-4.4.2.tgz#448fffad0245f4c8a277ce89788b458bfd7706e8" @@ -13061,6 +15140,13 @@ timed-out@^4.0.0: resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= +timers-browserify@^2.0.4: + version "2.0.12" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" + integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== + dependencies: + setimmediate "^1.0.4" + tiny-glob@^0.2.6: version "0.2.6" resolved "https://registry.yarnpkg.com/tiny-glob/-/tiny-glob-0.2.6.tgz#9e056e169d9788fe8a734dfa1ff02e9b92ed7eda" @@ -13093,6 +15179,11 @@ tmpl@1.0.x: resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" @@ -13184,6 +15275,11 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" +traverse@0.6.6: + version "0.6.6" + resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137" + integrity sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc= + trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" @@ -13215,6 +15311,11 @@ ts-jest@^25.3.1: semver "6.x" yargs-parser "18.x" +ts-pnp@^1.1.6: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" + integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== + tsdx@^0.14.1: version "0.14.1" resolved "https://registry.yarnpkg.com/tsdx/-/tsdx-0.14.1.tgz#8771d509b6fc523ad971bae3a63ebe3a88355ab3" @@ -13294,6 +15395,11 @@ tsutils@^3.17.1, tsutils@^3.7.0: dependencies: tslib "^1.8.1" +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + tty-table@^2.7.0: version "2.8.13" resolved "https://registry.yarnpkg.com/tty-table/-/tty-table-2.8.13.tgz#d484a416381973eaebbdf19c79136b390e5c6d70" @@ -13345,11 +15451,26 @@ type-fest@^0.6.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== +type-fest@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" + integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== + type-fest@^0.8.0, type-fest@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== +type@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +type@^2.0.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d" + integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw== + typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" @@ -13446,6 +15567,11 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^2.0.1" +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + unique-filename@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" @@ -13502,6 +15628,11 @@ untildify@^4.0.0: resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + update-check@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/update-check/-/update-check-1.3.2.tgz#460f9e9ab24820367f3edbeb4d4142d9936ff171" @@ -13547,6 +15678,13 @@ url@^0.11.0: punycode "1.3.2" querystring "0.2.0" +use-subscription@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/use-subscription/-/use-subscription-1.4.1.tgz#edcbcc220f1adb2dd4fa0b2f61b6cc308e620069" + integrity sha512-7+IIwDG/4JICrWHL/Q/ZPK5yozEnvRm6vHImu0LKwQlmWGKeiF7mbAenLlK/cTNXrTtXHU/SFASQHzB6+oSJMQ== + dependencies: + object-assign "^4.1.1" + use-subscription@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/use-subscription/-/use-subscription-1.5.1.tgz#73501107f02fad84c6dd57965beb0b75c68c42d1" @@ -13559,7 +15697,7 @@ use@^3.1.0: resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== -util-deprecate@^1.0.1, util-deprecate@~1.0.1: +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= @@ -13571,6 +15709,20 @@ util-promisify@^2.1.0: dependencies: object.getownpropertydescriptors "^2.0.3" +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" @@ -13629,6 +15781,11 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" +vm-browserify@1.1.2, vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + w3c-hr-time@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" @@ -13660,6 +15817,32 @@ watch@~0.18.0: exec-sh "^0.2.0" minimist "^1.2.0" +watchpack-chokidar2@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" + integrity sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww== + dependencies: + chokidar "^2.1.8" + +watchpack@2.0.0-beta.13: + version "2.0.0-beta.13" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.0.0-beta.13.tgz#9d9b0c094b8402139333e04eb6194643c8384f55" + integrity sha512-ZEFq2mx/k5qgQwgi6NOm+2ImICb8ngAkA/rZ6oyXZ7SgPn3pncf+nfhYTCrs3lmHwOxnPtGLTOuFLfpSMh1VMA== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +watchpack@^1.7.4: + version "1.7.5" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453" + integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ== + dependencies: + graceful-fs "^4.1.2" + neo-async "^2.5.0" + optionalDependencies: + chokidar "^3.4.1" + watchpack-chokidar2 "^2.0.1" + wcwidth@^1.0.0, wcwidth@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" @@ -13667,11 +15850,53 @@ wcwidth@^1.0.0, wcwidth@^1.0.1: dependencies: defaults "^1.0.3" +web-vitals@0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-0.2.1.tgz#60782fa690243fe35613759a0c26431f57ba7b2d" + integrity sha512-2pdRlp6gJpOCg0oMMqwFF0axjk5D9WInc09RSYtqFgPXQ15+YKNQ7YnBBEqAL5jvmfH9WvoXDMb8DHwux7pIew== + webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== +webpack-sources@1.4.3, webpack-sources@^1.4.0, webpack-sources@^1.4.1: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@4.44.1: + version "4.44.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.44.1.tgz#17e69fff9f321b8f117d1fda714edfc0b939cc21" + integrity sha512-4UOGAohv/VGUNQJstzEywwNxqX417FnjZgZJpJQegddzPmTvph37eBIRbRTfdySXzVtJXLJfbMN3mMYhM6GdmQ== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/wasm-edit" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + acorn "^6.4.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" + enhanced-resolve "^4.3.0" + eslint-scope "^4.0.3" + json-parse-better-errors "^1.0.2" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.3" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" + schema-utils "^1.0.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.3" + watchpack "^1.7.4" + webpack-sources "^1.4.1" + whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" @@ -13766,6 +15991,13 @@ wordwrap@~0.0.2: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" + wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" @@ -13939,6 +16171,11 @@ xpipe@^1.0.5: resolved "https://registry.yarnpkg.com/xpipe/-/xpipe-1.0.5.tgz#8dd8bf45fc3f7f55f0e054b878f43a62614dafdf" integrity sha1-jdi/Rfw/f1Xw4FS4ePQ6YmFNr98= +xtend@^4.0.0, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + xtend@~2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" @@ -13946,11 +16183,6 @@ xtend@~2.1.1: dependencies: object-keys "~0.4.0" -xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - y18n@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" @@ -13971,6 +16203,11 @@ yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + yaml@^1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" From 881d7e62a153e4ef298be958baf5d2947c2ab2e8 Mon Sep 17 00:00:00 2001 From: John Rom Date: Thu, 11 Mar 2021 17:19:49 -0500 Subject: [PATCH 05/28] Memoize Formik API and make it rain optimized states. Sync up formik-native and formik for v3. --- packages/formik-native/package.json | 4 +- packages/formik-native/src/index.ts | 4 +- packages/formik/src/ErrorMessage.tsx | 20 +- packages/formik/src/FastField.tsx | 214 ++---------------- packages/formik/src/Field.tsx | 27 +-- packages/formik/src/FieldArray.tsx | 11 +- packages/formik/src/Form.tsx | 4 +- packages/formik/src/Formik.tsx | 92 ++++---- packages/formik/src/FormikContext.tsx | 14 +- packages/formik/src/connect.tsx | 44 ++-- packages/formik/src/helpers/field-helpers.ts | 4 +- packages/formik/src/hooks/hooks.ts | 16 ++ packages/formik/src/hooks/useFormikApi.ts | 2 +- .../src/hooks/useFormikComputedState.ts | 47 +++- .../formik/src/hooks/useFullFormikState.ts | 4 +- packages/formik/src/index.tsx | 2 + packages/formik/src/types.tsx | 13 +- packages/formik/src/withFormik.tsx | 2 +- packages/formik/test/Field.test.tsx | 3 +- packages/formik/test/tsconfig.json | 10 +- packages/formik/test/withFormik.test.tsx | 3 + yarn.lock | 13 -- 22 files changed, 219 insertions(+), 334 deletions(-) create mode 100644 packages/formik/src/hooks/hooks.ts diff --git a/packages/formik-native/package.json b/packages/formik-native/package.json index 5ee8d2290..33fae45f5 100644 --- a/packages/formik-native/package.json +++ b/packages/formik-native/package.json @@ -1,6 +1,6 @@ { "name": "formik-native", - "version": "2.1.14", + "version": "3.0.0-refs1", "license": "Apache-2.0", "author": "Jared Palmer ", "repository": "formium/formik", @@ -31,7 +31,7 @@ "react": ">=16.8.0" }, "dependencies": { - "formik": "2.2.6" + "formik": "3.0.0-refs1" }, "devDependencies": { "@react-native-community/eslint-config": "^0.0.5", diff --git a/packages/formik-native/src/index.ts b/packages/formik-native/src/index.ts index 859266506..a6ac5d6fb 100644 --- a/packages/formik-native/src/index.ts +++ b/packages/formik-native/src/index.ts @@ -1,9 +1,9 @@ import * as React from 'react'; import { NativeSyntheticEvent, NativeTouchEvent } from 'react-native'; -import { useFormikContext } from 'formik'; +import { useFormikApi } from 'formik'; export function useSubmitButton() { - const { submitForm } = useFormikContext(); + const { submitForm } = useFormikApi(); const handlePress = React.useCallback( (_ev: NativeSyntheticEvent) => { submitForm(); diff --git a/packages/formik/src/ErrorMessage.tsx b/packages/formik/src/ErrorMessage.tsx index 35c7fd585..6410aac78 100644 --- a/packages/formik/src/ErrorMessage.tsx +++ b/packages/formik/src/ErrorMessage.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { isFunction } from './utils'; -import { useFieldMeta } from './Field'; +import { useFieldMeta } from './hooks/hooks'; export interface ErrorMessageProps { name: string; @@ -10,14 +10,16 @@ export interface ErrorMessageProps { render?: (errorMessage: string) => React.ReactNode; } -export const ErrorMessage = (props: ErrorMessageProps) => { - const { component, render, children, name, ...rest } = props; - const fieldMeta = useFieldMeta(props.name); +export function ErrorMessage({ + component, + render, + children, + name, + ...rest +}: ErrorMessageProps): JSX.Element | null { + const { touched, error } = useFieldMeta(name); - const touch = fieldMeta.touched; - const error = fieldMeta.error; - - return !!touch && !!error + return !!touched && !!error ? render ? isFunction(render) ? render(error) @@ -28,6 +30,6 @@ export const ErrorMessage = (props: ErrorMessageProps) => { : null : component ? React.createElement(component, rest as any, error) - : error + : (error as any) : null; }; diff --git a/packages/formik/src/FastField.tsx b/packages/formik/src/FastField.tsx index 98a863a1b..e07818c68 100644 --- a/packages/formik/src/FastField.tsx +++ b/packages/formik/src/FastField.tsx @@ -1,198 +1,26 @@ import * as React from 'react'; - -import { - FormikProps, - GenericFieldHTMLAttributes, - FormikContextType, - FieldMetaProps, - FieldInputProps, -} from './types'; -import invariant from 'tiny-warning'; -import { getIn, isEmptyChildren, isFunction } from './utils'; -import { FieldConfig } from './Field'; -import { connect } from './connect'; - -type $FixMe = any; - -export interface FastFieldProps { - field: FieldInputProps; - meta: FieldMetaProps; - form: FormikProps; // if ppl want to restrict this for a given form, let them. -} - -export type FastFieldConfig = FieldConfig & { - /** Override FastField's default shouldComponentUpdate */ - shouldUpdate?: ( - nextProps: T & GenericFieldHTMLAttributes, - props: {} - ) => boolean; +import { FormikValues, GenericFieldHTMLAttributes } from './types'; +import { Field, FieldConfig, FieldProps } from './Field'; + +export type FastFieldProps = FieldProps< + Value, + FormValues +>; + +export type FastFieldConfig = FieldConfig & { + /** + * Override FastField's default shouldComponentUpdate + * @deprecated + */ + shouldUpdate?: (nextProps: any, props: {}) => boolean; }; -export type FastFieldAttributes = GenericFieldHTMLAttributes & - FastFieldConfig & - T; - -type FastFieldInnerProps = FastFieldAttributes< - Props -> & { formik: FormikContextType }; - /** - * Custom Field component for quickly hooking into Formik - * context and wiring up forms. + * @deprecated Field now only subscribes to its own slice of Formik's state. */ -class FastFieldInner extends React.Component< - FastFieldInnerProps, - {} -> { - constructor(props: FastFieldInnerProps) { - super(props); - const { render, children, component, as: is, name } = props; - invariant( - !render, - ` has been deprecated. Please use a child callback function instead: {props => ...} instead.` - ); - invariant( - !(component && render), - 'You should not use and in the same component; will be ignored' - ); - - invariant( - !(is && children && isFunction(children)), - 'You should not use and as a function in the same component; will be ignored.' - ); - - invariant( - !(component && children && isFunction(children)), - 'You should not use and as a function in the same component; will be ignored.' - ); - - invariant( - !(render && children && !isEmptyChildren(children)), - 'You should not use and in the same component; will be ignored' - ); - } - - shouldComponentUpdate(props: FastFieldInnerProps) { - if (this.props.shouldUpdate) { - return this.props.shouldUpdate(props, this.props); - } else if ( - props.name !== this.props.name || - getIn(props.formik.values, this.props.name) !== - getIn(this.props.formik.values, this.props.name) || - getIn(props.formik.errors, this.props.name) !== - getIn(this.props.formik.errors, this.props.name) || - getIn(props.formik.touched, this.props.name) !== - getIn(this.props.formik.touched, this.props.name) || - Object.keys(this.props).length !== Object.keys(props).length || - props.formik.isSubmitting !== this.props.formik.isSubmitting - ) { - return true; - } else { - return false; - } - } - - componentDidMount() { - // Register the Field with the parent Formik. Parent will cycle through - // registered Field's validate fns right prior to submit - this.props.formik.registerField(this.props.name, { - validate: this.props.validate, - }); - } - - componentDidUpdate(prevProps: FastFieldAttributes) { - if (this.props.name !== prevProps.name) { - this.props.formik.unregisterField(prevProps.name); - this.props.formik.registerField(this.props.name, { - validate: this.props.validate, - }); - } - - if (this.props.validate !== prevProps.validate) { - this.props.formik.registerField(this.props.name, { - validate: this.props.validate, - }); - } - } - - componentWillUnmount() { - this.props.formik.unregisterField(this.props.name); - } - - render() { - const { - validate, - name, - render, - as: is, - children, - component, - shouldUpdate, - formik, - ...props - } = this.props as FastFieldInnerProps; - - const { - validate: _validate, - validationSchema: _validationSchema, - ...restOfFormik - } = formik; - const field = formik.getFieldProps({ name, ...props }); - const meta = { - value: getIn(formik.values, name), - error: getIn(formik.errors, name), - touched: !!getIn(formik.touched, name), - initialValue: getIn(formik.initialValues, name), - initialTouched: !!getIn(formik.initialTouched, name), - initialError: getIn(formik.initialErrors, name), - }; - - const bag = { field, meta, form: restOfFormik }; - - if (render) { - return (render as any)(bag); - } - - if (isFunction(children)) { - return (children as (props: FastFieldProps) => React.ReactNode)(bag); - } - - if (component) { - // This behavior is backwards compat with earlier Formik 0.9 to 1.x - if (typeof component === 'string') { - const { innerRef, ...rest } = props; - return React.createElement( - component, - { ref: innerRef, ...field, ...(rest as $FixMe) }, - children - ); - } - // We don't pass `meta` for backwards compat - return React.createElement( - component as React.ComponentClass<$FixMe>, - { field, form: formik, ...props }, - children - ); - } - - // default to input here so we can check for both `as` and `children` above - const asElement = is || 'input'; - - if (typeof asElement === 'string') { - const { innerRef, ...rest } = props; - return React.createElement( - asElement, - { ref: innerRef, ...field, ...(rest as $FixMe) }, - children - ); - } - - return React.createElement( - asElement as React.ComponentClass, - { ...field, ...props }, - children - ); - } -} - -export const FastField = connect, any>(FastFieldInner); +export const FastField = ({ + shouldUpdate, + ...fieldProps +}: GenericFieldHTMLAttributes & FastFieldConfig) => ( + +); diff --git a/packages/formik/src/Field.tsx b/packages/formik/src/Field.tsx index 07f134717..738b5af64 100644 --- a/packages/formik/src/Field.tsx +++ b/packages/formik/src/Field.tsx @@ -9,25 +9,9 @@ import { } from './types'; import { isFunction, isEmptyChildren, isObject } from './utils'; import invariant from 'tiny-warning'; -import { useFormikState } from './hooks/useFormikState'; -import { - fieldMetaIsEqual, - selectFieldMetaByName, -} from './helpers/field-helpers'; import { useFormikApi } from './hooks/useFormikApi'; import { useFullFormikState } from './hooks/useFullFormikState'; - -/** - * Returns @see FieldMetaProps - */ -export const useFieldMeta = (name: string): FieldMetaProps => { - const [fieldMeta] = useFormikState( - React.useMemo(() => selectFieldMetaByName(name), [name]), - fieldMetaIsEqual - ); - - return fieldMeta; -}; +import { useFieldMeta } from './hooks/hooks'; export interface FieldProps { field: FieldInputProps; @@ -146,7 +130,7 @@ export function useField( ]; } -export function Field({ +export function Field<_FieldValue = any, FormValues = any>({ render, children, as: is, // `as` is reserved in typescript lol @@ -184,13 +168,14 @@ export function Field({ /** * If we use render function or use functional children, we continue to * subscribe to the full FormikState because these do not have access to hooks. + * We also do this for Component for backwards compatibility. * * Otherwise, we will pointlessly get the initial values but never subscribe to updates. */ const formikApi = useFormikApi(); const formikState = useFullFormikState( formikApi, - !!render || isFunction(children) + !!render || isFunction(children) || (component && typeof component !== 'string') ); const legacyBag = { field, form: { ...formikState, ...formikApi } }; @@ -206,7 +191,7 @@ export function Field({ if (component) { // This behavior is backwards compat with earlier Formik 0.9 to 1.x if (typeof component === 'string') { - const { innerRef, ...rest } = props; + const { innerRef, validate, ...rest } = props; return React.createElement( component, { ref: innerRef, ...field, ...rest }, @@ -216,7 +201,7 @@ export function Field({ // We don't pass `meta` for backwards compat return React.createElement( component, - { field, form: formikApi, ...props }, + { field, form: legacyBag.form, ...props }, children ); } diff --git a/packages/formik/src/FieldArray.tsx b/packages/formik/src/FieldArray.tsx index 5e2806417..6f0ce760f 100644 --- a/packages/formik/src/FieldArray.tsx +++ b/packages/formik/src/FieldArray.tsx @@ -1,8 +1,7 @@ import * as React from 'react'; import cloneDeep from 'lodash/cloneDeep'; -import { connect } from './connect'; +import { connect, FormikConnectedType } from './connect'; import { - FormikContextType, FormikState, SharedRenderProps, FormikProps, @@ -118,15 +117,17 @@ const copyArrayLike = (arrayLike: ArrayLike) => { } }; +type FieldArrayInnerProps = FieldArrayConfig & { formik: FormikConnectedType }; + class FieldArrayInner extends React.Component< - FieldArrayConfig & { formik: FormikContextType }, + FieldArrayInnerProps, {} > { static defaultProps = { validateOnChange: true, }; - constructor(props: FieldArrayConfig & { formik: FormikContextType }) { + constructor(props: FieldArrayInnerProps) { super(props); // We need TypeScript generics on these, so we'll bind them in the constructor // @todo Fix TS 3.2.1 @@ -135,7 +136,7 @@ class FieldArrayInner extends React.Component< } componentDidUpdate( - prevProps: FieldArrayConfig & { formik: FormikContextType } + prevProps: FieldArrayInnerProps ) { if ( this.props.validateOnChange && diff --git a/packages/formik/src/Form.tsx b/packages/formik/src/Form.tsx index fea573283..dd09696ef 100644 --- a/packages/formik/src/Form.tsx +++ b/packages/formik/src/Form.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { useFormikContext } from './FormikContext'; +import { useFormikApi } from './hooks/useFormikApi'; export type FormikFormProps = Pick< React.FormHTMLAttributes, @@ -18,7 +18,7 @@ export const Form = React.forwardRef( // We default the action to "#" in case the preventDefault fails (just updates the URL hash) const { action, ...rest } = props; const _action = action ?? '#'; - const { handleReset, handleSubmit } = useFormikContext(); + const { handleReset, handleSubmit } = useFormikApi(); return (
( resetForm(); }); - const getFieldMeta = React.useCallback( + const getFieldMeta = useEventCallback( (name: string): FieldMetaProps => { return selectFieldMetaByName(name)({ errors: state.errors, @@ -1003,15 +1004,7 @@ export function useFormik( touched: state.touched, values: state.values, }); - }, - [ - state.errors, - state.initialErrors, - state.initialTouched, - state.initialValues, - state.touched, - state.values, - ] + } ); const getFieldHelpers = React.useCallback( @@ -1073,32 +1066,25 @@ export function useFormik( [getFieldMeta, handleBlur, handleChange] ); - const dirty = React.useMemo( - () => !isEqual(state.initialValues, state.values), - [state.initialValues, state.values] - ); - - const isValid = React.useMemo( - () => - typeof props.isInitialValid !== 'undefined' - ? dirty - ? state.errors && Object.keys(state.errors).length === 0 - : props.isInitialValid !== false && isFunction(props.isInitialValid) - ? props.isInitialValid(props) - : props.isInitialValid - : state.errors && Object.keys(state.errors).length === 0, - [dirty, state.errors, props] - ); + const isFormValid = useEventCallback>((errors, dirty) => { + return typeof props.isInitialValid !== 'undefined' + ? dirty + ? errors && Object.keys(errors).length === 0 + : props.isInitialValid !== false && isFunction(props.isInitialValid) + ? props.isInitialValid(props) + : props.isInitialValid + : errors && Object.keys(errors).length === 0; + }); const subscriptionsRef = React.useRef([]); + // this is a hook used by other components const useState = React.useCallback( ( selector: Selector, Return>, comparer: Comparer = Object.is, - shouldSubscribe = true + shouldSubscribe: boolean = true ) => { - // this is a hook, but meant to be used by other components // eslint-disable-next-line react-hooks/rules-of-hooks selector = useOptimizedSelector(selector, comparer); @@ -1132,20 +1118,15 @@ export function useFormik( }); }, [state]); - const ctx: FormikApi = { + // mostly optimized renders. + // dirty and isValid should move to useComputedState() + const ctx = React.useMemo>(() => ({ // config - initialValues: props.initialValues, - initialTouched: props.initialTouched, - initialErrors: props.initialErrors, - initialStatus: props.initialStatus, validateOnBlur, validateOnChange, validateOnMount, validationSchema: props.validationSchema, validate: props.validate, - // computed props - dirty, - isValid, // handlers handleBlur, handleChange, @@ -1167,13 +1148,45 @@ export function useFormik( validateField, unregisterField, registerField, + isFormValid, getFieldProps, getFieldMeta, getFieldHelpers, // state helpers getState, useState, - }; + }), [ + validateOnBlur, + validateOnChange, + validateOnMount, + props.validationSchema, + props.validate, + handleBlur, + handleChange, + handleReset, + handleSubmit, + resetForm, + setErrors, + setFormikState, + setFieldTouched, + setFieldValue, + setFieldError, + setStatus, + setSubmitting, + setTouched, + setValues, + submitForm, + validateFormWithHighPriority, + validateField, + unregisterField, + registerField, + isFormValid, + getFieldProps, + getFieldMeta, + getFieldHelpers, + getState, + useState, + ]); return ctx; } @@ -1185,9 +1198,10 @@ export function Formik< const formikApi = useFormik(props); const { component, children, render, innerRef } = props; + // Get initial Full State, but if we don't need it, we won't subscribe to updates const formikState = useFullFormikState( formikApi, - !!component || !!render || isFunction(children) + !!component || !!render || isFunction(children) || !!innerRef ); const formikbag: FormikProps = { @@ -1196,7 +1210,7 @@ export function Formik< }; // This allows folks to pass a ref to - React.useImperativeHandle(innerRef, () => formikApi); + React.useImperativeHandle(innerRef, () => formikbag); if (__DEV__) { // eslint-disable-next-line react-hooks/rules-of-hooks diff --git a/packages/formik/src/FormikContext.tsx b/packages/formik/src/FormikContext.tsx index d9919dbd6..3fe332cce 100644 --- a/packages/formik/src/FormikContext.tsx +++ b/packages/formik/src/FormikContext.tsx @@ -1,6 +1,8 @@ import * as React from 'react'; import { FormikContextType } from './types'; import invariant from 'tiny-warning'; +import { useFormikApi } from './hooks/useFormikApi'; +import { useFullFormikState } from './hooks/useFullFormikState'; export const FormikContext = React.createContext>( undefined as any @@ -10,13 +12,21 @@ FormikContext.displayName = 'FormikContext'; export const FormikProvider = FormikContext.Provider; export const FormikConsumer = FormikContext.Consumer; +/** + * @deprecated Please use useFormikApi() and access state from api.useState(). + */ export function useFormikContext() { - const formik = React.useContext>(FormikContext); + const formik = useFormikApi(); invariant( !!formik, `Formik context is undefined, please verify you are calling useFormikContext() as child of a component.` ); - return formik; + const state = useFullFormikState(formik); + + return { + ...formik, + ...state, + }; } diff --git a/packages/formik/src/connect.tsx b/packages/formik/src/connect.tsx index 5f187f48e..1a0cfd1b0 100644 --- a/packages/formik/src/connect.tsx +++ b/packages/formik/src/connect.tsx @@ -1,28 +1,36 @@ -import * as React from 'react'; import hoistNonReactStatics from 'hoist-non-react-statics'; - -import { FormikContextType } from './types'; -import { FormikConsumer } from './FormikContext'; +import * as React from 'react'; import invariant from 'tiny-warning'; +import { FormikComputedState, FormikContextType, FormikState } from './types'; +import { useFormikApi } from './hooks/useFormikApi'; +import { useFullFormikState } from './hooks/useFullFormikState'; + +export type FormikConnectedType = FormikContextType & FormikState & FormikComputedState; /** * Connect any component to Formik context, and inject as a prop called `formik`; * @param Comp React Component */ export function connect( - Comp: React.ComponentType }> + Comp: React.ComponentType }> ) { - const C: React.FC = (props: OuterProps) => ( - - {formik => { - invariant( - !!formik, - `Formik context is undefined, please verify you are rendering , , , , or your custom context-using component as a child of a component. Component name: ${Comp.name}` - ); - return ; - }} - - ); + const C: React.FC = (props: OuterProps) => { + const formik = useFormikApi(); + const state = useFullFormikState(formik); + + invariant( + !!formik, + `Formik context is undefined, please verify you are rendering , , , , or your custom context-using component as a child of a component. Component name: ${Comp.name}` + ); + + const legacyBag = { + ...formik, + ...state, + } + + return ; + }; + const componentDisplayName = Comp.displayName || Comp.name || @@ -31,7 +39,7 @@ export function connect( // Assign Comp to C.WrappedComponent so we can access the inner component in tests // For example, gets us - (C as React.FC & { + (C as React.SFC & { WrappedComponent: React.ReactNode; }).WrappedComponent = Comp; @@ -40,7 +48,7 @@ export function connect( return hoistNonReactStatics( C, Comp as React.ComponentClass< - OuterProps & { formik: FormikContextType } + OuterProps & { formik: FormikConnectedType } > // cast type to ComponentClass (even if SFC) ) as React.ComponentType; } diff --git a/packages/formik/src/helpers/field-helpers.ts b/packages/formik/src/helpers/field-helpers.ts index 9707759e2..474fb29a9 100644 --- a/packages/formik/src/helpers/field-helpers.ts +++ b/packages/formik/src/helpers/field-helpers.ts @@ -1,5 +1,5 @@ -import { FieldMetaProps, FormikState } from '../types'; -import { getIn } from '../utils'; +import { FieldMetaProps, FormikState } from "../types"; +import { getIn } from "../utils"; export const selectFieldMetaByName = (name: string) => < Values, diff --git a/packages/formik/src/hooks/hooks.ts b/packages/formik/src/hooks/hooks.ts new file mode 100644 index 000000000..67b59f039 --- /dev/null +++ b/packages/formik/src/hooks/hooks.ts @@ -0,0 +1,16 @@ +import React from "react"; +import { fieldMetaIsEqual, selectFieldMetaByName } from "../helpers/field-helpers"; +import { FieldMetaProps } from "../types"; +import { useFormikState } from "./useFormikState"; + +/** + * Returns @see FieldMetaProps + */ +export const useFieldMeta = (name: string): FieldMetaProps => { + const [fieldMeta] = useFormikState( + React.useMemo(() => selectFieldMetaByName(name), [name]), + fieldMetaIsEqual + ); + + return fieldMeta; +}; diff --git a/packages/formik/src/hooks/useFormikApi.ts b/packages/formik/src/hooks/useFormikApi.ts index 48a5a1c7c..f0a232758 100644 --- a/packages/formik/src/hooks/useFormikApi.ts +++ b/packages/formik/src/hooks/useFormikApi.ts @@ -8,7 +8,7 @@ export function useFormikApi(): FormikApi { invariant( !!formikApi, - `Formik context is undefined, please verify you are calling useFormikContext() as child of a component.` + `Formik context is undefined, please verify you are calling useFormikApi() as child of a component.` ); return formikApi; diff --git a/packages/formik/src/hooks/useFormikComputedState.ts b/packages/formik/src/hooks/useFormikComputedState.ts index 179466849..3720cb40b 100644 --- a/packages/formik/src/hooks/useFormikComputedState.ts +++ b/packages/formik/src/hooks/useFormikComputedState.ts @@ -1,15 +1,38 @@ +import isEqual from 'react-fast-compare'; import { useMemo } from 'react'; -import { FormikApi, FormikComputedState } from './../types'; - -export const useFormikComputedState = ({ - dirty, - isValid, -}: FormikApi): FormikComputedState => { - return useMemo( - () => ({ - dirty, - isValid, - }), - [dirty, isValid] +import { FormikApi, FormikComputedState, FormikState } from './../types'; +import { useFormikApi } from './useFormikApi'; + +export const selectComputedState = ( + { isFormValid }: FormikApi, + state: Pick, 'initialValues' | 'values' | 'errors'> +) => { + // we do not want to run a deep equals on every render + const dirty = useMemo( + () => !isEqual(state.initialValues, state.values), + [state.initialValues, state.values] ); + + const isValid = isFormValid(state.errors, dirty); + + return { + dirty, + isValid + }; +} + +const selectStateToCompute = (state: FormikState) => ({ + errors: state.errors, + values: state.values, + initialValues: state.initialValues, +}); + +export const useFormikApiComputedState = (formikApi: FormikApi) => { + const stateToCompute = formikApi.useState(selectStateToCompute); + + return selectComputedState(formikApi, stateToCompute); +} + +export const useFormikComputedState = (): FormikComputedState => { + return useFormikApiComputedState(useFormikApi()); }; diff --git a/packages/formik/src/hooks/useFullFormikState.ts b/packages/formik/src/hooks/useFullFormikState.ts index 022f335fa..89ee2ec1d 100644 --- a/packages/formik/src/hooks/useFullFormikState.ts +++ b/packages/formik/src/hooks/useFullFormikState.ts @@ -1,6 +1,6 @@ import { useMemo } from 'react'; import { FormikApi, FormikComputedState, FormikState } from '../types'; -import { useFormikComputedState } from './useFormikComputedState'; +import { selectComputedState } from './useFormikComputedState'; export const selectFullState = (value: T) => value; @@ -9,7 +9,7 @@ export const useFullFormikState = ( shouldSubscribe = true ): FormikState & FormikComputedState => { const state = api.useState(selectFullState, Object.is, shouldSubscribe); - const computedState = useFormikComputedState(api); + const computedState = selectComputedState(api, state); return useMemo( () => ({ diff --git a/packages/formik/src/index.tsx b/packages/formik/src/index.tsx index 7732b9c9d..3db3a1be3 100644 --- a/packages/formik/src/index.tsx +++ b/packages/formik/src/index.tsx @@ -1,3 +1,5 @@ +export * from './hooks/useFormikApi'; +export * from './hooks/useFormikState'; export * from './Formik'; export * from './Field'; export * from './Form'; diff --git a/packages/formik/src/types.tsx b/packages/formik/src/types.tsx index 48943a4ac..4f4365530 100644 --- a/packages/formik/src/types.tsx +++ b/packages/formik/src/types.tsx @@ -182,6 +182,11 @@ export type SetFormikStateFn = ( export type SubmitFormFn = () => Promise; +export type IsFormValidFn = ( + errors: FormikErrors, + dirty: boolean +) => boolean; + export interface FormikHelpers { /** Manually set top level status. */ setStatus: SetStatusFn; @@ -308,9 +313,9 @@ export type FormikApi = FormikHelpers & FormikStateHelpers & FieldHelpers & FormikHandlers & - FormikValidationConfig & - FormikInitialState & - FormikComputedState & { + FormikValidationConfig & { + /** Check form validity based on config */ + isFormValid: IsFormValidFn; unregisterField: UnregisterFieldFn; registerField: RegisterFieldFn; }; @@ -387,7 +392,7 @@ export interface FormikConfig extends FormikSharedConfig { ) => void | Promise; /** Inner ref */ - innerRef?: React.Ref>; + innerRef?: React.Ref>; } /** diff --git a/packages/formik/src/withFormik.tsx b/packages/formik/src/withFormik.tsx index a9cb753b3..c35333a49 100644 --- a/packages/formik/src/withFormik.tsx +++ b/packages/formik/src/withFormik.tsx @@ -31,7 +31,7 @@ export interface WithFormikConfig< Props, Values extends FormikValues = FormikValues, DeprecatedPayload = Values -> extends FormikSharedConfig { +> extends Omit, 'validate'> { /** * Set the display name of the component. Useful for React DevTools. */ diff --git a/packages/formik/test/Field.test.tsx b/packages/formik/test/Field.test.tsx index 39687800b..769e3653c 100644 --- a/packages/formik/test/Field.test.tsx +++ b/packages/formik/test/Field.test.tsx @@ -15,14 +15,13 @@ import { FieldConfig, FormikProps, FormikConfig, + FastFieldConfig, } from '../src'; import { noop } from './testHelpers'; const initialValues = { name: 'jared', email: 'hello@reason.nyc' }; type Values = typeof initialValues; -type FastFieldConfig = FieldConfig; - type $FixMe = any; function renderForm( diff --git a/packages/formik/test/tsconfig.json b/packages/formik/test/tsconfig.json index 574b65560..b7cc378ac 100644 --- a/packages/formik/test/tsconfig.json +++ b/packages/formik/test/tsconfig.json @@ -1,5 +1,7 @@ { - // Hack to fix https://github.com/formium/tsdx/issues/84#issuecomment-489690504 - "extends": "../tsconfig.build.json", - "include": ["."] -} + "extends": "../../../tsconfig.base.json", + "include": ["../src", "../types"], + "compilerOptions": { + "rootDir": ".." + } +} \ No newline at end of file diff --git a/packages/formik/test/withFormik.test.tsx b/packages/formik/test/withFormik.test.tsx index e4e139698..b6519c5d3 100644 --- a/packages/formik/test/withFormik.test.tsx +++ b/packages/formik/test/withFormik.test.tsx @@ -103,6 +103,7 @@ describe('withFormik()', () => { setSubmitting: expect.any(Function), setTouched: expect.any(Function), setValues: expect.any(Function), + isFormValid: expect.any(Function), submitCount: 0, submitForm: expect.any(Function), touched: {}, @@ -112,6 +113,8 @@ describe('withFormik()', () => { validateOnBlur: true, validateOnMount: false, validateOnChange: true, + getState: expect.any(Function), + useState: expect.any(Function), }); }); diff --git a/yarn.lock b/yarn.lock index deca0c477..fb04bd85e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7770,19 +7770,6 @@ form-data@~2.3.1, form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" -formik@2.2.6: - version "2.2.6" - resolved "https://registry.yarnpkg.com/formik/-/formik-2.2.6.tgz#378a4bafe4b95caf6acf6db01f81f3fe5147559d" - integrity sha512-Kxk2zQRafy56zhLmrzcbryUpMBvT0tal5IvcifK5+4YNGelKsnrODFJ0sZQRMQboblWNym4lAW3bt+tf2vApSA== - dependencies: - deepmerge "^2.1.1" - hoist-non-react-statics "^3.3.0" - lodash "^4.17.14" - lodash-es "^4.17.14" - react-fast-compare "^2.0.1" - tiny-warning "^1.0.2" - tslib "^1.10.0" - fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" From b8e7fcde29848eab69829ceccbf3895bab69594a Mon Sep 17 00:00:00 2001 From: John Rom Date: Thu, 11 Mar 2021 17:38:11 -0500 Subject: [PATCH 06/28] Roll back unnecessary tsconfig change. --- packages/formik/test/tsconfig.json | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/formik/test/tsconfig.json b/packages/formik/test/tsconfig.json index b7cc378ac..c4b71941d 100644 --- a/packages/formik/test/tsconfig.json +++ b/packages/formik/test/tsconfig.json @@ -1,7 +1,5 @@ { - "extends": "../../../tsconfig.base.json", - "include": ["../src", "../types"], - "compilerOptions": { - "rootDir": ".." - } + // Hack to fix https://github.com/formium/tsdx/issues/84#issuecomment-489690504 + "extends": "../tsconfig.build.json", + "include": ["."] } \ No newline at end of file From feaee0e84935f1b02c6edffc71c368be3008d38e Mon Sep 17 00:00:00 2001 From: John Rom Date: Thu, 11 Mar 2021 18:00:08 -0500 Subject: [PATCH 07/28] Fix Sign In App Page. --- app/pages/sign-in.js | 39 ++++++++++++++++++++++------------- app/tsconfig.json | 2 +- packages/formik/src/index.tsx | 4 ++++ 3 files changed, 30 insertions(+), 15 deletions(-) diff --git a/app/pages/sign-in.js b/app/pages/sign-in.js index 65a679610..8038bddff 100644 --- a/app/pages/sign-in.js +++ b/app/pages/sign-in.js @@ -1,8 +1,14 @@ import React, { useEffect, useState } from 'react'; -import { ErrorMessage, Field, Form, FormikProvider, useFormik } from 'formik'; +import { ErrorMessage, Field, Form, FormikProvider, FormikState, useFormik, useFormikApiComputedState } from 'formik'; import * as Yup from 'yup'; import { useRouter } from 'next/router'; +const selectSignInState = (formikState) => ({ + values: formikState.values, + errors: formikState.errors, + touched: formikState.touched, +}); + const SignIn = () => { const router = useRouter(); const [errorLog, setErrorLog] = useState([]); @@ -22,35 +28,40 @@ const SignIn = () => { }, }); + const signInState = { + ...formik.useState(selectSignInState), + ...useFormikApiComputedState(formik), + }; + useEffect(() => { - if (formik.errors.username && formik.touched.username) { + if (signInState.errors.username && signInState.touched.username) { setErrorLog(logs => [ ...logs, { name: 'username', - value: formik.values.username, - error: formik.errors.username, + value: signInState.values.username, + error: signInState.errors.username, }, ]); } - if (formik.errors.password && formik.touched.password) { + if (signInState.errors.password && signInState.touched.password) { setErrorLog(logs => [ ...logs, { name: 'password', - value: formik.values.password, - error: formik.errors.password, + value: signInState.values.password, + error: signInState.errors.password, }, ]); } }, [ - formik.values.username, - formik.errors.username, - formik.touched.username, - formik.values.password, - formik.errors.password, - formik.touched.password, + signInState.values.username, + signInState.errors.username, + signInState.touched.username, + signInState.values.password, + signInState.errors.password, + signInState.touched.password, ]); return ( @@ -69,7 +80,7 @@ const SignIn = () => { - diff --git a/app/tsconfig.json b/app/tsconfig.json index 42255bd9c..ea5a70151 100644 --- a/app/tsconfig.json +++ b/app/tsconfig.json @@ -26,7 +26,7 @@ "next-env.d.ts", "**/*.ts", "**/*.tsx" - ], +, "pages/sign-in.js" ], "exclude": [ "node_modules" ] diff --git a/packages/formik/src/index.tsx b/packages/formik/src/index.tsx index 3db3a1be3..35f5058ec 100644 --- a/packages/formik/src/index.tsx +++ b/packages/formik/src/index.tsx @@ -1,5 +1,9 @@ export * from './hooks/useFormikApi'; export * from './hooks/useFormikState'; +export * from './hooks/useFormikComputedState'; +export * from './hooks/useFullFormikState'; +export * from './hooks/useOptimizedSelector'; +export * from './hooks/hooks'; export * from './Formik'; export * from './Field'; export * from './Form'; From a5a2f473e3eaa2c8255efc96b21365ff569059b8 Mon Sep 17 00:00:00 2001 From: John Rom Date: Thu, 11 Mar 2021 18:05:06 -0500 Subject: [PATCH 08/28] Roll back unnecessary tsconfig change. --- app/tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/tsconfig.json b/app/tsconfig.json index ea5a70151..42255bd9c 100644 --- a/app/tsconfig.json +++ b/app/tsconfig.json @@ -26,7 +26,7 @@ "next-env.d.ts", "**/*.ts", "**/*.tsx" -, "pages/sign-in.js" ], + ], "exclude": [ "node_modules" ] From 403747392a85dedc20ee5a2bbf3e46b45265b145 Mon Sep 17 00:00:00 2001 From: John Rom Date: Thu, 11 Mar 2021 18:13:58 -0500 Subject: [PATCH 09/28] Wire up FormikConsumer. --- packages/formik/src/FormikContext.tsx | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/packages/formik/src/FormikContext.tsx b/packages/formik/src/FormikContext.tsx index 3fe332cce..c192d3c27 100644 --- a/packages/formik/src/FormikContext.tsx +++ b/packages/formik/src/FormikContext.tsx @@ -3,6 +3,7 @@ import { FormikContextType } from './types'; import invariant from 'tiny-warning'; import { useFormikApi } from './hooks/useFormikApi'; import { useFullFormikState } from './hooks/useFullFormikState'; +import { FormikConnectedType } from './connect'; export const FormikContext = React.createContext>( undefined as any @@ -10,12 +11,11 @@ export const FormikContext = React.createContext>( FormikContext.displayName = 'FormikContext'; export const FormikProvider = FormikContext.Provider; -export const FormikConsumer = FormikContext.Consumer; /** * @deprecated Please use useFormikApi() and access state from api.useState(). */ -export function useFormikContext() { + export function useFormikContext() { const formik = useFormikApi(); invariant( @@ -30,3 +30,21 @@ export function useFormikContext() { ...state, }; } + +/** + * @deprecated Please use useFormikApi() and access state from api.useState(). + */ +export function FormikConsumer({ + children, +}: { + children: (formik: FormikConnectedType) => React.ReactNode; +}) { + const formik = useFormikContext(); + + invariant( + !!formik, + `Formik context is undefined, please verify you are calling useFormikContext() as child of a component.` + ); + + return <>{children(formik)}; +}; \ No newline at end of file From e2c496cff927599015b3de65605c1baacb6dac01 Mon Sep 17 00:00:00 2001 From: John Rom Date: Thu, 11 Mar 2021 18:15:22 -0500 Subject: [PATCH 10/28] Remove implementation details from deprecated comments. --- packages/formik/src/FormikContext.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/formik/src/FormikContext.tsx b/packages/formik/src/FormikContext.tsx index c192d3c27..f63f8569c 100644 --- a/packages/formik/src/FormikContext.tsx +++ b/packages/formik/src/FormikContext.tsx @@ -13,7 +13,7 @@ FormikContext.displayName = 'FormikContext'; export const FormikProvider = FormikContext.Provider; /** - * @deprecated Please use useFormikApi() and access state from api.useState(). + * @deprecated Please access state directly via the Formik API. */ export function useFormikContext() { const formik = useFormikApi(); @@ -32,7 +32,7 @@ export const FormikProvider = FormikContext.Provider; } /** - * @deprecated Please use useFormikApi() and access state from api.useState(). + * @deprecated Please access state directly via the Formik API. */ export function FormikConsumer({ children, From a78459b7a0063f902e278931cd3b961dab6f9382 Mon Sep 17 00:00:00 2001 From: John Rom Date: Thu, 11 Mar 2021 18:31:13 -0500 Subject: [PATCH 11/28] Don't expose internal useOptimizedSelector. --- packages/formik/src/index.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/formik/src/index.tsx b/packages/formik/src/index.tsx index 35f5058ec..583733f17 100644 --- a/packages/formik/src/index.tsx +++ b/packages/formik/src/index.tsx @@ -2,7 +2,6 @@ export * from './hooks/useFormikApi'; export * from './hooks/useFormikState'; export * from './hooks/useFormikComputedState'; export * from './hooks/useFullFormikState'; -export * from './hooks/useOptimizedSelector'; export * from './hooks/hooks'; export * from './Formik'; export * from './Field'; From 0d1cbfdde613a2ad4e64af5d3c10488be9d37ed6 Mon Sep 17 00:00:00 2001 From: John Rom Date: Wed, 17 Mar 2021 17:58:05 -0400 Subject: [PATCH 12/28] Move useFormikComputedState to api.useComputedState, useIsDirty and useIsValid --- app/pages/sign-in.js | 4 +- packages/formik-native/src/index.ts | 4 +- packages/formik/src/Field.tsx | 8 +- packages/formik/src/Form.tsx | 4 +- packages/formik/src/Formik.tsx | 174 ++++++++++-------- packages/formik/src/FormikContext.tsx | 35 ++-- packages/formik/src/connect.tsx | 4 +- packages/formik/src/helpers/field-helpers.ts | 18 +- packages/formik/src/helpers/form-helpers.ts | 43 +++++ packages/formik/src/hooks/hooks.ts | 20 +- packages/formik/src/hooks/useFormikApi.ts | 15 -- .../src/hooks/useFormikComputedState.ts | 38 ---- packages/formik/src/hooks/useFormikState.ts | 9 +- .../formik/src/hooks/useFullFormikState.ts | 22 ++- packages/formik/src/index.tsx | 3 - packages/formik/src/types.tsx | 9 +- packages/formik/test/Field.test.tsx | 7 +- packages/formik/test/withFormik.test.tsx | 2 +- 18 files changed, 224 insertions(+), 195 deletions(-) create mode 100644 packages/formik/src/helpers/form-helpers.ts delete mode 100644 packages/formik/src/hooks/useFormikApi.ts delete mode 100644 packages/formik/src/hooks/useFormikComputedState.ts diff --git a/app/pages/sign-in.js b/app/pages/sign-in.js index 8038bddff..79e533c86 100644 --- a/app/pages/sign-in.js +++ b/app/pages/sign-in.js @@ -1,5 +1,5 @@ import React, { useEffect, useState } from 'react'; -import { ErrorMessage, Field, Form, FormikProvider, FormikState, useFormik, useFormikApiComputedState } from 'formik'; +import { ErrorMessage, Field, Form, FormikProvider, useFormik } from 'formik'; import * as Yup from 'yup'; import { useRouter } from 'next/router'; @@ -30,7 +30,7 @@ const SignIn = () => { const signInState = { ...formik.useState(selectSignInState), - ...useFormikApiComputedState(formik), + ...formik.useComputedState(), }; useEffect(() => { diff --git a/packages/formik-native/src/index.ts b/packages/formik-native/src/index.ts index a6ac5d6fb..859266506 100644 --- a/packages/formik-native/src/index.ts +++ b/packages/formik-native/src/index.ts @@ -1,9 +1,9 @@ import * as React from 'react'; import { NativeSyntheticEvent, NativeTouchEvent } from 'react-native'; -import { useFormikApi } from 'formik'; +import { useFormikContext } from 'formik'; export function useSubmitButton() { - const { submitForm } = useFormikApi(); + const { submitForm } = useFormikContext(); const handlePress = React.useCallback( (_ev: NativeSyntheticEvent) => { submitForm(); diff --git a/packages/formik/src/Field.tsx b/packages/formik/src/Field.tsx index 738b5af64..988896007 100644 --- a/packages/formik/src/Field.tsx +++ b/packages/formik/src/Field.tsx @@ -9,9 +9,9 @@ import { } from './types'; import { isFunction, isEmptyChildren, isObject } from './utils'; import invariant from 'tiny-warning'; -import { useFormikApi } from './hooks/useFormikApi'; import { useFullFormikState } from './hooks/useFullFormikState'; import { useFieldMeta } from './hooks/hooks'; +import { useFormikContext } from './FormikContext'; export interface FieldProps { field: FieldInputProps; @@ -78,7 +78,7 @@ export type FieldHookConfig = GenericFieldHTMLAttributes & FieldConfig; export function useField( propsOrFieldName: string | FieldHookConfig ): [FieldInputProps, FieldMetaProps, FieldHelperProps] { - const formik = useFormikApi(); + const formik = useFormikContext(); const { getFieldProps, getFieldHelpers, @@ -172,10 +172,10 @@ export function Field<_FieldValue = any, FormValues = any>({ * * Otherwise, we will pointlessly get the initial values but never subscribe to updates. */ - const formikApi = useFormikApi(); + const formikApi = useFormikContext(); const formikState = useFullFormikState( formikApi, - !!render || isFunction(children) || (component && typeof component !== 'string') + !!render || isFunction(children) || (!!component && typeof component !== 'string') ); const legacyBag = { field, form: { ...formikState, ...formikApi } }; diff --git a/packages/formik/src/Form.tsx b/packages/formik/src/Form.tsx index dd09696ef..fea573283 100644 --- a/packages/formik/src/Form.tsx +++ b/packages/formik/src/Form.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { useFormikApi } from './hooks/useFormikApi'; +import { useFormikContext } from './FormikContext'; export type FormikFormProps = Pick< React.FormHTMLAttributes, @@ -18,7 +18,7 @@ export const Form = React.forwardRef( // We default the action to "#" in case the preventDefault fails (just updates the URL hash) const { action, ...rest } = props; const _action = action ?? '#'; - const { handleReset, handleSubmit } = useFormikApi(); + const { handleReset, handleSubmit } = useFormikContext(); return ( = | { type: 'SUBMIT_ATTEMPT' } @@ -1066,15 +1070,17 @@ export function useFormik( [getFieldMeta, handleBlur, handleChange] ); - const isFormValid = useEventCallback>((errors, dirty) => { - return typeof props.isInitialValid !== 'undefined' - ? dirty - ? errors && Object.keys(errors).length === 0 - : props.isInitialValid !== false && isFunction(props.isInitialValid) - ? props.isInitialValid(props) - : props.isInitialValid - : errors && Object.keys(errors).length === 0; - }); + const isFormValid = useEventCallback>( + (errors, dirty) => { + return typeof props.isInitialValid !== 'undefined' + ? dirty + ? errors && Object.keys(errors).length === 0 + : props.isInitialValid !== false && isFunction(props.isInitialValid) + ? props.isInitialValid(props) + : props.isInitialValid + : errors && Object.keys(errors).length === 0; + } + ); const subscriptionsRef = React.useRef([]); @@ -1112,81 +1118,91 @@ export function useFormik( [getState] ); + /** + * Get Computed State within Render Context (like useState) + */ + const useComputedState = React.useCallback( + (shouldSubscribe = true) => selectComputedState(isFormValid, useState(selectStateToCompute, Object.is, shouldSubscribe)), + [isFormValid, useState] + ); + useIsomorphicLayoutEffect(() => { unstable_batchedUpdates(() => { subscriptionsRef.current.forEach(callback => callback()); }); }, [state]); - // mostly optimized renders. - // dirty and isValid should move to useComputedState() - const ctx = React.useMemo>(() => ({ - // config - validateOnBlur, - validateOnChange, - validateOnMount, - validationSchema: props.validationSchema, - validate: props.validate, - // handlers - handleBlur, - handleChange, - handleReset, - handleSubmit, - // helpers - resetForm, - setErrors, - setFormikState, - setFieldTouched, - setFieldValue, - setFieldError, - setStatus, - setSubmitting, - setTouched, - setValues, - submitForm, - validateForm: validateFormWithHighPriority, - validateField, - unregisterField, - registerField, - isFormValid, - getFieldProps, - getFieldMeta, - getFieldHelpers, - // state helpers - getState, - useState, - }), [ - validateOnBlur, - validateOnChange, - validateOnMount, - props.validationSchema, - props.validate, - handleBlur, - handleChange, - handleReset, - handleSubmit, - resetForm, - setErrors, - setFormikState, - setFieldTouched, - setFieldValue, - setFieldError, - setStatus, - setSubmitting, - setTouched, - setValues, - submitForm, - validateFormWithHighPriority, - validateField, - unregisterField, - registerField, - isFormValid, - getFieldProps, - getFieldMeta, - getFieldHelpers, - getState, - useState, - ]); + // mostly optimized renders + const ctx = React.useMemo>( + () => ({ + // config + validateOnBlur, + validateOnChange, + validateOnMount, + validationSchema: props.validationSchema, + validate: props.validate, + // handlers + handleBlur, + handleChange, + handleReset, + handleSubmit, + // helpers + resetForm, + setErrors, + setFormikState, + setFieldTouched, + setFieldValue, + setFieldError, + setStatus, + setSubmitting, + setTouched, + setValues, + submitForm, + validateForm: validateFormWithHighPriority, + validateField, + unregisterField, + registerField, + getFieldProps, + getFieldMeta, + getFieldHelpers, + // state helpers + getState, + useState, + useComputedState, + }), + [ + validateOnBlur, + validateOnChange, + validateOnMount, + props.validationSchema, + props.validate, + handleBlur, + handleChange, + handleReset, + handleSubmit, + resetForm, + setErrors, + setFormikState, + setFieldTouched, + setFieldValue, + setFieldError, + setStatus, + setSubmitting, + setTouched, + setValues, + submitForm, + validateFormWithHighPriority, + validateField, + unregisterField, + registerField, + getFieldProps, + getFieldMeta, + getFieldHelpers, + getState, + useState, + useComputedState, + ] + ); return ctx; } diff --git a/packages/formik/src/FormikContext.tsx b/packages/formik/src/FormikContext.tsx index f63f8569c..0470bb408 100644 --- a/packages/formik/src/FormikContext.tsx +++ b/packages/formik/src/FormikContext.tsx @@ -1,9 +1,8 @@ import * as React from 'react'; -import { FormikContextType } from './types'; +import { FormikApi, FormikContextType, FormikValues } from './types'; import invariant from 'tiny-warning'; -import { useFormikApi } from './hooks/useFormikApi'; -import { useFullFormikState } from './hooks/useFullFormikState'; import { FormikConnectedType } from './connect'; +import { useFullFormikState } from './hooks/useFullFormikState'; export const FormikContext = React.createContext>( undefined as any @@ -12,23 +11,17 @@ FormikContext.displayName = 'FormikContext'; export const FormikProvider = FormikContext.Provider; -/** - * @deprecated Please access state directly via the Formik API. - */ - export function useFormikContext() { - const formik = useFormikApi(); +export function useFormikContext(): FormikApi< + Values +> { + const formikApi = React.useContext(FormikContext); invariant( - !!formik, + !!formikApi, `Formik context is undefined, please verify you are calling useFormikContext() as child of a component.` ); - const state = useFullFormikState(formik); - - return { - ...formik, - ...state, - }; + return formikApi; } /** @@ -40,11 +33,19 @@ export function FormikConsumer({ children: (formik: FormikConnectedType) => React.ReactNode; }) { const formik = useFormikContext(); + const state = useFullFormikState(formik); invariant( !!formik, `Formik context is undefined, please verify you are calling useFormikContext() as child of a component.` ); - return <>{children(formik)}; -}; \ No newline at end of file + return ( + <> + {children({ + ...formik, + ...state, + })} + + ); +} diff --git a/packages/formik/src/connect.tsx b/packages/formik/src/connect.tsx index 1a0cfd1b0..cc076b4a0 100644 --- a/packages/formik/src/connect.tsx +++ b/packages/formik/src/connect.tsx @@ -2,8 +2,8 @@ import hoistNonReactStatics from 'hoist-non-react-statics'; import * as React from 'react'; import invariant from 'tiny-warning'; import { FormikComputedState, FormikContextType, FormikState } from './types'; -import { useFormikApi } from './hooks/useFormikApi'; import { useFullFormikState } from './hooks/useFullFormikState'; +import { useFormikContext } from './FormikContext'; export type FormikConnectedType = FormikContextType & FormikState & FormikComputedState; @@ -15,7 +15,7 @@ export function connect( Comp: React.ComponentType }> ) { const C: React.FC = (props: OuterProps) => { - const formik = useFormikApi(); + const formik = useFormikContext(); const state = useFullFormikState(formik); invariant( diff --git a/packages/formik/src/helpers/field-helpers.ts b/packages/formik/src/helpers/field-helpers.ts index 474fb29a9..959554c13 100644 --- a/packages/formik/src/helpers/field-helpers.ts +++ b/packages/formik/src/helpers/field-helpers.ts @@ -1,12 +1,16 @@ import { FieldMetaProps, FormikState } from "../types"; import { getIn } from "../utils"; -export const selectFieldMetaByName = (name: string) => < - Values, - State extends FormikState ->( +/** + * @internal + * + * Get FieldMetaProps from state. + */ +export const selectFieldMetaByName = < +Values +>(name: string) => ( state: Pick< - State, + FormikState, | 'values' | 'errors' | 'touched' @@ -24,7 +28,9 @@ export const selectFieldMetaByName = (name: string) => < }); /** - * Example of an optimized comparer. + * @internal + * + * Optimize the comparer for fieldMeta. */ export const fieldMetaIsEqual = ( prev: FieldMetaProps, diff --git a/packages/formik/src/helpers/form-helpers.ts b/packages/formik/src/helpers/form-helpers.ts new file mode 100644 index 000000000..7a6a63ea3 --- /dev/null +++ b/packages/formik/src/helpers/form-helpers.ts @@ -0,0 +1,43 @@ +import { FormikErrors } from './../types'; +import isEqual from 'react-fast-compare'; +import { FormikState } from "../types"; + +/** + * Select State needed to calculate FormikComputedState + * + * @internal + */ +export const selectStateToCompute = (state: FormikState) => ({ + errors: state.errors, + values: state.values, + initialValues: state.initialValues, +}); + +/** + * Validity function where Formik combines its props with these bits of state + * + * @internal + */ +export type IsFormValidFn = ( + errors: FormikErrors, + dirty: boolean +) => boolean; + +/** + * Calculate ComputedState from FormikState + * + * @internal + */ +export const selectComputedState = ( + isFormValid: IsFormValidFn, + state: Pick, 'initialValues' | 'values' | 'errors'> +) => { + // we do not want to run a deep equals on every render + const dirty = !isEqual(state.initialValues, state.values); + const isValid = isFormValid(state.errors, dirty); + + return { + dirty, + isValid, + }; +}; diff --git a/packages/formik/src/hooks/hooks.ts b/packages/formik/src/hooks/hooks.ts index 67b59f039..87a6be1a8 100644 --- a/packages/formik/src/hooks/hooks.ts +++ b/packages/formik/src/hooks/hooks.ts @@ -1,16 +1,24 @@ -import React from "react"; -import { fieldMetaIsEqual, selectFieldMetaByName } from "../helpers/field-helpers"; -import { FieldMetaProps } from "../types"; -import { useFormikState } from "./useFormikState"; +import { useFormikContext } from '../FormikContext'; +import { useMemo } from 'react'; +import { + fieldMetaIsEqual, + selectFieldMetaByName, +} from '../helpers/field-helpers'; +import { FieldMetaProps } from '../types'; +import { useFormikState } from './useFormikState'; /** * Returns @see FieldMetaProps */ -export const useFieldMeta = (name: string): FieldMetaProps => { +export const useFieldMeta = (name: string): FieldMetaProps => { const [fieldMeta] = useFormikState( - React.useMemo(() => selectFieldMetaByName(name), [name]), + useMemo(() => selectFieldMetaByName(name), [name]), fieldMetaIsEqual ); return fieldMeta; }; + +export const useIsDirty = () => useFormikContext().useComputedState().dirty; + +export const useIsValid = () => useFormikContext().useComputedState().isValid; diff --git a/packages/formik/src/hooks/useFormikApi.ts b/packages/formik/src/hooks/useFormikApi.ts deleted file mode 100644 index f0a232758..000000000 --- a/packages/formik/src/hooks/useFormikApi.ts +++ /dev/null @@ -1,15 +0,0 @@ -import invariant from 'tiny-warning'; -import React from 'react'; -import { FormikValues, FormikApi } from '../types'; -import { FormikContext } from '../FormikContext'; - -export function useFormikApi(): FormikApi { - const formikApi = React.useContext(FormikContext); - - invariant( - !!formikApi, - `Formik context is undefined, please verify you are calling useFormikApi() as child of a component.` - ); - - return formikApi; -} diff --git a/packages/formik/src/hooks/useFormikComputedState.ts b/packages/formik/src/hooks/useFormikComputedState.ts deleted file mode 100644 index 3720cb40b..000000000 --- a/packages/formik/src/hooks/useFormikComputedState.ts +++ /dev/null @@ -1,38 +0,0 @@ -import isEqual from 'react-fast-compare'; -import { useMemo } from 'react'; -import { FormikApi, FormikComputedState, FormikState } from './../types'; -import { useFormikApi } from './useFormikApi'; - -export const selectComputedState = ( - { isFormValid }: FormikApi, - state: Pick, 'initialValues' | 'values' | 'errors'> -) => { - // we do not want to run a deep equals on every render - const dirty = useMemo( - () => !isEqual(state.initialValues, state.values), - [state.initialValues, state.values] - ); - - const isValid = isFormValid(state.errors, dirty); - - return { - dirty, - isValid - }; -} - -const selectStateToCompute = (state: FormikState) => ({ - errors: state.errors, - values: state.values, - initialValues: state.initialValues, -}); - -export const useFormikApiComputedState = (formikApi: FormikApi) => { - const stateToCompute = formikApi.useState(selectStateToCompute); - - return selectComputedState(formikApi, stateToCompute); -} - -export const useFormikComputedState = (): FormikComputedState => { - return useFormikApiComputedState(useFormikApi()); -}; diff --git a/packages/formik/src/hooks/useFormikState.ts b/packages/formik/src/hooks/useFormikState.ts index 4ebf2db47..771415ed8 100644 --- a/packages/formik/src/hooks/useFormikState.ts +++ b/packages/formik/src/hooks/useFormikState.ts @@ -1,12 +1,15 @@ -import { Selector, Comparer } from './useOptimizedSelector'; -import { useFormikApi } from './useFormikApi'; +import { Selector, Comparer } from 'use-optimized-selector'; +import { useFormikContext } from '../FormikContext'; import { FormikApi, FormikState } from '../types'; +/** + * @see {@link FormikApi['useState']} for info on using Formik's State. + */ export const useFormikState = ( selector: Selector, Return>, comparer?: Comparer, shouldSubscribe = true ): [Return, FormikApi] => { - const api = useFormikApi(); + const api = useFormikContext(); return [api.useState(selector, comparer, shouldSubscribe), api]; }; diff --git a/packages/formik/src/hooks/useFullFormikState.ts b/packages/formik/src/hooks/useFullFormikState.ts index 89ee2ec1d..b3f3f1b12 100644 --- a/packages/formik/src/hooks/useFullFormikState.ts +++ b/packages/formik/src/hooks/useFullFormikState.ts @@ -1,20 +1,30 @@ import { useMemo } from 'react'; import { FormikApi, FormikComputedState, FormikState } from '../types'; -import { selectComputedState } from './useFormikComputedState'; - -export const selectFullState = (value: T) => value; +/** + * @internal + * + * This is a specialized hook that will return Formik's full, unoptimized state. + * It is internally used for components with render functions / child functions. + * It also calculates computed state. + */ export const useFullFormikState = ( api: FormikApi, shouldSubscribe = true ): FormikState & FormikComputedState => { - const state = api.useState(selectFullState, Object.is, shouldSubscribe); - const computedState = selectComputedState(api, state); + const state = api.useState( + useMemo(() => value => value, []), + Object.is, + shouldSubscribe + ); + + // computed state + const computedState = api.useComputedState(shouldSubscribe); return useMemo( () => ({ ...state, - ...computedState, + ...computedState }), [state, computedState] ); diff --git a/packages/formik/src/index.tsx b/packages/formik/src/index.tsx index 583733f17..fd6af4fad 100644 --- a/packages/formik/src/index.tsx +++ b/packages/formik/src/index.tsx @@ -1,7 +1,4 @@ -export * from './hooks/useFormikApi'; export * from './hooks/useFormikState'; -export * from './hooks/useFormikComputedState'; -export * from './hooks/useFullFormikState'; export * from './hooks/hooks'; export * from './Formik'; export * from './Field'; diff --git a/packages/formik/src/types.tsx b/packages/formik/src/types.tsx index 4f4365530..8823b2cd3 100644 --- a/packages/formik/src/types.tsx +++ b/packages/formik/src/types.tsx @@ -182,11 +182,6 @@ export type SetFormikStateFn = ( export type SubmitFormFn = () => Promise; -export type IsFormValidFn = ( - errors: FormikErrors, - dirty: boolean -) => boolean; - export interface FormikHelpers { /** Manually set top level status. */ setStatus: SetStatusFn; @@ -225,6 +220,8 @@ export interface FormikStateHelpers { comparer?: Comparer, shouldSubscribe?: boolean ) => Return; + /** Use Computed State from within Render. */ + useComputedState: (shouldSubscribe?: boolean) => FormikComputedState; } export type GetValueFromEventFn = ( @@ -314,8 +311,6 @@ export type FormikApi = FormikHelpers & FieldHelpers & FormikHandlers & FormikValidationConfig & { - /** Check form validity based on config */ - isFormValid: IsFormValidFn; unregisterField: UnregisterFieldFn; registerField: RegisterFieldFn; }; diff --git a/packages/formik/test/Field.test.tsx b/packages/formik/test/Field.test.tsx index 769e3653c..b64429e4e 100644 --- a/packages/formik/test/Field.test.tsx +++ b/packages/formik/test/Field.test.tsx @@ -111,11 +111,12 @@ describe('Field / FastField', () => { describe('receives { field, form, meta } props and renders element', () => { it('', () => { + let i = 0; let injected: FieldProps[] = []; let asInjectedProps: FieldProps['field'] = {} as any; const Component = (props: FieldProps) => - injected.push(props) &&
{TEXT}
; + (injected[i++ % 3] = props) &&
{TEXT}
; const AsComponent = (props: FieldProps['field']) => (asInjectedProps = props) &&
{TEXT}
; @@ -157,11 +158,13 @@ describe('Field / FastField', () => { }); it('', () => { + let i = 0; let injected: FieldProps[] = []; let asInjectedProps: FieldProps['field'] = {} as any; const Component = (props: FieldProps) => - injected.push(props) &&
{TEXT}
; + (injected[i++ % 3] = props) &&
{TEXT}
; + const AsComponent = (props: FieldProps['field']) => (asInjectedProps = props) &&
{TEXT}
; diff --git a/packages/formik/test/withFormik.test.tsx b/packages/formik/test/withFormik.test.tsx index b6519c5d3..e192acd13 100644 --- a/packages/formik/test/withFormik.test.tsx +++ b/packages/formik/test/withFormik.test.tsx @@ -103,7 +103,6 @@ describe('withFormik()', () => { setSubmitting: expect.any(Function), setTouched: expect.any(Function), setValues: expect.any(Function), - isFormValid: expect.any(Function), submitCount: 0, submitForm: expect.any(Function), touched: {}, @@ -115,6 +114,7 @@ describe('withFormik()', () => { validateOnChange: true, getState: expect.any(Function), useState: expect.any(Function), + useComputedState: expect.any(Function), }); }); From 0c18ebbb872c88636d56cb4ccfd775a56450843c Mon Sep 17 00:00:00 2001 From: John Rom Date: Wed, 17 Mar 2021 18:02:52 -0400 Subject: [PATCH 13/28] Accidental import change. --- packages/formik/src/hooks/useFormikState.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/formik/src/hooks/useFormikState.ts b/packages/formik/src/hooks/useFormikState.ts index 771415ed8..387a3cb7d 100644 --- a/packages/formik/src/hooks/useFormikState.ts +++ b/packages/formik/src/hooks/useFormikState.ts @@ -1,4 +1,4 @@ -import { Selector, Comparer } from 'use-optimized-selector'; +import { Selector, Comparer } from './useOptimizedSelector'; import { useFormikContext } from '../FormikContext'; import { FormikApi, FormikState } from '../types'; From 3ab46cd4ab20ae33c7c8a258b5cc0312f7a7ae94 Mon Sep 17 00:00:00 2001 From: John Rom Date: Wed, 17 Mar 2021 19:14:31 -0400 Subject: [PATCH 14/28] Remove TSConfig path aliases during build. --- app/next.config.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/next.config.js b/app/next.config.js index 884caadf9..e82d61fbc 100644 --- a/app/next.config.js +++ b/app/next.config.js @@ -26,6 +26,12 @@ module.exports = { __DEV__: process.env.NODE_ENV === 'development', }) ); + } else { + // Remove TSConfigPath aliases. + // We should use a tool which supports tsconfig.build.json + config.resolve.plugins = config.resolve.plugins.filter( + plugin => plugin.constructor.name !== 'JsConfigPathsPlugin' + ); } return config; From 501116813bd13200673609b415349e3abc51a403 Mon Sep 17 00:00:00 2001 From: John Rom Date: Thu, 18 Mar 2021 11:21:56 -0400 Subject: [PATCH 15/28] If we're calling our own reducer, we don't need to useReducer! setState will do. If we call our own reducer then use useReducer dispatch, `state.values !== getState().values`. --- packages/formik/src/Formik.tsx | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/packages/formik/src/Formik.tsx b/packages/formik/src/Formik.tsx index 680ca3cb9..4c532fe0a 100755 --- a/packages/formik/src/Formik.tsx +++ b/packages/formik/src/Formik.tsx @@ -225,18 +225,16 @@ export function useFormik( }); const getState = React.useCallback(() => stateRef.current, [stateRef]); - const [state, internalDispatch] = React.useReducer< - React.Reducer, FormikMessage> - >(formikReducer, stateRef.current); + const [state, setState] = React.useState(stateRef.current); /** - * Each call to dispatch _immediately_ updates the ref. It also dispatches to React's internal dispatcher. + * Each call to dispatch _immediately_ updates the ref. + * It also dispatches to React's internal dispatcher. */ const dispatch = React.useCallback( (msg: FormikMessage) => { - // double reducer - stateRef.current = formikReducer(stateRef.current, msg); - internalDispatch(msg); + // manually update state via reducer and dispatch resolved value via setState + setState((stateRef.current = formikReducer(stateRef.current, msg))); }, [stateRef] ); From a5f46430d26edfe9cf90871a180857caaa1244b4 Mon Sep 17 00:00:00 2001 From: John Rom Date: Thu, 18 Mar 2021 18:09:06 -0400 Subject: [PATCH 16/28] Optimize field meta and computed state with shallow equals. --- packages/formik/src/Formik.tsx | 3 ++- packages/formik/src/helpers/field-helpers.ts | 18 +----------------- packages/formik/src/hooks/hooks.ts | 4 ++-- packages/formik/src/utils.ts | 15 +++++++++++++++ packages/formik/test/Field.test.tsx | 7 ++----- 5 files changed, 22 insertions(+), 25 deletions(-) diff --git a/packages/formik/src/Formik.tsx b/packages/formik/src/Formik.tsx index 4c532fe0a..6a9dcd972 100755 --- a/packages/formik/src/Formik.tsx +++ b/packages/formik/src/Formik.tsx @@ -29,6 +29,7 @@ import { getIn, isObject, setNestedObjectValues, + isShallowEqual, } from './utils'; import { FormikProvider } from './FormikContext'; import invariant from 'tiny-warning'; @@ -1120,7 +1121,7 @@ export function useFormik( * Get Computed State within Render Context (like useState) */ const useComputedState = React.useCallback( - (shouldSubscribe = true) => selectComputedState(isFormValid, useState(selectStateToCompute, Object.is, shouldSubscribe)), + (shouldSubscribe = true) => selectComputedState(isFormValid, useState(selectStateToCompute, isShallowEqual, shouldSubscribe)), [isFormValid, useState] ); diff --git a/packages/formik/src/helpers/field-helpers.ts b/packages/formik/src/helpers/field-helpers.ts index 959554c13..9f08536a8 100644 --- a/packages/formik/src/helpers/field-helpers.ts +++ b/packages/formik/src/helpers/field-helpers.ts @@ -1,4 +1,4 @@ -import { FieldMetaProps, FormikState } from "../types"; +import { FormikState } from "../types"; import { getIn } from "../utils"; /** @@ -26,19 +26,3 @@ Values initialTouched: !!getIn(state.initialTouched, name), initialError: getIn(state.initialErrors, name), }); - -/** - * @internal - * - * Optimize the comparer for fieldMeta. - */ -export const fieldMetaIsEqual = ( - prev: FieldMetaProps, - next: FieldMetaProps -) => - prev.value === next.value && - prev.touched === next.touched && - prev.error === next.error && - prev.initialValue === next.initialValue && - prev.initialTouched === next.initialTouched && - prev.initialError === next.initialError; diff --git a/packages/formik/src/hooks/hooks.ts b/packages/formik/src/hooks/hooks.ts index 87a6be1a8..17aea2e57 100644 --- a/packages/formik/src/hooks/hooks.ts +++ b/packages/formik/src/hooks/hooks.ts @@ -1,11 +1,11 @@ import { useFormikContext } from '../FormikContext'; import { useMemo } from 'react'; import { - fieldMetaIsEqual, selectFieldMetaByName, } from '../helpers/field-helpers'; import { FieldMetaProps } from '../types'; import { useFormikState } from './useFormikState'; +import { isShallowEqual } from '../utils'; /** * Returns @see FieldMetaProps @@ -13,7 +13,7 @@ import { useFormikState } from './useFormikState'; export const useFieldMeta = (name: string): FieldMetaProps => { const [fieldMeta] = useFormikState( useMemo(() => selectFieldMetaByName(name), [name]), - fieldMetaIsEqual + isShallowEqual ); return fieldMeta; diff --git a/packages/formik/src/utils.ts b/packages/formik/src/utils.ts index 0acfe710b..e4de58d73 100755 --- a/packages/formik/src/utils.ts +++ b/packages/formik/src/utils.ts @@ -40,6 +40,21 @@ export const isPromise = (value: any): value is PromiseLike => export const isInputEvent = (value: any): value is React.SyntheticEvent => value && isObject(value) && isObject(value.target); +/** @private Shallow equality comparer for objects, for optimizing selectors */ +export const isShallowEqual = ( + prev: Record, + next: Record +) => { + if (Object.is(prev, next)) { + return true; + } + + const prevKeys = Object.keys(prev); + + return prevKeys.length === Object.keys(next).length && + prevKeys.every(key => Object.is(prev[key], next[key])); +} + /** * Same as document.activeElement but wraps in a try-catch block. In IE it is * not safe to call document.activeElement if there is nothing focused. diff --git a/packages/formik/test/Field.test.tsx b/packages/formik/test/Field.test.tsx index b64429e4e..769e3653c 100644 --- a/packages/formik/test/Field.test.tsx +++ b/packages/formik/test/Field.test.tsx @@ -111,12 +111,11 @@ describe('Field / FastField', () => { describe('receives { field, form, meta } props and renders element', () => { it('', () => { - let i = 0; let injected: FieldProps[] = []; let asInjectedProps: FieldProps['field'] = {} as any; const Component = (props: FieldProps) => - (injected[i++ % 3] = props) &&
{TEXT}
; + injected.push(props) &&
{TEXT}
; const AsComponent = (props: FieldProps['field']) => (asInjectedProps = props) &&
{TEXT}
; @@ -158,13 +157,11 @@ describe('Field / FastField', () => { }); it('', () => { - let i = 0; let injected: FieldProps[] = []; let asInjectedProps: FieldProps['field'] = {} as any; const Component = (props: FieldProps) => - (injected[i++ % 3] = props) &&
{TEXT}
; - + injected.push(props) &&
{TEXT}
; const AsComponent = (props: FieldProps['field']) => (asInjectedProps = props) &&
{TEXT}
; From c9b9579545d5a7f3ccd1b86c3624d5c5fcff27ff Mon Sep 17 00:00:00 2001 From: "johnrom (streaming)" <74513402+jawnrom@users.noreply.github.com> Date: Mon, 22 Mar 2021 17:35:13 -0400 Subject: [PATCH 17/28] Move Computed State into normal state helpers so that FormikState = FormikReducerState + FormikComputedState. Add Fixtures and Tutorial code to /app. --- app/components/debugging/Collapse.tsx | 21 +++ app/components/debugging/DebugFieldState.tsx | 9 ++ app/components/debugging/DebugFormikState.tsx | 9 ++ app/components/debugging/DebugProps.tsx | 19 +++ app/helpers/array-helpers.ts | 9 ++ app/helpers/chaos-helpers.ts | 89 ++++++++++++ app/helpers/random-helpers.ts | 9 ++ app/helpers/tearing-helpers.ts | 41 ++++++ app/pages/{ => fixtures}/basic.js | 0 app/pages/fixtures/components.tsx | 56 ++++++++ app/pages/fixtures/perf.tsx | 123 ++++++++++++++++ app/pages/fixtures/perf500-same.tsx | 69 +++++++++ app/pages/fixtures/perf500.tsx | 65 +++++++++ app/pages/fixtures/tearing.tsx | 133 ++++++++++++++++++ app/pages/index.tsx | 59 ++++++-- .../{sign-in.js => tutorial/sign-in.tsx} | 61 ++++---- packages/formik/src/Field.tsx | 7 +- packages/formik/src/FieldArray.tsx | 4 +- packages/formik/src/Formik.tsx | 60 ++++---- packages/formik/src/FormikContext.tsx | 4 +- packages/formik/src/connect.tsx | 8 +- packages/formik/src/helpers/field-helpers.ts | 4 +- packages/formik/src/helpers/form-helpers.ts | 11 +- packages/formik/src/hooks/hooks.ts | 8 +- packages/formik/src/hooks/useFormikState.ts | 4 +- .../formik/src/hooks/useFullFormikState.ts | 31 ---- packages/formik/src/types.tsx | 21 ++- 27 files changed, 803 insertions(+), 131 deletions(-) create mode 100644 app/components/debugging/Collapse.tsx create mode 100644 app/components/debugging/DebugFieldState.tsx create mode 100644 app/components/debugging/DebugFormikState.tsx create mode 100644 app/components/debugging/DebugProps.tsx create mode 100644 app/helpers/array-helpers.ts create mode 100644 app/helpers/chaos-helpers.ts create mode 100644 app/helpers/random-helpers.ts create mode 100644 app/helpers/tearing-helpers.ts rename app/pages/{ => fixtures}/basic.js (100%) create mode 100644 app/pages/fixtures/components.tsx create mode 100644 app/pages/fixtures/perf.tsx create mode 100644 app/pages/fixtures/perf500-same.tsx create mode 100644 app/pages/fixtures/perf500.tsx create mode 100644 app/pages/fixtures/tearing.tsx rename app/pages/{sign-in.js => tutorial/sign-in.tsx} (62%) delete mode 100644 packages/formik/src/hooks/useFullFormikState.ts diff --git a/app/components/debugging/Collapse.tsx b/app/components/debugging/Collapse.tsx new file mode 100644 index 000000000..e4b52a93d --- /dev/null +++ b/app/components/debugging/Collapse.tsx @@ -0,0 +1,21 @@ +import * as React from 'react'; + +export const Collapse: React.FC = props => { + const [collapsed, setCollapsed] = React.useState(false); + + return ( +
+ +
+ {props.children} +
+
+ ); +}; diff --git a/app/components/debugging/DebugFieldState.tsx b/app/components/debugging/DebugFieldState.tsx new file mode 100644 index 000000000..b8cd4784b --- /dev/null +++ b/app/components/debugging/DebugFieldState.tsx @@ -0,0 +1,9 @@ +import * as React from 'react'; +import { UseFieldProps, useField } from 'formik'; +import { DebugProps } from './DebugProps'; + +export const DebugFieldState = (props: UseFieldProps) => { + const [field, meta, helpers] = useField(props); + + return ; +}; diff --git a/app/components/debugging/DebugFormikState.tsx b/app/components/debugging/DebugFormikState.tsx new file mode 100644 index 000000000..a4c46c1fa --- /dev/null +++ b/app/components/debugging/DebugFormikState.tsx @@ -0,0 +1,9 @@ +import * as React from 'react'; +import { useFormikContext } from 'formik'; +import { DebugProps } from './DebugProps'; + +export const DebugFormikState = () => { + const formikState = useFormikContext(); + + return ; +}; diff --git a/app/components/debugging/DebugProps.tsx b/app/components/debugging/DebugProps.tsx new file mode 100644 index 000000000..82cad4781 --- /dev/null +++ b/app/components/debugging/DebugProps.tsx @@ -0,0 +1,19 @@ +import * as React from 'react'; + +export const DebugProps = (props?: any) => { + const renderCount = React.useRef(0); + return ( +
+
+        props = {JSON.stringify(props, null, 2)}
+        renders = {renderCount.current++}
+      
+
+ ); +}; diff --git a/app/helpers/array-helpers.ts b/app/helpers/array-helpers.ts new file mode 100644 index 000000000..97c9c06b1 --- /dev/null +++ b/app/helpers/array-helpers.ts @@ -0,0 +1,9 @@ +import { selectRandomInt } from './random-helpers'; + +export const selectRange = (count: number) => Array.from(Array(count).keys()); + +export const selectRandomArrayItem = (array: T[]) => { + const index = selectRandomInt(array.length); + + return array[index]; +}; diff --git a/app/helpers/chaos-helpers.ts b/app/helpers/chaos-helpers.ts new file mode 100644 index 000000000..1a89ed920 --- /dev/null +++ b/app/helpers/chaos-helpers.ts @@ -0,0 +1,89 @@ +import { FormikApi } from 'formik'; +import { useMemo, useEffect } from 'react'; +import { selectRandomInt } from './random-helpers'; + +export type DynamicValues = Record; + +export const useChaosHelpers = ( + formik: FormikApi, + array: number[] +) => { + return useMemo( + () => [ + () => + formik.setValues( + array.reduce>((prev, id) => { + prev[`Input ${id}`] = selectRandomInt(500).toString(); + + if (prev[`Input ${id}`]) { + } + + return prev; + }, {}) + ), + () => + formik.setErrors( + array.reduce>((prev, id) => { + const error = selectRandomInt(500); + + // leave some errors empty + prev[`Input ${id}`] = error % 5 === 0 ? '' : error.toString(); + + return prev; + }, {}) + ), + () => + formik.setTouched( + array.reduce>((prev, id) => { + prev[`Input ${id}`] = selectRandomInt(500) % 2 === 0; + + return prev; + }, {}) + ), + () => formik.submitForm(), + () => + formik.setFieldValue( + `Input ${selectRandomInt(array.length)}`, + selectRandomInt(500).toString() + ), + () => + formik.setFieldError( + `Input ${selectRandomInt(array.length)}`, + selectRandomInt(500).toString() + ), + () => + formik.setFieldTouched( + `Input ${selectRandomInt(array.length)}`, + selectRandomInt(2) % 2 === 0 + ), + () => formik.setStatus(selectRandomInt(500).toString()), + () => formik.resetForm(), + ], + [array, formik] + ); +}; + +let skipCount = 0; + +/** + * https://github.com/dai-shi/will-this-react-global-state-work-in-concurrent-mode + */ +export const useAutoUpdate = () => { + useEffect(() => { + if (typeof document !== 'undefined') { + skipCount += 1; + + if (skipCount % 10 === 0) { + document.getElementById('update-without-transition')?.click(); + } + } + }, []); + + // SSR + if (typeof performance !== 'undefined') { + const start = performance?.now(); + while (performance?.now() - start < 2) { + // empty + } + } +}; diff --git a/app/helpers/random-helpers.ts b/app/helpers/random-helpers.ts new file mode 100644 index 000000000..71aa26d63 --- /dev/null +++ b/app/helpers/random-helpers.ts @@ -0,0 +1,9 @@ +/** + * @param minOrMax // The maximum is exclusive and the minimum is inclusive + * @param max + */ +export const selectRandomInt = (minOrMax: number, max?: number) => { + const min = max ? minOrMax : 0; + max = max ? max : minOrMax; + return Math.floor(Math.random() * (max - min)) + min; +}; diff --git a/app/helpers/tearing-helpers.ts b/app/helpers/tearing-helpers.ts new file mode 100644 index 000000000..882491f04 --- /dev/null +++ b/app/helpers/tearing-helpers.ts @@ -0,0 +1,41 @@ +import { selectRange } from './array-helpers'; +import { useState, useCallback, useMemo } from 'react'; +import { useEffect } from 'react'; + +/** + * Check if all elements show the same number. + * https://github.com/dai-shi/will-this-react-global-state-work-in-concurrent-mode + */ +export const useCheckTearing = (elementCount: number, skip = 0) => { + const ids = useMemo(() => selectRange(elementCount).slice(skip), [ + elementCount, + skip, + ]); + const checkMatches = useCallback(() => { + const [first, ...rest] = ids; + const firstValue = document.querySelector(`#input-${first} code`) + ?.innerHTML; + return rest.every(id => { + const thisValue = document.querySelector(`#input-${id} code`)?.innerHTML; + const tore = thisValue !== firstValue; + if (tore) { + console.log('useCheckTearing: tore'); + console.log(thisValue); + console.log(firstValue); + } + return !tore; + }); + }, [ids]); + const [didTear, setDidTear] = useState(false); + + // We won't create an infinite loop switching this boolean once, I promise. + // (famous last words) + // eslint-disable-next-line react-hooks/exhaustive-deps + useEffect(() => { + if (!didTear && !checkMatches()) { + setDidTear(true); + } + }); + + return didTear; +}; diff --git a/app/pages/basic.js b/app/pages/fixtures/basic.js similarity index 100% rename from app/pages/basic.js rename to app/pages/fixtures/basic.js diff --git a/app/pages/fixtures/components.tsx b/app/pages/fixtures/components.tsx new file mode 100644 index 000000000..2095894ef --- /dev/null +++ b/app/pages/fixtures/components.tsx @@ -0,0 +1,56 @@ +import * as React from 'react'; +import { Formik, Field, Form, FieldProps } from 'formik'; +import { DebugProps } from '../../components/debugging/DebugProps'; + +const initialValues = { + name: '', +}; + +const RenderComponent = (props: FieldProps) => ( + <> + + + +); +const ComponentComponent = ( + props: FieldProps +) => ( + <> + + + +); +const AsComponent = ( + props: FieldProps['field'] +) => ( + <> + + + +); + +const ComponentsPage = () => ( +
+

Test Components

+ { + console.log(values); + }} + onSubmit={async values => { + await new Promise(r => setTimeout(r, 500)); + alert(JSON.stringify(values, null, 2)); + }} + > + + + + + + + + +
+); + +export default ComponentsPage; diff --git a/app/pages/fixtures/perf.tsx b/app/pages/fixtures/perf.tsx new file mode 100644 index 000000000..629ecf02e --- /dev/null +++ b/app/pages/fixtures/perf.tsx @@ -0,0 +1,123 @@ +import * as React from 'react'; +import { Formik, Field, Form, ErrorMessage } from 'formik'; +import * as Yup from 'yup'; + +let renderCount = 0; + +const PerfPage = () => ( +
+

Sign Up

+ { + await new Promise(r => setTimeout(r, 500)); + alert(JSON.stringify(values, null, 2)); + }} + > +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Checkbox Group
+
+ + + +
+
Picked
+
+ + +
+ +
{renderCount++}
+ +
+
+); + +export default PerfPage; diff --git a/app/pages/fixtures/perf500-same.tsx b/app/pages/fixtures/perf500-same.tsx new file mode 100644 index 000000000..c92b1a9d9 --- /dev/null +++ b/app/pages/fixtures/perf500-same.tsx @@ -0,0 +1,69 @@ +import * as React from 'react'; +import { Formik, Form, useField, FieldConfig } from 'formik'; +import { Collapse } from '../../components/debugging/Collapse'; +import { selectRange } from '../../helpers/array-helpers'; + +const Input = (p: FieldConfig) => { + const [field, meta] = useField(p); + const renders = React.useRef(0); + const committedRenders = React.useRef(0); + React.useLayoutEffect(() => { + committedRenders.current++; + }); + return ( + <> + + +
+ {renders.current++}, {committedRenders.current} +
+ {meta.touched && meta.error ?
{meta.error.toString()}
: null} + +
{JSON.stringify(meta, null, 2)}
+
+ + ); +}; + +const isRequired = (v: string) => { + return v && v.trim() !== '' ? undefined : 'Required'; +}; + +const fieldsArray = selectRange(500); +const initialValues = fieldsArray.reduce>((prev, id) => { + prev[`Input ${id}`] = ''; + + return prev; +}, {}); + +const onSubmit = async (values: typeof initialValues) => { + await new Promise(r => setTimeout(r, 500)); + alert(JSON.stringify(values, null, 2)); +}; + +const Perf500SamePage = () => { + return ( +
+
+

500 of the same controlled field

+
+ #, # = number of renders, number of committed renders +
+
+ +
+ + + {fieldsArray.map(id => ( + + ))} + + + +
+
+
+ ); +} + +export default Perf500SamePage; diff --git a/app/pages/fixtures/perf500.tsx b/app/pages/fixtures/perf500.tsx new file mode 100644 index 000000000..b0d67aec9 --- /dev/null +++ b/app/pages/fixtures/perf500.tsx @@ -0,0 +1,65 @@ +import * as React from 'react'; +import { Formik, Form, useField, FieldConfig } from 'formik'; +import { selectRange } from '../../helpers/array-helpers'; + +const Input = (p: FieldConfig) => { + const [field, meta] = useField(p); + const renders = React.useRef(0); + const committedRenders = React.useRef(0); + React.useLayoutEffect(() => { + committedRenders.current++; + }); + return ( + <> + + +
+ {renders.current++}, {committedRenders.current} +
+ {meta.touched && meta.error ?
{meta.error.toString()}
: null} + +
{JSON.stringify(meta, null, 2)}
+
+ + ); +}; + +const isRequired = (v: string) => { + return v && v.trim() !== '' ? undefined : 'Required'; +}; + +const array = selectRange(500); +const initialValues = array.reduce>((prev, id) => { + prev[`Input ${id}`] = ''; + return prev; +}, {}); + +const onSubmit = async (values: typeof initialValues) => { + await new Promise(r => setTimeout(r, 500)); + alert(JSON.stringify(values, null, 2)); +}; + +const kids = array.map(id => ( + +)); + +const Perf500Page = () => { + return ( +
+
+

Formik v3 with 500 controlled fields

+
+ #, # = number of renders, number of committed renders +
+
+ +
+ {kids} + +
+
+
+ ); +} + +export default Perf500Page; \ No newline at end of file diff --git a/app/pages/fixtures/tearing.tsx b/app/pages/fixtures/tearing.tsx new file mode 100644 index 000000000..f2afbd9e7 --- /dev/null +++ b/app/pages/fixtures/tearing.tsx @@ -0,0 +1,133 @@ +import * as React from 'react'; +import { + FieldConfig, + Form, + FormikProvider, + useField, + useFormik, + useFormikContext, +} from 'formik'; +import { selectRandomArrayItem, selectRange } from '../../helpers/array-helpers'; +import { useCheckTearing } from '../../helpers/tearing-helpers'; +import { + DynamicValues, + useChaosHelpers, +} from '../../helpers/chaos-helpers'; + +const selectFullState = (state: T) => state + +const Input = (p: FieldConfig) => { + useField(p); + const api = useFormikContext(); + const childState = api.useState(selectFullState); + + return ( +
+
+        {JSON.stringify(childState, null, 2)}
+      
+
+ ); +}; + +const isRequired = (v: string) => { + return v && v.trim() !== '' ? undefined : 'Required'; +}; + +const array = selectRange(50); +const initialValues = array.reduce>((prev, id) => { + prev[`Input ${id}`] = ''; + return prev; +}, {}); + +const onSubmit = async (values: DynamicValues) => { + await new Promise(r => setTimeout(r, 500)); + console.log(JSON.stringify(values, null, 2)); +}; + +const [parentId, lastId, ...inputIDs] = array; + +const kids = inputIDs.map(id => ( + +)); + +const TearingPage = () => { + const formik = useFormik({ onSubmit, initialValues }); + const parentState = formik.useState(selectFullState); + + const chaosHelpers = useChaosHelpers(formik, array); + + const handleClickWithoutTransition = React.useCallback(() => { + selectRandomArrayItem(chaosHelpers)(); + }, [chaosHelpers]); + + // skip form-level state to check inputs + const didInputsTear = useCheckTearing(array.length - 1, 1); + + // check form-level against inputs + const didFormStateTearWithInputs = useCheckTearing(array.length); + + return ( +
+
+ +

Formik Tearing Tests

+

+ Did inputs tear amongst themselves? {didInputsTear ? 'Yes' : 'No'} +

+

+ Did form-level state tear with inputs?{' '} + {didFormStateTearWithInputs ? 'Yes' : 'No'} +

+ +
+ +
+
+
+
+                {JSON.stringify(parentState, null, 2)}
+              
+
+
{kids}
+
+
+                {JSON.stringify(parentState, null, 2)}
+              
+
+
+ +
+
+
+ ); +} + +export default TearingPage; diff --git a/app/pages/index.tsx b/app/pages/index.tsx index 30daffeed..abc0c42f4 100644 --- a/app/pages/index.tsx +++ b/app/pages/index.tsx @@ -4,19 +4,52 @@ import Link from 'next/link'; function Home() { return (
-

Formik Examples and Fixtures

- +

Formik Tutorial and Fixtures

+ +