From c38211d28c80231560f1c31fdce76b84eb6e4df6 Mon Sep 17 00:00:00 2001 From: Vaggelis Yfantis Date: Fri, 24 May 2024 14:51:02 +0300 Subject: [PATCH 01/61] feat(expo): Support for Expo Web --- packages/expo/.eslintrc.js | 3 ++ packages/expo/package.json | 12 +++++++- packages/expo/src/ClerkProvider.tsx | 11 ++++--- .../expo/src/components/controlComponents.tsx | 1 + packages/expo/src/components/index.tsx | 2 ++ packages/expo/src/components/uiComponents.tsx | 30 +++++++++++++++++++ packages/expo/src/hooks/index.ts | 14 +++++++++ packages/expo/src/hooks/useOAuth.ts | 1 + .../useOAuthImpl.native.ts} | 0 packages/expo/src/hooks/useOAuthImpl.ts | 13 ++++++++ packages/expo/src/index.ts | 22 ++------------ packages/expo/src/runtime.ts | 3 -- packages/expo/src/utils/errors.ts | 3 ++ packages/expo/src/utils/index.ts | 2 ++ packages/expo/src/utils/runtime.ts | 18 +++++++++++ packages/expo/tsconfig.json | 3 +- packages/expo/tsup.config.ts | 1 + 17 files changed, 111 insertions(+), 28 deletions(-) create mode 100644 packages/expo/src/components/controlComponents.tsx create mode 100644 packages/expo/src/components/index.tsx create mode 100644 packages/expo/src/components/uiComponents.tsx create mode 100644 packages/expo/src/hooks/index.ts create mode 100644 packages/expo/src/hooks/useOAuth.ts rename packages/expo/src/{useOAuth.ts => hooks/useOAuthImpl.native.ts} (100%) create mode 100644 packages/expo/src/hooks/useOAuthImpl.ts delete mode 100644 packages/expo/src/runtime.ts create mode 100644 packages/expo/src/utils/errors.ts create mode 100644 packages/expo/src/utils/index.ts create mode 100644 packages/expo/src/utils/runtime.ts diff --git a/packages/expo/.eslintrc.js b/packages/expo/.eslintrc.js index 92ca8a838f1..8a9dfc8a72f 100644 --- a/packages/expo/.eslintrc.js +++ b/packages/expo/.eslintrc.js @@ -1,4 +1,7 @@ module.exports = { root: true, extends: ['@clerk/custom/node', '@clerk/custom/typescript', '@clerk/custom/jest', '@clerk/custom/react'], + settings: { + 'import/ignore': ['node_modules/react-native/index\\.js$'], + }, }; diff --git a/packages/expo/package.json b/packages/expo/package.json index da5d956b8f1..2c75e36d390 100644 --- a/packages/expo/package.json +++ b/packages/expo/package.json @@ -23,8 +23,17 @@ }, "license": "MIT", "author": "Clerk", - "main": "dist/index.js", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "react-native": "./src/index.ts", + "import": "./dist/index.js", + "require": "./dist/index.js" + } + }, + "main": "dist/index", "source": "src/index.js", + "react-native": "./src/index", "typings": "dist/index.d.ts", "files": [ "dist" @@ -55,6 +64,7 @@ "@types/react-dom": "*", "expo-auth-session": "^5.4.0", "expo-web-browser": "^12.8.2", + "react-native": "^0.74.1", "typescript": "*" }, "peerDependencies": { diff --git a/packages/expo/src/ClerkProvider.tsx b/packages/expo/src/ClerkProvider.tsx index c25b7280663..4fe337bb435 100644 --- a/packages/expo/src/ClerkProvider.tsx +++ b/packages/expo/src/ClerkProvider.tsx @@ -7,6 +7,9 @@ import React from 'react'; import type { TokenCache } from './cache'; import { isReactNative } from './runtime'; import { getClerkInstance } from './singleton'; +import { MemoryTokenCache } from './cache'; +import { buildClerk } from './singleton'; +import { isNative } from './utils/runtime'; export type ClerkProviderProps = ClerkReactProviderProps & { tokenCache?: TokenCache; @@ -20,11 +23,11 @@ export function ClerkProvider(props: ClerkProviderProps): JSX.Element { {children} diff --git a/packages/expo/src/components/controlComponents.tsx b/packages/expo/src/components/controlComponents.tsx new file mode 100644 index 00000000000..4059d632366 --- /dev/null +++ b/packages/expo/src/components/controlComponents.tsx @@ -0,0 +1 @@ +export { ClerkLoaded, ClerkLoading, SignedIn, SignedOut } from '@clerk/clerk-react'; diff --git a/packages/expo/src/components/index.tsx b/packages/expo/src/components/index.tsx new file mode 100644 index 00000000000..bb74cdc377d --- /dev/null +++ b/packages/expo/src/components/index.tsx @@ -0,0 +1,2 @@ +export * from './controlComponents'; +export * from './uiComponents'; diff --git a/packages/expo/src/components/uiComponents.tsx b/packages/expo/src/components/uiComponents.tsx new file mode 100644 index 00000000000..32dacdb2cf8 --- /dev/null +++ b/packages/expo/src/components/uiComponents.tsx @@ -0,0 +1,30 @@ +import { + OrganizationList as BaseOrganizationList, + OrganizationProfile as BaseOrganizationProfile, + OrganizationSwitcher as BaseOrganizationSwitcher, + SignIn as BaseSignIn, + SignUp as BaseSignUp, + UserButton as BaseUserButton, +} from '@clerk/clerk-react'; +import React from 'react'; +import { Platform, Text } from 'react-native'; + +const ErrorComponent = () => { + return Component not supported on ths platform; +}; + +function WrapComponent(component: T) { + // @ts-expect-error - This is a hack to make the function signature match the original + return Platform.select({ + // @ts-expect-error - This is a hack to make the function signature match the original + native: () => ErrorComponent, + default: () => component, + })(); +} + +export const SignIn: typeof BaseSignIn = WrapComponent(BaseSignIn); +export const SignUp: typeof BaseSignUp = WrapComponent(BaseSignUp); +export const UserButton: typeof BaseUserButton = WrapComponent(BaseUserButton); +export const OrganizationProfile: typeof BaseOrganizationProfile = WrapComponent(BaseOrganizationProfile); +export const OrganizationSwitcher: typeof BaseOrganizationSwitcher = WrapComponent(BaseOrganizationSwitcher); +export const OrganizationList: typeof BaseOrganizationList = WrapComponent(BaseOrganizationList); diff --git a/packages/expo/src/hooks/index.ts b/packages/expo/src/hooks/index.ts new file mode 100644 index 00000000000..969e644bfb9 --- /dev/null +++ b/packages/expo/src/hooks/index.ts @@ -0,0 +1,14 @@ +export { + useAuth, + useClerk, + useEmailLink, + useOrganization, + useOrganizationList, + useSession, + useSessionList, + useSignIn, + useSignUp, + useUser, +} from '@clerk/clerk-react'; + +export * from './useOAuth'; diff --git a/packages/expo/src/hooks/useOAuth.ts b/packages/expo/src/hooks/useOAuth.ts new file mode 100644 index 00000000000..5710ab4d629 --- /dev/null +++ b/packages/expo/src/hooks/useOAuth.ts @@ -0,0 +1 @@ +export * from './useOAuthImpl'; diff --git a/packages/expo/src/useOAuth.ts b/packages/expo/src/hooks/useOAuthImpl.native.ts similarity index 100% rename from packages/expo/src/useOAuth.ts rename to packages/expo/src/hooks/useOAuthImpl.native.ts diff --git a/packages/expo/src/hooks/useOAuthImpl.ts b/packages/expo/src/hooks/useOAuthImpl.ts new file mode 100644 index 00000000000..3846455991c --- /dev/null +++ b/packages/expo/src/hooks/useOAuthImpl.ts @@ -0,0 +1,13 @@ +import type { OAuthStrategy } from '@clerk/types'; +import { Platform } from 'react-native'; + +export type UseOAuthFlowParams = { + strategy: OAuthStrategy; + redirectUrl?: string; + unsafeMetadata?: SignUpUnsafeMetadata; +}; +export function useOAuth(_useOAuthParams: UseOAuthFlowParams) { + if (Platform.OS === 'web') { + throw new Error('OAuth flow is not supported in web'); + } +} diff --git a/packages/expo/src/index.ts b/packages/expo/src/index.ts index 4fa4c6b6a0e..72283a8845e 100644 --- a/packages/expo/src/index.ts +++ b/packages/expo/src/index.ts @@ -1,19 +1,4 @@ -export { - ClerkLoaded, - ClerkLoading, - SignedIn, - SignedOut, - useAuth, - useClerk, - useEmailLink, - useOrganization, - useOrganizationList, - useSession, - useSessionList, - useSignIn, - useSignUp, - useUser, -} from '@clerk/clerk-react'; +import { setErrorThrowerOptions } from '@clerk/clerk-react/internal'; export { isClerkAPIResponseError, isEmailLinkError, isKnownError, isMetamaskError } from '@clerk/clerk-react/errors'; @@ -24,9 +9,8 @@ export { clerk as Clerk } from './singleton'; export { getClerkInstance } from './singleton'; export * from './ClerkProvider'; -export * from './useOAuth'; +export * from './hooks'; +export * from './components'; // Override Clerk React error thrower to show that errors come from @clerk/clerk-expo -import { setErrorThrowerOptions } from '@clerk/clerk-react/internal'; - setErrorThrowerOptions({ packageName: PACKAGE_NAME }); diff --git a/packages/expo/src/runtime.ts b/packages/expo/src/runtime.ts deleted file mode 100644 index 45c0f677e30..00000000000 --- a/packages/expo/src/runtime.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function isReactNative(): boolean { - return typeof navigator != 'undefined' && navigator.product === 'ReactNative'; -} diff --git a/packages/expo/src/utils/errors.ts b/packages/expo/src/utils/errors.ts new file mode 100644 index 00000000000..70bbe8fdae2 --- /dev/null +++ b/packages/expo/src/utils/errors.ts @@ -0,0 +1,3 @@ +import { buildErrorThrower } from '@clerk/shared/error'; + +export const errorThrower = buildErrorThrower({ packageName: PACKAGE_NAME }); diff --git a/packages/expo/src/utils/index.ts b/packages/expo/src/utils/index.ts new file mode 100644 index 00000000000..844fc0d0747 --- /dev/null +++ b/packages/expo/src/utils/index.ts @@ -0,0 +1,2 @@ +export * from './errors'; +export * from './runtime'; diff --git a/packages/expo/src/utils/runtime.ts b/packages/expo/src/utils/runtime.ts new file mode 100644 index 00000000000..a4236b3f76d --- /dev/null +++ b/packages/expo/src/utils/runtime.ts @@ -0,0 +1,18 @@ +import { Platform } from 'react-native'; + +export function isWeb(): boolean { + return Platform.OS === 'web'; +} + +export function isNative(): boolean { + return Platform.OS !== 'web'; +} + +export function isHermes() { + //@ts-expect-error HermesInternal is added only added by the Hermes JS Engine + return !!global.HermesInternal; +} + +export function reactNativeVersion() { + return Platform.constants.reactNativeVersion; +} diff --git a/packages/expo/tsconfig.json b/packages/expo/tsconfig.json index d423ec1c4af..6350512eb9f 100644 --- a/packages/expo/tsconfig.json +++ b/packages/expo/tsconfig.json @@ -20,7 +20,8 @@ "allowJs": true, "target": "ES2019", "noEmitOnError": false, - "incremental": true + "incremental": true, + "moduleSuffixes": [".ios", ".android", ".native", ""] }, "include": ["src"] } diff --git a/packages/expo/tsup.config.ts b/packages/expo/tsup.config.ts index 7dae145a8a0..bd5cda7af72 100644 --- a/packages/expo/tsup.config.ts +++ b/packages/expo/tsup.config.ts @@ -18,6 +18,7 @@ export default defineConfig(overrideOptions => { minify: false, sourcemap: true, legacyOutput: true, + skipNodeModulesBundle: true, define: { PACKAGE_NAME: `"${name}"`, PACKAGE_VERSION: `"${version}"`, From 08754f5f76f90350d9f609e003c42998ac64c7ed Mon Sep 17 00:00:00 2001 From: Vaggelis Yfantis Date: Tue, 28 May 2024 22:07:46 +0300 Subject: [PATCH 02/61] chore(repo): Add Changeset --- .changeset/two-wombats-confess.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/two-wombats-confess.md diff --git a/.changeset/two-wombats-confess.md b/.changeset/two-wombats-confess.md new file mode 100644 index 00000000000..681bc5f19dc --- /dev/null +++ b/.changeset/two-wombats-confess.md @@ -0,0 +1,5 @@ +--- +'@clerk/clerk-expo': minor +--- + +Expo Web support From 96b3cb2ebeefc154f5b01fe59d1fa9d8e21d1259 Mon Sep 17 00:00:00 2001 From: Vaggelis Yfantis Date: Tue, 28 May 2024 23:06:54 +0300 Subject: [PATCH 03/61] chore(expo): Update package.json --- packages/expo/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/expo/package.json b/packages/expo/package.json index 2c75e36d390..f3a35221c3b 100644 --- a/packages/expo/package.json +++ b/packages/expo/package.json @@ -31,9 +31,9 @@ "require": "./dist/index.js" } }, - "main": "dist/index", + "main": "dist/index.js", "source": "src/index.js", - "react-native": "./src/index", + "react-native": "./src/index.ts", "typings": "dist/index.d.ts", "files": [ "dist" From bc0c3c5ba56b6581e4f8917b4bdc8c551368fb9a Mon Sep 17 00:00:00 2001 From: Vaggelis Yfantis Date: Tue, 28 May 2024 23:57:22 +0300 Subject: [PATCH 04/61] fix(expo): Throw error when using component in native platforms --- packages/expo/package.json | 4 ++-- packages/expo/src/components/uiComponents.tsx | 11 ++++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/packages/expo/package.json b/packages/expo/package.json index f3a35221c3b..cb0ad420ad4 100644 --- a/packages/expo/package.json +++ b/packages/expo/package.json @@ -31,8 +31,8 @@ "require": "./dist/index.js" } }, - "main": "dist/index.js", - "source": "src/index.js", + "main": "./dist/index.js", + "source": "./src/index.js", "react-native": "./src/index.ts", "typings": "dist/index.d.ts", "files": [ diff --git a/packages/expo/src/components/uiComponents.tsx b/packages/expo/src/components/uiComponents.tsx index 32dacdb2cf8..71c748ae1bc 100644 --- a/packages/expo/src/components/uiComponents.tsx +++ b/packages/expo/src/components/uiComponents.tsx @@ -6,18 +6,19 @@ import { SignUp as BaseSignUp, UserButton as BaseUserButton, } from '@clerk/clerk-react'; -import React from 'react'; -import { Platform, Text } from 'react-native'; +import { Platform } from 'react-native'; -const ErrorComponent = () => { - return Component not supported on ths platform; +const ErrorComponent = (componentName: string) => { + throw new Error(`<${componentName}/> is not supported on this platform`); }; function WrapComponent(component: T) { + const commonentName = component.displayName.replace('withClerk(', '').replace(')', ''); + // @ts-expect-error - This is a hack to make the function signature match the original return Platform.select({ // @ts-expect-error - This is a hack to make the function signature match the original - native: () => ErrorComponent, + native: () => () => ErrorComponent(commonentName), default: () => component, })(); } From b95559ca107fff509bdbc9ebeb763edc55c62822 Mon Sep 17 00:00:00 2001 From: Vaggelis Yfantis Date: Wed, 29 May 2024 20:47:18 +0300 Subject: [PATCH 05/61] chore(expo): Use error thrower and move useOAuth hook --- packages/expo/src/components/uiComponents.tsx | 8 +++++--- packages/expo/src/hooks/useOAuth.ts | 1 - packages/expo/src/hooks/useOAuth/index.ts | 1 + .../useOAuth.native.ts} | 3 +++ .../src/hooks/{useOAuthImpl.ts => useOAuth/useOAuth.ts} | 4 +++- packages/expo/src/utils/errors.ts | 2 +- 6 files changed, 13 insertions(+), 6 deletions(-) delete mode 100644 packages/expo/src/hooks/useOAuth.ts create mode 100644 packages/expo/src/hooks/useOAuth/index.ts rename packages/expo/src/hooks/{useOAuthImpl.native.ts => useOAuth/useOAuth.native.ts} (98%) rename packages/expo/src/hooks/{useOAuthImpl.ts => useOAuth/useOAuth.ts} (72%) diff --git a/packages/expo/src/components/uiComponents.tsx b/packages/expo/src/components/uiComponents.tsx index 71c748ae1bc..585d5e45d70 100644 --- a/packages/expo/src/components/uiComponents.tsx +++ b/packages/expo/src/components/uiComponents.tsx @@ -8,16 +8,18 @@ import { } from '@clerk/clerk-react'; import { Platform } from 'react-native'; +import { errorThrower } from '../utils/errors'; + const ErrorComponent = (componentName: string) => { - throw new Error(`<${componentName}/> is not supported on this platform`); + throw errorThrower.throw(`The ${componentName} component is not supported in the Expo environment.`); }; function WrapComponent(component: T) { const commonentName = component.displayName.replace('withClerk(', '').replace(')', ''); - // @ts-expect-error - This is a hack to make the function signature match the original + // @ts-expect-error - This is just to make the function signature match the original return Platform.select({ - // @ts-expect-error - This is a hack to make the function signature match the original + // @ts-expect-error - This is just to make the function signature match the original native: () => () => ErrorComponent(commonentName), default: () => component, })(); diff --git a/packages/expo/src/hooks/useOAuth.ts b/packages/expo/src/hooks/useOAuth.ts deleted file mode 100644 index 5710ab4d629..00000000000 --- a/packages/expo/src/hooks/useOAuth.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './useOAuthImpl'; diff --git a/packages/expo/src/hooks/useOAuth/index.ts b/packages/expo/src/hooks/useOAuth/index.ts new file mode 100644 index 00000000000..a7e60d69df5 --- /dev/null +++ b/packages/expo/src/hooks/useOAuth/index.ts @@ -0,0 +1 @@ +export * from './useOAuth'; diff --git a/packages/expo/src/hooks/useOAuthImpl.native.ts b/packages/expo/src/hooks/useOAuth/useOAuth.native.ts similarity index 98% rename from packages/expo/src/hooks/useOAuthImpl.native.ts rename to packages/expo/src/hooks/useOAuth/useOAuth.native.ts index 42fcc96e93e..c31493a0208 100644 --- a/packages/expo/src/hooks/useOAuthImpl.native.ts +++ b/packages/expo/src/hooks/useOAuth/useOAuth.native.ts @@ -63,6 +63,9 @@ export function useOAuth(useOAuthParams: UseOAuthFlowParams) { // @ts-ignore externalVerificationRedirectURL.toString(), oauthRedirectUrl, + { + showInRecents: true, + }, ); // @ts-expect-error diff --git a/packages/expo/src/hooks/useOAuthImpl.ts b/packages/expo/src/hooks/useOAuth/useOAuth.ts similarity index 72% rename from packages/expo/src/hooks/useOAuthImpl.ts rename to packages/expo/src/hooks/useOAuth/useOAuth.ts index 3846455991c..3621cce6a4a 100644 --- a/packages/expo/src/hooks/useOAuthImpl.ts +++ b/packages/expo/src/hooks/useOAuth/useOAuth.ts @@ -1,6 +1,8 @@ import type { OAuthStrategy } from '@clerk/types'; import { Platform } from 'react-native'; +import { errorThrower } from '../../utils/errors'; + export type UseOAuthFlowParams = { strategy: OAuthStrategy; redirectUrl?: string; @@ -8,6 +10,6 @@ export type UseOAuthFlowParams = { }; export function useOAuth(_useOAuthParams: UseOAuthFlowParams) { if (Platform.OS === 'web') { - throw new Error('OAuth flow is not supported in web'); + throw errorThrower.throw('useOAuth hook is not supported in Web'); } } diff --git a/packages/expo/src/utils/errors.ts b/packages/expo/src/utils/errors.ts index 70bbe8fdae2..3e868d16bc2 100644 --- a/packages/expo/src/utils/errors.ts +++ b/packages/expo/src/utils/errors.ts @@ -1,3 +1,3 @@ import { buildErrorThrower } from '@clerk/shared/error'; -export const errorThrower = buildErrorThrower({ packageName: PACKAGE_NAME }); +export const errorThrower = buildErrorThrower({ packageName: PACKAGE_NAME, customMessages: [] }); From bede556849764f42eac0a2d389df5a319072fecb Mon Sep 17 00:00:00 2001 From: Vaggelis Yfantis Date: Thu, 30 May 2024 15:35:22 +0300 Subject: [PATCH 06/61] chore(expo): Remove custom messages array from errorThrower --- packages/expo/src/utils/errors.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/expo/src/utils/errors.ts b/packages/expo/src/utils/errors.ts index 3e868d16bc2..70bbe8fdae2 100644 --- a/packages/expo/src/utils/errors.ts +++ b/packages/expo/src/utils/errors.ts @@ -1,3 +1,3 @@ import { buildErrorThrower } from '@clerk/shared/error'; -export const errorThrower = buildErrorThrower({ packageName: PACKAGE_NAME, customMessages: [] }); +export const errorThrower = buildErrorThrower({ packageName: PACKAGE_NAME }); From 625dbf29edf9cfb08faeddb531348be1ede45c76 Mon Sep 17 00:00:00 2001 From: Vaggelis Yfantis Date: Thu, 30 May 2024 20:32:42 +0300 Subject: [PATCH 07/61] chore(expo): Update the structure of the package --- packages/expo/src/{cache.ts => caches/MemoryTokenCache.ts} | 6 +----- packages/expo/src/caches/index.ts | 3 +++ packages/expo/src/caches/types.ts | 5 +++++ packages/expo/src/index.ts | 4 ++-- packages/expo/src/polyfills/base64Polyfill.ts | 7 +++---- packages/expo/src/{ => provider}/ClerkProvider.tsx | 6 ++---- packages/expo/src/{ => provider}/singleton.ts | 4 ++-- packages/expo/src/utils/runtime.ts | 2 +- 8 files changed, 19 insertions(+), 18 deletions(-) rename packages/expo/src/{cache.ts => caches/MemoryTokenCache.ts} (67%) create mode 100644 packages/expo/src/caches/index.ts create mode 100644 packages/expo/src/caches/types.ts rename packages/expo/src/{ => provider}/ClerkProvider.tsx (83%) rename packages/expo/src/{ => provider}/singleton.ts (95%) diff --git a/packages/expo/src/cache.ts b/packages/expo/src/caches/MemoryTokenCache.ts similarity index 67% rename from packages/expo/src/cache.ts rename to packages/expo/src/caches/MemoryTokenCache.ts index 3294c34608e..14557c7ec4a 100644 --- a/packages/expo/src/cache.ts +++ b/packages/expo/src/caches/MemoryTokenCache.ts @@ -1,8 +1,4 @@ -export interface TokenCache { - getToken: (key: string) => Promise; - saveToken: (key: string, token: string) => Promise; - clearToken?: (key: string) => void; -} +import type { TokenCache } from './types'; const createMemoryTokenCache = (): TokenCache => { const cache: Record = {}; diff --git a/packages/expo/src/caches/index.ts b/packages/expo/src/caches/index.ts new file mode 100644 index 00000000000..80025147e93 --- /dev/null +++ b/packages/expo/src/caches/index.ts @@ -0,0 +1,3 @@ +export { TokenCache } from './types'; + +export { MemoryTokenCache } from './MemoryTokenCache'; diff --git a/packages/expo/src/caches/types.ts b/packages/expo/src/caches/types.ts new file mode 100644 index 00000000000..a22778f95c4 --- /dev/null +++ b/packages/expo/src/caches/types.ts @@ -0,0 +1,5 @@ +export interface TokenCache { + getToken: (key: string) => Promise; + saveToken: (key: string, token: string) => Promise; + clearToken?: (key: string) => void; +} diff --git a/packages/expo/src/index.ts b/packages/expo/src/index.ts index 72283a8845e..f7da141061d 100644 --- a/packages/expo/src/index.ts +++ b/packages/expo/src/index.ts @@ -5,10 +5,10 @@ export { isClerkAPIResponseError, isEmailLinkError, isKnownError, isMetamaskErro /** * @deprecated Use `getClerkInstance()` instead. */ -export { clerk as Clerk } from './singleton'; +export { clerk as Clerk } from './provider/singleton'; export { getClerkInstance } from './singleton'; -export * from './ClerkProvider'; +export * from './provider/ClerkProvider'; export * from './hooks'; export * from './components'; diff --git a/packages/expo/src/polyfills/base64Polyfill.ts b/packages/expo/src/polyfills/base64Polyfill.ts index b36d38f63f2..2d9bd89b610 100644 --- a/packages/expo/src/polyfills/base64Polyfill.ts +++ b/packages/expo/src/polyfills/base64Polyfill.ts @@ -1,14 +1,13 @@ import { decode, encode } from 'base-64'; -//@ts-expect-error HermesInternal is added by the Hermes JS Engine -const isHermes = !!global.HermesInternal; +import { isHermes } from '../utils'; // See Default Expo 51 engine Hermes' issue: https://github.com/facebook/hermes/issues/1379 -if (!global.btoa || isHermes) { +if (!global.btoa || isHermes()) { global.btoa = encode; } // See Default Expo 51 engine Hermes' issue: https://github.com/facebook/hermes/issues/1379 -if (!global.atob || isHermes) { +if (!global.atob || isHermes()) { global.atob = decode; } diff --git a/packages/expo/src/ClerkProvider.tsx b/packages/expo/src/provider/ClerkProvider.tsx similarity index 83% rename from packages/expo/src/ClerkProvider.tsx rename to packages/expo/src/provider/ClerkProvider.tsx index 4fe337bb435..d9e60eeb159 100644 --- a/packages/expo/src/ClerkProvider.tsx +++ b/packages/expo/src/provider/ClerkProvider.tsx @@ -1,17 +1,15 @@ -import './polyfills'; +import '../polyfills'; -import type { ClerkProviderProps as ClerkReactProviderProps } from '@clerk/clerk-react'; import { ClerkProvider as ClerkReactProvider } from '@clerk/clerk-react'; import React from 'react'; import type { TokenCache } from './cache'; -import { isReactNative } from './runtime'; import { getClerkInstance } from './singleton'; import { MemoryTokenCache } from './cache'; import { buildClerk } from './singleton'; import { isNative } from './utils/runtime'; -export type ClerkProviderProps = ClerkReactProviderProps & { +export type ClerkProviderProps = React.ComponentProps & { tokenCache?: TokenCache; }; diff --git a/packages/expo/src/singleton.ts b/packages/expo/src/provider/singleton.ts similarity index 95% rename from packages/expo/src/singleton.ts rename to packages/expo/src/provider/singleton.ts index 1929b00ecae..98871e12d99 100644 --- a/packages/expo/src/singleton.ts +++ b/packages/expo/src/provider/singleton.ts @@ -2,8 +2,8 @@ import type { FapiRequestInit, FapiResponse } from '@clerk/clerk-js/dist/types/c import { Clerk } from '@clerk/clerk-js/headless'; import type { HeadlessBrowserClerk } from '@clerk/clerk-react'; -import type { TokenCache } from './cache'; -import { MemoryTokenCache } from './cache'; +import type { TokenCache } from '../caches/MemoryTokenCache'; +import { MemoryTokenCache } from './cache/MemoryTokenCache'; import { errorThrower } from './errorThrower'; Clerk.sdkMetadata = { diff --git a/packages/expo/src/utils/runtime.ts b/packages/expo/src/utils/runtime.ts index a4236b3f76d..07d7bbd28de 100644 --- a/packages/expo/src/utils/runtime.ts +++ b/packages/expo/src/utils/runtime.ts @@ -5,7 +5,7 @@ export function isWeb(): boolean { } export function isNative(): boolean { - return Platform.OS !== 'web'; + return !isWeb(); } export function isHermes() { From c3fd056029d4def9fe71f5e7742542503f233e18 Mon Sep 17 00:00:00 2001 From: Vaggelis Yfantis Date: Thu, 30 May 2024 20:34:31 +0300 Subject: [PATCH 08/61] fix(expo): Wrong type import in ClerkProvider --- packages/expo/src/provider/ClerkProvider.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/expo/src/provider/ClerkProvider.tsx b/packages/expo/src/provider/ClerkProvider.tsx index d9e60eeb159..b169dc7f93a 100644 --- a/packages/expo/src/provider/ClerkProvider.tsx +++ b/packages/expo/src/provider/ClerkProvider.tsx @@ -3,9 +3,9 @@ import '../polyfills'; import { ClerkProvider as ClerkReactProvider } from '@clerk/clerk-react'; import React from 'react'; -import type { TokenCache } from './cache'; +import type { TokenCache } from '../caches/types'; +import { isNative } from '../utils/runtime'; import { getClerkInstance } from './singleton'; -import { MemoryTokenCache } from './cache'; import { buildClerk } from './singleton'; import { isNative } from './utils/runtime'; From c40d1a92b0e7443a2eb122235adc68b4612e0555 Mon Sep 17 00:00:00 2001 From: Vaggelis Yfantis Date: Thu, 30 May 2024 23:07:01 +0300 Subject: [PATCH 09/61] fix(expo): Fix wrong type import --- packages/expo/src/provider/singleton.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/expo/src/provider/singleton.ts b/packages/expo/src/provider/singleton.ts index 98871e12d99..851206b6fec 100644 --- a/packages/expo/src/provider/singleton.ts +++ b/packages/expo/src/provider/singleton.ts @@ -2,7 +2,7 @@ import type { FapiRequestInit, FapiResponse } from '@clerk/clerk-js/dist/types/c import { Clerk } from '@clerk/clerk-js/headless'; import type { HeadlessBrowserClerk } from '@clerk/clerk-react'; -import type { TokenCache } from '../caches/MemoryTokenCache'; +import type { TokenCache } from '../caches/types'; import { MemoryTokenCache } from './cache/MemoryTokenCache'; import { errorThrower } from './errorThrower'; From acad3986a79baf579a2dfdb8b2a133d5c203cbc6 Mon Sep 17 00:00:00 2001 From: Vaggelis Yfantis Date: Fri, 31 May 2024 17:28:20 +0300 Subject: [PATCH 10/61] chore(expo): Make useOAuth base implementation to be the native one --- .../src/hooks/useOAuth/useOAuth.native.ts | 117 ------------------ packages/expo/src/hooks/useOAuth/useOAuth.ts | 116 +++++++++++++++-- .../expo/src/hooks/useOAuth/useOAuth.web.ts | 15 +++ 3 files changed, 124 insertions(+), 124 deletions(-) delete mode 100644 packages/expo/src/hooks/useOAuth/useOAuth.native.ts create mode 100644 packages/expo/src/hooks/useOAuth/useOAuth.web.ts diff --git a/packages/expo/src/hooks/useOAuth/useOAuth.native.ts b/packages/expo/src/hooks/useOAuth/useOAuth.native.ts deleted file mode 100644 index c31493a0208..00000000000 --- a/packages/expo/src/hooks/useOAuth/useOAuth.native.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { useSignIn, useSignUp } from '@clerk/clerk-react'; -import type { OAuthStrategy, SetActive, SignInResource, SignUpResource } from '@clerk/types'; -import * as AuthSession from 'expo-auth-session'; -import * as WebBrowser from 'expo-web-browser'; - -export type UseOAuthFlowParams = { - strategy: OAuthStrategy; - redirectUrl?: string; - unsafeMetadata?: SignUpUnsafeMetadata; -}; - -export type StartOAuthFlowParams = { - redirectUrl?: string; - unsafeMetadata?: SignUpUnsafeMetadata; -}; - -export type StartOAuthFlowReturnType = { - createdSessionId: string; - setActive?: SetActive; - signIn?: SignInResource; - signUp?: SignUpResource; - authSessionResult?: WebBrowser.WebBrowserAuthSessionResult; -}; - -export function useOAuth(useOAuthParams: UseOAuthFlowParams) { - const { strategy } = useOAuthParams || {}; - if (!strategy) { - throw new Error('Missing oauth strategy'); - } - - const { signIn, setActive, isLoaded: isSignInLoaded } = useSignIn(); - const { signUp, isLoaded: isSignUpLoaded } = useSignUp(); - - async function startOAuthFlow(startOAuthFlowParams?: StartOAuthFlowParams): Promise { - if (!isSignInLoaded || !isSignUpLoaded) { - return { - createdSessionId: '', - signIn, - signUp, - setActive, - }; - } - - // Create a redirect url for the current platform and environment. - // - // This redirect URL needs to be whitelisted for your Clerk production instance via - // https://clerk.com/docs/reference/backend-api/tag/Redirect-URLs#operation/CreateRedirectURL - // - // For more information go to: - // https://docs.expo.dev/versions/latest/sdk/auth-session/#authsessionmakeredirecturi - const oauthRedirectUrl = - startOAuthFlowParams?.redirectUrl || - useOAuthParams.redirectUrl || - AuthSession.makeRedirectUri({ - path: 'oauth-native-callback', - }); - - await signIn.create({ strategy, redirectUrl: oauthRedirectUrl }); - - const { externalVerificationRedirectURL } = signIn.firstFactorVerification; - - const authSessionResult = await WebBrowser.openAuthSessionAsync( - // @ts-ignore - externalVerificationRedirectURL.toString(), - oauthRedirectUrl, - { - showInRecents: true, - }, - ); - - // @ts-expect-error - const { type, url } = authSessionResult || {}; - - // TODO: Check all the possible AuthSession results - // https://docs.expo.dev/versions/latest/sdk/auth-session/#returns-7 - if (type !== 'success') { - return { - authSessionResult, - createdSessionId: '', - setActive, - signIn, - signUp, - }; - } - - const params = new URL(url).searchParams; - - const rotatingTokenNonce = params.get('rotating_token_nonce') || ''; - await signIn.reload({ rotatingTokenNonce }); - - const { status, firstFactorVerification } = signIn; - - let createdSessionId = ''; - - if (status === 'complete') { - createdSessionId = signIn.createdSessionId!; - } else if (firstFactorVerification.status === 'transferable') { - await signUp.create({ - transfer: true, - unsafeMetadata: startOAuthFlowParams?.unsafeMetadata || useOAuthParams.unsafeMetadata, - }); - createdSessionId = signUp.createdSessionId || ''; - } - - return { - authSessionResult, - createdSessionId, - setActive, - signIn, - signUp, - }; - } - - return { - startOAuthFlow, - }; -} diff --git a/packages/expo/src/hooks/useOAuth/useOAuth.ts b/packages/expo/src/hooks/useOAuth/useOAuth.ts index 3621cce6a4a..38d1bb0b62c 100644 --- a/packages/expo/src/hooks/useOAuth/useOAuth.ts +++ b/packages/expo/src/hooks/useOAuth/useOAuth.ts @@ -1,15 +1,117 @@ -import type { OAuthStrategy } from '@clerk/types'; -import { Platform } from 'react-native'; - -import { errorThrower } from '../../utils/errors'; +import { useSignIn, useSignUp } from '@clerk/clerk-react'; +import type { OAuthStrategy, SetActive, SignInResource, SignUpResource } from '@clerk/types'; +import * as AuthSession from 'expo-auth-session'; +import * as WebBrowser from 'expo-web-browser'; export type UseOAuthFlowParams = { strategy: OAuthStrategy; redirectUrl?: string; unsafeMetadata?: SignUpUnsafeMetadata; }; -export function useOAuth(_useOAuthParams: UseOAuthFlowParams) { - if (Platform.OS === 'web') { - throw errorThrower.throw('useOAuth hook is not supported in Web'); + +export type StartOAuthFlowParams = { + redirectUrl?: string; + unsafeMetadata?: SignUpUnsafeMetadata; +}; + +export type StartOAuthFlowReturnType = { + createdSessionId: string; + setActive?: SetActive; + signIn?: SignInResource; + signUp?: SignUpResource; + authSessionResult?: WebBrowser.WebBrowserAuthSessionResult; +}; + +export function useOAuth(useOAuthParams: UseOAuthFlowParams) { + const { strategy } = useOAuthParams || {}; + if (!strategy) { + throw new Error('Missing oauth strategy'); } + + const { signIn, setActive, isLoaded: isSignInLoaded } = useSignIn(); + const { signUp, isLoaded: isSignUpLoaded } = useSignUp(); + + async function startOAuthFlow(startOAuthFlowParams?: StartOAuthFlowParams): Promise { + if (!isSignInLoaded || !isSignUpLoaded) { + return { + createdSessionId: '', + signIn, + signUp, + setActive, + }; + } + + // Create a redirect url for the current platform and environment. + // + // This redirect URL needs to be whitelisted for your Clerk production instance via + // https://clerk.com/docs/reference/backend-api/tag/Redirect-URLs#operation/CreateRedirectURL + // + // For more information go to: + // https://docs.expo.dev/versions/latest/sdk/auth-session/#authsessionmakeredirecturi + const oauthRedirectUrl = + startOAuthFlowParams?.redirectUrl || + useOAuthParams.redirectUrl || + AuthSession.makeRedirectUri({ + path: 'oauth-native-callback', + }); + + await signIn.create({ strategy, redirectUrl: oauthRedirectUrl }); + + const { externalVerificationRedirectURL } = signIn.firstFactorVerification; + + const authSessionResult = await WebBrowser.openAuthSessionAsync( + // @ts-ignore + externalVerificationRedirectURL.toString(), + oauthRedirectUrl, + ); + + console.log('authSessionResult', authSessionResult); + + // @ts-expect-error + const { type, url } = authSessionResult || {}; + + // TODO: Check all the possible AuthSession results + // https://docs.expo.dev/versions/latest/sdk/auth-session/#returns-7 + if (type !== 'success') { + return { + authSessionResult, + createdSessionId: '', + setActive, + signIn, + signUp, + }; + } + + const params = new URL(url).searchParams; + + const rotatingTokenNonce = params.get('rotating_token_nonce') || ''; + await signIn.reload({ rotatingTokenNonce }); + + const { status, firstFactorVerification } = signIn; + + let createdSessionId = ''; + + if (status === 'complete') { + console.log('signIn', signIn); + createdSessionId = signIn.createdSessionId!; + } else if (firstFactorVerification.status === 'transferable') { + await signUp.create({ + transfer: true, + unsafeMetadata: startOAuthFlowParams?.unsafeMetadata || useOAuthParams.unsafeMetadata, + }); + createdSessionId = signUp.createdSessionId || ''; + } + + return { + authSessionResult, + createdSessionId, + setActive, + signIn, + signUp, + }; + } + + return { + startOAuthFlow, + }; } diff --git a/packages/expo/src/hooks/useOAuth/useOAuth.web.ts b/packages/expo/src/hooks/useOAuth/useOAuth.web.ts new file mode 100644 index 00000000000..3621cce6a4a --- /dev/null +++ b/packages/expo/src/hooks/useOAuth/useOAuth.web.ts @@ -0,0 +1,15 @@ +import type { OAuthStrategy } from '@clerk/types'; +import { Platform } from 'react-native'; + +import { errorThrower } from '../../utils/errors'; + +export type UseOAuthFlowParams = { + strategy: OAuthStrategy; + redirectUrl?: string; + unsafeMetadata?: SignUpUnsafeMetadata; +}; +export function useOAuth(_useOAuthParams: UseOAuthFlowParams) { + if (Platform.OS === 'web') { + throw errorThrower.throw('useOAuth hook is not supported in Web'); + } +} From a0193c22f07b9ebc5da619ef652e1527eee7427b Mon Sep 17 00:00:00 2001 From: Vaggelis Yfantis Date: Fri, 31 May 2024 20:15:20 +0300 Subject: [PATCH 11/61] chore(expo): Remove console.logs from useOAuth --- packages/expo/src/hooks/useOAuth/useOAuth.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/expo/src/hooks/useOAuth/useOAuth.ts b/packages/expo/src/hooks/useOAuth/useOAuth.ts index 38d1bb0b62c..42fcc96e93e 100644 --- a/packages/expo/src/hooks/useOAuth/useOAuth.ts +++ b/packages/expo/src/hooks/useOAuth/useOAuth.ts @@ -65,8 +65,6 @@ export function useOAuth(useOAuthParams: UseOAuthFlowParams) { oauthRedirectUrl, ); - console.log('authSessionResult', authSessionResult); - // @ts-expect-error const { type, url } = authSessionResult || {}; @@ -92,7 +90,6 @@ export function useOAuth(useOAuthParams: UseOAuthFlowParams) { let createdSessionId = ''; if (status === 'complete') { - console.log('signIn', signIn); createdSessionId = signIn.createdSessionId!; } else if (firstFactorVerification.status === 'transferable') { await signUp.create({ From fe55ada584d79d93bab55fb503193f385a703628 Mon Sep 17 00:00:00 2001 From: Vaggelis Yfantis Date: Wed, 12 Jun 2024 15:29:39 +0300 Subject: [PATCH 12/61] chore(clerk-expo): User react 18.2.0 --- package-lock.json | 3139 +++++++++++++++++++++++++++++++++++- packages/expo/package.json | 7 +- 2 files changed, 3082 insertions(+), 64 deletions(-) diff --git a/package-lock.json b/package-lock.json index fbde2643738..dc71772ff3e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1115,7 +1115,6 @@ "version": "7.20.7", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-plugin-utils": "^7.20.2", @@ -1165,7 +1164,6 @@ "version": "7.23.3", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-export-default-from": "^7.23.3" @@ -1177,6 +1175,23 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", + "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-logical-assignment-operators instead.", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { "version": "7.18.6", "dev": true, @@ -1229,7 +1244,6 @@ "version": "7.18.6", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" @@ -1366,7 +1380,6 @@ "version": "7.23.3", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -2575,7 +2588,6 @@ "version": "7.24.0", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-validator-option": "^7.23.5", @@ -2644,7 +2656,6 @@ "version": "7.23.7", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "clone-deep": "^4.0.1", "find-cache-dir": "^2.0.0", @@ -2663,7 +2674,6 @@ "version": "2.1.0", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "commondir": "^1.0.1", "make-dir": "^2.0.0", @@ -2677,7 +2687,6 @@ "version": "3.0.0", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "locate-path": "^3.0.0" }, @@ -2689,7 +2698,6 @@ "version": "3.0.0", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -2702,7 +2710,6 @@ "version": "2.1.0", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "pify": "^4.0.1", "semver": "^5.6.0" @@ -2715,7 +2722,6 @@ "version": "3.0.0", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "p-limit": "^2.0.0" }, @@ -2727,7 +2733,6 @@ "version": "3.0.0", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -2736,7 +2741,6 @@ "version": "4.0.1", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -2745,7 +2749,6 @@ "version": "3.0.0", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "find-up": "^3.0.0" }, @@ -2757,7 +2760,6 @@ "version": "5.7.2", "dev": true, "license": "ISC", - "peer": true, "bin": { "semver": "bin/semver" } @@ -2766,7 +2768,6 @@ "version": "0.6.1", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -2775,7 +2776,6 @@ "version": "0.5.21", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -7481,7 +7481,6 @@ "version": "1.4.1", "dev": true, "license": "ISC", - "peer": true, "engines": { "node": ">=12" } @@ -7756,6 +7755,29 @@ "devOptional": true, "license": "MIT" }, + "node_modules/@jest/core/node_modules/supports-color": { + "version": "7.2.0", + "devOptional": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/create-cache-key-function": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz", + "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/@jest/environment": { "version": "29.7.0", "devOptional": true, @@ -11951,6 +11973,1187 @@ "tslib": "^2.4.0" } }, + "node_modules/@react-native-community/cli": { + "version": "13.6.8", + "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-13.6.8.tgz", + "integrity": "sha512-0lRdgLNaXixWY4BfFRl1J6Ao9Lapo2z+++iE7TD4GAbuxOWJSyFi+KUA8XNfSDyML4jFO02MZgyBPxAWdaminQ==", + "dev": true, + "dependencies": { + "@react-native-community/cli-clean": "13.6.8", + "@react-native-community/cli-config": "13.6.8", + "@react-native-community/cli-debugger-ui": "13.6.8", + "@react-native-community/cli-doctor": "13.6.8", + "@react-native-community/cli-hermes": "13.6.8", + "@react-native-community/cli-server-api": "13.6.8", + "@react-native-community/cli-tools": "13.6.8", + "@react-native-community/cli-types": "13.6.8", + "chalk": "^4.1.2", + "commander": "^9.4.1", + "deepmerge": "^4.3.0", + "execa": "^5.0.0", + "find-up": "^4.1.0", + "fs-extra": "^8.1.0", + "graceful-fs": "^4.1.3", + "prompts": "^2.4.2", + "semver": "^7.5.2" + }, + "bin": { + "rnc-cli": "build/bin.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native-community/cli-clean": { + "version": "13.6.8", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-13.6.8.tgz", + "integrity": "sha512-B1uxlm1N4BQuWFvBL3yRl3LVvydjswsdbTi7tMrHMtSxfRio1p9HjcmDzlzKco09Y+8qBGgakm3jcMZGLbhXQQ==", + "dev": true, + "dependencies": { + "@react-native-community/cli-tools": "13.6.8", + "chalk": "^4.1.2", + "execa": "^5.0.0", + "fast-glob": "^3.3.2" + } + }, + "node_modules/@react-native-community/cli-clean/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-clean/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-clean/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@react-native-community/cli-clean/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@react-native-community/cli-clean/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-clean/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-config": { + "version": "13.6.8", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-13.6.8.tgz", + "integrity": "sha512-RabCkIsWdP4Ex/sf1uSP9qxc30utm+0uIJAjrZkNQynm7T4Lyqn/kT3LKm4yM6M0Qk61YxGguiaXF4601vAduw==", + "dev": true, + "dependencies": { + "@react-native-community/cli-tools": "13.6.8", + "chalk": "^4.1.2", + "cosmiconfig": "^5.1.0", + "deepmerge": "^4.3.0", + "fast-glob": "^3.3.2", + "joi": "^17.2.1" + } + }, + "node_modules/@react-native-community/cli-config/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-config/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-config/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@react-native-community/cli-config/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@react-native-community/cli-config/node_modules/cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "dependencies": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@react-native-community/cli-config/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-config/node_modules/import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", + "dev": true, + "dependencies": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@react-native-community/cli-config/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@react-native-community/cli-config/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@react-native-community/cli-config/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-debugger-ui": { + "version": "13.6.8", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-13.6.8.tgz", + "integrity": "sha512-2cS+MX/Su6sVSjqpDftFOXbK7EuPg98xzsPkdPhkQnkZwvXqodK9CAMuDMbx3lBHHtrPrpMbBCpFmPN8iVOnlA==", + "dev": true, + "dependencies": { + "serve-static": "^1.13.1" + } + }, + "node_modules/@react-native-community/cli-doctor": { + "version": "13.6.8", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-13.6.8.tgz", + "integrity": "sha512-/3Vdy9J3hyiu0y3nd/CU3kBqPlTRxnLXg7V6jrA1jbTOlZAMyV9imEkrqEaGK0SMOyMhh9Pipf98Ozhk0Nl4QA==", + "dev": true, + "dependencies": { + "@react-native-community/cli-config": "13.6.8", + "@react-native-community/cli-platform-android": "13.6.8", + "@react-native-community/cli-platform-apple": "13.6.8", + "@react-native-community/cli-platform-ios": "13.6.8", + "@react-native-community/cli-tools": "13.6.8", + "chalk": "^4.1.2", + "command-exists": "^1.2.8", + "deepmerge": "^4.3.0", + "envinfo": "^7.10.0", + "execa": "^5.0.0", + "hermes-profile-transformer": "^0.0.6", + "node-stream-zip": "^1.9.1", + "ora": "^5.4.1", + "semver": "^7.5.2", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1", + "yaml": "^2.2.1" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@react-native-community/cli-doctor/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/ora/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/yaml": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz", + "integrity": "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@react-native-community/cli-hermes": { + "version": "13.6.8", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-13.6.8.tgz", + "integrity": "sha512-lZi/OBFuZUj5cLK94oEgtrtmxGoqeYVRcnHXl/R5c4put9PDl+qH2bEMlGZkFiw57ae3UZKr3TMk+1s4jh3FYQ==", + "dev": true, + "dependencies": { + "@react-native-community/cli-platform-android": "13.6.8", + "@react-native-community/cli-tools": "13.6.8", + "chalk": "^4.1.2", + "hermes-profile-transformer": "^0.0.6" + } + }, + "node_modules/@react-native-community/cli-hermes/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-hermes/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-hermes/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@react-native-community/cli-hermes/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@react-native-community/cli-hermes/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-hermes/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-platform-android": { + "version": "13.6.8", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-13.6.8.tgz", + "integrity": "sha512-vWrqeLRRTwp2kO33nbrAgbYn8HR2c2CpIfyVJY9Ckk7HGUSwDyxdcSu7YBvt2ShdfLZH0HctWFNXsgGrfg6BDw==", + "dev": true, + "dependencies": { + "@react-native-community/cli-tools": "13.6.8", + "chalk": "^4.1.2", + "execa": "^5.0.0", + "fast-glob": "^3.3.2", + "fast-xml-parser": "^4.2.4", + "logkitty": "^0.7.1" + } + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-platform-apple": { + "version": "13.6.8", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-apple/-/cli-platform-apple-13.6.8.tgz", + "integrity": "sha512-1JPohnlXPqU44zns3ALEzIbH2cKRw6JtEDJERgLuEUbs2r2NeJgqDbKyZ7fTTO8o+pegDnn6+Rr7qGVVOuUzzg==", + "dev": true, + "dependencies": { + "@react-native-community/cli-tools": "13.6.8", + "chalk": "^4.1.2", + "execa": "^5.0.0", + "fast-glob": "^3.3.2", + "fast-xml-parser": "^4.0.12", + "ora": "^5.4.1" + } + }, + "node_modules/@react-native-community/cli-platform-apple/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-platform-apple/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-platform-apple/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@react-native-community/cli-platform-apple/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@react-native-community/cli-platform-apple/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-platform-apple/node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-platform-apple/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-platform-apple/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-platform-ios": { + "version": "13.6.8", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-13.6.8.tgz", + "integrity": "sha512-/IIcIRM8qaoD7iZqsvtf6Qq1AwtChWYfB9sTn3mTiolZ5Zd5bXH37g+6liPfAICRkj2Ptq3iXmjrDVUQAxrOXw==", + "dev": true, + "dependencies": { + "@react-native-community/cli-platform-apple": "13.6.8" + } + }, + "node_modules/@react-native-community/cli-server-api": { + "version": "13.6.8", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-13.6.8.tgz", + "integrity": "sha512-Lx664oWTzpVfbKUTy+3GIX7e+Mt5Zn+zdkM4ehllNdik/lbB3tM9Nrg8PSvOfI+tTXs2w55+nIydLfH+0FqJVg==", + "dev": true, + "dependencies": { + "@react-native-community/cli-debugger-ui": "13.6.8", + "@react-native-community/cli-tools": "13.6.8", + "compression": "^1.7.1", + "connect": "^3.6.5", + "errorhandler": "^1.5.1", + "nocache": "^3.0.1", + "pretty-format": "^26.6.2", + "serve-static": "^1.13.1", + "ws": "^6.2.2" + } + }, + "node_modules/@react-native-community/cli-server-api/node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@react-native-community/cli-server-api/node_modules/@types/yargs": { + "version": "15.0.19", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz", + "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@react-native-community/cli-server-api/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-server-api/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-server-api/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@react-native-community/cli-server-api/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@react-native-community/cli-server-api/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-server-api/node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@react-native-community/cli-server-api/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "node_modules/@react-native-community/cli-server-api/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-server-api/node_modules/ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dev": true, + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/@react-native-community/cli-tools": { + "version": "13.6.8", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-13.6.8.tgz", + "integrity": "sha512-1MYlae9EkbjC7DBYOGMH5xF9yDoeNYUKgEdDjL6WAUBoF2gtwiZPM6igLKi/+dhb5sCtC7fiLrLi0Oevdf+RmQ==", + "dev": true, + "dependencies": { + "appdirsjs": "^1.2.4", + "chalk": "^4.1.2", + "execa": "^5.0.0", + "find-up": "^5.0.0", + "mime": "^2.4.1", + "node-fetch": "^2.6.0", + "open": "^6.2.0", + "ora": "^5.4.1", + "semver": "^7.5.2", + "shell-quote": "^1.7.3", + "sudo-prompt": "^9.0.0" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@react-native-community/cli-tools/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "dev": true, + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/sudo-prompt": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", + "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==", + "dev": true + }, + "node_modules/@react-native-community/cli-tools/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-types": { + "version": "13.6.8", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-13.6.8.tgz", + "integrity": "sha512-C4mVByy0i+/NPuPhdMLBR7ubEVkjVS1VwoQu/BoG1crJFNE+167QXAzH01eFbXndsjZaMWmD4Gerx7TYc6lHfA==", + "dev": true, + "dependencies": { + "joi": "^17.2.1" + } + }, + "node_modules/@react-native-community/cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@react-native-community/cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@react-native-community/cli/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@react-native-community/cli/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@react-native-community/cli/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/@react-native-community/cli/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@react-native-community/cli/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@react-native/assets-registry": { "version": "0.73.1", "dev": true, @@ -12069,6 +13272,172 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@react-native/community-cli-plugin": { + "version": "0.74.84", + "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.74.84.tgz", + "integrity": "sha512-GBKE+1sUh86fS2XXV46gMCNHMc1KetshMbYJ0AhDhldpaILZHqRBX50mdVsiYVvkzp4QjM0nmYqefuJ9NVwicQ==", + "dev": true, + "dependencies": { + "@react-native-community/cli-server-api": "13.6.8", + "@react-native-community/cli-tools": "13.6.8", + "@react-native/dev-middleware": "0.74.84", + "@react-native/metro-babel-transformer": "0.74.84", + "chalk": "^4.0.0", + "execa": "^5.1.1", + "metro": "^0.80.3", + "metro-config": "^0.80.3", + "metro-core": "^0.80.3", + "node-fetch": "^2.2.0", + "querystring": "^0.2.1", + "readline": "^1.3.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/@react-native/debugger-frontend": { + "version": "0.74.84", + "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.74.84.tgz", + "integrity": "sha512-YUEA03UNFbiYzHpYxlcS2D9+3eNT5YLGkl5yRg3nOSN6KbCc/OttGnNZme+tuSOJwjMN/vcvtDKYkTqjJw8U0A==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/@react-native/dev-middleware": { + "version": "0.74.84", + "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.74.84.tgz", + "integrity": "sha512-veYw/WmyrAOQHUiIeULzn2duJQnXDPiKq2jZ/lcmDo6jsLirpp+Q73lx09TYgy/oVoPRuV0nfmU3x9B6EV/7qQ==", + "dev": true, + "dependencies": { + "@isaacs/ttlcache": "^1.4.1", + "@react-native/debugger-frontend": "0.74.84", + "@rnx-kit/chromium-edge-launcher": "^1.0.0", + "chrome-launcher": "^0.15.2", + "connect": "^3.6.5", + "debug": "^2.2.0", + "node-fetch": "^2.2.0", + "nullthrows": "^1.1.1", + "open": "^7.0.3", + "selfsigned": "^2.4.1", + "serve-static": "^1.13.1", + "temp-dir": "^2.0.0", + "ws": "^6.2.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@react-native/community-cli-plugin/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/@react-native/community-cli-plugin/node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dev": true, + "dependencies": { + "async-limiter": "~1.0.0" + } + }, "node_modules/@react-native/debugger-frontend": { "version": "0.73.3", "dev": true, @@ -12140,11 +13509,164 @@ "async-limiter": "~1.0.0" } }, + "node_modules/@react-native/gradle-plugin": { + "version": "0.74.84", + "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.74.84.tgz", + "integrity": "sha512-wYWC5WWXqzCCe4PDogz9pNc4xH5ZamahW5XGSbrrYJ5V3walZ+7z43V6iEBJkZbLjj9YBcSttkXYGr1Xh4veAg==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/js-polyfills": { + "version": "0.74.84", + "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.74.84.tgz", + "integrity": "sha512-+PgxuUjBw9JVlz6m4ECsIJMLbDopnr4rpLmsG32hQaJrg0wMuvHtsgAY/J/aVCSG2GNUXexfjrnhc+O9yGOZXQ==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/metro-babel-transformer": { + "version": "0.74.84", + "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.74.84.tgz", + "integrity": "sha512-YtVGq7jkgyUECv5yt4BOFbOXyW4ddUn8+dnwGGpJKdfhXYL5o5++AxNdE+2x+SZdkj3JUVekGKPwRabFECABaw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.20.0", + "@react-native/babel-preset": "0.74.84", + "hermes-parser": "0.19.1", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/@react-native/metro-babel-transformer/node_modules/@react-native/babel-plugin-codegen": { + "version": "0.74.84", + "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.74.84.tgz", + "integrity": "sha512-UR4uiii5szIJA84mSC6GJOfYKDq7/ThyetOQT62+BBcyGeHVtHlNLNRzgaMeLqIQaT8Fq4pccMI+7QqLOMXzdw==", + "dev": true, + "dependencies": { + "@react-native/codegen": "0.74.84" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/metro-babel-transformer/node_modules/@react-native/babel-preset": { + "version": "0.74.84", + "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.74.84.tgz", + "integrity": "sha512-WUfu6Y4aGuVdocQZvx33BJiQWFH6kRCHYbZfBn2psgFrSRLgQWEQrDCxqPFObNAVSayM0rNhp2FvI5K/Eyeqlg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.20.0", + "@babel/plugin-proposal-async-generator-functions": "^7.0.0", + "@babel/plugin-proposal-class-properties": "^7.18.0", + "@babel/plugin-proposal-export-default-from": "^7.0.0", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.0", + "@babel/plugin-proposal-numeric-separator": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.20.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", + "@babel/plugin-proposal-optional-chaining": "^7.20.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-default-from": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.18.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-syntax-optional-chaining": "^7.0.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-async-to-generator": "^7.20.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.20.0", + "@babel/plugin-transform-flow-strip-types": "^7.20.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.0.0", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.11", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-react-jsx-self": "^7.0.0", + "@babel/plugin-transform-react-jsx-source": "^7.0.0", + "@babel/plugin-transform-runtime": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-sticky-regex": "^7.0.0", + "@babel/plugin-transform-typescript": "^7.5.0", + "@babel/plugin-transform-unicode-regex": "^7.0.0", + "@babel/template": "^7.0.0", + "@react-native/babel-plugin-codegen": "0.74.84", + "babel-plugin-transform-flow-enums": "^0.0.2", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/@react-native/metro-babel-transformer/node_modules/@react-native/codegen": { + "version": "0.74.84", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.74.84.tgz", + "integrity": "sha512-0hXlnu9i0o8v+gXKQi+x6T471L85kCDwW4WrJiYAeOheWrQdNNW6rC3g8+LL7HXAf7QcHGU/8/d57iYfdVK2BQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.0", + "glob": "^7.1.1", + "hermes-parser": "0.19.1", + "invariant": "^2.2.4", + "jscodeshift": "^0.14.0", + "mkdirp": "^0.5.1", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@babel/preset-env": "^7.1.6" + } + }, + "node_modules/@react-native/metro-babel-transformer/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@react-native/normalize-color": { "version": "2.1.0", "dev": true, "license": "MIT" }, + "node_modules/@react-native/normalize-colors": { + "version": "0.74.84", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.74.84.tgz", + "integrity": "sha512-Y5W6x8cC5RuakUcTVUFNAIhUZ/tYpuqHZlRBoAuakrTwVuoNHXfQki8lj1KsYU7rW6e3VWgdEx33AfOQpdNp6A==", + "dev": true + }, "node_modules/@react-stately/calendar": { "version": "3.5.1", "license": "Apache-2.0", @@ -13059,6 +14581,72 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@rnx-kit/chromium-edge-launcher": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rnx-kit/chromium-edge-launcher/-/chromium-edge-launcher-1.0.0.tgz", + "integrity": "sha512-lzD84av1ZQhYUS+jsGqJiCMaJO2dn9u+RTT9n9q6D3SaKVwWqv+7AoRKqBu19bkwyE+iFRl1ymr40QS90jVFYg==", + "dev": true, + "dependencies": { + "@types/node": "^18.0.0", + "escape-string-regexp": "^4.0.0", + "is-wsl": "^2.2.0", + "lighthouse-logger": "^1.0.0", + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=14.15" + } + }, + "node_modules/@rnx-kit/chromium-edge-launcher/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@rnx-kit/chromium-edge-launcher/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rnx-kit/chromium-edge-launcher/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@rollup/plugin-alias": { "version": "5.1.0", "license": "MIT", @@ -14987,6 +16575,15 @@ "node": ">= 6" } }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/normalize-package-data": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", @@ -16667,6 +18264,76 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ansi-fragments": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-fragments/-/ansi-fragments-0.2.1.tgz", + "integrity": "sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==", + "dev": true, + "dependencies": { + "colorette": "^1.0.7", + "slice-ansi": "^2.0.0", + "strip-ansi": "^5.0.0" + } + }, + "node_modules/ansi-fragments/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-fragments/node_modules/astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-fragments/node_modules/colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", + "dev": true + }, + "node_modules/ansi-fragments/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-fragments/node_modules/slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-fragments/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/ansi-html-community": { "version": "0.0.8", "dev": true, @@ -16725,6 +18392,12 @@ "node": ">=8" } }, + "node_modules/appdirsjs": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/appdirsjs/-/appdirsjs-1.2.7.tgz", + "integrity": "sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw==", + "dev": true + }, "node_modules/append-field": { "version": "1.0.0", "dev": true, @@ -17157,7 +18830,6 @@ "version": "0.15.2", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "tslib": "^2.0.1" }, @@ -18457,8 +20129,7 @@ "node_modules/async-limiter": { "version": "1.0.1", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/async-listen": { "version": "3.0.1", @@ -18611,7 +20282,6 @@ "version": "7.0.0-bridge.0", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "@babel/core": "^7.0.0-0" } @@ -18902,7 +20572,6 @@ "version": "0.0.2", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/plugin-syntax-flow": "^7.12.1" } @@ -19956,6 +21625,39 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", + "dev": true, + "dependencies": { + "callsites": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-callsite/node_modules/callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", + "dev": true, + "dependencies": { + "caller-callsite": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/callsites": { "version": "3.1.0", "license": "MIT", @@ -20298,7 +22000,6 @@ "version": "0.15.2", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -21355,7 +23056,6 @@ "version": "3.7.0", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "debug": "2.6.9", "finalhandler": "1.1.2", @@ -21378,7 +23078,6 @@ "version": "2.6.9", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -21386,8 +23085,7 @@ "node_modules/connect/node_modules/ms": { "version": "2.0.0", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/consola": { "version": "3.2.3", @@ -23660,6 +25358,12 @@ "version": "1.0.0", "license": "MIT" }, + "node_modules/denodeify": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", + "integrity": "sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==", + "dev": true + }, "node_modules/denque": { "version": "2.1.0", "license": "Apache-2.0", @@ -24391,6 +26095,19 @@ "stackframe": "^1.3.4" } }, + "node_modules/errorhandler": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz", + "integrity": "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==", + "dev": true, + "dependencies": { + "accepts": "~1.3.7", + "escape-html": "~1.0.3" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/es-abstract": { "version": "1.23.3", "license": "MIT", @@ -26646,6 +28363,28 @@ "version": "2.2.0", "license": "MIT" }, + "node_modules/fast-xml-parser": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.0.tgz", + "integrity": "sha512-kLY3jFlwIYwBNDojclKsNAC12sfD6NwW74QB2CoNGPvtVxjliYehVunB3HYyNi+n4Tt1dAcgwYvmKF/Z18flqg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, "node_modules/fastest-levenshtein": { "version": "1.0.16", "license": "MIT", @@ -26901,7 +28640,6 @@ "version": "1.1.2", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -26919,7 +28657,6 @@ "version": "2.6.9", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -26927,14 +28664,12 @@ "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/finalhandler/node_modules/on-finished": { "version": "2.3.0", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ee-first": "1.1.1" }, @@ -27063,6 +28798,12 @@ "version": "3.2.7", "license": "ISC" }, + "node_modules/flow-enums-runtime": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", + "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", + "dev": true + }, "node_modules/flattie": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/flattie/-/flattie-1.1.1.tgz", @@ -29677,6 +31418,42 @@ "tslib": "^2.0.3" } }, + "node_modules/hermes-estree": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.19.1.tgz", + "integrity": "sha512-daLGV3Q2MKk8w4evNMKwS8zBE/rcpA800nu1Q5kM08IKijoSnPe9Uo1iIxzPKRkn95IxxsgBMPeYHt3VG4ej2g==", + "dev": true + }, + "node_modules/hermes-parser": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.19.1.tgz", + "integrity": "sha512-Vp+bXzxYJWrpEuJ/vXxUsLnt0+y4q9zyi4zUlkLqD8FKv4LjIfOvP69R/9Lty3dCyKh0E2BU7Eypqr63/rKT/A==", + "dev": true, + "dependencies": { + "hermes-estree": "0.19.1" + } + }, + "node_modules/hermes-profile-transformer": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/hermes-profile-transformer/-/hermes-profile-transformer-0.0.6.tgz", + "integrity": "sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ==", + "dev": true, + "dependencies": { + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/hermes-profile-transformer/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/hexoid": { "version": "1.0.0", "dev": true, @@ -30136,6 +31913,21 @@ "node": ">=10" } }, + "node_modules/image-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz", + "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==", + "dev": true, + "dependencies": { + "queue": "6.0.2" + }, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, "node_modules/immer": { "version": "9.0.21", "dev": true, @@ -31022,6 +32814,15 @@ "node": ">= 0.4" } }, + "node_modules/is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-docker": { "version": "2.2.1", "license": "MIT", @@ -33475,17 +35276,21 @@ "dev": true, "license": "MIT" }, + "node_modules/jsc-android": { + "version": "250231.0.0", + "resolved": "https://registry.npmjs.org/jsc-android/-/jsc-android-250231.0.0.tgz", + "integrity": "sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw==", + "dev": true + }, "node_modules/jsc-safe-url": { "version": "0.2.4", "dev": true, - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/jscodeshift": { "version": "0.14.0", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.13.16", "@babel/parser": "^7.13.16", @@ -33518,7 +35323,6 @@ "version": "4.3.0", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -33533,7 +35337,6 @@ "version": "4.1.2", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -33549,7 +35352,6 @@ "version": "2.0.1", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-name": "~1.1.4" }, @@ -33560,20 +35362,36 @@ "node_modules/jscodeshift/node_modules/color-name": { "version": "1.1.4", "dev": true, + "license": "MIT" + }, + "node_modules/jscodeshift/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, "license": "MIT", - "peer": true + "engines": { + "node": ">=8" + } }, "node_modules/jscodeshift/node_modules/signal-exit": { "version": "3.0.7", "dev": true, - "license": "ISC", - "peer": true + "license": "ISC" + }, + "node_modules/jscodeshift/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, "node_modules/jscodeshift/node_modules/write-file-atomic": { "version": "2.4.3", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", @@ -33962,7 +35780,6 @@ "version": "1.4.2", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "debug": "^2.6.9", "marky": "^1.2.2" @@ -33972,7 +35789,6 @@ "version": "2.6.9", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -33980,8 +35796,7 @@ "node_modules/lighthouse-logger/node_modules/ms": { "version": "2.0.0", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/lightningcss": { "version": "1.19.0", @@ -34631,6 +36446,12 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", + "dev": true + }, "node_modules/lodash.truncate": { "version": "4.4.2", "dev": true, @@ -34808,6 +36629,143 @@ "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" }, + "node_modules/logkitty": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/logkitty/-/logkitty-0.7.1.tgz", + "integrity": "sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==", + "dev": true, + "dependencies": { + "ansi-fragments": "^0.2.1", + "dayjs": "^1.8.15", + "yargs": "^15.1.0" + }, + "bin": { + "logkitty": "bin/logkitty.js" + } + }, + "node_modules/logkitty/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/logkitty/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/logkitty/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/logkitty/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/logkitty/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/logkitty/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/logkitty/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/logkitty/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/logkitty/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/logkitty/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/longest-streak": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", @@ -35080,8 +37038,7 @@ "node_modules/marky": { "version": "1.2.5", "dev": true, - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/md5": { "version": "2.3.0", @@ -35403,6 +37360,12 @@ "node": ">= 4.0.0" } }, + "node_modules/memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", + "dev": true + }, "node_modules/memoizee": { "version": "0.4.15", "dev": true, @@ -36062,6 +38025,615 @@ "@types/ms": "*" } }, + "node_modules/metro": { + "version": "0.80.9", + "resolved": "https://registry.npmjs.org/metro/-/metro-0.80.9.tgz", + "integrity": "sha512-Bc57Xf3GO2Xe4UWQsBj/oW6YfLPABEu8jfDVDiNmJvoQW4CO34oDPuYKe4KlXzXhcuNsqOtSxpbjCRRVjhhREg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@babel/core": "^7.20.0", + "@babel/generator": "^7.20.0", + "@babel/parser": "^7.20.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.20.0", + "@babel/types": "^7.20.0", + "accepts": "^1.3.7", + "chalk": "^4.0.0", + "ci-info": "^2.0.0", + "connect": "^3.6.5", + "debug": "^2.2.0", + "denodeify": "^1.2.1", + "error-stack-parser": "^2.0.6", + "graceful-fs": "^4.2.4", + "hermes-parser": "0.20.1", + "image-size": "^1.0.2", + "invariant": "^2.2.4", + "jest-worker": "^29.6.3", + "jsc-safe-url": "^0.2.2", + "lodash.throttle": "^4.1.1", + "metro-babel-transformer": "0.80.9", + "metro-cache": "0.80.9", + "metro-cache-key": "0.80.9", + "metro-config": "0.80.9", + "metro-core": "0.80.9", + "metro-file-map": "0.80.9", + "metro-resolver": "0.80.9", + "metro-runtime": "0.80.9", + "metro-source-map": "0.80.9", + "metro-symbolicate": "0.80.9", + "metro-transform-plugins": "0.80.9", + "metro-transform-worker": "0.80.9", + "mime-types": "^2.1.27", + "node-fetch": "^2.2.0", + "nullthrows": "^1.1.1", + "rimraf": "^3.0.2", + "serialize-error": "^2.1.0", + "source-map": "^0.5.6", + "strip-ansi": "^6.0.0", + "throat": "^5.0.0", + "ws": "^7.5.1", + "yargs": "^17.6.2" + }, + "bin": { + "metro": "src/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro-babel-transformer": { + "version": "0.80.9", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.80.9.tgz", + "integrity": "sha512-d76BSm64KZam1nifRZlNJmtwIgAeZhZG3fi3K+EmPOlrR8rDtBxQHDSN3fSGeNB9CirdTyabTMQCkCup6BXFSQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.20.0", + "hermes-parser": "0.20.1", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro-babel-transformer/node_modules/hermes-estree": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.20.1.tgz", + "integrity": "sha512-SQpZK4BzR48kuOg0v4pb3EAGNclzIlqMj3Opu/mu7bbAoFw6oig6cEt/RAi0zTFW/iW6Iz9X9ggGuZTAZ/yZHg==", + "dev": true + }, + "node_modules/metro-babel-transformer/node_modules/hermes-parser": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.20.1.tgz", + "integrity": "sha512-BL5P83cwCogI8D7rrDCgsFY0tdYUtmFP9XaXtl2IQjC+2Xo+4okjfXintlTxcIwl4qeGddEl28Z11kbVIw0aNA==", + "dev": true, + "dependencies": { + "hermes-estree": "0.20.1" + } + }, + "node_modules/metro-cache": { + "version": "0.80.9", + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.80.9.tgz", + "integrity": "sha512-ujEdSI43QwI+Dj2xuNax8LMo8UgKuXJEdxJkzGPU6iIx42nYa1byQ+aADv/iPh5sh5a//h5FopraW5voXSgm2w==", + "dev": true, + "dependencies": { + "metro-core": "0.80.9", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro-cache-key": { + "version": "0.80.9", + "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.80.9.tgz", + "integrity": "sha512-hRcYGhEiWIdM87hU0fBlcGr+tHDEAT+7LYNCW89p5JhErFt/QaAkVx4fb5bW3YtXGv5BTV7AspWPERoIb99CXg==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro-cache/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/metro-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/metro-config": { + "version": "0.80.9", + "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.80.9.tgz", + "integrity": "sha512-28wW7CqS3eJrunRGnsibWldqgwRP9ywBEf7kg+uzUHkSFJNKPM1K3UNSngHmH0EZjomizqQA2Zi6/y6VdZMolg==", + "dev": true, + "dependencies": { + "connect": "^3.6.5", + "cosmiconfig": "^5.0.5", + "jest-validate": "^29.6.3", + "metro": "0.80.9", + "metro-cache": "0.80.9", + "metro-core": "0.80.9", + "metro-runtime": "0.80.9" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro-config/node_modules/cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "dependencies": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/metro-config/node_modules/import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", + "dev": true, + "dependencies": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/metro-config/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/metro-config/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/metro-core": { + "version": "0.80.9", + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.80.9.tgz", + "integrity": "sha512-tbltWQn+XTdULkGdzHIxlxk4SdnKxttvQQV3wpqqFbHDteR4gwCyTR2RyYJvxgU7HELfHtrVbqgqAdlPByUSbg==", + "dev": true, + "dependencies": { + "lodash.throttle": "^4.1.1", + "metro-resolver": "0.80.9" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro-file-map": { + "version": "0.80.9", + "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.80.9.tgz", + "integrity": "sha512-sBUjVtQMHagItJH/wGU9sn3k2u0nrCl0CdR4SFMO1tksXLKbkigyQx4cbpcyPVOAmGTVuy3jyvBlELaGCAhplQ==", + "dev": true, + "dependencies": { + "anymatch": "^3.0.3", + "debug": "^2.2.0", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.4", + "invariant": "^2.2.4", + "jest-worker": "^29.6.3", + "micromatch": "^4.0.4", + "node-abort-controller": "^3.1.1", + "nullthrows": "^1.1.1", + "walker": "^1.0.7" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/metro-file-map/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/metro-file-map/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/metro-file-map/node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/metro-file-map/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/metro-file-map/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/metro-minify-terser": { + "version": "0.80.9", + "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.80.9.tgz", + "integrity": "sha512-FEeCeFbkvvPuhjixZ1FYrXtO0araTpV6UbcnGgDUpH7s7eR5FG/PiJz3TsuuPP/HwCK19cZtQydcA2QrCw446A==", + "dev": true, + "dependencies": { + "terser": "^5.15.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro-resolver": { + "version": "0.80.9", + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.80.9.tgz", + "integrity": "sha512-wAPIjkN59BQN6gocVsAvvpZ1+LQkkqUaswlT++cJafE/e54GoVkMNCmrR4BsgQHr9DknZ5Um/nKueeN7kaEz9w==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro-runtime": { + "version": "0.80.9", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.80.9.tgz", + "integrity": "sha512-8PTVIgrVcyU+X/rVCy/9yxNlvXsBCk5JwwkbAm/Dm+Abo6NBGtNjWF0M1Xo/NWCb4phamNWcD7cHdR91HhbJvg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro-source-map": { + "version": "0.80.9", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.80.9.tgz", + "integrity": "sha512-RMn+XS4VTJIwMPOUSj61xlxgBvPeY4G6s5uIn6kt6HB6A/k9ekhr65UkkDD7WzHYs3a9o869qU8tvOZvqeQzgw==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.20.0", + "@babel/types": "^7.20.0", + "invariant": "^2.2.4", + "metro-symbolicate": "0.80.9", + "nullthrows": "^1.1.1", + "ob1": "0.80.9", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro-symbolicate": { + "version": "0.80.9", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.80.9.tgz", + "integrity": "sha512-Ykae12rdqSs98hg41RKEToojuIW85wNdmSe/eHUgMkzbvCFNVgcC0w3dKZEhSsqQOXapXRlLtHkaHLil0UD/EA==", + "dev": true, + "dependencies": { + "invariant": "^2.2.4", + "metro-source-map": "0.80.9", + "nullthrows": "^1.1.1", + "source-map": "^0.5.6", + "through2": "^2.0.1", + "vlq": "^1.0.0" + }, + "bin": { + "metro-symbolicate": "src/index.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro-transform-plugins": { + "version": "0.80.9", + "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.80.9.tgz", + "integrity": "sha512-UlDk/uc8UdfLNJhPbF3tvwajyuuygBcyp+yBuS/q0z3QSuN/EbLllY3rK8OTD9n4h00qZ/qgxGv/lMFJkwP4vg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.20.0", + "@babel/generator": "^7.20.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.20.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro-transform-worker": { + "version": "0.80.9", + "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.80.9.tgz", + "integrity": "sha512-c/IrzMUVnI0hSVVit4TXzt3A1GiUltGVlzCmLJWxNrBGHGrJhvgePj38+GXl1Xf4Fd4vx6qLUkKMQ3ux73bFLQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.20.0", + "@babel/generator": "^7.20.0", + "@babel/parser": "^7.20.0", + "@babel/types": "^7.20.0", + "metro": "0.80.9", + "metro-babel-transformer": "0.80.9", + "metro-cache": "0.80.9", + "metro-cache-key": "0.80.9", + "metro-minify-terser": "0.80.9", + "metro-source-map": "0.80.9", + "metro-transform-plugins": "0.80.9", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/metro/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/metro/node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "node_modules/metro/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/metro/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/metro/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/metro/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/metro/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/metro/node_modules/hermes-estree": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.20.1.tgz", + "integrity": "sha512-SQpZK4BzR48kuOg0v4pb3EAGNclzIlqMj3Opu/mu7bbAoFw6oig6cEt/RAi0zTFW/iW6Iz9X9ggGuZTAZ/yZHg==", + "dev": true + }, + "node_modules/metro/node_modules/hermes-parser": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.20.1.tgz", + "integrity": "sha512-BL5P83cwCogI8D7rrDCgsFY0tdYUtmFP9XaXtl2IQjC+2Xo+4okjfXintlTxcIwl4qeGddEl28Z11kbVIw0aNA==", + "dev": true, + "dependencies": { + "hermes-estree": "0.20.1" + } + }, + "node_modules/metro/node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/metro/node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/metro/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/metro/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/metro/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/metro/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/micromatch": { "version": "4.0.5", "license": "MIT", @@ -36645,6 +39217,15 @@ "tslib": "^2.0.3" } }, + "node_modules/nocache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/nocache/-/nocache-3.0.4.tgz", + "integrity": "sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==", + "dev": true, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/nock": { "version": "13.5.4", "dev": true, @@ -36669,6 +39250,12 @@ "node": ">=10" } }, + "node_modules/node-abort-controller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", + "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", + "dev": true + }, "node_modules/node-addon-api": { "version": "7.1.0", "license": "MIT", @@ -36807,6 +39394,19 @@ "version": "2.0.14", "license": "MIT" }, + "node_modules/node-stream-zip": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz", + "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==", + "dev": true, + "engines": { + "node": ">=0.12.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/antelle" + } + }, "node_modules/node-watch": { "version": "0.7.3", "dev": true, @@ -39828,11 +42428,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/querystring": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", + "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, "node_modules/querystringify": { "version": "2.2.0", "dev": true, "license": "MIT" }, + "node_modules/queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "dev": true, + "dependencies": { + "inherits": "~2.0.3" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "funding": [ @@ -40175,6 +42794,48 @@ "node": ">= 12.13.0" } }, + "node_modules/react-dev-utils/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/react-devtools-core": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-5.2.0.tgz", + "integrity": "sha512-vZK+/gvxxsieAoAyYaiRIVFxlajb7KXhgBDV7OsoMzaAE+IqGpoxusBjIgq5ibqA2IloKu0p9n7tE68z1xs18A==", + "dev": true, + "dependencies": { + "shell-quote": "^1.6.1", + "ws": "^7" + } + }, + "node_modules/react-devtools-core/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/react-dom": { "version": "18.3.1", "license": "MIT", @@ -40338,6 +42999,19 @@ "node": ">=0.4.0" } }, + "node_modules/react-shallow-renderer": { + "version": "16.15.0", + "resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz", + "integrity": "sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==", + "dev": true, + "dependencies": { + "object-assign": "^4.1.1", + "react-is": "^16.12.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/react-stately": { "version": "3.31.1", "license": "Apache-2.0", @@ -40626,6 +43300,12 @@ "node": ">=8.10.0" } }, + "node_modules/readline": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz", + "integrity": "sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==", + "dev": true + }, "node_modules/real-require": { "version": "0.2.0", "license": "MIT", @@ -40637,7 +43317,6 @@ "version": "0.21.5", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ast-types": "0.15.2", "esprima": "~4.0.0", @@ -40652,7 +43331,6 @@ "version": "0.6.1", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -41660,10 +44338,12 @@ "license": "MIT" }, "node_modules/selfsigned": { - "version": "2.1.1", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", "dev": true, - "license": "MIT", "dependencies": { + "@types/node-forge": "^1.3.0", "node-forge": "^1" }, "engines": { @@ -41780,6 +44460,15 @@ "upper-case-first": "^2.0.2" } }, + "node_modules/serialize-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", + "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/serialize-javascript": { "version": "5.0.1", "dev": true, @@ -42813,7 +45502,6 @@ "version": "0.1.10", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "type-fest": "^0.7.1" }, @@ -42825,7 +45513,6 @@ "version": "0.7.1", "dev": true, "license": "(MIT OR CC0-1.0)", - "peer": true, "engines": { "node": ">=8" } @@ -43202,6 +45889,12 @@ "version": "9.0.0", "license": "MIT" }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", + "dev": true + }, "node_modules/strtok3": { "version": "6.3.0", "dev": true, @@ -43781,7 +46474,6 @@ "version": "0.8.4", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "rimraf": "~2.6.2" }, @@ -43793,7 +46485,6 @@ "version": "2.0.0", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -43802,7 +46493,6 @@ "version": "7.2.3", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -43822,7 +46512,6 @@ "version": "2.6.3", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "glob": "^7.1.3" }, @@ -44090,6 +46779,12 @@ "real-require": "^0.2.0" } }, + "node_modules/throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "dev": true + }, "node_modules/throttleit": { "version": "1.0.1", "dev": true, @@ -46945,6 +49640,12 @@ "node": ">=4.0" } }, + "node_modules/vlq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", + "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", + "dev": true + }, "node_modules/w3c-xmlserializer": { "version": "4.0.0", "dev": true, @@ -47548,6 +50249,12 @@ "node": ">=0.10.0" } }, + "node_modules/whatwg-fetch": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", + "dev": true + }, "node_modules/whatwg-mimetype": { "version": "3.0.0", "dev": true, @@ -50315,6 +53022,7 @@ "@clerk/shared": "2.4.0", "@clerk/types": "4.9.0", "base-64": "^1.0.0", + "react": "^18.2.0", "react-native-url-polyfill": "2.0.0", "tslib": "2.4.1" }, @@ -50322,10 +53030,11 @@ "@clerk/eslint-config-custom": "*", "@types/base-64": "^1.0.2", "@types/node": "^20.11.24", - "@types/react": "*", - "@types/react-dom": "*", + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0", "expo-auth-session": "^5.4.0", "expo-web-browser": "^12.8.2", + "react-native": "^0.74.2", "typescript": "*" }, "engines": { @@ -50338,6 +53047,75 @@ "react-dom": ">=18" } }, + "packages/expo/node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "packages/expo/node_modules/@react-native/assets-registry": { + "version": "0.74.84", + "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.74.84.tgz", + "integrity": "sha512-dzUhwyaX04QosWZ8zyaaNB/WYZIdeDN1lcpfQbqiOhZJShRH+FLTDVONE/dqlMQrP+EO7lDqF0RrlIt9lnOCQQ==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "packages/expo/node_modules/@react-native/codegen": { + "version": "0.74.84", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.74.84.tgz", + "integrity": "sha512-0hXlnu9i0o8v+gXKQi+x6T471L85kCDwW4WrJiYAeOheWrQdNNW6rC3g8+LL7HXAf7QcHGU/8/d57iYfdVK2BQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.0", + "glob": "^7.1.1", + "hermes-parser": "0.19.1", + "invariant": "^2.2.4", + "jscodeshift": "^0.14.0", + "mkdirp": "^0.5.1", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@babel/preset-env": "^7.1.6" + } + }, + "packages/expo/node_modules/@react-native/virtualized-lists": { + "version": "0.74.84", + "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.74.84.tgz", + "integrity": "sha512-XcV+qdqt2WihaY4iRm/M1FdSy+18lecU9mRXNmy9YK8g9Th/8XbNtmmKI0qWBx3KxyuXMH/zd0ps05YTrX16kw==", + "dev": true, + "dependencies": { + "invariant": "^2.2.4", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/react": "^18.2.6", + "react": "*", + "react-native": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "packages/expo/node_modules/@types/node": { "version": "20.11.24", "dev": true, @@ -50346,6 +53124,70 @@ "undici-types": "~5.26.4" } }, + "packages/expo/node_modules/@types/yargs": { + "version": "15.0.19", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz", + "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "packages/expo/node_modules/anser": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", + "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", + "dev": true + }, + "packages/expo/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "packages/expo/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "packages/expo/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "packages/expo/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "packages/expo/node_modules/expo-auth-session": { "version": "5.4.0", "dev": true, @@ -50387,10 +53229,171 @@ "invariant": "^2.2.4" } }, + "packages/expo/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/expo/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "packages/expo/node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "packages/expo/node_modules/promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "dev": true, + "dependencies": { + "asap": "~2.0.6" + } + }, + "packages/expo/node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "packages/expo/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "packages/expo/node_modules/react-native": { + "version": "0.74.2", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.74.2.tgz", + "integrity": "sha512-EBMBjPPL4/GjHMP4NqsZabT3gI5WU9cSmduABGAGrd8uIcmTZ5F2Ng9k6gFmRm7n8e8CULxDNu98ZpQfBjl7Bw==", + "dev": true, + "dependencies": { + "@jest/create-cache-key-function": "^29.6.3", + "@react-native-community/cli": "13.6.8", + "@react-native-community/cli-platform-android": "13.6.8", + "@react-native-community/cli-platform-ios": "13.6.8", + "@react-native/assets-registry": "0.74.84", + "@react-native/codegen": "0.74.84", + "@react-native/community-cli-plugin": "0.74.84", + "@react-native/gradle-plugin": "0.74.84", + "@react-native/js-polyfills": "0.74.84", + "@react-native/normalize-colors": "0.74.84", + "@react-native/virtualized-lists": "0.74.84", + "abort-controller": "^3.0.0", + "anser": "^1.4.9", + "ansi-regex": "^5.0.0", + "base64-js": "^1.5.1", + "chalk": "^4.0.0", + "event-target-shim": "^5.0.1", + "flow-enums-runtime": "^0.0.6", + "invariant": "^2.2.4", + "jest-environment-node": "^29.6.3", + "jsc-android": "^250231.0.0", + "memoize-one": "^5.0.0", + "metro-runtime": "^0.80.3", + "metro-source-map": "^0.80.3", + "mkdirp": "^0.5.1", + "nullthrows": "^1.1.1", + "pretty-format": "^26.5.2", + "promise": "^8.3.0", + "react-devtools-core": "^5.0.0", + "react-refresh": "^0.14.0", + "react-shallow-renderer": "^16.15.0", + "regenerator-runtime": "^0.13.2", + "scheduler": "0.24.0-canary-efb381bbf-20230505", + "stacktrace-parser": "^0.1.10", + "whatwg-fetch": "^3.0.0", + "ws": "^6.2.2", + "yargs": "^17.6.2" + }, + "bin": { + "react-native": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/react": "^18.2.6", + "react": "18.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "packages/expo/node_modules/scheduler": { + "version": "0.24.0-canary-efb381bbf-20230505", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.24.0-canary-efb381bbf-20230505.tgz", + "integrity": "sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA==", + "dev": true, + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "packages/expo/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "packages/expo/node_modules/tslib": { "version": "2.4.1", "license": "0BSD" }, + "packages/expo/node_modules/ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dev": true, + "dependencies": { + "async-limiter": "~1.0.0" + } + }, "packages/express": { "name": "@clerk/express", "version": "0.0.19", @@ -51431,6 +54434,20 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "packages/tanstack-start/node_modules/@clerk/types": { + "version": "4.5.1", + "license": "MIT", + "dependencies": { + "csstype": "3.1.1" + }, + "engines": { + "node": ">=18.17.0" + } + }, + "packages/tanstack-start/node_modules/csstype": { + "version": "3.1.1", + "license": "MIT" + }, "packages/tanstack-start/node_modules/tslib": { "version": "2.4.1", "license": "0BSD" diff --git a/packages/expo/package.json b/packages/expo/package.json index cb0ad420ad4..3bb8d2fca3a 100644 --- a/packages/expo/package.json +++ b/packages/expo/package.json @@ -53,6 +53,7 @@ "@clerk/shared": "2.4.0", "@clerk/types": "4.9.0", "base-64": "^1.0.0", + "react": "^18.2.0", "react-native-url-polyfill": "2.0.0", "tslib": "2.4.1" }, @@ -60,11 +61,11 @@ "@clerk/eslint-config-custom": "*", "@types/base-64": "^1.0.2", "@types/node": "^20.11.24", - "@types/react": "*", - "@types/react-dom": "*", + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0", "expo-auth-session": "^5.4.0", "expo-web-browser": "^12.8.2", - "react-native": "^0.74.1", + "react-native": "^0.74.2", "typescript": "*" }, "peerDependencies": { From 847278f125afb261fbb9aeb709ac591c91a22cc5 Mon Sep 17 00:00:00 2001 From: Vaggelis Yfantis Date: Tue, 25 Jun 2024 12:14:03 +0300 Subject: [PATCH 13/61] chore: Update dependencies --- package-lock.json | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index dc71772ff3e..69b9adb7ef8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7726,6 +7726,15 @@ "devOptional": true, "license": "MIT" }, + "node_modules/@jest/core/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "devOptional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/@jest/core/node_modules/pretty-format": { "version": "29.7.0", "devOptional": true, @@ -42809,7 +42818,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-5.2.0.tgz", "integrity": "sha512-vZK+/gvxxsieAoAyYaiRIVFxlajb7KXhgBDV7OsoMzaAE+IqGpoxusBjIgq5ibqA2IloKu0p9n7tE68z1xs18A==", - "dev": true, + "devOptional": true, "dependencies": { "shell-quote": "^1.6.1", "ws": "^7" @@ -42819,7 +42828,7 @@ "version": "7.5.9", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, + "devOptional": true, "engines": { "node": ">=8.3.0" }, @@ -44678,7 +44687,7 @@ }, "node_modules/shell-quote": { "version": "1.8.1", - "dev": true, + "devOptional": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" From 7a05874c0d93229ea6e208c9d13a49bcef8463c5 Mon Sep 17 00:00:00 2001 From: Vaggelis Yfantis Date: Tue, 25 Jun 2024 18:04:12 +0300 Subject: [PATCH 14/61] feat(expo): Introducing web subpath for web only APIs & Components --- packages/expo/package.json | 8 +++++++- packages/expo/src/components/{index.tsx => index.ts} | 1 - packages/expo/src/index.ts | 2 +- packages/expo/src/provider/ClerkProvider.tsx | 6 ++---- packages/expo/src/provider/singleton.ts | 6 ++---- packages/expo/src/web/index.ts | 2 ++ packages/expo/src/{components => web}/uiComponents.tsx | 0 packages/expo/web/package.json | 6 ++++++ 8 files changed, 20 insertions(+), 11 deletions(-) rename packages/expo/src/components/{index.tsx => index.ts} (53%) create mode 100644 packages/expo/src/web/index.ts rename packages/expo/src/{components => web}/uiComponents.tsx (100%) create mode 100644 packages/expo/web/package.json diff --git a/packages/expo/package.json b/packages/expo/package.json index 3bb8d2fca3a..b82808c52f6 100644 --- a/packages/expo/package.json +++ b/packages/expo/package.json @@ -29,12 +29,18 @@ "react-native": "./src/index.ts", "import": "./dist/index.js", "require": "./dist/index.js" + }, + "./web": { + "types": "./dist/web/index.d.ts", + "react-native": "./src/web/index.ts", + "import": "./dist/web/index.js", + "require": "./dist/web/index.js" } }, "main": "./dist/index.js", "source": "./src/index.js", "react-native": "./src/index.ts", - "typings": "dist/index.d.ts", + "types": "dist/index.d.ts", "files": [ "dist" ], diff --git a/packages/expo/src/components/index.tsx b/packages/expo/src/components/index.ts similarity index 53% rename from packages/expo/src/components/index.tsx rename to packages/expo/src/components/index.ts index bb74cdc377d..782ec20d5d7 100644 --- a/packages/expo/src/components/index.tsx +++ b/packages/expo/src/components/index.ts @@ -1,2 +1 @@ export * from './controlComponents'; -export * from './uiComponents'; diff --git a/packages/expo/src/index.ts b/packages/expo/src/index.ts index f7da141061d..acb5c041391 100644 --- a/packages/expo/src/index.ts +++ b/packages/expo/src/index.ts @@ -6,7 +6,7 @@ export { isClerkAPIResponseError, isEmailLinkError, isKnownError, isMetamaskErro * @deprecated Use `getClerkInstance()` instead. */ export { clerk as Clerk } from './provider/singleton'; -export { getClerkInstance } from './singleton'; +export { getClerkInstance } from './provider/singleton'; export * from './provider/ClerkProvider'; export * from './hooks'; diff --git a/packages/expo/src/provider/ClerkProvider.tsx b/packages/expo/src/provider/ClerkProvider.tsx index b169dc7f93a..00e65d701f6 100644 --- a/packages/expo/src/provider/ClerkProvider.tsx +++ b/packages/expo/src/provider/ClerkProvider.tsx @@ -6,15 +6,13 @@ import React from 'react'; import type { TokenCache } from '../caches/types'; import { isNative } from '../utils/runtime'; import { getClerkInstance } from './singleton'; -import { buildClerk } from './singleton'; -import { isNative } from './utils/runtime'; export type ClerkProviderProps = React.ComponentProps & { tokenCache?: TokenCache; }; export function ClerkProvider(props: ClerkProviderProps): JSX.Element { - const { children, tokenCache, publishableKey, ...rest } = props; + const { children, tokenCache, publishableKey, key, ...rest } = props; const pk = publishableKey || process.env.EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY || process.env.CLERK_PUBLISHABLE_KEY || ''; return ( @@ -23,7 +21,7 @@ export function ClerkProvider(props: ClerkProviderProps): JSX.Element { // See JS-598 for additional context. key={key} {...rest} - publishableKey={key} + publishableKey={pk} Clerk={isNative() ? getClerkInstance({ publishableKey: pk, tokenCache }) : null} standardBrowser={!isNative()} > diff --git a/packages/expo/src/provider/singleton.ts b/packages/expo/src/provider/singleton.ts index 851206b6fec..ab36a6e42dd 100644 --- a/packages/expo/src/provider/singleton.ts +++ b/packages/expo/src/provider/singleton.ts @@ -2,9 +2,9 @@ import type { FapiRequestInit, FapiResponse } from '@clerk/clerk-js/dist/types/c import { Clerk } from '@clerk/clerk-js/headless'; import type { HeadlessBrowserClerk } from '@clerk/clerk-react'; +import { MemoryTokenCache } from '../caches/MemoryTokenCache'; import type { TokenCache } from '../caches/types'; -import { MemoryTokenCache } from './cache/MemoryTokenCache'; -import { errorThrower } from './errorThrower'; +import { errorThrower } from '../errorThrower'; Clerk.sdkMetadata = { name: PACKAGE_NAME, @@ -61,7 +61,6 @@ export function getClerkInstance(options?: BuildClerkOptions): HeadlessBrowserCl const saveToken = tokenCache.saveToken; __internal_clerk = clerk = new Clerk(publishableKey); - // @ts-expect-error __internal_clerk.__unstable__onBeforeRequest(async (requestInit: FapiRequestInit) => { // https://reactnative.dev/docs/0.61/network#known-issues-with-fetch-and-cookie-based-authentication requestInit.credentials = 'omit'; @@ -72,7 +71,6 @@ export function getClerkInstance(options?: BuildClerkOptions): HeadlessBrowserCl (requestInit.headers as Headers).set('authorization', jwt || ''); }); - // @ts-expect-error __internal_clerk.__unstable__onAfterResponse(async (_: FapiRequestInit, response: FapiResponse) => { const authHeader = response.headers.get('authorization'); if (authHeader) { diff --git a/packages/expo/src/web/index.ts b/packages/expo/src/web/index.ts new file mode 100644 index 00000000000..e3b923de34b --- /dev/null +++ b/packages/expo/src/web/index.ts @@ -0,0 +1,2 @@ +export * from '../components'; +export * from './uiComponents'; diff --git a/packages/expo/src/components/uiComponents.tsx b/packages/expo/src/web/uiComponents.tsx similarity index 100% rename from packages/expo/src/components/uiComponents.tsx rename to packages/expo/src/web/uiComponents.tsx diff --git a/packages/expo/web/package.json b/packages/expo/web/package.json new file mode 100644 index 00000000000..505d43fce04 --- /dev/null +++ b/packages/expo/web/package.json @@ -0,0 +1,6 @@ +{ + "main": "./dist/web/index.js", + "source": "./src/web/index.js", + "react-native": "./src/web/index.ts", + "types": "dist/web/index.d.ts" +} From 16b456a9dcdc6c8319a801d013e27733d665c543 Mon Sep 17 00:00:00 2001 From: Vaggelis Yfantis Date: Tue, 25 Jun 2024 18:58:22 +0300 Subject: [PATCH 15/61] chore(expo): Fix type issues --- packages/expo/src/provider/ClerkProvider.tsx | 5 ++--- packages/expo/src/provider/singleton.ts | 2 ++ packages/expo/tsconfig.json | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/expo/src/provider/ClerkProvider.tsx b/packages/expo/src/provider/ClerkProvider.tsx index 00e65d701f6..0516e156536 100644 --- a/packages/expo/src/provider/ClerkProvider.tsx +++ b/packages/expo/src/provider/ClerkProvider.tsx @@ -1,7 +1,6 @@ import '../polyfills'; import { ClerkProvider as ClerkReactProvider } from '@clerk/clerk-react'; -import React from 'react'; import type { TokenCache } from '../caches/types'; import { isNative } from '../utils/runtime'; @@ -12,14 +11,14 @@ export type ClerkProviderProps = React.ComponentProps }; export function ClerkProvider(props: ClerkProviderProps): JSX.Element { - const { children, tokenCache, publishableKey, key, ...rest } = props; + const { children, tokenCache, publishableKey, ...rest } = props; const pk = publishableKey || process.env.EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY || process.env.CLERK_PUBLISHABLE_KEY || ''; return ( { // https://reactnative.dev/docs/0.61/network#known-issues-with-fetch-and-cookie-based-authentication requestInit.credentials = 'omit'; @@ -71,6 +72,7 @@ export function getClerkInstance(options?: BuildClerkOptions): HeadlessBrowserCl (requestInit.headers as Headers).set('authorization', jwt || ''); }); + // @ts-expect-error - This is an internal API __internal_clerk.__unstable__onAfterResponse(async (_: FapiRequestInit, response: FapiResponse) => { const authHeader = response.headers.get('authorization'); if (authHeader) { diff --git a/packages/expo/tsconfig.json b/packages/expo/tsconfig.json index 6350512eb9f..53a1bad91ed 100644 --- a/packages/expo/tsconfig.json +++ b/packages/expo/tsconfig.json @@ -3,7 +3,7 @@ "outDir": "dist", "baseUrl": ".", "lib": ["es6", "dom"], - "jsx": "react", + "jsx": "react-jsx", "module": "NodeNext", "moduleResolution": "NodeNext", "importHelpers": true, From b8c51f896f3cc28da644fed16cb5cf5d01cbc22a Mon Sep 17 00:00:00 2001 From: Vaggelis Yfantis Date: Wed, 26 Jun 2024 13:27:48 +0300 Subject: [PATCH 16/61] chore(expo): Fix web subpath exports --- packages/expo/web/package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/expo/web/package.json b/packages/expo/web/package.json index 505d43fce04..516ad5931f3 100644 --- a/packages/expo/web/package.json +++ b/packages/expo/web/package.json @@ -1,6 +1,6 @@ { - "main": "./dist/web/index.js", - "source": "./src/web/index.js", - "react-native": "./src/web/index.ts", - "types": "dist/web/index.d.ts" + "main": "../dist/web/index.js", + "source": "../src/web/index.js", + "react-native": "../src/web/index.ts", + "types": "../dist/web/index.d.ts" } From 47348ca6d63161f6b6ec65ccffd5595b4187739a Mon Sep 17 00:00:00 2001 From: Vaggelis Yfantis Date: Wed, 26 Jun 2024 17:22:55 +0300 Subject: [PATCH 17/61] feat(expo): Only bundle Clerk in native platforms --- packages/expo/src/provider/ClerkProvider.tsx | 6 ++ packages/expo/src/provider/singleton.ts | 84 ------------------- .../provider/singleton/createClerkInstance.ts | 81 ++++++++++++++++++ packages/expo/src/provider/singleton/index.ts | 1 + .../expo/src/provider/singleton/singleton.ts | 9 ++ .../src/provider/singleton/singleton.web.ts | 5 ++ 6 files changed, 102 insertions(+), 84 deletions(-) delete mode 100644 packages/expo/src/provider/singleton.ts create mode 100644 packages/expo/src/provider/singleton/createClerkInstance.ts create mode 100644 packages/expo/src/provider/singleton/index.ts create mode 100644 packages/expo/src/provider/singleton/singleton.ts create mode 100644 packages/expo/src/provider/singleton/singleton.web.ts diff --git a/packages/expo/src/provider/ClerkProvider.tsx b/packages/expo/src/provider/ClerkProvider.tsx index 0516e156536..b5d390eb436 100644 --- a/packages/expo/src/provider/ClerkProvider.tsx +++ b/packages/expo/src/provider/ClerkProvider.tsx @@ -10,6 +10,11 @@ export type ClerkProviderProps = React.ComponentProps tokenCache?: TokenCache; }; +const SDK_METADATA = { + name: PACKAGE_NAME, + version: PACKAGE_VERSION, +}; + export function ClerkProvider(props: ClerkProviderProps): JSX.Element { const { children, tokenCache, publishableKey, ...rest } = props; const pk = publishableKey || process.env.EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY || process.env.CLERK_PUBLISHABLE_KEY || ''; @@ -21,6 +26,7 @@ export function ClerkProvider(props: ClerkProviderProps): JSX.Element { key={pk} {...rest} publishableKey={pk} + sdkMetadata={SDK_METADATA} Clerk={isNative() ? getClerkInstance({ publishableKey: pk, tokenCache }) : null} standardBrowser={!isNative()} > diff --git a/packages/expo/src/provider/singleton.ts b/packages/expo/src/provider/singleton.ts deleted file mode 100644 index de2e76e0d09..00000000000 --- a/packages/expo/src/provider/singleton.ts +++ /dev/null @@ -1,84 +0,0 @@ -import type { FapiRequestInit, FapiResponse } from '@clerk/clerk-js/dist/types/core/fapiClient'; -import { Clerk } from '@clerk/clerk-js/headless'; -import type { HeadlessBrowserClerk } from '@clerk/clerk-react'; - -import { MemoryTokenCache } from '../caches/MemoryTokenCache'; -import type { TokenCache } from '../caches/types'; -import { errorThrower } from '../errorThrower'; - -Clerk.sdkMetadata = { - name: PACKAGE_NAME, - version: PACKAGE_VERSION, -}; - -const KEY = '__clerk_client_jwt'; - -/** - * @deprecated Use `getClerkInstance` instead. `Clerk` will be removed in the next major version. - */ -export let clerk: HeadlessBrowserClerk; -let __internal_clerk: HeadlessBrowserClerk | undefined; - -type BuildClerkOptions = { - publishableKey?: string; - tokenCache?: TokenCache; -}; - -/** - * Access or create a Clerk instance outside of React. - * @example - * import { ClerkProvider, getClerkInstance } from "@clerk/expo" - * - * const clerkInstance = getClerkInstance({ publishableKey: 'xxxx' }) - * - * // Always pass the `publishableKey` to `ClerkProvider` - * - * ... - * - * - * // Somewhere in your code, outside of React you can do - * const token = await clerkInstance.session?.getToken(); - * fetch('http://example.com/', {headers: {Authorization: token }) - * @throws MissingPublishableKeyError publishableKey is missing and Clerk has not been initialized yet - * @returns HeadlessBrowserClerk - */ -export function getClerkInstance(options?: BuildClerkOptions): HeadlessBrowserClerk { - const { publishableKey = process.env.CLERK_PUBLISHABLE_KEY || '', tokenCache = MemoryTokenCache } = options || {}; - - if (!__internal_clerk && !publishableKey) { - errorThrower.throwMissingPublishableKeyError(); - } - - // Support "hot-swapping" the Clerk instance at runtime. See JS-598 for additional details. - const hasKeyChanged = __internal_clerk && !!publishableKey && publishableKey !== __internal_clerk.publishableKey; - - if (!__internal_clerk || hasKeyChanged) { - if (hasKeyChanged) { - tokenCache.clearToken?.(KEY); - } - - const getToken = tokenCache.getToken; - const saveToken = tokenCache.saveToken; - __internal_clerk = clerk = new Clerk(publishableKey); - - // @ts-expect-error - This is an internal API - __internal_clerk.__unstable__onBeforeRequest(async (requestInit: FapiRequestInit) => { - // https://reactnative.dev/docs/0.61/network#known-issues-with-fetch-and-cookie-based-authentication - requestInit.credentials = 'omit'; - - requestInit.url?.searchParams.append('_is_native', '1'); - - const jwt = await getToken(KEY); - (requestInit.headers as Headers).set('authorization', jwt || ''); - }); - - // @ts-expect-error - This is an internal API - __internal_clerk.__unstable__onAfterResponse(async (_: FapiRequestInit, response: FapiResponse) => { - const authHeader = response.headers.get('authorization'); - if (authHeader) { - await saveToken(KEY, authHeader); - } - }); - } - return __internal_clerk; -} diff --git a/packages/expo/src/provider/singleton/createClerkInstance.ts b/packages/expo/src/provider/singleton/createClerkInstance.ts new file mode 100644 index 00000000000..7482cc6cb55 --- /dev/null +++ b/packages/expo/src/provider/singleton/createClerkInstance.ts @@ -0,0 +1,81 @@ +import type { FapiRequestInit, FapiResponse } from '@clerk/clerk-js/dist/types/core/fapiClient'; +import type { Clerk } from '@clerk/clerk-js/headless'; +import type { BrowserClerk, HeadlessBrowserClerk } from '@clerk/clerk-react'; + +import { MemoryTokenCache } from '../../caches/MemoryTokenCache'; +import type { TokenCache } from '../../caches/types'; +import { errorThrower } from '../../errorThrower'; + +type BuildClerkOptions = { + publishableKey?: string; + tokenCache?: TokenCache; +}; + +const KEY = '__clerk_client_jwt'; + +/** + * @deprecated Use `getClerkInstance` instead. `Clerk` will be removed in the next major version. + */ +export let clerk: HeadlessBrowserClerk | BrowserClerk; +let __internal_clerk: HeadlessBrowserClerk | BrowserClerk | undefined; + +/** + * Access or create a Clerk instance outside of React. + * @example + * import { ClerkProvider, getClerkInstance } from "@clerk/expo" + * + * const clerkInstance = getClerkInstance({ publishableKey: 'xxxx' }) + * + * // Always pass the `publishableKey` to `ClerkProvider` + * + * ... + * + * + * // Somewhere in your code, outside of React you can do + * const token = await clerkInstance.session?.getToken(); + * fetch('http://example.com/', {headers: {Authorization: token }) + * @throws MissingPublishableKeyError publishableKey is missing and Clerk has not been initialized yet + * @returns HeadlessBrowserClerk + */ +export function createClerkInstance(ClerkClass: typeof Clerk) { + return (options?: BuildClerkOptions): HeadlessBrowserClerk | BrowserClerk => { + const { publishableKey = process.env.CLERK_PUBLISHABLE_KEY || '', tokenCache = MemoryTokenCache } = options || {}; + + if (!__internal_clerk && !publishableKey) { + errorThrower.throwMissingPublishableKeyError(); + } + + // Support "hot-swapping" the Clerk instance at runtime. See JS-598 for additional details. + const hasKeyChanged = __internal_clerk && !!publishableKey && publishableKey !== __internal_clerk.publishableKey; + + if (!__internal_clerk || hasKeyChanged) { + if (hasKeyChanged) { + tokenCache.clearToken?.(KEY); + } + + const getToken = tokenCache.getToken; + const saveToken = tokenCache.saveToken; + __internal_clerk = clerk = new ClerkClass(publishableKey); + + // @ts-expect-error - This is an internal API + __internal_clerk.__unstable__onBeforeRequest(async (requestInit: FapiRequestInit) => { + // https://reactnative.dev/docs/0.61/network#known-issues-with-fetch-and-cookie-based-authentication + requestInit.credentials = 'omit'; + + requestInit.url?.searchParams.append('_is_native', '1'); + + const jwt = await getToken(KEY); + (requestInit.headers as Headers).set('authorization', jwt || ''); + }); + + // @ts-expect-error - This is an internal API + __internal_clerk.__unstable__onAfterResponse(async (_: FapiRequestInit, response: FapiResponse) => { + const authHeader = response.headers.get('authorization'); + if (authHeader) { + await saveToken(KEY, authHeader); + } + }); + } + return __internal_clerk; + }; +} diff --git a/packages/expo/src/provider/singleton/index.ts b/packages/expo/src/provider/singleton/index.ts new file mode 100644 index 00000000000..f43929f9dcc --- /dev/null +++ b/packages/expo/src/provider/singleton/index.ts @@ -0,0 +1 @@ +export * from './singleton'; diff --git a/packages/expo/src/provider/singleton/singleton.ts b/packages/expo/src/provider/singleton/singleton.ts new file mode 100644 index 00000000000..29fef2b648a --- /dev/null +++ b/packages/expo/src/provider/singleton/singleton.ts @@ -0,0 +1,9 @@ +import { Clerk } from '@clerk/clerk-js/headless'; + +import { createClerkInstance } from './createClerkInstance'; + +/** + * @deprecated Use `getClerkInstance` instead. `Clerk` will be removed in the next major version. + */ +export { clerk } from './createClerkInstance'; +export const getClerkInstance = createClerkInstance(Clerk); diff --git a/packages/expo/src/provider/singleton/singleton.web.ts b/packages/expo/src/provider/singleton/singleton.web.ts new file mode 100644 index 00000000000..a2ddba19cf0 --- /dev/null +++ b/packages/expo/src/provider/singleton/singleton.web.ts @@ -0,0 +1,5 @@ +/** + * @deprecated Use `getClerkInstance` instead. `Clerk` will be removed in the next major version. + */ +export const clerk = globalThis?.window?.Clerk; +export const getClerkInstance = globalThis?.window?.Clerk; From a5dd66f4da62eebe8b1cb4bc14fcfdac6ededd32 Mon Sep 17 00:00:00 2001 From: Vaggelis Yfantis Date: Fri, 28 Jun 2024 14:55:37 +0300 Subject: [PATCH 18/61] fix(expo): Make useOAuth available to web --- .../expo/src/hooks/{useOAuth => }/useOAuth.ts | 0 packages/expo/src/hooks/useOAuth/index.ts | 1 - packages/expo/src/hooks/useOAuth/useOAuth.web.ts | 15 --------------- 3 files changed, 16 deletions(-) rename packages/expo/src/hooks/{useOAuth => }/useOAuth.ts (100%) delete mode 100644 packages/expo/src/hooks/useOAuth/index.ts delete mode 100644 packages/expo/src/hooks/useOAuth/useOAuth.web.ts diff --git a/packages/expo/src/hooks/useOAuth/useOAuth.ts b/packages/expo/src/hooks/useOAuth.ts similarity index 100% rename from packages/expo/src/hooks/useOAuth/useOAuth.ts rename to packages/expo/src/hooks/useOAuth.ts diff --git a/packages/expo/src/hooks/useOAuth/index.ts b/packages/expo/src/hooks/useOAuth/index.ts deleted file mode 100644 index a7e60d69df5..00000000000 --- a/packages/expo/src/hooks/useOAuth/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './useOAuth'; diff --git a/packages/expo/src/hooks/useOAuth/useOAuth.web.ts b/packages/expo/src/hooks/useOAuth/useOAuth.web.ts deleted file mode 100644 index 3621cce6a4a..00000000000 --- a/packages/expo/src/hooks/useOAuth/useOAuth.web.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { OAuthStrategy } from '@clerk/types'; -import { Platform } from 'react-native'; - -import { errorThrower } from '../../utils/errors'; - -export type UseOAuthFlowParams = { - strategy: OAuthStrategy; - redirectUrl?: string; - unsafeMetadata?: SignUpUnsafeMetadata; -}; -export function useOAuth(_useOAuthParams: UseOAuthFlowParams) { - if (Platform.OS === 'web') { - throw errorThrower.throw('useOAuth hook is not supported in Web'); - } -} From e6425ddadc7df0c5b916e00916ea1c7dc0eadd62 Mon Sep 17 00:00:00 2001 From: Vaggelis Yfantis Date: Tue, 2 Jul 2024 23:54:56 +0300 Subject: [PATCH 19/61] feat(e2e): Introduce integration tests for Expo Web --- integration/models/application.ts | 7 ++- integration/presets/expo.ts | 18 +++++++ integration/presets/index.ts | 2 + integration/presets/longRunningApps.ts | 2 + integration/templates/expo-web/.gitignore | 14 +++++ integration/templates/expo-web/README.md | 50 ++++++++++++++++++ integration/templates/expo-web/app.json | 34 ++++++++++++ integration/templates/expo-web/app/+html.tsx | 45 ++++++++++++++++ .../templates/expo-web/app/+not-found.tsx | 14 +++++ .../templates/expo-web/app/_layout.tsx | 19 +++++++ integration/templates/expo-web/app/index.tsx | 22 ++++++++ .../templates/expo-web/app/sign-in.tsx | 16 ++++++ .../assets/fonts/SpaceMono-Regular.ttf | Bin 0 -> 93252 bytes .../expo-web/assets/images/adaptive-icon.png | Bin 0 -> 17547 bytes .../expo-web/assets/images/favicon.png | Bin 0 -> 1466 bytes .../templates/expo-web/assets/images/icon.png | Bin 0 -> 22380 bytes .../assets/images/partial-react-logo.png | Bin 0 -> 5075 bytes .../expo-web/assets/images/react-logo.png | Bin 0 -> 6341 bytes .../expo-web/assets/images/react-logo@2x.png | Bin 0 -> 14225 bytes .../expo-web/assets/images/react-logo@3x.png | Bin 0 -> 21252 bytes .../expo-web/assets/images/splash.png | Bin 0 -> 47346 bytes .../templates/expo-web/babel.config.js | 6 +++ .../templates/expo-web/constants/Colors.ts | 26 +++++++++ .../templates/expo-web/metro.config.js | 15 ++++++ integration/templates/expo-web/package.json | 46 ++++++++++++++++ integration/templates/expo-web/tsconfig.json | 10 ++++ integration/templates/index.ts | 1 + integration/tests/expo-web/basic.test.ts | 44 +++++++++++++++ 28 files changed, 389 insertions(+), 2 deletions(-) create mode 100644 integration/presets/expo.ts create mode 100644 integration/templates/expo-web/.gitignore create mode 100644 integration/templates/expo-web/README.md create mode 100644 integration/templates/expo-web/app.json create mode 100644 integration/templates/expo-web/app/+html.tsx create mode 100644 integration/templates/expo-web/app/+not-found.tsx create mode 100644 integration/templates/expo-web/app/_layout.tsx create mode 100644 integration/templates/expo-web/app/index.tsx create mode 100644 integration/templates/expo-web/app/sign-in.tsx create mode 100755 integration/templates/expo-web/assets/fonts/SpaceMono-Regular.ttf create mode 100644 integration/templates/expo-web/assets/images/adaptive-icon.png create mode 100644 integration/templates/expo-web/assets/images/favicon.png create mode 100644 integration/templates/expo-web/assets/images/icon.png create mode 100644 integration/templates/expo-web/assets/images/partial-react-logo.png create mode 100644 integration/templates/expo-web/assets/images/react-logo.png create mode 100644 integration/templates/expo-web/assets/images/react-logo@2x.png create mode 100644 integration/templates/expo-web/assets/images/react-logo@3x.png create mode 100644 integration/templates/expo-web/assets/images/splash.png create mode 100644 integration/templates/expo-web/babel.config.js create mode 100644 integration/templates/expo-web/constants/Colors.ts create mode 100644 integration/templates/expo-web/metro.config.js create mode 100644 integration/templates/expo-web/package.json create mode 100644 integration/templates/expo-web/tsconfig.json create mode 100644 integration/tests/expo-web/basic.test.ts diff --git a/integration/models/application.ts b/integration/models/application.ts index 2bb8f017edc..3ddca06f28b 100644 --- a/integration/models/application.ts +++ b/integration/models/application.ts @@ -66,7 +66,7 @@ export const application = ( const proc = run(scripts.dev, { cwd: appDirPath, - env: { PORT: port.toString() }, + env: { PORT: port.toString(), RCT_METRO_PORT: port.toString() }, detached: opts.detached, stdout: opts.detached ? fs.openSync(stdoutFilePath, 'a') : undefined, stderr: opts.detached ? fs.openSync(stderrFilePath, 'a') : undefined, @@ -99,7 +99,10 @@ export const application = ( const serverUrl = `http://localhost:${port}`; // If this is ever used as a background process, we need to make sure // it's not using the log function. See the dev() method above - const proc = run(scripts.serve, { cwd: appDirPath, env: { PORT: port.toString() } }); + const proc = run(scripts.serve, { + cwd: appDirPath, + env: { PORT: port.toString(), RCT_METRO_PORT: port.toString() }, + }); cleanupFns.push(() => awaitableTreekill(proc.pid, 'SIGKILL')); await waitForIdleProcess(proc); state.serverUrl = serverUrl; diff --git a/integration/presets/expo.ts b/integration/presets/expo.ts new file mode 100644 index 00000000000..01315bfe11a --- /dev/null +++ b/integration/presets/expo.ts @@ -0,0 +1,18 @@ +import { applicationConfig } from '../models/applicationConfig'; +import { templates } from '../templates'; + +const clerkExpoLocal = `file:${process.cwd()}/packages/expo`; + +const expoWeb = applicationConfig() + .setName('expo-web') + .useTemplate(templates['expo-web']) + .setEnvFormatter('public', key => `EXPO_PUBLIC_${key}`) + .addScript('setup', 'npm i') + .addScript('dev', 'npm run dev') + .addScript('build', 'npm run build') + .addScript('serve', 'npm run start') + .addDependency('@clerk/clerk-expo', clerkExpoLocal); + +export const expo = { + expoWeb, +} as const; diff --git a/integration/presets/index.ts b/integration/presets/index.ts index 97dfab2814a..142af64d664 100644 --- a/integration/presets/index.ts +++ b/integration/presets/index.ts @@ -1,5 +1,6 @@ import { astro } from './astro'; import { elements } from './elements'; +import { expo } from './expo'; import { envs, instanceKeys } from './envs'; import { express } from './express'; import { createLongRunningApps } from './longRunningApps'; @@ -15,6 +16,7 @@ export const appConfigs = { react, remix, elements, + expo, astro, secrets: { instanceKeys, diff --git a/integration/presets/longRunningApps.ts b/integration/presets/longRunningApps.ts index e6077faa291..8f0ba9ee67c 100644 --- a/integration/presets/longRunningApps.ts +++ b/integration/presets/longRunningApps.ts @@ -3,6 +3,7 @@ import { longRunningApplication } from '../models/longRunningApplication'; import { astro } from './astro'; import { elements } from './elements'; import { envs } from './envs'; +import { expo } from './expo'; import { express } from './express'; import { next } from './next'; import { react } from './react'; @@ -24,6 +25,7 @@ export const createLongRunningApps = () => { { id: 'quickstart.next.appRouter', config: next.appRouterQuickstart, env: envs.withEmailCodesQuickstart }, { id: 'elements.next.appRouter', config: elements.nextAppRouter, env: envs.withEmailCodes }, { id: 'astro.node.withCustomRoles', config: astro.node, env: envs.withCustomRoles }, + { id: 'expo.expoWeb', config: expo.expoWeb, env: envs.withEmailCodes }, ] as const; const apps = configs.map(longRunningApplication); diff --git a/integration/templates/expo-web/.gitignore b/integration/templates/expo-web/.gitignore new file mode 100644 index 00000000000..ec8a36a257a --- /dev/null +++ b/integration/templates/expo-web/.gitignore @@ -0,0 +1,14 @@ +node_modules/ +.expo/ +dist/ +npm-debug.* +*.jks +*.p8 +*.p12 +*.key +*.mobileprovision +*.orig.* +web-build/ + +# macOS +.DS_Store diff --git a/integration/templates/expo-web/README.md b/integration/templates/expo-web/README.md new file mode 100644 index 00000000000..cd4feb8a3cc --- /dev/null +++ b/integration/templates/expo-web/README.md @@ -0,0 +1,50 @@ +# Welcome to your Expo app 👋 + +This is an [Expo](https://expo.dev) project created with [`create-expo-app`](https://www.npmjs.com/package/create-expo-app). + +## Get started + +1. Install dependencies + + ```bash + npm install + ``` + +2. Start the app + + ```bash + npx expo start + ``` + +In the output, you'll find options to open the app in a + +- [development build](https://docs.expo.dev/develop/development-builds/introduction/) +- [Android emulator](https://docs.expo.dev/workflow/android-studio-emulator/) +- [iOS simulator](https://docs.expo.dev/workflow/ios-simulator/) +- [Expo Go](https://expo.dev/go), a limited sandbox for trying out app development with Expo + +You can start developing by editing the files inside the **app** directory. This project uses [file-based routing](https://docs.expo.dev/router/introduction). + +## Get a fresh project + +When you're ready, run: + +```bash +npm run reset-project +``` + +This command will move the starter code to the **app-example** directory and create a blank **app** directory where you can start developing. + +## Learn more + +To learn more about developing your project with Expo, look at the following resources: + +- [Expo documentation](https://docs.expo.dev/): Learn fundamentals, or go into advanced topics with our [guides](https://docs.expo.dev/guides). +- [Learn Expo tutorial](https://docs.expo.dev/tutorial/introduction/): Follow a step-by-step tutorial where you'll create a project that runs on Android, iOS, and the web. + +## Join the community + +Join our community of developers creating universal apps. + +- [Expo on GitHub](https://github.com/expo/expo): View our open source platform and contribute. +- [Discord community](https://chat.expo.dev): Chat with Expo users and ask questions. diff --git a/integration/templates/expo-web/app.json b/integration/templates/expo-web/app.json new file mode 100644 index 00000000000..66d93efc8cf --- /dev/null +++ b/integration/templates/expo-web/app.json @@ -0,0 +1,34 @@ +{ + "expo": { + "name": "expo-web", + "slug": "expo-web", + "version": "1.0.0", + "orientation": "portrait", + "icon": "./assets/images/icon.png", + "scheme": "myapp", + "userInterfaceStyle": "automatic", + "splash": { + "image": "./assets/images/splash.png", + "resizeMode": "contain", + "backgroundColor": "#ffffff" + }, + "ios": { + "supportsTablet": true + }, + "android": { + "adaptiveIcon": { + "foregroundImage": "./assets/images/adaptive-icon.png", + "backgroundColor": "#ffffff" + } + }, + "web": { + "bundler": "metro", + "output": "static", + "favicon": "./assets/images/favicon.png" + }, + "plugins": ["expo-router"], + "experiments": { + "typedRoutes": true + } + } +} diff --git a/integration/templates/expo-web/app/+html.tsx b/integration/templates/expo-web/app/+html.tsx new file mode 100644 index 00000000000..490457a1f3f --- /dev/null +++ b/integration/templates/expo-web/app/+html.tsx @@ -0,0 +1,45 @@ +import { ScrollViewStyleReset } from 'expo-router/html'; +import type { PropsWithChildren } from 'react'; + +/** + * This file is web-only and used to configure the root HTML for every web page during static rendering. + * The contents of this function only run in Node.js environments and do not have access to the DOM or browser APIs. + */ +export default function Root({ children }: PropsWithChildren) { + return ( + + + + + + + {/* + Disable body scrolling on web. This makes ScrollView components work closer to how they do on native. + However, body scrolling is often nice to have for mobile web. If you want to enable it, remove this line. + */} + + + {/* Using raw CSS styles as an escape-hatch to ensure the background color never flickers in dark-mode. */} +