Browse Source

保存本地更改以便合并远程更新

main
unknown 2 weeks ago
parent
commit
69d6808ff6
  1. 52
      app/locales/en/translation.json
  2. 61
      app/locales/fr/translation.json
  3. 62
      app/locales/zh/translation.json
  4. 174
      app/screens/BalanceScreen/RechargeScreen.tsx
  5. 503
      app/screens/CartScreen.tsx
  6. 57
      app/screens/ProductCard.tsx
  7. 3
      app/screens/ProductDetailScreen.tsx
  8. 261
      app/screens/productStatus/OrderDatails.tsx
  9. 83
      app/services/api/orders.ts
  10. 534
      yarn.lock

52
app/locales/en/translation.json

@ -482,5 +482,57 @@
"login_required_title": "Please Login First",
"login_required_subtitle": "Login to use cart features",
"login_now": "Login Now"
},
"order": {
"details": "Order Details",
"information": "Order Information",
"id": "Order ID",
"create_time": "Create Time",
"shipping_type": "Shipping Method",
"shipping": {
"sea": "Sea Shipping",
"air": "Air Shipping"
},
"delivery_info": "Delivery Information",
"warehouse": "Warehouse Address",
"contact_after_payment": "Contact info visible after payment",
"recipient": "Recipient",
"product_info": "Product Information",
"price_details": "Price Details",
"platform_shipping": "Platform Shipping Fee",
"international_shipping": "International Shipping Fee",
"total": "Total",
"estimated_shipping": "Estimated Shipping Fee",
"cancel": "Cancel Order",
"pay": "Pay Now",
"contact_shipping": "Contact Shipping",
"check_logistics": "Check Logistics",
"confirm_receipt": "Confirm Receipt",
"pay_now": "Pay Now",
"add_to_cart": "Add to Cart",
"reorder": "Reorder",
"unable_to_load": "Unable to load order details",
"error": {
"phone_open": "Unable to open phone dialer",
"payment_update": "Payment update failed",
"invalid_phone": "Please enter a valid phone number"
},
"payment": {
"online": "Online Payment",
"offline": "Offline Payment",
"cash": "Cash Payment",
"bank": "Bank Transfer",
"select_payment": "Select Payment Method",
"balance_remaining": "Balance Remaining"
},
"select_currency": "Select Currency",
"converting": "Converting...",
"equivalent_amount": "Equivalent Amount",
"confirm_payment": "Confirm Payment",
"confirm_cancel": "Are you sure you want to cancel this order?",
"cancel_success": "Order cancelled successfully",
"cancel_failed": "Failed to cancel order",
"yes": "Yes",
"no": "No"
}
}

61
app/locales/fr/translation.json

@ -530,5 +530,66 @@
"shorts": "Courts",
"category": "Catégorie"
}
},
"order": {
"details": "Détails de la commande",
"status": {
"waiting_payment": "En attente de paiement",
"waiting_shipment": "En attente d'expédition",
"in_transit": "En transit",
"waiting_receipt": "En attente de réception",
"completed": "Terminée",
"cancelled": "Annulée",
"refunded": "Remboursée"
},
"information": "Informations de commande",
"id": "Numéro de commande",
"create_time": "Date de création",
"shipping_type": "Mode d'expédition",
"shipping": {
"sea": "Transport maritime",
"air": "Transport aérien"
},
"delivery_info": "Informations de livraison",
"warehouse": "Adresse de l'entrepôt",
"contact_after_payment": "Coordonnées visibles après paiement",
"recipient": "Destinataire",
"product_info": "Informations produit",
"price_details": "Détails des prix",
"platform_shipping": "Frais d'expédition plateforme",
"international_shipping": "Frais d'expédition internationaux",
"total": "Total",
"estimated_shipping": "Frais d'expédition estimés",
"cancel": "Annuler la commande",
"pay": "Payer maintenant",
"contact_shipping": "Contacter l'expédition",
"check_logistics": "Vérifier la logistique",
"confirm_receipt": "Confirmer la réception",
"pay_now": "Payer maintenant",
"add_to_cart": "Ajouter au panier",
"reorder": "Commander à nouveau",
"unable_to_load": "Impossible de charger les détails de la commande",
"error": {
"phone_open": "Impossible d'ouvrir le composeur téléphonique",
"payment_update": "Mise à jour du paiement échouée",
"invalid_phone": "Veuillez entrer un numéro de téléphone valide"
},
"payment": {
"online": "Paiement en ligne",
"offline": "Paiement hors ligne",
"cash": "Paiement en espèces",
"bank": "Virement bancaire",
"select_payment": "Sélectionner le mode de paiement",
"balance_remaining": "Solde restant"
},
"select_currency": "Sélectionner la devise",
"converting": "Conversion en cours...",
"equivalent_amount": "Montant équivalent",
"confirm_payment": "Confirmer le paiement",
"confirm_cancel": "Êtes-vous sûr de vouloir annuler cette commande ?",
"cancel_success": "Commande annulée avec succès",
"cancel_failed": "Échec de l'annulation de la commande",
"yes": "Oui",
"no": "Non"
}
}

62
app/locales/zh/translation.json

@ -7,6 +7,9 @@
"mainAppTitle": "欢迎使用 MainApp",
"mainAppText": "这是主应用界面。",
"resetCountry": "重置国家选择",
"ok": "确定",
"success": "成功",
"error": "错误",
"loginTitle": "登录 Brainnel",
"loginSubtitle": "登录开始您的业务",
"continueWithGoogle": "使用 Google 继续",
@ -192,5 +195,64 @@
"login_required_title": "请先登录",
"login_required_subtitle": "登录后即可使用购物车功能",
"login_now": "立即登录"
},
"order": {
"details": "订单详情",
"status": {
"waiting_payment": "待付款",
"waiting_shipment": "待发货",
"in_transit": "运输中",
"waiting_receipt": "待收货",
"completed": "已完成"
},
"information": "订单信息",
"id": "订单编号",
"create_time": "创建时间",
"shipping_type": "配送方式",
"shipping": {
"sea": "海运",
"air": "空运"
},
"delivery_info": "配送信息",
"warehouse": "仓库地址",
"contact_after_payment": "付款后可见联系方式",
"recipient": "收件人",
"product_info": "商品信息",
"price_details": "价格详情",
"platform_shipping": "平台运费",
"international_shipping": "国际运费",
"total": "总计",
"estimated_shipping": "预计运费",
"cancel": "取消订单",
"pay": "立即付款",
"contact_shipping": "联系物流",
"check_logistics": "查看物流",
"confirm_receipt": "确认收货",
"pay_now": "立即付款",
"add_to_cart": "加入购物车",
"reorder": "再次购买",
"unable_to_load": "无法加载订单详情",
"error": {
"phone_open": "无法打开拨号界面",
"payment_update": "支付更新失败",
"invalid_phone": "请输入有效的手机号码"
},
"payment": {
"online": "在线支付",
"offline": "线下支付",
"cash": "现金支付",
"bank": "银行转账",
"select_payment": "选择支付方式",
"balance_remaining": "余额"
},
"select_currency": "选择货币",
"converting": "正在转换...",
"equivalent_amount": "等值金额",
"confirm_payment": "确认支付",
"confirm_cancel": "确定要取消此订单吗?",
"cancel_success": "订单已成功取消",
"cancel_failed": "取消订单失败",
"yes": "是",
"no": "否"
}
}

174
app/screens/BalanceScreen/RechargeScreen.tsx

@ -72,6 +72,8 @@ const RechargeScreen = ({ onClose }: RechargeScreenProps) => {
const [showPhoneModal, setShowPhoneModal] = useState(false);
// 添加PayPal展开视图的状态
const [isPaypalExpanded, setIsPaypalExpanded] = useState(false);
// 添加Wave展开视图的状态
const [isWaveExpanded, setIsWaveExpanded] = useState(false);
useEffect(() => {
payApi.getRechargeRecommendAmount().then((res) => {
@ -95,8 +97,8 @@ const RechargeScreen = ({ onClose }: RechargeScreenProps) => {
setShowCustomAmountInput(false);
setCustomAmountDisplayText("");
// 如果当前已选择了Paypal支付方式,则重新计算转换后的金额
if (selectedOperator === "paypal") {
// 如果当前已选择了Paypal或Wave支付方式,则重新计算转换后的金额
if (selectedOperator === "paypal" || selectedOperator === "wave") {
handleCurrencyConversion(price, currentCurrency);
}
// 保留原有的逻辑
@ -106,42 +108,67 @@ const RechargeScreen = ({ onClose }: RechargeScreenProps) => {
};
const handleOperatorSelect = (operator: string) => {
// 如果选择的不是之前选中的支付方式,则重置PayPal展开状态
// 如果选择的不是之前选中的支付方式,则重置展开状态
if (operator !== selectedOperator) {
setIsPaypalExpanded(false);
setIsWaveExpanded(false);
}
setSelectedOperator(operator === selectedOperator ? null : operator);
// 查找是否选择了PayPal支付方式
const isPaypal = paymentMethods.some(
(method) => method.key === operator && method.key === "paypal"
// 查找选中的支付方式
const selectedMethod = paymentMethods.find(
(method) => method.key === operator
);
console.log(isPaypal);
// 如果选择了PayPal支付方式,立即进行货币转换并设置展开状态
if (isPaypal && operator !== selectedOperator) {
setIsPaypalExpanded(true); // 设置PayPal展开状态为true
// 无条件触发货币转换,使用默认的USD
let amountToConvert = selectedPrice;
// 如果用户还没有选择金额,使用推荐金额中的第一个
if (
!amountToConvert &&
recommendedAmounts &&
recommendedAmounts.amounts &&
recommendedAmounts.amounts.length > 0
) {
amountToConvert = recommendedAmounts.amounts[0].toString();
// 自动选择第一个推荐金额
setSelectedPrice(amountToConvert);
if (selectedMethod) {
// 如果是PayPal支付方式
if (selectedMethod.key === "paypal" && operator !== selectedOperator) {
setIsPaypalExpanded(true);
// 无条件触发货币转换,使用默认的USD
let amountToConvert = selectedPrice;
// 如果用户还没有选择金额,使用推荐金额中的第一个
if (
!amountToConvert &&
recommendedAmounts &&
recommendedAmounts.amounts &&
recommendedAmounts.amounts.length > 0
) {
amountToConvert = recommendedAmounts.amounts[0].toString();
setSelectedPrice(amountToConvert);
}
if (amountToConvert) {
setCurrentCurrency("USD");
setIsConverting(true);
handleCurrencyConversion(amountToConvert, "USD");
}
}
// 如果是Wave支付方式
else if (selectedMethod.key === "wave" && operator !== selectedOperator) {
setIsWaveExpanded(true);
// 无条件触发货币转换,使用FCFA
let amountToConvert = selectedPrice;
// 如果用户还没有选择金额,使用推荐金额中的第一个
if (
!amountToConvert &&
recommendedAmounts &&
recommendedAmounts.amounts &&
recommendedAmounts.amounts.length > 0
) {
amountToConvert = recommendedAmounts.amounts[0].toString();
setSelectedPrice(amountToConvert);
}
if (amountToConvert) {
setCurrentCurrency("USD");
setIsConverting(true);
handleCurrencyConversion(amountToConvert, "USD");
if (amountToConvert) {
setCurrentCurrency("FCFA");
setIsConverting(true);
handleCurrencyConversion(amountToConvert, "FCFA");
}
}
} else if (operator === "currency" && operator !== selectedOperator) {
// 旧的逻辑保留作为备用
@ -214,7 +241,7 @@ const RechargeScreen = ({ onClose }: RechargeScreenProps) => {
(method) => method.key === selectedOperator
);
if (selectedMethod) {
// 使用key作为支付方式标识,而不是不存在的name属性
// 使用key作为支付方式标识
params.payment_method = selectedMethod.key;
// 如果是paypal,设置货币转换相关参数
@ -231,6 +258,24 @@ const RechargeScreen = ({ onClose }: RechargeScreenProps) => {
}
}
}
// 如果是wave,固定使用FCFA
else if (selectedMethod.key === "wave") {
params.currency = "FCFA";
// 使用转换后的FCFA金额,如果有
if (convertedAmount.length > 0) {
const convertedTotal = convertedAmount.find(
(item) => item.item_key === "total_amount"
);
if (convertedTotal) {
params.amount = convertedTotal.converted_amount;
}
} else {
// 如果没有转换结果,使用原始金额作为备用
params.amount = parseFloat(selectedPrice.replace(/,/g, ""));
}
// 更新显示标签为FCFA
params.selectedPriceLabel = params.amount + " FCFA";
}
} else if (selectedOperator === "balance") {
params.payment_method = "Balance";
} else if (selectedOperator === "currency") {
@ -269,7 +314,21 @@ const RechargeScreen = ({ onClose }: RechargeScreenProps) => {
return;
}
console.log(`Converting ${amount} FCFA to ${currency}...`);
// 如果源货币和目标货币相同,直接返回原金额
if (user?.currency === currency) {
console.log(`Same currency (${currency}), no conversion needed`);
setConvertedAmount([
{
converted_amount: amount,
item_key: "total_amount",
original_amount: amount,
},
]);
setIsConverting(false);
return;
}
console.log(`Converting ${amount} ${user?.currency} to ${currency}...`);
// 调用货币转换API
const data = {
@ -452,6 +511,15 @@ const RechargeScreen = ({ onClose }: RechargeScreenProps) => {
return true;
}
// 如果选择了Wave支付方式,但还没有转换结果,禁用按钮
if (
selectedOperator === "wave" &&
(convertedAmount.length === 0 ||
!convertedAmount.find((item) => item.item_key === "total_amount"))
) {
return true;
}
// 其他情况下,启用按钮
return false;
};
@ -809,6 +877,50 @@ const RechargeScreen = ({ onClose }: RechargeScreenProps) => {
</View>
</View>
)}
{/* Wave展开视图 */}
{method.key === "wave" &&
selectedOperator === "wave" &&
isWaveExpanded && (
<View style={styles.paypalExpandedContainer}>
<View style={styles.paypalCurrencyContainer}>
<Text style={styles.currencyTitle}>
{t("balance.recharge.currency_title")}
</Text>
<View style={styles.currencyButtonsContainer}>
<View style={[styles.currencyButton, styles.currencyButtonActive]}>
<Text style={[styles.currencyButtonText, styles.currencyButtonTextActive]}>
FCFA
</Text>
</View>
</View>
{/* 显示转换后的金额 */}
{isConverting ? (
<View style={styles.convertingContainer}>
<ActivityIndicator size="small" color="#007efa" />
<Text style={styles.convertingText}>
{t("balance.recharge.converting")}
</Text>
</View>
) : convertedAmount.length > 0 ? (
<View style={styles.convertedAmountContainer}>
<Text style={styles.convertedAmountLabel}>
{t("balance.recharge.equivalent_amount")}
</Text>
<Text style={styles.convertedAmountValue}>
{convertedAmount
.find(
(item) => item.item_key === "total_amount"
)
?.converted_amount.toFixed(2)}{" "}
FCFA
</Text>
</View>
) : null}
</View>
</View>
)}
</View>
))}
</>

503
app/screens/CartScreen.tsx

@ -32,6 +32,7 @@ import useCreateOrderStore from "../store/createOrder";
import useUserStore from "../store/user";
import { t } from "../i18n";
import { payApi } from "../services/api/payApi";
import IconComponent from "../components/IconComponent";
export const CartScreen = () => {
const [cartList, setCartList] = useState<GetCartList[]>([]);
@ -59,6 +60,8 @@ export const CartScreen = () => {
const [quantityInput, setQuantityInput] = useState("");
const navigation = useNavigation<NativeStackNavigationProp<any>>();
const { setItems } = useCreateOrderStore();
const [minQuantityModalVisible, setMinQuantityModalVisible] = useState(false);
const [minQuantityMessage, setMinQuantityMessage] = useState("");
// 货币转换函数
const convertCurrency = async () => {
@ -568,19 +571,28 @@ export const CartScreen = () => {
}
};
// 统一的提示函数
const showMinQuantityModal = (message: string) => {
setMinQuantityMessage(message);
setMinQuantityModalVisible(true);
};
// 处理减少数量
const handleDecreaseQuantity = (
cartId: number,
cartItemId: number,
currentQuantity: number
currentQuantity: number,
minOrderQuantity: number
) => {
// 如果用户未登录,直接返回
if (!user_id) {
return;
}
if (currentQuantity > 1) {
if (currentQuantity > minOrderQuantity) {
updateQuantity(cartId, cartItemId, currentQuantity - 1);
} else {
showMinQuantityModal(`${t("cart.notice")}${t("cart.min_order")}${minOrderQuantity}${t("cart.pieces")}`);
}
};
@ -607,14 +619,21 @@ export const CartScreen = () => {
const newQuantity = parseInt(quantityInput);
if (isNaN(newQuantity) || newQuantity < 1) {
Alert.alert(t("cart.notice"), t("cart.enter_valid_quantity"));
showMinQuantityModal(t("cart.enter_valid_quantity"));
return;
}
updateQuantity(editingItem.cartId, editingItem.cartItemId, newQuantity);
setQuantityInputVisible(false);
setEditingItem(null);
setQuantityInput("");
const { cartId, cartItemId } = editingItem;
const minOrderQuantity = cartList.find(item => item.cart_id === cartId)?.min_order_quantity || 1;
if (newQuantity < minOrderQuantity) {
showMinQuantityModal(`${t("cart.notice")}${t("cart.min_order")}${minOrderQuantity}${t("cart.pieces")}`);
} else {
updateQuantity(cartId, cartItemId, newQuantity);
setQuantityInputVisible(false);
setEditingItem(null);
setQuantityInput("");
}
};
// 处理点击数量显示
@ -656,243 +675,240 @@ export const CartScreen = () => {
</View>
{/* <Text style={styles.shoppingCartTitle}>Panier (5)</Text> */}
</View>
{cartList.map((item, index1) => (
<View style={styles.productCardListing} key={item.cart_id}>
<View style={styles.productCardContainer5}>
{/* <Text style={styles.shoppingCartTitle}>Panier (5)</Text> */}
</View>
{/* <Text style={styles.shoppingCartTitle}>Panier (5)</Text> */}
</View>
{cartList.map((item, index1) => (
<View style={styles.productCardListing} key={item.cart_id}>
<View style={styles.productCardContainer5}>
<View style={styles.svgContainer1}>
<TouchableOpacity
onPress={() =>
toggleSelection(String(item.cart_id), index1, null)
}
disabled={!user_id}
>
<View style={[styles.iconContainer]}>
{item.selected === 1 ? (
<OrangeCircleIcon size={fontSize(24)} />
) : (
<CircleOutlineIcon size={fontSize(24)} />
)}
</View>
</TouchableOpacity>
</View>
<Image
source={{ uri: item.product_image }}
style={styles.imageThumbnail}
/>
<View style={styles.productInfoContainer2}>
<Text style={styles.casualTextSnippet}>
{item.subject}
</Text>
<Text style={styles.productDetailsTextStyle1}>
{t("cart.min_order")}: {item.min_order_quantity}
{t("cart.pieces")}
</Text>
</View>
</View>
{item.skus.map((sku, index) => (
<Swipeable
key={sku.cart_item_id}
enabled={!!user_id}
renderRightActions={() => (
<TouchableOpacity
style={{
backgroundColor: "#ff5217",
justifyContent: "center",
alignItems: "center",
width: 80,
}}
onPress={() =>
handleDeleteSku(
item.cart_id,
sku.cart_item_id,
item.cart_id
)
}
disabled={!user_id}
>
<Text
style={{ color: "white", fontWeight: "bold" }}
>
{t("cart.delete")}
</Text>
</TouchableOpacity>
)}
>
<TouchableOpacity
onPress={() => {
if (user_id) {
navigation.navigate("ProductDetail", {
offer_id: item.offer_id,
searchKeyword: item.subject,
price: sku.price,
});
}
}}
style={[
styles.productCardContainer5,
styles.productCardContainer4,
]}
>
<View style={styles.svgContainer1}>
<TouchableOpacity
onPress={() =>
toggleSelection(String(item.cart_id), index1, null)
user_id && toggleSelection(
String(sku.cart_item_id),
index1,
index
)
}
disabled={!user_id}
>
<View style={[styles.iconContainer]}>
{item.selected === 1 ? (
{sku.selected === 1 ? (
<OrangeCircleIcon size={fontSize(24)} />
) : (
<CircleOutlineIcon size={fontSize(24)} />
)}
{/* <CircleOutlineIcon size={fontSize(24)} strokeColor={sku.selected === 1 ? "#FF5100" : "#C6C6C6"}/> */}
</View>
</TouchableOpacity>
</View>
<Image
source={{ uri: item.product_image }}
style={styles.imageThumbnail}
source={{
uri: sku.attributes[0]?.sku_image_url
? sku.attributes[0]?.sku_image_url
: item.product_image,
}}
style={styles.productImageDisplayStyle}
/>
<View style={styles.productInfoContainer2}>
<Text style={styles.casualTextSnippet}>
{item.subject}
</Text>
<Text style={styles.productDetailsTextStyle1}>
{t("cart.min_order")}: {item.min_order_quantity}
{t("cart.pieces")}
</Text>
</View>
</View>
{item.skus.map((sku, index) => (
<Swipeable
key={sku.cart_item_id}
enabled={!!user_id}
renderRightActions={() => (
<TouchableOpacity
style={{
backgroundColor: "#ff5217",
justifyContent: "center",
alignItems: "center",
width: 80,
}}
onPress={() =>
handleDeleteSku(
item.cart_id,
sku.cart_item_id,
item.cart_id
)
}
disabled={!user_id}
>
<View style={styles.productCardWidget1}>
{/* 1. SKU attributes at the top */}
{sku.attributes[0]?.value && (
<View style={styles.longLifeRougeStyle}>
<Text
style={{ color: "white", fontWeight: "bold" }}
style={styles.longLifeTextSnippet}
numberOfLines={2}
ellipsizeMode="tail"
>
{t("cart.delete")}
{sku.attributes[0]?.value}{" "}
{sku.attributes[1] ? "/" : ""}{" "}
{sku.attributes[1]?.value}
</Text>
</TouchableOpacity>
</View>
)}
>
<TouchableOpacity
onPress={() => {
if (user_id) {
navigation.navigate("ProductDetail", {
offer_id: item.offer_id,
searchKeyword: item.subject,
price: sku.price,
});
}
}}
style={[
styles.productCardContainer5,
styles.productCardContainer4,
]}
>
<View style={styles.svgContainer1}>
{/* 2. Price section - discount and actual price close together */}
<View style={styles.priceSection}>
<View style={styles.priceColumnContainer}>
{/* Discount price */}
<View style={styles.productInfoContainer1}>
<View style={styles.priceInfoContainer1}>
<Text style={styles.discountPriceLabel}>
{sku.original_price} {sku.currency}
</Text>
</View>
<View style={styles.vipContainer}>
<Image
source={require("../../assets/img/折扣VIP1 (1).png")}
style={styles.VipImg}
/>
<Text style={styles.discountPercentageTextStyle}>
{((1 - vip_discount) * 100).toFixed(0)}%
</Text>
</View>
</View>
{/* Actual price - right below discount price */}
<View style={styles.productInfoContainer4}>
<Text style={styles.productCodeLabel}>
{sku.price}
</Text>
<Text style={styles.productDetailsTextStyle}>
FCFA
</Text>
</View>
</View>
{/* 3. Quantity controls on the right */}
<View style={styles.orderQuantityContainer}>
<TouchableOpacity
style={[
styles.svgContainer4,
{ borderRightWidth: 0 },
]}
onPress={() =>
user_id && toggleSelection(
String(sku.cart_item_id),
index1,
index
user_id && handleDecreaseQuantity(
item.cart_id,
sku.cart_item_id,
sku.quantity,
item.min_order_quantity
)
}
disabled={!user_id}
>
<View style={[styles.iconContainer]}>
{sku.selected === 1 ? (
<OrangeCircleIcon size={fontSize(24)} />
) : (
<CircleOutlineIcon size={fontSize(24)} />
)}
{/* <CircleOutlineIcon size={fontSize(24)} strokeColor={sku.selected === 1 ? "#FF5100" : "#C6C6C6"}/> */}
</View>
<Text
style={{
fontSize: fontSize(18),
color: "#333",
fontWeight: "500",
}}
>
-
</Text>
</TouchableOpacity>
<TouchableOpacity
style={styles.quantityLabelContainer}
onPress={() =>
user_id && handleQuantityPress(
item.cart_id,
sku.cart_item_id,
sku.quantity
)
}
disabled={!user_id}
>
<Text style={styles.quantityText}>
{sku.quantity}
</Text>
</TouchableOpacity>
<TouchableOpacity
style={[
styles.svgContainer4,
{ borderLeftWidth: 0, marginLeft: 0 },
]}
onPress={() =>
user_id && handleIncreaseQuantity(
item.cart_id,
sku.cart_item_id,
sku.quantity
)
}
disabled={!user_id}
>
<Text
style={{
fontSize: fontSize(18),
color: "#333",
fontWeight: "500",
}}
>
+
</Text>
</TouchableOpacity>
</View>
<Image
source={{
uri: sku.attributes[0]?.sku_image_url
? sku.attributes[0]?.sku_image_url
: item.product_image,
}}
style={styles.productImageDisplayStyle}
/>
<View style={styles.productCardWidget1}>
{/* 1. SKU attributes at the top */}
{sku.attributes[0]?.value && (
<View style={styles.longLifeRougeStyle}>
<Text
style={styles.longLifeTextSnippet}
numberOfLines={2}
ellipsizeMode="tail"
>
{sku.attributes[0]?.value}{" "}
{sku.attributes[1] ? "/" : ""}{" "}
{sku.attributes[1]?.value}
</Text>
</View>
)}
{/* 2. Price section - discount and actual price close together */}
<View style={styles.priceSection}>
<View style={styles.priceColumnContainer}>
{/* Discount price */}
<View style={styles.productInfoContainer1}>
<View style={styles.priceInfoContainer1}>
<Text style={styles.discountPriceLabel}>
{sku.original_price} {sku.currency}
</Text>
</View>
<View style={styles.vipContainer}>
<Image
source={require("../../assets/img/折扣VIP1 (1).png")}
style={styles.VipImg}
/>
<Text style={styles.discountPercentageTextStyle}>
{((1 - vip_discount) * 100).toFixed(0)}%
</Text>
</View>
</View>
{/* Actual price - right below discount price */}
<View style={styles.productInfoContainer4}>
<Text style={styles.productCodeLabel}>
{sku.price}
</Text>
<Text style={styles.productDetailsTextStyle}>
FCFA
</Text>
</View>
</View>
{/* 3. Quantity controls on the right */}
<View style={styles.orderQuantityContainer}>
<TouchableOpacity
style={[
styles.svgContainer4,
{ borderRightWidth: 0 },
]}
onPress={() =>
user_id && handleDecreaseQuantity(
item.cart_id,
sku.cart_item_id,
sku.quantity
)
}
disabled={!user_id}
>
<Text
style={{
fontSize: fontSize(18),
color: "#333",
fontWeight: "500",
}}
>
-
</Text>
</TouchableOpacity>
<TouchableOpacity
style={styles.quantityLabelContainer}
onPress={() =>
user_id && handleQuantityPress(
item.cart_id,
sku.cart_item_id,
sku.quantity
)
}
disabled={!user_id}
>
<Text style={styles.quantityText}>
{sku.quantity}
</Text>
</TouchableOpacity>
<TouchableOpacity
style={[
styles.svgContainer4,
{ borderLeftWidth: 0, marginLeft: 0 },
]}
onPress={() =>
user_id && handleIncreaseQuantity(
item.cart_id,
sku.cart_item_id,
sku.quantity
)
}
disabled={!user_id}
>
<Text
style={{
fontSize: fontSize(18),
color: "#333",
fontWeight: "500",
}}
>
+
</Text>
</TouchableOpacity>
</View>
</View>
</View>
</TouchableOpacity>
</Swipeable>
))}
</View>
</View>
</View>
</TouchableOpacity>
</Swipeable>
))}
{/* 商品 */}
</View>
</View>
{/* Divider */}
{/* Coffee Cup Product */}
))}
{/* More product sections... */}
{/* 商品 */}
</ScrollView>
{/* Fixed Bottom Section */}
@ -1060,6 +1076,29 @@ export const CartScreen = () => {
</View>
</View>
</Modal>
{/* 最小数量提示弹窗 */}
<Modal
visible={minQuantityModalVisible}
transparent
animationType="fade"
onRequestClose={() => setMinQuantityModalVisible(false)}
>
<View style={styles.overlay}>
<View style={[styles.popup, styles.minQuantityPopup]}>
<View style={styles.warningIconContainer}>
<IconComponent name="exclamation" size={28} color="#FF5100" />
</View>
<Text style={[styles.promptText, styles.minQuantityText]}>{minQuantityMessage}</Text>
<TouchableOpacity
style={[styles.confirmButton, styles.minQuantityButton]}
onPress={() => setMinQuantityModalVisible(false)}
>
<Text style={[styles.confirmText, styles.minQuantityButtonText]}>{t("cart.confirm")}</Text>
</TouchableOpacity>
</View>
</View>
</Modal>
</SafeAreaView>
);
};
@ -1815,4 +1854,42 @@ const styles = StyleSheet.create({
fontWeight: '700',
textAlign: 'center',
},
warningIconContainer: {
backgroundColor: "#FFF2E9",
borderRadius: 20,
padding: 12,
marginBottom: 16,
alignSelf: 'center',
width: 52,
height: 52,
justifyContent: 'center',
alignItems: 'center',
},
warningIcon: {
width: 32,
height: 32,
},
minQuantityPopup: {
width: '80%',
padding: 24,
},
minQuantityText: {
fontSize: fontSize(16),
color: '#333',
marginVertical: 16,
textAlign: 'center',
lineHeight: fontSize(22),
fontWeight: '500',
},
minQuantityButton: {
width: '100%',
height: 44,
borderRadius: 22,
backgroundColor: '#FF5100',
marginTop: 16,
},
minQuantityButtonText: {
fontSize: fontSize(16),
fontWeight: '600',
},
});

57
app/screens/ProductCard.tsx

@ -47,6 +47,11 @@ const ProductCard: React.FC<ProductCardProps> = ({
}) => {
const navigation = useNavigation<NativeStackNavigationProp<any>>();
const [deleteModalVisible, setDeleteModalVisible] = useState<boolean>(false);
const [alertModalVisible, setAlertModalVisible] = useState<boolean>(false);
const [alertMessage, setAlertMessage] = useState<{title: string; message: string}>({
title: '',
message: ''
});
const [images, setImages] = useState<string[]>([]);
const [currentImageIndex, setCurrentImageIndex] = useState(0);
const [imageViewerVisible, setImageViewerVisible] = useState(false);
@ -89,18 +94,27 @@ const ProductCard: React.FC<ProductCardProps> = ({
processProductData();
}, [localProduct, localGroupList]);
// 显示自定义警告
const showCustomAlert = (title: string, message: string) => {
setAlertMessage({ title, message });
setAlertModalVisible(true);
};
// 加入购物车
const addCartHandel = () => {
if (!user_id) {
Alert.alert("添加失败", "请先登录");
showCustomAlert("添加失败", "请先登录");
return;
}
if (totalPrice === 0) {
Alert.alert("添加失败", "请选择商品");
showCustomAlert("添加失败", "请选择商品");
return;
}
if (selectedSize < product.min_order_quantity) {
Alert.alert("添加失败", "小于最小购买数量");
showCustomAlert(
"购买数量不足",
`该商品最小购买数量为 ${product.min_order_quantity} 件,请增加购买数量`
);
return;
}
if (groupList.length > 1) {
@ -803,6 +817,35 @@ const ProductCard: React.FC<ProductCardProps> = ({
</View>
</View>
</Modal>
{/* 自定义警告模态框 */}
<Modal
visible={alertModalVisible}
transparent
animationType="fade"
onRequestClose={() => setAlertModalVisible(false)}
>
<View style={styles.overlay}>
<View style={styles.popup}>
<Text style={styles.promptText}>{alertMessage.title}</Text>
<Text style={[styles.promptText, { fontSize: fontSize(16), marginTop: 10 }]}>{alertMessage.message}</Text>
<View style={styles.buttonContainer}>
<TouchableOpacity
style={styles.cancelButton1}
onPress={() => setAlertModalVisible(false)}
>
<Text style={styles.cancelText}></Text>
</TouchableOpacity>
<TouchableOpacity
style={styles.confirmButton}
onPress={() => setAlertModalVisible(false)}
>
<Text style={styles.confirmText}></Text>
</TouchableOpacity>
</View>
</View>
</View>
</Modal>
</View>
);
};
@ -1274,6 +1317,14 @@ const styles = StyleSheet.create({
color: "#ffffff",
fontFamily: "Source Han Sans CN", // 同上
},
messageText: {
fontSize: fontSize(16),
color: "#666",
textAlign: "center",
marginTop: 10,
marginBottom: 20,
paddingHorizontal: 20,
},
});
export default ProductCard;

3
app/screens/ProductDetailScreen.tsx

@ -376,7 +376,8 @@ export const ProductDetailScreen = () => {
}
}, [showBottomSheet]);
const handleImageLoad = (src: string, event: any) => {
const { width: imageWidth, height: imageHeight } = event.nativeEvent.source;
// ExpoImage的onLoad事件直接返回尺寸信息
const { width: imageWidth, height: imageHeight } = event;
const aspectRatio = imageHeight / imageWidth;
const calculatedHeight = width * aspectRatio;
setImageHeights((prev) => ({

261
app/screens/productStatus/OrderDatails.tsx

@ -13,6 +13,10 @@ import {
StatusBar,
Platform,
Modal,
ViewStyle,
TextStyle,
ImageStyle,
StyleProp,
} from "react-native";
import { useTranslation } from "react-i18next";
import BackIcon from "../../components/BackIcon";
@ -40,6 +44,7 @@ import CircleOutlineIcon from "../../components/CircleOutlineIcon";
import CheckIcon from "../../components/CheckIcon";
import payMap from "../../utils/payMap";
import PhoneNumberInputModal from "../../screens/BalanceScreen/PhoneNumberInputModal";
import IconComponent from "../../components/IconComponent";
// 定义选项类型
interface PaymentOption {
@ -55,6 +60,119 @@ interface TabType {
options: PaymentOption[];
}
type Styles = {
safeArea: ViewStyle;
safeAreaContent: ViewStyle;
container: ViewStyle;
header: ViewStyle;
title: TextStyle;
orderStatus: ViewStyle;
orderStatusContent: ViewStyle;
orderStatusTitle: ViewStyle;
orderStatusTitleText: TextStyle;
orderStatusContentPreview: ViewStyle;
productItem: ViewStyle;
productItemImage: ViewStyle;
productItemInfo: ViewStyle;
productItemNum: ViewStyle;
productItemNumText: TextStyle;
productItemInfoName: ViewStyle;
productItemInfoNameText: TextStyle;
productItemInfoSkuText: TextStyle;
productItemInfoSku: ViewStyle;
productItemInfoPrice: ViewStyle;
orderStatusContentPreviewInformation: ViewStyle;
loadingContainer: ViewStyle;
orderId: ViewStyle;
orderIdText: TextStyle;
orderIdText1: TextStyle;
TotalText: TextStyle;
TotalPrice: TextStyle;
warehouse: ViewStyle;
recipientTitle: ViewStyle;
recipientPhoneContainer: ViewStyle;
recipient: ViewStyle;
orderStatusContentPreviewInformationText: TextStyle;
warehousePhone: ViewStyle;
warehousePhoneText: TextStyle;
warehousePhoneTextContainer: ViewStyle;
recipientName: TextStyle;
recipientPhone: TextStyle;
dottedLine: ViewStyle;
orderRemakeText: TextStyle;
addCard: ViewStyle;
addCardBox: ViewStyle;
addCardText: TextStyle;
bottomButtons: ViewStyle;
bottomButton1: ViewStyle;
bottomButton: ViewStyle;
bottomButtonText: TextStyle;
bottomButtonText1: TextStyle;
modalOverlay: ViewStyle;
modalContent: ViewStyle;
modalHeader: ViewStyle;
modalTitle: TextStyle;
closeButtonContainer: ViewStyle;
closeButtonText: TextStyle;
tabContainer: ViewStyle;
tab: ViewStyle;
tabActive: ViewStyle;
tabText: TextStyle;
tabTextActive: TextStyle;
paymentOptions: ViewStyle;
cardContainer: ViewStyle;
iconRow: ViewStyle;
imageContainer: ViewStyle;
paymentIconContainer: ViewStyle;
paymentIcon: TextStyle;
checkboxContainer: ViewStyle;
checkmarkContainer: ViewStyle;
currencyTitle: TextStyle;
paypalExpandedContainer: ViewStyle;
paypalCurrencyContainer: ViewStyle;
currencyButtonsContainer: ViewStyle;
currencyButton: ViewStyle;
currencyButtonActive: ViewStyle;
currencyButtonText: TextStyle;
currencyButtonTextActive: TextStyle;
convertingContainer: ViewStyle;
convertingText: TextStyle;
convertedAmountContainer: ViewStyle;
convertedAmountLabel: TextStyle;
convertedAmountValue: TextStyle;
actionButtonsContainer: ViewStyle;
actionButtons: ViewStyle;
cancelButton: ViewStyle;
confirmButton: ViewStyle;
confirmButtonDisabled: ViewStyle;
buttonTextDark: TextStyle;
buttonTextWhite: TextStyle;
operatorImage: ImageStyle;
mobileMoneyTextContainer: ViewStyle;
mobileMoneyImgContainer: ViewStyle;
mobileMoneyImg: ImageStyle;
mobileMoneyText: TextStyle;
outerContainer: ViewStyle;
flexContainer: ViewStyle;
imageStyle: ImageStyle;
verticalAlignEndContent: ViewStyle;
svgContainer: ViewStyle;
leftInfo: ViewStyle;
blueBox: ViewStyle;
balanceText: TextStyle;
modalPopup: ViewStyle;
modalWarningIcon: ViewStyle;
modalPromptText: TextStyle;
modalCancelPopup: ViewStyle;
modalCancelText: TextStyle;
modalCancelButtonsContainer: ViewStyle;
modalCancelActionButton: ViewStyle;
modalCancelButtonOutline: ViewStyle;
modalCancelButtonFilled: ViewStyle;
modalCancelButtonOutlineText: TextStyle;
modalCancelButtonFilledText: TextStyle;
};
export const OrderDetails = () => {
const navigation = useNavigation<NativeStackNavigationProp<any>>();
const { t } = useTranslation();
@ -110,6 +228,8 @@ export const OrderDetails = () => {
onCloses?: () => void;
} | null>(null);
const [showPhoneModal, setShowPhoneModal] = useState(false);
const [showCancelModal, setShowCancelModal] = useState(false);
const [isCancelling, setIsCancelling] = useState(false);
const getOrderDetails = async () => {
try {
@ -393,6 +513,24 @@ export const OrderDetails = () => {
return false;
};
// 添加取消订单的处理函数
const handleCancelOrder = async () => {
try {
setIsCancelling(true);
const response = await ordersApi.cancelOrder(route.params.orderId);
if (response) {
deleteOrder(route.params.orderId);
setShowCancelModal(false);
navigation.goBack();
}
} catch (error) {
console.error("取消订单失败:", error);
Alert.alert(t("error"), t("order.cancel_failed"));
} finally {
setIsCancelling(false);
}
};
return (
<SafeAreaView style={styles.safeArea}>
<StatusBar barStyle="dark-content" backgroundColor="#fff" />
@ -563,7 +701,7 @@ export const OrderDetails = () => {
<View style={styles.productItemImage}>
<Image
source={{ uri: item.sku_image }}
style={{ width: "100%", height: "100%" }}
style={{ width: '100%', height: '100%', resizeMode: 'cover' }}
/>
</View>
<View style={styles.productItemInfo}>
@ -666,9 +804,7 @@ export const OrderDetails = () => {
<View style={styles.bottomButtons}>
<TouchableOpacity
style={styles.bottomButton1}
onPress={() => {
deleteOrder(route.params.orderId);
}}
onPress={() => setShowCancelModal(true)}
>
<Text style={styles.bottomButtonText1}>{t("order.cancel")}</Text>
</TouchableOpacity>
@ -807,7 +943,7 @@ export const OrderDetails = () => {
<View style={styles.blueBox}>
<Image
source={payMap(option.key) as any}
style={styles.operatorImage}
style={{ width: 80, height: 30, resizeMode: 'contain', marginRight: 10 }}
/>
</View>
<Text style={styles.balanceText}>
@ -821,7 +957,7 @@ export const OrderDetails = () => {
<View>
<Image
source={payMap(option.key) as any}
style={styles.operatorImage}
style={{ width: 80, height: 30, resizeMode: 'contain', marginRight: 10 }}
/>
{option.key === "mobile_money" && (
<View style={styles.mobileMoneyTextContainer}>
@ -831,7 +967,7 @@ export const OrderDetails = () => {
<View key={index} style={styles.mobileMoneyImgContainer}>
<Image
source={payMap(item) as any}
style={styles.mobileMoneyImg}
style={{ width: 60, height: 22, resizeMode: 'contain' }}
/>
</View>
))
@ -942,14 +1078,12 @@ export const OrderDetails = () => {
{option.id === "cash" ? (
<Image
source={require("../../../assets/img/image_c6aa9539.png")}
style={styles.imageStyle}
resizeMode="cover"
style={{ width: 60, height: 22, resizeMode: 'cover' }}
/>
) : (
<Image
source={require("../../../assets/img/Global 1.png")}
style={styles.imageStyle}
resizeMode="cover"
style={{ width: 60, height: 22, resizeMode: 'cover' }}
/>
)}
</View>
@ -1023,11 +1157,49 @@ export const OrderDetails = () => {
onSubmit={handlePhoneSubmit}
onCloses={() => setShowPaymentModal(false)}
/>
{/* 取消订单确认弹窗 */}
<Modal
visible={showCancelModal}
transparent
animationType="fade"
onRequestClose={() => setShowCancelModal(false)}
>
<View style={styles.modalOverlay}>
<View style={[styles.modalPopup, styles.modalCancelPopup]}>
<View style={styles.modalWarningIcon}>
<IconComponent name="exclamation" size={28} color="#FF5100" />
</View>
<Text style={[styles.modalPromptText, styles.modalCancelText]}>
{t("order.confirm_cancel")}
</Text>
<View style={styles.modalCancelButtonsContainer}>
<TouchableOpacity
style={[styles.modalCancelActionButton, styles.modalCancelButtonOutline]}
onPress={() => setShowCancelModal(false)}
>
<Text style={styles.modalCancelButtonOutlineText}>{t("order.no")}</Text>
</TouchableOpacity>
<TouchableOpacity
style={[styles.modalCancelActionButton, styles.modalCancelButtonFilled]}
onPress={handleCancelOrder}
disabled={isCancelling}
>
{isCancelling ? (
<ActivityIndicator size="small" color="#fff" />
) : (
<Text style={styles.modalCancelButtonFilledText}>{t("order.yes")}</Text>
)}
</TouchableOpacity>
</View>
</View>
</View>
</Modal>
</SafeAreaView>
);
};
const styles = StyleSheet.create({
const styles = StyleSheet.create<Styles>({
safeArea: {
flex: 1,
backgroundColor: '#fff',
@ -1290,7 +1462,8 @@ const styles = StyleSheet.create({
modalOverlay: {
flex: 1,
backgroundColor: 'rgba(0, 0, 0, 0.5)',
justifyContent: 'flex-end',
justifyContent: 'center',
alignItems: 'center',
},
modalContent: {
backgroundColor: '#fff',
@ -1563,4 +1736,66 @@ const styles = StyleSheet.create({
fontWeight: "500",
color: "#333333",
},
modalPopup: {
backgroundColor: '#fff',
padding: 20,
borderRadius: 10,
width: '80%',
maxWidth: '80%',
},
modalWarningIcon: {
alignItems: 'center',
marginBottom: 16,
},
modalPromptText: {
fontSize: fontSize(16),
color: '#333',
marginBottom: 16,
textAlign: 'center',
lineHeight: fontSize(22),
fontWeight: '500',
},
modalCancelPopup: {
width: '80%',
padding: 24,
alignItems: 'center',
},
modalCancelText: {
fontSize: fontSize(16),
color: '#333',
marginVertical: 16,
textAlign: 'center',
lineHeight: fontSize(22),
fontWeight: '500',
},
modalCancelButtonsContainer: {
flexDirection: 'row',
justifyContent: 'space-between',
width: '100%',
marginTop: 24,
},
modalCancelActionButton: {
flex: 1,
height: 44,
borderRadius: 22,
justifyContent: 'center',
alignItems: 'center',
marginHorizontal: 8,
},
modalCancelButtonOutline: {
backgroundColor: '#F5F5F5',
},
modalCancelButtonFilled: {
backgroundColor: '#FF5100',
},
modalCancelButtonOutlineText: {
fontSize: fontSize(16),
color: '#666',
fontWeight: '600',
},
modalCancelButtonFilledText: {
fontSize: fontSize(16),
color: '#FFF',
fontWeight: '600',
},
});

83
app/services/api/orders.ts

@ -349,6 +349,85 @@ export interface UpdateOrderPaymentMethod {
shipping_fee: number;
domestic_shipping_fee: number;
}
interface OrderItemCancel {
offer_id: string;
cart_item_id: number;
sku_id: string;
spec_id: string;
product_name: string;
product_name_en: string;
product_name_fr: string;
product_name_ar: string;
product_name_invoice: string;
product_image: string;
product_images: string;
material: string;
product_link: string;
source_data: string;
sku_attributes: Record<string, any>[];
sku_image: string;
sku_key_name: string;
sku_key_name_cn: string;
category_id: string;
category_name: string;
supplier_name: string;
is_live_stream_product: number;
quantity: number;
unit_price: number;
total_price: number;
unit_volume: number;
unit_weight: number;
order_item_id: string;
order_no: string;
create_time: string;
update_time: string;
}
export interface OrderCancelResponse {
user_id: number;
total_amount: number;
actual_amount: number;
exchange_rate: number;
discount_amount: number;
shipping_fee: number;
domestic_shipping_fee: number;
currency: string;
payment_method: string;
transaction_id: string;
pay_status: number;
order_status: number;
shipping_status: number;
address_id: number;
receiver_name: string;
receiver_phone: string;
whatsapp_number: string;
receiver_address: string;
receiver_country: string;
shipping_no: string;
shipping_type: number;
shipping_company: string;
shipping_url: string;
total_weight: number;
total_volume: number;
total_packages: number;
buyer_message: string;
pay_time: string;
shipping_time: string;
complete_time: string;
coupon_id: number;
gold_coins_deducted: number;
vip_info: string;
verification_code: string;
verification_time: string;
sensitive_goods_flag: number;
update_time: string;
order_id: string;
order_no: string;
items: OrderItemCancel[];
create_time: string;
}
export const ordersApi = {
// 获得订单预览信息
getOrders: (data: OrderPreviewData) =>
@ -401,4 +480,8 @@ export const ordersApi = {
// 修改支付方式
updateOrderPaymentMethod: (data: UpdateOrderPaymentMethod) =>
apiService.put<void>(`/api/orders/edit/`, data),
// 取消订单
cancelOrder: (order_id: string) =>
apiService.post<OrderCancelResponse>(`/api/orders/${order_id}/cancel/`),
};

534
yarn.lock

@ -31,6 +31,13 @@
"@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3"
chokidar "^3.6.0"
"@babel/code-frame@7.10.4", "@babel/code-frame@~7.10.4":
version "7.10.4"
resolved "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.10.4.tgz"
integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==
dependencies:
"@babel/highlight" "^7.10.4"
"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.24.7", "@babel/code-frame@^7.27.1":
version "7.27.1"
resolved "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.27.1.tgz"
@ -40,20 +47,6 @@
js-tokens "^4.0.0"
picocolors "^1.1.1"
"@babel/code-frame@~7.10.4":
version "7.10.4"
resolved "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.10.4.tgz"
integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==
dependencies:
"@babel/highlight" "^7.10.4"
"@babel/code-frame@7.10.4":
version "7.10.4"
resolved "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.10.4.tgz"
integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==
dependencies:
"@babel/highlight" "^7.10.4"
"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.27.2":
version "7.27.2"
resolved "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.27.2.tgz"
@ -1418,7 +1411,7 @@
json5 "^2.2.3"
write-file-atomic "^2.3.0"
"@expo/metro-config@~0.19.12", "@expo/metro-config@0.19.12":
"@expo/metro-config@0.19.12", "@expo/metro-config@~0.19.12":
version "0.19.12"
resolved "https://registry.npmmirror.com/@expo/metro-config/-/metro-config-0.19.12.tgz"
integrity sha512-fhT3x1ikQWHpZgw7VrEghBdscFPz1laRYa8WcVRB18nTTqorF6S8qPYslkJu1faEziHZS7c2uyDzTYnrg/CKbg==
@ -1825,7 +1818,7 @@
"@nodelib/fs.stat" "2.0.5"
run-parallel "^1.1.9"
"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5":
"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
version "2.0.5"
resolved "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
@ -2243,15 +2236,23 @@
hermes-parser "0.23.1"
nullthrows "^1.1.1"
"@react-native/normalize-colors@0.76.9":
version "0.76.9"
resolved "https://registry.npmmirror.com/@react-native/normalize-colors/-/normalize-colors-0.76.9.tgz"
integrity sha512-TUdMG2JGk72M9d8DYbubdOlrzTYjw+YMe/xOnLU4viDgWRHsCbtRS9x0IAxRjs3amj/7zmK3Atm8jUPvdAc8qw==
"@react-native/normalize-colors@^0.74.1":
version "0.74.89"
resolved "https://registry.npmmirror.com/@react-native/normalize-colors/-/normalize-colors-0.74.89.tgz"
integrity sha512-qoMMXddVKVhZ8PA1AbUCk83trpd6N+1nF2A6k1i6LsQObyS92fELuk8kU/lQs6M7BsMHwqyLCpQJ1uFgNvIQXg==
"@react-native/normalize-colors@0.76.9":
"@react-native/virtualized-lists@0.76.9":
version "0.76.9"
resolved "https://registry.npmmirror.com/@react-native/normalize-colors/-/normalize-colors-0.76.9.tgz"
integrity sha512-TUdMG2JGk72M9d8DYbubdOlrzTYjw+YMe/xOnLU4viDgWRHsCbtRS9x0IAxRjs3amj/7zmK3Atm8jUPvdAc8qw==
resolved "https://registry.npmmirror.com/@react-native/virtualized-lists/-/virtualized-lists-0.76.9.tgz"
integrity sha512-2neUfZKuqMK2LzfS8NyOWOyWUJOWgDym5fUph6fN9qF+LNPjAvnc4Zr9+o+59qjNu/yXwQgVMWNU4+8WJuPVWw==
dependencies:
invariant "^2.2.4"
nullthrows "^1.1.1"
"@react-native/virtualized-lists@^0.72.4":
version "0.72.8"
@ -2261,14 +2262,6 @@
invariant "^2.2.4"
nullthrows "^1.1.1"
"@react-native/virtualized-lists@0.76.9":
version "0.76.9"
resolved "https://registry.npmmirror.com/@react-native/virtualized-lists/-/virtualized-lists-0.76.9.tgz"
integrity sha512-2neUfZKuqMK2LzfS8NyOWOyWUJOWgDym5fUph6fN9qF+LNPjAvnc4Zr9+o+59qjNu/yXwQgVMWNU4+8WJuPVWw==
dependencies:
invariant "^2.2.4"
nullthrows "^1.1.1"
"@react-navigation/bottom-tabs@^6.5.11":
version "6.6.1"
resolved "https://registry.npmmirror.com/@react-navigation/bottom-tabs/-/bottom-tabs-6.6.1.tgz"
@ -2591,14 +2584,7 @@
resolved "https://registry.npmmirror.com/@types/prop-types/-/prop-types-15.7.14.tgz"
integrity sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==
"@types/ramda@^0.27.40":
version "0.27.66"
resolved "https://registry.npmmirror.com/@types/ramda/-/ramda-0.27.66.tgz"
integrity sha512-i2YW+E2U6NfMt3dp0RxNcejox+bxJUNDjB7BpYuRuoHIzv5juPHkJkNgcUOu+YSQEmaWu8cnAo/8r63C0NnuVA==
dependencies:
ts-toolbelt "^6.15.1"
"@types/ramda@^0.27.44":
"@types/ramda@^0.27.40", "@types/ramda@^0.27.44":
version "0.27.66"
resolved "https://registry.npmmirror.com/@types/ramda/-/ramda-0.27.66.tgz"
integrity sha512-i2YW+E2U6NfMt3dp0RxNcejox+bxJUNDjB7BpYuRuoHIzv5juPHkJkNgcUOu+YSQEmaWu8cnAo/8r63C0NnuVA==
@ -2909,14 +2895,7 @@ ansi-regex@^6.0.1:
resolved "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.1.0.tgz"
integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==
ansi-styles@^3.2.0:
version "3.2.1"
resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz"
integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
dependencies:
color-convert "^1.9.0"
ansi-styles@^3.2.1:
ansi-styles@^3.2.0, ansi-styles@^3.2.1:
version "3.2.1"
resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz"
integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
@ -3197,6 +3176,13 @@ babel-plugin-react-native-web@~0.19.13:
resolved "https://registry.npmmirror.com/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.19.13.tgz"
integrity sha512-4hHoto6xaN23LCyZgL9LJZc3olmAxd7b6jDzlZnKXAh4rRAbZRKNBJoOOdp46OBqgy+K0t0guTj5/mhA8inymQ==
babel-plugin-syntax-hermes-parser@0.25.1, babel-plugin-syntax-hermes-parser@^0.25.1:
version "0.25.1"
resolved "https://registry.npmmirror.com/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.25.1.tgz"
integrity sha512-IVNpGzboFLfXZUAwkLFcI/bnqVbwky0jP3eBno4HKtqvQJAHBLdgxiG6lQ4to0+Q/YCN3PO0od5NZwIKyY4REQ==
dependencies:
hermes-parser "0.25.1"
babel-plugin-syntax-hermes-parser@^0.23.1:
version "0.23.1"
resolved "https://registry.npmmirror.com/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.23.1.tgz"
@ -3204,13 +3190,6 @@ babel-plugin-syntax-hermes-parser@^0.23.1:
dependencies:
hermes-parser "0.23.1"
babel-plugin-syntax-hermes-parser@^0.25.1, babel-plugin-syntax-hermes-parser@0.25.1:
version "0.25.1"
resolved "https://registry.npmmirror.com/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.25.1.tgz"
integrity sha512-IVNpGzboFLfXZUAwkLFcI/bnqVbwky0jP3eBno4HKtqvQJAHBLdgxiG6lQ4to0+Q/YCN3PO0od5NZwIKyY4REQ==
dependencies:
hermes-parser "0.25.1"
babel-plugin-transform-flow-enums@^0.0.2:
version "0.0.2"
resolved "https://registry.npmmirror.com/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz"
@ -3362,13 +3341,6 @@ bplist-creator@0.1.0:
dependencies:
stream-buffers "2.2.x"
bplist-parser@^0.3.1:
version "0.3.2"
resolved "https://registry.npmmirror.com/bplist-parser/-/bplist-parser-0.3.2.tgz"
integrity sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==
dependencies:
big-integer "1.6.x"
bplist-parser@0.3.1:
version "0.3.1"
resolved "https://registry.npmmirror.com/bplist-parser/-/bplist-parser-0.3.1.tgz"
@ -3376,6 +3348,13 @@ bplist-parser@0.3.1:
dependencies:
big-integer "1.6.x"
bplist-parser@^0.3.1:
version "0.3.2"
resolved "https://registry.npmmirror.com/bplist-parser/-/bplist-parser-0.3.2.tgz"
integrity sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==
dependencies:
big-integer "1.6.x"
brace-expansion@^1.1.7:
version "1.1.11"
resolved "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz"
@ -3526,12 +3505,7 @@ callsites@^3.0.0:
resolved "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz"
integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
camelcase@^5.0.0:
version "5.3.1"
resolved "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz"
integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
camelcase@^5.3.1:
camelcase@^5.0.0, camelcase@^5.3.1:
version "5.3.1"
resolved "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz"
integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
@ -3551,16 +3525,7 @@ caniuse-lite@^1.0.30001716:
resolved "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001718.tgz"
integrity sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==
chalk@^2.0.1:
version "2.4.2"
resolved "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz"
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
dependencies:
ansi-styles "^3.2.1"
escape-string-regexp "^1.0.5"
supports-color "^5.3.0"
chalk@^2.4.2:
chalk@^2.0.1, chalk@^2.4.2:
version "2.4.2"
resolved "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz"
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
@ -3657,12 +3622,7 @@ ci-info@^2.0.0:
resolved "https://registry.npmmirror.com/ci-info/-/ci-info-2.0.0.tgz"
integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
ci-info@^3.2.0:
version "3.9.0"
resolved "https://registry.npmmirror.com/ci-info/-/ci-info-3.9.0.tgz"
integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==
ci-info@^3.3.0:
ci-info@^3.2.0, ci-info@^3.3.0:
version "3.9.0"
resolved "https://registry.npmmirror.com/ci-info/-/ci-info-3.9.0.tgz"
integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==
@ -3751,16 +3711,16 @@ color-convert@^2.0.1:
dependencies:
color-name "~1.1.4"
color-name@^1.0.0, color-name@~1.1.4:
version "1.1.4"
resolved "https://registry.npmmirror.com/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.npmmirror.com/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.npmmirror.com/color-name/-/color-name-1.1.4.tgz"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
color-string@^1.6.0, color-string@^1.9.0:
version "1.9.1"
resolved "https://registry.npmmirror.com/color-string/-/color-string-1.9.1.tgz"
@ -3802,12 +3762,7 @@ command-exists@^1.2.8:
resolved "https://registry.npmmirror.com/command-exists/-/command-exists-1.2.9.tgz"
integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==
commander@^12.0.0:
version "12.1.0"
resolved "https://registry.npmmirror.com/commander/-/commander-12.1.0.tgz"
integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==
commander@^12.1.0:
commander@^12.0.0, commander@^12.1.0:
version "12.1.0"
resolved "https://registry.npmmirror.com/commander/-/commander-12.1.0.tgz"
integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==
@ -4097,47 +4052,26 @@ dayjs@^1.8.15:
resolved "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz"
integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==
debug@^2.2.0:
version "2.6.9"
resolved "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz"
integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
dependencies:
ms "2.0.0"
debug@^2.6.9:
debug@2.6.9, debug@^2.2.0, debug@^2.6.9:
version "2.6.9"
resolved "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz"
integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
dependencies:
ms "2.0.0"
debug@^3.1.0:
version "3.2.7"
resolved "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz"
integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
dependencies:
ms "^2.1.1"
debug@^3.2.7:
version "3.2.7"
resolved "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz"
integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
dependencies:
ms "^2.1.1"
debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@4:
debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5:
version "4.4.1"
resolved "https://registry.npmmirror.com/debug/-/debug-4.4.1.tgz"
integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==
dependencies:
ms "^2.1.3"
debug@2.6.9:
version "2.6.9"
resolved "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz"
integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
debug@^3.1.0, debug@^3.2.7:
version "3.2.7"
resolved "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz"
integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
dependencies:
ms "2.0.0"
ms "^2.1.1"
decamelize@^1.2.0:
version "1.2.0"
@ -4421,12 +4355,7 @@ entities@^3.0.1:
resolved "https://registry.npmmirror.com/entities/-/entities-3.0.1.tgz"
integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==
entities@^4.2.0:
version "4.5.0"
resolved "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz"
integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
entities@^4.4.0:
entities@^4.2.0, entities@^4.4.0:
version "4.5.0"
resolved "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz"
integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
@ -5100,7 +5029,7 @@ fast-glob@^3.2.5, fast-glob@^3.2.9, fast-glob@^3.3.2:
merge2 "^1.3.0"
micromatch "^4.0.8"
fast-json-stable-stringify@^2.1.0, fast-json-stable-stringify@2.x:
fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.1.0:
version "2.1.0"
resolved "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz"
integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
@ -5288,26 +5217,17 @@ fresh@0.5.2:
resolved "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz"
integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==
fs-extra@^8.1.0:
version "8.1.0"
resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-8.1.0.tgz"
integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==
dependencies:
graceful-fs "^4.2.0"
jsonfile "^4.0.0"
universalify "^0.1.0"
fs-extra@^9.0.0, fs-extra@^9.1.0:
version "9.1.0"
resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz"
integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==
fs-extra@9.0.0:
version "9.0.0"
resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.0.0.tgz"
integrity sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==
dependencies:
at-least-node "^1.0.0"
graceful-fs "^4.2.0"
jsonfile "^6.0.1"
universalify "^2.0.0"
universalify "^1.0.0"
fs-extra@~8.1.0:
fs-extra@^8.1.0, fs-extra@~8.1.0:
version "8.1.0"
resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-8.1.0.tgz"
integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==
@ -5316,15 +5236,15 @@ fs-extra@~8.1.0:
jsonfile "^4.0.0"
universalify "^0.1.0"
fs-extra@9.0.0:
version "9.0.0"
resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.0.0.tgz"
integrity sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==
fs-extra@^9.0.0, fs-extra@^9.1.0:
version "9.1.0"
resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz"
integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==
dependencies:
at-least-node "^1.0.0"
graceful-fs "^4.2.0"
jsonfile "^6.0.1"
universalify "^1.0.0"
universalify "^2.0.0"
fs-minipass@^2.0.0:
version "2.1.0"
@ -5468,43 +5388,7 @@ glob@^10.2.2, glob@^10.3.10, glob@^10.4.2:
package-json-from-dist "^1.0.0"
path-scurry "^1.11.1"
glob@^7.1.1:
version "7.2.3"
resolved "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz"
integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
dependencies:
fs.realpath "^1.0.0"
inflight "^1.0.4"
inherits "2"
minimatch "^3.1.1"
once "^1.3.0"
path-is-absolute "^1.0.0"
glob@^7.1.3:
version "7.2.3"
resolved "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz"
integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
dependencies:
fs.realpath "^1.0.0"
inflight "^1.0.4"
inherits "2"
minimatch "^3.1.1"
once "^1.3.0"
path-is-absolute "^1.0.0"
glob@^7.1.4:
version "7.2.3"
resolved "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz"
integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
dependencies:
fs.realpath "^1.0.0"
inflight "^1.0.4"
inherits "2"
minimatch "^3.1.1"
once "^1.3.0"
path-is-absolute "^1.0.0"
glob@^7.2.0:
glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.2.0:
version "7.2.3"
resolved "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz"
integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
@ -5791,7 +5675,7 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@2, inherits@2.0.4:
inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3:
version "2.0.4"
resolved "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@ -5826,7 +5710,7 @@ internal-slot@^1.1.0:
hasown "^2.0.2"
side-channel "^1.1.0"
invariant@^2.2.4, invariant@2.2.4:
invariant@2.2.4, invariant@^2.2.4:
version "2.2.4"
resolved "https://registry.npmmirror.com/invariant/-/invariant-2.2.4.tgz"
integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
@ -6597,11 +6481,56 @@ lighthouse-logger@^1.0.0:
debug "^2.6.9"
marky "^1.2.2"
lightningcss-darwin-arm64@1.27.0:
version "1.27.0"
resolved "https://registry.npmmirror.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.27.0.tgz#565bd610533941cba648a70e105987578d82f996"
integrity sha512-Gl/lqIXY+d+ySmMbgDf0pgaWSqrWYxVHoc88q+Vhf2YNzZ8DwoRzGt5NZDVqqIW5ScpSnmmjcgXP87Dn2ylSSQ==
lightningcss-darwin-x64@1.27.0:
version "1.27.0"
resolved "https://registry.npmmirror.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.27.0.tgz"
integrity sha512-0+mZa54IlcNAoQS9E0+niovhyjjQWEMrwW0p2sSdLRhLDc8LMQ/b67z7+B5q4VmjYCMSfnFi3djAAQFIDuj/Tg==
lightningcss-freebsd-x64@1.27.0:
version "1.27.0"
resolved "https://registry.npmmirror.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.27.0.tgz#a7c3c4d6ee18dffeb8fa69f14f8f9267f7dc0c34"
integrity sha512-n1sEf85fePoU2aDN2PzYjoI8gbBqnmLGEhKq7q0DKLj0UTVmOTwDC7PtLcy/zFxzASTSBlVQYJUhwIStQMIpRA==
lightningcss-linux-arm-gnueabihf@1.27.0:
version "1.27.0"
resolved "https://registry.npmmirror.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.27.0.tgz#c7c16432a571ec877bf734fe500e4a43d48c2814"
integrity sha512-MUMRmtdRkOkd5z3h986HOuNBD1c2lq2BSQA1Jg88d9I7bmPGx08bwGcnB75dvr17CwxjxD6XPi3Qh8ArmKFqCA==
lightningcss-linux-arm64-gnu@1.27.0:
version "1.27.0"
resolved "https://registry.npmmirror.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.27.0.tgz#cfd9e18df1cd65131da286ddacfa3aee6862a752"
integrity sha512-cPsxo1QEWq2sfKkSq2Bq5feQDHdUEwgtA9KaB27J5AX22+l4l0ptgjMZZtYtUnteBofjee+0oW1wQ1guv04a7A==
lightningcss-linux-arm64-musl@1.27.0:
version "1.27.0"
resolved "https://registry.npmmirror.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.27.0.tgz#6682ff6b9165acef9a6796bd9127a8e1247bb0ed"
integrity sha512-rCGBm2ax7kQ9pBSeITfCW9XSVF69VX+fm5DIpvDZQl4NnQoMQyRwhZQm9pd59m8leZ1IesRqWk2v/DntMo26lg==
lightningcss-linux-x64-gnu@1.27.0:
version "1.27.0"
resolved "https://registry.npmmirror.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.27.0.tgz#714221212ad184ddfe974bbb7dbe9300dfde4bc0"
integrity sha512-Dk/jovSI7qqhJDiUibvaikNKI2x6kWPN79AQiD/E/KeQWMjdGe9kw51RAgoWFDi0coP4jinaH14Nrt/J8z3U4A==
lightningcss-linux-x64-musl@1.27.0:
version "1.27.0"
resolved "https://registry.npmmirror.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.27.0.tgz#247958daf622a030a6dc2285afa16b7184bdf21e"
integrity sha512-QKjTxXm8A9s6v9Tg3Fk0gscCQA1t/HMoF7Woy1u68wCk5kS4fR+q3vXa1p3++REW784cRAtkYKrPy6JKibrEZA==
lightningcss-win32-arm64-msvc@1.27.0:
version "1.27.0"
resolved "https://registry.npmmirror.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.27.0.tgz#64cfe473c264ef5dc275a4d57a516d77fcac6bc9"
integrity sha512-/wXegPS1hnhkeG4OXQKEMQeJd48RDC3qdh+OA8pCuOPCyvnm/yEayrJdJVqzBsqpy1aJklRCVxscpFur80o6iQ==
lightningcss-win32-x64-msvc@1.27.0:
version "1.27.0"
resolved "https://registry.npmmirror.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.27.0.tgz#237d0dc87d9cdc9cf82536bcbc07426fa9f3f422"
integrity sha512-/OJLj94Zm/waZShL8nB5jsNj3CfNATLCTyFxZyouilfTmSoLDX7VlVAmhPHoZWVFp4vdmoiEbPEYC8HID3m6yw==
lightningcss@~1.27.0:
version "1.27.0"
resolved "https://registry.npmmirror.com/lightningcss/-/lightningcss-1.27.0.tgz"
@ -6836,7 +6765,7 @@ metro-cache@0.81.5:
flow-enums-runtime "^0.0.6"
metro-core "0.81.5"
metro-config@^0.81.0, metro-config@0.81.5:
metro-config@0.81.5, metro-config@^0.81.0:
version "0.81.5"
resolved "https://registry.npmmirror.com/metro-config/-/metro-config-0.81.5.tgz"
integrity sha512-oDRAzUvj6RNRxratFdcVAqtAsg+T3qcKrGdqGZFUdwzlFJdHGR9Z413sW583uD2ynsuOjA2QB6US8FdwiBdNKg==
@ -6850,7 +6779,7 @@ metro-config@^0.81.0, metro-config@0.81.5:
metro-core "0.81.5"
metro-runtime "0.81.5"
metro-core@^0.81.0, metro-core@0.81.5:
metro-core@0.81.5, metro-core@^0.81.0:
version "0.81.5"
resolved "https://registry.npmmirror.com/metro-core/-/metro-core-0.81.5.tgz"
integrity sha512-+2R0c8ByfV2N7CH5wpdIajCWa8escUFd8TukfoXyBq/vb6yTCsznoA25FhNXJ+MC/cz1L447Zj3vdUfCXIZBwg==
@ -6889,7 +6818,7 @@ metro-resolver@0.81.5:
dependencies:
flow-enums-runtime "^0.0.6"
metro-runtime@^0.81.0, metro-runtime@0.81.5:
metro-runtime@0.81.5, metro-runtime@^0.81.0:
version "0.81.5"
resolved "https://registry.npmmirror.com/metro-runtime/-/metro-runtime-0.81.5.tgz"
integrity sha512-M/Gf71ictUKP9+77dV/y8XlAWg7xl76uhU7ggYFUwEdOHHWPG6gLBr1iiK0BmTjPFH8yRo/xyqMli4s3oGorPQ==
@ -6897,7 +6826,7 @@ metro-runtime@^0.81.0, metro-runtime@0.81.5:
"@babel/runtime" "^7.25.0"
flow-enums-runtime "^0.0.6"
metro-source-map@^0.81.0, metro-source-map@0.81.5:
metro-source-map@0.81.5, metro-source-map@^0.81.0:
version "0.81.5"
resolved "https://registry.npmmirror.com/metro-source-map/-/metro-source-map-0.81.5.tgz"
integrity sha512-Jz+CjvCKLNbJZYJTBeN3Kq9kIJf6b61MoLBdaOQZJ5Ajhw6Pf95Nn21XwA8BwfUYgajsi6IXsp/dTZsYJbN00Q==
@ -6956,7 +6885,7 @@ metro-transform-worker@0.81.5:
metro-transform-plugins "0.81.5"
nullthrows "^1.1.1"
metro@^0.81.0, metro@0.81.5:
metro@0.81.5, metro@^0.81.0:
version "0.81.5"
resolved "https://registry.npmmirror.com/metro/-/metro-0.81.5.tgz"
integrity sha512-YpFF0DDDpDVygeca2mAn7K0+us+XKmiGk4rIYMz/CRdjFoCGqAei/IQSpV0UrGfQbToSugpMQeQJveaWSH88Hg==
@ -7010,16 +6939,16 @@ micromatch@^4.0.4, micromatch@^4.0.8:
braces "^3.0.3"
picomatch "^2.3.1"
"mime-db@>= 1.43.0 < 2":
version "1.54.0"
resolved "https://registry.npmmirror.com/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.npmmirror.com/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.npmmirror.com/mime-db/-/mime-db-1.54.0.tgz"
integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==
mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.35, mime-types@~2.1.24, mime-types@~2.1.34:
version "2.1.35"
resolved "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz"
@ -7027,16 +6956,16 @@ mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.35, mime-types@~2.1.24,
dependencies:
mime-db "1.52.0"
mime@^2.4.1:
version "2.6.0"
resolved "https://registry.npmmirror.com/mime/-/mime-2.6.0.tgz"
integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==
mime@1.6.0:
version "1.6.0"
resolved "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz"
integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
mime@^2.4.1:
version "2.6.0"
resolved "https://registry.npmmirror.com/mime/-/mime-2.6.0.tgz"
integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==
mimic-fn@^1.0.0:
version "1.2.0"
resolved "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-1.2.0.tgz"
@ -7059,14 +6988,7 @@ minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2:
dependencies:
brace-expansion "^1.1.7"
minimatch@^9.0.4:
version "9.0.5"
resolved "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz"
integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==
dependencies:
brace-expansion "^2.0.1"
minimatch@^9.0.5:
minimatch@^9.0.4, minimatch@^9.0.5:
version "9.0.5"
resolved "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz"
integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==
@ -7106,16 +7028,16 @@ minipass@^3.0.0:
dependencies:
yallist "^4.0.0"
"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.3, minipass@^7.1.2:
version "7.1.2"
resolved "https://registry.npmmirror.com/minipass/-/minipass-7.1.2.tgz"
integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==
minipass@^5.0.0:
version "5.0.0"
resolved "https://registry.npmmirror.com/minipass/-/minipass-5.0.0.tgz"
integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==
"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.3, minipass@^7.1.2:
version "7.1.2"
resolved "https://registry.npmmirror.com/minipass/-/minipass-7.1.2.tgz"
integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==
minizlib@^2.1.1:
version "2.1.2"
resolved "https://registry.npmmirror.com/minizlib/-/minizlib-2.1.2.tgz"
@ -7131,26 +7053,21 @@ mkdirp@^0.5.1:
dependencies:
minimist "^1.2.6"
mkdirp@^1.0.3:
mkdirp@^1.0.3, mkdirp@^1.0.4:
version "1.0.4"
resolved "https://registry.npmmirror.com/mkdirp/-/mkdirp-1.0.4.tgz"
integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
mkdirp@^1.0.4:
version "1.0.4"
resolved "https://registry.npmmirror.com/mkdirp/-/mkdirp-1.0.4.tgz"
integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
ms@^2.1.1, ms@^2.1.3, ms@2.1.3:
version "2.1.3"
resolved "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
ms@2.0.0:
version "2.0.0"
resolved "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz"
integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
ms@2.1.3, ms@^2.1.1, ms@^2.1.3:
version "2.1.3"
resolved "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
mz@^2.7.0:
version "2.7.0"
resolved "https://registry.npmmirror.com/mz/-/mz-2.7.0.tgz"
@ -7170,16 +7087,16 @@ natural-compare@^1.4.0:
resolved "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz"
integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
negotiator@~0.6.4:
version "0.6.4"
resolved "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.4.tgz"
integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==
negotiator@0.6.3:
version "0.6.3"
resolved "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz"
integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
negotiator@~0.6.4:
version "0.6.4"
resolved "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.4.tgz"
integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==
neo-async@^2.5.0, neo-async@^2.6.1:
version "2.6.2"
resolved "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz"
@ -7361,13 +7278,6 @@ object.values@^1.1.6, object.values@^1.2.0, object.values@^1.2.1:
define-properties "^1.2.1"
es-object-atoms "^1.0.0"
on-finished@~2.3.0:
version "2.3.0"
resolved "https://registry.npmmirror.com/on-finished/-/on-finished-2.3.0.tgz"
integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==
dependencies:
ee-first "1.1.1"
on-finished@2.4.1:
version "2.4.1"
resolved "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz"
@ -7375,6 +7285,13 @@ on-finished@2.4.1:
dependencies:
ee-first "1.1.1"
on-finished@~2.3.0:
version "2.3.0"
resolved "https://registry.npmmirror.com/on-finished/-/on-finished-2.3.0.tgz"
integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==
dependencies:
ee-first "1.1.1"
on-headers@~1.0.2:
version "1.0.2"
resolved "https://registry.npmmirror.com/on-headers/-/on-headers-1.0.2.tgz"
@ -7473,14 +7390,7 @@ p-limit@^2.0.0, p-limit@^2.2.0:
dependencies:
p-try "^2.0.0"
p-limit@^3.0.2:
version "3.1.0"
resolved "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz"
integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
dependencies:
yocto-queue "^0.1.0"
p-limit@^3.1.0:
p-limit@^3.0.2, p-limit@^3.1.0:
version "3.1.0"
resolved "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz"
integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
@ -7594,12 +7504,7 @@ path-key@^2.0.0, path-key@^2.0.1:
resolved "https://registry.npmmirror.com/path-key/-/path-key-2.0.1.tgz"
integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==
path-key@^3.0.0:
version "3.1.1"
resolved "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz"
integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
path-key@^3.1.0:
path-key@^3.0.0, path-key@^3.1.0:
version "3.1.1"
resolved "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz"
integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
@ -8417,7 +8322,7 @@ safe-array-concat@^1.1.3:
has-symbols "^1.1.0"
isarray "^2.0.5"
safe-buffer@~5.2.0, safe-buffer@5.2.1:
safe-buffer@5.2.1, safe-buffer@~5.2.0:
version "5.2.1"
resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
@ -8456,6 +8361,13 @@ saxes@^6.0.0:
dependencies:
xmlchars "^2.2.0"
scheduler@0.24.0-canary-efb381bbf-20230505:
version "0.24.0-canary-efb381bbf-20230505"
resolved "https://registry.npmmirror.com/scheduler/-/scheduler-0.24.0-canary-efb381bbf-20230505.tgz"
integrity sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA==
dependencies:
loose-envify "^1.1.0"
scheduler@^0.23.2:
version "0.23.2"
resolved "https://registry.npmmirror.com/scheduler/-/scheduler-0.23.2.tgz"
@ -8468,13 +8380,6 @@ scheduler@^0.25.0:
resolved "https://registry.npmmirror.com/scheduler/-/scheduler-0.25.0.tgz"
integrity sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==
scheduler@0.24.0-canary-efb381bbf-20230505:
version "0.24.0-canary-efb381bbf-20230505"
resolved "https://registry.npmmirror.com/scheduler/-/scheduler-0.24.0-canary-efb381bbf-20230505.tgz"
integrity sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA==
dependencies:
loose-envify "^1.1.0"
selfsigned@^2.4.1:
version "2.4.1"
resolved "https://registry.npmmirror.com/selfsigned/-/selfsigned-2.4.1.tgz"
@ -8483,50 +8388,30 @@ selfsigned@^2.4.1:
"@types/node-forge" "^1.3.0"
node-forge "^1"
semver@^5.3.0:
version "5.7.2"
resolved "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz"
integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
semver@^5.5.0:
version "5.7.2"
resolved "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz"
integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
semver@7.x, semver@^7.1.3, semver@^7.3.5, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.3:
version "7.7.2"
resolved "https://registry.npmmirror.com/semver/-/semver-7.7.2.tgz"
integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==
semver@^5.6.0:
semver@^5.3.0, semver@^5.5.0, semver@^5.6.0:
version "5.7.2"
resolved "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz"
integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
semver@^6.1.0:
version "6.3.1"
resolved "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz"
integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
semver@^6.3.0:
version "6.3.1"
resolved "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz"
integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
semver@^6.3.1:
semver@^6.1.0, semver@^6.3.0, semver@^6.3.1:
version "6.3.1"
resolved "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz"
integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
semver@^7.1.3, semver@^7.3.5, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.3, semver@7.x:
version "7.7.2"
resolved "https://registry.npmmirror.com/semver/-/semver-7.7.2.tgz"
integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==
send@^0.19.0:
version "0.19.1"
resolved "https://registry.npmmirror.com/send/-/send-0.19.1.tgz"
integrity sha512-p4rRk4f23ynFEfcD9LA0xRYngj+IyGiEYyqqOak8kaN0TvNmuxC2dcVeBn62GpCeR2CpWqyHCNScTP91QbAVFg==
send@0.19.0:
version "0.19.0"
resolved "https://registry.npmmirror.com/send/-/send-0.19.0.tgz"
integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==
dependencies:
debug "2.6.9"
depd "2.0.0"
destroy "1.2.0"
encodeurl "~2.0.0"
encodeurl "~1.0.2"
escape-html "~1.0.3"
etag "~1.8.1"
fresh "0.5.2"
@ -8537,15 +8422,15 @@ send@^0.19.0:
range-parser "~1.2.1"
statuses "2.0.1"
send@0.19.0:
version "0.19.0"
resolved "https://registry.npmmirror.com/send/-/send-0.19.0.tgz"
integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==
send@^0.19.0:
version "0.19.1"
resolved "https://registry.npmmirror.com/send/-/send-0.19.1.tgz"
integrity sha512-p4rRk4f23ynFEfcD9LA0xRYngj+IyGiEYyqqOak8kaN0TvNmuxC2dcVeBn62GpCeR2CpWqyHCNScTP91QbAVFg==
dependencies:
debug "2.6.9"
depd "2.0.0"
destroy "1.2.0"
encodeurl "~1.0.2"
encodeurl "~2.0.0"
escape-html "~1.0.3"
etag "~1.8.1"
fresh "0.5.2"
@ -8779,6 +8664,11 @@ source-map-support@^0.5.16, source-map-support@~0.5.20, source-map-support@~0.5.
buffer-from "^1.0.0"
source-map "^0.6.0"
source-map@0.5.6:
version "0.5.6"
resolved "https://registry.npmmirror.com/source-map/-/source-map-0.5.6.tgz"
integrity sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==
source-map@^0.5.6:
version "0.5.7"
resolved "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz"
@ -8789,11 +8679,6 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
resolved "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
source-map@0.5.6:
version "0.5.6"
resolved "https://registry.npmmirror.com/source-map/-/source-map-0.5.6.tgz"
integrity sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==
split-on-first@^1.0.0:
version "1.1.0"
resolved "https://registry.npmmirror.com/split-on-first/-/split-on-first-1.1.0.tgz"
@ -8854,17 +8739,17 @@ stacktrace-parser@^0.1.10:
dependencies:
type-fest "^0.7.1"
statuses@~1.5.0:
version "1.5.0"
resolved "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz"
integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==
statuses@2.0.1:
version "2.0.1"
resolved "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz"
integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
stream-buffers@~2.2.0, stream-buffers@2.2.x:
statuses@~1.5.0:
version "1.5.0"
resolved "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz"
integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==
stream-buffers@2.2.x, stream-buffers@~2.2.0:
version "2.2.0"
resolved "https://registry.npmmirror.com/stream-buffers/-/stream-buffers-2.2.0.tgz"
integrity sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==
@ -8874,13 +8759,6 @@ strict-uri-encode@^2.0.0:
resolved "https://registry.npmmirror.com/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.npmmirror.com/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.npmmirror.com/string-length/-/string-length-4.0.2.tgz"
@ -8983,6 +8861,13 @@ 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.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz"
integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
dependencies:
safe-buffer "~5.2.0"
stringify-entities@^3.1.0:
version "3.1.0"
resolved "https://registry.npmmirror.com/stringify-entities/-/stringify-entities-3.1.0.tgz"
@ -8999,14 +8884,7 @@ stringify-entities@^3.1.0:
dependencies:
ansi-regex "^5.0.1"
strip-ansi@^5.0.0:
version "5.2.0"
resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-5.2.0.tgz"
integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
dependencies:
ansi-regex "^4.1.0"
strip-ansi@^5.2.0:
strip-ansi@^5.0.0, strip-ansi@^5.2.0:
version "5.2.0"
resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-5.2.0.tgz"
integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
@ -9494,7 +9372,7 @@ universalify@^2.0.0:
resolved "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz"
integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==
unpipe@~1.0.0, unpipe@1.0.0:
unpipe@1.0.0, unpipe@~1.0.0:
version "1.0.0"
resolved "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz"
integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==
@ -9579,7 +9457,7 @@ walker@^1.0.7, walker@^1.0.8:
dependencies:
makeerror "1.0.12"
warn-once@^0.1.0, warn-once@0.1.1:
warn-once@0.1.1, warn-once@^0.1.0:
version "0.1.1"
resolved "https://registry.npmmirror.com/warn-once/-/warn-once-0.1.1.tgz"
integrity sha512-VkQZJbO8zVImzYFteBXvBOZEl1qL175WH8VmZcxF2fZAoudNhNDvHi+doCaAEdU2l2vtcIwa2zn0QK5+I1HQ3Q==
@ -9800,22 +9678,12 @@ ws@^6.2.3:
dependencies:
async-limiter "~1.0.0"
ws@^7:
version "7.5.10"
resolved "https://registry.npmmirror.com/ws/-/ws-7.5.10.tgz"
integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==
ws@^7.5.10:
ws@^7, ws@^7.5.10:
version "7.5.10"
resolved "https://registry.npmmirror.com/ws/-/ws-7.5.10.tgz"
integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==
ws@^8.11.0:
version "8.18.2"
resolved "https://registry.npmmirror.com/ws/-/ws-8.18.2.tgz"
integrity sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==
ws@^8.12.1:
ws@^8.11.0, ws@^8.12.1:
version "8.18.2"
resolved "https://registry.npmmirror.com/ws/-/ws-8.18.2.tgz"
integrity sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==

Loading…
Cancel
Save