Browse Source

feat(app): 新增主入口和公共上下文

- 新增 AppProvider、AuthContext、CommonContext等上下文组件
- 实现用户认证和公共信息的本地存储和管理
- 添加主路由和导航容器组件
- 新增主视图屏幕组件
- 更新资源文件引用
xuqm 4 days ago
parent
commit
b1f82a5d78
62 changed files with 2183 additions and 133 deletions
  1. 3 3
      babel.config.js
  2. 2 2
      bundle/android/buz.android.bundle
  3. 0 0
      bundle/android/common.android.bundle
  4. BIN
      bundle/android/drawable-mdpi/node_modules_reactnavigation_elements_lib_module_assets_backicon.png
  5. BIN
      bundle/android/drawable-mdpi/node_modules_reactnavigation_elements_lib_module_assets_backiconmask.png
  6. BIN
      bundle/android/drawable-mdpi/node_modules_reactnavigation_elements_lib_module_assets_clearicon.png
  7. BIN
      bundle/android/drawable-mdpi/node_modules_reactnavigation_elements_lib_module_assets_closeicon.png
  8. BIN
      bundle/android/drawable-mdpi/node_modules_reactnavigation_elements_lib_module_assets_searchicon.png
  9. BIN
      bundle/android/drawable-mdpi/src_common_assets_images_common_arrow_back.png
  10. BIN
      bundle/android/drawable-xhdpi/node_modules_reactnavigation_elements_lib_module_assets_backicon.png
  11. BIN
      bundle/android/drawable-xhdpi/node_modules_reactnavigation_elements_lib_module_assets_clearicon.png
  12. BIN
      bundle/android/drawable-xhdpi/node_modules_reactnavigation_elements_lib_module_assets_closeicon.png
  13. BIN
      bundle/android/drawable-xhdpi/node_modules_reactnavigation_elements_lib_module_assets_searchicon.png
  14. BIN
      bundle/android/drawable-xhdpi/src_common_assets_images_common_arrow_back.png
  15. BIN
      bundle/android/drawable-xxhdpi/node_modules_reactnavigation_elements_lib_module_assets_backicon.png
  16. BIN
      bundle/android/drawable-xxhdpi/node_modules_reactnavigation_elements_lib_module_assets_clearicon.png
  17. BIN
      bundle/android/drawable-xxhdpi/node_modules_reactnavigation_elements_lib_module_assets_closeicon.png
  18. BIN
      bundle/android/drawable-xxhdpi/node_modules_reactnavigation_elements_lib_module_assets_searchicon.png
  19. BIN
      bundle/android/drawable-xxhdpi/src_common_assets_images_common_arrow_back.png
  20. BIN
      bundle/android/drawable-xxxhdpi/node_modules_reactnavigation_elements_lib_module_assets_backicon.png
  21. BIN
      bundle/android/drawable-xxxhdpi/node_modules_reactnavigation_elements_lib_module_assets_clearicon.png
  22. BIN
      bundle/android/drawable-xxxhdpi/node_modules_reactnavigation_elements_lib_module_assets_closeicon.png
  23. BIN
      bundle/android/drawable-xxxhdpi/node_modules_reactnavigation_elements_lib_module_assets_searchicon.png
  24. 1 1
      bundle/android/raw/keep.xml
  25. 1 1
      bundle/ios/common.ios.bundle
  26. 2 2
      bundle/ios/hospital.ios.bundle
  27. 0 0
      config/bundleCommonInfo.json
  28. 2 2
      index.js
  29. 11 5
      package.json
  30. 26 67
      src/app/App.tsx
  31. 2 0
      src/app/constants/index.ts
  32. 53 0
      src/app/constants/types.ts
  33. 62 0
      src/app/constants/values.ts
  34. 11 0
      src/app/contexts/AppProvider.tsx
  35. 118 0
      src/app/contexts/AuthContext.tsx
  36. 86 0
      src/app/contexts/CommonContext.tsx
  37. 65 0
      src/app/contexts/useAuth.ts
  38. 62 0
      src/app/contexts/useCommon.ts
  39. 3 0
      src/app/routes/MainParamList.ts
  40. 56 0
      src/app/routes/MainStack.tsx
  41. 11 0
      src/app/routes/NavigationContainer.tsx
  42. 16 0
      src/app/screens/main/MainViewScreen.tsx
  43. 1 1
      src/buz.ts
  44. 9 15
      src/common/NavigationHelper.ts
  45. 37 2
      src/common/StorageHelper.ts
  46. BIN
      src/common/assets/images/common_arrow_back.png
  47. BIN
      src/common/assets/images/common_arrow_back@2x.png
  48. BIN
      src/common/assets/images/common_arrow_back@3x.png
  49. 12 0
      src/common/common.ts
  50. 473 0
      src/common/components/Alert.tsx
  51. 408 0
      src/common/components/BottomSheet.tsx
  52. 18 0
      src/common/components/HeaderBackImage.tsx
  53. 0 5
      src/hospital/hospital.ts
  54. 3 3
      src/miniapp/hospital/HospitalMain.tsx
  55. 0 0
      src/miniapp/hospital/README.md
  56. 5 0
      src/miniapp/hospital/hospital.ts
  57. 0 0
      src/miniapp/ywq/README.md
  58. 2 2
      src/miniapp/ywq/YwqMain.tsx
  59. 5 0
      src/miniapp/ywq/ywq.ts
  60. 0 5
      src/ywq/ywq.ts
  61. 6 6
      tsconfig.json
  62. 611 11
      yarn.lock

+ 3 - 3
babel.config.js

@@ -7,10 +7,10 @@ module.exports = {
         root: ['.'],
         alias: {
           '@': './src',
-          '@ywx': './src/ywq',
-          '@app': './src/app',
-          '@hospital': './src/hospital',
           '@common': './src/common',
+          '@app': './src/app',
+          '@ywx': './src/miniapp/ywq',
+          '@hospital': './src/miniapp/hospital',
         },
       },
     ],

+ 2 - 2
bundle/android/buz.android.bundle

@@ -1,7 +1,7 @@
 __d(function(g,r,i,a,m,e,d){r(d[0]),r(d[1])},10000000,[10000001,10000003]);
 __d(function(g,r,i,a,m,e,d){var n=r(d[0]),t=r(d[1]),p=n(r(d[2]));t.AppRegistry.registerComponent(r(d[3]).Apps.Ywq,function(){return p.default})},10000001,[1,2,10000002,492]);
 __d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var n=r(d[1]),o=t(r(d[2])),s=r(d[3]);var l=n.StyleSheet.create({container:{flex:1}});e.default=function(){var t='dark'===(0,n.useColorScheme)();return(0,s.jsxs)(n.View,{style:l.container,children:[(0,s.jsx)(n.StatusBar,{barStyle:t?'light-content':'dark-content'}),(0,s.jsx)(n.View,{style:{height:100}}),(0,s.jsx)(n.Button,{title:'onConfirm',onPress:function(){}}),(0,s.jsx)(n.View,{style:{height:15}}),(0,s.jsx)(n.Button,{title:'Toast',onPress:function(){(0,r(d[4]).showMessage)('\u533b\u7f51\u7b7e\u5f39\u51fatoast-error','error')}}),(0,s.jsx)(o.default,{})]})}},10000002,[1,2,511,243,538]);
-__d(function(g,r,i,a,m,e,d){var t=r(d[0]),n=r(d[1]),p=t(r(d[2]));n.AppRegistry.registerComponent(r(d[3]).Apps.Hospital,function(){return p.default})},10000003,[1,2,10000004,492]);
+__d(function(g,r,i,a,m,e,d){var t=r(d[0]),n=r(d[1]),p=t(r(d[2]));n.AppRegistry.registerComponent(r(d[3]).Apps.HospitalMain,function(){return p.default})},10000003,[1,2,10000004,492]);
 __d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var n=r(d[1]),o=t(r(d[2])),s=r(d[3]);var l=n.StyleSheet.create({container:{flex:1}});e.default=function(){var t='dark'===(0,n.useColorScheme)();return(0,s.jsxs)(n.View,{style:l.container,children:[(0,s.jsx)(n.StatusBar,{barStyle:t?'light-content':'dark-content'}),(0,s.jsx)(n.View,{style:{height:100}}),(0,s.jsx)(n.Text,{children:"\u4e92\u8054\u7f51\u533b\u9662"}),(0,s.jsx)(n.Button,{title:'\u8fd4\u56de',onPress:function(){(0,r(d[4]).pop)()}}),(0,s.jsx)(n.View,{style:{height:15}}),(0,s.jsx)(n.Button,{title:'Toast',onPress:function(){(0,r(d[5]).showMessage)('\u4e92\u8054\u7f51\u533b\u9662\u5f39\u51fatoast','info','common\u5411\u4e0b\u517c\u5bb9')}}),(0,s.jsx)(o.default,{})]})}},10000004,[1,2,511,243,492,538]);
 __r(108);
-__r(10000000);
+__r(10000000);

File diff suppressed because it is too large
+ 0 - 0
bundle/android/common.android.bundle


BIN
bundle/android/drawable-mdpi/node_modules_reactnavigation_elements_lib_module_assets_backicon.png


BIN
bundle/android/drawable-mdpi/node_modules_reactnavigation_elements_lib_module_assets_backiconmask.png


BIN
bundle/android/drawable-mdpi/node_modules_reactnavigation_elements_lib_module_assets_clearicon.png


BIN
bundle/android/drawable-mdpi/node_modules_reactnavigation_elements_lib_module_assets_closeicon.png


BIN
bundle/android/drawable-mdpi/node_modules_reactnavigation_elements_lib_module_assets_searchicon.png


BIN
bundle/android/drawable-mdpi/src_common_assets_images_common_arrow_back.png


BIN
bundle/android/drawable-xhdpi/node_modules_reactnavigation_elements_lib_module_assets_backicon.png


BIN
bundle/android/drawable-xhdpi/node_modules_reactnavigation_elements_lib_module_assets_clearicon.png


BIN
bundle/android/drawable-xhdpi/node_modules_reactnavigation_elements_lib_module_assets_closeicon.png


BIN
bundle/android/drawable-xhdpi/node_modules_reactnavigation_elements_lib_module_assets_searchicon.png


BIN
bundle/android/drawable-xhdpi/src_common_assets_images_common_arrow_back.png


BIN
bundle/android/drawable-xxhdpi/node_modules_reactnavigation_elements_lib_module_assets_backicon.png


BIN
bundle/android/drawable-xxhdpi/node_modules_reactnavigation_elements_lib_module_assets_clearicon.png


BIN
bundle/android/drawable-xxhdpi/node_modules_reactnavigation_elements_lib_module_assets_closeicon.png


BIN
bundle/android/drawable-xxhdpi/node_modules_reactnavigation_elements_lib_module_assets_searchicon.png


BIN
bundle/android/drawable-xxhdpi/src_common_assets_images_common_arrow_back.png


BIN
bundle/android/drawable-xxxhdpi/node_modules_reactnavigation_elements_lib_module_assets_backicon.png


BIN
bundle/android/drawable-xxxhdpi/node_modules_reactnavigation_elements_lib_module_assets_clearicon.png


BIN
bundle/android/drawable-xxxhdpi/node_modules_reactnavigation_elements_lib_module_assets_closeicon.png


BIN
bundle/android/drawable-xxxhdpi/node_modules_reactnavigation_elements_lib_module_assets_searchicon.png


+ 1 - 1
bundle/android/raw/keep.xml

@@ -1 +1 @@
-<resources xmlns:tools="http://schemas.android.com/tools" tools:keep="@drawable/src_app_resource_images_icon_sign_scan" />
+<resources xmlns:tools="http://schemas.android.com/tools" tools:keep="@drawable/src_common_assets_images_common_arrow_back,@drawable/node_modules_reactnavigation_elements_lib_module_assets_searchicon,@drawable/node_modules_reactnavigation_elements_lib_module_assets_backicon,@drawable/node_modules_reactnavigation_elements_lib_module_assets_backiconmask,@drawable/node_modules_reactnavigation_elements_lib_module_assets_clearicon,@drawable/node_modules_reactnavigation_elements_lib_module_assets_closeicon" />

File diff suppressed because it is too large
+ 1 - 1
bundle/ios/common.ios.bundle


+ 2 - 2
bundle/ios/hospital.ios.bundle

@@ -1,4 +1,4 @@
-__d(function(g,r,i,a,m,e,d){var t=r(d[0]),n=r(d[1]),p=t(r(d[2]));n.AppRegistry.registerComponent(r(d[3]).Apps.Hospital,function(){return p.default})},10000000,[5,3,10000001,488]);
+__d(function(g,r,i,a,m,e,d){var t=r(d[0]),n=r(d[1]),p=t(r(d[2]));n.AppRegistry.registerComponent(r(d[3]).Apps.HospitalMain,function(){return p.default})},10000000,[5,3,10000001,488]);
 __d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var n=r(d[1]),o=t(r(d[2])),s=r(d[3]);var l=n.StyleSheet.create({container:{flex:1}});e.default=function(){var t='dark'===(0,n.useColorScheme)();return(0,s.jsxs)(n.View,{style:l.container,children:[(0,s.jsx)(n.StatusBar,{barStyle:t?'light-content':'dark-content'}),(0,s.jsx)(n.View,{style:{height:100}}),(0,s.jsx)(n.Text,{children:"\u4e92\u8054\u7f51\u533b\u9662"}),(0,s.jsx)(n.Button,{title:'\u8fd4\u56de',onPress:function(){(0,r(d[4]).pop)()}}),(0,s.jsx)(n.View,{style:{height:15}}),(0,s.jsx)(n.Button,{title:'Toast',onPress:function(){(0,r(d[5]).showMessage)('\u4e92\u8054\u7f51\u533b\u9662\u5f39\u51fatoast','info','common\u5411\u4e0b\u517c\u5bb9')}}),(0,s.jsx)(o.default,{})]})}},10000001,[5,3,500,246,488,499]);
 __r(108);
-__r(10000000);
+__r(10000000);

File diff suppressed because it is too large
+ 0 - 0
config/bundleCommonInfo.json


+ 2 - 2
index.js

@@ -1,3 +1,3 @@
 import './src/app/app';
-import './src/ywq/ywq';
-import './src/hospital/hospital';
+import '@ywx/ywq.ts';
+import '@hospital/hospital.ts';

+ 11 - 5
package.json

@@ -11,12 +11,11 @@
     "test": "jest",
     "build-android-common": "react-native bundle --platform android --dev false --entry-file src/app/app.ts --bundle-output bundle/android/common.android.bundle --assets-dest ./bundle/android   --config metro.common.config.js  --minify true --reset-cache",
     "build-android-buz": "react-native bundle --platform android --dev false --entry-file src/buz.ts --bundle-output ./bundle/android/buz.android.bundle --assets-dest ./bundle/android   --config metro.main.config.js  --minify true --reset-cache",
-    "build-android-ywq": "react-native bundle --platform android --dev false --entry-file src/ywq/ywq.ts --bundle-output ./bundle/android/ywq.android.bundle --assets-dest ./bundle/android   --config metro.main.config.js  --minify true --reset-cache",
-    "build-android-hospital": "react-native bundle --platform android --dev false --entry-file src/hospital/hospital.ts --bundle-output bundle/android/hospital.android.bundle --assets-dest ./bundle/android   --config metro.main.config.js  --minify true --reset-cache",
-
+    "build-android-ywq": "react-native bundle --platform android --dev false --entry-file src/miniapp/ywq/ywq.ts --bundle-output ./bundle/android/ywq.android.bundle --assets-dest ./bundle/android   --config metro.main.config.js  --minify true --reset-cache",
+    "build-android-hospital": "react-native bundle --platform android --dev false --entry-file src/miniapp/hospital/hospital.ts --bundle-output bundle/android/hospital.android.bundle --assets-dest ./bundle/android   --config metro.main.config.js  --minify true --reset-cache",
     "build-ios-common": "react-native bundle --platform ios --dev false --entry-file src/app/app.ts --bundle-output bundle/ios/common.ios.bundle --assets-dest ./bundle/ios   --config metro.common.config.js  --minify true --reset-cache",
-    "build-ios-ywq": "react-native bundle --platform ios --dev false --entry-file src/ywq/ywq.ts --bundle-output ./bundle/ios/ywq.ios.bundle --assets-dest ./bundle/ios   --config metro.main.config.js  --minify true --reset-cache",
-    "build-ios-hospital": "react-native bundle --platform ios --dev false --entry-file src/hospital/hospital.ts --bundle-output bundle/ios/hospital.ios.bundle --assets-dest ./bundle/ios   --config metro.main.config.js  --minify true --reset-cache"
+    "build-ios-ywq": "react-native bundle --platform ios --dev false --entry-file src/miniapp/ywq/ywq.ts --bundle-output ./bundle/ios/ywq.ios.bundle --assets-dest ./bundle/ios   --config metro.main.config.js  --minify true --reset-cache",
+    "build-ios-hospital": "react-native bundle --platform ios --dev false --entry-file src/miniapp/hospital/hospital.ts --bundle-output bundle/ios/hospital.ios.bundle --assets-dest ./bundle/ios   --config metro.main.config.js  --minify true --reset-cache"
   },
   "codegenConfig": {
     "name": "SpecManager",
@@ -29,10 +28,17 @@
   "dependencies": {
     "@react-native-async-storage/async-storage": "^2.2.0",
     "@react-native/new-app-screen": "0.80.1",
+    "@react-navigation/native": "^7.1.14",
+    "@react-navigation/stack": "^7.4.2",
     "babel-plugin-module-resolver": "^5.0.2",
     "react": "19.1.0",
     "react-native": "0.80.1",
+    "react-native-bundle-splitter": "^3.0.1",
+    "react-native-copilot": "^3.3.3",
     "react-native-device-info": "^14.0.4",
+    "react-native-gesture-handler": "^2.27.2",
+    "react-native-root-siblings": "^5.0.1",
+    "react-native-safe-area-context": "^5.5.2",
     "react-native-storage": "^1.0.1",
     "react-native-toast-message": "^2.3.3"
   },

+ 26 - 67
src/app/App.tsx

@@ -1,81 +1,40 @@
-/**
- * Sample React Native App
- * https://github.com/facebook/react-native
- *
- * @format
- */
-
-import {
-  Animated,
-  Button,
-  Image,
-  StatusBar,
-  StyleSheet,
-  useColorScheme,
-  View,
-} from 'react-native';
-import * as navigation from '@common/NavigationHelper.ts';
-import { Apps } from '@common/NavigationHelper.ts';
-import ScrollView = Animated.ScrollView;
-import TestNativeInfo from '@app/TestNativeInfo';
-import { showMessage } from '@common/ToastHelper.ts';
+import { StatusBar, StyleSheet, useColorScheme } from 'react-native';
 import Toast from 'react-native-toast-message';
+import { AppProvider } from '@app/contexts/AppProvider.tsx';
+import { RootSiblingParent } from 'react-native-root-siblings';
+import NavigationContainer from '@app/routes/NavigationContainer';
+import BottomSheet from '@common/components/BottomSheet.tsx';
+import Alert from '@common/components/Alert.tsx';
 
 function App() {
   const isDarkMode = useColorScheme() === 'dark';
 
   return (
-    <View style={styles.container}>
+    <>
       <StatusBar barStyle={isDarkMode ? 'light-content' : 'dark-content'} />
-      <View style={{ height: 100 }} />
-      <Button
-        title={'进入互联网医院'}
-        onPress={() => {
-          navigation.pushByName('hospital', {});
-        }}
-      />
-      <View style={{ height: 15 }} />
-      <Button
-        title={'进入医网签'}
-        onPress={() => {
-          navigation.pushByName(Apps.Ywq, {});
-        }}
-      />
-      <View style={{ height: 15 }} />
-      <Button
-        title={'Toast'}
-        onPress={() => {
-          showMessage('APP页面弹出toast')
-        }}
-      />
-      <ScrollView style={styles.flatContainer}>
-        <View style={styles.imgView}>
-          <Image
-            resizeMethod="resize"
-            resizeMode="contain"
-            source={require('@app/resource/images/icon_sign_scan.png')}
-          />
-          <TestNativeInfo />
-        </View>
-      </ScrollView>
-      <Toast />
-    </View>
+      <AppProvider>
+        <RootSiblingParent>
+          {/*<CopilotProvider*/}
+          {/*  backdropColor="rgba(0, 0, 0, 0.7)"*/}
+          {/*  stepNumberComponent={() => null}*/}
+          {/*  arrowSize={0}*/}
+          {/*  tooltipStyle={styles.tooltip}*/}
+          {/*  tooltipComponent={TooltipComponent}*/}
+          {/*>*/}
+          <NavigationContainer />
+          {/*</CopilotProvider>*/}
+        </RootSiblingParent>
+        <BottomSheet ref={ref => BottomSheet.setRef(ref)} />
+        <Alert ref={ref => Alert.setRef(ref)} />
+        <Toast />
+      </AppProvider>
+    </>
   );
 }
 
 const styles = StyleSheet.create({
-  container: {
-    flex: 1,
-  },
-  imgView: {
-    width: "100%",
-  },
-  img: {
-    width: "100%",
-    height: 600,
-  },
-  flatContainer: {
-    flex: 1,
+  tooltip: {
+    backgroundColor: 'rgba(0, 0, 0, 0)',
   },
 });
 

+ 2 - 0
src/app/constants/index.ts

@@ -0,0 +1,2 @@
+export * from './values';
+export * from './types';

+ 53 - 0
src/app/constants/types.ts

@@ -0,0 +1,53 @@
+// 存储一般信息
+export type CommonInfo = {
+  env: 'production' | 'acceptance' | 'testing' | 'development'; // 环境
+  guidePagesVersion: string; // 欢迎页版本号
+  policyAccepted: boolean; // 是否已经接受用户协议与隐私政策
+  appTourVersion: string; // 版本引导版本号
+  lastLoginPhoneNumber: string; // 最近一次登录使用的手机号
+  deviceInfo: string; // 根据 innerModule 中的 initNativeInfo() 获取到的一些设备信息,使用时需要JSON.parse()进行解析
+  // ...
+};
+
+// 登录用户信息
+export type UserInfo = {
+  // 以下为登录/注册时获得,不可为空
+  userId: string; // 用户id
+  phone: string; // 用户手机号
+  userType: 'guanxin' | 'general' | 'generalandguanxin'; // 用户类型
+  realNameStatus:
+    | 'unverified' // 实名状态 0 未认证
+    | 'success' // 1 认证成功
+    | 'failure' // 2 认证失败
+    | 'inexistent' // 3 证件号不存在
+    | 'registered'; // 4 证件号被其他用户使用
+  currentUserType: 'guanxin' | 'general'; // 当前选择的用户
+  enableCert: boolean; // 是否可以下证
+  hasBindFirm: boolean; // 是否绑定厂商
+  hasFaceDetect: boolean; // 是否进行了人脸识别
+  gxLeader: boolean; // 冠心leader
+  // 1、开屏
+  // 2、工作台-banner
+  // 3、热点资讯-列表
+  // 4、热点资讯-详情
+  // 5、我的页面
+  // 6、医信课堂-banner
+  // 7、消息-列表
+  // 8、消息-详情
+  // 9、热点资讯-图片菜单
+  moduleList: number[] | undefined; // 是否允许显示广告
+  isFirstLogin: boolean; // 是否第一次登录(第一次登录不允许显示广告)
+  // ...
+
+  // 以下为用户信息接口获得,允许为空
+  nickname: string | undefined; // 昵称
+  picUrl: string | undefined; // 头像
+  userIdCardNum: string | undefined; // 身份证号
+  faceDetectFirms:
+    | {
+        clientId: string; // 厂商id
+        firmName: string; // 厂商名
+      }[]
+    | undefined; // 人脸识别厂商?
+  // ...
+};

+ 62 - 0
src/app/constants/values.ts

@@ -0,0 +1,62 @@
+const KEY_PREFIX = 'cn.org.bjca.trust.yiwangxin';
+// 本地缓存key
+// 所有的 key 按照 cn.org.bjca.trust.yiwangxin.module.xxx 来命名
+// IMPORTANT: 本地缓存key增加时一定注意v1/app中的ValueHelper.ts中有个 removeAll 方法,在里面讲新增的key忽略掉,不然可能会被清除掉;同时 v2/app/hooks/useLogout.ts中也有类似内容
+export const COMMONINFO_KEY = KEY_PREFIX + '.app.commoninfo';
+export const TOKEN_KEY = KEY_PREFIX + '.app.token';
+export const USERINFO_KEY = KEY_PREFIX + '.app.userinfo';
+
+// 通知key
+// 所有的 key 按照 cn.org.bjca.trust.yiwangxin.module.event.xxx 来命名
+export const DEVICE_ENENT_LOGOUT_KEY = KEY_PREFIX + '.app.event.logout'; // 退出登录通知
+export const DEVICE_ENENT_SWITCH_ROLE_KEY =
+  KEY_PREFIX + '.app.event.switchrole'; // 角色切换通知
+export const DEVICE_ENENT_UPDATE_USERINFO_KEY =
+  KEY_PREFIX + '.app.event.updateuserinfo'; // 更新用户信息通知
+export const DEVICE_ENENT_UPDATE_HOME_FEATURE_LIST_KEY =
+  KEY_PREFIX + '.app.event.updatehomefeaturelist'; // 更新首页精品服务列表
+export const DEVICCE_ENENT_NAVIGATE_MODULE_KEY =
+  KEY_PREFIX + '.app.event.navigatemodule'; // 准备路由至其他模块的通知
+export const DEVICCE_ENENT_RECEIVE_PUSH_NOTIFICATION =
+  KEY_PREFIX + '.app.event.receivepushnotification'; // 收到推送通知
+
+// IM通知key
+export const PLATFORM_NOTIFICATION = 'noticePlatform'; // 系统公告
+export const PERSONAL_NOTIFICATION = 'noticePerson'; // 站内信消息
+export const AUTO_SIGN_REQUEST = 'requestSelfSign'; // 自动签名开启推送
+export const AUTO_SIGN_REQUEST_1 = 'requestSelfSign1'; // 自动签名开启推送
+export const CONFIRM_GRANT_REQUEST = 'confirmGrant'; // 监听授权请求推送
+
+// 其他key
+export const COUNTDOWN_REGISTER_KEY = KEY_PREFIX + '.app.countdown.register'; // 注册页面倒计时key
+export const COUNTDOWN_CHANGE_PHONE_KEY =
+  KEY_PREFIX + '.app.countdown.changephone'; // 修改手机号页面倒计时key
+
+// 常量
+export const THEME_COLOR = '#0E84FA'; // 主题色
+export const THEME_COLOR_DISABLED = 'rgba(14, 132, 250, 0.3)'; // 主题色(禁用按钮)
+
+export const HEADER_TINT_COLOR = '#11102C'; // 导航栏标题颜色
+export const HEADER_TITLE_FONT_SIZE = 18; // 导航栏标题字号
+export const HEADER_TITLE_FONT_WEIGHT = '500'; // 导航栏标题字号
+export const TAB_BAR_ACTIVE_TINT_COLOR = THEME_COLOR; // 标签栏选中颜色
+export const TAB_BAR_INACTIVE_TINT_COLOR = '#333333'; // 标签栏未选中颜色
+export const TAB_BAR_ICON_SIZE = 20; // 标签栏图标宽高值,最大为25
+
+// 配置
+export const MD5_KEY = 'YwqMain!@#'; // 医网信进行md5运算的key
+export const CLIENT_ID = '2000111111110002'; // 厂商唯一标识,这个值是为医网信app分配的
+export const GUIDE_PAGES_VERSION = '7.0'; // 引导页版本号 - 只有当设计了全新的引导页时,才修改这里
+export const APP_TOUR_VERSION = '7.0'; // 版本引导版本号 - 只有当设计了全新的版本引导时,才修改这里
+export const IM_SDK_APPID = 1600023023; // 腾讯
+export const IM_SDK_APPID_TEST = 1600088801; // 腾讯
+export const IM_SDK_APP_KEY =
+  'KxSNEvbudoGZ3WooQdiBhcaiYWQnaKSgxSybpeZJ4gRjv1Q2zgsXcQCBcrrNAWQp'; // 腾讯
+export const IM_SDK_APP_KEY_TEST =
+  '0Eh996NDppMBQuHuSgccdNi60Ngieaf0yBIg3Ddfw4pgw1wZ9KtM88YtHzwva3aT'; // 腾讯
+
+// 正则表达式
+export const PHONE_PATTERN = /^1[0-9]{10}$/; // 登录手机号
+export const PASSWORD_PATTERN =
+  /^(?=.*[a-zA-Z])(?=.*\d)[A-Za-z\d!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~]{8,12}$/; // 登录密码
+export const ID_CARD_PATTERN = /(^\d{18}$)|(^\d{17}(\d|X|x)$)/; // 身份证号

+ 11 - 0
src/app/contexts/AppProvider.tsx

@@ -0,0 +1,11 @@
+import React, { ReactNode } from 'react';
+import { CommonProvider } from './CommonContext';
+import { AuthProvider } from './AuthContext';
+
+export const AppProvider = ({ children }: { children: ReactNode }) => {
+  return (
+    <CommonProvider>
+      <AuthProvider>{children}</AuthProvider>
+    </CommonProvider>
+  );
+};

+ 118 - 0
src/app/contexts/AuthContext.tsx

@@ -0,0 +1,118 @@
+import React, { createContext, ReactNode, useEffect, useReducer } from 'react';
+import { TOKEN_KEY, UserInfo, USERINFO_KEY } from '@app/constants';
+import { getAllItems, storageApp } from '@common/StorageHelper.ts';
+
+type RequiredUserInfo = Required<UserInfo>;
+
+type AuthState = {
+  loading: boolean;
+  token?: string; // token
+  userInfo?: RequiredUserInfo; // 用户信息
+};
+
+type ActionMap = {
+  retrieve: { token: string; userInfo: RequiredUserInfo } | undefined; // 应用启动取回本地缓存
+  login: { token: string; userInfo: RequiredUserInfo }; // 登录
+  logout: undefined; // 退出登录
+  update: RequiredUserInfo; // 更新用户信息
+};
+
+type Action = {
+  [Key in keyof ActionMap]: {
+    type: Key;
+    payload: ActionMap[Key];
+  };
+}[keyof ActionMap];
+
+function reducer(state: AuthState, action: Action): AuthState {
+  switch (action.type) {
+    case 'retrieve':
+      return {
+        ...state,
+        loading: false,
+        token: action.payload?.token,
+        userInfo: action.payload?.userInfo,
+      };
+    case 'login':
+      return {
+        ...state,
+        loading: false,
+        token: action.payload.token,
+        userInfo: action.payload.userInfo,
+      };
+    case 'logout':
+      return {
+        ...state,
+        loading: false,
+        token: undefined,
+        userInfo: undefined,
+      };
+    case 'update':
+      return {
+        ...state,
+        loading: false,
+        userInfo: action.payload,
+      };
+  }
+}
+
+const initialState = {
+  loading: true,
+  token: undefined,
+  userInfo: undefined,
+};
+
+const AuthContext = createContext<
+  | {
+      state: AuthState;
+      dispatch: React.Dispatch<Action>;
+    }
+  | undefined
+>(undefined);
+
+const AuthProvider = ({ children }: { children: ReactNode }) => {
+  const [state, dispatch] = useReducer(reducer, initialState);
+
+  useEffect(() => {
+    async function retrieve() {
+      try {
+        const values = await getAllItems([
+          { key: TOKEN_KEY },
+          { key: USERINFO_KEY },
+        ]);
+        if (values[0][1] && values[1][1]) {
+          const tokenValue = values[0][1];
+          const userInfoValue = JSON.parse(values[1][1]);
+          dispatch({
+            type: 'retrieve',
+            payload: {
+              token: tokenValue,
+              userInfo: { ...userInfoValue, isFirstLogin: false },
+            },
+          });
+        } else {
+          dispatch({
+            type: 'retrieve',
+            payload: undefined,
+          });
+        }
+      } catch {
+        dispatch({
+          type: 'retrieve',
+          payload: undefined,
+        });
+      }
+    }
+
+    retrieve();
+  }, []);
+
+  return (
+    <AuthContext.Provider value={{ state, dispatch }}>
+      {children}
+    </AuthContext.Provider>
+  );
+};
+
+export type { AuthState, RequiredUserInfo };
+export { AuthContext, AuthProvider };

+ 86 - 0
src/app/contexts/CommonContext.tsx

@@ -0,0 +1,86 @@
+import React, { createContext, ReactNode, useEffect, useReducer } from 'react';
+import { CommonInfo, COMMONINFO_KEY } from '@app/constants';
+import { getItem } from '@common/StorageHelper.ts';
+
+type PartialCommonInfo = Partial<CommonInfo>;
+type RequiredCommonInfo = Required<CommonInfo>;
+
+type CommonState = {
+  loading: boolean;
+  info: PartialCommonInfo;
+};
+
+type ActionMap = {
+  retrieve: PartialCommonInfo; // 应用启动取回本地缓存
+  save: PartialCommonInfo; // 保存/清除
+};
+
+type Action = {
+  [Key in keyof ActionMap]: {
+    type: Key;
+    payload: ActionMap[Key];
+  };
+}[keyof ActionMap];
+
+function reducer(state: CommonState, action: Action) {
+  switch (action.type) {
+    case 'retrieve':
+      return {
+        ...state,
+        loading: false,
+        info: action.payload,
+      };
+    case 'save':
+      return {
+        ...state,
+        loading: false,
+        info: action.payload,
+      };
+  }
+}
+
+const initialState = {
+  loading: true,
+  info: {},
+};
+
+const CommonContext = createContext<
+  | {
+      state: CommonState;
+      dispatch: React.Dispatch<Action>;
+    }
+  | undefined
+>(undefined);
+
+const CommonProvider = ({ children }: { children: ReactNode }) => {
+  const [state, dispatch] = useReducer(reducer, initialState);
+
+  useEffect(() => {
+    async function retrieve() {
+      try {
+        const value = await getItem(COMMONINFO_KEY);
+        const parsedValue: PartialCommonInfo = value ? JSON.parse(value) : {};
+        dispatch({
+          type: 'retrieve',
+          payload: parsedValue,
+        });
+      } catch {
+        dispatch({
+          type: 'retrieve',
+          payload: {},
+        });
+      }
+    }
+
+    retrieve();
+  }, []);
+
+  return (
+    <CommonContext.Provider value={{ state, dispatch }}>
+      {children}
+    </CommonContext.Provider>
+  );
+};
+
+export type { CommonState, PartialCommonInfo, RequiredCommonInfo };
+export { CommonContext, CommonProvider };

+ 65 - 0
src/app/contexts/useAuth.ts

@@ -0,0 +1,65 @@
+import { useContext, useEffect, useMemo, useRef } from 'react';
+import {
+  AuthContext,
+  AuthState,
+  RequiredUserInfo,
+} from '@app/contexts/AuthContext';
+import { TOKEN_KEY, USERINFO_KEY } from '@app/constants';
+import {
+  removeAllItems,
+  saveAllItems,
+  saveItem,
+} from '@common/StorageHelper.ts';
+
+const useAuth = (): {
+  state: AuthState;
+  actions: {
+    login: (token: string, userInfo: RequiredUserInfo) => Promise<void>;
+    logout: () => Promise<void>;
+    update: (userInfo: RequiredUserInfo) => Promise<void>;
+  };
+} => {
+  const context = useContext(AuthContext);
+  if (!context) {
+    throw new Error('useAuth must be used in AuthProvider!');
+  }
+
+  const contextRef = useRef(context);
+  useEffect(() => {
+    contextRef.current = context;
+  }, [context]);
+
+  const authActions = useMemo(
+    () => ({
+      login: async (token: string, userInfo: RequiredUserInfo) => {
+        await saveAllItems([
+          { key: TOKEN_KEY, data: token },
+          { key: USERINFO_KEY, data: JSON.stringify(userInfo) },
+        ]);
+        contextRef.current.dispatch({
+          type: 'login',
+          payload: {
+            token: token,
+            userInfo: userInfo,
+          },
+        });
+      },
+      logout: async () => {
+        await removeAllItems([TOKEN_KEY, USERINFO_KEY]);
+        contextRef.current.dispatch({
+          type: 'logout',
+          payload: undefined,
+        });
+      },
+      update: async (userInfo: RequiredUserInfo) => {
+        await saveItem(USERINFO_KEY, JSON.stringify(userInfo));
+        contextRef.current.dispatch({ type: 'update', payload: userInfo });
+      },
+    }),
+    [],
+  );
+
+  return { state: context.state, actions: authActions };
+};
+
+export { useAuth };

+ 62 - 0
src/app/contexts/useCommon.ts

@@ -0,0 +1,62 @@
+import {useContext, useEffect, useMemo, useRef} from 'react';
+import {
+  CommonContext,
+  CommonState,
+  PartialCommonInfo,
+} from '@app/contexts/CommonContext';
+import {COMMONINFO_KEY} from '@app/constants';
+import { getItem, saveItem } from '@common/StorageHelper.ts';
+
+const useCommon = (): {
+  state: CommonState;
+  actions: {
+    save: <T extends keyof PartialCommonInfo>(
+      key: T,
+      value: PartialCommonInfo[T],
+    ) => Promise<void>;
+  };
+} => {
+  const context = useContext(CommonContext);
+  if (!context) {
+    throw new Error('useCommon must be used in CommonProvider!');
+  }
+
+  const contextRef = useRef(context);
+  useEffect(() => {
+    contextRef.current = context;
+  }, [context]);
+
+  const authActions = useMemo(
+    () => ({
+      save: async <T extends keyof PartialCommonInfo>(
+        key: T,
+        value: PartialCommonInfo[T],
+      ) => {
+        const commonValue = await getItem(COMMONINFO_KEY);
+        const parsedValue: PartialCommonInfo = commonValue
+          ? JSON.parse(commonValue)
+          : {};
+        const mergedValue = {
+          ...parsedValue,
+          [key]: value,
+        };
+        await saveItem(
+          COMMONINFO_KEY,
+          JSON.stringify({
+            ...parsedValue,
+            [key]: value,
+          }),
+        );
+        contextRef.current.dispatch({
+          type: 'save',
+          payload: mergedValue,
+        });
+      },
+    }),
+    [],
+  );
+
+  return {state: context.state, actions: authActions};
+};
+
+export {useCommon};

+ 3 - 0
src/app/routes/MainParamList.ts

@@ -0,0 +1,3 @@
+export type MainParamList = {
+  MainView: undefined;
+};

+ 56 - 0
src/app/routes/MainStack.tsx

@@ -0,0 +1,56 @@
+import React from 'react';
+import { register } from 'react-native-bundle-splitter';
+import {
+  createStackNavigator,
+  TransitionPresets,
+} from '@react-navigation/stack';
+import { MainParamList } from '@app/routes/MainParamList.ts';
+import {
+  HEADER_TINT_COLOR,
+  HEADER_TITLE_FONT_SIZE,
+  HEADER_TITLE_FONT_WEIGHT,
+} from '@app/constants';
+import HeaderBackImage from '@common/components/HeaderBackImage.tsx';
+
+const MainViewScreen = register({
+  loader: () => import('@app/screens/main/MainViewScreen'),
+});
+
+const Stack = createStackNavigator<MainParamList>();
+
+export function MainStack() {
+  // const navigation = useNavigation<NavigationProp<MainParamList>>();
+
+  return (
+    <Stack.Navigator
+      screenOptions={{
+        headerTitleAlign: 'center', // 安卓标题居中
+        headerShadowVisible: false,
+        headerTintColor: HEADER_TINT_COLOR,
+        headerTitleStyle: {
+          fontSize: HEADER_TITLE_FONT_SIZE,
+          fontWeight: HEADER_TITLE_FONT_WEIGHT,
+        },
+        headerBackImage: HeaderBackImage,
+      }}
+      initialRouteName="MainView"
+    >
+      <Stack.Group
+        screenOptions={{
+          ...TransitionPresets.SlideFromRightIOS,
+        }}
+      >
+        <Stack.Screen name="MainView" component={MainViewScreen} />
+        {/* 普通栈路由 --> 写这里 */}
+      </Stack.Group>
+      <Stack.Group
+        screenOptions={{
+          presentation: 'transparentModal',
+          headerShown: false,
+        }}
+      >
+        {/* 对话框形式路由 --> 写这里 */}
+      </Stack.Group>
+    </Stack.Navigator>
+  );
+}

+ 11 - 0
src/app/routes/NavigationContainer.tsx

@@ -0,0 +1,11 @@
+import React from 'react';
+import { NavigationContainer } from '@react-navigation/native';
+import { MainStack } from '@app/routes/MainStack.tsx';
+
+export default function Container() {
+  return (
+    <NavigationContainer>
+      <MainStack />
+    </NavigationContainer>
+  );
+}

+ 16 - 0
src/app/screens/main/MainViewScreen.tsx

@@ -0,0 +1,16 @@
+import React from 'react';
+import { StyleSheet, View } from 'react-native';
+import { StackScreenProps } from '@react-navigation/stack';
+import { MainParamList } from '@app/routes/MainParamList';
+
+type Props = StackScreenProps<MainParamList, 'MainView'>;
+
+export default function WebViewScreen(props: Props) {
+  return <View style={styles.container}></View>;
+}
+
+const styles = StyleSheet.create({
+  container: {
+    flex: 1,
+  },
+});

+ 1 - 1
src/buz.ts

@@ -1,2 +1,2 @@
 import '@ywx/ywq.ts';
-import '@hospital/hospital.ts';
+import '@/miniapp/hospital/hospital.ts';

+ 9 - 15
src/common/NavigationHelper.ts

@@ -1,25 +1,19 @@
-import { storageApp } from './StorageHelper.ts';
+import { getItem, saveItem } from './StorageHelper.ts';
 import NavigationManager from '../../specs/NativeNavigationManager.ts';
 
-
 export enum Apps {
-  App='app',
-  Hospital='hospital',
-  Ywq='ywq',
+  App = 'app',
+  Hospital = 'hospital',
+  Ywq = 'ywq',
 }
 
-
 export const pushByName = (name: string, params: any) => {
-  storageApp
-    .save({
-      key: `MessageActivity-${name}`,
-      data: params,
-      expires: 1000 * 3600,
-    })
-    .finally(() => {
-      NavigationManager.navigate(name);
-    });
+  saveItem(`MessageActivity-${name}`, params).finally(() => {
+    NavigationManager.navigate(name);
+  });
 };
 export const pop = () => {
   NavigationManager.pop();
 };
+export const getDataFromName = (name: string) =>
+  getItem(`MessageActivity-${name}`);

+ 37 - 2
src/common/StorageHelper.ts

@@ -1,9 +1,44 @@
-import Storage from 'react-native-storage';
+import Storage, { LoadParams } from 'react-native-storage';
 import AsyncStorage from '@react-native-async-storage/async-storage';
 
 export const storageApp = new Storage({
   size: 1000,
   storageBackend: AsyncStorage,
-  defaultExpires: 1000 * 3600 * 24,
+  defaultExpires: 1000 * 3600 * 24 * 60,
   enableCache: true,
 });
+/**
+ * 缓存一个键值对
+ * @param key
+ * @param value
+ */
+export const saveItem = (key: string, value: any) =>
+  storageApp.save({ key, data: value });
+/**
+ * 获取一个键值对
+ * @param key
+ */
+export const getItem = (key: string) =>
+  storageApp.load({ key, autoSync: true, syncInBackground: true });
+/**
+ * 删除一个键值对
+ * @param key
+ */
+export const removeItem = (key: string) => storageApp.remove({ key });
+/**
+ * 获取批量键值对
+ * @param params
+ */
+export const getAllItems = (params: LoadParams[]) =>
+  storageApp.getBatchData(params);
+
+export const saveAllItems = (
+  params: {
+    key: string;
+    id?: string;
+    data: any;
+    expires?: number | null;
+  }[],
+) => Promise.all([params.map(item => storageApp.save(item))]);
+export const removeAllItems = (params: string[]) =>
+  Promise.all([params.map(item => storageApp.remove({ key: item }))]);

BIN
src/common/assets/images/common_arrow_back.png


BIN
src/common/assets/images/common_arrow_back@2x.png


BIN
src/common/assets/images/common_arrow_back@3x.png


+ 12 - 0
src/common/common.ts

@@ -1,4 +1,16 @@
 import 'react';
 import 'react-native';
+import '@react-navigation/native';
+import 'react-native-gesture-handler';
+import '@react-navigation/stack';
+// 路由懒加载已经内存管理等,提高加载效率
+import 'react-native-bundle-splitter';
+// 获取设备信息
+import 'react-native-device-info';
+// 应用间路由工具
 import '@common/NavigationHelper';
+// 弹出相关
 import '@common/ToastHelper.ts';
+import '@common/components/Alert.tsx';
+import '@common/components/BottomSheet.tsx';
+import '@common/components/HeaderBackImage.tsx';

+ 473 - 0
src/common/components/Alert.tsx

@@ -0,0 +1,473 @@
+import React, { Component, JSX } from 'react';
+import {
+  Animated,
+  BackHandler,
+  LayoutChangeEvent,
+  NativeEventSubscription,
+  StyleSheet,
+  Text,
+  TextStyle,
+  TouchableOpacity,
+  View,
+} from 'react-native';
+
+// 等待 popup 库完成之后,将会被替换掉
+
+const POPUP_ANIMATION_DURATION = 300;
+const POPUP_BACKGROUND_COLOR = '#000000';
+const POPUP_BACKGROUND_OPACITY = 0.2;
+const POPUP_VERTICAL_OFFSET = 0;
+
+type PopupOptions = {
+  duration?: number;
+  backgroundColor?: string;
+  backgroundOpacity?: number;
+  verticalOffset?: number;
+};
+type PopupType = 'top' | 'bottom' | 'alert';
+
+interface PopupProps {
+  content: JSX.Element;
+  type: PopupType;
+  options?: PopupOptions;
+  onShown?: () => void;
+  onPressBackground?: () => void;
+}
+interface PopupState {
+  backgroundOpacity: Animated.Value;
+  top: Animated.Value;
+  bottom: Animated.Value;
+  contentOpacity: Animated.Value;
+}
+
+class Popup extends Component<PopupProps, PopupState> {
+  private contentHeight = 0;
+
+  constructor(props: PopupProps) {
+    super(props);
+    this.state = {
+      backgroundOpacity: new Animated.Value(0),
+      top: new Animated.Value(0),
+      bottom: new Animated.Value(0),
+      contentOpacity: new Animated.Value(0),
+    };
+  }
+
+  backHandler?: NativeEventSubscription;
+
+  backAction = () => {
+    return true;
+  };
+
+  componentDidMount() {
+    this.backHandler = BackHandler.addEventListener(
+      'hardwareBackPress',
+      this.backAction,
+    );
+  }
+
+  componentWillUnmount() {
+    this.backHandler?.remove();
+  }
+
+  show(): void {
+    Animated.parallel([
+      Animated.timing(this.state.backgroundOpacity, {
+        toValue:
+          this.props.options?.backgroundOpacity ?? POPUP_BACKGROUND_OPACITY,
+        duration: this.props.options?.duration ?? POPUP_ANIMATION_DURATION,
+        useNativeDriver: false,
+      }),
+      this.props.type === 'top'
+        ? Animated.timing(this.state.top, {
+            toValue:
+              this.props.options?.verticalOffset ?? POPUP_VERTICAL_OFFSET,
+            duration: this.props.options?.duration ?? POPUP_ANIMATION_DURATION,
+            useNativeDriver: false,
+          })
+        : this.props.type === 'bottom'
+        ? Animated.timing(this.state.bottom, {
+            toValue: -(
+              this.props.options?.verticalOffset ?? POPUP_VERTICAL_OFFSET
+            ),
+            duration: this.props.options?.duration ?? POPUP_ANIMATION_DURATION,
+            useNativeDriver: false,
+          })
+        : Animated.timing(this.state.contentOpacity, {
+            toValue: 1,
+            duration: this.props.options?.duration ?? POPUP_ANIMATION_DURATION,
+            useNativeDriver: false,
+          }),
+    ]).start(finished => {
+      if (finished) {
+        this.props.onShown && this.props.onShown();
+      }
+    });
+  }
+
+  hide(callback?: () => void): void {
+    Animated.parallel([
+      Animated.timing(this.state.backgroundOpacity, {
+        toValue: 0,
+        duration: this.props.options?.duration ?? POPUP_ANIMATION_DURATION,
+        useNativeDriver: false,
+      }),
+      this.props.type === 'top'
+        ? Animated.timing(this.state.top, {
+            toValue: -this.contentHeight,
+            duration: POPUP_ANIMATION_DURATION,
+            useNativeDriver: false,
+          })
+        : this.props.type === 'bottom'
+        ? Animated.timing(this.state.bottom, {
+            toValue: -this.contentHeight,
+            duration: POPUP_ANIMATION_DURATION,
+            useNativeDriver: false,
+          })
+        : Animated.timing(this.state.contentOpacity, {
+            toValue: 0,
+            duration: POPUP_ANIMATION_DURATION,
+            useNativeDriver: false,
+          }),
+    ]).start(finished => {
+      if (finished) {
+        callback && callback();
+      }
+    });
+  }
+
+  onLayout(event: LayoutChangeEvent): void {
+    const height = event.nativeEvent.layout.height;
+    if (height > 0 && this.contentHeight === 0) {
+      this.contentHeight = height;
+      this.state.top.setValue(-height);
+      this.state.bottom.setValue(-height);
+      this.show();
+    }
+  }
+
+  render(): JSX.Element {
+    return (
+      <View
+        style={
+          this.props.type === 'alert'
+            ? popupStyles.containerAlert
+            : popupStyles.container
+        }>
+        <Animated.View
+          style={[
+            popupStyles.background,
+            {
+              opacity: this.state.backgroundOpacity,
+              backgroundColor:
+                this.props.options?.backgroundColor ?? POPUP_BACKGROUND_COLOR,
+            },
+          ]}>
+          <TouchableOpacity
+            style={popupStyles.backgroundTouch}
+            onPress={() => {
+              this.props.onPressBackground && this.props.onPressBackground();
+            }}
+          />
+        </Animated.View>
+        <Animated.View
+          style={
+            this.props.type === 'top'
+              ? [popupStyles.content, {top: this.state.top}]
+              : this.props.type === 'bottom'
+              ? [popupStyles.content, {bottom: this.state.bottom}]
+              : [
+                  popupStyles.contentAlert,
+                  {
+                    opacity: this.state.contentOpacity,
+                    top:
+                      this.props.options?.verticalOffset ??
+                      POPUP_VERTICAL_OFFSET,
+                  },
+                ]
+          }
+          onLayout={this.onLayout.bind(this)}>
+          {this.props.content}
+        </Animated.View>
+      </View>
+    );
+  }
+}
+
+const popupStyles = StyleSheet.create({
+  container: {
+    position: 'absolute',
+    left: 0,
+    right: 0,
+    top: 0,
+    bottom: 0,
+  },
+  containerAlert: {
+    position: 'absolute',
+    left: 0,
+    right: 0,
+    top: 0,
+    bottom: 0,
+    justifyContent: 'center',
+    alignItems: 'center',
+  },
+  background: {
+    position: 'absolute',
+    left: 0,
+    right: 0,
+    top: 0,
+    bottom: 0,
+  },
+  backgroundTouch: {
+    flex: 1,
+  },
+  content: {
+    position: 'absolute',
+    left: 0,
+    right: 0,
+  },
+  contentAlert: {
+    justifyContent: 'center',
+    alignItems: 'center',
+  },
+});
+
+interface State {
+  title?: string;
+  content?: JSX.Element;
+  confirm?: {
+    title?: string;
+    noHide?: boolean;
+    titleStyle?: TextStyle;
+    action?: () => void;
+  };
+  cancel?: {
+    title?: string;
+    titleStyle?: TextStyle;
+    action?: () => void;
+  };
+}
+
+class Alert extends Component<object, State> {
+  private static _ref: Alert | null = null;
+
+  public static setRef(ref: Alert | null): void {
+    Alert._ref = ref;
+  }
+
+  public static show(
+    title: string,
+    content?: JSX.Element,
+    confirm?: {
+      title?: string;
+      noHide?: boolean;
+      titleStyle?: TextStyle;
+      action?: () => void;
+    },
+    cancel?: {
+      title?: string;
+      titleStyle?: TextStyle;
+      action?: () => void;
+    },
+  ): void {
+    if (Alert._ref) {
+      Alert._ref.show(title, content, confirm, cancel);
+    }
+  }
+
+  public static hide(callback?: () => void): void {
+    if (Alert._ref) {
+      Alert._ref.hide(callback);
+    }
+  }
+
+  private readonly popupRef: React.RefObject<Popup | null>;
+
+  constructor(props: object) {
+    super(props);
+    this.popupRef = React.createRef();
+    this.state = {
+      title: undefined,
+      content: undefined,
+      confirm: undefined,
+      cancel: undefined,
+    };
+  }
+
+  public show(
+    title: string,
+    content?: JSX.Element,
+    confirm?: {
+      title?: string;
+      noHide?: boolean;
+      titleStyle?: TextStyle;
+      action?: () => void;
+    },
+    cancel?: {
+      title?: string;
+      titleStyle?: TextStyle;
+      action?: () => void;
+    },
+  ): void {
+    if (this.state.title) {
+      this.hide(() => {
+        this.show(title, content, confirm, cancel);
+      });
+      return;
+    }
+    this.setState({
+      title: title,
+      content: content,
+      confirm: confirm,
+      cancel: cancel,
+    });
+  }
+
+  public hide(callback?: () => void): void {
+    if (!this.state.title) {
+      return;
+    }
+    this.popupRef.current?.hide(() => {
+      this.setState(
+        {
+          title: undefined,
+          content: undefined,
+        },
+        () => {
+          callback && callback();
+        },
+      );
+    });
+  }
+
+  render(): JSX.Element {
+    return (
+      <>
+        {this.state.title && (
+          <Popup
+            ref={this.popupRef}
+            content={
+              <View style={styles.container}>
+                <View style={styles.title}>
+                  <Text style={styles.titleText} numberOfLines={8}>
+                    {this.state.title}
+                  </Text>
+                </View>
+                {this.state.content && (
+                  <View style={styles.content}>{this.state.content}</View>
+                )}
+                <View style={styles.bottom}>
+                  {this.state.cancel && (
+                    <TouchableOpacity
+                      style={styles.cancel}
+                      onPress={() => {
+                        this.hide(() => {
+                          this.state.cancel?.action &&
+                            this.state.cancel.action();
+                        });
+                      }}>
+                      <Text
+                        style={
+                          this.state.cancel.titleStyle ?? styles.cancelText
+                        }>
+                        {this.state.cancel.title ?? '取消'}
+                      </Text>
+                    </TouchableOpacity>
+                  )}
+                  <TouchableOpacity
+                    style={styles.confirm}
+                    onPress={() => {
+                      if (this.state.confirm?.noHide) {
+                        this.state.confirm?.action &&
+                          this.state.confirm.action();
+                      } else {
+                        this.hide(() => {
+                          this.state.confirm?.action &&
+                            this.state.confirm.action();
+                        });
+                      }
+                    }}>
+                    <Text
+                      style={
+                        this.state.confirm?.titleStyle ?? styles.confirmText
+                      }>
+                      {this.state.confirm?.title ?? '确定'}
+                    </Text>
+                  </TouchableOpacity>
+                </View>
+              </View>
+            }
+            type={'alert'}
+            options={{}}
+          />
+        )}
+      </>
+    );
+  }
+}
+
+const styles = StyleSheet.create({
+  container: {
+    backgroundColor: '#FFFFFF',
+    borderRadius: 10,
+    width: 250,
+  },
+  title: {
+    borderTopLeftRadius: 10,
+    borderTopRightRadius: 10,
+    backgroundColor: '#FFFFFF',
+    alignItems: 'center',
+    justifyContent: 'center',
+    padding: 20,
+  },
+  titleText: {
+    fontSize: 16,
+    color: '#222222',
+    fontWeight: '500',
+    textAlign: 'justify',
+    lineHeight: 22,
+  },
+  content: {
+    marginHorizontal: 16,
+    marginBottom: 20,
+  },
+  bottom: {
+    borderBottomLeftRadius: 10,
+    borderBottomRightRadius: 10,
+    backgroundColor: '#FFFFFF',
+    height: 50,
+    borderTopWidth: 0.5,
+    borderTopColor: '#E4E4E4',
+    flexDirection: 'row',
+    justifyContent: 'space-evenly',
+  },
+  cancel: {
+    flex: 1,
+    borderBottomLeftRadius: 10,
+    backgroundColor: '#FFFFFF',
+    alignItems: 'center',
+    justifyContent: 'center',
+    borderRightWidth: 0.5,
+    borderRightColor: '#E4E4E4',
+  },
+  cancelText: {
+    fontSize: 16,
+    color: '#B2B2B2',
+    fontWeight: '400',
+  },
+  confirm: {
+    flex: 1,
+    borderBottomLeftRadius: 10,
+    borderBottomRightRadius: 10,
+    backgroundColor: '#FFFFFF',
+    alignItems: 'center',
+    justifyContent: 'center',
+  },
+  confirmText: {
+    fontSize: 16,
+    color: '#4C81F7',
+    fontWeight: '500',
+  },
+});
+
+export default Alert;

+ 408 - 0
src/common/components/BottomSheet.tsx

@@ -0,0 +1,408 @@
+import React, { Component, JSX } from 'react';
+import {
+  StyleSheet,
+  Text,
+  TouchableOpacity,
+  View,
+  Animated,
+  LayoutChangeEvent,
+  BackHandler,
+  NativeEventSubscription,
+} from 'react-native';
+import {SafeAreaView} from 'react-native-safe-area-context';
+
+// 等待 popup 库完成之后,将会被替换掉
+
+const POPUP_ANIMATION_DURATION = 300;
+const POPUP_BACKGROUND_COLOR = '#000000';
+const POPUP_BACKGROUND_OPACITY = 0.2;
+const POPUP_VERTICAL_OFFSET = 0;
+
+type PopupOptions = {
+  duration?: number;
+  backgroundColor?: string;
+  backgroundOpacity?: number;
+  verticalOffset?: number;
+};
+type PopupType = 'top' | 'bottom' | 'alert';
+
+interface PopupProps {
+  content: JSX.Element;
+  type: PopupType;
+  options?: PopupOptions;
+  onShown?: () => void;
+  onPressBackground?: () => void;
+}
+interface PopupState {
+  backgroundOpacity: Animated.Value;
+  top: Animated.Value;
+  bottom: Animated.Value;
+  contentOpacity: Animated.Value;
+}
+
+class Popup extends Component<PopupProps, PopupState> {
+  private contentHeight = 0;
+
+  constructor(props: PopupProps) {
+    super(props);
+    this.state = {
+      backgroundOpacity: new Animated.Value(0),
+      top: new Animated.Value(0),
+      bottom: new Animated.Value(0),
+      contentOpacity: new Animated.Value(0),
+    };
+  }
+
+  backHandler?: NativeEventSubscription;
+
+  backAction = () => {
+    return true;
+  };
+
+  componentDidMount() {
+    this.backHandler = BackHandler.addEventListener(
+      'hardwareBackPress',
+      this.backAction,
+    );
+  }
+
+  componentWillUnmount() {
+    this.backHandler?.remove();
+  }
+
+  show(): void {
+    Animated.parallel([
+      Animated.timing(this.state.backgroundOpacity, {
+        toValue:
+          this.props.options?.backgroundOpacity ?? POPUP_BACKGROUND_OPACITY,
+        duration: this.props.options?.duration ?? POPUP_ANIMATION_DURATION,
+        useNativeDriver: false,
+      }),
+      this.props.type === 'top'
+        ? Animated.timing(this.state.top, {
+            toValue:
+              this.props.options?.verticalOffset ?? POPUP_VERTICAL_OFFSET,
+            duration: this.props.options?.duration ?? POPUP_ANIMATION_DURATION,
+            useNativeDriver: false,
+          })
+        : this.props.type === 'bottom'
+        ? Animated.timing(this.state.bottom, {
+            toValue: -(
+              this.props.options?.verticalOffset ?? POPUP_VERTICAL_OFFSET
+            ),
+            duration: this.props.options?.duration ?? POPUP_ANIMATION_DURATION,
+            useNativeDriver: false,
+          })
+        : Animated.timing(this.state.contentOpacity, {
+            toValue: 1,
+            duration: this.props.options?.duration ?? POPUP_ANIMATION_DURATION,
+            useNativeDriver: false,
+          }),
+    ]).start(finished => {
+      if (finished) {
+        this.props.onShown && this.props.onShown();
+      }
+    });
+  }
+
+  hide(callback?: () => void): void {
+    Animated.parallel([
+      Animated.timing(this.state.backgroundOpacity, {
+        toValue: 0,
+        duration: this.props.options?.duration ?? POPUP_ANIMATION_DURATION,
+        useNativeDriver: false,
+      }),
+      this.props.type === 'top'
+        ? Animated.timing(this.state.top, {
+            toValue: -this.contentHeight,
+            duration: POPUP_ANIMATION_DURATION,
+            useNativeDriver: false,
+          })
+        : this.props.type === 'bottom'
+        ? Animated.timing(this.state.bottom, {
+            toValue: -this.contentHeight,
+            duration: POPUP_ANIMATION_DURATION,
+            useNativeDriver: false,
+          })
+        : Animated.timing(this.state.contentOpacity, {
+            toValue: 0,
+            duration: POPUP_ANIMATION_DURATION,
+            useNativeDriver: false,
+          }),
+    ]).start(finished => {
+      if (finished) {
+        callback && callback();
+      }
+    });
+  }
+
+  onLayout(event: LayoutChangeEvent): void {
+    const height = event.nativeEvent.layout.height;
+    if (height > 0 && this.contentHeight === 0) {
+      this.contentHeight = height;
+      this.state.top.setValue(-height);
+      this.state.bottom.setValue(-height);
+      this.show();
+    }
+  }
+
+  render(): JSX.Element {
+    return (
+      <View
+        style={
+          this.props.type === 'alert'
+            ? popupStyles.containerAlert
+            : popupStyles.container
+        }>
+        <Animated.View
+          style={[
+            popupStyles.background,
+            {
+              opacity: this.state.backgroundOpacity,
+              backgroundColor:
+                this.props.options?.backgroundColor ?? POPUP_BACKGROUND_COLOR,
+            },
+          ]}>
+          <TouchableOpacity
+            style={popupStyles.backgroundTouch}
+            onPress={() => {
+              this.props.onPressBackground && this.props.onPressBackground();
+            }}
+          />
+        </Animated.View>
+        <Animated.View
+          style={
+            this.props.type === 'top'
+              ? [popupStyles.content, {top: this.state.top}]
+              : this.props.type === 'bottom'
+              ? [popupStyles.content, {bottom: this.state.bottom}]
+              : [
+                  popupStyles.contentAlert,
+                  {
+                    opacity: this.state.contentOpacity,
+                    top:
+                      this.props.options?.verticalOffset ??
+                      POPUP_VERTICAL_OFFSET,
+                  },
+                ]
+          }
+          onLayout={this.onLayout.bind(this)}>
+          {this.props.content}
+        </Animated.View>
+      </View>
+    );
+  }
+}
+
+const popupStyles = StyleSheet.create({
+  container: {
+    position: 'absolute',
+    left: 0,
+    right: 0,
+    top: 0,
+    bottom: 0,
+  },
+  containerAlert: {
+    position: 'absolute',
+    left: 0,
+    right: 0,
+    top: 0,
+    bottom: 0,
+    justifyContent: 'center',
+    alignItems: 'center',
+  },
+  background: {
+    position: 'absolute',
+    left: 0,
+    right: 0,
+    top: 0,
+    bottom: 0,
+  },
+  backgroundTouch: {
+    flex: 1,
+  },
+  content: {
+    position: 'absolute',
+    left: 0,
+    right: 0,
+  },
+  contentAlert: {
+    justifyContent: 'center',
+    alignItems: 'center',
+  },
+});
+
+type BottomSheetItem = {
+  text: string;
+};
+
+interface State {
+  items?: BottomSheetItem[];
+  title?: string;
+  onSelected?: (item: BottomSheetItem) => void;
+}
+
+class BottomSheet extends Component<object, State> {
+  private static _ref: BottomSheet | null = null;
+
+  public static setRef(ref: BottomSheet | null): void {
+    BottomSheet._ref = ref;
+  }
+
+  public static show<T extends BottomSheetItem>(
+    items: T[],
+    title?: string,
+    onSelected?: (item: T) => void,
+  ): void {
+    if (BottomSheet._ref) {
+      BottomSheet._ref.show(
+        items,
+        title,
+        onSelected as (item: BottomSheetItem) => void,
+      );
+    }
+  }
+
+  public static hide(callback?: () => void): void {
+    if (BottomSheet._ref) {
+      BottomSheet._ref.hide(callback);
+    }
+  }
+
+  private readonly popupRef: React.RefObject<Popup | null>;
+
+  constructor(props: object) {
+    super(props);
+    this.popupRef = React.createRef();
+    this.state = {
+      items: undefined,
+      title: undefined,
+      onSelected: undefined,
+    };
+  }
+
+  private show(
+    items: BottomSheetItem[],
+    title?: string,
+    onSelected?: (item: BottomSheetItem) => void,
+  ): void {
+    if (this.state.title) {
+      this.hide(() => {
+        this.show(items, title, onSelected);
+      });
+      return;
+    }
+    this.setState({
+      items: items,
+      title: title,
+      onSelected: onSelected,
+    });
+  }
+
+  private hide(callback?: () => void): void {
+    if (!this.state.items) {
+      return;
+    }
+    this.popupRef.current?.hide(() => {
+      this.setState(
+        {
+          items: undefined,
+          title: undefined,
+        },
+        () => {
+          callback && callback();
+        },
+      );
+    });
+  }
+
+  render(): JSX.Element {
+    return (
+      <>
+        {this.state.items && (
+          <Popup
+            ref={this.popupRef}
+            content={
+              <SafeAreaView style={styles.content} edges={['bottom']}>
+                {this.state.title && (
+                  <View style={styles.title}>
+                    <Text style={styles.titleText}>{this.state.title}</Text>
+                  </View>
+                )}
+                {this.state.items.map((item, index) => {
+                  return (
+                    <TouchableOpacity
+                      key={index}
+                      style={styles.item}
+                      onPress={() => {
+                        this.hide(() => {
+                          this.state.onSelected && this.state.onSelected(item);
+                        });
+                      }}>
+                      <Text style={styles.itemText}>{item.text}</Text>
+                    </TouchableOpacity>
+                  );
+                })}
+                <TouchableOpacity
+                  style={styles.cancel}
+                  onPress={() => {
+                    this.hide();
+                  }}>
+                  <Text style={styles.cancelText}>取消</Text>
+                </TouchableOpacity>
+              </SafeAreaView>
+            }
+            type={'bottom'}
+            options={{}}
+            onPressBackground={() => {
+              this.hide();
+            }}
+          />
+        )}
+      </>
+    );
+  }
+}
+
+const styles = StyleSheet.create({
+  content: {
+    backgroundColor: '#F2F2F2',
+  },
+  title: {
+    backgroundColor: '#FFFFFF',
+    height: 50,
+    alignItems: 'center',
+    justifyContent: 'center',
+  },
+  titleText: {
+    fontSize: 16,
+    color: '#222222',
+    fontWeight: '500',
+  },
+  item: {
+    backgroundColor: '#FFFFFF',
+    height: 50,
+    alignItems: 'center',
+    justifyContent: 'center',
+    marginTop: 0.5,
+  },
+  itemText: {
+    fontSize: 14,
+    color: '#333333',
+    fontWeight: '400',
+  },
+  cancel: {
+    backgroundColor: '#FFFFFF',
+    height: 50,
+    alignItems: 'center',
+    justifyContent: 'center',
+    marginTop: 6,
+  },
+  cancelText: {
+    fontSize: 14,
+    color: '#666666',
+    fontWeight: '400',
+  },
+});
+
+export default BottomSheet;

+ 18 - 0
src/common/components/HeaderBackImage.tsx

@@ -0,0 +1,18 @@
+import React from 'react';
+import {Image, StyleSheet} from 'react-native';
+
+export default function HeaderBackImage() {
+  return (
+    <Image
+      style={styles.backImage}
+      source={require('@common/assets/images/common_arrow_back.png')}
+    />
+  );
+}
+
+const styles = StyleSheet.create({
+  backImage: {
+    marginHorizontal: 16,
+    marginVertical: 10,
+  },
+});

+ 0 - 5
src/hospital/hospital.ts

@@ -1,5 +0,0 @@
-import { AppRegistry } from 'react-native';
-import Hospital from './Hospital.tsx';
-import { Apps } from '@common/NavigationHelper.ts';
-
-AppRegistry.registerComponent(Apps.Hospital, () => Hospital);

+ 3 - 3
src/hospital/Hospital.tsx → src/miniapp/hospital/HospitalMain.tsx

@@ -13,11 +13,11 @@ import {
   useColorScheme,
   View,
 } from 'react-native';
-import { pop } from '../common/NavigationHelper.ts';
+import { pop } from '@common/NavigationHelper.ts';
 import { showMessage } from '@common/ToastHelper.ts';
 import Toast from 'react-native-toast-message';
 
-function Hospital() {
+function HospitalMain() {
   const isDarkMode = useColorScheme() === 'dark';
 
   return (
@@ -49,4 +49,4 @@ const styles = StyleSheet.create({
   },
 });
 
-export default Hospital;
+export default HospitalMain;

+ 0 - 0
src/hospital/README.md → src/miniapp/hospital/README.md


+ 5 - 0
src/miniapp/hospital/hospital.ts

@@ -0,0 +1,5 @@
+import { AppRegistry } from 'react-native';
+import { Apps } from '@common/NavigationHelper.ts';
+import HospitalMain from './HospitalMain.tsx';
+
+AppRegistry.registerComponent(Apps.Hospital, () => HospitalMain);

+ 0 - 0
src/ywq/README.md → src/miniapp/ywq/README.md


+ 2 - 2
src/ywq/Ywq.tsx → src/miniapp/ywq/YwqMain.tsx

@@ -15,7 +15,7 @@ import {
 import { showMessage } from '@common/ToastHelper.ts';
 import Toast from 'react-native-toast-message';
 
-function YWQ() {
+function YwqMain() {
   const isDarkMode = useColorScheme() === 'dark';
 
   return (
@@ -41,4 +41,4 @@ const styles = StyleSheet.create({
   },
 });
 
-export default YWQ;
+export default YwqMain;

+ 5 - 0
src/miniapp/ywq/ywq.ts

@@ -0,0 +1,5 @@
+import { AppRegistry } from 'react-native';
+import YwqMain from './YwqMain.tsx';
+import { Apps } from '@common/NavigationHelper';
+
+AppRegistry.registerComponent(Apps.Ywq, () => YwqMain);

+ 0 - 5
src/ywq/ywq.ts

@@ -1,5 +0,0 @@
-import { AppRegistry } from 'react-native';
-import YWQ from '@ywx/Ywq.tsx';
-import { Apps } from '@common/NavigationHelper.ts';
-
-AppRegistry.registerComponent(Apps.Ywq, () => YWQ);

+ 6 - 6
tsconfig.json

@@ -6,17 +6,17 @@
       "@/*": [
         "src/*"
       ],
-      "@ywx/*": [
-        "src/ywq/*"
+      "@common/*": [
+        "src/common/*"
       ],
       "@app/*": [
         "src/app/*"
       ],
-      "@hospital/*": [
-        "src/hospital/*"
+      "@ywx/*": [
+        "src/miniapp/ywq/*"
       ],
-      "@common/*": [
-        "src/common/*"
+      "@hospital/*": [
+        "src/miniapp/hospital/*"
       ],
     },
     "experimentalDecorators": true,

+ 611 - 11
yarn.lock

@@ -974,7 +974,7 @@
     "@babel/types" "^7.4.4"
     esutils "^2.0.2"
 
-"@babel/runtime@^7.25.0":
+"@babel/runtime@^7.25.0", "@babel/runtime@^7.5.5":
   version "7.27.6"
   resolved "https://nexus-inner.51trust.com/repository/npm/@babel/runtime/-/runtime-7.27.6.tgz"
   integrity sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==
@@ -1027,6 +1027,226 @@
   resolved "https://nexus-inner.51trust.com/repository/npm/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz"
   integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
 
+"@changesets/apply-release-plan@^7.0.12":
+  version "7.0.12"
+  resolved "https://nexus-inner.51trust.com/repository/npm/@changesets/apply-release-plan/-/apply-release-plan-7.0.12.tgz#8413977f117fa95f6e2db6f0c35479a2eba6960a"
+  integrity sha512-EaET7As5CeuhTzvXTQCRZeBUcisoYPDDcXvgTE/2jmmypKp0RC7LxKj/yzqeh/1qFTZI7oDGFcL1PHRuQuketQ==
+  dependencies:
+    "@changesets/config" "^3.1.1"
+    "@changesets/get-version-range-type" "^0.4.0"
+    "@changesets/git" "^3.0.4"
+    "@changesets/should-skip-package" "^0.1.2"
+    "@changesets/types" "^6.1.0"
+    "@manypkg/get-packages" "^1.1.3"
+    detect-indent "^6.0.0"
+    fs-extra "^7.0.1"
+    lodash.startcase "^4.4.0"
+    outdent "^0.5.0"
+    prettier "^2.7.1"
+    resolve-from "^5.0.0"
+    semver "^7.5.3"
+
+"@changesets/assemble-release-plan@^6.0.9":
+  version "6.0.9"
+  resolved "https://nexus-inner.51trust.com/repository/npm/@changesets/assemble-release-plan/-/assemble-release-plan-6.0.9.tgz#8aa5baf0037a85812e320172e83b92ca31e85fd6"
+  integrity sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==
+  dependencies:
+    "@changesets/errors" "^0.2.0"
+    "@changesets/get-dependents-graph" "^2.1.3"
+    "@changesets/should-skip-package" "^0.1.2"
+    "@changesets/types" "^6.1.0"
+    "@manypkg/get-packages" "^1.1.3"
+    semver "^7.5.3"
+
+"@changesets/changelog-git@^0.2.1":
+  version "0.2.1"
+  resolved "https://nexus-inner.51trust.com/repository/npm/@changesets/changelog-git/-/changelog-git-0.2.1.tgz#7f311f3dc11eae1235aa7fd2c1807112962b409b"
+  integrity sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==
+  dependencies:
+    "@changesets/types" "^6.1.0"
+
+"@changesets/changelog-github@^0.5.0":
+  version "0.5.1"
+  resolved "https://nexus-inner.51trust.com/repository/npm/@changesets/changelog-github/-/changelog-github-0.5.1.tgz#58870f77cdfd6d59c73cc046a61e55e82d606d24"
+  integrity sha512-BVuHtF+hrhUScSoHnJwTELB4/INQxVFc+P/Qdt20BLiBFIHFJDDUaGsZw+8fQeJTRP5hJZrzpt3oZWh0G19rAQ==
+  dependencies:
+    "@changesets/get-github-info" "^0.6.0"
+    "@changesets/types" "^6.1.0"
+    dotenv "^8.1.0"
+
+"@changesets/cli@^2.27.1":
+  version "2.29.5"
+  resolved "https://nexus-inner.51trust.com/repository/npm/@changesets/cli/-/cli-2.29.5.tgz#7ff589686b5a16b6790962ac09182c7462db4899"
+  integrity sha512-0j0cPq3fgxt2dPdFsg4XvO+6L66RC0pZybT9F4dG5TBrLA3jA/1pNkdTXH9IBBVHkgsKrNKenI3n1mPyPlIydg==
+  dependencies:
+    "@changesets/apply-release-plan" "^7.0.12"
+    "@changesets/assemble-release-plan" "^6.0.9"
+    "@changesets/changelog-git" "^0.2.1"
+    "@changesets/config" "^3.1.1"
+    "@changesets/errors" "^0.2.0"
+    "@changesets/get-dependents-graph" "^2.1.3"
+    "@changesets/get-release-plan" "^4.0.13"
+    "@changesets/git" "^3.0.4"
+    "@changesets/logger" "^0.1.1"
+    "@changesets/pre" "^2.0.2"
+    "@changesets/read" "^0.6.5"
+    "@changesets/should-skip-package" "^0.1.2"
+    "@changesets/types" "^6.1.0"
+    "@changesets/write" "^0.4.0"
+    "@manypkg/get-packages" "^1.1.3"
+    ansi-colors "^4.1.3"
+    ci-info "^3.7.0"
+    enquirer "^2.4.1"
+    external-editor "^3.1.0"
+    fs-extra "^7.0.1"
+    mri "^1.2.0"
+    p-limit "^2.2.0"
+    package-manager-detector "^0.2.0"
+    picocolors "^1.1.0"
+    resolve-from "^5.0.0"
+    semver "^7.5.3"
+    spawndamnit "^3.0.1"
+    term-size "^2.1.0"
+
+"@changesets/config@^3.1.1":
+  version "3.1.1"
+  resolved "https://nexus-inner.51trust.com/repository/npm/@changesets/config/-/config-3.1.1.tgz#3e5b1f74236a4552c5f4eddf2bd05a43a0b71160"
+  integrity sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA==
+  dependencies:
+    "@changesets/errors" "^0.2.0"
+    "@changesets/get-dependents-graph" "^2.1.3"
+    "@changesets/logger" "^0.1.1"
+    "@changesets/types" "^6.1.0"
+    "@manypkg/get-packages" "^1.1.3"
+    fs-extra "^7.0.1"
+    micromatch "^4.0.8"
+
+"@changesets/errors@^0.2.0":
+  version "0.2.0"
+  resolved "https://nexus-inner.51trust.com/repository/npm/@changesets/errors/-/errors-0.2.0.tgz#3c545e802b0f053389cadcf0ed54e5636ff9026a"
+  integrity sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==
+  dependencies:
+    extendable-error "^0.1.5"
+
+"@changesets/get-dependents-graph@^2.1.3":
+  version "2.1.3"
+  resolved "https://nexus-inner.51trust.com/repository/npm/@changesets/get-dependents-graph/-/get-dependents-graph-2.1.3.tgz#cd31b39daab7102921fb65acdcb51b4658502eee"
+  integrity sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==
+  dependencies:
+    "@changesets/types" "^6.1.0"
+    "@manypkg/get-packages" "^1.1.3"
+    picocolors "^1.1.0"
+    semver "^7.5.3"
+
+"@changesets/get-github-info@^0.6.0":
+  version "0.6.0"
+  resolved "https://nexus-inner.51trust.com/repository/npm/@changesets/get-github-info/-/get-github-info-0.6.0.tgz#faba66a20a3a5a0cbabea28efd43c9ede7429f11"
+  integrity sha512-v/TSnFVXI8vzX9/w3DU2Ol+UlTZcu3m0kXTjTT4KlAdwSvwutcByYwyYn9hwerPWfPkT2JfpoX0KgvCEi8Q/SA==
+  dependencies:
+    dataloader "^1.4.0"
+    node-fetch "^2.5.0"
+
+"@changesets/get-release-plan@^4.0.13":
+  version "4.0.13"
+  resolved "https://nexus-inner.51trust.com/repository/npm/@changesets/get-release-plan/-/get-release-plan-4.0.13.tgz#02e2d9b89a3911bfc4bf1dafe237098b4b7454e9"
+  integrity sha512-DWG1pus72FcNeXkM12tx+xtExyH/c9I1z+2aXlObH3i9YA7+WZEVaiHzHl03thpvAgWTRaH64MpfHxozfF7Dvg==
+  dependencies:
+    "@changesets/assemble-release-plan" "^6.0.9"
+    "@changesets/config" "^3.1.1"
+    "@changesets/pre" "^2.0.2"
+    "@changesets/read" "^0.6.5"
+    "@changesets/types" "^6.1.0"
+    "@manypkg/get-packages" "^1.1.3"
+
+"@changesets/get-version-range-type@^0.4.0":
+  version "0.4.0"
+  resolved "https://nexus-inner.51trust.com/repository/npm/@changesets/get-version-range-type/-/get-version-range-type-0.4.0.tgz#429a90410eefef4368502c41c63413e291740bf5"
+  integrity sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==
+
+"@changesets/git@^3.0.4":
+  version "3.0.4"
+  resolved "https://nexus-inner.51trust.com/repository/npm/@changesets/git/-/git-3.0.4.tgz#75e3811ab407ec010beb51131ceb5c6b3975c914"
+  integrity sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==
+  dependencies:
+    "@changesets/errors" "^0.2.0"
+    "@manypkg/get-packages" "^1.1.3"
+    is-subdir "^1.1.1"
+    micromatch "^4.0.8"
+    spawndamnit "^3.0.1"
+
+"@changesets/logger@^0.1.1":
+  version "0.1.1"
+  resolved "https://nexus-inner.51trust.com/repository/npm/@changesets/logger/-/logger-0.1.1.tgz#9926ac4dc8fb00472fe1711603b6b4755d64b435"
+  integrity sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==
+  dependencies:
+    picocolors "^1.1.0"
+
+"@changesets/parse@^0.4.1":
+  version "0.4.1"
+  resolved "https://nexus-inner.51trust.com/repository/npm/@changesets/parse/-/parse-0.4.1.tgz#18ba51d2eb784d27469034f06344f8fdcba586df"
+  integrity sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q==
+  dependencies:
+    "@changesets/types" "^6.1.0"
+    js-yaml "^3.13.1"
+
+"@changesets/pre@^2.0.2":
+  version "2.0.2"
+  resolved "https://nexus-inner.51trust.com/repository/npm/@changesets/pre/-/pre-2.0.2.tgz#b35e84d25fca8b970340642ca04ce76c7fc34ced"
+  integrity sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==
+  dependencies:
+    "@changesets/errors" "^0.2.0"
+    "@changesets/types" "^6.1.0"
+    "@manypkg/get-packages" "^1.1.3"
+    fs-extra "^7.0.1"
+
+"@changesets/read@^0.6.5":
+  version "0.6.5"
+  resolved "https://nexus-inner.51trust.com/repository/npm/@changesets/read/-/read-0.6.5.tgz#7a68457e6356d3df187aa18e388f1b8dba3d2156"
+  integrity sha512-UPzNGhsSjHD3Veb0xO/MwvasGe8eMyNrR/sT9gR8Q3DhOQZirgKhhXv/8hVsI0QpPjR004Z9iFxoJU6in3uGMg==
+  dependencies:
+    "@changesets/git" "^3.0.4"
+    "@changesets/logger" "^0.1.1"
+    "@changesets/parse" "^0.4.1"
+    "@changesets/types" "^6.1.0"
+    fs-extra "^7.0.1"
+    p-filter "^2.1.0"
+    picocolors "^1.1.0"
+
+"@changesets/should-skip-package@^0.1.2":
+  version "0.1.2"
+  resolved "https://nexus-inner.51trust.com/repository/npm/@changesets/should-skip-package/-/should-skip-package-0.1.2.tgz#c018e1e05eab3d97afa4c4590f2b0db7486ae488"
+  integrity sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==
+  dependencies:
+    "@changesets/types" "^6.1.0"
+    "@manypkg/get-packages" "^1.1.3"
+
+"@changesets/types@^4.0.1":
+  version "4.1.0"
+  resolved "https://nexus-inner.51trust.com/repository/npm/@changesets/types/-/types-4.1.0.tgz#fb8f7ca2324fd54954824e864f9a61a82cb78fe0"
+  integrity sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==
+
+"@changesets/types@^6.1.0":
+  version "6.1.0"
+  resolved "https://nexus-inner.51trust.com/repository/npm/@changesets/types/-/types-6.1.0.tgz#12a4c8490827d26bc6fbf97a151499be2fb6d2f5"
+  integrity sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==
+
+"@changesets/write@^0.4.0":
+  version "0.4.0"
+  resolved "https://nexus-inner.51trust.com/repository/npm/@changesets/write/-/write-0.4.0.tgz#ec903cbd8aa9b6da6fa09ef19fb609eedd115ed6"
+  integrity sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==
+  dependencies:
+    "@changesets/types" "^6.1.0"
+    fs-extra "^7.0.1"
+    human-id "^4.1.1"
+    prettier "^2.7.1"
+
+"@egjs/hammerjs@^2.0.17":
+  version "2.0.17"
+  resolved "https://nexus-inner.51trust.com/repository/npm/@egjs/hammerjs/-/hammerjs-2.0.17.tgz#5dc02af75a6a06e4c2db0202cae38c9263895124"
+  integrity sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==
+  dependencies:
+    "@types/hammerjs" "^2.0.36"
+
 "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0":
   version "4.7.0"
   resolved "https://nexus-inner.51trust.com/repository/npm/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz"
@@ -1355,6 +1575,28 @@
     "@jridgewell/resolve-uri" "^3.1.0"
     "@jridgewell/sourcemap-codec" "^1.4.14"
 
+"@manypkg/find-root@^1.1.0":
+  version "1.1.0"
+  resolved "https://nexus-inner.51trust.com/repository/npm/@manypkg/find-root/-/find-root-1.1.0.tgz#a62d8ed1cd7e7d4c11d9d52a8397460b5d4ad29f"
+  integrity sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==
+  dependencies:
+    "@babel/runtime" "^7.5.5"
+    "@types/node" "^12.7.1"
+    find-up "^4.1.0"
+    fs-extra "^8.1.0"
+
+"@manypkg/get-packages@^1.1.3":
+  version "1.1.3"
+  resolved "https://nexus-inner.51trust.com/repository/npm/@manypkg/get-packages/-/get-packages-1.1.3.tgz#e184db9bba792fa4693de4658cfb1463ac2c9c47"
+  integrity sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==
+  dependencies:
+    "@babel/runtime" "^7.5.5"
+    "@changesets/types" "^4.0.1"
+    "@manypkg/find-root" "^1.1.0"
+    fs-extra "^8.1.0"
+    globby "^11.0.0"
+    read-yaml-file "^1.1.0"
+
 "@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1":
   version "5.1.1-v1"
   resolved "https://nexus-inner.51trust.com/repository/npm/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz"
@@ -1729,6 +1971,54 @@
     invariant "^2.2.4"
     nullthrows "^1.1.1"
 
+"@react-navigation/core@^7.12.1":
+  version "7.12.1"
+  resolved "https://nexus-inner.51trust.com/repository/npm/@react-navigation/core/-/core-7.12.1.tgz#aed4ad5fe88f3304c9ab2ac0c97d7014e8f6c3c5"
+  integrity sha512-ir6s25CDkReufi0vQhSIAe+AAHHJN9zTgGlS6iDS1yqbwgl2MiBAZzpaOL1T5llYujie2jF/bODeLz2j4k80zw==
+  dependencies:
+    "@react-navigation/routers" "^7.4.1"
+    escape-string-regexp "^4.0.0"
+    nanoid "^3.3.11"
+    query-string "^7.1.3"
+    react-is "^19.1.0"
+    use-latest-callback "^0.2.4"
+    use-sync-external-store "^1.5.0"
+
+"@react-navigation/elements@^2.5.2":
+  version "2.5.2"
+  resolved "https://nexus-inner.51trust.com/repository/npm/@react-navigation/elements/-/elements-2.5.2.tgz#e74aed3671f280773b0066c308f679a0e9e679ab"
+  integrity sha512-aGC3ukF5+lXuiF5bK7bJyRuWCE+Tk4MZ3GoQpAb7u7+m0KmsquliDhj4UCWEUU5kUoCeoRAUvv+1lKcYKf+WTQ==
+  dependencies:
+    color "^4.2.3"
+    use-latest-callback "^0.2.4"
+    use-sync-external-store "^1.5.0"
+
+"@react-navigation/native@^7.1.14":
+  version "7.1.14"
+  resolved "https://nexus-inner.51trust.com/repository/npm/@react-navigation/native/-/native-7.1.14.tgz#6b5b57bba4c5f45bfc9961da2f921aba5215dfad"
+  integrity sha512-X233/CNx41FpshlWe4uEAUN8CNem3ju4t5pnVKcdhDR0cTQT1rK6P0ZwjSylD9zXdnHvJttFjBhKTot6TcvSqA==
+  dependencies:
+    "@react-navigation/core" "^7.12.1"
+    escape-string-regexp "^4.0.0"
+    fast-deep-equal "^3.1.3"
+    nanoid "^3.3.11"
+    use-latest-callback "^0.2.4"
+
+"@react-navigation/routers@^7.4.1":
+  version "7.4.1"
+  resolved "https://nexus-inner.51trust.com/repository/npm/@react-navigation/routers/-/routers-7.4.1.tgz#8bbce1cfc7080a8aa3588910a934ee11c3a72406"
+  integrity sha512-42mZrMzQ0LfKxUb5OHIurYrPYyRsXFLolucILrvm21f0O40Sw0Ufh1bnn/jRqnxZZu7wvpUGIGYM8nS9zVE1Aw==
+  dependencies:
+    nanoid "^3.3.11"
+
+"@react-navigation/stack@^7.4.2":
+  version "7.4.2"
+  resolved "https://nexus-inner.51trust.com/repository/npm/@react-navigation/stack/-/stack-7.4.2.tgz#55f64bc1131eb86528a3509f77779a0c2fb2e327"
+  integrity sha512-QlqBxKBfKVx/XRH04pRRGQ92tO1fV0RL7YEw5G4pew6CNY26102dVQl5A39ZztvlvEDQbCQkatyDS7i2xR1QiA==
+  dependencies:
+    "@react-navigation/elements" "^2.5.2"
+    color "^4.2.3"
+
 "@sideway/address@^4.1.5":
   version "4.1.5"
   resolved "https://nexus-inner.51trust.com/repository/npm/@sideway/address/-/address-4.1.5.tgz"
@@ -1805,6 +2095,11 @@
   dependencies:
     "@types/node" "*"
 
+"@types/hammerjs@^2.0.36":
+  version "2.0.46"
+  resolved "https://nexus-inner.51trust.com/repository/npm/@types/hammerjs/-/hammerjs-2.0.46.tgz#381daaca1360ff8a7c8dff63f32e69745b9fb1e1"
+  integrity sha512-ynRvcq6wvqexJ9brDMS4BnBLzmr0e14d6ZJTEShTBWKymQiHwlAyGu0ZPEFI2Fh1U53F7tN9ufClWM5KvqkKOw==
+
 "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1":
   version "2.0.6"
   resolved "https://nexus-inner.51trust.com/repository/npm/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz"
@@ -1844,6 +2139,11 @@
   dependencies:
     undici-types "~7.8.0"
 
+"@types/node@^12.7.1":
+  version "12.20.55"
+  resolved "https://nexus-inner.51trust.com/repository/npm/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240"
+  integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==
+
 "@types/react-test-renderer@^19.1.0":
   version "19.1.0"
   resolved "https://nexus-inner.51trust.com/repository/npm/@types/react-test-renderer/-/react-test-renderer-19.1.0.tgz"
@@ -2071,6 +2371,11 @@ anser@^1.4.9:
   resolved "https://nexus-inner.51trust.com/repository/npm/anser/-/anser-1.4.10.tgz"
   integrity sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==
 
+ansi-colors@^4.1.1, ansi-colors@^4.1.3:
+  version "4.1.3"
+  resolved "https://nexus-inner.51trust.com/repository/npm/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b"
+  integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==
+
 ansi-escapes@^1.1.0:
   version "1.4.0"
   resolved "https://nexus-inner.51trust.com/repository/npm/ansi-escapes/-/ansi-escapes-1.4.0.tgz"
@@ -2410,6 +2715,13 @@ base64-js@^1.3.1, base64-js@^1.5.1:
   resolved "https://nexus-inner.51trust.com/repository/npm/base64-js/-/base64-js-1.5.1.tgz"
   integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
 
+better-path-resolve@1.0.0:
+  version "1.0.0"
+  resolved "https://nexus-inner.51trust.com/repository/npm/better-path-resolve/-/better-path-resolve-1.0.0.tgz#13a35a1104cdd48a7b74bf8758f96a1ee613f99d"
+  integrity sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==
+  dependencies:
+    is-windows "^1.0.0"
+
 bl@^4.1.0:
   version "4.1.0"
   resolved "https://nexus-inner.51trust.com/repository/npm/bl/-/bl-4.1.0.tgz"
@@ -2588,6 +2900,11 @@ chardet@^0.4.0:
   resolved "https://nexus-inner.51trust.com/repository/npm/chardet/-/chardet-0.4.2.tgz"
   integrity sha512-j/Toj7f1z98Hh2cYo2BVr85EpIRWqUi7rtRSGxh/cqUjqrnJe9l9UE7IUGd2vQ2p+kSHLkSzObQPZPLUC6TQwg==
 
+chardet@^0.7.0:
+  version "0.7.0"
+  resolved "https://nexus-inner.51trust.com/repository/npm/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
+  integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
+
 chrome-launcher@^0.15.2:
   version "0.15.2"
   resolved "https://nexus-inner.51trust.com/repository/npm/chrome-launcher/-/chrome-launcher-0.15.2.tgz"
@@ -2615,7 +2932,7 @@ ci-info@^2.0.0:
   resolved "https://nexus-inner.51trust.com/repository/npm/ci-info/-/ci-info-2.0.0.tgz"
   integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
 
-ci-info@^3.2.0:
+ci-info@^3.2.0, ci-info@^3.7.0:
   version "3.9.0"
   resolved "https://nexus-inner.51trust.com/repository/npm/ci-info/-/ci-info-3.9.0.tgz"
   integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==
@@ -2701,11 +3018,27 @@ color-name@1.1.3:
   resolved "https://nexus-inner.51trust.com/repository/npm/color-name/-/color-name-1.1.3.tgz"
   integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
 
-color-name@~1.1.4:
+color-name@^1.0.0, color-name@~1.1.4:
   version "1.1.4"
   resolved "https://nexus-inner.51trust.com/repository/npm/color-name/-/color-name-1.1.4.tgz"
   integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
 
+color-string@^1.9.0:
+  version "1.9.1"
+  resolved "https://nexus-inner.51trust.com/repository/npm/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4"
+  integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==
+  dependencies:
+    color-name "^1.0.0"
+    simple-swizzle "^0.2.2"
+
+color@^4.2.3:
+  version "4.2.3"
+  resolved "https://nexus-inner.51trust.com/repository/npm/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a"
+  integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==
+  dependencies:
+    color-convert "^2.0.1"
+    color-string "^1.9.0"
+
 colorette@^1.0.7:
   version "1.4.0"
   resolved "https://nexus-inner.51trust.com/repository/npm/colorette/-/colorette-1.4.0.tgz"
@@ -2821,7 +3154,7 @@ create-jest@^29.7.0:
     jest-util "^29.7.0"
     prompts "^2.0.1"
 
-cross-spawn@^7.0.2, cross-spawn@^7.0.3:
+cross-spawn@^7.0.2, cross-spawn@^7.0.3, cross-spawn@^7.0.5:
   version "7.0.6"
   resolved "https://nexus-inner.51trust.com/repository/npm/cross-spawn/-/cross-spawn-7.0.6.tgz"
   integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==
@@ -2862,6 +3195,11 @@ data-view-byte-offset@^1.0.1:
     es-errors "^1.3.0"
     is-data-view "^1.0.1"
 
+dataloader@^1.4.0:
+  version "1.4.0"
+  resolved "https://nexus-inner.51trust.com/repository/npm/dataloader/-/dataloader-1.4.0.tgz#bca11d867f5d3f1b9ed9f737bd15970c65dff5c8"
+  integrity sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==
+
 dayjs@^1.8.15:
   version "1.11.13"
   resolved "https://nexus-inner.51trust.com/repository/npm/dayjs/-/dayjs-1.11.13.tgz"
@@ -2886,6 +3224,11 @@ decamelize@^1.2.0:
   resolved "https://nexus-inner.51trust.com/repository/npm/decamelize/-/decamelize-1.2.0.tgz"
   integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==
 
+decode-uri-component@^0.2.2:
+  version "0.2.2"
+  resolved "https://nexus-inner.51trust.com/repository/npm/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9"
+  integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==
+
 dedent@^1.0.0:
   version "1.6.0"
   resolved "https://nexus-inner.51trust.com/repository/npm/dedent/-/dedent-1.6.0.tgz"
@@ -2936,6 +3279,11 @@ destroy@1.2.0:
   resolved "https://nexus-inner.51trust.com/repository/npm/destroy/-/destroy-1.2.0.tgz"
   integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
 
+detect-indent@^6.0.0:
+  version "6.1.0"
+  resolved "https://nexus-inner.51trust.com/repository/npm/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6"
+  integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==
+
 detect-newline@^3.0.0:
   version "3.1.0"
   resolved "https://nexus-inner.51trust.com/repository/npm/detect-newline/-/detect-newline-3.1.0.tgz"
@@ -2967,6 +3315,11 @@ doctrine@^3.0.0:
   dependencies:
     esutils "^2.0.2"
 
+dotenv@^8.1.0:
+  version "8.6.0"
+  resolved "https://nexus-inner.51trust.com/repository/npm/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b"
+  integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==
+
 dunder-proto@^1.0.0, dunder-proto@^1.0.1:
   version "1.0.1"
   resolved "https://nexus-inner.51trust.com/repository/npm/dunder-proto/-/dunder-proto-1.0.1.tgz"
@@ -3013,6 +3366,14 @@ encoding@^0.1.11:
   dependencies:
     iconv-lite "^0.6.2"
 
+enquirer@^2.4.1:
+  version "2.4.1"
+  resolved "https://nexus-inner.51trust.com/repository/npm/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56"
+  integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==
+  dependencies:
+    ansi-colors "^4.1.1"
+    strip-ansi "^6.0.1"
+
 env-paths@^2.2.1:
   version "2.2.1"
   resolved "https://nexus-inner.51trust.com/repository/npm/env-paths/-/env-paths-2.2.1.tgz"
@@ -3423,6 +3784,11 @@ exponential-backoff@^3.1.1:
   resolved "https://nexus-inner.51trust.com/repository/npm/exponential-backoff/-/exponential-backoff-3.1.2.tgz"
   integrity sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==
 
+extendable-error@^0.1.5:
+  version "0.1.7"
+  resolved "https://nexus-inner.51trust.com/repository/npm/extendable-error/-/extendable-error-0.1.7.tgz#60b9adf206264ac920058a7395685ae4670c2b96"
+  integrity sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==
+
 external-editor@^2.0.1:
   version "2.2.0"
   resolved "https://nexus-inner.51trust.com/repository/npm/external-editor/-/external-editor-2.2.0.tgz"
@@ -3432,6 +3798,15 @@ external-editor@^2.0.1:
     iconv-lite "^0.4.17"
     tmp "^0.0.33"
 
+external-editor@^3.1.0:
+  version "3.1.0"
+  resolved "https://nexus-inner.51trust.com/repository/npm/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495"
+  integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==
+  dependencies:
+    chardet "^0.7.0"
+    iconv-lite "^0.4.24"
+    tmp "^0.0.33"
+
 fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
   version "3.1.3"
   resolved "https://nexus-inner.51trust.com/repository/npm/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz"
@@ -3500,6 +3875,11 @@ fill-range@^7.1.1:
   dependencies:
     to-regex-range "^5.0.1"
 
+filter-obj@^1.1.0:
+  version "1.1.0"
+  resolved "https://nexus-inner.51trust.com/repository/npm/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b"
+  integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==
+
 finalhandler@1.1.2:
   version "1.1.2"
   resolved "https://nexus-inner.51trust.com/repository/npm/finalhandler/-/finalhandler-1.1.2.tgz"
@@ -3574,6 +3954,15 @@ fresh@0.5.2:
   resolved "https://nexus-inner.51trust.com/repository/npm/fresh/-/fresh-0.5.2.tgz"
   integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==
 
+fs-extra@^7.0.1:
+  version "7.0.1"
+  resolved "https://nexus-inner.51trust.com/repository/npm/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9"
+  integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==
+  dependencies:
+    graceful-fs "^4.1.2"
+    jsonfile "^4.0.0"
+    universalify "^0.1.0"
+
 fs-extra@^8.1.0:
   version "8.1.0"
   resolved "https://nexus-inner.51trust.com/repository/npm/fs-extra/-/fs-extra-8.1.0.tgz"
@@ -3719,7 +4108,7 @@ globalthis@^1.0.4:
     define-properties "^1.2.1"
     gopd "^1.0.1"
 
-globby@^11.1.0:
+globby@^11.0.0, globby@^11.1.0:
   version "11.1.0"
   resolved "https://nexus-inner.51trust.com/repository/npm/globby/-/globby-11.1.0.tgz"
   integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
@@ -3736,7 +4125,7 @@ gopd@^1.0.1, gopd@^1.2.0:
   resolved "https://nexus-inner.51trust.com/repository/npm/gopd/-/gopd-1.2.0.tgz"
   integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==
 
-graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9:
+graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.5, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9:
   version "4.2.11"
   resolved "https://nexus-inner.51trust.com/repository/npm/graceful-fs/-/graceful-fs-4.2.11.tgz"
   integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
@@ -3820,6 +4209,13 @@ hermes-parser@0.29.1:
   dependencies:
     hermes-estree "0.29.1"
 
+hoist-non-react-statics@^3.3.0:
+  version "3.3.2"
+  resolved "https://nexus-inner.51trust.com/repository/npm/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45"
+  integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
+  dependencies:
+    react-is "^16.7.0"
+
 html-escaper@^2.0.0:
   version "2.0.2"
   resolved "https://nexus-inner.51trust.com/repository/npm/html-escaper/-/html-escaper-2.0.2.tgz"
@@ -3844,12 +4240,17 @@ https-proxy-agent@^7.0.5:
     agent-base "^7.1.2"
     debug "4"
 
+human-id@^4.1.1:
+  version "4.1.1"
+  resolved "https://nexus-inner.51trust.com/repository/npm/human-id/-/human-id-4.1.1.tgz#2801fbd61b9a5c1c9170f332802db6408a39a4b0"
+  integrity sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==
+
 human-signals@^2.1.0:
   version "2.1.0"
   resolved "https://nexus-inner.51trust.com/repository/npm/human-signals/-/human-signals-2.1.0.tgz"
   integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
 
-iconv-lite@0.4.24, iconv-lite@^0.4.17:
+iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.24:
   version "0.4.24"
   resolved "https://nexus-inner.51trust.com/repository/npm/iconv-lite/-/iconv-lite-0.4.24.tgz"
   integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
@@ -3971,6 +4372,11 @@ is-arrayish@^0.2.1:
   resolved "https://nexus-inner.51trust.com/repository/npm/is-arrayish/-/is-arrayish-0.2.1.tgz"
   integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==
 
+is-arrayish@^0.3.1:
+  version "0.3.2"
+  resolved "https://nexus-inner.51trust.com/repository/npm/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03"
+  integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==
+
 is-async-function@^2.0.0:
   version "2.1.1"
   resolved "https://nexus-inner.51trust.com/repository/npm/is-async-function/-/is-async-function-2.1.1.tgz"
@@ -4158,6 +4564,13 @@ is-string@^1.1.1:
     call-bound "^1.0.3"
     has-tostringtag "^1.0.2"
 
+is-subdir@^1.1.1:
+  version "1.2.0"
+  resolved "https://nexus-inner.51trust.com/repository/npm/is-subdir/-/is-subdir-1.2.0.tgz#b791cd28fab5202e91a08280d51d9d7254fd20d4"
+  integrity sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==
+  dependencies:
+    better-path-resolve "1.0.0"
+
 is-symbol@^1.0.4, is-symbol@^1.1.1:
   version "1.1.1"
   resolved "https://nexus-inner.51trust.com/repository/npm/is-symbol/-/is-symbol-1.1.1.tgz"
@@ -4199,6 +4612,11 @@ is-weakset@^2.0.3:
     call-bound "^1.0.3"
     get-intrinsic "^1.2.6"
 
+is-windows@^1.0.0:
+  version "1.0.2"
+  resolved "https://nexus-inner.51trust.com/repository/npm/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+  integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
+
 is-wsl@^1.1.0:
   version "1.1.0"
   resolved "https://nexus-inner.51trust.com/repository/npm/is-wsl/-/is-wsl-1.1.0.tgz"
@@ -4660,7 +5078,7 @@ joi@^17.2.1:
   resolved "https://nexus-inner.51trust.com/repository/npm/js-tokens/-/js-tokens-4.0.0.tgz"
   integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
 
-js-yaml@^3.13.1:
+js-yaml@^3.13.1, js-yaml@^3.6.1:
   version "3.14.1"
   resolved "https://nexus-inner.51trust.com/repository/npm/js-yaml/-/js-yaml-3.14.1.tgz"
   integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
@@ -4815,6 +5233,11 @@ lodash.merge@^4.6.2:
   resolved "https://nexus-inner.51trust.com/repository/npm/lodash.merge/-/lodash.merge-4.6.2.tgz"
   integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
 
+lodash.startcase@^4.4.0:
+  version "4.4.0"
+  resolved "https://nexus-inner.51trust.com/repository/npm/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8"
+  integrity sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==
+
 lodash.throttle@^4.1.1:
   version "4.1.1"
   resolved "https://nexus-inner.51trust.com/repository/npm/lodash.throttle/-/lodash.throttle-4.1.1.tgz"
@@ -5186,11 +5609,21 @@ minipass@^4.2.4:
   resolved "https://nexus-inner.51trust.com/repository/npm/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707"
   integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==
 
+mitt@^3.0.1:
+  version "3.0.1"
+  resolved "https://nexus-inner.51trust.com/repository/npm/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1"
+  integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==
+
 mkdirp@^1.0.4:
   version "1.0.4"
   resolved "https://nexus-inner.51trust.com/repository/npm/mkdirp/-/mkdirp-1.0.4.tgz"
   integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
 
+mri@^1.2.0:
+  version "1.2.0"
+  resolved "https://nexus-inner.51trust.com/repository/npm/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b"
+  integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==
+
 ms@2.0.0:
   version "2.0.0"
   resolved "https://nexus-inner.51trust.com/repository/npm/ms/-/ms-2.0.0.tgz"
@@ -5206,6 +5639,11 @@ mute-stream@0.0.7:
   resolved "https://nexus-inner.51trust.com/repository/npm/mute-stream/-/mute-stream-0.0.7.tgz"
   integrity sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==
 
+nanoid@^3.3.11:
+  version "3.3.11"
+  resolved "https://nexus-inner.51trust.com/repository/npm/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b"
+  integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==
+
 natural-compare@^1.4.0:
   version "1.4.0"
   resolved "https://nexus-inner.51trust.com/repository/npm/natural-compare/-/natural-compare-1.4.0.tgz"
@@ -5234,6 +5672,13 @@ node-fetch@1.6.3:
     encoding "^0.1.11"
     is-stream "^1.0.1"
 
+node-fetch@^2.5.0:
+  version "2.7.0"
+  resolved "https://nexus-inner.51trust.com/repository/npm/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d"
+  integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==
+  dependencies:
+    whatwg-url "^5.0.0"
+
 node-int64@^0.4.0:
   version "0.4.0"
   resolved "https://nexus-inner.51trust.com/repository/npm/node-int64/-/node-int64-0.4.0.tgz"
@@ -5442,6 +5887,11 @@ os-tmpdir@~1.0.2:
   resolved "https://nexus-inner.51trust.com/repository/npm/os-tmpdir/-/os-tmpdir-1.0.2.tgz"
   integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==
 
+outdent@^0.5.0:
+  version "0.5.0"
+  resolved "https://nexus-inner.51trust.com/repository/npm/outdent/-/outdent-0.5.0.tgz#9e10982fdc41492bb473ad13840d22f9655be2ff"
+  integrity sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==
+
 own-keys@^1.0.1:
   version "1.0.1"
   resolved "https://nexus-inner.51trust.com/repository/npm/own-keys/-/own-keys-1.0.1.tgz"
@@ -5451,6 +5901,13 @@ own-keys@^1.0.1:
     object-keys "^1.1.1"
     safe-push-apply "^1.0.0"
 
+p-filter@^2.1.0:
+  version "2.1.0"
+  resolved "https://nexus-inner.51trust.com/repository/npm/p-filter/-/p-filter-2.1.0.tgz#1b1472562ae7a0f742f0f3d3d3718ea66ff9c09c"
+  integrity sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==
+  dependencies:
+    p-map "^2.0.0"
+
 p-limit@^2.0.0, p-limit@^2.2.0:
   version "2.3.0"
   resolved "https://nexus-inner.51trust.com/repository/npm/p-limit/-/p-limit-2.3.0.tgz"
@@ -5486,11 +5943,23 @@ p-locate@^5.0.0:
   dependencies:
     p-limit "^3.0.2"
 
+p-map@^2.0.0:
+  version "2.1.0"
+  resolved "https://nexus-inner.51trust.com/repository/npm/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175"
+  integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==
+
 p-try@^2.0.0:
   version "2.2.0"
   resolved "https://nexus-inner.51trust.com/repository/npm/p-try/-/p-try-2.2.0.tgz"
   integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
 
+package-manager-detector@^0.2.0:
+  version "0.2.11"
+  resolved "https://nexus-inner.51trust.com/repository/npm/package-manager-detector/-/package-manager-detector-0.2.11.tgz#3af0b34f99d86d24af0a0620603d2e1180d05c9c"
+  integrity sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==
+  dependencies:
+    quansync "^0.2.7"
+
 parent-module@^1.0.0:
   version "1.0.1"
   resolved "https://nexus-inner.51trust.com/repository/npm/parent-module/-/parent-module-1.0.1.tgz"
@@ -5559,7 +6028,7 @@ path-type@^4.0.0:
   resolved "https://nexus-inner.51trust.com/repository/npm/path-type/-/path-type-4.0.0.tgz"
   integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
 
-picocolors@^1.0.0, picocolors@^1.1.1:
+picocolors@^1.0.0, picocolors@^1.1.0, picocolors@^1.1.1:
   version "1.1.1"
   resolved "https://nexus-inner.51trust.com/repository/npm/picocolors/-/picocolors-1.1.1.tgz"
   integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
@@ -5569,6 +6038,11 @@ picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1:
   resolved "https://nexus-inner.51trust.com/repository/npm/picomatch/-/picomatch-2.3.1.tgz"
   integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
 
+pify@^4.0.1:
+  version "4.0.1"
+  resolved "https://nexus-inner.51trust.com/repository/npm/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
+  integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
+
 pinkie-promise@^2.0.0:
   version "2.0.1"
   resolved "https://nexus-inner.51trust.com/repository/npm/pinkie-promise/-/pinkie-promise-2.0.1.tgz"
@@ -5610,7 +6084,7 @@ prelude-ls@^1.2.1:
   resolved "https://nexus-inner.51trust.com/repository/npm/prelude-ls/-/prelude-ls-1.2.1.tgz"
   integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
 
-prettier@2.8.8:
+prettier@2.8.8, prettier@^2.7.1:
   version "2.8.8"
   resolved "https://nexus-inner.51trust.com/repository/npm/prettier/-/prettier-2.8.8.tgz"
   integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==
@@ -5675,6 +6149,21 @@ qs@6.13.0:
   dependencies:
     side-channel "^1.0.6"
 
+quansync@^0.2.7:
+  version "0.2.10"
+  resolved "https://nexus-inner.51trust.com/repository/npm/quansync/-/quansync-0.2.10.tgz#32053cf166fa36511aae95fc49796116f2dc20e1"
+  integrity sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==
+
+query-string@^7.1.3:
+  version "7.1.3"
+  resolved "https://nexus-inner.51trust.com/repository/npm/query-string/-/query-string-7.1.3.tgz#a1cf90e994abb113a325804a972d98276fe02328"
+  integrity sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==
+  dependencies:
+    decode-uri-component "^0.2.2"
+    filter-obj "^1.1.0"
+    split-on-first "^1.0.0"
+    strict-uri-encode "^2.0.0"
+
 queue-microtask@^1.2.2:
   version "1.2.3"
   resolved "https://nexus-inner.51trust.com/repository/npm/queue-microtask/-/queue-microtask-1.2.3.tgz"
@@ -5710,7 +6199,7 @@ react-devtools-core@^6.1.1:
     shell-quote "^1.6.1"
     ws "^7"
 
-react-is@^16.13.1:
+react-is@^16.13.1, react-is@^16.7.0:
   version "16.13.1"
   resolved "https://nexus-inner.51trust.com/repository/npm/react-is/-/react-is-16.13.1.tgz"
   integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
@@ -5730,11 +6219,44 @@ react-is@^19.1.0:
   resolved "https://nexus-inner.51trust.com/repository/npm/react-is/-/react-is-19.1.0.tgz"
   integrity sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==
 
+react-native-bundle-splitter@^3.0.1:
+  version "3.0.1"
+  resolved "https://nexus-inner.51trust.com/repository/npm/react-native-bundle-splitter/-/react-native-bundle-splitter-3.0.1.tgz#54792e6adbe6a156c986c7e7e8d4ca8c5753c115"
+  integrity sha512-YvG30oL+3uhPoYisRzMJLHjs5+X7NK8yLHqLKxLIvqZ9wGAvIJ+sJG09iQpLK+UCjEAEVP5he0F0vnzuokHyBw==
+
+react-native-copilot@^3.3.3:
+  version "3.3.3"
+  resolved "https://nexus-inner.51trust.com/repository/npm/react-native-copilot/-/react-native-copilot-3.3.3.tgz#05f8b2a33c177e39d9c61fa7f4ea7e1020d91e5d"
+  integrity sha512-/LX70DSqVhjOsbSGC3r3RYg+FtovUUudqWKby2agbXb0PsIWaEvjoH5SNQRkBCW8DHbDlZoPMv6oGKSJm3BPrQ==
+  dependencies:
+    "@changesets/changelog-github" "^0.5.0"
+    "@changesets/cli" "^2.27.1"
+    mitt "^3.0.1"
+
 react-native-device-info@^14.0.4:
   version "14.0.4"
   resolved "https://nexus-inner.51trust.com/repository/npm/react-native-device-info/-/react-native-device-info-14.0.4.tgz#56b24ace9ff29a66bdfc667209086421ed6cfdce"
   integrity sha512-NX0wMAknSDBeFnEnSFQ8kkAcQrFHrG4Cl0mVjoD+0++iaKrOupiGpBXqs8xR0SeJyPC5zpdPl4h/SaBGly6UxA==
 
+react-native-gesture-handler@^2.27.2:
+  version "2.27.2"
+  resolved "https://nexus-inner.51trust.com/repository/npm/react-native-gesture-handler/-/react-native-gesture-handler-2.27.2.tgz#d52e839e9cb225e75c9b6fce7438979ca6917512"
+  integrity sha512-+kNaY2m7uQu5+5ls8os6z92DTk9expsEAYsaPv30n08mrqX2r64G8iVGDwNWzZcId54+P7RlDnhyszTql0sQ0w==
+  dependencies:
+    "@egjs/hammerjs" "^2.0.17"
+    hoist-non-react-statics "^3.3.0"
+    invariant "^2.2.4"
+
+react-native-root-siblings@^5.0.1:
+  version "5.0.1"
+  resolved "https://nexus-inner.51trust.com/repository/npm/react-native-root-siblings/-/react-native-root-siblings-5.0.1.tgz#97e050e5155228f65810fb1c466ff8e769c5272c"
+  integrity sha512-Ay3k/fBj6ReUkWX5WNS+oEAcgPLEGOK8n7K/L7D85mf3xvd8rm/b4spsv26E4HlFzluVx5HKbxEt9cl0wQ1u3g==
+
+react-native-safe-area-context@^5.5.2:
+  version "5.5.2"
+  resolved "https://nexus-inner.51trust.com/repository/npm/react-native-safe-area-context/-/react-native-safe-area-context-5.5.2.tgz#a3c0e99385a45e31ef24d24358aa622cc9e1a069"
+  integrity sha512-t4YVbHa9uAGf+pHMabGrb0uHrD5ogAusSu842oikJ3YKXcYp6iB4PTGl0EZNkUIR3pCnw/CXKn42OCfhsS0JIw==
+
 react-native-storage@^1.0.1:
   version "1.0.1"
   resolved "https://nexus-inner.51trust.com/repository/npm/react-native-storage/-/react-native-storage-1.0.1.tgz"
@@ -5807,6 +6329,16 @@ react@19.1.0:
   resolved "https://nexus-inner.51trust.com/repository/npm/react/-/react-19.1.0.tgz"
   integrity sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==
 
+read-yaml-file@^1.1.0:
+  version "1.1.0"
+  resolved "https://nexus-inner.51trust.com/repository/npm/read-yaml-file/-/read-yaml-file-1.1.0.tgz#9362bbcbdc77007cc8ea4519fe1c0b821a7ce0d8"
+  integrity sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==
+  dependencies:
+    graceful-fs "^4.1.5"
+    js-yaml "^3.6.1"
+    pify "^4.0.1"
+    strip-bom "^3.0.0"
+
 readable-stream@^3.4.0:
   version "3.6.2"
   resolved "https://nexus-inner.51trust.com/repository/npm/readable-stream/-/readable-stream-3.6.2.tgz"
@@ -6188,6 +6720,18 @@ signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7:
   resolved "https://nexus-inner.51trust.com/repository/npm/signal-exit/-/signal-exit-3.0.7.tgz"
   integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
 
+signal-exit@^4.0.1:
+  version "4.1.0"
+  resolved "https://nexus-inner.51trust.com/repository/npm/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04"
+  integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==
+
+simple-swizzle@^0.2.2:
+  version "0.2.2"
+  resolved "https://nexus-inner.51trust.com/repository/npm/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"
+  integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==
+  dependencies:
+    is-arrayish "^0.3.1"
+
 sisteransi@^1.0.5:
   version "1.0.5"
   resolved "https://nexus-inner.51trust.com/repository/npm/sisteransi/-/sisteransi-1.0.5.tgz"
@@ -6233,6 +6777,19 @@ source-map@^0.6.0, source-map@^0.6.1:
   resolved "https://nexus-inner.51trust.com/repository/npm/source-map/-/source-map-0.6.1.tgz"
   integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
 
+spawndamnit@^3.0.1:
+  version "3.0.1"
+  resolved "https://nexus-inner.51trust.com/repository/npm/spawndamnit/-/spawndamnit-3.0.1.tgz#44410235d3dc4e21f8e4f740ae3266e4486c2aed"
+  integrity sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==
+  dependencies:
+    cross-spawn "^7.0.5"
+    signal-exit "^4.0.1"
+
+split-on-first@^1.0.0:
+  version "1.1.0"
+  resolved "https://nexus-inner.51trust.com/repository/npm/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f"
+  integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==
+
 sprintf-js@~1.0.2:
   version "1.0.3"
   resolved "https://nexus-inner.51trust.com/repository/npm/sprintf-js/-/sprintf-js-1.0.3.tgz"
@@ -6275,6 +6832,11 @@ stop-iteration-iterator@^1.1.0:
     es-errors "^1.3.0"
     internal-slot "^1.1.0"
 
+strict-uri-encode@^2.0.0:
+  version "2.0.0"
+  resolved "https://nexus-inner.51trust.com/repository/npm/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546"
+  integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==
+
 string-length@^4.0.1:
   version "4.0.2"
   resolved "https://nexus-inner.51trust.com/repository/npm/string-length/-/string-length-4.0.2.tgz"
@@ -6399,6 +6961,11 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1:
   dependencies:
     ansi-regex "^5.0.1"
 
+strip-bom@^3.0.0:
+  version "3.0.0"
+  resolved "https://nexus-inner.51trust.com/repository/npm/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+  integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==
+
 strip-bom@^4.0.0:
   version "4.0.0"
   resolved "https://nexus-inner.51trust.com/repository/npm/strip-bom/-/strip-bom-4.0.0.tgz"
@@ -6443,6 +7010,11 @@ supports-preserve-symlinks-flag@^1.0.0:
   resolved "https://nexus-inner.51trust.com/repository/npm/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz"
   integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
 
+term-size@^2.1.0:
+  version "2.2.1"
+  resolved "https://nexus-inner.51trust.com/repository/npm/term-size/-/term-size-2.2.1.tgz#2a6a54840432c2fb6320fea0f415531e90189f54"
+  integrity sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==
+
 terser@^5.15.0:
   version "5.43.1"
   resolved "https://nexus-inner.51trust.com/repository/npm/terser/-/terser-5.43.1.tgz"
@@ -6501,6 +7073,11 @@ toidentifier@1.0.1:
   resolved "https://nexus-inner.51trust.com/repository/npm/toidentifier/-/toidentifier-1.0.1.tgz"
   integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==
 
+tr46@~0.0.3:
+  version "0.0.3"
+  resolved "https://nexus-inner.51trust.com/repository/npm/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
+  integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
+
 ts-api-utils@^1.3.0:
   version "1.4.3"
   resolved "https://nexus-inner.51trust.com/repository/npm/ts-api-utils/-/ts-api-utils-1.4.3.tgz"
@@ -6666,6 +7243,16 @@ uri-js@^4.2.2:
   dependencies:
     punycode "^2.1.0"
 
+use-latest-callback@^0.2.4:
+  version "0.2.4"
+  resolved "https://nexus-inner.51trust.com/repository/npm/use-latest-callback/-/use-latest-callback-0.2.4.tgz#35c0f028f85a3f4cf025b06011110e87cc18f57e"
+  integrity sha512-LS2s2n1usUUnDq4oVh1ca6JFX9uSqUncTfAm44WMg0v6TxL7POUTk1B044NH8TeLkFbNajIsgDHcgNpNzZucdg==
+
+use-sync-external-store@^1.5.0:
+  version "1.5.0"
+  resolved "https://nexus-inner.51trust.com/repository/npm/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz#55122e2a3edd2a6c106174c27485e0fd59bcfca0"
+  integrity sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==
+
 util-deprecate@^1.0.1:
   version "1.0.2"
   resolved "https://nexus-inner.51trust.com/repository/npm/util-deprecate/-/util-deprecate-1.0.2.tgz"
@@ -6709,11 +7296,24 @@ wcwidth@^1.0.1:
   dependencies:
     defaults "^1.0.3"
 
+webidl-conversions@^3.0.0:
+  version "3.0.1"
+  resolved "https://nexus-inner.51trust.com/repository/npm/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
+  integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==
+
 whatwg-fetch@^3.0.0:
   version "3.6.20"
   resolved "https://nexus-inner.51trust.com/repository/npm/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz"
   integrity sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==
 
+whatwg-url@^5.0.0:
+  version "5.0.0"
+  resolved "https://nexus-inner.51trust.com/repository/npm/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d"
+  integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==
+  dependencies:
+    tr46 "~0.0.3"
+    webidl-conversions "^3.0.0"
+
 which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1:
   version "1.1.1"
   resolved "https://nexus-inner.51trust.com/repository/npm/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz"

Some files were not shown because too many files changed in this diff