diff --git a/.changeset/two-wombats-confess.md b/.changeset/two-wombats-confess.md
new file mode 100644
index 00000000000..eefc241e3a4
--- /dev/null
+++ b/.changeset/two-wombats-confess.md
@@ -0,0 +1,17 @@
+---
+'@clerk/clerk-expo': major
+---
+
+Support for [Expo Web](https://docs.expo.dev/workflow/web/) has been added! You can now build fullstack websites with Expo, React, and Clerk. Utilize [Clerk's components](https://clerk.com/docs/components/overview) to build out your app.
+
+You can access the components from the `/web` subpath import like so:
+
+```tsx
+import { SignUp } from "@clerk/clerk-expo/web";
+
+export default function Page() {
+ return ;
+}
+```
+
+**Breaking change:** You need to use Expo 50 or later. The minimum required React Native version was bumped to `0.73`.
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 019263d437f..a9cf6c696d2 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -136,7 +136,7 @@ jobs:
strategy:
matrix:
- test-name: ['generic', 'express', 'quickstart', 'ap-flows', 'elements', 'sessions', 'astro']
+ test-name: ['generic', 'express', 'quickstart', 'ap-flows', 'elements', 'sessions', 'astro', 'expo-web']
test-project: ['chrome']
include:
- test-name: 'nextjs'
diff --git a/integration/models/application.ts b/integration/models/application.ts
index 2bb8f017edc..3d354a04a4e 100644
--- a/integration/models/application.ts
+++ b/integration/models/application.ts
@@ -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() },
+ });
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..77f8a27b428 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.expo-web', 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..1ee635b408f
--- /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/icon.png",
+ "backgroundColor": "#ffffff"
+ }
+ },
+ "web": {
+ "bundler": "metro",
+ "output": "static",
+ "favicon": "./assets/images/icon.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. */}
+
+ {/* Add any additional elements that you want globally available on web... */}
+
+ {children}
+
+ );
+}
+
+const responsiveBackground = `
+body {
+ background-color: #fff;
+}
+@media (prefers-color-scheme: dark) {
+ body {
+ background-color: #000;
+ }
+}`;
diff --git a/integration/templates/expo-web/app/+not-found.tsx b/integration/templates/expo-web/app/+not-found.tsx
new file mode 100644
index 00000000000..6dd4721a9d8
--- /dev/null
+++ b/integration/templates/expo-web/app/+not-found.tsx
@@ -0,0 +1,14 @@
+import { Link, Stack } from 'expo-router';
+import { StyleSheet, Text } from 'react-native';
+
+export default function NotFoundScreen() {
+ return (
+ <>
+
+ This screen doesn't exist.
+
+ Go to home screen!
+
+ >
+ );
+}
diff --git a/integration/templates/expo-web/app/_layout.tsx b/integration/templates/expo-web/app/_layout.tsx
new file mode 100644
index 00000000000..95a03ee596d
--- /dev/null
+++ b/integration/templates/expo-web/app/_layout.tsx
@@ -0,0 +1,19 @@
+import { Stack, useRouter } from 'expo-router';
+import { ClerkLoaded, ClerkProvider } from '@clerk/clerk-expo';
+
+export default function RootLayout() {
+ const router = useRouter();
+
+ return (
+ router.push(to)}
+ routerReplace={to => router.replace(to)}
+ >
+
+
+
+
+
+
+ );
+}
diff --git a/integration/templates/expo-web/app/custom-sign-in.tsx b/integration/templates/expo-web/app/custom-sign-in.tsx
new file mode 100644
index 00000000000..3ca42a81d3c
--- /dev/null
+++ b/integration/templates/expo-web/app/custom-sign-in.tsx
@@ -0,0 +1,67 @@
+import { useSignIn } from '@clerk/clerk-expo';
+import { Link, useRouter } from 'expo-router';
+import { Text, TextInput, Button, View } from 'react-native';
+import React from 'react';
+
+export default function Page() {
+ const { signIn, setActive, isLoaded } = useSignIn();
+ const router = useRouter();
+
+ const [emailAddress, setEmailAddress] = React.useState('');
+ const [password, setPassword] = React.useState('');
+
+ const onSignInPress = React.useCallback(async () => {
+ if (!isLoaded) {
+ return;
+ }
+
+ try {
+ const signInAttempt = await signIn.create({
+ identifier: emailAddress,
+ password,
+ });
+
+ if (signInAttempt.status === 'complete') {
+ await setActive({ session: signInAttempt.createdSessionId });
+ router.replace('/');
+ } else {
+ // See https://clerk.com/docs/custom-flows/error-handling
+ // for more info on error handling
+ console.error(JSON.stringify(signInAttempt, null, 2));
+ }
+ } catch (err: any) {
+ console.error(JSON.stringify(err, null, 2));
+ }
+ }, [isLoaded, emailAddress, password]);
+
+ return (
+
+ setEmailAddress(emailAddress)}
+ />
+ setPassword(password)}
+ />
+
+
+ Don't have an account?
+
+ Sign up
+
+
+
+ );
+}
diff --git a/integration/templates/expo-web/app/custom-sign-up.tsx b/integration/templates/expo-web/app/custom-sign-up.tsx
new file mode 100644
index 00000000000..a51d547d908
--- /dev/null
+++ b/integration/templates/expo-web/app/custom-sign-up.tsx
@@ -0,0 +1,101 @@
+import * as React from 'react';
+import { TextInput, Button, View } from 'react-native';
+import { useSignUp } from '@clerk/clerk-expo';
+import { useRouter } from 'expo-router';
+
+export default function SignUpScreen() {
+ const { isLoaded, signUp, setActive } = useSignUp();
+ const router = useRouter();
+
+ const [emailAddress, setEmailAddress] = React.useState('');
+ const [password, setPassword] = React.useState('');
+ const [pendingVerification, setPendingVerification] = React.useState(false);
+ const [code, setCode] = React.useState('');
+
+ const onSignUpPress = async () => {
+ if (!isLoaded) {
+ return;
+ }
+
+ try {
+ await signUp.create({
+ emailAddress,
+ password,
+ });
+
+ await signUp.prepareEmailAddressVerification({ strategy: 'email_code' });
+
+ setPendingVerification(true);
+ } catch (err: any) {
+ // See https://clerk.com/docs/custom-flows/error-handling
+ // for more info on error handling
+ console.error(JSON.stringify(err, null, 2));
+ }
+ };
+
+ const onPressVerify = async () => {
+ if (!isLoaded) {
+ return;
+ }
+
+ try {
+ const completeSignUp = await signUp.attemptEmailAddressVerification({
+ code,
+ });
+
+ if (completeSignUp.status === 'complete') {
+ await setActive({ session: completeSignUp.createdSessionId });
+ router.replace('/');
+ } else {
+ console.error(JSON.stringify(completeSignUp, null, 2));
+ }
+ } catch (err: any) {
+ // See https://clerk.com/docs/custom-flows/error-handling
+ // for more info on error handling
+ console.error(JSON.stringify(err, null, 2));
+ }
+ };
+
+ return (
+
+ {!pendingVerification && (
+ <>
+ setEmailAddress(email)}
+ id='emailAddress'
+ testID='emailAddress-input'
+ />
+ setPassword(password)}
+ />
+
+ >
+ )}
+ {pendingVerification && (
+ <>
+ setCode(code)}
+ testID='code-input'
+ />
+
+ >
+ )}
+
+ );
+}
diff --git a/integration/templates/expo-web/app/index.tsx b/integration/templates/expo-web/app/index.tsx
new file mode 100644
index 00000000000..f43e714fac6
--- /dev/null
+++ b/integration/templates/expo-web/app/index.tsx
@@ -0,0 +1,23 @@
+import { Text, View } from 'react-native';
+import { SignedIn, SignedOut } from '@clerk/clerk-expo';
+import { UserButton } from '@clerk/clerk-expo/web';
+
+export default function Index() {
+ return (
+
+
+ You are signed in!
+
+
+
+ You are signed out
+
+
+ );
+}
diff --git a/integration/templates/expo-web/app/sign-in.tsx b/integration/templates/expo-web/app/sign-in.tsx
new file mode 100644
index 00000000000..240376991d9
--- /dev/null
+++ b/integration/templates/expo-web/app/sign-in.tsx
@@ -0,0 +1,16 @@
+import { Text, View } from 'react-native';
+import { SignIn } from '@clerk/clerk-expo/web';
+
+export default function Index() {
+ return (
+
+
+
+ );
+}
diff --git a/integration/templates/expo-web/assets/images/icon.png b/integration/templates/expo-web/assets/images/icon.png
new file mode 100644
index 00000000000..a0b1526fc7b
Binary files /dev/null and b/integration/templates/expo-web/assets/images/icon.png differ
diff --git a/integration/templates/expo-web/assets/images/splash.png b/integration/templates/expo-web/assets/images/splash.png
new file mode 100644
index 00000000000..0e89705a943
Binary files /dev/null and b/integration/templates/expo-web/assets/images/splash.png differ
diff --git a/integration/templates/expo-web/babel.config.js b/integration/templates/expo-web/babel.config.js
new file mode 100644
index 00000000000..9d89e131194
--- /dev/null
+++ b/integration/templates/expo-web/babel.config.js
@@ -0,0 +1,6 @@
+module.exports = function (api) {
+ api.cache(true);
+ return {
+ presets: ['babel-preset-expo'],
+ };
+};
diff --git a/integration/templates/expo-web/constants/Colors.ts b/integration/templates/expo-web/constants/Colors.ts
new file mode 100644
index 00000000000..14e67844d65
--- /dev/null
+++ b/integration/templates/expo-web/constants/Colors.ts
@@ -0,0 +1,26 @@
+/**
+ * Below are the colors that are used in the app. The colors are defined in the light and dark mode.
+ * There are many other ways to style your app. For example, [Nativewind](https://www.nativewind.dev/), [Tamagui](https://tamagui.dev/), [unistyles](https://reactnativeunistyles.vercel.app), etc.
+ */
+
+const tintColorLight = '#0a7ea4';
+const tintColorDark = '#fff';
+
+export const Colors = {
+ light: {
+ text: '#11181C',
+ background: '#fff',
+ tint: tintColorLight,
+ icon: '#687076',
+ tabIconDefault: '#687076',
+ tabIconSelected: tintColorLight,
+ },
+ dark: {
+ text: '#ECEDEE',
+ background: '#151718',
+ tint: tintColorDark,
+ icon: '#9BA1A6',
+ tabIconDefault: '#9BA1A6',
+ tabIconSelected: tintColorDark,
+ },
+};
diff --git a/integration/templates/expo-web/metro.config.js b/integration/templates/expo-web/metro.config.js
new file mode 100644
index 00000000000..8f92d30af8c
--- /dev/null
+++ b/integration/templates/expo-web/metro.config.js
@@ -0,0 +1,45 @@
+/**
+ * DO NOT EDIT THIS FILE UNLESS YOU DEFINITELY KNWO WHAT YOU ARE DOING.
+ * THIS ENSURES THAT INTEGRATION TESTS ARE LOADING THE CORRECT DEPENDENCIES.
+ */
+const { getDefaultConfig } = require('expo/metro-config');
+const packageJson = require('./package.json');
+const path = require('node:path');
+
+/** @type {() => string | undefined} */
+const getClerkExpoPath = () => {
+ const clerkExpoPath = packageJson.dependencies['@clerk/clerk-expo'];
+
+ if (clerkExpoPath?.startsWith('file:')) {
+ return clerkExpoPath.replace('file:', '');
+ }
+
+ return undefined;
+};
+
+const clerkExpoPath = getClerkExpoPath();
+const clerkMonorepoPath = clerkExpoPath?.replace(/\/packages\/expo$/, '');
+
+/** @type {import('expo/metro-config').MetroConfig} */
+const config = {
+ ...getDefaultConfig(__dirname),
+ watchFolders: [clerkMonorepoPath],
+ resolver: {
+ sourceExts: ['js', 'json', 'ts', 'tsx', 'cjs', 'mjs'],
+ nodeModulesPaths: [
+ path.resolve(__dirname, 'node_modules'),
+ clerkExpoPath && `${clerkMonorepoPath}/node_modules`,
+ clerkExpoPath && `${clerkExpoPath}/node_modules`,
+ ],
+ // This is a workaround for a to prevent multiple versions of react and react-native from being loaded.
+ // https://github.com/expo/expo/pull/26209
+ blockList: [
+ clerkExpoPath && new RegExp(`${clerkMonorepoPath}/node_modules/react`),
+ clerkExpoPath && new RegExp(`${clerkMonorepoPath}/node_modules/react-native`),
+ ],
+ },
+};
+
+module.exports = {
+ ...config,
+};
diff --git a/integration/templates/expo-web/package.json b/integration/templates/expo-web/package.json
new file mode 100644
index 00000000000..a0f2764b7cb
--- /dev/null
+++ b/integration/templates/expo-web/package.json
@@ -0,0 +1,47 @@
+{
+ "name": "expo-web",
+ "main": "expo-router/entry",
+ "version": "1.0.0",
+ "scripts": {
+ "dev": "RCT_METRO_PORT=$PORT expo start --web --port $PORT",
+ "build": "expo export -p web",
+ "start": "npx serve dist --single",
+ "lint": "expo lint"
+ },
+ "jest": {
+ "preset": "jest-expo"
+ },
+ "dependencies": {
+ "@expo/vector-icons": "^14.0.2",
+ "@react-navigation/native": "^6.0.2",
+ "expo": "~51.0.17",
+ "expo-constants": "~16.0.2",
+ "expo-font": "~12.0.7",
+ "expo-linking": "~6.3.1",
+ "expo-router": "~3.5.17",
+ "expo-splash-screen": "~0.27.5",
+ "expo-status-bar": "~1.12.1",
+ "expo-system-ui": "~3.0.6",
+ "expo-web-browser": "~13.0.3",
+ "react": "18.2.0",
+ "react-dom": "18.2.0",
+ "react-native": "0.74.3",
+ "react-native-gesture-handler": "~2.16.1",
+ "react-native-reanimated": "~3.10.1",
+ "react-native-safe-area-context": "4.10.1",
+ "react-native-screens": "~3.31.1",
+ "react-native-web": "~0.19.6",
+ "react-native-url-polyfill": "^2.0.0"
+ },
+ "devDependencies": {
+ "@babel/core": "^7.20.0",
+ "@types/jest": "^29.5.12",
+ "@types/react": "~18.2.45",
+ "@types/react-test-renderer": "^18.0.7",
+ "jest": "^29.2.1",
+ "jest-expo": "~51.0.3",
+ "react-test-renderer": "18.2.0",
+ "typescript": "~5.3.3"
+ },
+ "private": true
+}
diff --git a/integration/templates/expo-web/tsconfig.json b/integration/templates/expo-web/tsconfig.json
new file mode 100644
index 00000000000..ce27fee398f
--- /dev/null
+++ b/integration/templates/expo-web/tsconfig.json
@@ -0,0 +1,10 @@
+{
+ "extends": "expo/tsconfig.base",
+ "compilerOptions": {
+ "strict": true,
+ "paths": {
+ "@/*": ["./*"]
+ }
+ },
+ "include": ["**/*.ts", "**/*.tsx", ".expo/types/**/*.ts", "expo-env.d.ts"]
+}
diff --git a/integration/templates/index.ts b/integration/templates/index.ts
index 74039641117..e4c2f4ad2fe 100644
--- a/integration/templates/index.ts
+++ b/integration/templates/index.ts
@@ -12,6 +12,7 @@ export const templates = {
'remix-node': resolve(__dirname, './remix-node'),
'elements-next': resolve(__dirname, './elements-next'),
'astro-node': resolve(__dirname, './astro-node'),
+ 'expo-web': resolve(__dirname, './expo-web'),
} as const;
if (new Set([...Object.values(templates)]).size !== Object.values(templates).length) {
diff --git a/integration/testUtils/commonPageObject.ts b/integration/testUtils/commonPageObject.ts
index 3243a35748e..5c1fac8429c 100644
--- a/integration/testUtils/commonPageObject.ts
+++ b/integration/testUtils/commonPageObject.ts
@@ -5,8 +5,11 @@ export const common = ({ page }: TestArgs) => {
continue: () => {
return page.getByRole('button', { name: 'Continue', exact: true }).click();
},
+ setEmailAddress: (val: string) => {
+ return self.getEmailAddressInput().fill(val);
+ },
setPassword: (val: string) => {
- return page.locator('input[name=password]').fill(val);
+ return self.getPasswordInput().fill(val);
},
setPasswordConfirmation: (val: string) => {
return page.locator('input[name=confirmPassword]').fill(val);
diff --git a/integration/tests/expo-web/basic.test.ts b/integration/tests/expo-web/basic.test.ts
new file mode 100644
index 00000000000..3c308416919
--- /dev/null
+++ b/integration/tests/expo-web/basic.test.ts
@@ -0,0 +1,55 @@
+import { test } from '@playwright/test';
+
+import { appConfigs } from '../../presets';
+import type { FakeUser } from '../../testUtils';
+import { createTestUtils, testAgainstRunningApps } from '../../testUtils';
+
+testAgainstRunningApps({ withEnv: [appConfigs.envs.withEmailCodes] })(
+ 'basic tests for expo web @expo-web',
+ ({ app }) => {
+ test.describe.configure({ mode: 'parallel' });
+
+ let fakeUser: FakeUser;
+
+ test.beforeAll(async () => {
+ const u = createTestUtils({ app });
+ fakeUser = u.services.users.createFakeUser({
+ fictionalEmail: true,
+ withPhoneNumber: true,
+ withUsername: true,
+ });
+ await u.services.users.createBapiUser(fakeUser);
+ });
+
+ test.afterAll(async () => {
+ await fakeUser.deleteIfExists();
+ await app.teardown();
+ });
+
+ test.afterEach(async ({ page, context }) => {
+ const u = createTestUtils({ app, page, context });
+ await u.page.signOut();
+ await u.page.context().clearCookies();
+ });
+
+ test('can sign in and user button renders', async ({ page, context }) => {
+ const u = createTestUtils({ app, page, context });
+ await u.po.signIn.goTo();
+
+ await u.page.pause();
+ await u.po.signIn.setIdentifier(fakeUser.email);
+ await u.po.signIn.continue();
+ await u.po.signIn.setPassword(fakeUser.password);
+ await u.po.signIn.continue();
+ await u.po.expect.toBeSignedIn();
+
+ await u.page.waitForAppUrl('/');
+
+ await u.po.userButton.waitForMounted();
+ await u.po.userButton.toggleTrigger();
+ await u.po.userButton.waitForPopover();
+
+ await u.po.userButton.toHaveVisibleMenuItems([/Manage account/i, /Sign out$/i]);
+ });
+ },
+);
diff --git a/integration/tests/expo-web/custom-flows.test.ts b/integration/tests/expo-web/custom-flows.test.ts
new file mode 100644
index 00000000000..9aed0602f4b
--- /dev/null
+++ b/integration/tests/expo-web/custom-flows.test.ts
@@ -0,0 +1,105 @@
+import { test } from '@playwright/test';
+
+import { appConfigs } from '../../presets';
+import type { FakeUser } from '../../testUtils';
+import { createTestUtils, testAgainstRunningApps } from '../../testUtils';
+
+testAgainstRunningApps({ withEnv: [appConfigs.envs.withEmailCodes] })(
+ 'custom flows test suite @expo-web',
+ ({ app }) => {
+ test.describe.configure({ mode: 'parallel' });
+
+ let fakeUser: FakeUser;
+
+ test.beforeAll(async () => {
+ const u = createTestUtils({ app });
+ fakeUser = u.services.users.createFakeUser({
+ fictionalEmail: true,
+ withPhoneNumber: true,
+ withUsername: true,
+ });
+ await u.services.users.createBapiUser(fakeUser);
+ });
+
+ test.afterAll(async () => {
+ await fakeUser.deleteIfExists();
+ await app.teardown();
+ });
+
+ test.afterEach(async ({ page, context }) => {
+ const u = createTestUtils({ app, page, context });
+ await u.page.signOut();
+ await u.page.context().clearCookies();
+ });
+
+ test('sign in using custom flow', async ({ page, context }) => {
+ const u = createTestUtils({ app, page, context });
+ await u.page.goToRelative('/custom-sign-in');
+
+ await u.page.getByTestId('emailAddress-input').fill(fakeUser.email);
+ await u.page.getByTestId('password-input').fill(fakeUser.password);
+
+ await u.page.getByRole('button', { name: /sign in/i }).click();
+
+ await u.page.waitForAppUrl('/');
+
+ await u.po.expect.toBeSignedIn();
+
+ await u.po.userButton.waitForMounted();
+ await u.po.userButton.toggleTrigger();
+ await u.po.userButton.waitForPopover();
+
+ await u.po.userButton.toHaveVisibleMenuItems([/Manage account/i, /Sign out$/i]);
+ });
+
+ test('sign up using custom flow and also delete user', async ({ page, context }) => {
+ const u = createTestUtils({ app, page, context });
+ const fakeSignUpUser = u.services.users.createFakeUser({
+ fictionalEmail: true,
+ withPhoneNumber: true,
+ withUsername: true,
+ });
+
+ await u.page.goToRelative('/custom-sign-up');
+
+ await u.page.getByTestId('emailAddress-input').fill(fakeSignUpUser.email);
+ await u.page.getByTestId('password-input').fill(fakeSignUpUser.password);
+ await u.page.getByRole('button', { name: /sign up/i }).click();
+
+ await u.page.getByTestId('code-input').fill('424242');
+ await u.page.getByRole('button', { name: /verify email/i }).click();
+
+ await u.page.waitForAppUrl('/');
+
+ await u.po.expect.toBeSignedIn();
+
+ await u.po.userButton.waitForMounted();
+ await u.po.userButton.toggleTrigger();
+ await u.po.userButton.waitForPopover();
+
+ await u.po.userButton.triggerManageAccount();
+
+ await u.po.userProfile.waitForUserProfileModal();
+
+ await u.po.userProfile.switchToSecurityTab();
+
+ await u.page
+ .getByRole('button', {
+ name: /delete account/i,
+ })
+ .click();
+
+ await u.page.locator('input[name=deleteConfirmation]').fill('Delete account');
+
+ await u.page
+ .getByRole('button', {
+ name: /delete account/i,
+ })
+ .click();
+
+ await u.page.waitForAppUrl('/');
+
+ await u.po.expect.toBeSignedOut();
+ });
+ },
+);
diff --git a/package-lock.json b/package-lock.json
index fbde2643738..fa360c543cc 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"
@@ -1229,7 +1227,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 +1363,6 @@
"version": "7.23.3",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
},
@@ -2575,7 +2571,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 +2639,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 +2657,6 @@
"version": "2.1.0",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"commondir": "^1.0.1",
"make-dir": "^2.0.0",
@@ -2677,7 +2670,6 @@
"version": "3.0.0",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"locate-path": "^3.0.0"
},
@@ -2689,7 +2681,6 @@
"version": "3.0.0",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"p-locate": "^3.0.0",
"path-exists": "^3.0.0"
@@ -2702,7 +2693,6 @@
"version": "2.1.0",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"pify": "^4.0.1",
"semver": "^5.6.0"
@@ -2715,7 +2705,6 @@
"version": "3.0.0",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"p-limit": "^2.0.0"
},
@@ -2727,7 +2716,6 @@
"version": "3.0.0",
"dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": ">=4"
}
@@ -2736,7 +2724,6 @@
"version": "4.0.1",
"dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": ">=6"
}
@@ -2745,7 +2732,6 @@
"version": "3.0.0",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"find-up": "^3.0.0"
},
@@ -2757,7 +2743,6 @@
"version": "5.7.2",
"dev": true,
"license": "ISC",
- "peer": true,
"bin": {
"semver": "bin/semver"
}
@@ -2766,7 +2751,6 @@
"version": "0.6.1",
"dev": true,
"license": "BSD-3-Clause",
- "peer": true,
"engines": {
"node": ">=0.10.0"
}
@@ -2775,7 +2759,6 @@
"version": "0.5.21",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"buffer-from": "^1.0.0",
"source-map": "^0.6.0"
@@ -7481,7 +7464,6 @@
"version": "1.4.1",
"dev": true,
"license": "ISC",
- "peer": true,
"engines": {
"node": ">=12"
}
@@ -7727,6 +7709,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,
@@ -7756,6 +7747,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,11 +11965,1108 @@
"tslib": "^2.4.0"
}
},
+ "node_modules/@react-native-community/cli": {
+ "version": "12.3.7",
+ "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-12.3.7.tgz",
+ "integrity": "sha512-7+mOhk+3+X3BjSJZZvYrDJynA00gPYTlvT28ZjiLlbuVGfqfNiBKaxuF7rty+gjjpch4iKGvLhIhSN5cuOsdHQ==",
+ "dev": true,
+ "dependencies": {
+ "@react-native-community/cli-clean": "12.3.7",
+ "@react-native-community/cli-config": "12.3.7",
+ "@react-native-community/cli-debugger-ui": "12.3.7",
+ "@react-native-community/cli-doctor": "12.3.7",
+ "@react-native-community/cli-hermes": "12.3.7",
+ "@react-native-community/cli-plugin-metro": "12.3.7",
+ "@react-native-community/cli-server-api": "12.3.7",
+ "@react-native-community/cli-tools": "12.3.7",
+ "@react-native-community/cli-types": "12.3.7",
+ "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": {
+ "react-native": "build/bin.js"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@react-native-community/cli-clean": {
+ "version": "12.3.7",
+ "resolved": "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-12.3.7.tgz",
+ "integrity": "sha512-BCYW77QqyxfhiMEBOoHyciJRNV6Rhz1RvclReIKnCA9wAwmoJBeu4Mu+AwiECA2bUITX16fvPt3NwDsSd1jwfQ==",
+ "dev": true,
+ "dependencies": {
+ "@react-native-community/cli-tools": "12.3.7",
+ "chalk": "^4.1.2",
+ "execa": "^5.0.0"
+ }
+ },
+ "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-config": {
+ "version": "12.3.7",
+ "resolved": "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-12.3.7.tgz",
+ "integrity": "sha512-IU2UhO9yj1rEBNhHWGzIXpPDzha4hizLP/PUOrhR4BUf6RVPUWEp+e1PXNGR0qjIf6esu7OC7t6mLOhH0NUJEw==",
+ "dev": true,
+ "dependencies": {
+ "@react-native-community/cli-tools": "12.3.7",
+ "chalk": "^4.1.2",
+ "cosmiconfig": "^5.1.0",
+ "deepmerge": "^4.3.0",
+ "glob": "^7.1.3",
+ "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/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-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-debugger-ui": {
+ "version": "12.3.7",
+ "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-12.3.7.tgz",
+ "integrity": "sha512-UHUFrRdcjWSCdWG9KIp2QjuRIahBQnb9epnQI7JCq6NFbFHYfEI4rI7msjMn+gG8/tSwKTV2PTPuPmZ5wWlE7Q==",
+ "dev": true,
+ "dependencies": {
+ "serve-static": "^1.13.1"
+ }
+ },
+ "node_modules/@react-native-community/cli-doctor": {
+ "version": "12.3.7",
+ "resolved": "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-12.3.7.tgz",
+ "integrity": "sha512-gCamZztRoAyhciuQPqdz4Xe4t3gOdNsaADNd+rva+Rx8W2PoPeNv60i7/et06wlsn6B6Sh0/hMiAftJbiHDFkg==",
+ "dev": true,
+ "dependencies": {
+ "@react-native-community/cli-config": "12.3.7",
+ "@react-native-community/cli-platform-android": "12.3.7",
+ "@react-native-community/cli-platform-ios": "12.3.7",
+ "@react-native-community/cli-tools": "12.3.7",
+ "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/is-interactive": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
+ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
+ "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/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": "12.3.7",
+ "resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-12.3.7.tgz",
+ "integrity": "sha512-ezzeiSKjRXK2+i1AAe7NhhN9CEHrgtRmTn2MAdBpE++N8fH5EQZgxFcGgGdwGvns2fm9ivyyeVnI5eAYwvM+jg==",
+ "dev": true,
+ "dependencies": {
+ "@react-native-community/cli-platform-android": "12.3.7",
+ "@react-native-community/cli-tools": "12.3.7",
+ "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-platform-android": {
+ "version": "12.3.7",
+ "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-12.3.7.tgz",
+ "integrity": "sha512-mOltF3cpjNdJb3WSFwEHc1GH4ibCcnOvQ34OdWyblKy9ijuvG5SjNTlYR/UW/CURaDi3OUKAhxQMTY5d27bzGQ==",
+ "dev": true,
+ "dependencies": {
+ "@react-native-community/cli-tools": "12.3.7",
+ "chalk": "^4.1.2",
+ "execa": "^5.0.0",
+ "fast-xml-parser": "^4.2.4",
+ "glob": "^7.1.3",
+ "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/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-community/cli-platform-ios": {
+ "version": "12.3.7",
+ "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-12.3.7.tgz",
+ "integrity": "sha512-2WnVsMH4ORZIhBm/5nCms1NeeKG4KarNC7PMLmrXWXB/bibDcaNsjrJiqnmCUcpTEvTQTokRfoO7Aj6NM0Cqow==",
+ "dev": true,
+ "dependencies": {
+ "@react-native-community/cli-tools": "12.3.7",
+ "chalk": "^4.1.2",
+ "execa": "^5.0.0",
+ "fast-xml-parser": "^4.0.12",
+ "glob": "^7.1.3",
+ "ora": "^5.4.1"
+ }
+ },
+ "node_modules/@react-native-community/cli-platform-ios/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-ios/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-ios/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-ios/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-ios/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-community/cli-platform-ios/node_modules/is-interactive": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
+ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@react-native-community/cli-platform-ios/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-ios/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-plugin-metro": {
+ "version": "12.3.7",
+ "resolved": "https://registry.npmjs.org/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-12.3.7.tgz",
+ "integrity": "sha512-ahEw0Vfnv2Nv/jdZ2QDuGjQ9l2SczO4lXjb3ubu5vEYNLyTw3jYsLMK6iES7YQ/ApQmKdG476HU1O9uZdpaYPg==",
+ "dev": true
+ },
+ "node_modules/@react-native-community/cli-server-api": {
+ "version": "12.3.7",
+ "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-12.3.7.tgz",
+ "integrity": "sha512-LYETs3CCjrLn1ZU0kYv44TywiIl5IPFHZGeXhAh2TtgOk4mo3kvXxECDil9CdO3bmDra6qyiG61KHvzr8IrHdg==",
+ "dev": true,
+ "dependencies": {
+ "@react-native-community/cli-debugger-ui": "12.3.7",
+ "@react-native-community/cli-tools": "12.3.7",
+ "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": "^7.5.1"
+ }
+ },
+ "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/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/ws": {
+ "version": "7.5.10",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
+ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==",
+ "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-native-community/cli-tools": {
+ "version": "12.3.7",
+ "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-12.3.7.tgz",
+ "integrity": "sha512-7NL/1/i+wzd4fBr/FSr3ypR05tiU/Kv9l/M1sL1c6jfcDtWXAL90R161gQkQFK7shIQ8Idp0dQX1rq49tSyfQw==",
+ "dev": true,
+ "dependencies": {
+ "appdirsjs": "^1.2.4",
+ "chalk": "^4.1.2",
+ "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/is-interactive": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
+ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
+ "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-types": {
+ "version": "12.3.7",
+ "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-12.3.7.tgz",
+ "integrity": "sha512-NFtUMyIrNfi3A5C1cjVKDVvYHvvOF7MnOMwdD8jm2NQKewQJrehKBh1eMuykKdqhWyZmuemD4KKhL8f4FxgG0w==",
+ "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/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/universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
"node_modules/@react-native/assets-registry": {
"version": "0.73.1",
"dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": ">=18"
}
@@ -11964,7 +13075,6 @@
"version": "0.73.4",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"@react-native/codegen": "0.73.3"
},
@@ -11976,7 +13086,6 @@
"version": "0.73.21",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"@babel/core": "^7.20.0",
"@babel/plugin-proposal-async-generator-functions": "^7.0.0",
@@ -12032,7 +13141,6 @@
"version": "0.73.3",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"@babel/parser": "^7.20.0",
"flow-parser": "^0.206.0",
@@ -12053,7 +13161,6 @@
"version": "7.2.3",
"dev": true,
"license": "ISC",
- "peer": true,
"dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
@@ -12069,11 +13176,81 @@
"url": "https://github.com/sponsors/isaacs"
}
},
+ "node_modules/@react-native/community-cli-plugin": {
+ "version": "0.73.18",
+ "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.73.18.tgz",
+ "integrity": "sha512-RN8piDh/eF+QT6YYmrj3Zd9uiaDsRY/kMT0FYR42j8/M/boE4hs4Xn0u91XzT8CAkU9q/ilyo3wJsXIJo2teww==",
+ "dev": true,
+ "dependencies": {
+ "@react-native-community/cli-server-api": "12.3.7",
+ "@react-native-community/cli-tools": "12.3.7",
+ "@react-native/dev-middleware": "0.73.8",
+ "@react-native/metro-babel-transformer": "0.73.15",
+ "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",
+ "readline": "^1.3.0"
+ },
+ "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/debugger-frontend": {
"version": "0.73.3",
"dev": true,
"license": "BSD-3-Clause",
- "peer": true,
"engines": {
"node": ">=18"
}
@@ -12082,7 +13259,6 @@
"version": "0.73.8",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"@isaacs/ttlcache": "^1.4.1",
"@react-native/debugger-frontend": "0.73.3",
@@ -12104,7 +13280,6 @@
"version": "2.6.9",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"ms": "2.0.0"
}
@@ -12112,14 +13287,12 @@
"node_modules/@react-native/dev-middleware/node_modules/ms": {
"version": "2.0.0",
"dev": true,
- "license": "MIT",
- "peer": true
+ "license": "MIT"
},
"node_modules/@react-native/dev-middleware/node_modules/open": {
"version": "7.4.2",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"is-docker": "^2.0.0",
"is-wsl": "^2.1.1"
@@ -12135,16 +13308,57 @@
"version": "6.2.2",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"async-limiter": "~1.0.0"
}
},
+ "node_modules/@react-native/gradle-plugin": {
+ "version": "0.73.4",
+ "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.73.4.tgz",
+ "integrity": "sha512-PMDnbsZa+tD55Ug+W8CfqXiGoGneSSyrBZCMb5JfiB3AFST3Uj5e6lw8SgI/B6SKZF7lG0BhZ6YHZsRZ5MlXmg==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@react-native/js-polyfills": {
+ "version": "0.73.1",
+ "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.73.1.tgz",
+ "integrity": "sha512-ewMwGcumrilnF87H4jjrnvGZEaPFCAC4ebraEK+CurDDmwST/bIicI4hrOAv+0Z0F7DEK4O4H7r8q9vH7IbN4g==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@react-native/metro-babel-transformer": {
+ "version": "0.73.15",
+ "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.73.15.tgz",
+ "integrity": "sha512-LlkSGaXCz+xdxc9819plmpsl4P4gZndoFtpjN3GMBIu6f7TBV0GVbyJAU4GE8fuAWPVSVL5ArOcdkWKSbI1klw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.20.0",
+ "@react-native/babel-preset": "0.73.21",
+ "hermes-parser": "0.15.0",
+ "nullthrows": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@babel/core": "*"
+ }
+ },
"node_modules/@react-native/normalize-color": {
"version": "2.1.0",
"dev": true,
"license": "MIT"
},
+ "node_modules/@react-native/normalize-colors": {
+ "version": "0.73.2",
+ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.73.2.tgz",
+ "integrity": "sha512-bRBcb2T+I88aG74LMVHaKms2p/T8aQd8+BZ7LuuzXlRfog1bMWWn/C5i0HVuvW4RPtXQYgIlGiXVDy9Ir1So/w==",
+ "dev": true
+ },
"node_modules/@react-stately/calendar": {
"version": "3.5.1",
"license": "Apache-2.0",
@@ -14987,6 +16201,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 +17890,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 +18018,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 +18456,6 @@
"version": "0.15.2",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"tslib": "^2.0.1"
},
@@ -18457,8 +19755,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 +19908,6 @@
"version": "7.0.0-bridge.0",
"dev": true,
"license": "MIT",
- "peer": true,
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
@@ -18902,7 +20198,6 @@
"version": "0.0.2",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"@babel/plugin-syntax-flow": "^7.12.1"
}
@@ -19956,6 +21251,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 +21626,6 @@
"version": "0.15.2",
"dev": true,
"license": "Apache-2.0",
- "peer": true,
"dependencies": {
"@types/node": "*",
"escape-string-regexp": "^4.0.0",
@@ -20324,7 +21651,6 @@
"version": "1.0.0",
"dev": true,
"license": "Apache-2.0",
- "peer": true,
"dependencies": {
"@types/node": "*",
"escape-string-regexp": "^4.0.0",
@@ -20338,7 +21664,6 @@
"version": "7.2.3",
"dev": true,
"license": "ISC",
- "peer": true,
"dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
@@ -20358,7 +21683,6 @@
"version": "1.0.4",
"dev": true,
"license": "MIT",
- "peer": true,
"bin": {
"mkdirp": "bin/cmd.js"
},
@@ -20370,7 +21694,6 @@
"version": "3.0.2",
"dev": true,
"license": "ISC",
- "peer": true,
"dependencies": {
"glob": "^7.1.3"
},
@@ -21355,7 +22678,6 @@
"version": "3.7.0",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"debug": "2.6.9",
"finalhandler": "1.1.2",
@@ -21378,7 +22700,6 @@
"version": "2.6.9",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"ms": "2.0.0"
}
@@ -21386,8 +22707,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 +24980,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",
@@ -23682,6 +25008,20 @@
"node": ">= 0.6.0"
}
},
+ "node_modules/deprecated-react-native-prop-types": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/deprecated-react-native-prop-types/-/deprecated-react-native-prop-types-5.0.0.tgz",
+ "integrity": "sha512-cIK8KYiiGVOFsKdPMmm1L3tA/Gl+JopXL6F5+C7x39MyPsQYnP57Im/D6bNUzcborD7fcMwiwZqcBdBXXZucYQ==",
+ "dev": true,
+ "dependencies": {
+ "@react-native/normalize-colors": "^0.73.0",
+ "invariant": "^2.2.4",
+ "prop-types": "^15.8.1"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/deprecation": {
"version": "2.3.1",
"dev": true,
@@ -24391,6 +25731,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 +27999,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 +28276,6 @@
"version": "1.1.2",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"debug": "2.6.9",
"encodeurl": "~1.0.2",
@@ -26919,7 +28293,6 @@
"version": "2.6.9",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"ms": "2.0.0"
}
@@ -26927,14 +28300,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"
},
@@ -27072,6 +28443,12 @@
"node": ">=8"
}
},
+ "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/flow-parser": {
"version": "0.206.0",
"license": "MIT",
@@ -29677,6 +31054,42 @@
"tslib": "^2.0.3"
}
},
+ "node_modules/hermes-estree": {
+ "version": "0.15.0",
+ "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.15.0.tgz",
+ "integrity": "sha512-lLYvAd+6BnOqWdnNbP/Q8xfl8LOGw4wVjfrNd9Gt8eoFzhNBRVD95n4l2ksfMVOoxuVyegs85g83KS9QOsxbVQ==",
+ "dev": true
+ },
+ "node_modules/hermes-parser": {
+ "version": "0.15.0",
+ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.15.0.tgz",
+ "integrity": "sha512-Q1uks5rjZlE9RjMMjSUCkGrEIPI5pKJILeCtK1VmTj7U4pf3wVPoo+cxfu+s4cBAPy2JzikIIdCZgBoR6x7U1Q==",
+ "dev": true,
+ "dependencies": {
+ "hermes-estree": "0.15.0"
+ }
+ },
+ "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 +31549,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 +32450,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 +34912,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 +34959,6 @@
"version": "4.3.0",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -33533,7 +34973,6 @@
"version": "4.1.2",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -33549,7 +34988,6 @@
"version": "2.0.1",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"color-name": "~1.1.4"
},
@@ -33560,20 +34998,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 +35416,6 @@
"version": "1.4.2",
"dev": true,
"license": "Apache-2.0",
- "peer": true,
"dependencies": {
"debug": "^2.6.9",
"marky": "^1.2.2"
@@ -33972,7 +35425,6 @@
"version": "2.6.9",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"ms": "2.0.0"
}
@@ -33980,8 +35432,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 +36082,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,
@@ -34803,6 +36260,143 @@
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
+ "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/long": {
"version": "5.2.3",
"resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz",
@@ -35080,8 +36674,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",
@@ -35314,180 +36907,783 @@
"vfile": "^6.0.0"
},
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-markdown": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz",
+ "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==",
+ "peer": true,
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "longest-streak": "^3.0.0",
+ "mdast-util-phrasing": "^4.0.0",
+ "mdast-util-to-string": "^4.0.0",
+ "micromark-util-decode-string": "^2.0.0",
+ "unist-util-visit": "^5.0.0",
+ "zwitch": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
+ "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
+ "peer": true,
+ "dependencies": {
+ "@types/mdast": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdn-data": {
+ "version": "2.0.14",
+ "dev": true,
+ "license": "CC0-1.0"
+ },
+ "node_modules/meant": {
+ "version": "1.0.3",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/media-typer": {
+ "version": "0.3.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mem": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "map-age-cleaner": "^0.1.3",
+ "mimic-fn": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/mem?sponsor=1"
+ }
+ },
+ "node_modules/mem/node_modules/mimic-fn": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/memfs": {
+ "version": "3.5.2",
+ "dev": true,
+ "license": "Unlicense",
+ "dependencies": {
+ "fs-monkey": "^1.0.3"
+ },
+ "engines": {
+ "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,
+ "license": "ISC",
+ "dependencies": {
+ "d": "^1.0.1",
+ "es5-ext": "^0.10.53",
+ "es6-weak-map": "^2.0.3",
+ "event-emitter": "^0.3.5",
+ "is-promise": "^2.2.2",
+ "lru-queue": "^0.1.0",
+ "next-tick": "^1.1.0",
+ "timers-ext": "^0.1.7"
+ }
+ },
+ "node_modules/memory-cache": {
+ "version": "0.2.0",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "peer": true
+ },
+ "node_modules/memorystream": {
+ "version": "0.3.1",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/meow": {
+ "version": "6.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/minimist": "^1.2.0",
+ "camelcase-keys": "^6.2.2",
+ "decamelize-keys": "^1.1.0",
+ "hard-rejection": "^2.1.0",
+ "minimist-options": "^4.0.2",
+ "normalize-package-data": "^2.5.0",
+ "read-pkg-up": "^7.0.1",
+ "redent": "^3.0.0",
+ "trim-newlines": "^3.0.0",
+ "type-fest": "^0.13.1",
+ "yargs-parser": "^18.1.3"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/meow/node_modules/type-fest": {
+ "version": "0.13.1",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/merge-descriptors": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "license": "MIT"
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/methods": {
+ "version": "1.1.2",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "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/mdast-util-to-markdown": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz",
- "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==",
- "peer": true,
+ "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": {
- "@types/mdast": "^4.0.0",
- "@types/unist": "^3.0.0",
- "longest-streak": "^3.0.0",
- "mdast-util-phrasing": "^4.0.0",
- "mdast-util-to-string": "^4.0.0",
- "micromark-util-decode-string": "^2.0.0",
- "unist-util-visit": "^5.0.0",
- "zwitch": "^2.0.0"
+ "terser": "^5.15.0"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
+ "engines": {
+ "node": ">=18"
}
},
- "node_modules/mdast-util-to-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
- "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
- "peer": true,
+ "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": {
- "@types/mdast": "^4.0.0"
+ "@babel/runtime": "^7.0.0"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
+ "engines": {
+ "node": ">=18"
}
},
- "node_modules/mdn-data": {
- "version": "2.0.14",
+ "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,
- "license": "CC0-1.0"
+ "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/meant": {
- "version": "1.0.3",
+ "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,
- "license": "MIT"
+ "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/media-typer": {
- "version": "0.3.0",
+ "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,
- "license": "MIT",
+ "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": ">= 0.6"
+ "node": ">=18"
}
},
- "node_modules/mem": {
- "version": "8.1.1",
+ "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,
- "license": "MIT",
"dependencies": {
- "map-age-cleaner": "^0.1.3",
- "mimic-fn": "^3.1.0"
+ "@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": ">=10"
+ "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/sindresorhus/mem?sponsor=1"
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/mem/node_modules/mimic-fn": {
- "version": "3.1.0",
+ "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,
- "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
"engines": {
- "node": ">=8"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
}
},
- "node_modules/memfs": {
- "version": "3.5.2",
+ "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,
- "license": "Unlicense",
"dependencies": {
- "fs-monkey": "^1.0.3"
+ "color-name": "~1.1.4"
},
"engines": {
- "node": ">= 4.0.0"
+ "node": ">=7.0.0"
}
},
- "node_modules/memoizee": {
- "version": "0.4.15",
+ "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,
- "license": "ISC",
"dependencies": {
- "d": "^1.0.1",
- "es5-ext": "^0.10.53",
- "es6-weak-map": "^2.0.3",
- "event-emitter": "^0.3.5",
- "is-promise": "^2.2.2",
- "lru-queue": "^0.1.0",
- "next-tick": "^1.1.0",
- "timers-ext": "^0.1.7"
+ "ms": "2.0.0"
}
},
- "node_modules/memory-cache": {
- "version": "0.2.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,
- "license": "BSD-2-Clause",
- "peer": 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/memorystream": {
- "version": "0.3.1",
+ "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": ">= 0.10.0"
+ "node": ">=8"
}
},
- "node_modules/meow": {
- "version": "6.1.1",
+ "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,
- "license": "MIT",
"dependencies": {
- "@types/minimist": "^1.2.0",
- "camelcase-keys": "^6.2.2",
- "decamelize-keys": "^1.1.0",
- "hard-rejection": "^2.1.0",
- "minimist-options": "^4.0.2",
- "normalize-package-data": "^2.5.0",
- "read-pkg-up": "^7.0.1",
- "redent": "^3.0.0",
- "trim-newlines": "^3.0.0",
- "type-fest": "^0.13.1",
- "yargs-parser": "^18.1.3"
+ "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": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/meow/node_modules/type-fest": {
- "version": "0.13.1",
+ "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,
- "license": "(MIT OR CC0-1.0)",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
"engines": {
"node": ">=10"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
- "node_modules/merge-descriptors": {
- "version": "1.0.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/merge-stream": {
+ "node_modules/metro/node_modules/ms": {
"version": "2.0.0",
- "license": "MIT"
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true
},
- "node_modules/merge2": {
- "version": "1.4.1",
- "license": "MIT",
- "engines": {
- "node": ">= 8"
+ "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/methods": {
- "version": "1.1.2",
+ "node_modules/metro/node_modules/ws": {
+ "version": "7.5.10",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
+ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==",
"dev": true,
- "license": "MIT",
"engines": {
- "node": ">= 0.6"
+ "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/micromark": {
@@ -36645,6 +38841,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 +38874,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 +39018,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,
@@ -37261,6 +39485,15 @@
"url": "https://github.com/sponsors/isaacs"
}
},
+ "node_modules/ob1": {
+ "version": "0.80.9",
+ "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.80.9.tgz",
+ "integrity": "sha512-v9yOxowkZbxWhKOaaTyLjIm1aLy4ebMNcSn4NYJKOAI/Qv+SkfEfszpLr2GIxsccmb2Y2HA9qtsqiIJ80ucpVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/object-assign": {
"version": "4.1.1",
"license": "MIT",
@@ -39833,6 +42066,15 @@
"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 +42417,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": "4.28.5",
+ "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.28.5.tgz",
+ "integrity": "sha512-cq/o30z9W2Wb4rzBefjv5fBalHU0rJGZCHAkf/RHSBWSSYwh8PlQTqqOJmgIIbBtpj27T6FIPXeomIjZtCNVqA==",
+ "devOptional": true,
+ "dependencies": {
+ "shell-quote": "^1.6.1",
+ "ws": "^7"
+ }
+ },
+ "node_modules/react-devtools-core/node_modules/ws": {
+ "version": "7.5.10",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
+ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==",
+ "devOptional": 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 +42622,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 +42923,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 +42940,6 @@
"version": "0.21.5",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"ast-types": "0.15.2",
"esprima": "~4.0.0",
@@ -40652,7 +42954,6 @@
"version": "0.6.1",
"dev": true,
"license": "BSD-3-Clause",
- "peer": true,
"engines": {
"node": ">=0.10.0"
}
@@ -41660,10 +43961,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 +44083,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,
@@ -41989,7 +44301,7 @@
},
"node_modules/shell-quote": {
"version": "1.8.1",
- "dev": true,
+ "devOptional": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -42813,7 +45125,6 @@
"version": "0.1.10",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"type-fest": "^0.7.1"
},
@@ -42825,7 +45136,6 @@
"version": "0.7.1",
"dev": true,
"license": "(MIT OR CC0-1.0)",
- "peer": true,
"engines": {
"node": ">=8"
}
@@ -43202,6 +45512,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 +46097,6 @@
"version": "0.8.4",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"rimraf": "~2.6.2"
},
@@ -43793,7 +46108,6 @@
"version": "2.0.0",
"dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": ">=8"
}
@@ -43802,7 +46116,6 @@
"version": "7.2.3",
"dev": true,
"license": "ISC",
- "peer": true,
"dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
@@ -43822,7 +46135,6 @@
"version": "2.6.3",
"dev": true,
"license": "ISC",
- "peer": true,
"dependencies": {
"glob": "^7.1.3"
},
@@ -44090,6 +46402,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 +49263,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 +49872,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,7 +52645,7 @@
"@clerk/shared": "2.4.0",
"@clerk/types": "4.9.0",
"base-64": "^1.0.0",
- "react-native-url-polyfill": "2.0.0",
+ "react-native-url-polyfill": "^2.0.0",
"tslib": "2.4.1"
},
"devDependencies": {
@@ -50326,16 +52656,50 @@
"@types/react-dom": "*",
"expo-auth-session": "^5.4.0",
"expo-web-browser": "^12.8.2",
+ "react-native": "^0.73.9",
"typescript": "*"
},
"engines": {
"node": ">=18.17.0"
},
"peerDependencies": {
- "expo-auth-session": ">=4",
+ "expo-auth-session": ">=5",
"expo-web-browser": ">=12.5.0",
"react": ">=18",
- "react-dom": ">=18"
+ "react-dom": ">=18",
+ "react-native": ">=0.73"
+ }
+ },
+ "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/virtualized-lists": {
+ "version": "0.73.4",
+ "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.73.4.tgz",
+ "integrity": "sha512-HpmLg1FrEiDtrtAbXiwCgXFYyloK/dOIPIuWW3fsqukwJEWAiTzm1nXGJ7xPU5XTHiWZ4sKup5Ebaj8z7iyWog==",
+ "dev": true,
+ "dependencies": {
+ "invariant": "^2.2.4",
+ "nullthrows": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "react-native": "*"
}
},
"packages/expo/node_modules/@types/node": {
@@ -50346,6 +52710,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 +52815,146 @@
"invariant": "^2.2.4"
}
},
+ "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==",
+ "peer": true,
+ "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.73.9",
+ "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.73.9.tgz",
+ "integrity": "sha512-U9Lc6GMdANG2/9uREZe/UTQEzdVWw6NLRYxBYaFWNqiu/qZAmZ0aXSNcVF6hWw/95Ex0IGQx6EVMT4iPmuSNQw==",
+ "dev": true,
+ "dependencies": {
+ "@jest/create-cache-key-function": "^29.6.3",
+ "@react-native-community/cli": "12.3.7",
+ "@react-native-community/cli-platform-android": "12.3.7",
+ "@react-native-community/cli-platform-ios": "12.3.7",
+ "@react-native/assets-registry": "0.73.1",
+ "@react-native/codegen": "0.73.3",
+ "@react-native/community-cli-plugin": "0.73.18",
+ "@react-native/gradle-plugin": "0.73.4",
+ "@react-native/js-polyfills": "0.73.1",
+ "@react-native/normalize-colors": "0.73.2",
+ "@react-native/virtualized-lists": "0.73.4",
+ "abort-controller": "^3.0.0",
+ "anser": "^1.4.9",
+ "ansi-regex": "^5.0.0",
+ "base64-js": "^1.5.1",
+ "chalk": "^4.0.0",
+ "deprecated-react-native-prop-types": "^5.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": "^4.27.7",
+ "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": {
+ "react": "18.2.0"
+ }
+ },
+ "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",
diff --git a/package.json b/package.json
index e3b9c28cc3f..fa2668e1d7b 100644
--- a/package.json
+++ b/package.json
@@ -39,6 +39,7 @@
"test:integration:generic": "E2E_APP_ID=react.vite.*,next.appRouter.withEmailCodes npm run test:integration:base -- --grep @generic",
"test:integration:nextjs": "E2E_APP_ID=next.appRouter.* npm run test:integration:base -- --grep @nextjs",
"test:integration:astro": "E2E_APP_ID=astro.* npm run test:integration:base -- --grep @astro",
+ "test:integration:expo-web": "E2E_APP_ID=expo.expo-web npm run test:integration:base -- --grep @expo-web",
"test:integration:quickstart": "E2E_APP_ID=quickstart.* npm run test:integration:base -- --grep @quickstart",
"test:integration:sessions": "npm run test:integration:base -- --grep @sessions",
"test:integration:remix": "echo 'placeholder'",
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/README.md b/packages/expo/README.md
index e66b593f938..dabbb93126c 100644
--- a/packages/expo/README.md
+++ b/packages/expo/README.md
@@ -36,23 +36,26 @@ Clerk is the easiest way to add authentication and user management to your Expo
### Prerequisites
-- React v18+
+- React 18 or later
+- Expo 50 or later
+- React Native 0.73 or later
- Node.js `>=18.17.0` or later
- An application built using Expo
-If an expo app already exists, you can skip this section and go straight to Installation.
+If an Expo app already exists, you can skip this section and go straight to installation.
Otherwise, you can create a new Expo app by running:
-```
-npx create-expo-app my-app
+```shell
+npx create-expo-app@latest my-app --template blank
cd my-app
+npx expo install react-dom react-native-web @expo/metro-runtime
```
### Installation
Next, install the Clerk Expo SDK:
-```sh
+```shell
npm install @clerk/clerk-expo
```
@@ -90,8 +93,8 @@ const styles = StyleSheet.create({
A token cache is required to work with Clerk and Expo. This is entirely up to you how you handle the token cache - in this example we're going to use the `expo-secure-store` library. First, install it by running
-```
-npm i expo-secure-store
+```shell
+npm install expo-secure-store
```
and then add the tokenCache to your entry file, as shown here:
diff --git a/packages/expo/package.json b/packages/expo/package.json
index da5d956b8f1..51f051aab21 100644
--- a/packages/expo/package.json
+++ b/packages/expo/package.json
@@ -23,11 +23,22 @@
},
"license": "MIT",
"author": "Clerk",
- "main": "dist/index.js",
- "source": "src/index.js",
- "typings": "dist/index.d.ts",
+ "exports": {
+ ".": {
+ "types": "./dist/index.d.ts",
+ "default": "./dist/index.js"
+ },
+ "./web": {
+ "types": "./dist/web/index.d.ts",
+ "default": "./dist/web/index.js"
+ }
+ },
+ "main": "./dist/index.js",
+ "source": "./src/index.ts",
+ "types": "./dist/index.d.ts",
"files": [
- "dist"
+ "dist",
+ "web"
],
"scripts": {
"build": "tsup",
@@ -55,11 +66,13 @@
"@types/react-dom": "*",
"expo-auth-session": "^5.4.0",
"expo-web-browser": "^12.8.2",
+ "react-native": "^0.73.9",
"typescript": "*"
},
"peerDependencies": {
- "expo-auth-session": ">=4",
+ "expo-auth-session": ">=5",
"expo-web-browser": ">=12.5.0",
+ "react-native": ">=0.73",
"react": ">=18",
"react-dom": ">=18"
},
diff --git a/packages/expo/src/cache.ts b/packages/expo/src/cache/MemoryTokenCache.ts
similarity index 67%
rename from packages/expo/src/cache.ts
rename to packages/expo/src/cache/MemoryTokenCache.ts
index 3294c34608e..14557c7ec4a 100644
--- a/packages/expo/src/cache.ts
+++ b/packages/expo/src/cache/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/cache/index.ts b/packages/expo/src/cache/index.ts
new file mode 100644
index 00000000000..80025147e93
--- /dev/null
+++ b/packages/expo/src/cache/index.ts
@@ -0,0 +1,3 @@
+export { TokenCache } from './types';
+
+export { MemoryTokenCache } from './MemoryTokenCache';
diff --git a/packages/expo/src/cache/types.ts b/packages/expo/src/cache/types.ts
new file mode 100644
index 00000000000..a22778f95c4
--- /dev/null
+++ b/packages/expo/src/cache/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/components/controlComponents.tsx b/packages/expo/src/components/controlComponents.tsx
new file mode 100644
index 00000000000..dcb0c462695
--- /dev/null
+++ b/packages/expo/src/components/controlComponents.tsx
@@ -0,0 +1 @@
+export { ClerkLoaded, ClerkLoading, SignedIn, SignedOut, Protect } from '@clerk/clerk-react';
diff --git a/packages/expo/src/components/index.ts b/packages/expo/src/components/index.ts
new file mode 100644
index 00000000000..782ec20d5d7
--- /dev/null
+++ b/packages/expo/src/components/index.ts
@@ -0,0 +1 @@
+export * from './controlComponents';
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/useOAuth.ts b/packages/expo/src/hooks/useOAuth.ts
similarity index 96%
rename from packages/expo/src/useOAuth.ts
rename to packages/expo/src/hooks/useOAuth.ts
index 42fcc96e93e..3a12dd09aa3 100644
--- a/packages/expo/src/useOAuth.ts
+++ b/packages/expo/src/hooks/useOAuth.ts
@@ -3,6 +3,8 @@ import type { OAuthStrategy, SetActive, SignInResource, SignUpResource } from '@
import * as AuthSession from 'expo-auth-session';
import * as WebBrowser from 'expo-web-browser';
+import { errorThrower } from '../utils/errors';
+
export type UseOAuthFlowParams = {
strategy: OAuthStrategy;
redirectUrl?: string;
@@ -25,7 +27,7 @@ export type StartOAuthFlowReturnType = {
export function useOAuth(useOAuthParams: UseOAuthFlowParams) {
const { strategy } = useOAuthParams || {};
if (!strategy) {
- throw new Error('Missing oauth strategy');
+ return errorThrower.throw('Missing oauth strategy');
}
const { signIn, setActive, isLoaded: isSignInLoaded } = useSignIn();
diff --git a/packages/expo/src/index.ts b/packages/expo/src/index.ts
index 4fa4c6b6a0e..acb5c041391 100644
--- a/packages/expo/src/index.ts
+++ b/packages/expo/src/index.ts
@@ -1,32 +1,16 @@
-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';
/**
* @deprecated Use `getClerkInstance()` instead.
*/
-export { clerk as Clerk } from './singleton';
-export { getClerkInstance } from './singleton';
+export { clerk as Clerk } from './provider/singleton';
+export { getClerkInstance } from './provider/singleton';
-export * from './ClerkProvider';
-export * from './useOAuth';
+export * from './provider/ClerkProvider';
+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/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 53%
rename from packages/expo/src/ClerkProvider.tsx
rename to packages/expo/src/provider/ClerkProvider.tsx
index c25b7280663..7b6b692771b 100644
--- a/packages/expo/src/ClerkProvider.tsx
+++ b/packages/expo/src/provider/ClerkProvider.tsx
@@ -1,21 +1,30 @@
-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 * as WebBrowser from 'expo-web-browser';
-import type { TokenCache } from './cache';
-import { isReactNative } from './runtime';
+import type { TokenCache } from '../cache/types';
+import { isNative, isWeb } from '../utils/runtime';
import { getClerkInstance } from './singleton';
-export type ClerkProviderProps = ClerkReactProviderProps & {
+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 || '';
+ if (isWeb()) {
+ // This is needed in order for useOAuth to work correctly on web.
+ WebBrowser.maybeCompleteAuthSession();
+ }
+
return (
{children}
diff --git a/packages/expo/src/provider/singleton/createClerkInstance.ts b/packages/expo/src/provider/singleton/createClerkInstance.ts
new file mode 100644
index 00000000000..4067f598c88
--- /dev/null
+++ b/packages/expo/src/provider/singleton/createClerkInstance.ts
@@ -0,0 +1,61 @@
+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 '../../cache/MemoryTokenCache';
+import { errorThrower } from '../../errorThrower';
+import type { BuildClerkOptions } from './types';
+
+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;
+
+export function createClerkInstance(ClerkClass: typeof Clerk) {
+ return (options?: BuildClerkOptions): HeadlessBrowserClerk | BrowserClerk => {
+ const {
+ publishableKey = process.env.EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY || 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..20b5206a4a8
--- /dev/null
+++ b/packages/expo/src/provider/singleton/singleton.ts
@@ -0,0 +1,29 @@
+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';
+
+/**
+ * Access or create a Clerk instance outside of React. If you are using it in Expo Web then it will only access the existing instance from `window.Clerk`
+ * @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 | BrowserClerk
+ */
+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..88c1a3d3904
--- /dev/null
+++ b/packages/expo/src/provider/singleton/singleton.web.ts
@@ -0,0 +1,14 @@
+import type { BrowserClerk, HeadlessBrowserClerk } from '@clerk/clerk-react';
+
+import type { BuildClerkOptions } from './types';
+
+/**
+ * @deprecated Use `getClerkInstance` instead. `Clerk` will be removed in the next major version.
+ */
+export const clerk = globalThis?.window?.Clerk;
+
+/**
+ * No need to use options here as we are not creating a new instance of Clerk, we are just getting the existing instance from the window
+ */
+export const getClerkInstance = (_options?: BuildClerkOptions): HeadlessBrowserClerk | BrowserClerk | undefined =>
+ globalThis?.window?.Clerk;
diff --git a/packages/expo/src/provider/singleton/types.ts b/packages/expo/src/provider/singleton/types.ts
new file mode 100644
index 00000000000..ac778671267
--- /dev/null
+++ b/packages/expo/src/provider/singleton/types.ts
@@ -0,0 +1,6 @@
+import type { TokenCache } from '../../cache/types';
+
+export type BuildClerkOptions = {
+ publishableKey?: string;
+ tokenCache?: TokenCache;
+};
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/singleton.ts b/packages/expo/src/singleton.ts
deleted file mode 100644
index 1929b00ecae..00000000000
--- a/packages/expo/src/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 type { TokenCache } from './cache';
-import { MemoryTokenCache } from './cache';
-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
- __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
- __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/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..07d7bbd28de
--- /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 !isWeb();
+}
+
+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/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/web/uiComponents.tsx b/packages/expo/src/web/uiComponents.tsx
new file mode 100644
index 00000000000..adcd7abc0f1
--- /dev/null
+++ b/packages/expo/src/web/uiComponents.tsx
@@ -0,0 +1,51 @@
+import {
+ CreateOrganization as BaseCreateOrganization,
+ GoogleOneTap as BaseGoogleOneTap,
+ OrganizationList as BaseOrganizationList,
+ OrganizationProfile as BaseOrganizationProfile,
+ OrganizationSwitcher as BaseOrganizationSwitcher,
+ SignIn as BaseSignIn,
+ SignInButton as BaseSignInButton,
+ SignInWithMetamaskButton as BaseSignInWithMetamaskButton,
+ SignOutButton as BaseSignOutButton,
+ SignUp as BaseSignUp,
+ SignUpButton as BaseSignUpButton,
+ UserButton as BaseUserButton,
+ UserProfile as BaseUserProfile,
+} from '@clerk/clerk-react';
+import { Platform } from 'react-native';
+
+import { errorThrower } from '../utils/errors';
+
+const ErrorComponent = (componentName: string) => {
+ errorThrower.throw(`<${componentName}/> component is not supported in native environments.`);
+};
+
+function WrapComponent(component: T) {
+ const commonentName = component.displayName.replace('withClerk(', '').replace(')', '');
+
+ // @ts-expect-error - This is just to make the function signature match the original
+ return Platform.select({
+ // @ts-expect-error - This is just to make the function signature match the original
+ native: () => () => ErrorComponent(commonentName),
+ 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 UserProfile: typeof BaseUserProfile = WrapComponent(BaseUserProfile);
+
+export const OrganizationProfile: typeof BaseOrganizationProfile = WrapComponent(BaseOrganizationProfile);
+export const OrganizationSwitcher: typeof BaseOrganizationSwitcher = WrapComponent(BaseOrganizationSwitcher);
+export const OrganizationList: typeof BaseOrganizationList = WrapComponent(BaseOrganizationList);
+export const CreateOrganization: typeof BaseCreateOrganization = WrapComponent(BaseCreateOrganization);
+
+export const SignInButton: typeof BaseSignInButton = WrapComponent(BaseSignInButton);
+export const SignUpButton: typeof BaseSignUpButton = WrapComponent(BaseSignUpButton);
+export const SignOutButton: typeof BaseSignOutButton = WrapComponent(BaseSignOutButton);
+export const SignInWithMetamaskButton: typeof BaseSignInWithMetamaskButton =
+ WrapComponent(BaseSignInWithMetamaskButton);
+export const GoogleOneTap: typeof BaseGoogleOneTap = WrapComponent(BaseGoogleOneTap);
diff --git a/packages/expo/tsconfig.json b/packages/expo/tsconfig.json
index d423ec1c4af..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,
@@ -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/web/package.json b/packages/expo/web/package.json
new file mode 100644
index 00000000000..9a9b87d71eb
--- /dev/null
+++ b/packages/expo/web/package.json
@@ -0,0 +1,4 @@
+{
+ "main": "../dist/web/index.js",
+ "types": "../dist/web/index.d.ts"
+}
diff --git a/turbo.json b/turbo.json
index 2e082aff35c..85f941608ab 100644
--- a/turbo.json
+++ b/turbo.json
@@ -199,6 +199,12 @@
"env": ["CLEANUP", "DEBUG", "E2E_*", "INTEGRATION_INSTANCE_KEYS"],
"inputs": ["integration/**"],
"outputLogs": "new-only"
+ },
+ "//#test:integration:expo-web": {
+ "dependsOn": ["^@clerk/clerk-js#build", "^@clerk/clerk-expo#build", "^@clerk/clerk-react#build"],
+ "env": ["CLEANUP", "DEBUG", "E2E_*", "INTEGRATION_INSTANCE_KEYS"],
+ "inputs": ["integration/**"],
+ "outputLogs": "new-only"
}
}
}