Compare commits

...

2 Commits

Author SHA1 Message Date
539c425a89 说明文字 2025-12-19 00:05:42 +08:00
d72b18f713 Initial commit of React Native app 2025-12-18 13:27:24 +08:00
11 changed files with 688 additions and 151 deletions

View File

@ -55,7 +55,7 @@ export default function App() {
<Stack.Screen
name="Info"
component={InfoScreen}
options={{ title: "设备信息" }}
options={{ title: "设备详情" }}
/>
<Stack.Screen
name="Dfu"

View File

@ -42,3 +42,7 @@ hermesEnabled=true
# This allows your app to draw behind system bars for an immersive UI.
# Note: Only works with ReactActivity and should not be used with custom Activity.
edgeToEdgeEnabled=false

0
android/gradlew vendored Normal file → Executable file
View File

View File

@ -1,3 +1,4 @@
source 'https://cdn.cocoapods.org/'
# Resolve react_native_pods.rb with node to allow for hoisting
require Pod::Executable.execute_command('node', ['-p',
'require.resolve(

View File

@ -2703,6 +2703,6 @@ SPEC CHECKSUMS:
Yoga: a3ed390a19db0459bd6839823a6ac6d9c6db198d
ZIPFoundation: b8c29ea7ae353b309bc810586181fd073cb3312c
PODFILE CHECKSUM: acd3fbdda50772beaab05ce909d5ed701116dee5
PODFILE CHECKSUM: a23d7c8b0484328e91cacd79617607a52e3cf7fb
COCOAPODS: 1.16.2

View File

@ -260,7 +260,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = B7ZA544T59;
DEVELOPMENT_TEAM = P8MRPU7UBA;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = dfuapp/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = "POWERFUN设置";
@ -275,7 +275,7 @@
"-ObjC",
"-lc++",
);
PRODUCT_BUNDLE_IDENTIFIER = com.zhixingpai.powerfundfuapp;
PRODUCT_BUNDLE_IDENTIFIER = com.zhixingpai.powerfundfuapp123;
PRODUCT_NAME = dfuapp;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
@ -290,7 +290,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = B7ZA544T59;
DEVELOPMENT_TEAM = P8MRPU7UBA;
INFOPLIST_FILE = dfuapp/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = "POWERFUN设置";
IPHONEOS_DEPLOYMENT_TARGET = 15.1;
@ -304,7 +304,7 @@
"-ObjC",
"-lc++",
);
PRODUCT_BUNDLE_IDENTIFIER = com.zhixingpai.powerfundfuapp;
PRODUCT_BUNDLE_IDENTIFIER = com.zhixingpai.powerfundfuapp123;
PRODUCT_NAME = dfuapp;
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";

View File

@ -31,15 +31,10 @@
<key>NSAllowsLocalNetworking</key>
<true/>
</dict>
<!-- iOS 13+ 需要的蓝牙权限 -->
<key>NSBluetoothAlwaysUsageDescription</key>
<string>我们需要使用蓝牙连接您的功率计设备</string>
<!-- iOS 12 及以下版本需要的蓝牙权限(向后兼容) -->
<key>NSBluetoothPeripheralUsageDescription</key>
<string>我们需要使用蓝牙连接您的功率计设备</string>
<!-- 位置权限Android 和某些 iOS 蓝牙扫描需要) -->
<key>NSLocationWhenInUseUsageDescription</key>
<string>我们需要位置权限来扫描附近的蓝牙功率计设备</string>
<key>RCTNewArchEnabled</key>

1
package-lock.json generated
View File

@ -8,6 +8,7 @@
"name": "dfuapp",
"version": "0.0.1",
"dependencies": {
"@react-native/codegen": "0.81.4",
"@react-native/new-app-screen": "0.81.4",
"@react-navigation/native": "^7.1.17",
"@react-navigation/native-stack": "^7.3.26",

View File

@ -122,7 +122,7 @@ export default function DfuScreen({ route, navigation }: Props) {
return (
<View style={{ flex: 1, padding: 20 }}>
<View style={styles.row}>
<Text style={{ fontSize: 18 }}>: {name}</Text>
<Text style={{ fontSize: 16 }}>: {name}</Text>
</View>
<View style={styles.row}>
<Text style={{ fontSize: 16 }}>: {latestVersion}</Text>

View File

@ -49,6 +49,11 @@ export default function InfoScreen({ route, navigation }: Props) {
const { peripheral } = route.params;
const deviceKey = peripheral.address || peripheral.systemId;
const [power, setPower] = useState<number>(0);
const [cadence, setCadence] = useState<number>(0);
const [leftbalance, setLeftBalance] = useState<number>(0);
const [rightbalance, setRightBalance] = useState<number>(0);
const [isConnected, setIsConnected] = useState(false);
const [isLoading, setIsLoading] = useState(true);
const [serial, setSerial] = useState("读取中...");
@ -56,7 +61,7 @@ export default function InfoScreen({ route, navigation }: Props) {
const [hardware, setHardware] = useState("读取中...");
const [battery, setBattery] = useState("读取中...");
const [powerTrim, setPowerTrim] = useState("读取中");
const [inputTrim, setInputTrim] = useState("100");
const [inputTrim, setInputTrim] = useState("");
const [readSuccessToast, setReadSuccessToast] = useState(false); // ✅ 读取成功提示
const [powerTrimLoading, setPowerTrimLoading] = useState(false); // 正在写入功率微调
@ -69,6 +74,13 @@ export default function InfoScreen({ route, navigation }: Props) {
const prevConnectedRef = useRef(isConnected);
const isActiveRef = useRef(true);
//增加校准按钮相关状态
const [calibrating, setCalibrating] = useState<boolean>(false);
const [calibrationSuccess, setCalibrationSuccess] = useState<boolean>(false);
const [calibrationValue, setCalibrationValue] = useState<string>("");
const calibrationTimeoutRef = useRef<number | null>(null);
const isCalibratingRef = useRef<boolean>(false);
useFocusEffect(
React.useCallback(() => {
// 页面获得焦点
@ -84,7 +96,7 @@ export default function InfoScreen({ route, navigation }: Props) {
// ========== 监听连接状态变化,断开时提示重新连接 ==========
useEffect(() => {
if (prevConnectedRef.current && !isConnected && isActiveRef.current) {
Alert.alert("提示", "请重新连接设备", [
Alert.alert("提示", "设备已断开,请重新连接设备", [
{ text: "确定", onPress: () => navigation.goBack() },
]);
}
@ -121,7 +133,7 @@ export default function InfoScreen({ route, navigation }: Props) {
return unsubscribe;
}, [navigation, peripheral]);
// ========== BLE notify 订阅 ==========
// ========== BLE notify 订阅FFF3 ==========
useEffect(() => {
const connectionHandler = async (ev: {
peripheral: ScannedPeripheral;
@ -151,13 +163,17 @@ export default function InfoScreen({ route, navigation }: Props) {
try {
const raw = (notifyEv as any).value;
if (!raw) return;
const arr =
raw instanceof Uint8Array
? Array.from(raw)
: Array.from(new Uint8Array(raw));
if (arr[0] === 0x02 && arr.length >= 2) {
setPowerTrim(arr[1].toString());
setInputTrim(arr[1].toString());
const byteArray = raw instanceof Uint8Array
? raw
: new Uint8Array(raw);
if (byteArray[0] === 0x02 && byteArray.length >= 2) {
// 功率微调数据
setPowerTrim(byteArray[1].toString());
//setInputTrim(byteArray[1].toString());
}
else if (byteArray[0] === 0x05 && byteArray.length >= 3) {
// 校准响应数据 (05XXXX格式)
handleFFF3Response(byteArray);
}
} catch (err) {
console.warn("notify parse error", err);
@ -172,6 +188,8 @@ export default function InfoScreen({ route, navigation }: Props) {
}
};
Central.addListener("peripheralConnectionStatus", connectionHandler);
return () => {
Central.removeListener("peripheralConnectionStatus", connectionHandler);
@ -249,11 +267,182 @@ export default function InfoScreen({ route, navigation }: Props) {
})();
}, [peripheral]);
// ========== 订阅 1818 服务的 2A63 特性 (通知) ==========
useEffect(() => {
const subscribeToPowerData = async () => {
try {
// 确保设备已经连接
if (!isConnected) return;
console.log("✅ 订阅 2A63 特性通知...");
// 先取消之前的订阅(防止重复订阅)
await Central.unsubscribeCharacteristic(
peripheral,
fullUUID("1818"),
fullUUID("2a63")
).catch(() => {});
// 订阅 2A63 特性通知
await Central.subscribeCharacteristic(
peripheral,
fullUUID("1818"),
fullUUID("2a63"),
(notifyEv) => {
try {
const raw = notifyEv.value;
if (raw) {
// 将 ArrayBuffer 转换为字节数组
const byteArray = new Uint8Array(raw);
// 解析数据
parseData(byteArray);
}
} catch (err) {
console.warn("❌ 处理通知数据失败", err);
}
}
);
console.log("✅ 已订阅 2A63 特性通知");
} catch (err) {
console.warn("❌ 订阅 2A63 特性失败", err);
}
};
// 只在设备已连接时进行订阅
if (peripheral && isConnected) {
subscribeToPowerData();
}
// 清理订阅(当组件卸载或者连接状态变化时)
return () => {
if (peripheral && isConnected) {
Central.unsubscribeCharacteristic(peripheral, fullUUID("1818"), fullUUID("2a63")).catch(() => {});
}
};
}, [peripheral, isConnected]);
const cadenceStateRef = useRef({
lastCadenceCount: 0, // 上一次的踏频翻转次数,用于计算差值
lastCadenceTimestamp: 0, // 上一次的踏频时间戳(设备时间),用于计算差值
lastCadenceChangedTime: 0, // 最后一次踏频变化的时间(本地时间),用于检测超时
});
const parseData = (byteArray: Uint8Array) => {
// 当前时间(用于超时检测)
const currentTime = Date.now();
// ========== 1. 解析功率 ==========
// 字节2-3功率值小端序
const powerValue = (byteArray[3] << 8) | byteArray[2];
setPower(powerValue);
// ========== 3. 解析踏频 ==========
// 字节5-6踏频翻转次数小端序
const cadenceCount = (byteArray[6] << 8) | byteArray[5];
// 字节7-8踏频时间戳小端序
const timestamp = (byteArray[8] << 8) | byteArray[7];
// 获取上一次的状态
const lastState = cadenceStateRef.current;
// 检测踏频翻转次数是否有变化
const hasCadenceChanged = cadenceCount !== lastState.lastCadenceCount;
if (hasCadenceChanged) {
// 踏频有变化,更新变化时间戳
cadenceStateRef.current.lastCadenceChangedTime = currentTime;
}
// 检查是否超时3秒无变化
if (lastState.lastCadenceChangedTime > 0 &&
currentTime - lastState.lastCadenceChangedTime > 3000) {
//setPower("0 W");
setCadence(0);
setLeftBalance(0);
setRightBalance(0);
cadenceStateRef.current = {
lastCadenceCount: 0,
lastCadenceTimestamp: 0,
lastCadenceChangedTime: 0,
};
return; // 超时后直接返回,不再计算踏频
}
// 如果是第一次收到踏频数据,只记录不计算
if (lastState.lastCadenceTimestamp === 0) {
cadenceStateRef.current = {
lastCadenceCount: cadenceCount,
lastCadenceTimestamp: timestamp,
lastCadenceChangedTime: hasCadenceChanged ? currentTime : 0,
};
setCadence(0);
return;
}
// 计算踏频RPM只在踏频有变化时计算
if (hasCadenceChanged) {
// 计算翻转次数差处理16位计数器翻转
let revDiff = cadenceCount - lastState.lastCadenceCount;
if (revDiff < 0) {
revDiff += 65536; // 16位计数器最大值65535
}
// 计算时间差处理16位计数器翻转
let timeDiff = timestamp - lastState.lastCadenceTimestamp;
if (timeDiff < 0) {
timeDiff += 65536; // 16位计数器最大值65535
}
// 计算踏频
if (timeDiff > 0 && revDiff > 0) {
// 假设时间单位是1/1024秒蓝牙设备常用
const timeInSeconds = timeDiff / 1024.0;
// RPM = (圈数 / 时间(秒)) * 60
const cadenceRPM = (revDiff / timeInSeconds) * 60;
// 限制合理范围
if (cadenceRPM > 10 && cadenceRPM < 250) {
setCadence(Math.round(cadenceRPM));
} else {
setCadence(0);
}
} else {
// 如果没有翻转踏频为0
setCadence(0);
}
// ========== 解析左平衡 ==========
// 字节4左平衡值单位0.5%
const leftBalanceValue = byteArray[4];
const leftBalancePercent = Math.round(leftBalanceValue * 0.5 * 10) / 10;
setLeftBalance(leftBalancePercent);
// 计算右平衡100% - 左平衡百分比
const rightBalancePercent = Math.round((100 - leftBalancePercent) * 10) / 10;
setRightBalance(rightBalancePercent);
// 更新踏频计算状态
cadenceStateRef.current = {
...cadenceStateRef.current,
lastCadenceCount: cadenceCount,
lastCadenceTimestamp: timestamp,
};
}
};
// ========== 写入功率微调 ==========
const updatePowerTrim = async () => {
const val = parseInt(inputTrim);
if (isNaN(val) || val < 50 || val > 200) {
Alert.alert("提示", "请输入有效数字50~200");
Alert.alert("提示", "功率微调可调整功率计的高低偏差默认值100%。可调整的范围是50%-200%。请输入50至200的纯数字不需要包含%符号。输入后点击下方按钮更新进功率计设备。");
return;
}
if (val === Number(powerTrim)) {
@ -295,40 +484,215 @@ export default function InfoScreen({ route, navigation }: Props) {
}
};
// ========== 校准按钮逻辑 ==========
const handleCalibration = async () => {
if (!isConnected) {
Alert.alert("提示", "设备未连接");
return;
}
if (calibrating) {
return; // 正在校准中,不重复点击
}
try {
setCalibrating(true);
isCalibratingRef.current = true;
setCalibrationSuccess(false);
setCalibrationValue("");
console.log("🔧 开始校准向FFF2写入05");
// 向FFF2写入05
await Central.writeCharacteristic(
peripheral,
fullUUID("FFF1"), // 服务UUID
fullUUID("FFF2"), // 写入特征UUID
new Uint8Array([0x05]).buffer,
{ withoutResponse: false }
);
console.log("✅ 已发送校准命令,等待响应...");
// 设置5秒超时
calibrationTimeoutRef.current = setTimeout(() => {
if (isCalibratingRef.current) {
console.log("❌ 校准超时,未收到响应");
Alert.alert("校准错误", "设备未响应,请重试");
setCalibrating(false);
isCalibratingRef.current = false;
}
}, 5000);
} catch (err) {
console.warn("❌ 发送校准命令失败", err);
Alert.alert("错误", "发送校准命令失败");
setCalibrating(false);
isCalibratingRef.current = false;
if (calibrationTimeoutRef.current) {
clearTimeout(calibrationTimeoutRef.current);
}
}
};
const handleFFF3Response = (byteArray: Uint8Array) => {
// 如果不是正在校准中,不处理
if (!isCalibratingRef.current) return;
// 清除超时定时器
if (calibrationTimeoutRef.current) {
clearTimeout(calibrationTimeoutRef.current);
calibrationTimeoutRef.current = null;
}
// 检查响应数据格式05XXXX (05开头后面至少2个字节)
// 假设响应是05 + 2字节的小端序数值
if (byteArray[0] === 0x05 && byteArray.length >= 3) {
// 解析XXXX小端序低位在前高位在后
// byteArray[1] 是低位字节byteArray[2] 是高位字节
const value = Math.round (((byteArray[2] << 8) | byteArray[1])/10 ) ; //除以10发送出来 不然数据容易乱跳 和码表端处理保持一致
console.log(`✅ 收到校准响应,值: ${value}`);
// 更新状态
setCalibrationValue(value.toString());
setCalibrationSuccess(true);
// 显示成功弹框
Alert.alert(
"校准成功",
`校准值: ${value}`,
[
{
text: "确定",
onPress: () => {
setCalibrating(false);
isCalibratingRef.current = false;
setCalibrationSuccess(false);
}
}
]
);
} else {
console.warn("❌ 校准响应格式错误", byteArray);
Alert.alert("校准错误", "设备返回数据格式错误");
setCalibrating(false);
isCalibratingRef.current = false;
}
};
useEffect(() => {
return () => {
// 清理校准超时定时器
if (calibrationTimeoutRef.current) {
clearTimeout(calibrationTimeoutRef.current);
calibrationTimeoutRef.current = null;
}
};
}, []);
// ========== UI ==========
return (
<ScrollView contentContainerStyle={{ padding: 20, gap: 8 }}>
<View style={styles.row}>
<Text>: {peripheral.name}</Text>
</View>
<View style={styles.row}>
<Text>ID号: {serial}</Text>
</View>
<View style={styles.row}>
<Text>: {firmware}</Text>
</View>
<View style={styles.row}>
<Text>: {battery}</Text>
</View>
<View style={styles.row}>
<Text>: {isConnected ? "已连接" : "未连接"}</Text>
</View>
<View style={{ marginTop: 20 }}>
<Text>: {powerTrim}%</Text>
{/* ====== 实时数据三卡片 ====== */}
<View style={styles.realtimeContainer}>
{/* 功率 */}
<View style={styles.realtimeCard}>
<Icon name="flash" size={22} color="#E7141E" />
<Text style={styles.realtimeLabel}>/W</Text>
<Text style={styles.realtimeValue}>{power}</Text>
</View>
{/* 踏频 */}
<View style={styles.realtimeCard}>
<Icon name="sync" size={22} color="#E7141E" />
<Text style={styles.realtimeLabel}>/RPM</Text>
<Text style={styles.realtimeValue}>{cadence}</Text>
</View>
{/* 左右平衡 */}
<View style={styles.realtimeCard}>
<Text style={styles.balanceHeader}>L / R</Text>
<Text style={styles.realtimeLabel}>/%</Text>
<Text style={styles.realtimeValue}>
{leftbalance}/{rightbalance}
</Text>
</View>
</View>
{/* ========== 功率微调卡片部分 ========== */}
<View style={styles.cardContainer}>
<View style={styles.cardTitle}>
<Text style={[styles.cardTitleText, { textAlign: 'center' }]}></Text>
</View>
<View style={{
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
marginBottom: 0,
paddingHorizontal: 10
}}>
<Text style={{ marginTop: 10,flex: 1, marginRight: 10 }}>: {powerTrim}%</Text>
<TextInput
style={styles.input}
style={[styles.input, { flex: 1 , marginTop: 10 }]}
value={inputTrim}
onChangeText={setInputTrim}
keyboardType="numeric"
onEndEditing={updatePowerTrim}
placeholder="输入50-200"
/>
<Pressable onPress={updatePowerTrim} style={styles.pressable} disabled={isLoading || powerTrimLoading}>
<Text style={{ color: "white" }}></Text>
</View>
<Pressable
onPress={updatePowerTrim}
style={styles.pressable}
disabled={isLoading || powerTrimLoading}
>
<Text style={{ color: "white" }}></Text>
</Pressable>
</View>
<View style={{ marginTop: 30 }}>
{/* ========== 新增校准按钮 ========== */}
<View style={{ marginTop: 0 }}>
<Pressable
onPress={handleCalibration}
style={[styles.pressable, calibrating && styles.disabledButton]}
disabled={calibrating || !isConnected}
>
<Text style={{ color: "white" }}>
{calibrating ? "校准中...等待设备反应" : "校准归零"}
</Text>
</Pressable>
</View>
<View style={{ marginTop: 0 }}>
<Pressable
onPress={() => {
if (!isConnected) {
@ -343,7 +707,6 @@ export default function InfoScreen({ route, navigation }: Props) {
]);
return;
}
// 蓝牙已连接,正常跳转 DFU
navigation.navigate("Dfu", {
deviceId: deviceKey,
@ -354,13 +717,15 @@ export default function InfoScreen({ route, navigation }: Props) {
style={styles.pressable}
disabled={isLoading || powerTrimLoading} // ❌ 禁用点击
>
<Text style={{ color: "white" }}></Text>
<Text style={{ color: "white" }}></Text>
</Pressable>
</View>
{isLoading && (
<View style={{ marginVertical: 60, alignItems: "center" }}>
<ActivityIndicator size={80} color="#E7141E" />
<ActivityIndicator size={30} color="#E7141E" />
<Text style={{ marginTop: 10, fontSize: 16 }}>...</Text>
</View>
)}
@ -368,7 +733,7 @@ export default function InfoScreen({ route, navigation }: Props) {
{/* ✅ 读取成功提示,固定在页面底部 */}
{readSuccessToast && (
<View style={{ marginVertical: 60, alignItems: "center" }}>
<Icon name="check-circle" size={60} color="#E7141E" />
<Icon name="check-circle" size={30} color="#E7141E" />
<Text style={{ marginTop: 10, fontSize: 16 }}></Text>
</View>
)}
@ -376,7 +741,7 @@ export default function InfoScreen({ route, navigation }: Props) {
{/* 正在写入功率微调 */}
{powerTrimLoading && (
<View style={{ marginVertical: 60, alignItems: "center" }}>
<ActivityIndicator size={60} color="#E7141E" />
<ActivityIndicator size={30} color="#E7141E" />
<Text style={{ marginTop: 10, fontSize: 16 }}>...</Text>
</View>
)}
@ -384,7 +749,7 @@ export default function InfoScreen({ route, navigation }: Props) {
{/* 功率微调写入成功 */}
{powerTrimSuccessToast && (
<View style={{ marginVertical: 60, alignItems: "center" }}>
<Icon name="check-circle" size={60} color="#E7141E" />
<Icon name="check-circle" size={30} color="#E7141E" />
<Text style={{ marginTop: 10, fontSize: 16 }}></Text>
</View>
)}
@ -397,7 +762,7 @@ const styles = StyleSheet.create({
row: {
borderBottomWidth: 1,
borderBottomColor: "#E7141E",
paddingBottom: 4, // 横线和文字保持一定间距
paddingBottom: 3, // 横线和文字保持一定间距
marginBottom: 8, // 行间距
},
input: {
@ -414,4 +779,79 @@ const styles = StyleSheet.create({
borderRadius: 6,
alignItems: "center",
},
disabledButton: {
backgroundColor: "#999", // 禁用时的颜色
opacity: 0.6,
},
cardContainer: {
borderWidth: 1,
borderColor: "#ddd",
borderRadius: 10,
marginTop: 10,
backgroundColor: "#fff",
overflow: 'hidden', // 确保圆角效果完整
shadowColor: "#000",
shadowOffset: { width: 0, height: 1 },
shadowOpacity: 0.1,
shadowRadius: 2,
elevation: 2, // Android阴影
},
cardTitle: {
backgroundColor: "#f5f5f5",
paddingVertical: 8,
paddingHorizontal: 15,
borderBottomWidth: 1,
borderBottomColor: "#eee",
},
cardTitleText: {
fontWeight: 'bold',
color: "#333",
},
realtimeContainer: {
flexDirection: "row",
justifyContent: "space-between",
marginVertical: 10,
},
realtimeCard: {
flex: 1,
marginHorizontal: 4,
paddingVertical: 12,
borderRadius: 10,
backgroundColor: "#fff",
alignItems: "center",
borderWidth: 1,
borderColor: "#E7141E",
shadowColor: "#000",
shadowOffset: { width: 0, height: 1 },
shadowOpacity: 0.1,
shadowRadius: 2,
elevation: 2,
},
realtimeLabel: {
marginTop: 6,
fontSize: 14,
color: "#666",
},
realtimeValue: {
marginTop: 4,
fontSize: 20,
fontWeight: "bold",
color: "#000",
},
balanceHeader: {
fontSize: 16,
fontWeight: "bold",
color: "#E7141E",
},
});

294
yarn.lock
View File

@ -16,7 +16,7 @@
resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz"
integrity sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==
"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9", "@babel/core@^7.25.2":
"@babel/core@^7.0.0", "@babel/core@^7.0.0 || ^8.0.0-0", "@babel/core@^7.0.0-0", "@babel/core@^7.0.0-0 || ^8.0.0-0 <8.0.0", "@babel/core@^7.11.0", "@babel/core@^7.11.6", "@babel/core@^7.12.0", "@babel/core@^7.12.3", "@babel/core@^7.13.0", "@babel/core@^7.23.9", "@babel/core@^7.25.2", "@babel/core@^7.4.0 || ^8.0.0-0 <8.0.0", "@babel/core@^7.8.0":
version "7.28.4"
resolved "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz"
integrity sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==
@ -37,7 +37,7 @@
json5 "^2.2.3"
semver "^6.3.1"
"@babel/eslint-parser@^7.25.1":
"@babel/eslint-parser@^7.12.0", "@babel/eslint-parser@^7.25.1":
version "7.28.4"
resolved "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.28.4.tgz"
integrity sha512-Aa+yDiH87980jR6zvRfFuCR1+dLb00vBydhTL+zI992Rz/wQhSvuxjmOOuJOgO3XmakO6RykRGD2S1mq1AtgHA==
@ -980,7 +980,20 @@
"@babel/parser" "^7.27.2"
"@babel/types" "^7.27.1"
"@babel/traverse--for-generate-function-map@npm:@babel/traverse@^7.25.3", "@babel/traverse@^7.25.3", "@babel/traverse@^7.27.1", "@babel/traverse@^7.28.0", "@babel/traverse@^7.28.3", "@babel/traverse@^7.28.4":
"@babel/traverse--for-generate-function-map@npm:@babel/traverse@^7.25.3":
version "7.28.4"
resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz"
integrity sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==
dependencies:
"@babel/code-frame" "^7.27.1"
"@babel/generator" "^7.28.3"
"@babel/helper-globals" "^7.28.0"
"@babel/parser" "^7.28.4"
"@babel/template" "^7.27.2"
"@babel/types" "^7.28.4"
debug "^4.3.1"
"@babel/traverse@^7.25.3", "@babel/traverse@^7.27.1", "@babel/traverse@^7.28.0", "@babel/traverse@^7.28.3", "@babel/traverse@^7.28.4":
version "7.28.4"
resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz"
integrity sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==
@ -1346,7 +1359,7 @@
"@nodelib/fs.stat" "2.0.5"
run-parallel "^1.1.9"
"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5":
version "2.0.5"
resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
@ -1490,7 +1503,7 @@
dependencies:
joi "^17.2.1"
"@react-native-community/cli@20.0.0":
"@react-native-community/cli@*", "@react-native-community/cli@20.0.0":
version "20.0.0"
resolved "https://registry.npmjs.org/@react-native-community/cli/-/cli-20.0.0.tgz"
integrity sha512-/cMnGl5V1rqnbElY1Fvga1vfw0d3bnqiJLx2+2oh7l9ulnXfVRWb5tU2kgBqiMxuDOKA+DQoifC9q/tvkj5K2w==
@ -1666,7 +1679,7 @@
hermes-parser "0.29.1"
nullthrows "^1.1.1"
"@react-native/metro-config@0.81.4":
"@react-native/metro-config@*", "@react-native/metro-config@0.81.4":
version "0.81.4"
resolved "https://registry.npmjs.org/@react-native/metro-config/-/metro-config-0.81.4.tgz"
integrity sha512-aEXhRMsz6yN5X63Zk+cdKByQ0j3dsKv+ETRP9lLARdZ82fBOCMuK6IfmZMwK3A/3bI7gSvt2MFPn3QHy3WnByw==
@ -1923,7 +1936,7 @@
dependencies:
"@types/yargs-parser" "*"
"@typescript-eslint/eslint-plugin@^7.1.1":
"@typescript-eslint/eslint-plugin@^5.0.0 || ^6.0.0 || ^7.0.0", "@typescript-eslint/eslint-plugin@^7.1.1":
version "7.18.0"
resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz"
integrity sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==
@ -1938,7 +1951,7 @@
natural-compare "^1.4.0"
ts-api-utils "^1.3.0"
"@typescript-eslint/parser@^7.1.1":
"@typescript-eslint/parser@^7.0.0", "@typescript-eslint/parser@^7.1.1":
version "7.18.0"
resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz"
integrity sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==
@ -2012,16 +2025,6 @@
semver "^7.6.0"
ts-api-utils "^1.3.0"
"@typescript-eslint/utils@7.18.0":
version "7.18.0"
resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz"
integrity sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==
dependencies:
"@eslint-community/eslint-utils" "^4.4.0"
"@typescript-eslint/scope-manager" "7.18.0"
"@typescript-eslint/types" "7.18.0"
"@typescript-eslint/typescript-estree" "7.18.0"
"@typescript-eslint/utils@^5.10.0":
version "5.62.0"
resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz"
@ -2036,6 +2039,16 @@
eslint-scope "^5.1.1"
semver "^7.3.7"
"@typescript-eslint/utils@7.18.0":
version "7.18.0"
resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz"
integrity sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==
dependencies:
"@eslint-community/eslint-utils" "^4.4.0"
"@typescript-eslint/scope-manager" "7.18.0"
"@typescript-eslint/types" "7.18.0"
"@typescript-eslint/typescript-estree" "7.18.0"
"@typescript-eslint/visitor-keys@5.62.0":
version "5.62.0"
resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz"
@ -2082,7 +2095,7 @@ acorn-jsx@^5.3.2:
resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz"
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
acorn@^8.15.0, acorn@^8.9.0:
"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.15.0, acorn@^8.9.0:
version "8.15.0"
resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz"
integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==
@ -2462,7 +2475,7 @@ braces@^3.0.3:
dependencies:
fill-range "^7.1.1"
browserslist@^4.24.0, browserslist@^4.25.3:
browserslist@^4.24.0, browserslist@^4.25.3, "browserslist@>= 4.21.0":
version "4.26.2"
resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.26.2.tgz"
integrity sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==
@ -2662,16 +2675,16 @@ color-convert@^2.0.1:
dependencies:
color-name "~1.1.4"
color-name@1.1.3:
version "1.1.3"
resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
color-name@^1.0.0, color-name@~1.1.4:
version "1.1.4"
resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
color-name@1.1.3:
version "1.1.3"
resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
color-string@^1.9.0:
version "1.9.1"
resolved "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz"
@ -2834,20 +2847,27 @@ dayjs@^1.8.15:
resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.18.tgz"
integrity sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==
debug@2.6.9, debug@^2.6.9:
debug@^2.6.9:
version "2.6.9"
resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
dependencies:
ms "2.0.0"
debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.4.0, debug@^4.4.1:
debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.4.0, debug@^4.4.1, debug@4:
version "4.4.3"
resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz"
integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==
dependencies:
ms "^2.1.3"
debug@2.6.9:
version "2.6.9"
resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
dependencies:
ms "2.0.0"
decamelize@^1.2.0:
version "1.2.0"
resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz"
@ -3229,7 +3249,7 @@ eslint-plugin-react@^7.30.1:
string.prototype.matchall "^4.0.12"
string.prototype.repeat "^1.0.0"
eslint-scope@5.1.1, eslint-scope@^5.1.1:
eslint-scope@^5.1.1, eslint-scope@5.1.1:
version "5.1.1"
resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz"
integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
@ -3250,12 +3270,22 @@ eslint-visitor-keys@^2.1.0:
resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz"
integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==
eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3:
eslint-visitor-keys@^3.3.0:
version "3.4.3"
resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz"
integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
eslint@^8.19.0:
eslint-visitor-keys@^3.4.1:
version "3.4.3"
resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz"
integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
eslint-visitor-keys@^3.4.3:
version "3.4.3"
resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz"
integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
"eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0", "eslint@^3.17.0 || ^4 || ^5 || ^6 || ^7 || ^8", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.0.0 || ^8.0.0", "eslint@^7.5.0 || ^8.0.0 || ^9.0.0", eslint@^8.1.0, eslint@^8.19.0, eslint@^8.56.0, eslint@>=4.19.1, eslint@>=7.0.0, eslint@>=8:
version "8.57.1"
resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz"
integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==
@ -3472,7 +3502,15 @@ finalhandler@1.1.2:
statuses "~1.5.0"
unpipe "~1.0.0"
find-up@^4.0.0, find-up@^4.1.0:
find-up@^4.0.0:
version "4.1.0"
resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz"
integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
dependencies:
locate-path "^5.0.0"
path-exists "^4.0.0"
find-up@^4.1.0:
version "4.1.0"
resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz"
integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
@ -3830,7 +3868,7 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3:
inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@2, inherits@2.0.4:
version "2.0.4"
resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@ -4088,7 +4126,14 @@ is-wsl@^1.1.0:
resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz"
integrity sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==
is-wsl@^2.1.1, is-wsl@^2.2.0:
is-wsl@^2.1.1:
version "2.2.0"
resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz"
integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
dependencies:
is-docker "^2.0.0"
is-wsl@^2.2.0:
version "2.2.0"
resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz"
integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
@ -4374,7 +4419,7 @@ jest-resolve-dependencies@^29.7.0:
jest-regex-util "^29.6.3"
jest-snapshot "^29.7.0"
jest-resolve@^29.7.0:
jest-resolve@*, jest-resolve@^29.7.0:
version "29.7.0"
resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz"
integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==
@ -4518,7 +4563,7 @@ jest-worker@^29.7.0:
merge-stream "^2.0.0"
supports-color "^8.0.0"
jest@^29.6.3:
jest@*, jest@^29.6.3:
version "29.7.0"
resolved "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz"
integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==
@ -4798,7 +4843,7 @@ metro-cache@0.83.2:
https-proxy-agent "^7.0.5"
metro-core "0.83.2"
metro-config@0.83.2, metro-config@^0.83.1:
metro-config@^0.83.1, metro-config@0.83.2:
version "0.83.2"
resolved "https://registry.npmjs.org/metro-config/-/metro-config-0.83.2.tgz"
integrity sha512-1FjCcdBe3e3D08gSSiU9u3Vtxd7alGH3x/DNFqWDFf5NouX4kLgbVloDDClr1UrLz62c0fHh2Vfr9ecmrOZp+g==
@ -4812,7 +4857,7 @@ metro-config@0.83.2, metro-config@^0.83.1:
metro-runtime "0.83.2"
yaml "^2.6.1"
metro-core@0.83.2, metro-core@^0.83.1:
metro-core@^0.83.1, metro-core@0.83.2:
version "0.83.2"
resolved "https://registry.npmjs.org/metro-core/-/metro-core-0.83.2.tgz"
integrity sha512-8DRb0O82Br0IW77cNgKMLYWUkx48lWxUkvNUxVISyMkcNwE/9ywf1MYQUE88HaKwSrqne6kFgCSA/UWZoUT0Iw==
@ -4851,7 +4896,7 @@ metro-resolver@0.83.2:
dependencies:
flow-enums-runtime "^0.0.6"
metro-runtime@0.83.2, metro-runtime@^0.83.1:
metro-runtime@^0.83.1, metro-runtime@0.83.2:
version "0.83.2"
resolved "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.83.2.tgz"
integrity sha512-nnsPtgRvFbNKwemqs0FuyFDzXLl+ezuFsUXDbX8o0SXOfsOPijqiQrf3kuafO1Zx1aUWf4NOrKJMAQP5EEHg9A==
@ -4859,7 +4904,7 @@ metro-runtime@0.83.2, metro-runtime@^0.83.1:
"@babel/runtime" "^7.25.0"
flow-enums-runtime "^0.0.6"
metro-source-map@0.83.2, metro-source-map@^0.83.1:
metro-source-map@^0.83.1, metro-source-map@0.83.2:
version "0.83.2"
resolved "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.83.2.tgz"
integrity sha512-5FL/6BSQvshIKjXOennt9upFngq2lFvDakZn5LfauIVq8+L4sxXewIlSTcxAtzbtjAIaXeOSVMtCJ5DdfCt9AA==
@ -4918,7 +4963,7 @@ metro-transform-worker@0.83.2:
metro-transform-plugins "0.83.2"
nullthrows "^1.1.1"
metro@0.83.2, metro@^0.83.1:
metro@^0.83.1, metro@0.83.2:
version "0.83.2"
resolved "https://registry.npmjs.org/metro/-/metro-0.83.2.tgz"
integrity sha512-HQgs9H1FyVbRptNSMy/ImchTTE5vS2MSqLoOo7hbDoBq6hPPZokwJvBMwrYSxdjQZmLXz2JFZtdvS+ZfgTc9yw==
@ -4972,16 +5017,16 @@ micromatch@^4.0.4, micromatch@^4.0.8:
braces "^3.0.3"
picomatch "^2.3.1"
mime-db@1.52.0:
version "1.52.0"
resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz"
integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
"mime-db@>= 1.43.0 < 2":
version "1.54.0"
resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz"
integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==
mime-db@1.52.0:
version "1.52.0"
resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz"
integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
mime-types@^2.1.27, mime-types@~2.1.24, mime-types@~2.1.34:
version "2.1.35"
resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz"
@ -4989,22 +5034,43 @@ mime-types@^2.1.27, mime-types@~2.1.24, mime-types@~2.1.34:
dependencies:
mime-db "1.52.0"
mime@1.6.0:
version "1.6.0"
resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz"
integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
mime@^2.4.1:
version "2.6.0"
resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz"
integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==
mime@1.6.0:
version "1.6.0"
resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz"
integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
mimic-fn@^2.1.0:
version "2.1.0"
resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz"
integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
minimatch@^3.0.4:
version "3.1.2"
resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz"
integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
dependencies:
brace-expansion "^1.1.7"
minimatch@^3.0.5:
version "3.1.2"
resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz"
integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
dependencies:
brace-expansion "^1.1.7"
minimatch@^3.1.1:
version "3.1.2"
resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz"
integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
dependencies:
brace-expansion "^1.1.7"
minimatch@^3.1.2:
version "3.1.2"
resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz"
integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
@ -5023,16 +5089,16 @@ mkdirp@^1.0.4:
resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz"
integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
ms@^2.1.3, ms@2.1.3:
version "2.1.3"
resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
ms@2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz"
integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
ms@2.1.3, ms@^2.1.3:
version "2.1.3"
resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
nanoid@^3.3.11:
version "3.3.11"
resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz"
@ -5043,16 +5109,16 @@ natural-compare@^1.4.0:
resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz"
integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
negotiator@0.6.3:
version "0.6.3"
resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz"
integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
negotiator@~0.6.4:
version "0.6.4"
resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz"
integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==
negotiator@0.6.3:
version "0.6.3"
resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz"
integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
nocache@^3.0.1:
version "3.0.4"
resolved "https://registry.npmjs.org/nocache/-/nocache-3.0.4.tgz"
@ -5154,13 +5220,6 @@ object.values@^1.1.6, object.values@^1.2.1:
define-properties "^1.2.1"
es-object-atoms "^1.0.0"
on-finished@2.4.1:
version "2.4.1"
resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz"
integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==
dependencies:
ee-first "1.1.1"
on-finished@~2.3.0:
version "2.3.0"
resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz"
@ -5168,6 +5227,13 @@ on-finished@~2.3.0:
dependencies:
ee-first "1.1.1"
on-finished@2.4.1:
version "2.4.1"
resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz"
integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==
dependencies:
ee-first "1.1.1"
on-headers@~1.1.0:
version "1.1.0"
resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz"
@ -5350,7 +5416,7 @@ prelude-ls@^1.2.1:
resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz"
integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
prettier@2.8.8:
prettier@>=2, prettier@2.8.8:
version "2.8.8"
resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz"
integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==
@ -5483,12 +5549,12 @@ react-native-is-edge-to-edge@^1.2.1:
resolved "https://registry.npmjs.org/react-native-is-edge-to-edge/-/react-native-is-edge-to-edge-1.2.1.tgz"
integrity sha512-FLbPWl/MyYQWz+KwqOZsSyj2JmLKglHatd3xLZWskXOpRaio4LfEDEz8E/A6uD8QoTHW6Aobw1jbEwK7KMgR7Q==
react-native-safe-area-context@^5.6.1:
react-native-safe-area-context@^5.6.1, "react-native-safe-area-context@>= 4.0.0":
version "5.6.1"
resolved "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-5.6.1.tgz"
integrity sha512-/wJE58HLEAkATzhhX1xSr+fostLsK8Q97EfpfMDKo8jlOc1QKESSX/FQrhk7HhQH/2uSaox4Y86sNaI02kteiA==
react-native-screens@^4.16.0:
react-native-screens@^4.16.0, "react-native-screens@>= 4.0.0":
version "4.16.0"
resolved "https://registry.npmjs.org/react-native-screens/-/react-native-screens-4.16.0.tgz"
integrity sha512-yIAyh7F/9uWkOzCi1/2FqvNvK6Wb9Y1+Kzn16SuGfN9YFJDTbwlzGRvePCNTOX0recpLQF3kc2FmvMUhyTCH1Q==
@ -5505,7 +5571,7 @@ react-native-vector-icons@^10.3.0:
prop-types "^15.7.2"
yargs "^16.1.1"
react-native@0.81.4:
react-native@*, react-native@0.81.4:
version "0.81.4"
resolved "https://registry.npmjs.org/react-native/-/react-native-0.81.4.tgz"
integrity sha512-bt5bz3A/+Cv46KcjV0VQa+fo7MKxs17RCcpzjftINlen4ZDUl0I6Ut+brQ2FToa5oD0IB0xvQHfmsg2EDqsZdQ==
@ -5558,7 +5624,7 @@ react-test-renderer@19.1.0:
react-is "^19.1.0"
scheduler "^0.26.0"
react@19.1.0:
react@*, "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", react@^19.1.0, "react@>= 18.2.0", react@>=16.8, react@>=17.0.0, react@19.1.0:
version "19.1.0"
resolved "https://registry.npmjs.org/react/-/react-19.1.0.tgz"
integrity sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==
@ -5732,7 +5798,7 @@ safe-array-concat@^1.1.3:
has-symbols "^1.1.0"
isarray "^2.0.5"
safe-buffer@5.2.1, safe-buffer@~5.2.0:
safe-buffer@~5.2.0, safe-buffer@5.2.1:
version "5.2.1"
resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
@ -5759,7 +5825,7 @@ safe-regex-test@^1.1.0:
resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
scheduler@0.26.0, scheduler@^0.26.0:
scheduler@^0.26.0, scheduler@0.26.0:
version "0.26.0"
resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz"
integrity sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==
@ -5769,7 +5835,32 @@ semver@^6.3.0, semver@^6.3.1:
resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz"
integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
semver@^7.1.3, semver@^7.3.7, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0:
semver@^7.1.3:
version "7.7.2"
resolved "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz"
integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==
semver@^7.3.7:
version "7.7.2"
resolved "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz"
integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==
semver@^7.5.2:
version "7.7.2"
resolved "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz"
integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==
semver@^7.5.3:
version "7.7.2"
resolved "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz"
integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==
semver@^7.5.4:
version "7.7.2"
resolved "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz"
integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==
semver@^7.6.0:
version "7.7.2"
resolved "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz"
integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==
@ -5937,14 +6028,6 @@ slice-ansi@^2.0.0:
astral-regex "^1.0.0"
is-fullwidth-code-point "^2.0.0"
source-map-support@0.5.13:
version "0.5.13"
resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz"
integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==
dependencies:
buffer-from "^1.0.0"
source-map "^0.6.0"
source-map-support@~0.5.20:
version "0.5.21"
resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz"
@ -5953,6 +6036,14 @@ source-map-support@~0.5.20:
buffer-from "^1.0.0"
source-map "^0.6.0"
source-map-support@0.5.13:
version "0.5.13"
resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz"
integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==
dependencies:
buffer-from "^1.0.0"
source-map "^0.6.0"
source-map@^0.5.6:
version "0.5.7"
resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz"
@ -5992,16 +6083,16 @@ stacktrace-parser@^0.1.10:
dependencies:
type-fest "^0.7.1"
statuses@2.0.1:
version "2.0.1"
resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz"
integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
statuses@~1.5.0:
version "1.5.0"
resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz"
integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==
statuses@2.0.1:
version "2.0.1"
resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz"
integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
stop-iteration-iterator@^1.1.0:
version "1.1.0"
resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz"
@ -6015,6 +6106,13 @@ strict-uri-encode@^2.0.0:
resolved "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz"
integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==
string_decoder@^1.1.1:
version "1.3.0"
resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz"
integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
dependencies:
safe-buffer "~5.2.0"
string-length@^4.0.1:
version "4.0.2"
resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz"
@ -6096,13 +6194,6 @@ string.prototype.trimstart@^1.0.8:
define-properties "^1.2.1"
es-object-atoms "^1.0.0"
string_decoder@^1.1.1:
version "1.3.0"
resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz"
integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
dependencies:
safe-buffer "~5.2.0"
strip-ansi@^5.0.0:
version "5.2.0"
resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz"
@ -6299,7 +6390,7 @@ typed-array-length@^1.0.7:
possible-typed-array-names "^1.0.0"
reflect.getprototypeof "^1.0.6"
typescript@^5.8.3:
typescript@^5.8.3, "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", typescript@>=4.2.0, typescript@>=4.9.5:
version "5.9.2"
resolved "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz"
integrity sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==
@ -6347,7 +6438,7 @@ universalify@^0.1.0:
resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz"
integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
unpipe@1.0.0, unpipe@~1.0.0:
unpipe@~1.0.0, unpipe@1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz"
integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==
@ -6543,7 +6634,12 @@ ws@^6.2.3:
dependencies:
async-limiter "~1.0.0"
ws@^7, ws@^7.5.10:
ws@^7:
version "7.5.10"
resolved "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz"
integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==
ws@^7.5.10:
version "7.5.10"
resolved "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz"
integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==