commit 02d0c807cdaa5669317fe88299f0e3e8024d71b0 Author: imeepos Date: Thu Dec 25 16:25:55 2025 +0800 Initial commit: expo-popcore-app diff --git a/.easignore b/.easignore new file mode 100644 index 0000000..99647a9 --- /dev/null +++ b/.easignore @@ -0,0 +1,31 @@ +# Exclude other apps directories +../apps/* +!../apps/expo-duooomi-app + +# Exclude unused packages from the monorepo +../packages/eslint-config/* +../packages/flowgraph/* +../packages/flowgraph-core/* + +# Exclude root level files that aren't needed for this app +../.agent/ +../.gitea/ +../.vscode/ +../BETTER_AUTH_体系交接文档.md +../CLAUDE.md +../FLOWGRAPH_交接文档.md +../FLOWGRAPH_思维导图.md +../STRIPE_CREDIT_BURNDOWN_交接文档.md +../ai-codegen-guideline.md +../debug-credit-burndown.js +../README.md + +# Exclude development and configuration files +../.gitignore +../.prettierignore +../.prettierrc + +# Only include necessary package management files +!../pnpm-workspace.yaml +!../package.json +!../pnpm-lock.yaml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f8c6c2e --- /dev/null +++ b/.gitignore @@ -0,0 +1,43 @@ +# Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files + +# dependencies +node_modules/ + +# Expo +.expo/ +dist/ +web-build/ +expo-env.d.ts + +# Native +.kotlin/ +*.orig.* +*.jks +*.p8 +*.p12 +*.key +*.mobileprovision + +# Metro +.metro-health-check* + +# debug +npm-debug.* +yarn-debug.* +yarn-error.* + +# macOS +.DS_Store +*.pem + +# local env files +.env*.local + +# typescript +*.tsbuildinfo + +app-example + +# generated native folders +/ios +/android diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..daed817 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,40 @@ +# Dependencies +node_modules/ + +# Build outputs +dist/ +build/ +.expo/ + +# Generated files +*.generated.* +*.d.ts + +# Config files that shouldn't be formatted +.env* +*.log + +# Native files +ios/ +android/ + +# Assets +assets/ +*.png +*.jpg +*.jpeg +*.gif +*.svg +*.ico + +# Documentation +*.md + +# Git +.git/ +.gitignore + + +# Other +coverage/ +.nyc_output/ \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..3078803 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,15 @@ +{ + "singleQuote": true, + "endOfLine": "auto", + "trailingComma": "all", + "printWidth": 100, + "tabWidth": 2, + "semi": false, + "arrowParens": "always", + "bracketSameLine": false, + "bracketSpacing": true, + "jsxSingleQuote": false, + "useTabs": false, + "quoteProps": "as-needed", + "plugins": ["prettier-plugin-tailwindcss"] +} diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..b7ed837 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1 @@ +{ "recommendations": ["expo.vscode-expo-tools"] } diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..e2798e4 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "editor.codeActionsOnSave": { + "source.fixAll": "explicit", + "source.organizeImports": "explicit", + "source.sortMembers": "explicit" + } +} diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..0dc6325 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,102 @@ + + +这是一个expo项目,技术栈 tailwindcss + react native + zustand 状态管理 + + +设计稿宽度是:375px,如果用户发送了样式代码,需要将它转换成tailwindcss + +常用库: + +```tsx +import { mediaDevices, RTCView } from "react-native-webrtc"; +import { Canvas, type CanvasRef } from "react-native-wgpu"; +import { Animated, StyleSheet, Text, View, PixelRatio } from "react-native"; + +export { ErrorBoundary, Stack } from "expo-router"; +import { NativeStackNavigationOptions } from "@react-navigation/native-stack"; +import * as Linking from 'expo-linking'; +import * as WebBrowser from 'expo-web-browser'; +import Constants from 'expo-constants'; +import { Video } from "expo-av"; +import { useFonts } from "expo-font"; +import { VictoryBar, VictoryChart } from "victory-native"; +import "@expo/metro-runtime"; +import * as SQLite from "expo-sqlite"; +import { SafeAreaProvider, SafeAreaView } from "react-native-safe-area-context"; +import { createStore } from "tinybase"; +import { createLocalPersister } from "tinybase/persisters/persister-browser"; +import { createExpoSqlitePersister } from "tinybase/persisters/persister-expo-sqlite"; +import { + Provider, + useAddRowCallback, + useCreatePersister, + useCreateStore, + useDelTableCallback, + useHasTable, + useRow, + useSetCellCallback, + useSortedRowIds, +} from "tinybase/ui-react"; +import { GLView } from "expo-gl"; +import { Renderer, TextureLoader } from "expo-three"; +import { Camera } from "expo-camera"; +import { cameraWithTensors } from '@tensorflow/tfjs-react-native'; +import * as tf from "@tensorflow/tfjs"; +import { + useCssElement, + useNativeVariable as useFunctionalVariable, +} from "react-native-css"; +import Animated from "react-native-reanimated"; +import { useSafeAreaInsets } from "react-native-safe-area-context"; +import styled from "styled-components/native"; +import { handleURLCallback, StripeProvider } from "@stripe/stripe-react-native"; +import type { Stripe } from "stripe"; +import { + SQLiteProvider, + useSQLiteContext, + type SQLiteDatabase, +} from 'expo-sqlite'; +import * as SplashScreen from "expo-splash-screen"; +import { Asset } from "expo-asset"; +import * as Updates from "expo-updates"; +import io from "socket.io-client"; + +``` + +- 状态管理 + +```tsx +import create from "zustand"; + +const initialState = { + items: [], +}; + +export const useStore = create((set, get) => { + return Object.assign(initialState, { + items: [], + addItem(text) { + const items = get().items; + set({ items: [...items, { text, id: Math.random() }] }); + }, + }); +}); + +export function useReset() { + useStore.setState(initialState); +} +``` + +```tsx +import shallow from "zustand/shallow"; +import { useReset, useStore } from "./store"; +const { items, addItem } = useStore( + ({ addItem, items }) => ({ + items, + addItem, + }), + shallow +); + + + + + {isLogin ? t("authForm.noAccountRegister") : t("authForm.haveAccountLogin")} + + + ); +} + +export { useSession }; diff --git a/components/blocks/MediaCarousel.tsx b/components/blocks/MediaCarousel.tsx new file mode 100644 index 0000000..ac92b2e --- /dev/null +++ b/components/blocks/MediaCarousel.tsx @@ -0,0 +1,76 @@ +import { useState } from 'react'; +import { Dimensions, View } from 'react-native'; +import { LinearGradient } from 'expo-linear-gradient'; +import { Carousel, CarouselContent, CarouselItem } from '../ui/carousel'; +import { Media } from '../ui/media'; +import { useResource } from '@/hooks/use-resource'; + +const { width: screenWidth } = Dimensions.get('window'); + +interface MediaCarouselProps { + sources: any[]; + width?: number; + height?: number; + autoPlay?: boolean; + loop?: boolean; +} + +export function MediaCarousel({ + sources, + width = screenWidth, + height = 410, + autoPlay = false, + loop = true, +}: MediaCarouselProps) { + const [current, setCurrent] = useState(0); + + return ( + + + + {sources.map((_source, index) => { + const { source, poster } = useResource(_source, { width: screenWidth }) + return ( + + + + ) + })} + + + + + + + {sources.map((_, index) => ( + + ))} + + + ); +} diff --git a/components/blocks/index.ts b/components/blocks/index.ts new file mode 100644 index 0000000..d3841e8 --- /dev/null +++ b/components/blocks/index.ts @@ -0,0 +1,2 @@ +export { MediaCarousel } from './MediaCarousel'; +export { AuthForm, useSession } from './AuthForm'; diff --git a/components/drawer/AIGenerationRecordDrawer.tsx b/components/drawer/AIGenerationRecordDrawer.tsx new file mode 100644 index 0000000..39a3460 --- /dev/null +++ b/components/drawer/AIGenerationRecordDrawer.tsx @@ -0,0 +1,213 @@ +import { useState, useRef, useMemo, useCallback, useEffect } from 'react' +import { + View, + Text, + StyleSheet, + Pressable, + Dimensions, + FlatList, + Platform, +} from 'react-native' +import { Image } from 'expo-image' +import { useTranslation } from 'react-i18next' +import BottomSheet, { BottomSheetView, BottomSheetBackdrop } from '@gorhom/bottom-sheet' +import { CloseIcon } from '@/components/icon' + +const { width: screenWidth } = Dimensions.get('window') + +type DrawerType = 'ai-record' | 'recent' + +interface AIGenerationRecordDrawerProps { + visible: boolean + onClose: () => void + onSelectImage?: (imageUri: any) => void + type?: DrawerType +} + +// 模拟 AI 生成记录图片数据 +const mockAIRecordImages = Array.from({ length: 12 }, (_, i) => ({ + id: i + 1, + uri: require('@/assets/images/android-icon-background.png'), +})) + +// 模拟最近用过的图片数据 +const mockRecentImages = Array.from({ length: 12 }, (_, i) => ({ + id: i + 1, + uri: require('@/assets/images/membership.png'), +})) + +export default function AIGenerationRecordDrawer({ + visible, + onClose, + onSelectImage, + type = 'ai-record', +}: AIGenerationRecordDrawerProps) { + const { t } = useTranslation() + const bottomSheetRef = useRef(null) + + const snapPoints = useMemo(() => ['98%'], []) + + useEffect(() => { + if (visible) { + bottomSheetRef.current?.expand() + } else { + bottomSheetRef.current?.close() + } + }, [visible]) + + const handleSheetChanges = useCallback((index: number) => { + if (index === -1) { + onClose() + } + }, [onClose]) + + const handleImageSelect = (imageSource: any) => { + onSelectImage?.(imageSource) + onClose() + } + + const title = type === 'ai-record' ? t('aiGenerationRecord.title') : t('aiGenerationRecord.recentUsed') + const images = type === 'ai-record' ? mockAIRecordImages : mockRecentImages + + const renderBackdrop = useCallback( + (props: any) => ( + + ), + [] + ) + + const renderImageItem = ({ item, index }: { item: typeof mockAIRecordImages[0]; index: number }) => { + const gap = 2 + const itemWidth = (screenWidth - gap * 2) / 3 + + return ( + handleImageSelect(item.uri)} + android_ripple={{ color: 'rgba(255, 255, 255, 0.1)' }} + > + + + ) + } + + return ( + + + {/* 顶部标题栏 */} + + {title} + + + + + + {/* 图片网格 */} + item.id.toString()} + numColumns={3} + contentContainerStyle={styles.imageGrid} + showsVerticalScrollIndicator={false} + removeClippedSubviews={Platform.OS === 'android'} + maxToRenderPerBatch={Platform.OS === 'ios' ? 10 : 5} + updateCellsBatchingPeriod={Platform.OS === 'ios' ? 50 : 100} + initialNumToRender={Platform.OS === 'ios' ? 15 : 10} + windowSize={Platform.OS === 'ios' ? 10 : 5} + getItemLayout={(data, index) => { + const gap = 2 + const itemWidth = (screenWidth - gap * 2) / 3 + const rowIndex = Math.floor(index / 3) + return { + length: itemWidth, + offset: rowIndex * (itemWidth + gap), + index, + } + }} + /> + + + ) +} + +const styles = StyleSheet.create({ + bottomSheetBackground: { + backgroundColor: '#16181B', + }, + handleIndicator: { + backgroundColor: '#666666', + }, + container: { + flex: 1, + backgroundColor: '#16181B', + paddingTop: 12, + }, + header: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'center', + paddingHorizontal: 16, + paddingBottom: 12, + position: 'relative', + }, + title: { + color: '#F5F5F5', + fontSize: 15, + fontWeight: '600', + }, + closeButton: { + position: 'absolute', + right: 16, + width: 24, + height: 24, + alignItems: 'center', + justifyContent: 'center', + zIndex: 10, + }, + imageGrid: { + paddingHorizontal: 0, + paddingBottom: Platform.OS === 'ios' ? 20 : 16, + }, + imageItem: { + // aspectRatio = width / height + // 1 : 1.3 (width : height) => 1 / 1.3 + aspectRatio: 1 / 1.3, + overflow: 'hidden', + backgroundColor: '#262A31', + }, + image: { + width: '100%', + height: '100%', + }, +}) + diff --git a/components/drawer/EditProfileDrawer.tsx b/components/drawer/EditProfileDrawer.tsx new file mode 100644 index 0000000..788149a --- /dev/null +++ b/components/drawer/EditProfileDrawer.tsx @@ -0,0 +1,258 @@ +import { useState, useEffect, useRef, useMemo, useCallback } from 'react' +import { + View, + Text, + StyleSheet, + Pressable, + TextInput, + Dimensions, + Platform, + Keyboard, + ScrollView, +} from 'react-native' +import { Image } from 'expo-image' +import { useSafeAreaInsets } from 'react-native-safe-area-context' +import { useTranslation } from 'react-i18next' +import BottomSheet, { BottomSheetView, BottomSheetBackdrop, BottomSheetScrollView } from '@gorhom/bottom-sheet' +import { CloseIcon, AvatarUploadIcon } from '@/components/icon' +import { LinearGradient } from 'expo-linear-gradient' + + +interface EditProfileDrawerProps { + visible: boolean + onClose: () => void + initialName?: string + initialAvatar?: any + onSave?: (name: string) => void +} + +export default function EditProfileDrawer({ + visible, + onClose, + initialName = '乔乔乔', + initialAvatar, + onSave, +}: EditProfileDrawerProps) { + const { t } = useTranslation() + const bottomSheetRef = useRef(null) + const [name, setName] = useState(initialName) + const insets = useSafeAreaInsets() + + const snapPoints = useMemo(() => [280], []) + + useEffect(() => { + if (visible) { + bottomSheetRef.current?.expand() + } else { + bottomSheetRef.current?.close() + } + }, [visible]) + + // 当抽屉打开时,重置名字为初始值 + useEffect(() => { + if (visible) { + setName(initialName) + } + }, [visible, initialName]) + + const handleSheetChanges = useCallback((index: number) => { + if (index === -1) { + onClose() + } + }, [onClose]) + + const renderBackdrop = useCallback( + (props: any) => ( + + ), + [] + ) + + const handleSave = () => { + Keyboard.dismiss() + onSave?.(name) + onClose() + } + + const handleClose = () => { + Keyboard.dismiss() + onClose() + } + + return ( + + + + {/* 顶部关闭按钮 */} + + + + {/* 头像区域 */} + + + + + + + + + + + + {/* 输入框 */} + + + {/* 保存按钮 */} + + + {t('editProfile.save')} + + + + + + ) +} + +const styles = StyleSheet.create({ + bottomSheetBackground: { + backgroundColor: '#1C1E22', + }, + handleIndicator: { + backgroundColor: '#666666', + }, + container: { + flex: 1, + backgroundColor: '#1C1E22', + paddingHorizontal: 16, + }, + scrollView: { + flex: 1, + }, + scrollContent: { + paddingTop: 32, + paddingBottom: Platform.OS === 'ios' ? 25 : 17, + paddingHorizontal: 0, + flexGrow: 1, + }, + closeButton: { + position: 'absolute', + top: Platform.OS === 'ios' ? 16 : 16, + right: 16, + width: 24, + height: 24, + alignItems: 'center', + justifyContent: 'center', + zIndex: 10, + }, + avatarContainer: { + alignItems: 'center', + }, + avatarWrapper: { + position: 'relative', + width: 88, + height: 88, + }, + avatar: { + width: 88, + height: 88, + borderRadius: 50, + overflow: 'hidden', + }, + cameraButton: { + position: 'absolute', + bottom: 0, + right: 0, + width: 26, + height: 26, + borderRadius: 16, + backgroundColor: '#16181B', + alignItems: 'center', + justifyContent: 'center', + borderWidth: 2, + borderColor: '#FFFFFF', + }, + cameraIconContainer: { + width: 13, + height: 13, + alignItems: 'center', + justifyContent: 'center', + }, + input: { + backgroundColor: '#262A31', + borderRadius: 12, + paddingHorizontal: 16, + marginVertical: 24, + paddingVertical: 14, + color: '#F5F5F5', + fontWeight: '500', + fontSize: 14, + height: 48, + }, + saveButtonContainer: { + width: '100%', + borderRadius: 12, + overflow: 'hidden', + height: 48, + }, + saveButton: { + width: '100%', + alignItems: 'center', + justifyContent: 'center', + borderRadius: 12, + height: 48, + }, + saveButtonText: { + color: '#F5F5F5', + fontSize: 16, + fontWeight: '500', + }, +}) + diff --git a/components/drawer/PointsDrawer.tsx b/components/drawer/PointsDrawer.tsx new file mode 100644 index 0000000..7e99918 --- /dev/null +++ b/components/drawer/PointsDrawer.tsx @@ -0,0 +1,448 @@ +import { useState, useRef, useMemo, useCallback, useEffect } from 'react' +import { + View, + Text, + StyleSheet, + ScrollView, + Pressable, + useWindowDimensions, +} from 'react-native' +import { LinearGradient } from 'expo-linear-gradient' +import { useSafeAreaInsets } from 'react-native-safe-area-context' +import { useTranslation } from 'react-i18next' +import BottomSheet, { BottomSheetView, BottomSheetBackdrop, BottomSheetScrollView } from '@gorhom/bottom-sheet' +import { CloseIcon } from '@/components/icon' +import TopUpDrawer, { TopUpOption } from '@/components/drawer/TopUpDrawer' + +export type PointsTabType = 'all' | 'consume' | 'obtain' + +export interface PointsTransaction { + id: string + title: string + date: string + points: number // 正数表示获得,负数表示消耗 +} + +export interface PointsDrawerProps { + /** + * 是否显示抽屉 + */ + visible: boolean + /** + * 关闭回调 + */ + onClose: () => void + /** + * 当前积分总额 + */ + totalPoints?: number + /** + * 订阅积分 + */ + subscriptionPoints?: number + /** + * 额外充值积分 + */ + topUpPoints?: number + /** + * 交易记录列表 + */ + transactions?: PointsTransaction[] +} + +export default function PointsDrawer({ + visible, + onClose, + totalPoints = 60, + subscriptionPoints = 0, + topUpPoints = 0, + transactions = [], +}: PointsDrawerProps) { + const { t } = useTranslation() + const { height: screenHeight } = useWindowDimensions() + const insets = useSafeAreaInsets() + const bottomSheetRef = useRef(null) + const [pointsTab, setPointsTab] = useState('all') + const [topUpDrawerVisible, setTopUpDrawerVisible] = useState(false) + + const snapPoints = useMemo(() => [screenHeight * 0.85], [screenHeight]) + + useEffect(() => { + if (visible) { + bottomSheetRef.current?.expand() + } else { + bottomSheetRef.current?.close() + } + }, [visible]) + + const handleSheetChanges = useCallback((index: number) => { + if (index === -1) { + onClose() + } + }, [onClose]) + + const renderBackdrop = useCallback( + (props: any) => ( + + ), + [] + ) + + // 标签页配置 + const tabOptions: Array<{ value: PointsTabType; label: string }> = [ + { value: 'all', label: t('pointsDrawer.all') }, + { value: 'consume', label: t('pointsDrawer.consume') }, + { value: 'obtain', label: t('pointsDrawer.obtain') }, + ] + + // 根据标签页过滤交易记录 + const filteredTransactions = transactions.filter((transaction) => { + if (pointsTab === 'all') return true + if (pointsTab === 'consume') return transaction.points < 0 + if (pointsTab === 'obtain') return transaction.points > 0 + return true + }) + + // 如果没有提供交易记录,使用示例数据 + const displayTransactions = + filteredTransactions.length > 0 + ? filteredTransactions + : [ + { + id: '1', + title: t('pointsDrawer.dailyFreePoints'), + date: '2025年11月28日 10:33', + points: 60, + }, + ...Array.from({ length: 60 }, (_, i) => ({ + id: `example-${i + 2}`, + title: t('pointsDrawer.dailyFreePoints'), + date: '2025年11月28日 10:33', + points: -60, + })), + ] + + return ( + + + {/* 顶部标题栏 */} + + + + + + + + {t('pointsDrawer.title')} + {/* 积分总额 */} + + {totalPoints} + + + {/* 积分类型细分 */} + + {t('pointsDrawer.subscriptionPoints')} + {subscriptionPoints} + + + {t('pointsDrawer.topUpPoints')} + {topUpPoints} + + + + + {/* 标签页 */} + + {tabOptions.map((tab) => { + const isActive = pointsTab === tab.value + return ( + setPointsTab(tab.value)} + > + + {isActive && ( + + )} + {tab.label} + + + ) + })} + + + {/* 交易历史列表 */} + + {displayTransactions.map((transaction) => ( + + + {transaction.title} + {transaction.date} + + + {transaction.points > 0 ? '+' : ''} + {transaction.points} + + + ))} + + + {/* 底部按钮 */} + + { + onClose() + }} + > + + {t('pointsDrawer.subscribeForPoints')} + + + { + setTopUpDrawerVisible(true) + }} + > + {t('pointsDrawer.topUpPointsButton')} + + + + + {/* 充值抽屉 */} + setTopUpDrawerVisible(false)} + onNavigate={() => { + setTopUpDrawerVisible(false) + onClose() + }} + requiredPoints={100} + remainingPoints={totalPoints} + topUpTitle={t('topUp.title')} + onConfirm={(option: TopUpOption) => { + // 处理充值确认逻辑 + console.log('确认充值:', option) + setTopUpDrawerVisible(false) + }} + /> + + ) +} + +const styles = StyleSheet.create({ + bottomSheetBackground: { + backgroundColor: '#090A0B', + borderTopLeftRadius: 24, + borderTopRightRadius: 24, + }, + handleIndicator: { + backgroundColor: '#666666', + }, + container: { + flex: 1, + backgroundColor: '#090A0B', + borderTopLeftRadius: 20, + borderTopRightRadius: 20, + overflow: 'hidden', + }, + header: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + paddingTop: 12, + marginRight: 12, + }, + titleContainer: { + paddingLeft: 20, + marginTop: -4, + borderBottomWidth: 1, + borderBottomColor: '#3A3A3A', + }, + title: { + color: '#F5F5F5', + fontSize: 12, + fontWeight: '500', + }, + closeButton: { + width: 24, + height: 24, + alignItems: 'center', + justifyContent: 'center', + }, + balance: { + marginBottom: 13, + }, + balanceValue: { + color: '#F5F5F5', + fontSize: 40, + fontWeight: '500', + }, + breakdown: { + flexDirection: 'row', + gap: 16, + marginBottom: 24, + }, + breakdownText: { + color: '#ABABAB', + fontSize: 12, + fontWeight: '400', + }, + breakdownTextValue: { + color: '#F5F5F5', + fontSize: 12, + fontWeight: '500', + marginLeft: 6, + }, + breakdownTextSeparator: { + width: 1, + height: 14, + backgroundColor: '#3A3A3A', + marginTop: 2, + }, + tabs: { + flexDirection: 'row', + alignItems: 'center', + paddingHorizontal: 16, + marginTop:20, + marginBottom:24, + }, + tab: { + flex: 1, + alignItems: 'center', + justifyContent: 'center', + }, + tabContent: { + position: 'relative', + alignSelf: 'center', + }, + tabGradient: { + position: 'absolute', + left: 0, + right: 0, + bottom: 0, + height: 10, + backgroundColor: '#FF9966', + }, + tabText: { + color: '#ABABAB', + fontSize: 14, + textAlign: 'center', + }, + tabTextActive: { + color: '#F5F5F5', + fontSize: 14, + textAlign: 'center', + }, + list: { + height: 400, + }, + listContent: { + paddingBottom: 16, + paddingHorizontal: 16, + }, + item: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + paddingVertical: 16, + borderBottomWidth: 1, + borderBottomColor: '#1C1E20', + }, + itemLeft: { + flex: 1, + }, + itemTitle: { + color: '#F5F5F5', + fontSize: 14, + fontWeight: '500', + marginBottom: 4, + }, + itemDate: { + color: '#ABABAB', + fontSize: 12, + fontWeight: '400', + }, + itemPoints: { + color: '#4CAF50', + fontSize: 16, + fontWeight: '600', + }, + itemPointsNegative: { + color: '#F5F5F5', + }, + footer: { + paddingTop: 20, + paddingHorizontal: 16, + gap: 4, + }, + subscribeButton: { + width: '100%', + height: 48, + borderRadius: 12, + overflow: 'hidden', + }, + subscribeButtonGradient: { + width: '100%', + height: 48, + alignItems: 'center', + justifyContent: 'center', + borderRadius: 12, + }, + subscribeButtonText: { + color: '#F5F5F5', + fontSize: 16, + fontWeight: '500', + }, + topUpButton: { + alignItems: 'center', + justifyContent: 'center', + paddingVertical: 12, + }, + topUpButtonText: { + color: '#F5F5F5', + fontSize: 12, + fontWeight: '400', + }, +}) + diff --git a/components/drawer/TopUpDrawer.tsx b/components/drawer/TopUpDrawer.tsx new file mode 100644 index 0000000..8dfbb2d --- /dev/null +++ b/components/drawer/TopUpDrawer.tsx @@ -0,0 +1,433 @@ +import { useState, useRef, useMemo, useCallback, useEffect } from 'react' +import { + View, + Text, + StyleSheet, + Pressable, + useWindowDimensions, +} from 'react-native' +import { LinearGradient } from 'expo-linear-gradient' +import { useSafeAreaInsets } from 'react-native-safe-area-context' +import { useRouter } from 'expo-router' +import { useTranslation } from 'react-i18next' +import BottomSheet, { BottomSheetView, BottomSheetBackdrop } from '@gorhom/bottom-sheet' +import { CloseIcon, CheckIcon, UncheckedIcon, PointsIcon } from '@/components/icon' + +export interface TopUpOption { + id: string + points: number + price: number +} + +export interface TopUpDrawerProps { + /** + * 是否显示抽屉 + */ + visible: boolean + /** + * 关闭回调 + */ + onClose: () => void + /** + * 需要消耗的积分 + */ + requiredPoints?: number + /** + * 当前剩余积分 + */ + remainingPoints?: number + /** + * 充值选项列表 + */ + options?: TopUpOption[] + /** + * 确认充值回调 + */ + onConfirm?: (option: TopUpOption) => void + /** + * 充值标题 + */ + topUpTitle?: string + /** + * 充值描述 + */ + topUpDescription?: string + /** + * 导航回调,用于在导航时关闭父级抽屉(如 PointsDrawer) + */ + onNavigate?: () => void +} + +const defaultOptions: TopUpOption[] = [ + { id: '1', points: 1000, price: 20 }, + { id: '2', points: 2500, price: 20 }, + { id: '3', points: 5000, price: 20 }, + { id: '4', points: 10000, price: 20 }, +] + +export default function TopUpDrawer({ + visible, + onClose, + options = defaultOptions, + onConfirm, + topUpTitle, + topUpDescription, + onNavigate, +}: TopUpDrawerProps) { + const { t } = useTranslation() + const router = useRouter() + const insets = useSafeAreaInsets() + const bottomSheetRef = useRef(null) + const [selectedOption, setSelectedOption] = useState( + options[0] || null + ) + const [agreed, setAgreed] = useState(false) + + const snapPoints = useMemo(() => [420], []) + + useEffect(() => { + if (visible) { + bottomSheetRef.current?.expand() + } else { + bottomSheetRef.current?.close() + } + }, [visible]) + + const handleSheetChanges = useCallback((index: number) => { + if (index === -1) { + onClose() + } + }, [onClose]) + + const renderBackdrop = useCallback( + (props: any) => ( + + ), + [] + ) + + const handleClose = useCallback(() => { + bottomSheetRef.current?.close() + onClose() + }, [onClose]) + + // 如果没有传入标题,使用默认翻译 + const displayTitle = topUpTitle || t('topUp.title') + + const handleConfirm = () => { + if (selectedOption && agreed) { + onConfirm?.(selectedOption) + } + } + + return ( + + + {displayTitle && ( + // 这个绝对定位的标题层会盖在右上角关闭按钮上,必须允许触摸事件“穿透” + + {/* 主文字层 */} + {displayTitle} + + )} + + + + + + + + + {topUpDescription && ( + + {topUpDescription} + + )} + + + {/* 充值选项网格 */} + + {options.map((option) => { + const isSelected = selectedOption?.id === option.id + return ( + setSelectedOption(option)} + > + {isSelected ? ( + + + + + + {option.points.toLocaleString()} + + + ${option.price} + + + + ) : ( + + + + + {option.points.toLocaleString()} + + + ${option.price} + + )} + + ) + })} + + + {/* 底部按钮和协议 */} + + + + {t('topUp.confirm')} + + + + setAgreed(!agreed)} + > + {agreed ? : } + + setAgreed(!agreed)} + > + + {t('topUp.agreementText')}{' '} + { + e.stopPropagation() + onClose() + onNavigate?.() + router.push('/terms') + }} + > + {t('topUp.terms')} + + {t('topUp.agreementAnd')} + { + e.stopPropagation() + onClose() + onNavigate?.() + router.push('/privacy') + }} + > + {t('topUp.privacy')} + + + + + + + + ) +} + +const styles = StyleSheet.create({ + bottomSheetBackground: { + backgroundColor: '#090A0B', + }, + handleIndicator: { + backgroundColor: '#666666', + }, + container: { + backgroundColor: '#090A0B', + paddingHorizontal: 12, + overflow: 'visible', + }, + titleContainer: { + position: 'absolute', + top:10, + left: 0, + right: 0, + alignItems: 'center', + justifyContent: 'center', + zIndex: 10, + height: 40, + overflow: 'visible', + }, + strokeTextWrapper: { + position: 'absolute', + alignItems: 'center', + justifyContent: 'center', + }, + titleText: { + fontSize: 24, + fontWeight: '600', + textAlign: 'center', + zIndex: 1, + includeFontPadding: false, + textAlignVertical: 'center', + lineHeight: 28, + }, + titleStroke: { + color: '#000000', + }, + titleFill: { + color: '#F5F5F5', + position: 'relative', + }, + header: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + paddingTop: 12, + marginTop: 20, + }, + closeButton: { + width: 24, + height: 24, + alignItems: 'center', + justifyContent: 'center', + }, + infoSection: { + marginBottom: 24, + }, + infoText: { + color: '#F5F5F5', + fontSize: 14, + fontWeight: '400', + marginBottom: 8, + }, + subtitle: { + color: '#ABABAB', + fontSize: 12, + fontWeight: '400', + }, + optionsGrid: { + flexDirection: 'row', + flexWrap: 'wrap', + gap: 8, + marginTop: 12, + }, + optionCardWrapper: { + width: '47%', + aspectRatio: 2.3, + }, + optionCardGradient: { + width: '100%', + height: '100%', + borderRadius: 12, + padding: 2, + }, + optionCard: { + flex: 1, + alignItems: 'center', + justifyContent: 'center', + borderRadius: 12, + backgroundColor: '#16181B', + overflow: 'hidden', + gap: 4, + }, + optionContent: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'center', + gap: 2, + }, + optionPoints: { + color: '#F5F5F5', + fontSize: 20, + fontWeight: '500', + }, + optionPrice: { + color: '#ABABAB', + fontSize: 12, + fontWeight: '400', + }, + footer: { + paddingTop: 20, + gap: 16, + }, + confirmButton: { + width: '100%', + height: 48, + borderRadius: 12, + overflow: 'hidden', + }, + confirmButtonGradient: { + width: '100%', + height: 48, + alignItems: 'center', + justifyContent: 'center', + borderRadius: 12, + }, + confirmButtonDisabled: { + opacity: 0.5, + }, + confirmButtonText: { + color: '#F5F5F5', + fontSize: 16, + fontWeight: '600', + }, + agreementContainer: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'center', + }, + checkbox: { + width: 12, + height: 12, + alignItems: 'center', + justifyContent: 'center', + marginRight: 4, + }, + agreementText: { + color: '#8A8A8A', + fontSize: 10, + fontWeight: '400', + }, + agreementLink: { + color: '#ABABAB', + textDecorationLine: 'underline', + }, +}) + diff --git a/components/drawer/UploadReferenceImageDrawer.tsx b/components/drawer/UploadReferenceImageDrawer.tsx new file mode 100644 index 0000000..f896b3e --- /dev/null +++ b/components/drawer/UploadReferenceImageDrawer.tsx @@ -0,0 +1,383 @@ +import { useState, useRef, useMemo, useCallback, useEffect } from 'react' +import { + View, + Text, + StyleSheet, + Pressable, + FlatList, + useWindowDimensions, + Platform, +} from 'react-native' +import { Image } from 'expo-image' +import { useTranslation } from 'react-i18next' +import BottomSheet, { BottomSheetView, BottomSheetBackdrop } from '@gorhom/bottom-sheet' +import { CloseIcon, DownArrowIcon } from '@/components/icon' +import AIGenerationRecordDrawer from './AIGenerationRecordDrawer' + +interface UploadReferenceImageDrawerProps { + visible: boolean + onClose: () => void + onSelectImage?: (imageUri: any) => void +} + +type TabType = 'ai-record' | 'recent' + +// 模拟图片数据 +const mockImages = Array.from({ length: 120 }, (_, i) => ({ + id: i + 1, + uri: require('@/assets/images/android-icon-background.png'), +})) + +export default function UploadReferenceImageDrawer({ + visible, + onClose, + onSelectImage, +}: UploadReferenceImageDrawerProps) { + const { t } = useTranslation() + const { width: screenWidth } = useWindowDimensions() + const bottomSheetRef = useRef(null) + const [activeTab, setActiveTab] = useState('ai-record') + const [selectedFilter, setSelectedFilter] = useState<'all' | 'face'>('all') + const [aiRecordDrawerVisible, setAiRecordDrawerVisible] = useState(false) + + const snapPoints = useMemo(() => ['98%'], []) + + useEffect(() => { + if (visible) { + bottomSheetRef.current?.expand() + } else { + bottomSheetRef.current?.close() + } + }, [visible]) + + const handleSheetChanges = useCallback((index: number) => { + if (index === -1) { + onClose() + } + }, [onClose]) + + const handleImageSelect = (imageSource: any) => { + onSelectImage?.(imageSource) + onClose() + } + + const renderBackdrop = useCallback( + (props: any) => ( + + ), + [] + ) + + const renderImageItem = ({ item, index }: { item: typeof mockImages[0]; index: number }) => { + const paddingHorizontal = 0 + const gap = 2 + const itemWidth = (screenWidth - paddingHorizontal * 2 - gap * 2) / 3 + const isLastRow = index >= Math.floor(mockImages.length / 3) * 3 + + return ( + handleImageSelect(item.uri)} + > + + + ) + } + + return ( + <> + + + {/* 顶部标题栏 */} + + + {t('uploadReference.selectImage')} + {t('uploadReference.generateAIVideo')} + + + + + + + {/* 标签切换 */} + + { + setActiveTab('ai-record') + setAiRecordDrawerVisible(true) + }} + > + + + + + {t('uploadReference.aiRecord')} + + + { + setActiveTab('recent') + setAiRecordDrawerVisible(true) + }} + > + + + + + {t('uploadReference.recentUsed')} + + + + + {/* 筛选区域 */} + + { + // 可以展开分类选择 + }} + > + {t('uploadReference.recentProject')} + + + + setSelectedFilter('all')} + > + + {t('uploadReference.all')} + + + setSelectedFilter('face')} + > + + {t('uploadReference.face')} + + + + + + {/* 图片网格 */} + item.id.toString()} + numColumns={3} + showsVerticalScrollIndicator={false} + removeClippedSubviews={Platform.OS === 'android'} + maxToRenderPerBatch={Platform.OS === 'ios' ? 10 : 5} + updateCellsBatchingPeriod={Platform.OS === 'ios' ? 50 : 100} + initialNumToRender={Platform.OS === 'ios' ? 15 : 10} + windowSize={Platform.OS === 'ios' ? 10 : 5} + getItemLayout={(data, index) => { + const gap = 2 + const itemWidth = (screenWidth - gap * 2) / 3 + const rowIndex = Math.floor(index / 3) + return { + length: itemWidth, + offset: rowIndex * (itemWidth + gap), + index, + } + }} + /> + + + setAiRecordDrawerVisible(false)} + onSelectImage={(imageUri) => { + handleImageSelect(imageUri) + }} + type={activeTab} + /> + + ) +} + +const styles = StyleSheet.create({ + bottomSheetBackground: { + backgroundColor: '#16181B', + }, + handleIndicator: { + backgroundColor: '#666666', + }, + container: { + flex: 1, + backgroundColor: '#16181B', + paddingTop: 24, + }, + header: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + paddingHorizontal: 16, + paddingBottom: 20, + }, + title: { + color: '#F5F5F5', + fontSize: 20, + fontWeight: '600', + }, + closeButton: { + width: 24, + height: 24, + alignItems: 'center', + justifyContent: 'center', + }, + tabContainer: { + flexDirection: 'row', + paddingHorizontal: 16, + gap: 8, + marginBottom: 24, + }, + tab: { + flex: 1, + height: 52, + backgroundColor: '#272A30', + borderRadius: 12, + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'center', + gap: 4, + }, + tabActive: { + backgroundColor: '#262A31', + }, + tabIconContainer: { + width: 28, + height: 28, + alignItems: 'center', + justifyContent: 'center', + }, + tabIcon: { + width: 27, + height: 27, + borderRadius: 6, + backgroundColor: '#4A4C4F', + }, + tabIconSmall: { + width: 26, + height: 26, + borderRadius: 6, + backgroundColor: '#4A4C4F', + }, + tabText: { + color: '#F5F5F5', + fontSize: 12, + fontWeight: '600', + }, + tabTextActive: { + color: '#F5F5F5', + }, + filterContainer: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + paddingHorizontal: 16, + marginBottom: 9, + }, + categoryButton: { + flexDirection: 'row', + alignItems: 'center', + gap: 8, + }, + categoryText: { + color: '#F5F5F5', + fontSize: 14, + fontWeight: '600', + }, + filterButtons: { + flexDirection: 'row', + alignItems: 'center', + backgroundColor: '#1C1E22', + borderRadius: 100, + height: 32, + padding: 3, + }, + filterButton: { + paddingHorizontal: 12, + paddingVertical: 4, + minWidth: 48, + + alignItems: 'center', + justifyContent: 'center', + }, + filterButtonActive: { + backgroundColor: '#F5F5F5', + height: 24, + borderRadius: 100, + }, + filterButtonText: { + color: '#CCCCCC', + fontSize: 12, + }, + filterButtonTextActive: { + color: '#000000', + }, + // imageGrid: { + // // paddingHorizontal: 16, + // // paddingBottom: 20, + // }, + imageItem: { + // aspectRatio = width / height + // 1 : 1.3 (width : height) => 1 / 1.3 + aspectRatio: 1 / 1.3, + overflow: 'hidden', + backgroundColor: '#262A31', + }, + image: { + width: '100%', + height: '100%', + }, +}) + diff --git a/components/icon/avatarUpload.tsx b/components/icon/avatarUpload.tsx new file mode 100644 index 0000000..e7aa852 --- /dev/null +++ b/components/icon/avatarUpload.tsx @@ -0,0 +1,14 @@ +import Svg, { Path } from 'react-native-svg'; + +export const AvatarUploadIcon = ({ className }: { className?: string }) => ( + + + + +); diff --git a/components/icon/change.tsx b/components/icon/change.tsx new file mode 100644 index 0000000..08708e8 --- /dev/null +++ b/components/icon/change.tsx @@ -0,0 +1,10 @@ +import Svg, { Path } from 'react-native-svg'; + +export const ChangeIcon = ({ className }: { className?: string }) => ( + + + +); diff --git a/components/icon/check.tsx b/components/icon/check.tsx new file mode 100644 index 0000000..19e0987 --- /dev/null +++ b/components/icon/check.tsx @@ -0,0 +1,14 @@ +import Svg, { Path, G, Defs, ClipPath,Rect } from 'react-native-svg' + +export const CheckIcon = ({ className }: { className?: string }) => ( + + + + + + + + + + +); diff --git a/components/icon/checkMark.tsx b/components/icon/checkMark.tsx new file mode 100644 index 0000000..a3ed2f1 --- /dev/null +++ b/components/icon/checkMark.tsx @@ -0,0 +1,8 @@ +import Svg, { Path } from 'react-native-svg' + +export const CheckMarkIcon = ({ className }: { className?: string }) => ( + + + + +); diff --git a/components/icon/close.tsx b/components/icon/close.tsx new file mode 100644 index 0000000..72f305e --- /dev/null +++ b/components/icon/close.tsx @@ -0,0 +1,18 @@ +import Svg, { Path, Rect, G, Defs, ClipPath } from 'react-native-svg'; + +export const CloseIcon = ({ className }: { className?: string }) => ( + + + + + + + + + + + +); \ No newline at end of file diff --git a/components/icon/close1.tsx b/components/icon/close1.tsx new file mode 100644 index 0000000..bc749e8 --- /dev/null +++ b/components/icon/close1.tsx @@ -0,0 +1,8 @@ +import Svg, { Path } from 'react-native-svg'; + +export const Close1Icon = ({ className }: { className?: string }) => ( + + + + +); \ No newline at end of file diff --git a/components/icon/delete.tsx b/components/icon/delete.tsx new file mode 100644 index 0000000..8e8d867 --- /dev/null +++ b/components/icon/delete.tsx @@ -0,0 +1,16 @@ +import Svg, { Path, G, Defs, ClipPath, Rect } from 'react-native-svg'; + +export const DeleteIcon = () => ( + + + + + + + + + + + + +); diff --git a/components/icon/downArrow.tsx b/components/icon/downArrow.tsx new file mode 100644 index 0000000..8696de3 --- /dev/null +++ b/components/icon/downArrow.tsx @@ -0,0 +1,24 @@ +import Svg, { Path, G, Defs, ClipPath, Rect } from 'react-native-svg'; + +export const DownArrowIcon = () => ( + + + + + + + + + + +); diff --git a/components/icon/edit.tsx b/components/icon/edit.tsx new file mode 100644 index 0000000..7f8823c --- /dev/null +++ b/components/icon/edit.tsx @@ -0,0 +1,9 @@ +import Svg, { Path } from 'react-native-svg'; + +export const EditIcon = () => ( + + + + + +); diff --git a/components/icon/home.tsx b/components/icon/home.tsx new file mode 100644 index 0000000..465320f --- /dev/null +++ b/components/icon/home.tsx @@ -0,0 +1,10 @@ +import Svg, { Path } from 'react-native-svg'; + +export const HomeIcon = ({ className }: { className?: string }) => ( + + + +); \ No newline at end of file diff --git a/components/icon/index.tsx b/components/icon/index.tsx new file mode 100644 index 0000000..939abcf --- /dev/null +++ b/components/icon/index.tsx @@ -0,0 +1,28 @@ +export { CloseIcon } from "./close"; +export { PointsIcon } from "./points"; +export { OmitIcon } from "./omit"; +export { WhiteStarIcon } from "./whiteStar"; +export { LeftArrowIcon } from "./leftArrow"; +export { HomeIcon } from "./home"; +export { VideoIcon } from "./video"; +export { MessageIcon } from "./message"; +export { MyIcon } from "./my"; +export { SearchIcon } from "./search"; +export { DownArrowIcon } from "./downArrow"; +export { TopArrowIcon } from "./topArrow"; +export { SettingsIcon } from "./settings"; +export { SameStyleIcon } from "./sameStyle"; +export { NoNewsIcon } from "./noNews"; +export { WhitePointsIcon } from "./whitePoints"; +export { EditIcon } from "./edit"; +export { DeleteIcon } from "./delete"; +export { AvatarUploadIcon } from "./avatarUpload"; +export { ChangeIcon } from "./change"; +export { PlusIcon } from "./plus"; +export { UploadIcon } from "./upload"; +export { Close1Icon } from "./close1"; +export { CheckIcon } from "./check"; +export { UncheckedIcon } from "./unchecked"; +export { RightArrowIcon } from "./rightArrow"; +export { TermsIcon } from "./terms"; +export { PrivacyIcon } from "./privacy"; diff --git a/components/icon/leftArrow.tsx b/components/icon/leftArrow.tsx new file mode 100644 index 0000000..f830902 --- /dev/null +++ b/components/icon/leftArrow.tsx @@ -0,0 +1,7 @@ +import Svg, { Path } from 'react-native-svg'; + +export const LeftArrowIcon = ({className}: {className?: string}) => ( + + + +); diff --git a/components/icon/message.tsx b/components/icon/message.tsx new file mode 100644 index 0000000..0d84cbc --- /dev/null +++ b/components/icon/message.tsx @@ -0,0 +1,7 @@ +import Svg, { Path } from 'react-native-svg'; + +export const MessageIcon = () => ( + + + +); diff --git a/components/icon/my.tsx b/components/icon/my.tsx new file mode 100644 index 0000000..7f1ae4b --- /dev/null +++ b/components/icon/my.tsx @@ -0,0 +1,15 @@ +import Svg, { Path, G, Defs, ClipPath, Rect } from 'react-native-svg'; + +export const MyIcon = () => ( + + + + + + + + + + + +); diff --git a/components/icon/noNews.tsx b/components/icon/noNews.tsx new file mode 100644 index 0000000..3407d70 --- /dev/null +++ b/components/icon/noNews.tsx @@ -0,0 +1,7 @@ +import Svg, { Path } from 'react-native-svg'; + +export const NoNewsIcon = () => ( + + + +); diff --git a/components/icon/omit.tsx b/components/icon/omit.tsx new file mode 100644 index 0000000..2b5ca8d --- /dev/null +++ b/components/icon/omit.tsx @@ -0,0 +1,9 @@ +import Svg, { Path } from 'react-native-svg'; + +export const OmitIcon = () => ( + + + + + +); diff --git a/components/icon/plus.tsx b/components/icon/plus.tsx new file mode 100644 index 0000000..d1c9db7 --- /dev/null +++ b/components/icon/plus.tsx @@ -0,0 +1,14 @@ +import Svg, { Path } from 'react-native-svg'; + +export const PlusIcon = () => ( + + + +); + diff --git a/components/icon/points.tsx b/components/icon/points.tsx new file mode 100644 index 0000000..d37ae8e --- /dev/null +++ b/components/icon/points.tsx @@ -0,0 +1,29 @@ +import Svg, { Path, Defs, LinearGradient, Stop } from 'react-native-svg'; + +interface PointsIconProps { + width?: number | string; + height?: number | string; + style?: any; +} + +export const PointsIcon = ({width = 14, height = 14, style}: PointsIconProps) => ( + + + + + + + + + +); \ No newline at end of file diff --git a/components/icon/privacy.tsx b/components/icon/privacy.tsx new file mode 100644 index 0000000..a4fec2e --- /dev/null +++ b/components/icon/privacy.tsx @@ -0,0 +1,27 @@ +import Svg, { Path } from 'react-native-svg'; + +export const PrivacyIcon = () => ( + + + + + +); + diff --git a/components/icon/rightArrow.tsx b/components/icon/rightArrow.tsx new file mode 100644 index 0000000..9f088d3 --- /dev/null +++ b/components/icon/rightArrow.tsx @@ -0,0 +1,7 @@ +import Svg, { Path } from 'react-native-svg'; + +export const RightArrowIcon = () => ( + + + +); diff --git a/components/icon/sameStyle.tsx b/components/icon/sameStyle.tsx new file mode 100644 index 0000000..a5c31cd --- /dev/null +++ b/components/icon/sameStyle.tsx @@ -0,0 +1,9 @@ +import Svg, { Path } from 'react-native-svg'; + +export const SameStyleIcon = () => ( + + + + + +); diff --git a/components/icon/search.tsx b/components/icon/search.tsx new file mode 100644 index 0000000..92efa8e --- /dev/null +++ b/components/icon/search.tsx @@ -0,0 +1,14 @@ +import Svg, { Path, G, Defs, ClipPath, Rect } from 'react-native-svg'; + +export const SearchIcon = () => ( + + + + + + + + + + +); diff --git a/components/icon/settings.tsx b/components/icon/settings.tsx new file mode 100644 index 0000000..5b60a40 --- /dev/null +++ b/components/icon/settings.tsx @@ -0,0 +1,14 @@ +import Svg, { Path, G, Defs, ClipPath, Rect } from 'react-native-svg'; + +export const SettingsIcon = () => ( + + + + + + + + + + +); diff --git a/components/icon/terms.tsx b/components/icon/terms.tsx new file mode 100644 index 0000000..b7f1967 --- /dev/null +++ b/components/icon/terms.tsx @@ -0,0 +1,26 @@ +import Svg, { Path } from 'react-native-svg'; + +export const TermsIcon = () => ( + + + + + +); + diff --git a/components/icon/topArrow.tsx b/components/icon/topArrow.tsx new file mode 100644 index 0000000..a79cea8 --- /dev/null +++ b/components/icon/topArrow.tsx @@ -0,0 +1,24 @@ +import Svg, { Path, G, Defs, ClipPath, Rect } from 'react-native-svg'; + +export const TopArrowIcon = () => ( + + + + + + + + + + +); diff --git a/components/icon/unchecked.tsx b/components/icon/unchecked.tsx new file mode 100644 index 0000000..dfa0948 --- /dev/null +++ b/components/icon/unchecked.tsx @@ -0,0 +1,7 @@ +import Svg, { Circle } from 'react-native-svg' + +export const UncheckedIcon = ({ className }: { className?: string }) => ( + + + +); diff --git a/components/icon/upload.tsx b/components/icon/upload.tsx new file mode 100644 index 0000000..03210ed --- /dev/null +++ b/components/icon/upload.tsx @@ -0,0 +1,7 @@ +import Svg, { Path } from 'react-native-svg'; + +export const UploadIcon = () => ( + + + +); diff --git a/components/icon/video.tsx b/components/icon/video.tsx new file mode 100644 index 0000000..31b6df3 --- /dev/null +++ b/components/icon/video.tsx @@ -0,0 +1,15 @@ +import Svg, { Path, G, Defs, ClipPath, Rect } from 'react-native-svg'; + +export const VideoIcon = () => ( + + + + + + + + + + + +); diff --git a/components/icon/whitePoints.tsx b/components/icon/whitePoints.tsx new file mode 100644 index 0000000..f9d6615 --- /dev/null +++ b/components/icon/whitePoints.tsx @@ -0,0 +1,7 @@ +import Svg, { Path } from 'react-native-svg'; + +export const WhitePointsIcon = () => ( + + + +); diff --git a/components/icon/whiteStar.tsx b/components/icon/whiteStar.tsx new file mode 100644 index 0000000..5a2254a --- /dev/null +++ b/components/icon/whiteStar.tsx @@ -0,0 +1,8 @@ +import Svg, { Path } from 'react-native-svg'; + +export const WhiteStarIcon = () => ( + + + + +); diff --git a/components/skeleton/AIGenerationRecordDrawerSkeleton.tsx b/components/skeleton/AIGenerationRecordDrawerSkeleton.tsx new file mode 100644 index 0000000..592f5c1 --- /dev/null +++ b/components/skeleton/AIGenerationRecordDrawerSkeleton.tsx @@ -0,0 +1,87 @@ +import { View, StyleSheet, FlatList, Dimensions, Platform } from 'react-native' +import { Skeleton } from './skeleton' + +const { width: screenWidth } = Dimensions.get('window') + +const GAP = 2 +const NUM_COLUMNS = 3 +const ITEM_WIDTH = (screenWidth - GAP * 2) / NUM_COLUMNS + +export function AIGenerationRecordDrawerSkeleton() { + return ( + + {/* 顶部标题栏骨架 */} + + + + + + + + {/* 图片网格骨架 */} + i)} + keyExtractor={(item) => item.toString()} + numColumns={NUM_COLUMNS} + contentContainerStyle={styles.imageGrid} + renderItem={({ index }) => { + const isLastInRow = (index + 1) % NUM_COLUMNS === 0 + + return ( + + + + ) + }} + showsVerticalScrollIndicator={false} + /> + + ) +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#16181B', + paddingTop: 12, + }, + header: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'center', + paddingHorizontal: 16, + paddingBottom: 12, + position: 'relative', + }, + closeButton: { + position: 'absolute', + right: 16, + width: 24, + height: 24, + alignItems: 'center', + justifyContent: 'center', + zIndex: 10, + }, + imageGrid: { + paddingHorizontal: 0, + paddingBottom: Platform.OS === 'ios' ? 20 : 16, + }, + imageItem: { + // aspectRatio = width / height + // 1 : 1.3 (width : height) => 1 / 1.3 + aspectRatio: 1 / 1.3, + overflow: 'hidden', + backgroundColor: '#262A31', + }, +}) + + diff --git a/components/skeleton/ChannelsSkeleton.tsx b/components/skeleton/ChannelsSkeleton.tsx new file mode 100644 index 0000000..fbd2214 --- /dev/null +++ b/components/skeleton/ChannelsSkeleton.tsx @@ -0,0 +1,57 @@ +import { View, StyleSheet } from 'react-native' +import { Skeleton } from './skeleton' + +export function ChannelsSkeleton() { + return ( + + {/* 标题栏骨架 */} + + + + + + {/* 频道选择区域骨架 */} + + + {[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13].map((item) => ( + + ))} + + + + ) +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#0A0A0A', + }, + header: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + paddingHorizontal: 16, + paddingTop: 27, + paddingBottom: 12, + }, + channelsSection: { + paddingHorizontal: 12, + paddingBottom: 12, + }, + channelsGrid: { + flexDirection: 'row', + flexWrap: 'wrap', + gap: 8, + }, + channelButton: { + marginBottom: 0, + }, +}) + diff --git a/components/skeleton/GenerateVideoSkeleton.tsx b/components/skeleton/GenerateVideoSkeleton.tsx new file mode 100644 index 0000000..2e1ccd8 --- /dev/null +++ b/components/skeleton/GenerateVideoSkeleton.tsx @@ -0,0 +1,80 @@ +import { View, StyleSheet } from 'react-native' +import { Skeleton } from './skeleton' + +export function GenerateVideoSkeleton() { + return ( + + {/* 顶部导航栏骨架 */} + + + + + + {/* 标题区域骨架 */} + + + + + + {/* 上传容器骨架 */} + + + {/* 上传参考图按钮骨架 */} + + + {/* 描述输入区域骨架 */} + + + {/* 生成按钮骨架 */} + + + + ) +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#090A0B', + }, + header: { + flexDirection: 'row', + alignItems: 'center', + paddingTop: 17, + paddingHorizontal: 12, + paddingBottom: 20, + }, + content: { + paddingHorizontal: 12, + paddingTop: 16, + backgroundColor: '#1C1E20', + borderTopLeftRadius: 20, + borderTopRightRadius: 20, + gap: 8, + }, + titleSection: { + paddingHorizontal: 4, + marginBottom: 11, + gap: 5, + }, + title: { + marginBottom: 5, + }, + subtitle: { + marginTop: 0, + }, + uploadContainer: { + marginBottom: 0, + }, + uploadButton: { + marginBottom: 0, + }, + descriptionInput: { + marginBottom: 0, + }, + generateButton: { + marginTop: 12, + marginBottom: 10, + }, +}) + diff --git a/components/skeleton/GenerationRecordSkeleton.tsx b/components/skeleton/GenerationRecordSkeleton.tsx new file mode 100644 index 0000000..0eaa223 --- /dev/null +++ b/components/skeleton/GenerationRecordSkeleton.tsx @@ -0,0 +1,92 @@ +import { View, StyleSheet, Dimensions } from 'react-native' +import { Skeleton } from './skeleton' + +const { width: screenWidth } = Dimensions.get('window') + +export function GenerationRecordSkeleton() { + return ( + + {/* 顶部导航栏骨架 */} + + + + + + + {/* AI 视频标签骨架 */} + + + + + + {/* 原图标签骨架 */} + + + + + {/* 主图片骨架 */} + + + {/* 时长骨架 */} + + + {/* 底部操作按钮骨架 */} + + + + + + + ) +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#090A0B', + }, + header: { + flexDirection: 'row', + alignItems: 'center', + paddingHorizontal: 12, + paddingTop: 16, + paddingBottom: 20, + }, + headerSpacer: { + width: 22, + }, + categorySection: { + flexDirection: 'row', + alignItems: 'center', + paddingHorizontal: 16, + marginBottom: 8, + gap: 4, + }, + originalImageSection: { + paddingHorizontal: 16, + marginBottom: 8, + }, + imageContainer: { + marginHorizontal: 12, + marginBottom: 14, + }, + durationText: { + paddingLeft: 28, + marginBottom: 22, + }, + actionButtons: { + flexDirection: 'row', + alignItems: 'center', + paddingHorizontal: 12, + gap: 8, + }, + deleteButton: { + marginLeft: 'auto', + }, +}) + diff --git a/components/skeleton/MembershipSkeleton.tsx b/components/skeleton/MembershipSkeleton.tsx new file mode 100644 index 0000000..1f33be0 --- /dev/null +++ b/components/skeleton/MembershipSkeleton.tsx @@ -0,0 +1,153 @@ +import { View, StyleSheet } from 'react-native' +import { Skeleton } from './skeleton' + +export function MembershipSkeleton() { + return ( + + {/* 顶部导航栏骨架 */} + + + + + + + + {/* 订阅计划标题骨架 */} + + + {/* 订阅计划卡片骨架 */} + + {[1, 2, 3].map((item) => ( + 1 && styles.planCardSpacing, + ]} + > + + + + ))} + + + {/* 积分每月卡片骨架 */} + + + + + + + + + + + + {/* 功能列表骨架 */} + {[1, 2, 3, 4, 5].map((item) => ( + + + + + ))} + + + {/* 底部订阅按钮骨架 */} + + + + + + + + + ) +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#090A0B', + }, + header: { + flexDirection: 'row', + alignItems: 'center', + paddingHorizontal: 12, + paddingTop: 7, + paddingBottom: 20, + }, + headerSpacer: { + flex: 1, + }, + sectionTitle: { + textAlign: 'center', + marginBottom: 16, + alignSelf: 'center', + }, + plansContainer: { + flexDirection: 'row', + paddingHorizontal: 16, + marginBottom: 16, + }, + planCard: { + flex: 1, + paddingTop: 12, + paddingBottom: 16, + paddingHorizontal: 12, + borderRadius: 12, + backgroundColor: '#16181B', + gap: 14, + }, + planCardSpacing: { + marginLeft: 12, + }, + planName: { + marginBottom: 0, + }, + pointsMonthlyContainer: { + marginHorizontal: 16, + backgroundColor: '#191B1F', + paddingHorizontal: 12, + paddingVertical: 12, + borderRadius: 12, + marginBottom: 24, + gap: 12, + }, + pointsMonthlyCard: { + paddingHorizontal: 16, + paddingVertical: 10, + borderRadius: 10, + backgroundColor: '#272A30', + marginBottom: 24, + gap: 10, + }, + pointsMonthlyHeader: { + flexDirection: 'row', + alignItems: 'center', + gap: 8, + }, + progressBar: { + marginBottom: 10, + }, + featureItem: { + flexDirection: 'row', + alignItems: 'center', + gap: 16, + marginBottom: 12, + }, + subscribeContainer: { + paddingTop: 16, + alignItems: 'center', + paddingHorizontal: 16, + gap: 8, + }, + subscribeButton: { + marginBottom: 0, + }, + agreementContainer: { + flexDirection: 'row', + alignItems: 'center', + gap: 4, + }, +}) + diff --git a/components/skeleton/MessageSkeleton.tsx b/components/skeleton/MessageSkeleton.tsx new file mode 100644 index 0000000..17bbfc9 --- /dev/null +++ b/components/skeleton/MessageSkeleton.tsx @@ -0,0 +1,65 @@ +import { View, StyleSheet } from 'react-native' +import { Skeleton } from './skeleton' + +export function MessageSkeleton() { + return ( + + {/* 标签选择器骨架 */} + + + + + + + {/* 消息卡片骨架 */} + + {[1, 2, 3, 4].map((item) => ( + + + + + + + ))} + + + ) +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#090A0B', + }, + segment: { + flexDirection: 'row', + paddingHorizontal: 8, + paddingTop: 19, + paddingBottom: 12, + gap: 16, + }, + cardsContainer: { + paddingHorizontal: 4, + paddingTop: 12, + }, + card: { + backgroundColor: '#16181B', + borderRadius: 16, + padding: 16, + marginBottom: 12, + marginHorizontal: 4, + }, + cardTitle: { + marginBottom: 8, + }, + cardSubtitle: { + marginBottom: 16, + }, + cardBody: { + marginBottom: 12, + }, + cardTime: { + marginTop: 0, + }, +}) + diff --git a/components/skeleton/MySkeleton.tsx b/components/skeleton/MySkeleton.tsx new file mode 100644 index 0000000..d9cd3f3 --- /dev/null +++ b/components/skeleton/MySkeleton.tsx @@ -0,0 +1,123 @@ +import { View, StyleSheet, Dimensions } from 'react-native' +import { Skeleton } from './skeleton' + +const { width: screenWidth } = Dimensions.get('window') +const GALLERY_GAP = 2 +const GALLERY_HORIZONTAL_PADDING = 0 +const GALLERY_ITEM_SIZE = Math.floor( + (screenWidth - GALLERY_HORIZONTAL_PADDING * 2 - GALLERY_GAP * 2) / 3 +) + +export function MySkeleton() { + return ( + + {/* 顶部积分与设置骨架 */} + + + + + + {/* 个人信息区骨架 */} + + + + + + + + + + {/* 标题行骨架 */} + + + + + + {/* 作品九宫格骨架 */} + + {[1, 2, 3, 4, 5, 6, 7, 8, 9].map((item) => ( + + + + ))} + + + ) +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#090A0B', + }, + topBar: { + paddingHorizontal: GALLERY_HORIZONTAL_PADDING, + paddingTop: 19, + paddingRight: 16, + backgroundColor: '#090A0B', + flexDirection: 'row', + justifyContent: 'flex-end', + gap: 12, + }, + profileSection: { + flexDirection: 'row', + alignItems: 'center', + paddingLeft: 16, + paddingRight: 16, + marginTop: 20, + marginBottom: 32, + backgroundColor: '#090A0B', + gap: 16, + }, + profileInfo: { + flex: 1, + gap: 4, + }, + profileName: { + marginBottom: 4, + }, + sectionHeader: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + marginBottom: 12, + marginHorizontal: 12, + backgroundColor: '#090A0B', + }, + galleryGrid: { + flexDirection: 'row', + flexWrap: 'wrap', + marginBottom: 10, + }, + galleryItem: { + width: GALLERY_ITEM_SIZE, + aspectRatio: 1, + overflow: 'hidden', + backgroundColor: '#1C1E22', + position: 'relative', + }, + gallerySkeleton: { + width: '100%', + height: undefined, + aspectRatio: 1, + }, + galleryItemMarginRight: { + marginRight: GALLERY_GAP, + }, + galleryItemMarginBottom: { + marginBottom: GALLERY_GAP, + }, +}) + diff --git a/components/skeleton/SearchResultsSkeleton.tsx b/components/skeleton/SearchResultsSkeleton.tsx new file mode 100644 index 0000000..a8b98e2 --- /dev/null +++ b/components/skeleton/SearchResultsSkeleton.tsx @@ -0,0 +1,55 @@ +import { View, StyleSheet, Dimensions } from 'react-native' +import { Skeleton } from './skeleton' + +const { width: screenWidth } = Dimensions.get('window') +const horizontalPadding = 8 * 2 +const cardGap = 5 +const cardWidth = (screenWidth - horizontalPadding - cardGap) / 2 + +export function SearchResultsSkeleton() { + return ( + + + {[1, 2, 3, 4, 5, 6, 7, 8, 9].map((item, index) => ( + + + + ))} + + + ) +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#090A0B', + }, + gridContainer: { + flexDirection: 'row', + flexWrap: 'wrap', + paddingHorizontal: 8, + justifyContent: 'space-between', + }, + card: { + marginBottom: 12, + }, + cardLeft: { + marginRight: 0, + }, + cardRight: { + marginLeft: 0, + }, +}) + diff --git a/components/skeleton/SearchTemplateSkeleton.tsx b/components/skeleton/SearchTemplateSkeleton.tsx new file mode 100644 index 0000000..eaa2af5 --- /dev/null +++ b/components/skeleton/SearchTemplateSkeleton.tsx @@ -0,0 +1,89 @@ +import { View, StyleSheet } from 'react-native' +import { Skeleton } from './skeleton' + +export function SearchTemplateSkeleton() { + return ( + + {/* 搜索历史骨架 */} + + + + + + + {[1, 2, 3, 4].map((item) => ( + + ))} + + + + {/* 探索更多骨架 */} + + + + + + + {[1, 2, 3, 4, 5, 6].map((item) => ( + + ))} + + + + ) +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#090A0B', + paddingHorizontal: 12, + }, + historySection: { + paddingBottom: 32, + }, + historyHeader: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + }, + historyTags: { + flexDirection: 'row', + flexWrap: 'wrap', + gap: 4, + marginTop: 16, + }, + historyTag: { + marginBottom: 0, + }, + exploreSection: { + marginTop: 0, + }, + exploreHeader: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + marginBottom: 16, + }, + exploreTags: { + flexDirection: 'row', + flexWrap: 'wrap', + gap: 8, + }, + exploreTag: { + marginBottom: 0, + }, +}) + diff --git a/components/skeleton/SearchWorksResultsSkeleton.tsx b/components/skeleton/SearchWorksResultsSkeleton.tsx new file mode 100644 index 0000000..54a2bfb --- /dev/null +++ b/components/skeleton/SearchWorksResultsSkeleton.tsx @@ -0,0 +1,101 @@ +import { View, StyleSheet, Dimensions } from 'react-native' +import { Skeleton } from './skeleton' + +const { width: screenWidth } = Dimensions.get('window') +const GALLERY_GAP = 1 +const GALLERY_ITEM_SIZE = Math.floor( + (screenWidth - GALLERY_GAP * 2) / 3 +) + +export function SearchWorksResultsSkeleton() { + return ( + + {/* 分类标签骨架 */} + + {[1, 2, 3, 4].map((item) => ( + + ))} + + + {/* 作品列表骨架 */} + + {[1, 2].map((dateIndex) => ( + + + + {[1, 2, 3, 4, 5, 6].map((item) => ( + + + + ))} + + + ))} + + + ) +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#090A0B', + }, + categoryContainer: { + flexDirection: 'row', + paddingHorizontal: 14, + paddingVertical: 16, + gap: 8, + }, + categoryTag: { + marginBottom: 0, + }, + scrollContent: { + paddingBottom: 20, + }, + dateText: { + marginBottom: 8, + paddingLeft: 14, + }, + galleryGrid: { + flexDirection: 'row', + flexWrap: 'wrap', + }, + galleryItem: { + width: GALLERY_ITEM_SIZE, + aspectRatio: 1, + overflow: 'hidden', + backgroundColor: '#1C1E22', + position: 'relative', + }, + gallerySkeleton: { + width: '100%', + height: undefined, + aspectRatio: 1, + }, + galleryItemMarginRight: { + marginRight: GALLERY_GAP, + }, + galleryItemMarginBottom: { + marginBottom: GALLERY_GAP, + }, +}) + diff --git a/components/skeleton/SearchWorksSkeleton.tsx b/components/skeleton/SearchWorksSkeleton.tsx new file mode 100644 index 0000000..dc7730e --- /dev/null +++ b/components/skeleton/SearchWorksSkeleton.tsx @@ -0,0 +1,53 @@ +import { View, StyleSheet } from 'react-native' +import { Skeleton } from './skeleton' + +export function SearchWorksSkeleton() { + return ( + + {/* 搜索历史骨架 */} + + + + + + + {[1, 2, 3, 4].map((item) => ( + + ))} + + + + ) +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#090A0B', + paddingHorizontal: 12, + }, + historySection: { + paddingBottom: 32, + }, + historyHeader: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + }, + historyTags: { + flexDirection: 'row', + flexWrap: 'wrap', + gap: 4, + marginTop: 16, + }, + historyTag: { + marginBottom: 0, + }, +}) + diff --git a/components/skeleton/TemplateDetailSkeleton.tsx b/components/skeleton/TemplateDetailSkeleton.tsx new file mode 100644 index 0000000..a03023b --- /dev/null +++ b/components/skeleton/TemplateDetailSkeleton.tsx @@ -0,0 +1,70 @@ +import { View, StyleSheet, Dimensions } from 'react-native' +import { Skeleton } from './skeleton' + +const { width: screenWidth } = Dimensions.get('window') +const horizontalPadding = 8 * 2 +const cardGap = 5 +const cardWidth = (screenWidth - horizontalPadding - cardGap) / 2 + +export function TemplateDetailSkeleton() { + return ( + + {/* 标题区域骨架 */} + + + + + + {/* 图片网格骨架 */} + + {[1, 2, 3, 4, 5, 6].map((item, index) => ( + + + + ))} + + + ) +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#090A0B', + }, + titleSection: { + paddingHorizontal: 12, + paddingBottom: 24, + gap: 4, + }, + mainTitle: { + marginBottom: 4, + }, + gridContainer: { + flexDirection: 'row', + flexWrap: 'wrap', + paddingHorizontal: 8, + justifyContent: 'space-between', + }, + card: { + marginBottom: 12, + }, + cardLeft: { + marginRight: 0, + }, + cardRight: { + marginLeft: 0, + }, +}) + diff --git a/components/skeleton/UploadReferenceImageDrawerSkeleton.tsx b/components/skeleton/UploadReferenceImageDrawerSkeleton.tsx new file mode 100644 index 0000000..9c3e087 --- /dev/null +++ b/components/skeleton/UploadReferenceImageDrawerSkeleton.tsx @@ -0,0 +1,159 @@ +import { View, StyleSheet, FlatList, Dimensions } from 'react-native' +import { Skeleton } from './skeleton' + +const { width: screenWidth } = Dimensions.get('window') + +const GAP = 2 +const NUM_COLUMNS = 3 +const ITEM_WIDTH = (screenWidth - GAP * 2) / NUM_COLUMNS + +export function UploadReferenceImageDrawerSkeleton() { + return ( + + {/* 顶部标题栏骨架 */} + + + + + + + + + {/* 标签切换骨架 */} + + + + + + + + + + + + + + + + {/* 筛选区域骨架 */} + + + + + + + + + + + + + + + + {/* 图片网格骨架 */} + i)} + keyExtractor={(item) => item.toString()} + numColumns={NUM_COLUMNS} + renderItem={({ index }) => { + const isLastInRow = (index + 1) % NUM_COLUMNS === 0 + const isLastRow = index >= Math.floor(30 / NUM_COLUMNS) * NUM_COLUMNS + + return ( + + + + ) + }} + showsVerticalScrollIndicator={false} + /> + + ) +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#16181B', + paddingTop: 24, + }, + header: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + paddingHorizontal: 16, + paddingBottom: 20, + }, + headerTitles: { + gap: 4, + }, + headerSubtitle: { + marginTop: 2, + }, + tabContainer: { + flexDirection: 'row', + paddingHorizontal: 16, + gap: 8, + marginBottom: 24, + }, + tab: { + flex: 1, + height: 52, + backgroundColor: '#272A30', + borderRadius: 12, + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'center', + gap: 4, + }, + tabIconContainer: { + width: 28, + height: 28, + alignItems: 'center', + justifyContent: 'center', + }, + filterContainer: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + paddingHorizontal: 16, + marginBottom: 9, + }, + categoryButton: { + flexDirection: 'row', + alignItems: 'center', + gap: 8, + }, + filterButtons: { + flexDirection: 'row', + alignItems: 'center', + backgroundColor: '#1C1E22', + borderRadius: 100, + height: 32, + padding: 3, + }, + filterButton: { + paddingHorizontal: 12, + paddingVertical: 4, + minWidth: 48, + alignItems: 'center', + justifyContent: 'center', + }, + imageItem: { + aspectRatio: 1 / 1.3, + overflow: 'hidden', + backgroundColor: '#262A31', + }, +}) + + diff --git a/components/skeleton/VideoSkeleton.tsx b/components/skeleton/VideoSkeleton.tsx new file mode 100644 index 0000000..3ea09ee --- /dev/null +++ b/components/skeleton/VideoSkeleton.tsx @@ -0,0 +1,60 @@ +import { View, StyleSheet, Dimensions } from 'react-native' +import { Skeleton } from './skeleton' + +const { width: screenWidth, height: screenHeight } = Dimensions.get('window') +const TAB_BAR_HEIGHT = 83 +const videoHeight = screenHeight - TAB_BAR_HEIGHT + +export function VideoSkeleton() { + return ( + + + {/* 主视频区域骨架 */} + + + {/* 左下角按钮骨架 */} + + + + + + {/* 右下角按钮骨架 */} + + + + + + + ) +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#090A0B', + }, + videoContainer: { + width: screenWidth, + backgroundColor: '#090A0B', + position: 'relative', + }, + actionButtonLeft: { + position: 'absolute', + left: 12, + bottom: 16, + flexDirection: 'row', + alignItems: 'center', + gap: 4, + paddingHorizontal: 6, + paddingVertical: 8, + }, + actionButtonRight: { + position: 'absolute', + right: 13, + bottom: 13, + flexDirection: 'column', + alignItems: 'center', + gap: 4, + }, +}) + diff --git a/components/skeleton/WorksListSkeleton.tsx b/components/skeleton/WorksListSkeleton.tsx new file mode 100644 index 0000000..6c6c788 --- /dev/null +++ b/components/skeleton/WorksListSkeleton.tsx @@ -0,0 +1,101 @@ +import { View, StyleSheet, Dimensions } from 'react-native' +import { Skeleton } from './skeleton' + +const { width: screenWidth } = Dimensions.get('window') +const GALLERY_GAP = 1 +const GALLERY_ITEM_SIZE = Math.floor( + (screenWidth - GALLERY_GAP * 2) / 3 +) + +export function WorksListSkeleton() { + return ( + + {/* 分类标签骨架 */} + + {[1, 2, 3, 4].map((item) => ( + + ))} + + + {/* 作品列表骨架 */} + + {[1, 2].map((dateIndex) => ( + + + + {[1, 2, 3, 4, 5, 6].map((item) => ( + + + + ))} + + + ))} + + + ) +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#090A0B', + }, + categoryContainer: { + flexDirection: 'row', + paddingHorizontal: 14, + paddingVertical: 16, + gap: 8, + }, + categoryTag: { + marginBottom: 0, + }, + scrollContent: { + paddingBottom: 20, + }, + dateText: { + marginBottom: 8, + paddingLeft: 14, + }, + galleryGrid: { + flexDirection: 'row', + flexWrap: 'wrap', + }, + galleryItem: { + width: GALLERY_ITEM_SIZE, + aspectRatio: 1, + overflow: 'hidden', + backgroundColor: '#1C1E22', + position: 'relative', + }, + gallerySkeleton: { + width: '100%', + height: undefined, + aspectRatio: 1, + }, + galleryItemMarginRight: { + marginRight: GALLERY_GAP, + }, + galleryItemMarginBottom: { + marginBottom: GALLERY_GAP, + }, +}) + diff --git a/components/skeleton/index.ts b/components/skeleton/index.ts new file mode 100644 index 0000000..4ee59a4 --- /dev/null +++ b/components/skeleton/index.ts @@ -0,0 +1,17 @@ +export { Skeleton } from './skeleton' +export { MessageSkeleton } from './MessageSkeleton' +export { MySkeleton } from './MySkeleton' +export { VideoSkeleton } from './VideoSkeleton' +export { ChannelsSkeleton } from './ChannelsSkeleton' +export { GenerateVideoSkeleton } from './GenerateVideoSkeleton' +export { GenerationRecordSkeleton } from './GenerationRecordSkeleton' +export { MembershipSkeleton } from './MembershipSkeleton' +export { SearchTemplateSkeleton } from './SearchTemplateSkeleton' +export { SearchResultsSkeleton } from './SearchResultsSkeleton' +export { SearchWorksSkeleton } from './SearchWorksSkeleton' +export { SearchWorksResultsSkeleton } from './SearchWorksResultsSkeleton' +export { TemplateDetailSkeleton } from './TemplateDetailSkeleton' +export { WorksListSkeleton } from './WorksListSkeleton' +export { UploadReferenceImageDrawerSkeleton } from './UploadReferenceImageDrawerSkeleton' +export { AIGenerationRecordDrawerSkeleton } from './AIGenerationRecordDrawerSkeleton' + diff --git a/components/skeleton/skeleton.tsx b/components/skeleton/skeleton.tsx new file mode 100644 index 0000000..edd9354 --- /dev/null +++ b/components/skeleton/skeleton.tsx @@ -0,0 +1,60 @@ +import { useEffect, useRef } from 'react' +import { View, StyleSheet, Animated, Easing } from 'react-native' + +interface SkeletonProps { + width?: number | string + height?: number | string + borderRadius?: number + style?: any +} + +export function Skeleton({ + width = '100%', + height = 20, + borderRadius = 4, + style, +}: SkeletonProps) { + const animatedValue = useRef(new Animated.Value(0)).current + + useEffect(() => { + const animation = Animated.loop( + Animated.sequence([ + Animated.timing(animatedValue, { + toValue: 1, + duration: 1000, + easing: Easing.linear, + useNativeDriver: true, + }), + Animated.timing(animatedValue, { + toValue: 0, + duration: 1000, + easing: Easing.linear, + useNativeDriver: true, + }), + ]) + ) + animation.start() + return () => animation.stop() + }, [animatedValue]) + + const opacity = animatedValue.interpolate({ + inputRange: [0, 1], + outputRange: [0.3, 0.7], + }) + + return ( + + ) +} + diff --git a/components/themed-text.tsx b/components/themed-text.tsx new file mode 100644 index 0000000..30f27a1 --- /dev/null +++ b/components/themed-text.tsx @@ -0,0 +1,57 @@ +import { StyleSheet, Text, type TextProps } from 'react-native'; + + +export type ThemedTextProps = TextProps & { + lightColor?: string; + darkColor?: string; + type?: 'default' | 'title' | 'defaultSemiBold' | 'subtitle' | 'link'; +}; + +export function ThemedText({ + style, + lightColor, + darkColor, + type = 'default', + ...rest +}: ThemedTextProps) { + + return ( + + ); +} + +const styles = StyleSheet.create({ + default: { + fontSize: 16, + lineHeight: 24, + }, + defaultSemiBold: { + fontSize: 16, + lineHeight: 24, + fontWeight: '600', + }, + title: { + fontSize: 32, + fontWeight: 'bold', + lineHeight: 32, + }, + subtitle: { + fontSize: 20, + fontWeight: 'bold', + }, + link: { + lineHeight: 30, + fontSize: 16, + color: '#0a7ea4', + }, +}); diff --git a/components/themed-view.tsx b/components/themed-view.tsx new file mode 100644 index 0000000..6f181d8 --- /dev/null +++ b/components/themed-view.tsx @@ -0,0 +1,14 @@ +import { View, type ViewProps } from 'react-native'; + +import { useThemeColor } from '@/hooks/use-theme-color'; + +export type ThemedViewProps = ViewProps & { + lightColor?: string; + darkColor?: string; +}; + +export function ThemedView({ style, lightColor, darkColor, ...otherProps }: ThemedViewProps) { + const backgroundColor = useThemeColor({ light: lightColor, dark: darkColor }, 'background'); + + return ; +} diff --git a/components/ui/Block.tsx b/components/ui/Block.tsx new file mode 100644 index 0000000..4b8336b --- /dev/null +++ b/components/ui/Block.tsx @@ -0,0 +1,71 @@ +import React, { forwardRef } from 'react' +import { View, TouchableOpacity, ViewStyle, Pressable } from 'react-native' +import Animated from 'react-native-reanimated' + +const AnimatedView = Animated.createAnimatedComponent(View) + +interface BlockProps { + onClick?: () => void + onLongPress?: () => void + animated?: boolean + style?: ViewStyle + children?: React.ReactNode + opacity?: number + touchProps?: any + className?: string +} + +const Block = forwardRef((props, ref) => { + const { + onClick = null, + onLongPress, + animated, + children, + opacity, + touchProps, + className = '', + ...reset + } = props + + const handlePress = () => { + onClick && onClick() + } + + if ((onClick || onLongPress) && opacity) { + return ( + + + {children} + + + ) + } else if (onClick || onLongPress) { + return ( + + + {children} + + + ) + } else if (animated) { + return ( + + {children} + + ) + } else { + return ( + + {children} + + ) + } +}) + +// 添加displayName以便在React DevTools中显示组件名称 +Block.displayName = 'Block' +export default Block diff --git a/components/ui/Img.tsx b/components/ui/Img.tsx new file mode 100644 index 0000000..0434283 --- /dev/null +++ b/components/ui/Img.tsx @@ -0,0 +1,80 @@ +import React, { forwardRef, useMemo } from 'react' +import { Image as ExpoImage, ImageProps as ExpoImageProps } from 'expo-image' +import { TouchableOpacity, TouchableOpacityProps } from 'react-native' + +interface ImgProps extends ExpoImageProps { + onClick?: () => void + touchProps?: TouchableOpacityProps + className?: string + src?: string | number + errorSource?: string | number +} + +const Img = forwardRef((props, ref) => { + const { + onClick, + touchProps = {}, + className = '', + style, + src, + errorSource, + source: propSource, + ...reset + } = props + + // 判断是否为网络图片 + const isNetworkImage = (uri: string | number): boolean => { + if (typeof uri === 'number') return false + return uri.startsWith('http://') || uri.startsWith('https://') + } + + // 构建图片源 + const imageSource = useMemo(() => { + // 如果提供了source属性,优先使用 + if (propSource) return propSource + + if (!src) return undefined + + if (typeof src === 'number') { + // 本地图片资源(require导入的资源ID) + return src + } else { + // 网络图片或本地文件路径 + if (isNetworkImage(src)) { + return { + uri: src, + cache: 'immutable', // 使用expo-image的缓存机制 + } + } else { + // 本地文件路径 + return { uri: src } + } + } + }, [src, propSource]) + + const imgProps = { + style, + className, + ref, + source: imageSource, + errorSource, + ...reset, + } + + const handlePress = () => { + onClick && onClick() + } + + if (onClick) { + return ( + + + + ) + } + + return +}) + +Img.displayName = 'Img' +export default Img diff --git a/components/ui/ModalPortal.jsx b/components/ui/ModalPortal.jsx new file mode 100644 index 0000000..8c39bcb --- /dev/null +++ b/components/ui/ModalPortal.jsx @@ -0,0 +1,300 @@ +import React, { + useCallback, + useEffect, + useImperativeHandle, + useMemo, + useRef, + useState, + forwardRef, +} from 'react' +import Animated, { + Extrapolation, + FadeIn, + FadeInDown, + FadeInLeft, + FadeInRight, + FadeInUp, + FadeOut, + FadeOutDown, + FadeOutLeft, + FadeOutRight, + FadeOutUp, + ZoomIn, + ZoomOut, + interpolate, + runOnJS, + useAnimatedStyle, + useSharedValue, + withSpring, +} from 'react-native-reanimated' +import { Gesture, GestureDetector } from 'react-native-gesture-handler' +import { BackHandler, Pressable, StyleSheet, View, useWindowDimensions } from 'react-native' +import Overlay from './Overlay' + +export const defaultDirection = 'down' +export const defaultConfig = { + animationInTiming: 150, + animationOutTiming: 150, + hideBackdrop: false, + backdropColor: 'rgba(0, 0, 0, 0.1)', + dampingFactor: 0.2, + swipeDirection: defaultDirection, + swipeVelocityThreshold: 500, + onBackButtonPress: undefined, + onBackdropPress: undefined, + style: {}, + + // 点击穿透 + // pointerEvents: 'auto', +} + +const AnimatedPressable = Animated.createAnimatedComponent(Pressable) + +const defaultAnimationInMap = { + fade: FadeIn, + zoom: ZoomIn, + up: FadeInUp, + down: FadeInDown, + left: FadeInLeft, + right: FadeInRight, +} + +const defaultAnimationOutMap = { + fade: FadeOut, + zoom: ZoomOut, + up: FadeOutUp, + down: FadeOutDown, + left: FadeOutLeft, + right: FadeOutRight, +} + +const ModalPortal = forwardRef((props, ref) => { + const [config, setConfig] = useState(defaultConfig) + const [modalContent, setModalContent] = useState() + + const translationX = useSharedValue(0) + const translationY = useSharedValue(0) + const prevTranslationX = useSharedValue(0) + const prevTranslationY = useSharedValue(0) + + const onHideRef = useRef(() => {}) + + const { width, height } = useWindowDimensions() + + const hide = useCallback(async (props) => { + setModalContent(undefined) + + await new Promise((resolve) => { + setTimeout(resolve, config.animationOutTiming) + }) + + translationX.value = 0 + translationY.value = 0 + + onHideRef.current(props) + }, []) + + useImperativeHandle(ref, () => ({ + hide, + show: async (newComponent, newConfig = {}) => { + if (modalContent) await hide() + + const mergedConfig = { ...defaultConfig, ...newConfig } + + setConfig(mergedConfig) + if (React.isValidElement(newComponent) && newComponent) { + setModalContent(newComponent) + } + + return new Promise((resolve) => { + onHideRef.current = resolve + }) + }, + })) + + const onBackdropPress = useMemo(() => { + return config.onBackdropPress ?? (() => hide()) + }, [config.onBackdropPress, hide]) + + const isHorizontal = config.swipeDirection === 'left' || config.swipeDirection === 'right' + + const rangeMap = useMemo(() => { + return { + up: -height, + down: height, + left: -width, + right: width, + } + }, [height, width]) + + const pan = Gesture.Pan() + .enabled(!!config.swipeDirection) + .minDistance(1) + .onStart(() => { + prevTranslationX.value = translationX.value + prevTranslationY.value = translationY.value + }) + .onUpdate((event) => { + const translationValue = isHorizontal ? event.translationX : event.translationY + + const prevTranslationValue = isHorizontal ? prevTranslationX.value : prevTranslationY.value + + const shouldDampMap = { + up: translationValue > 0, + down: translationValue < 0, + left: translationValue > 0, + right: translationValue < 0, + } + + const shouldDamp = shouldDampMap[config.swipeDirection ?? defaultDirection] + + const dampedTranslation = shouldDamp + ? prevTranslationValue + translationValue * config.dampingFactor + : prevTranslationValue + translationValue + + if (isHorizontal) { + translationX.value = dampedTranslation + } else { + translationY.value = dampedTranslation + } + }) + .onEnd((event) => { + const velocityThreshold = config.swipeVelocityThreshold + + const shouldHideMap = { + up: event.velocityY < -velocityThreshold, + down: event.velocityY > velocityThreshold, + right: event.velocityX > velocityThreshold, + left: event.velocityX < -velocityThreshold, + } + + const shouldHide = shouldHideMap[config.swipeDirection ?? defaultDirection] + + if (!shouldHide) { + translationX.value = withSpring(0, { + velocity: event.velocityX, + damping: 75, + }) + translationY.value = withSpring(0, { + velocity: event.velocityY, + damping: 75, + }) + return + } + + const mainTranslation = isHorizontal ? translationX : translationY + + mainTranslation.value = withSpring( + rangeMap[config.swipeDirection ?? defaultDirection], + { velocity: event.velocityX, overshootClamping: true }, + (success) => success && runOnJS(hide)(), + ) + + return + }) + + const animatedStyles = useAnimatedStyle( + () => ({ + transform: [{ translateX: translationX.value }, { translateY: translationY.value }], + }), + [translationX.value, translationY.value], + ) + + const animatedBackdropStyles = useAnimatedStyle(() => { + const translationValue = isHorizontal ? translationX.value : translationY.value + + return { + opacity: interpolate( + translationValue, + [rangeMap[config.defaultDirection ?? defaultDirection], 0], + [0, 1], + Extrapolation.CLAMP, + ), + } + }, [config.swipeDirection, translationX.value, translationY.value, rangeMap]) + + useEffect(() => { + if (!modalContent) return + const backHandler = BackHandler.addEventListener('hardwareBackPress', () => { + if (config.onBackButtonPress) { + config.onBackButtonPress() + } else { + hide() + } + return true + }) + return () => backHandler.remove() + }, [config.onBackButtonPress, hide, modalContent]) + + const isBackdropVisible = modalContent && !config.hideBackdrop + + return ( + + + {modalContent && ( + <> + + + + + + + {modalContent} + + + + )} + + + ) +}) + +ModalPortal.displayName = 'ModalPortal' +export default ModalPortal + +const styles = StyleSheet.create({ + overlay: { + flex: 1, + justifyContent: 'center', + }, + backdrop: { + flex: 1, + backgroundColor: 'rgba(0, 0, 0, 0.5)', + }, + backdropContainer: { + position: 'absolute', + width: '100%', + height: '100%', + }, +}) diff --git a/components/ui/Overlay.js b/components/ui/Overlay.js new file mode 100644 index 0000000..56ebc26 --- /dev/null +++ b/components/ui/Overlay.js @@ -0,0 +1,9 @@ +import { Fragment } from 'react' +import { Platform } from 'react-native' +import { FullWindowOverlay } from 'react-native-screens' + +// 为了兼容 iOS 和 Android,我们需要使用 react-native-screens 的 FullWindowOverlay 组件 +/** Don't use .ios file extension as bunchee can't bundle it properly */ + +const Overlay = Platform.OS === 'ios' ? FullWindowOverlay : Fragment +export default Overlay diff --git a/components/ui/Text.tsx b/components/ui/Text.tsx new file mode 100644 index 0000000..36aa912 --- /dev/null +++ b/components/ui/Text.tsx @@ -0,0 +1,48 @@ +import React, { forwardRef } from 'react' +import { + Text as RNText, + TouchableOpacity, + TextProps as RNTextProps, + TouchableOpacityProps, + StyleProp, + TextStyle, +} from 'react-native' +import Animated from 'react-native-reanimated' + +interface TextProps extends RNTextProps { + onClick?: () => void + touchProps?: TouchableOpacityProps + animated?: boolean + style?: StyleProp + className?: string +} + +const Text = forwardRef((props, ref) => { + const { onClick, touchProps = {}, animated, style, className = '', children, ...reset } = props + + const textProps = { + className, + ref: ref, + ...reset, + } + + const handlePress = () => { + onClick && onClick() + } + + if (animated) { + return {children} + } + if (onClick) { + return ( + + {children} + + ) + } + + return {children} +}) + +Text.displayName = 'Text' +export default Text diff --git a/components/ui/Toast.tsx b/components/ui/Toast.tsx new file mode 100644 index 0000000..1dcdef6 --- /dev/null +++ b/components/ui/Toast.tsx @@ -0,0 +1,253 @@ +import React, { ReactNode } from 'react' +import Text from './Text' +import Block from './Block' + +import { ActivityIndicator } from 'react-native' + +// 定义insets接口 +interface Insets { + safeAreaInsetsBottom: number + safeAreaInsetsTop: number + safeAreaInsetsLeft: number + safeAreaInsetsRight: number +} + +// 定义全局变量接口 +declare global { + interface Window { + toast?: { + show: (component: ReactNode, config?: any) => void + hide: () => void + } + loading?: { + show: (component: ReactNode, config?: any) => void + hide: () => void + } + modal?: { + show: (component: ReactNode, config?: any) => void + hide: () => void + } + actionSheet?: { + show: (component: ReactNode, config?: any) => void + hide: () => void + } + } +} + +// 参数接口定义 +interface ShowParams { + renderContent?: () => ReactNode + title?: string + duration?: number + hideBackdrop?: boolean +} + +interface ShowActionSheetParams { + itemList?: string[] + renderContent?: () => ReactNode +} + +const isString = (variable: any): variable is string => + Object.prototype.toString.call(variable) === '[object String]' + +const Toast = (function () { + // 初始化默认insets + let insets: Insets = { + safeAreaInsetsBottom: 0, + safeAreaInsetsTop: 0, + safeAreaInsetsLeft: 0, + safeAreaInsetsRight: 0, + } + + // // 使用回调函数获取insets + // StaticSafeAreaInsets.getSafeAreaInsets((staticInsets) => { + // insets = staticInsets + // }) + + let toastTimer: number | null = null + const show = (params?: ShowParams): void => { + const { renderContent, title, duration = 2000, hideBackdrop = true } = params || {} + hide() + + const renderBody = (): ReactNode => { + if (renderContent) { + return renderContent() + } + return title && {title} + } + + ; (global as any).toast?.show( + + + {renderBody()} + + , + { + style: {}, + swipeDirection: null, + hideBackdrop, + onBackdropPress: () => { }, + entering: false, + exiting: false, + }, + ) + + if (duration > 0) { + toastTimer = setTimeout(() => { + hide() + }, duration) + } + } + + const hide = (): void => { + ; (global as any).toast?.hide() + if (toastTimer) { + clearTimeout(toastTimer) + toastTimer = null + } + } + + // loading + let loadingTimer: number | null = null + const showLoading = (params?: ShowParams): void => { + const { renderContent, title, duration = 1500, hideBackdrop = false } = params || {} + hideLoading() + + const renderBody = (): ReactNode => { + if (renderContent) { + return renderContent() + } + return ( + <> + + {!!title && ( + + {title} + + )} + + ) + } + + ; (global as any).loading?.show( + + + {renderBody()} + + , + { + style: {}, + swipeDirection: null, + hideBackdrop, + backdropColor: 'rgba(0,0,0,0.1)', + onBackdropPress: () => { }, + entering: false, + exiting: false, + }, + ) + + if (duration > 0) { + loadingTimer = setTimeout(() => { + hideLoading() + }, duration) + } + } + + const hideLoading = (): void => { + ; (global as any).loading?.hide() + if (loadingTimer) { + clearTimeout(loadingTimer) + loadingTimer = null + } + } + + // modal + const showModal = (ele: ReactNode, config: any = {}): void => { + ; (global as any).modal?.show(ele, { + swipeDirection: null, + ...config, + }) + } + + const hideModal = (): void => { + ; (global as any).modal?.hide() + } + + // actionsheet + // 兼容半屏组件 + const showActionSheet = ({ itemList, renderContent }: ShowActionSheetParams): Promise => { + return new Promise((resolve, reject) => { + const handleSelect = (item: string): void => { + hideActionSheet() + const itemIndex = itemList?.findIndex((i) => i === item) || -1 + resolve(itemIndex) + } + + const handleCancel = (): void => { + hideActionSheet() + reject() + } + + const renderBody = (): ReactNode => { + if (Array.isArray(itemList)) { + return ( + + {itemList.map((item, index) => ( + handleSelect(item)} + key={index} + className="items-center justify-center bg-white py-[16px]" + > + {item} + + ))} + + + 取消 + + + ) + } + + if (!renderContent) return null + + return ( + + {/* */} + {/* 安卓闪动,向上2px */} + {renderContent()} + + + ) + } + + ; (global as any).actionSheet?.show({renderBody()}, { + style: { justifyContent: 'flex-end' }, + }) + }) + } + + const hideActionSheet = (): void => { + ; (global as any).actionSheet?.hide() + } + + return { + showActionSheet, + hideActionSheet, + showModal, + hideModal, + showLoading, + hideLoading, + show, + hide, + } +})() + +export default Toast diff --git a/components/ui/alert-dialog.tsx b/components/ui/alert-dialog.tsx new file mode 100644 index 0000000..fa827be --- /dev/null +++ b/components/ui/alert-dialog.tsx @@ -0,0 +1,428 @@ +import * as React from "react"; +import { + Modal, + View, + Text, + Pressable, + type ViewStyle, + type TextStyle, + StyleSheet, + StatusBar, + Platform, +} from "react-native"; +import { BlurView } from "expo-blur"; + +import { cn } from "../../lib/utils"; +import { Button, buttonVariants } from "./button"; + +interface AlertDialogContextValue { + open: boolean; + setOpen: (open: boolean) => void; +} + +const AlertDialogContext = React.createContext( + null +); + +const useAlertDialogContext = () => { + const context = React.useContext(AlertDialogContext); + if (!context) { + throw new Error( + "AlertDialog components must be used within AlertDialog provider" + ); + } + return context; +}; + +interface AlertDialogProps { + children: React.ReactNode; + open?: boolean; + onOpenChange?: (open: boolean) => void; +} + +function AlertDialog({ children, open, onOpenChange }: AlertDialogProps) { + const [internalOpen, setInternalOpen] = React.useState(false); + + const isControlled = open !== undefined; + const isOpen = isControlled ? open : internalOpen; + + const handleSetOpen = React.useCallback( + (value: boolean) => { + if (!isControlled) { + setInternalOpen(value); + } + onOpenChange?.(value); + }, + [isControlled, onOpenChange] + ); + + const value: AlertDialogContextValue = { + open: isOpen, + setOpen: handleSetOpen, + }; + + return ( + + {children} + + ); +} + +interface AlertDialogTriggerProps { + children: React.ReactNode; + asChild?: boolean; + style?: ViewStyle; +} + +function AlertDialogTrigger({ + children, + asChild, + style, +}: AlertDialogTriggerProps) { + const { setOpen } = useAlertDialogContext(); + + if (asChild && React.isValidElement(children)) { + return React.cloneElement(children as React.ReactElement, { + onPress: () => setOpen(true), + }); + } + + return ( + setOpen(true)} style={style}> + {children} + + ); +} + +interface AlertDialogPortalProps { + children: React.ReactNode; +} + +function AlertDialogPortal({ children }: AlertDialogPortalProps) { + return <>{children}; +} + +interface AlertDialogOverlayProps { + className?: string; + style?: ViewStyle; +} + +function AlertDialogOverlay({ className, style }: AlertDialogOverlayProps) { + return ( + + {Platform.OS === 'ios' ? ( + + ) : null} + + + ); +} + +interface AlertDialogContentProps { + children: React.ReactNode; + className?: string; + style?: ViewStyle; +} + +function AlertDialogContent({ + children, + className, + style, +}: AlertDialogContentProps) { + const { open, setOpen } = useAlertDialogContext(); + + React.useEffect(() => { + if (Platform.OS === "android") { + if (open) { + StatusBar.setBackgroundColor("rgba(0,0,0,0.5)", true); + } else { + StatusBar.setBackgroundColor("transparent", true); + } + } + }, [open]); + + if (!open) return null; + + return ( + setOpen(false)} + hardwareAccelerated + > + + setOpen(false)} + android_ripple={null} + > + + + + + {children} + + + + ); +} + +interface AlertDialogHeaderProps { + children: React.ReactNode; + className?: string; + style?: ViewStyle; +} + +function AlertDialogHeader({ + children, + className, + style, +}: AlertDialogHeaderProps) { + return ( + + {children} + + ); +} + +interface AlertDialogFooterProps { + children: React.ReactNode; + className?: string; + style?: ViewStyle; +} + +function AlertDialogFooter({ + children, + className, + style, +}: AlertDialogFooterProps) { + return ( + + {children} + + ); +} + +interface AlertDialogTitleProps { + children: React.ReactNode; + className?: string; + style?: TextStyle; +} + +function AlertDialogTitle({ + children, + className, + style, +}: AlertDialogTitleProps) { + return ( + + {children} + + ); +} + +interface AlertDialogDescriptionProps { + children: React.ReactNode; + className?: string; + style?: TextStyle; +} + +function AlertDialogDescription({ + children, + className, + style, +}: AlertDialogDescriptionProps) { + return ( + + {children} + + ); +} + +interface AlertDialogActionProps { + children: React.ReactNode; + className?: string; + onPress?: () => void; + style?: ViewStyle; +} + +function AlertDialogAction({ + children, + className, + onPress, + style, +}: AlertDialogActionProps) { + const { setOpen } = useAlertDialogContext(); + + const handlePress = () => { + onPress?.(); + setOpen(false); + }; + + return ( + + ); +} + +interface AlertDialogCancelProps { + children: React.ReactNode; + className?: string; + onPress?: () => void; + style?: ViewStyle; +} + +function AlertDialogCancel({ + children, + className, + onPress, + style, +}: AlertDialogCancelProps) { + const { setOpen } = useAlertDialogContext(); + + const handlePress = () => { + onPress?.(); + setOpen(false); + }; + + return ( + + ); +} + +interface DeleteAlertDialogActionProps { + onPress?: () => void; + style?: ViewStyle; + className?: string; +} + +function DeleteAlertDialogAction({ + onPress, + style, + className, +}: DeleteAlertDialogActionProps) { + return ( + + 确认删除 + + ); +} + +function CancelAlertDialogAction({ + onPress, + style, + className, +}: DeleteAlertDialogActionProps) { + return ( + + 暂不 + + ); +} + +const styles = StyleSheet.create({ + modalContainer: { + flex: 1, + justifyContent: "center", + alignItems: "center", + ...Platform.select({ + android: { + backgroundColor: 'transparent', + }, + }), + }, + backdrop: { + ...StyleSheet.absoluteFillObject, + }, + overlay: { + zIndex: 1, + }, + content: { + zIndex: 2, + }, + deleteActionButton: { + backgroundColor: "#FA3F2C", + alignItems: 'center' + }, + deleteActionText: { + color: "#FFFFFF", + fontSize: 14, + fontWeight: "500", + }, + cancelActionButton: { + backgroundColor: '#262A31', + alignItems: 'center' + }, + cancelActionText: { + color: "#CCCCCC", + fontSize: 14, + } +}); + +export { + AlertDialog, + AlertDialogPortal, + AlertDialogOverlay, + AlertDialogTrigger, + AlertDialogContent, + AlertDialogHeader, + AlertDialogFooter, + AlertDialogTitle, + AlertDialogDescription, + AlertDialogAction, + AlertDialogCancel, + DeleteAlertDialogAction, + CancelAlertDialogAction +}; diff --git a/components/ui/button.tsx b/components/ui/button.tsx new file mode 100644 index 0000000..9d4e6d7 --- /dev/null +++ b/components/ui/button.tsx @@ -0,0 +1,116 @@ +import * as React from "react"; +import { Pressable, Text, type PressableProps, type ViewStyle } from "react-native"; +import { LinearGradient } from "expo-linear-gradient"; +import { cva, type VariantProps } from "class-variance-authority"; + +import { cn } from "../../lib/utils"; + +const buttonVariants = cva( + "flex-row items-center justify-center rounded-md active:opacity-70", + { + variants: { + variant: { + default: "bg-primary", + destructive: "bg-destructive", + outline: "border border-input bg-background", + secondary: "bg-secondary", + ghost: "active:bg-accent", + link: "", + gradient: "", + }, + size: { + default: "h-10 px-4 py-2", + sm: "h-9 px-3", + lg: "h-11 px-8", + icon: "h-10 w-10", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + } +); + +const buttonTextVariants = cva("text-sm font-medium text-center", { + variants: { + variant: { + default: "text-primary-foreground", + destructive: "text-destructive-foreground", + outline: "text-foreground", + secondary: "text-secondary-foreground", + ghost: "text-foreground", + link: "text-primary", + gradient: "text-white", + }, + }, + defaultVariants: { + variant: "default", + }, +}); + +export interface ButtonProps + extends Omit, + VariantProps { + children?: React.ReactNode; + style?: ViewStyle; +} + +const Button = React.forwardRef< + React.ElementRef, + ButtonProps +>(({ className, variant, size, children, disabled, style, ...props }, ref) => { + const isGradient = variant === "gradient"; + + const content = typeof children === "string" ? ( + {children} + ) : ( + children + ); + + // 合并样式,确保 borderRadius 正确应用 + const borderRadius = style?.borderRadius ?? (isGradient ? 12 : undefined); + const mergedStyle = borderRadius + ? [style, { borderRadius }] + : style; + + return ( + + {isGradient ? ( + + {content} + + ) : ( + content + )} + + ); +}); + +Button.displayName = "Button"; + +export { Button, buttonVariants }; diff --git a/components/ui/carousel.tsx b/components/ui/carousel.tsx new file mode 100644 index 0000000..159e113 --- /dev/null +++ b/components/ui/carousel.tsx @@ -0,0 +1,151 @@ +import React, { useState, useRef } from "react"; +import { View as RNView, Dimensions, type ViewProps, type StyleProp, type ViewStyle } from "react-native"; +import RNCarousel, { ICarouselInstance } from "react-native-reanimated-carousel"; +import { cn } from "../../lib/utils"; + +// 扩展 View 以支持 className(NativeWind) +const View = RNView as React.ComponentType; + +const { width: screenWidth } = Dimensions.get("window"); + +export type CarouselApi = ICarouselInstance; + +type CarouselProps = { + orientation?: "horizontal" | "vertical"; + setApi?: (api: CarouselApi) => void; + className?: string; + children: React.ReactNode; + width?: number; + height?: number; + autoPlay?: boolean; + autoPlayInterval?: number; + loop?: boolean; +}; + +type CarouselContextProps = { + api: CarouselApi | null; + orientation: "horizontal" | "vertical"; + width: number; + height: number; + autoPlay: boolean; + autoPlayInterval: number; + loop: boolean; +}; + +const CarouselContext = React.createContext(null); + +function useCarousel() { + const context = React.useContext(CarouselContext); + if (!context) { + throw new Error("useCarousel must be used within a "); + } + return context; +} + +function Carousel({ + orientation = "horizontal", + setApi, + className, + children, + width = screenWidth, + height = 410, + autoPlay = false, + autoPlayInterval = 3000, + loop = true, + onIndexChange, +}: CarouselProps & { onIndexChange?: (index: number) => void }) { + const [api, setInternalApi] = useState(null); + const carouselRef = useRef(null); + + React.useEffect(() => { + if (carouselRef.current) { + const instance = carouselRef.current; + setInternalApi(instance); + setApi?.(instance); + } + }, [setApi]); + + // 提取子元素到数组,过滤掉非 ReactElement 的内容 + // 如果子元素是 CarouselContent,需要提取其内部的子元素 + const childrenArray = React.Children.toArray(children); + const items = childrenArray.reduce((acc, child) => { + if (React.isValidElement(child)) { + const props = child.props as { children?: React.ReactNode }; + if (props.children) { + const innerChildren = React.Children.toArray(props.children).filter( + (innerChild): innerChild is React.ReactElement => React.isValidElement(innerChild) + ); + return [...acc, ...innerChildren]; + } + return [...acc, child]; + } + return acc; + }, []); + + return ( + + + item as React.ReactElement} + onSnapToItem={onIndexChange} + /> + + + ); +} + +function CarouselContent({ + children, + ...props +}: { + className?: string; + children: React.ReactNode; + style?: StyleProp; +}) { + // CarouselContent 在新架构中主要用于包裹 CarouselItem + // 实际渲染由 Carousel 的 renderItem 处理 + return <>{children}; +} + +function CarouselItem({ + className, + children, + ...props +}: { + className?: string; + children: React.ReactNode; + style?: StyleProp; +}) { + const { width, height } = useCarousel(); + + return ( + + {children} + + ); +} + +export { Carousel, CarouselContent, CarouselItem, useCarousel }; diff --git a/components/ui/delete-confirm-dialog.tsx b/components/ui/delete-confirm-dialog.tsx new file mode 100644 index 0000000..96595cc --- /dev/null +++ b/components/ui/delete-confirm-dialog.tsx @@ -0,0 +1,137 @@ +import { StyleSheet, Platform } from 'react-native' +import { + AlertDialog, + AlertDialogContent, + AlertDialogHeader, + AlertDialogTitle, + AlertDialogDescription, + AlertDialogFooter, + DeleteAlertDialogAction, + CancelAlertDialogAction, +} from './alert-dialog' + +interface DeleteConfirmDialogProps { + open: boolean + onOpenChange: (open: boolean) => void + onConfirm: () => void + title?: string + description?: string +} + +export function DeleteConfirmDialog({ + open, + onOpenChange, + onConfirm, + title = '删除该条记录?', + description = '删除后不可恢复', +}: DeleteConfirmDialogProps) { + const handleConfirm = () => { + onConfirm() + onOpenChange(false) + } + + return ( + + + + + {title} + + + {description} + + + + onOpenChange(false)} + style={styles.cancelButton} + /> + + + + + ) +} + +const styles = StyleSheet.create({ + dialogContent: { + backgroundColor: '#1C1E22', + borderRadius: 16, + padding: 24, + width: '90%', + maxWidth: 320, + borderWidth: 0, + // Android 阴影效果 + ...Platform.select({ + android: { + elevation: 24, + }, + ios: { + shadowColor: '#000', + shadowOffset: { + width: 0, + height: 8, + }, + shadowOpacity: 0.3, + shadowRadius: 16, + }, + }), + }, + dialogTitle: { + color: '#F5F5F5', + fontSize: 15, + fontWeight: '500', + textAlign: 'center', + marginBottom: 8, + // iOS 字体渲染优化 + ...Platform.select({ + ios: { + fontWeight: '600', + }, + }), + }, + dialogDescription: { + color: '#8A8A8A', + fontSize: 13, + textAlign: 'center', + lineHeight: 20, + }, + dialogFooter: { + flexDirection: 'row', + gap: 12, + marginTop: 24, + justifyContent: 'center', + }, + cancelButton: { + flex: 1, + height: 44, + borderRadius: 8, + backgroundColor: '#262A31', + justifyContent: 'center', + alignItems: 'center', + // Android 触摸反馈 + ...Platform.select({ + android: { + elevation: 0, + }, + }), + }, + confirmDeleteButton: { + flex: 1, + height: 44, + borderRadius: 8, + backgroundColor: '#FA3F2C', + justifyContent: 'center', + alignItems: 'center', + // Android 触摸反馈 + ...Platform.select({ + android: { + elevation: 0, + }, + }), + }, +}) + diff --git a/components/ui/drawer.tsx b/components/ui/drawer.tsx new file mode 100644 index 0000000..ab801f1 --- /dev/null +++ b/components/ui/drawer.tsx @@ -0,0 +1,443 @@ +import React, { useEffect, useImperativeHandle, forwardRef, ReactNode, useCallback, useMemo } from 'react' +import { + View, + StyleSheet, + Pressable, + useWindowDimensions, + BackHandler, + Modal, + Platform, +} from 'react-native' +import { useSafeAreaInsets } from 'react-native-safe-area-context' +import { CloseIcon } from '@/components/icon' +import Animated, { + useSharedValue, + useAnimatedStyle, + withSpring, + withTiming, + runOnJS, + interpolate, + Extrapolation, +} from 'react-native-reanimated' +import { Gesture, GestureDetector } from 'react-native-gesture-handler' + +const AnimatedPressable = Animated.createAnimatedComponent(Pressable) + +export type DrawerPosition = 'bottom' | 'top' | 'left' | 'right' + +export interface DrawerProps { + /** + * 是否显示抽屉 + */ + visible: boolean + /** + * 关闭回调 + */ + onClose: () => void + /** + * 抽屉内容 + */ + children: ReactNode + /** + * 抽屉位置,默认为 'bottom' + */ + position?: DrawerPosition + /** + * 抽屉高度(position 为 'top' 或 'bottom' 时使用) + */ + height?: number | string + /** + * 抽屉宽度(position 为 'left' 或 'right' 时使用) + */ + width?: number | string + /** + * 是否显示遮罩层,默认为 true + */ + showBackdrop?: boolean + /** + * 遮罩层颜色,默认为 'rgba(0, 0, 0, 0.5)' + */ + backdropColor?: string + /** + * 点击遮罩层是否关闭,默认为 true + */ + closeOnBackdropPress?: boolean + /** + * 是否支持手势拖拽关闭,默认为 true + */ + enableGesture?: boolean + /** + * 拖拽关闭的阈值(速度),默认为 500 + */ + swipeVelocityThreshold?: number + /** + * 自定义样式 + */ + style?: any + /** + * 遮罩层样式 + */ + backdropStyle?: any + /** + * 是否显示关闭按钮,默认为 true + */ + showCloseButton?: boolean +} + +export interface DrawerRef { + /** + * 关闭抽屉 + */ + close: () => void +} + +const Drawer = forwardRef( + ( + { + visible, + onClose, + children, + position = 'bottom', + height, + width, + showBackdrop = true, + backdropColor = 'rgba(0, 0, 0, 0.5)', + closeOnBackdropPress = true, + enableGesture = true, + swipeVelocityThreshold = 500, + style, + backdropStyle, + showCloseButton = true, + }, + ref, + ) => { + const { width: screenWidth, height: screenHeight } = useWindowDimensions() + const insets = useSafeAreaInsets() + const translateX = useSharedValue(0) + const translateY = useSharedValue(0) + const backdropOpacity = useSharedValue(0) + + // 计算抽屉尺寸 + const drawerHeight = + height === undefined + ? screenHeight * 0.6 + : typeof height === 'string' + ? (parseFloat(height) / 100) * screenHeight + : height + const drawerWidth = + width === undefined + ? screenWidth * 0.8 + : typeof width === 'string' + ? (parseFloat(width) / 100) * screenWidth + : width + + // 根据位置计算最大偏移量 + const getMaxOffset = () => { + switch (position) { + case 'bottom': + return drawerHeight + case 'top': + return -drawerHeight + case 'left': + return -drawerWidth + case 'right': + return drawerWidth + default: + return drawerHeight + } + } + + const maxOffset = getMaxOffset() + const isHorizontal = position === 'left' || position === 'right' + + // 关闭抽屉 + const close = useCallback(() => { + translateX.value = 0 + translateY.value = 0 + backdropOpacity.value = withTiming(0, { duration: 200 }) + onClose() + }, [onClose]) + + useImperativeHandle(ref, () => ({ + close, + }), [close]) + + // 处理返回键(仅 Android) + useEffect(() => { + if (!visible || Platform.OS !== 'android') return + + const backHandler = BackHandler.addEventListener('hardwareBackPress', () => { + close() + return true + }) + + return () => backHandler.remove() + }, [visible, close]) + + // 显示/隐藏动画 + useEffect(() => { + if (visible) { + backdropOpacity.value = withTiming(1, { duration: 200 }) + translateX.value = 0 + translateY.value = 0 + } else { + backdropOpacity.value = withTiming(0, { duration: 200 }) + translateX.value = 0 + translateY.value = 0 + } + }, [visible]) + + // 手势处理 + const pan = Gesture.Pan() + .enabled(enableGesture && visible) + .onUpdate((event) => { + if (isHorizontal) { + const newTranslateX = event.translationX + // 根据位置限制拖拽方向 + if (position === 'left' && newTranslateX > 0) { + translateX.value = newTranslateX + } else if (position === 'right' && newTranslateX < 0) { + translateX.value = newTranslateX + } else if (position === 'left' || position === 'right') { + translateX.value = newTranslateX + } + } else { + const newTranslateY = event.translationY + // 根据位置限制拖拽方向 + if (position === 'bottom' && newTranslateY > 0) { + translateY.value = newTranslateY + } else if (position === 'top' && newTranslateY < 0) { + translateY.value = newTranslateY + } else if (position === 'bottom' || position === 'top') { + translateY.value = newTranslateY + } + } + + // 更新遮罩层透明度 + const currentOffset = isHorizontal ? translateX.value : translateY.value + const opacity = interpolate( + Math.abs(currentOffset), + [0, Math.abs(maxOffset)], + [1, 0], + Extrapolation.CLAMP, + ) + backdropOpacity.value = opacity + }) + .onEnd((event) => { + const velocity = isHorizontal ? event.velocityX : event.velocityY + const translation = isHorizontal ? translateX.value : translateY.value + + // 判断是否应该关闭 + const shouldClose = + Math.abs(velocity) > swipeVelocityThreshold || + Math.abs(translation) > Math.abs(maxOffset) * 0.5 + + if (shouldClose) { + // 关闭动画 + if (isHorizontal) { + translateX.value = withSpring( + maxOffset, + { + velocity: event.velocityX, + damping: 20, + stiffness: 90, + }, + () => { + runOnJS(close)() + }, + ) + } else { + translateY.value = withSpring( + maxOffset, + { + velocity: event.velocityY, + damping: 20, + stiffness: 90, + }, + () => { + runOnJS(close)() + }, + ) + } + } else { + // 回弹动画 + if (isHorizontal) { + translateX.value = withSpring(0, { + velocity: event.velocityX, + damping: 20, + stiffness: 90, + }) + } else { + translateY.value = withSpring(0, { + velocity: event.velocityY, + damping: 20, + stiffness: 90, + }) + } + backdropOpacity.value = withTiming(1, { duration: 200 }) + } + }) + + // 计算安全区域样式 + const safeAreaStyle = useMemo(() => { + const safeStyle: any = {} + if (Platform.OS === 'ios') { + switch (position) { + case 'bottom': + safeStyle.paddingBottom = insets.bottom + break + case 'top': + safeStyle.paddingTop = insets.top + break + case 'left': + case 'right': + safeStyle.paddingTop = insets.top + safeStyle.paddingBottom = insets.bottom + break + } + } + return safeStyle + }, [position, insets]) + + // 抽屉内容动画样式 + const drawerAnimatedStyle = useAnimatedStyle(() => { + const baseStyle: any = { + overflow: position === 'bottom' ? 'visible' : 'hidden', + } + + switch (position) { + case 'bottom': + baseStyle.transform = [{ translateY: translateY.value }] + baseStyle.bottom = 0 + baseStyle.left = 0 + baseStyle.right = 0 + baseStyle.height = drawerHeight + baseStyle.borderTopLeftRadius = 20 + baseStyle.borderTopRightRadius = 20 + break + case 'top': + baseStyle.transform = [{ translateY: translateY.value }] + baseStyle.top = 0 + baseStyle.left = 0 + baseStyle.right = 0 + baseStyle.height = drawerHeight + baseStyle.borderBottomLeftRadius = 20 + baseStyle.borderBottomRightRadius = 20 + break + case 'left': + baseStyle.transform = [{ translateX: translateX.value }] + baseStyle.left = 0 + baseStyle.top = 0 + baseStyle.bottom = 0 + baseStyle.width = drawerWidth + baseStyle.borderTopRightRadius = 20 + baseStyle.borderBottomRightRadius = 20 + break + case 'right': + baseStyle.transform = [{ translateX: translateX.value }] + baseStyle.right = 0 + baseStyle.top = 0 + baseStyle.bottom = 0 + baseStyle.width = drawerWidth + baseStyle.borderTopLeftRadius = 20 + baseStyle.borderBottomLeftRadius = 20 + break + } + + return baseStyle + }, [position, drawerHeight, drawerWidth]) + + // 遮罩层动画样式 + const backdropAnimatedStyle = useAnimatedStyle(() => { + return { + opacity: backdropOpacity.value, + } + }) + + if (!visible) { + return null + } + + return ( + + + {/* 遮罩层 */} + {showBackdrop && ( + + )} + + {/* 抽屉内容 */} + + + {showCloseButton && ( + + + + )} + {children} + + + + + ) + }, +) + +Drawer.displayName = 'Drawer' + +// 根据位置获取样式(圆角已在动画样式中设置) +const getPositionStyles = (position: DrawerPosition) => { + return {} +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + }, + backdrop: { + ...StyleSheet.absoluteFillObject, + }, + drawer: { + position: 'absolute', + backgroundColor: '#1C1E20', + }, + closeButton: { + position: 'absolute', + top: Platform.select({ ios: 16, android: 16, default: 16 }), + right: Platform.select({ ios: 16, android: 16, default: 16 }), + zIndex: 10, + width: 24, + height: 24, + alignItems: 'center', + justifyContent: 'center', + }, +}) + +export default Drawer + diff --git a/components/ui/dropdown.tsx b/components/ui/dropdown.tsx new file mode 100644 index 0000000..a6b2779 --- /dev/null +++ b/components/ui/dropdown.tsx @@ -0,0 +1,402 @@ +import { useState, useRef, useEffect } from 'react' +import { + View, + Text, + StyleSheet, + Pressable, + Modal, + FlatList, + TouchableWithoutFeedback, + LayoutChangeEvent, + Platform, + useWindowDimensions, +} from 'react-native' +import { useSafeAreaInsets } from 'react-native-safe-area-context' +import { DownArrowIcon } from '@/components/icon' + +export interface DropdownOption { + label: string + value: T + disabled?: boolean +} + +export interface DropdownProps { + /** + * 选项列表 + */ + options: DropdownOption[] + /** + * 当前选中的值 + */ + value?: T + /** + * 选择回调 + */ + onSelect?: (value: T, option: DropdownOption) => void + /** + * 占位符文本 + */ + placeholder?: string + /** + * 是否禁用 + */ + disabled?: boolean + /** + * 自定义触发按钮渲染 + */ + renderTrigger?: (selectedOption: DropdownOption | undefined, isOpen: boolean, toggle: () => void) => React.ReactNode + /** + * 下拉列表的最大高度 + */ + maxHeight?: number + /** + * 下拉菜单距离触发按钮的垂直偏移(默认4px) + */ + offsetTop?: number + /** + * 自定义样式 + */ + style?: any + /** + * 触发按钮样式 + */ + triggerStyle?: any + /** + * 下拉列表样式 + */ + dropdownStyle?: any + /** + * 选项项样式 + */ + optionStyle?: any + /** + * 选项文本样式 + */ + optionTextStyle?: any + /** + * 自定义选项渲染函数 + */ + renderOption?: (option: DropdownOption, isSelected: boolean) => React.ReactNode +} + +export default function Dropdown({ + options, + value, + onSelect, + placeholder = '请选择', + disabled = false, + renderTrigger, + maxHeight = 200, + offsetTop = 4, + style, + triggerStyle, + dropdownStyle, + optionStyle, + optionTextStyle, + renderOption, +}: DropdownProps) { + const [isOpen, setIsOpen] = useState(false) + const [triggerLayout, setTriggerLayout] = useState({ x: 0, y: 0, width: 0, height: 0 }) + const triggerRef = useRef(null) + const layoutRef = useRef({ width: 0, height: 0 }) + const { width: screenWidth } = useWindowDimensions() + const insets = useSafeAreaInsets() + + // 获取当前选中的选项 + const selectedOption = options.find(option => option.value === value) + + // 测量触发按钮的位置(跨平台兼容) + const measureTrigger = () => { + if (!triggerRef.current) return + + if (Platform.OS === 'android') { + // Android 上使用 measure 方法,它返回相对于父组件的坐标 + triggerRef.current.measure((_x, _y, width, height, pageX, pageY) => { + const finalWidth = width || layoutRef.current.width || 200 + const finalHeight = height || layoutRef.current.height || 40 + // pageY 在 Android 上已经包含了状态栏高度,所以直接使用 + setTriggerLayout({ + x: pageX, + y: pageY, + width: finalWidth, + height: finalHeight + }) + }) + } else { + // iOS 和 Web 使用 measureInWindow + triggerRef.current.measureInWindow((x, y, width, height) => { + const finalWidth = width || layoutRef.current.width || 200 + const finalHeight = height || layoutRef.current.height || 40 + + if (Platform.OS === 'web' && (width === 0 || height === 0)) { + // Web 平台使用 measure 作为后备 + triggerRef.current?.measure((_x, _y, w, h, pageX, pageY) => { + setTriggerLayout({ + x: pageX || x, + y: pageY || y, + width: w || finalWidth, + height: h || finalHeight + }) + }) + } else { + setTriggerLayout({ + x, + y, + width: finalWidth, + height: finalHeight + }) + } + }) + } + } + + // 测量触发按钮的位置 + const handleTriggerLayout = (event: LayoutChangeEvent) => { + const { width, height } = event.nativeEvent.layout + layoutRef.current = { width, height } + // 延迟测量以确保布局已完成 + setTimeout(() => { + measureTrigger() + }, 0) + } + + // 处理选项选择 + const handleSelect = (option: DropdownOption) => { + if (option.disabled) return + onSelect?.(option.value, option) + setIsOpen(false) + } + + // 切换下拉菜单显示状态 + const toggleDropdown = () => { + if (disabled) return + // 在打开时重新测量位置 + if (!isOpen) { + // 使用 setTimeout 确保在打开前完成测量 + // Android 上需要稍微延迟以确保测量准确 + const delay = Platform.OS === 'android' ? 50 : 0 + setTimeout(() => { + measureTrigger() + }, delay) + } + setIsOpen(!isOpen) + } + + // 当打开时,重新测量位置(处理滚动等情况) + useEffect(() => { + if (isOpen) { + // Android 上需要稍微延迟以确保测量准确 + const delay = Platform.OS === 'android' ? 50 : 0 + setTimeout(() => { + measureTrigger() + }, delay) + } + }, [isOpen]) + + // 关闭下拉菜单 + const closeDropdown = () => { + setIsOpen(false) + } + + // 默认触发按钮渲染 + const defaultTrigger = ( + + + {selectedOption ? selectedOption.label : placeholder} + + + + + + ) + + return ( + + {renderTrigger ? renderTrigger(selectedOption, isOpen, toggleDropdown) : defaultTrigger} + + + + + + {(() => { + const dropdownWidth = (dropdownStyle as any)?.minWidth || (dropdownStyle as any)?.width || Math.max(triggerLayout.width, 200) + const hasRightAlignment = (dropdownStyle as any)?.right !== undefined + const rightValue = (dropdownStyle as any)?.right + const calculatedLeft = hasRightAlignment + ? screenWidth - (rightValue || 0) - dropdownWidth + : triggerLayout.x + + // 从 dropdownStyle 中移除 right,避免样式冲突 + const { right, ...restDropdownStyle } = dropdownStyle || {} + + return ( + + `option-${index}-${String(item.value)}`} + renderItem={({ item }) => { + const isSelected = item.value === value + if (renderOption) { + return ( + handleSelect(item)} + disabled={item.disabled} + > + {renderOption(item, isSelected)} + + ) + } + return ( + handleSelect(item)} + disabled={item.disabled} + > + + {item.label} + + + ) + }} + showsVerticalScrollIndicator={false} + /> + + ) + })()} + + + + + + ) +} + +const styles = StyleSheet.create({ + container: { + position: 'relative', + }, + trigger: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + paddingHorizontal: 12, + paddingVertical: 8, + borderRadius: 8, + backgroundColor: '#272A30', + minHeight: 40, + }, + triggerDisabled: { + opacity: 0.5, + }, + triggerText: { + color: '#F5F5F5', + fontSize: 14, + fontWeight: '500', + flex: 1, + }, + triggerTextPlaceholder: { + color: '#ABABAB', + }, + arrowIcon: { + marginLeft: 8, + transform: [{ rotate: '0deg' }], + }, + arrowIconRotated: { + transform: [{ rotate: '180deg' }], + }, + modalOverlay: { + flex: 1, + backgroundColor: 'rgba(0, 0, 0, 0.3)', + }, + dropdown: { + position: 'absolute', + backgroundColor: '#272A30', + borderRadius: 12, + overflow: 'hidden', + ...Platform.select({ + ios: { + shadowColor: '#000', + shadowOffset: { + width: 0, + height: 4, + }, + shadowOpacity: 0.3, + shadowRadius: 8, + }, + android: { + elevation: 8, + }, + web: { + shadowColor: '#000', + shadowOffset: { + width: 0, + height: 4, + }, + shadowOpacity: 0.3, + shadowRadius: 8, + boxShadow: '0 4px 8px rgba(0, 0, 0, 0.3)', + }, + }), + }, + option: { + paddingHorizontal: 16, + paddingVertical: 12, + }, + optionSelected: { + backgroundColor: '#3A3D42', + }, + optionDisabled: { + opacity: 0.5, + }, + optionText: { + color: '#F5F5F5', + fontSize: 14, + fontWeight: '400', + }, + optionTextSelected: { + color: '#FFCF00', + fontWeight: '500', + }, + optionTextDisabled: { + color: '#ABABAB', + }, +}) + diff --git a/components/ui/index.ts b/components/ui/index.ts new file mode 100644 index 0000000..e4ad55c --- /dev/null +++ b/components/ui/index.ts @@ -0,0 +1,8 @@ +export { default as Block } from './Block' +export { default as Text } from './Text' +export { default as Img } from './Img' +export { default as ModalPortal } from './ModalPortal' +export { default as Toast } from './Toast' +export { default as StartGeneratingNotification } from './notifications/StartGeneratingNotification' +export { default as Dropdown } from './dropdown' +export type { DropdownOption, DropdownProps } from './dropdown' diff --git a/components/ui/media.tsx b/components/ui/media.tsx new file mode 100644 index 0000000..56967d3 --- /dev/null +++ b/components/ui/media.tsx @@ -0,0 +1,66 @@ +import { forwardRef, useMemo } from "react"; +import { VideoView } from "expo-video"; +import Image from "./Img"; +import { VideoPlayer, type VideoPlayerProps } from "./video"; +import { cn } from "@/lib/utils"; + +type MediaType = "image" | "video"; + +interface MediaProps extends Omit { + source: string | { uri: string }; + type?: MediaType; + poster?: string; + visible?: boolean; +} + +const VIDEO_EXTENSIONS = /\.(mp4|mov|avi|mkv|webm|m4v|flv|wmv|3gp)$/i; +const IMAGE_EXTENSIONS = /\.(jpg|jpeg|png|gif|webp|bmp|svg)$/i; + +const detectMediaType = (source: string | { uri: string }): MediaType => { + const uri = typeof source === "string" ? source : source.uri; + + if (VIDEO_EXTENSIONS.test(uri)) { + return "video"; + } + + if (IMAGE_EXTENSIONS.test(uri)) { + return "image"; + } + + return "image"; +}; + +const Media = forwardRef( + ({ source, type, poster, visible = true, className, loop = true, ...props }, ref) => { + const mediaType = useMemo( + () => type || detectMediaType(source), + [source, type] + ); + if (mediaType === "video") { + return ( + + ); + } + + return ( + + ); + } +); + +Media.displayName = "Media"; + +export { Media, type MediaProps, type MediaType }; diff --git a/components/ui/notifications/StartGeneratingNotification.tsx b/components/ui/notifications/StartGeneratingNotification.tsx new file mode 100644 index 0000000..8ed6a06 --- /dev/null +++ b/components/ui/notifications/StartGeneratingNotification.tsx @@ -0,0 +1,142 @@ +import React from 'react' +import { ViewStyle, Pressable, StyleSheet, View, Text, Platform } from 'react-native' +import { Image } from 'expo-image' +import { BlurView } from 'expo-blur' +import { RightArrowIcon } from '@/components/icon' +export interface NotificationProps { + /** + * 未读数量 + */ + count?: number + /** + * 是否显示通知 + */ + visible?: boolean + /** + * 点击事件 + */ + onPress?: () => void + /** + * 自定义样式 + */ + style?: ViewStyle + /** + * 最大显示数量,超过显示 99+ + */ + maxCount?: number + /** + * 通知标题 + */ + title?: string + /** + * 通知内容 + */ + message?: string +} + +/** + * 通知组件 + * 基于 Figma 设计实现的通知横幅组件 + * 尺寸: 359x60 + */ +const Notification: React.FC = ({ + count = 0, + visible = true, + onPress, + style, + title, + message, +}) => { + const shouldShow = visible && count > 0 + + if (!shouldShow) { + return null + } + + return ( + + + + + + + {title && ( + + {title} + + )} + {message && ( + + {message} + + )} + + + + + + + ) +} + +const styles = StyleSheet.create({ + container: { + width: '100%', + }, + notificationBanner: { + height: 60, + width: '100%', + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + borderRadius: 12, + backgroundColor: Platform.OS === 'ios' ? '#FFFFFF1A' : '#FFFFFF1A', + overflow: 'hidden', + paddingHorizontal: 16, + }, + notificationBannerIcon: { + width: 32, + height: 32, + alignItems: 'center', + justifyContent: 'center', + marginRight: 12, + }, + iconImage: { + width: 32, + height: 32, + }, + contentWrapper: { + flex: 1, + }, + title: { + marginBottom: 2, + fontSize: 14, + fontWeight: '600', + color: '#F5F5F5', + }, + message: { + fontSize: 12, + color: '#CCCCCC', + }, + badgeContainer: { + marginLeft: 12, + minWidth: 20, + alignItems: 'center', + justifyContent: 'center', + }, +}) + +export default Notification + diff --git a/components/ui/tooltip.tsx b/components/ui/tooltip.tsx new file mode 100644 index 0000000..876e9ac --- /dev/null +++ b/components/ui/tooltip.tsx @@ -0,0 +1,239 @@ +import * as React from "react"; +import { + View, + Text, + Pressable, + Modal, + type ViewStyle, + type TextStyle, + LayoutChangeEvent, + StyleSheet, +} from "react-native"; +import Animated, { + useAnimatedStyle, + useSharedValue, + withSpring, + withTiming, +} from "react-native-reanimated"; + +import { cn } from "../../lib/utils"; + +type Side = "top" | "bottom" | "left" | "right"; + +interface TooltipContextValue { + open: boolean; + setOpen: (open: boolean) => void; + triggerRef: React.MutableRefObject; + side: Side; + sideOffset: number; +} + +const TooltipContext = React.createContext(null); + +const useTooltipContext = () => { + const context = React.useContext(TooltipContext); + if (!context) { + throw new Error("Tooltip components must be used within TooltipProvider"); + } + return context; +}; + +interface TooltipProviderProps { + children: React.ReactNode; + delayDuration?: number; +} + +const TooltipProvider: React.FC = ({ + children, + delayDuration = 200, +}) => { + return <>{children}; +}; + +interface TooltipProps { + children: React.ReactNode; + side?: Side; + sideOffset?: number; +} + +const Tooltip: React.FC = ({ + children, + side = "top", + sideOffset = 8, +}) => { + const [open, setOpen] = React.useState(false); + const triggerRef = React.useRef(null); + + const value: TooltipContextValue = { + open, + setOpen, + triggerRef, + side, + sideOffset, + }; + + return ( + {children} + ); +}; + +interface TooltipTriggerProps { + children: React.ReactNode; + asChild?: boolean; + style?: ViewStyle; +} + +const TooltipTrigger = React.forwardRef( + ({ children, asChild, style }, ref) => { + const { setOpen, triggerRef } = useTooltipContext(); + + const handleRef = (node: View | null) => { + triggerRef.current = node; + if (typeof ref === "function") { + ref(node); + } else if (ref) { + ref.current = node; + } + }; + + if (asChild && React.isValidElement(children)) { + return React.cloneElement(children as React.ReactElement, { + ref: handleRef, + onPressIn: () => setOpen(true), + onPressOut: () => setOpen(false), + }); + } + + return ( + setOpen(true)} + onPressOut={() => setOpen(false)} + style={style} + > + {children} + + ); + } +); + +TooltipTrigger.displayName = "TooltipTrigger"; + +interface TooltipContentProps { + children: React.ReactNode; + className?: string; + style?: ViewStyle; + textStyle?: TextStyle; +} + +const TooltipContent = React.forwardRef( + ({ children, className, style, textStyle }, ref) => { + const { open, triggerRef, side, sideOffset } = useTooltipContext(); + const [layout, setLayout] = React.useState<{ + width: number; + height: number; + } | null>(null); + const [triggerLayout, setTriggerLayout] = React.useState<{ + x: number; + y: number; + width: number; + height: number; + } | null>(null); + + const opacity = useSharedValue(0); + const scale = useSharedValue(0.95); + + React.useEffect(() => { + if (open && triggerRef.current) { + triggerRef.current.measure((x, y, width, height, pageX, pageY) => { + setTriggerLayout({ x: pageX, y: pageY, width, height }); + }); + opacity.value = withTiming(1, { duration: 200 }); + scale.value = withSpring(1, { damping: 15, stiffness: 300 }); + } else { + opacity.value = withTiming(0, { duration: 150 }); + scale.value = withTiming(0.95, { duration: 150 }); + } + }, [open]); + + const animatedStyle = useAnimatedStyle(() => ({ + opacity: opacity.value, + transform: [{ scale: scale.value }], + })); + + const handleLayout = (event: LayoutChangeEvent) => { + const { width, height } = event.nativeEvent.layout; + setLayout({ width, height }); + }; + + const getPosition = (): ViewStyle => { + if (!triggerLayout || !layout) return {}; + + let top = 0; + let left = 0; + + switch (side) { + case "top": + top = triggerLayout.y - layout.height - sideOffset; + left = triggerLayout.x + triggerLayout.width / 2 - layout.width / 2; + break; + case "bottom": + top = triggerLayout.y + triggerLayout.height + sideOffset; + left = triggerLayout.x + triggerLayout.width / 2 - layout.width / 2; + break; + case "left": + top = triggerLayout.y + triggerLayout.height / 2 - layout.height / 2; + left = triggerLayout.x - layout.width - sideOffset; + break; + case "right": + top = triggerLayout.y + triggerLayout.height / 2 - layout.height / 2; + left = triggerLayout.x + triggerLayout.width + sideOffset; + break; + } + + return { position: "absolute", top, left }; + }; + + if (!open) return null; + + return ( + + + {typeof children === "string" ? ( + + {children} + + ) : ( + children + )} + + + ); + } +); + +TooltipContent.displayName = "TooltipContent"; + +const styles = StyleSheet.create({ + tooltip: { + zIndex: 9999, + }, +}); + +export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }; diff --git a/components/ui/video.tsx b/components/ui/video.tsx new file mode 100644 index 0000000..7cc47d4 --- /dev/null +++ b/components/ui/video.tsx @@ -0,0 +1,136 @@ +import { useVideoPlayer, VideoView } from "expo-video"; +import { forwardRef, useEffect, useState } from "react"; +import { View, Pressable, Text, ActivityIndicator } from "react-native"; +import { cn } from "../../lib/utils"; +import Image from "./Img"; + +interface VideoPlayerProps { + source: string | { uri: string }; + poster?: string; + visible?: boolean; + className?: string; + autoPlay?: boolean; + loop?: boolean; + muted?: boolean; + controls?: boolean; + onError?: (error: string) => void; + onLoad?: () => void; +} + +const VideoPlayer = forwardRef( + ( + { + source, + poster, + visible = true, + className, + autoPlay = false, + loop = false, + muted = false, + controls = true, + onError, + onLoad, + }, + ref + ) => { + const videoSource = typeof source === "string" ? { uri: source } : source; + + const player = useVideoPlayer(videoSource, (player) => { + player.loop = loop; + player.muted = muted; + }); + + const [isPlaying, setIsPlaying] = useState(false); + const [isLoading, setIsLoading] = useState(true); + const [showPoster, setShowPoster] = useState(!!poster); + + useEffect(() => { + if (!visible) { + player.pause(); + if (poster) { + setShowPoster(true); + } + return; + } + + if (autoPlay && visible) { + player.play(); + } + }, [visible, autoPlay, player, poster]); + + useEffect(() => { + const playingSubscription = player.addListener("playingChange", ({ isPlaying }) => { + setIsPlaying(isPlaying); + if (isPlaying) { + setShowPoster(false); + } + }); + + const statusSubscription = player.addListener("statusChange", (payload) => { + if (payload.status === "readyToPlay") { + setIsLoading(false); + onLoad?.(); + } + + if (payload.status === "error" && payload.error) { + onError?.(payload.error.message); + } + }); + + return () => { + playingSubscription.remove(); + statusSubscription.remove(); + }; + }, [player, onError, onLoad]); + + const togglePlayback = () => { + if (isPlaying) { + player.pause(); + } else { + player.play(); + setShowPoster(false); + } + }; + + return ( + + {visible && ( + + )} + + {showPoster && poster && ( + + )} + + + {controls && !isLoading && visible && ( + + {(!isPlaying || showPoster) && ( + + + + )} + + )} + + ); + } +); + +VideoPlayer.displayName = "VideoPlayer"; + +export { VideoPlayer, type VideoPlayerProps }; diff --git a/constants/theme.ts b/constants/theme.ts new file mode 100644 index 0000000..0ce28e2 --- /dev/null +++ b/constants/theme.ts @@ -0,0 +1,53 @@ +/** + * Below are the colors that are used in the app. The colors are defined in the light and dark mode. + * There are many other ways to style your app. For example, [Nativewind](https://www.nativewind.dev/), [Tamagui](https://tamagui.dev/), [unistyles](https://reactnativeunistyles.vercel.app), etc. + */ + +import { Platform } from 'react-native'; + +const tintColorLight = '#0a7ea4'; +const tintColorDark = '#fff'; + +export const Colors = { + light: { + text: '#11181C', + background: '#fff', + tint: tintColorLight, + icon: '#687076', + tabIconDefault: '#687076', + tabIconSelected: tintColorLight, + }, + dark: { + text: '#ECEDEE', + background: '#090A0B', + tint: tintColorDark, + icon: '#9BA1A6', + tabIconDefault: '#9BA1A6', + tabIconSelected: tintColorDark, + }, +}; + +export const Fonts = Platform.select({ + ios: { + /** iOS `UIFontDescriptorSystemDesignDefault` */ + sans: 'system-ui', + /** iOS `UIFontDescriptorSystemDesignSerif` */ + serif: 'ui-serif', + /** iOS `UIFontDescriptorSystemDesignRounded` */ + rounded: 'ui-rounded', + /** iOS `UIFontDescriptorSystemDesignMonospaced` */ + mono: 'ui-monospace', + }, + default: { + sans: 'normal', + serif: 'serif', + rounded: 'normal', + mono: 'monospace', + }, + web: { + sans: "system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif", + serif: "Georgia, 'Times New Roman', serif", + rounded: "'SF Pro Rounded', 'Hiragino Maru Gothic ProN', Meiryo, 'MS PGothic', sans-serif", + mono: "SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace", + }, +}); diff --git a/eas.json b/eas.json new file mode 100644 index 0000000..cee00fd --- /dev/null +++ b/eas.json @@ -0,0 +1,33 @@ +{ + "cli": { + "version": ">= 16.27.0", + "appVersionSource": "remote" + }, + "build": { + "development": { + "developmentClient": true, + "distribution": "internal", + "android": { + "buildType": "apk" + }, + "corepack": true + }, + "preview": { + "distribution": "internal", + "android": { + "buildType": "apk" + }, + "corepack": true + }, + "production": { + "autoIncrement": true, + "android": { + "buildType": "apk" + }, + "corepack": true + } + }, + "submit": { + "production": {} + } +} diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..5025da6 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,10 @@ +// https://docs.expo.dev/guides/using-eslint/ +const { defineConfig } = require('eslint/config'); +const expoConfig = require('eslint-config-expo/flat'); + +module.exports = defineConfig([ + expoConfig, + { + ignores: ['dist/*'], + }, +]); diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..2752827 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,339 @@ +import eslintJs from '@eslint/js' +import typescriptEslint from '@typescript-eslint/eslint-plugin' +import typescriptParser from '@typescript-eslint/parser' +import { defineConfig } from 'eslint/config' +import expoConfig from 'eslint-config-expo/flat.js' +import i18nJsonPlugin from 'eslint-plugin-i18n-json' +import prettierPlugin from 'eslint-plugin-prettier' +import reactCompilerPlugin from 'eslint-plugin-react-compiler' +import reactNativePlugin from 'eslint-plugin-react-native' +import simpleImportSortPlugin from 'eslint-plugin-simple-import-sort' +import tailwindcssPlugin from 'eslint-plugin-tailwindcss' +// 由于 eslint-plugin-unicorn 在解析时出现语法错误,暂时移除该插件 +// const unicornPlugin = await import('eslint-plugin-unicorn').catch(() => null) +import unusedImportsPlugin from 'eslint-plugin-unused-imports' +import path from 'path' +import { fileURLToPath } from 'url' + +const __filename = fileURLToPath(import.meta.url) +const __dirname = path.dirname(__filename) + +// 共享的插件配置 (移除可能与 expo 冲突的插件) +const sharedPlugins = { + prettier: prettierPlugin, + 'unused-imports': unusedImportsPlugin, + 'simple-import-sort': simpleImportSortPlugin, + tailwindcss: tailwindcssPlugin, + // unicorn: unicornPlugin, + 'react-native': reactNativePlugin, +} + +// 共享的规则配置 +const sharedRules = { + // Prettier 配置 + 'prettier/prettier': [ + 'error', + { + singleQuote: true, + endOfLine: 'auto', + trailingComma: 'all', + printWidth: 100, + tabWidth: 4, + semi: false, + arrowParens: 'always', + bracketSameLine: false, + bracketSpacing: true, + jsxSingleQuote: false, + useTabs: false, + quoteProps: 'as-needed', + plugins: ['prettier-plugin-tailwindcss'], + }, + { usePrettierrc: false }, + ], + + // 通用规则 + 'max-params': ['error', 3], + 'max-lines-per-function': ['error', 500], + + // Import 规则 + 'import/prefer-default-export': 'off', + 'import/no-cycle': ['error', { maxDepth: '∞' }], + + // Import 排序 + 'simple-import-sort/imports': 'error', + 'simple-import-sort/exports': 'error', + + // 未使用的导入 + 'unused-imports/no-unused-imports': 'error', + 'unused-imports/no-unused-vars': [ + 'error', + { + argsIgnorePattern: '^_', + varsIgnorePattern: '^_', + caughtErrorsIgnorePattern: '^_', + }, + ], + + // Tailwind CSS 规则 + 'tailwindcss/classnames-order': 'off', + 'tailwindcss/enforces-negative-arbitrary-values': 'error', + 'tailwindcss/enforces-shorthand': 'error', + 'tailwindcss/migration-from-tailwind-2': 'error', + 'tailwindcss/no-arbitrary-value': 'off', + 'tailwindcss/no-contradicting-classname': 'error', + 'tailwindcss/no-custom-classname': 'off', + 'tailwindcss/no-unnecessary-arbitrary-value': 'error', + + // Unicorn 规则 + 'unicorn/filename-case': [ + 'error', + { + case: 'kebabCase', + ignore: ['/android', '/ios'], + }, + ], + + // React 规则 + 'react/display-name': 'off', + 'react/destructuring-assignment': 'off', + 'react/require-default-props': 'off', + 'react/no-unescaped-entities': 'off', + + // React/JSX 属性排序规则 + 'react/jsx-sort-props': [ + 'error', + { + callbacksLast: true, // 回调函数属性放在最后 + shorthandFirst: true, // 简写属性放在前面 + shorthandLast: false, + multiline: 'last', // 多行属性放在最后 + ignoreCase: true, // 忽略大小写 + noSortAlphabetically: false, + reservedFirst: true, // 保留属性(如 key, ref)放在最前面 + }, + ], + + // JSX 属性换行规则 + 'react/jsx-max-props-per-line': [ + 'error', + { + maximum: 1, // 每行最多一个属性 + when: 'multiline', // 仅在多行时生效 + }, + ], + + // JSX 第一个属性换行规则 + 'react/jsx-first-prop-new-line': ['error', 'multiline-multiprop'], + + // React Native 规则 + 'react-native/no-unused-styles': 'off', + 'react-native/split-platform-components': 'off', + 'react-native/no-inline-styles': 'off', + 'react-native/no-color-literals': 'off', + 'react-native/no-raw-text': 'error', + 'react-native/no-single-element-style-arrays': 'off', + + // 限制导入规则 - 强制使用自定义 Text 组件 + 'no-restricted-imports': [ + 'error', + { + paths: [ + { + name: 'react-native', + importNames: ['Text'], + message: 'please use @/components/ui instead of react-native Text', + }, + ], + patterns: [ + { + group: ['react-native'], + importNames: ['Text'], + message: 'please use @/components/ui instead of react-native Text', + }, + ], + }, + ], +} + +export default defineConfig([ + // Base recommended config + eslintJs.configs.recommended, + + // Expo config - 添加 expo 配置 + expoConfig, + + // Global ignores + { + ignores: [ + 'node_modules/', + 'ios/', + 'android/', + '.expo/', + 'assets/', + '**/.vscode', + '**/.idea', + 'dist/', + '**/app.json', + '**/eas.json', + ], + }, + + // Base configuration for JavaScript files + { + files: ['**/*.js', '**/*.jsx', '**/*.mjs'], + plugins: sharedPlugins, + rules: { + ...sharedRules, + 'no-undef': 'off', + }, + languageOptions: { + globals: { + __DEV__: 'readonly', + __dirname: 'readonly', + __filename: 'readonly', + console: 'readonly', + global: 'readonly', + process: 'readonly', + Buffer: 'readonly', + }, + ecmaVersion: 'latest', + sourceType: 'module', + }, + settings: { + 'import/resolver': { + node: { + extensions: ['.js', '.jsx', '.ts', '.tsx'], + moduleDirectory: ['node_modules', './'], + }, + }, + }, + }, + + // TypeScript files configuration + { + files: ['**/*.ts', '**/*.tsx'], + languageOptions: { + parser: typescriptParser, + parserOptions: { + project: './tsconfig.json', + ecmaFeatures: { + jsx: true, + }, + ecmaVersion: 'latest', + sourceType: 'module', + tsconfigRootDir: __dirname, + }, + globals: { + __DEV__: 'readonly', + __dirname: 'readonly', + __filename: 'readonly', + console: 'readonly', + global: 'readonly', + process: 'readonly', + Buffer: 'readonly', + }, + }, + plugins: { + ...sharedPlugins, + '@typescript-eslint': typescriptEslint, + 'react-compiler': reactCompilerPlugin, + }, + rules: { + ...sharedRules, + // TypeScript 特有规则 + '@typescript-eslint/comma-dangle': 'off', + '@typescript-eslint/consistent-type-imports': [ + 'warn', + { + prefer: 'type-imports', + fixStyle: 'inline-type-imports', + disallowTypeAnnotations: true, + }, + ], + '@typescript-eslint/no-unused-vars': 'off', + + // 禁止使用 any 类型的规则 + '@typescript-eslint/no-explicit-any': 'error', + + // 禁止将 any 类型作为参数传递 + '@typescript-eslint/no-unsafe-argument': 'error', + + // 禁止将 any 类型赋值给其他变量 + '@typescript-eslint/no-unsafe-assignment': 'error', + + // 禁止调用 any 类型的函数 + '@typescript-eslint/no-unsafe-call': 'error', + + // 禁止访问 any 类型的成员 + '@typescript-eslint/no-unsafe-member-access': 'error', + + // 禁止从函数返回 any 类型 + '@typescript-eslint/no-unsafe-return': 'error', + + // React Compiler rules + 'react-compiler/react-compiler': 'error', + + // Unicorn 特有配置 (覆盖共享配置) + 'unicorn/prefer-module': 'off', + + // Expo-specific rules + 'no-undef': 'off', // TypeScript handles this + }, + settings: { + 'import/resolver': { + typescript: { + alwaysTryTypes: true, + project: path.resolve(__dirname, './tsconfig.json'), + }, + node: { + extensions: ['.js', '.jsx', '.ts', '.tsx'], + moduleDirectory: ['node_modules', './'], + }, + }, + }, + }, + + // Translation files configuration + { + files: ['translations/*.json'], + plugins: { + 'i18n-json': i18nJsonPlugin, + }, + processor: { + meta: { name: '.json' }, + ...i18nJsonPlugin.processors['.json'], + }, + rules: { + ...i18nJsonPlugin.configs.recommended.rules, + + // 消息值的语法是否符合特定的国际化格式要求 + 'i18n-json/valid-message-syntax': [ + 2, + { + syntax: path.resolve('./scripts/i18next-syntax-validation.js'), + }, + ], + + // 是否包含有效的 JSON 语法 + 'i18n-json/valid-json': 2, + + // 按照特定的顺序排列 + // 关闭解决新加字段覆盖问题 + 'i18n-json/sorted-keys': [ + 2, + { + order: 'asc', + indentSpaces: 4, + }, + ], + + // 检查是否有缺失的键或者多出来的键 + 'i18n-json/identical-keys': [ + 2, + { + filePath: path.resolve('./translations/en-US.json'), + }, + ], + }, + }, +]) diff --git a/global.css b/global.css new file mode 100644 index 0000000..a90f074 --- /dev/null +++ b/global.css @@ -0,0 +1,4 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + diff --git a/hooks/CLAUDE.md b/hooks/CLAUDE.md new file mode 100644 index 0000000..db3162e --- /dev/null +++ b/hooks/CLAUDE.md @@ -0,0 +1,55 @@ + + +使用:apps\popcore\lib\auth.ts中的loomart接口 +封装 hooks 供页面使用 + +实例代码: +```tsx +import { loomart } from "@/lib/auth" +import { ApiError } from "@/lib/types" +import { useState } from "react" +export const useActivates = () => { + const [loading, setLoading] = useState(false) + const [error, setError] = useState(null) + const [data, setData] = useState<{ + activities: { + title: string; + titleEn: string; + desc: string; + descEn: string; + coverUrl: string; + link: string; + createdAt: Date; + updatedAt: Date; + id: string; + videoUrl?: string | null | undefined; + isActive?: boolean | null | undefined; + sortOrder?: number | null | undefined; + }[]; + total: number; + page: number; + limit: number; + totalPages: number; + }>() + const load = async () => { + try { + setLoading(true) + const { data, error } = await loomart.activities.list({ isActive: true }) + if (error) { + setError(error) + return; + } + setData(data) + } catch (e) { + setLoading(false) + } + } + + return { + load, + loading, + error, + data + } +} +``` \ No newline at end of file diff --git a/hooks/use-activates.ts b/hooks/use-activates.ts new file mode 100644 index 0000000..595d4b6 --- /dev/null +++ b/hooks/use-activates.ts @@ -0,0 +1,48 @@ +import { loomart } from "@/lib/auth" +import { ApiError } from "@/lib/types" +import { useState } from "react" +export const useActivates = () => { + const [loading, setLoading] = useState(false) + const [error, setError] = useState(null) + const [data, setData] = useState<{ + activities: { + title: string; + titleEn: string; + desc: string; + descEn: string; + coverUrl: string; + link: string; + createdAt: Date; + updatedAt: Date; + id: string; + videoUrl?: string | null | undefined; + isActive?: boolean | null | undefined; + sortOrder?: number | null | undefined; + }[]; + total: number; + page: number; + limit: number; + totalPages: number; + }>() + const load = async () => { + try { + setLoading(true) + const { data, error } = await loomart.activities.list({ isActive: true }) + console.log({ data, error }) + if (error) { + setError(error) + return; + } + setData(data) + } catch (e) { + setLoading(false) + } + } + + return { + load, + loading, + error, + data + } +} \ No newline at end of file diff --git a/hooks/use-color-scheme.ts b/hooks/use-color-scheme.ts new file mode 100644 index 0000000..17e3c63 --- /dev/null +++ b/hooks/use-color-scheme.ts @@ -0,0 +1 @@ +export { useColorScheme } from 'react-native'; diff --git a/hooks/use-color-scheme.web.ts b/hooks/use-color-scheme.web.ts new file mode 100644 index 0000000..7eb1c1b --- /dev/null +++ b/hooks/use-color-scheme.web.ts @@ -0,0 +1,21 @@ +import { useEffect, useState } from 'react'; +import { useColorScheme as useRNColorScheme } from 'react-native'; + +/** + * To support static rendering, this value needs to be re-calculated on the client side for web + */ +export function useColorScheme() { + const [hasHydrated, setHasHydrated] = useState(false); + + useEffect(() => { + setHasHydrated(true); + }, []); + + const colorScheme = useRNColorScheme(); + + if (hasHydrated) { + return colorScheme; + } + + return 'light'; +} diff --git a/hooks/use-resource.tsx b/hooks/use-resource.tsx new file mode 100644 index 0000000..07031d7 --- /dev/null +++ b/hooks/use-resource.tsx @@ -0,0 +1,79 @@ + +export const CLOUDFLARE_ZONE = `popcore.ai` + +const isVideo = (url: string): boolean => { + const videoExts = /\.(mp4|mov|avi|webm|m4v|mkv|flv|wmv)$/i; + return videoExts.test(url); +}; + +export function useResource(source: any, options: { + time?: string; + width?: number; + height?: number; + fit?: 'contain' | 'scale-down' | 'cover'; + format?: 'jpg' | 'png'; +} = {}) { + // 处理 React Native 的本地资源(require 返回数字) + if (typeof source === "number") { + return { source, poster: source }; + } + + const videoSource = typeof source === "string" ? source : source?.uri; + + if (!videoSource) { + return { source, poster: source }; + } + + const isVideoFile = isVideo(videoSource); + + return { + source: isVideoFile ? getVideoUrl(videoSource, { width: options.width, height: options.height }) : videoSource, + poster: isVideoFile ? getVideoThumbnail(videoSource, options) : undefined + } +} + +// 首帧图 +const getVideoThumbnail = ( + videoUrl: string, + options: { + time?: string; + width?: number; + height?: number; + fit?: 'contain' | 'scale-down' | 'cover'; + format?: 'jpg' | 'png'; + } = {} +): string => { + if (videoUrl.startsWith(`https://${CLOUDFLARE_ZONE}`)) { + return videoUrl; + } + const opts: string[] = ['mode=frame']; + + if (options?.time) opts.push(`time=${options.time}`); + if (options?.width) opts.push(`width=${options.width}`); + if (options?.height) opts.push(`height=${options.height}`); + if (options?.fit) opts.push(`fit=${options.fit}`); + if (options?.format) opts.push(`format=${options.format}`); + + const optionsString = opts.join(','); + return `https://${CLOUDFLARE_ZONE}/cdn-cgi/media/${optionsString}/${videoUrl}`; +}; + +const getVideoUrl = ( + videoUrl: string, + options: { + width?: number; + height?: number; + } = {} +) => { + if (videoUrl.startsWith(`https://${CLOUDFLARE_ZONE}`)) { + return videoUrl; + } + + const opts: string[] = ['mode=video', 'audio=false']; + + if (options?.width) opts.push(`width=${options.width}`); + if (options?.height) opts.push(`height=${options.height}`); + + const optionsString = opts.join(','); + return `https://${CLOUDFLARE_ZONE}/cdn-cgi/media/${optionsString}/${videoUrl}`; +} diff --git a/hooks/use-theme-color.ts b/hooks/use-theme-color.ts new file mode 100644 index 0000000..0cbc3a6 --- /dev/null +++ b/hooks/use-theme-color.ts @@ -0,0 +1,21 @@ +/** + * Learn more about light and dark modes: + * https://docs.expo.dev/guides/color-schemes/ + */ + +import { Colors } from '@/constants/theme'; +import { useColorScheme } from '@/hooks/use-color-scheme'; + +export function useThemeColor( + props: { light?: string; dark?: string }, + colorName: keyof typeof Colors.light & keyof typeof Colors.dark +) { + const theme = useColorScheme() ?? 'light'; + const colorFromProps = props[theme]; + + if (colorFromProps) { + return colorFromProps; + } else { + return Colors[theme][colorName]; + } +} diff --git a/lib/auth.ts b/lib/auth.ts new file mode 100644 index 0000000..5d7c1fa --- /dev/null +++ b/lib/auth.ts @@ -0,0 +1,27 @@ +import { createAuthClient } from "better-auth/react"; +import { usernameClient, phoneNumberClient, emailOTPClient, genericOAuthClient, adminClient, organizationClient, jwtClient } from 'better-auth/client/plugins' +import * as SecureStore from "expo-secure-store"; +import { expoClient } from "@better-auth/expo/client"; + +import loomartPlugin from './plugins/loomart-plugin'; +export const authClient = createAuthClient({ + baseURL: "http://localhost:14333/api/auth", + trustedOrigins: ["duooomi://"], + storage: SecureStore, + scheme: "duooomi", + plugins: [ + loomartPlugin(), + usernameClient(), + phoneNumberClient(), + emailOTPClient(), + genericOAuthClient(), + jwtClient(), + adminClient(), + organizationClient(), + expoClient({ + storage: SecureStore + }) + ], +}); + +export const { signIn, signUp, signOut, useSession, $Infer, loomart, admin } = authClient; diff --git a/lib/i18n.ts b/lib/i18n.ts new file mode 100644 index 0000000..d34485f --- /dev/null +++ b/lib/i18n.ts @@ -0,0 +1,125 @@ +import i18n from 'i18next' +import { initReactI18next } from 'react-i18next' +import AsyncStorage from '@react-native-async-storage/async-storage' +import { NativeModules, Platform } from 'react-native' + +// 导入语言资源 +import zhCN from '../locales/zh-CN.json' +import enUS from '../locales/en-US.json' + +// 定义支持的语言 +export const SUPPORTED_LANGUAGES = { + 'zh-CN': '简体中文', + 'en-US': 'English', +} as const + +export type SupportedLanguage = keyof typeof SUPPORTED_LANGUAGES + +// 获取系统语言(Android 和 iOS 兼容) +const getSystemLanguage = (): string => { + try { + let locale: string | undefined + + if (Platform.OS === 'ios') { + // iOS: 从 SettingsManager 获取 + const settings = NativeModules.SettingsManager?.settings + locale = settings?.AppleLocale || settings?.AppleLanguages?.[0] + } else if (Platform.OS === 'android') { + // Android: 从 I18nManager 获取 + locale = NativeModules.I18nManager?.localeIdentifier + } + + if (locale) { + // 处理语言代码格式,例如 'zh_CN' -> 'zh-CN', 'en_US' -> 'en-US' + const normalized = locale.replace('_', '-').toLowerCase() + if (normalized.startsWith('zh')) { + return 'zh-CN' + } else if (normalized.startsWith('en')) { + return 'en-US' + } + } + } catch (error) { + // 静默处理错误,使用默认语言 + console.warn('Error getting system language:', error) + } + return 'zh-CN' // 默认返回中文 +} + +// AsyncStorage 语言检测器(兼容 Android 和 iOS) +const languageDetector = { + type: 'languageDetector' as const, + async: true, + detect: async (callback: (lng: string) => void) => { + try { + // 1. 优先使用用户保存的语言设置 + const savedLanguage = await AsyncStorage.getItem('app_language') + if (savedLanguage) { + // 兼容旧的语言代码格式 + if (savedLanguage === 'zh' || savedLanguage === 'zh-CN') { + callback('zh-CN') + return + } else if (savedLanguage === 'en' || savedLanguage === 'en-US') { + callback('en-US') + return + } + } + + // 2. 如果没有保存的语言,尝试使用系统语言 + const systemLang = getSystemLanguage() + callback(systemLang) + } catch (error) { + console.error('Error detecting language:', error) + // 3. 如果出错,使用默认语言 + callback('zh-CN') + } + }, + init: () => {}, + cacheUserLanguage: async (lng: string) => { + try { + // AsyncStorage 在 Android 和 iOS 上都正常工作 + await AsyncStorage.setItem('app_language', lng) + } catch (error) { + console.error('Error saving language:', error) + } + }, +} + +// i18n配置 +i18n.use(languageDetector) + .use(initReactI18next) + .init({ + // 语言资源 + resources: { + 'zh-CN': { + translation: zhCN, + }, + 'en-US': { + translation: enUS, + }, + }, + + // 默认语言 + fallbackLng: 'zh-CN', + + // 调试模式(开发环境开启) + debug: false, + + // 兼容性配置:使用 v3 格式处理复数,避免 Android 端 Intl.PluralRules 不支持的问题 + compatibilityJSON: 'v3', + + // 插值配置 + interpolation: { + escapeValue: false, // React已经处理了XSS防护 + }, + + // 命名空间配置 + defaultNS: 'translation', + ns: ['translation'], + + // 键值分隔符 + keySeparator: '.', + nsSeparator: ':', + }) + +export default i18n + diff --git a/lib/plugins/loomart-plugin.ts b/lib/plugins/loomart-plugin.ts new file mode 100644 index 0000000..076e91e --- /dev/null +++ b/lib/plugins/loomart-plugin.ts @@ -0,0 +1,7 @@ +import type { loomart } from "./loomart"; +export default () => { + return { + id: "loomart", + $InferServerPlugin: {} as ReturnType, + } +} diff --git a/lib/plugins/loomart.d.ts b/lib/plugins/loomart.d.ts new file mode 100644 index 0000000..2d318ab --- /dev/null +++ b/lib/plugins/loomart.d.ts @@ -0,0 +1,7333 @@ +import * as zod from 'zod'; +import { z } from 'zod'; +import * as better_call from 'better-call'; +import * as better_auth from 'better-auth'; +import { Workflow } from '@cloudflare/workers-types'; +import * as better_auth_plugins_access from 'better-auth/plugins/access'; + +declare const getSchema: () => { + readonly project: { + readonly fields: { + readonly userId: { + readonly type: "string"; + readonly required: true; + readonly references: { + readonly model: "user"; + readonly field: "id"; + }; + }; + readonly sourceTemplateId: { + readonly type: "string"; + }; + readonly title: { + readonly type: "string"; + readonly required: true; + }; + readonly titleEn: { + readonly type: "string"; + readonly required: true; + }; + readonly description: { + readonly type: "string"; + readonly required: true; + }; + readonly descriptionEn: { + readonly type: "string"; + readonly required: true; + }; + readonly resultUrl: { + readonly type: "string"; + readonly required: false; + readonly defaultValue: ""; + }; + readonly content: { + readonly type: "json"; + readonly required: true; + }; + readonly createdAt: { + readonly type: "date"; + readonly required: true; + }; + readonly updatedAt: { + readonly type: "date"; + readonly required: true; + }; + }; + }; + readonly category: { + readonly fields: { + readonly ownerId: { + readonly type: "string"; + }; + readonly name: { + readonly type: "string"; + readonly required: true; + readonly unique: true; + }; + readonly nameEn: { + readonly type: "string"; + readonly required: true; + readonly unique: true; + }; + readonly description: { + readonly type: "string"; + readonly required: true; + }; + readonly descriptionEn: { + readonly type: "string"; + readonly required: true; + }; + readonly sortOrder: { + readonly type: "number"; + readonly required: true; + readonly defaultValue: 0; + }; + readonly isActive: { + readonly type: "boolean"; + readonly required: true; + readonly defaultValue: true; + }; + readonly createdAt: { + readonly type: "date"; + readonly required: true; + }; + readonly updatedAt: { + readonly type: "date"; + readonly required: true; + }; + }; + }; + readonly template: { + readonly fields: { + readonly userId: { + readonly type: "string"; + readonly required: true; + readonly references: { + readonly model: "user"; + readonly field: "id"; + }; + }; + readonly title: { + readonly type: "string"; + readonly required: true; + }; + readonly titleEn: { + readonly type: "string"; + readonly required: true; + }; + readonly ownerId: { + readonly type: "string"; + }; + readonly description: { + readonly type: "string"; + readonly required: true; + }; + readonly descriptionEn: { + readonly type: "string"; + readonly required: true; + }; + readonly coverImageUrl: { + readonly type: "string"; + readonly required: true; + readonly defaultValue: ""; + }; + readonly previewUrl: { + readonly type: "string"; + readonly required: true; + readonly defaultValue: ""; + }; + readonly content: { + readonly type: "json"; + readonly required: true; + }; + readonly formSchema: { + readonly type: "json"; + }; + readonly uploadSapecifications: { + readonly type: "string"; + }; + readonly uploadSapecificationsEn: { + readonly type: "string"; + }; + readonly sortOrder: { + readonly type: "number"; + readonly required: true; + readonly defaultValue: 0; + }; + readonly costPrice: { + readonly type: "number"; + }; + readonly price: { + readonly type: "number"; + }; + readonly createdAt: { + readonly type: "date"; + readonly required: true; + }; + readonly updatedAt: { + readonly type: "date"; + readonly required: true; + }; + readonly aspectRatio: { + readonly type: "string"; + readonly required: true; + readonly defaultValue: "9:16"; + }; + readonly status: { + readonly type: "string"; + readonly required: true; + readonly defaultValue: "AUDITING"; + }; + readonly isDeleted: { + readonly type: "boolean"; + readonly required: true; + readonly defaultValue: false; + }; + readonly deletedAt: { + readonly type: "date"; + }; + }; + }; + readonly recommendedTemplate: { + readonly fields: { + readonly templateId: { + readonly type: "string"; + readonly required: true; + readonly unique: true; + readonly references: { + readonly model: "template"; + readonly field: "id"; + }; + }; + readonly sortOrder: { + readonly type: "number"; + readonly required: true; + readonly defaultValue: 0; + }; + readonly isActive: { + readonly type: "boolean"; + readonly required: true; + readonly defaultValue: true; + }; + readonly createdAt: { + readonly type: "date"; + readonly required: true; + }; + readonly updatedAt: { + readonly type: "date"; + readonly required: true; + }; + }; + }; + readonly tag: { + readonly fields: { + readonly ownerId: { + readonly type: "string"; + }; + readonly name: { + readonly type: "string"; + readonly required: true; + readonly unique: true; + }; + readonly nameEn: { + readonly type: "string"; + readonly required: true; + readonly unique: true; + }; + readonly description: { + readonly type: "string"; + readonly defaultValue: ""; + }; + readonly descriptionEn: { + readonly type: "string"; + readonly defaultValue: ""; + }; + readonly sortOrder: { + readonly type: "number"; + readonly required: true; + readonly defaultValue: 0; + }; + readonly createdAt: { + readonly type: "date"; + readonly required: true; + }; + readonly updatedAt: { + readonly type: "date"; + readonly required: true; + }; + }; + }; + readonly categoryTag: { + readonly fields: { + readonly categoryId: { + readonly type: "string"; + readonly required: true; + readonly references: { + readonly model: "category"; + readonly field: "id"; + }; + }; + readonly tagId: { + readonly type: "string"; + readonly required: true; + readonly references: { + readonly model: "tag"; + readonly field: "id"; + }; + }; + readonly sortOrder: { + readonly type: "number"; + readonly defaultValue: 0; + }; + readonly createdAt: { + readonly type: "date"; + readonly required: true; + }; + readonly updatedAt: { + readonly type: "date"; + readonly required: true; + }; + }; + }; + readonly categoryTagTemplate: { + readonly fields: { + readonly templateId: { + readonly type: "string"; + readonly required: true; + readonly references: { + readonly model: "template"; + readonly field: "id"; + }; + }; + readonly categoryTagId: { + readonly type: "string"; + readonly required: true; + readonly references: { + readonly model: "categoryTag"; + readonly field: "id"; + }; + }; + readonly sortOrder: { + readonly type: "number"; + readonly defaultValue: 0; + }; + readonly createdAt: { + readonly type: "date"; + readonly required: true; + }; + readonly updatedAt: { + readonly type: "date"; + readonly required: true; + }; + }; + }; + readonly activity: { + readonly fields: { + readonly title: { + readonly type: "string"; + readonly required: true; + }; + readonly titleEn: { + readonly type: "string"; + readonly required: true; + }; + readonly desc: { + readonly type: "string"; + readonly required: true; + }; + readonly descEn: { + readonly type: "string"; + readonly required: true; + }; + readonly coverUrl: { + readonly type: "string"; + readonly required: true; + }; + readonly videoUrl: { + readonly type: "string"; + }; + readonly ownerId: { + readonly type: "string"; + }; + readonly link: { + readonly type: "string"; + readonly required: true; + }; + readonly isActive: { + readonly type: "boolean"; + readonly defaultValue: true; + }; + readonly sortOrder: { + readonly type: "number"; + readonly defaultValue: 0; + }; + readonly createdAt: { + readonly type: "date"; + readonly required: true; + }; + readonly updatedAt: { + readonly type: "date"; + readonly required: true; + }; + }; + }; + readonly aigcBilling: { + readonly fields: { + readonly userId: { + readonly type: "string"; + readonly required: true; + readonly references: { + readonly model: "user"; + readonly field: "id"; + }; + }; + readonly taskId: { + readonly type: "string"; + readonly required: true; + readonly unique: true; + }; + readonly taskType: { + readonly type: "string"; + readonly required: true; + }; + readonly modelName: { + readonly type: "string"; + }; + readonly status: { + readonly type: "string"; + readonly defaultValue: "pending"; + }; + readonly input: { + readonly type: "json"; + }; + readonly output: { + readonly type: "json"; + }; + readonly price: { + readonly type: "number"; + }; + readonly usage: { + readonly type: "json"; + }; + readonly rating: { + readonly type: "number"; + }; + readonly errorMessage: { + readonly type: "string"; + }; + readonly createdAt: { + readonly type: "date"; + readonly required: true; + }; + readonly updatedAt: { + readonly type: "date"; + readonly required: true; + }; + }; + }; + readonly templateGeneration: { + readonly fields: { + readonly userId: { + readonly type: "string"; + readonly required: true; + readonly references: { + readonly model: "user"; + readonly field: "id"; + }; + }; + readonly templateId: { + readonly type: "string"; + readonly required: true; + readonly references: { + readonly model: "template"; + readonly field: "id"; + }; + }; + readonly type: { + readonly type: "string"; + readonly required: true; + }; + readonly resultUrl: { + readonly type: "json"; + readonly required: true; + }; + readonly originalUrl: { + readonly type: "string"; + }; + readonly createdAt: { + readonly type: "date"; + readonly required: true; + }; + readonly updatedAt: { + readonly type: "date"; + readonly required: true; + }; + readonly status: { + readonly type: "string"; + readonly defaultValue: "pending"; + }; + readonly creditsCost: { + readonly type: "number"; + readonly defaultValue: 0; + }; + readonly creditsTransactionId: { + readonly type: "string"; + }; + }; + }; +}; + +type SchemaDef = ReturnType; +type GetZodType = T extends { + type: 'string'; +} ? z.ZodString : T extends { + type: 'number'; +} ? z.ZodNumber : T extends { + type: 'boolean'; +} ? z.ZodBoolean : T extends { + type: 'date'; +} ? z.ZodDate : T extends { + type: 'json'; +} ? z.ZodAny : z.ZodAny; +type ZodFieldType = T extends { + required: true; +} ? GetZodType : z.ZodNullable>>; +type ModelShape = { + [F in keyof SchemaDef[M]['fields']]: ZodFieldType; +} & { + id: z.ZodString; +}; +type InferZodSchema = z.infer>>; +declare const getZodSchemaFromModel: (modelName: M) => z.ZodObject>; + +declare function getLoomartOptions(context: any): LoomartOptions; + +declare const defaultStatements: { + readonly activity: readonly ["create", "read", "update", "delete"]; + readonly project: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly template: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly recommendedTemplate: readonly ["create", "read", "list", "update", "delete"]; + readonly category: readonly ["create", "read", "list", "update", "delete"]; + readonly file: readonly ["upload", "list", "update", "delete"]; + readonly selfFile: readonly ["upload", "list", "update", "delete"]; + readonly tag: readonly ["create", "list", "read", "update", "delete"]; + readonly wallet: readonly ["grantCredit", "revokeCredit"]; + readonly user: readonly ["create", "read", "list", "update", "delete"]; +}; +type Statements = typeof defaultStatements; +declare const ac: { + newRole(statements: better_auth_plugins_access.Subset): { + authorize(request: K_1 extends infer T extends K_2 ? { [key in T]?: better_auth_plugins_access.Subset[key] | { + actions: better_auth_plugins_access.Subset[key]; + connector: "OR" | "AND"; + } | undefined; } : never, connector?: "OR" | "AND"): better_auth_plugins_access.AuthorizeResponse; + statements: better_auth_plugins_access.Subset; + }; + statements: { + readonly activity: readonly ["create", "read", "update", "delete"]; + readonly project: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly template: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly recommendedTemplate: readonly ["create", "read", "list", "update", "delete"]; + readonly category: readonly ["create", "read", "list", "update", "delete"]; + readonly file: readonly ["upload", "list", "update", "delete"]; + readonly selfFile: readonly ["upload", "list", "update", "delete"]; + readonly tag: readonly ["create", "list", "read", "update", "delete"]; + readonly wallet: readonly ["grantCredit", "revokeCredit"]; + readonly user: readonly ["create", "read", "list", "update", "delete"]; + }; +}; +/** + * 角色 - 权限 + * 组织 + * 用户 superadmin 没有组织 user/editor 没有组织 contentAdmin有组织 + */ +declare const user: { + authorize(request: K_1 extends infer T extends K ? { [key in T]?: better_auth_plugins_access.Subset<"template" | "selfFile", { + readonly activity: readonly ["create", "read", "update", "delete"]; + readonly project: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly template: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly recommendedTemplate: readonly ["create", "read", "list", "update", "delete"]; + readonly category: readonly ["create", "read", "list", "update", "delete"]; + readonly file: readonly ["upload", "list", "update", "delete"]; + readonly selfFile: readonly ["upload", "list", "update", "delete"]; + readonly tag: readonly ["create", "list", "read", "update", "delete"]; + readonly wallet: readonly ["grantCredit", "revokeCredit"]; + readonly user: readonly ["create", "read", "list", "update", "delete"]; + }>[key] | { + actions: better_auth_plugins_access.Subset<"template" | "selfFile", { + readonly activity: readonly ["create", "read", "update", "delete"]; + readonly project: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly template: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly recommendedTemplate: readonly ["create", "read", "list", "update", "delete"]; + readonly category: readonly ["create", "read", "list", "update", "delete"]; + readonly file: readonly ["upload", "list", "update", "delete"]; + readonly selfFile: readonly ["upload", "list", "update", "delete"]; + readonly tag: readonly ["create", "list", "read", "update", "delete"]; + readonly wallet: readonly ["grantCredit", "revokeCredit"]; + readonly user: readonly ["create", "read", "list", "update", "delete"]; + }>[key]; + connector: "OR" | "AND"; + } | undefined; } : never, connector?: "OR" | "AND"): better_auth_plugins_access.AuthorizeResponse; + statements: better_auth_plugins_access.Subset<"template" | "selfFile", { + readonly activity: readonly ["create", "read", "update", "delete"]; + readonly project: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly template: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly recommendedTemplate: readonly ["create", "read", "list", "update", "delete"]; + readonly category: readonly ["create", "read", "list", "update", "delete"]; + readonly file: readonly ["upload", "list", "update", "delete"]; + readonly selfFile: readonly ["upload", "list", "update", "delete"]; + readonly tag: readonly ["create", "list", "read", "update", "delete"]; + readonly wallet: readonly ["grantCredit", "revokeCredit"]; + readonly user: readonly ["create", "read", "list", "update", "delete"]; + }>; +}; +declare const editor: { + authorize(request: K_1 extends infer T extends K ? { [key in T]?: better_auth_plugins_access.Subset<"project" | "template" | "category" | "tag", { + readonly activity: readonly ["create", "read", "update", "delete"]; + readonly project: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly template: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly recommendedTemplate: readonly ["create", "read", "list", "update", "delete"]; + readonly category: readonly ["create", "read", "list", "update", "delete"]; + readonly file: readonly ["upload", "list", "update", "delete"]; + readonly selfFile: readonly ["upload", "list", "update", "delete"]; + readonly tag: readonly ["create", "list", "read", "update", "delete"]; + readonly wallet: readonly ["grantCredit", "revokeCredit"]; + readonly user: readonly ["create", "read", "list", "update", "delete"]; + }>[key] | { + actions: better_auth_plugins_access.Subset<"project" | "template" | "category" | "tag", { + readonly activity: readonly ["create", "read", "update", "delete"]; + readonly project: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly template: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly recommendedTemplate: readonly ["create", "read", "list", "update", "delete"]; + readonly category: readonly ["create", "read", "list", "update", "delete"]; + readonly file: readonly ["upload", "list", "update", "delete"]; + readonly selfFile: readonly ["upload", "list", "update", "delete"]; + readonly tag: readonly ["create", "list", "read", "update", "delete"]; + readonly wallet: readonly ["grantCredit", "revokeCredit"]; + readonly user: readonly ["create", "read", "list", "update", "delete"]; + }>[key]; + connector: "OR" | "AND"; + } | undefined; } : never, connector?: "OR" | "AND"): better_auth_plugins_access.AuthorizeResponse; + statements: better_auth_plugins_access.Subset<"project" | "template" | "category" | "tag", { + readonly activity: readonly ["create", "read", "update", "delete"]; + readonly project: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly template: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly recommendedTemplate: readonly ["create", "read", "list", "update", "delete"]; + readonly category: readonly ["create", "read", "list", "update", "delete"]; + readonly file: readonly ["upload", "list", "update", "delete"]; + readonly selfFile: readonly ["upload", "list", "update", "delete"]; + readonly tag: readonly ["create", "list", "read", "update", "delete"]; + readonly wallet: readonly ["grantCredit", "revokeCredit"]; + readonly user: readonly ["create", "read", "list", "update", "delete"]; + }>; +}; +declare const contentadmin: { + authorize(request: K_1 extends infer T extends K ? { [key in T]?: better_auth_plugins_access.Subset<"template" | "recommendedTemplate" | "category" | "file" | "tag" | "user", { + readonly activity: readonly ["create", "read", "update", "delete"]; + readonly project: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly template: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly recommendedTemplate: readonly ["create", "read", "list", "update", "delete"]; + readonly category: readonly ["create", "read", "list", "update", "delete"]; + readonly file: readonly ["upload", "list", "update", "delete"]; + readonly selfFile: readonly ["upload", "list", "update", "delete"]; + readonly tag: readonly ["create", "list", "read", "update", "delete"]; + readonly wallet: readonly ["grantCredit", "revokeCredit"]; + readonly user: readonly ["create", "read", "list", "update", "delete"]; + }>[key] | { + actions: better_auth_plugins_access.Subset<"template" | "recommendedTemplate" | "category" | "file" | "tag" | "user", { + readonly activity: readonly ["create", "read", "update", "delete"]; + readonly project: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly template: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly recommendedTemplate: readonly ["create", "read", "list", "update", "delete"]; + readonly category: readonly ["create", "read", "list", "update", "delete"]; + readonly file: readonly ["upload", "list", "update", "delete"]; + readonly selfFile: readonly ["upload", "list", "update", "delete"]; + readonly tag: readonly ["create", "list", "read", "update", "delete"]; + readonly wallet: readonly ["grantCredit", "revokeCredit"]; + readonly user: readonly ["create", "read", "list", "update", "delete"]; + }>[key]; + connector: "OR" | "AND"; + } | undefined; } : never, connector?: "OR" | "AND"): better_auth_plugins_access.AuthorizeResponse; + statements: better_auth_plugins_access.Subset<"template" | "recommendedTemplate" | "category" | "file" | "tag" | "user", { + readonly activity: readonly ["create", "read", "update", "delete"]; + readonly project: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly template: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly recommendedTemplate: readonly ["create", "read", "list", "update", "delete"]; + readonly category: readonly ["create", "read", "list", "update", "delete"]; + readonly file: readonly ["upload", "list", "update", "delete"]; + readonly selfFile: readonly ["upload", "list", "update", "delete"]; + readonly tag: readonly ["create", "list", "read", "update", "delete"]; + readonly wallet: readonly ["grantCredit", "revokeCredit"]; + readonly user: readonly ["create", "read", "list", "update", "delete"]; + }>; +}; +declare const superadmin: { + authorize(request: K_1 extends infer T extends K ? { [key in T]?: better_auth_plugins_access.Subset<"activity" | "project" | "template" | "recommendedTemplate" | "category" | "file" | "tag" | "wallet" | "user", { + readonly activity: readonly ["create", "read", "update", "delete"]; + readonly project: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly template: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly recommendedTemplate: readonly ["create", "read", "list", "update", "delete"]; + readonly category: readonly ["create", "read", "list", "update", "delete"]; + readonly file: readonly ["upload", "list", "update", "delete"]; + readonly selfFile: readonly ["upload", "list", "update", "delete"]; + readonly tag: readonly ["create", "list", "read", "update", "delete"]; + readonly wallet: readonly ["grantCredit", "revokeCredit"]; + readonly user: readonly ["create", "read", "list", "update", "delete"]; + }>[key] | { + actions: better_auth_plugins_access.Subset<"activity" | "project" | "template" | "recommendedTemplate" | "category" | "file" | "tag" | "wallet" | "user", { + readonly activity: readonly ["create", "read", "update", "delete"]; + readonly project: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly template: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly recommendedTemplate: readonly ["create", "read", "list", "update", "delete"]; + readonly category: readonly ["create", "read", "list", "update", "delete"]; + readonly file: readonly ["upload", "list", "update", "delete"]; + readonly selfFile: readonly ["upload", "list", "update", "delete"]; + readonly tag: readonly ["create", "list", "read", "update", "delete"]; + readonly wallet: readonly ["grantCredit", "revokeCredit"]; + readonly user: readonly ["create", "read", "list", "update", "delete"]; + }>[key]; + connector: "OR" | "AND"; + } | undefined; } : never, connector?: "OR" | "AND"): better_auth_plugins_access.AuthorizeResponse; + statements: better_auth_plugins_access.Subset<"activity" | "project" | "template" | "recommendedTemplate" | "category" | "file" | "tag" | "wallet" | "user", { + readonly activity: readonly ["create", "read", "update", "delete"]; + readonly project: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly template: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly recommendedTemplate: readonly ["create", "read", "list", "update", "delete"]; + readonly category: readonly ["create", "read", "list", "update", "delete"]; + readonly file: readonly ["upload", "list", "update", "delete"]; + readonly selfFile: readonly ["upload", "list", "update", "delete"]; + readonly tag: readonly ["create", "list", "read", "update", "delete"]; + readonly wallet: readonly ["grantCredit", "revokeCredit"]; + readonly user: readonly ["create", "read", "list", "update", "delete"]; + }>; +}; +declare const roles: { + user: { + authorize(request: K_1 extends infer T extends K ? { [key in T]?: better_auth_plugins_access.Subset<"template" | "selfFile", { + readonly activity: readonly ["create", "read", "update", "delete"]; + readonly project: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly template: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly recommendedTemplate: readonly ["create", "read", "list", "update", "delete"]; + readonly category: readonly ["create", "read", "list", "update", "delete"]; + readonly file: readonly ["upload", "list", "update", "delete"]; + readonly selfFile: readonly ["upload", "list", "update", "delete"]; + readonly tag: readonly ["create", "list", "read", "update", "delete"]; + readonly wallet: readonly ["grantCredit", "revokeCredit"]; + readonly user: readonly ["create", "read", "list", "update", "delete"]; + }>[key] | { + actions: better_auth_plugins_access.Subset<"template" | "selfFile", { + readonly activity: readonly ["create", "read", "update", "delete"]; + readonly project: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly template: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly recommendedTemplate: readonly ["create", "read", "list", "update", "delete"]; + readonly category: readonly ["create", "read", "list", "update", "delete"]; + readonly file: readonly ["upload", "list", "update", "delete"]; + readonly selfFile: readonly ["upload", "list", "update", "delete"]; + readonly tag: readonly ["create", "list", "read", "update", "delete"]; + readonly wallet: readonly ["grantCredit", "revokeCredit"]; + readonly user: readonly ["create", "read", "list", "update", "delete"]; + }>[key]; + connector: "OR" | "AND"; + } | undefined; } : never, connector?: "OR" | "AND"): better_auth_plugins_access.AuthorizeResponse; + statements: better_auth_plugins_access.Subset<"template" | "selfFile", { + readonly activity: readonly ["create", "read", "update", "delete"]; + readonly project: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly template: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly recommendedTemplate: readonly ["create", "read", "list", "update", "delete"]; + readonly category: readonly ["create", "read", "list", "update", "delete"]; + readonly file: readonly ["upload", "list", "update", "delete"]; + readonly selfFile: readonly ["upload", "list", "update", "delete"]; + readonly tag: readonly ["create", "list", "read", "update", "delete"]; + readonly wallet: readonly ["grantCredit", "revokeCredit"]; + readonly user: readonly ["create", "read", "list", "update", "delete"]; + }>; + }; + editor: { + authorize(request: K_1 extends infer T extends K ? { [key in T]?: better_auth_plugins_access.Subset<"project" | "template" | "category" | "tag", { + readonly activity: readonly ["create", "read", "update", "delete"]; + readonly project: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly template: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly recommendedTemplate: readonly ["create", "read", "list", "update", "delete"]; + readonly category: readonly ["create", "read", "list", "update", "delete"]; + readonly file: readonly ["upload", "list", "update", "delete"]; + readonly selfFile: readonly ["upload", "list", "update", "delete"]; + readonly tag: readonly ["create", "list", "read", "update", "delete"]; + readonly wallet: readonly ["grantCredit", "revokeCredit"]; + readonly user: readonly ["create", "read", "list", "update", "delete"]; + }>[key] | { + actions: better_auth_plugins_access.Subset<"project" | "template" | "category" | "tag", { + readonly activity: readonly ["create", "read", "update", "delete"]; + readonly project: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly template: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly recommendedTemplate: readonly ["create", "read", "list", "update", "delete"]; + readonly category: readonly ["create", "read", "list", "update", "delete"]; + readonly file: readonly ["upload", "list", "update", "delete"]; + readonly selfFile: readonly ["upload", "list", "update", "delete"]; + readonly tag: readonly ["create", "list", "read", "update", "delete"]; + readonly wallet: readonly ["grantCredit", "revokeCredit"]; + readonly user: readonly ["create", "read", "list", "update", "delete"]; + }>[key]; + connector: "OR" | "AND"; + } | undefined; } : never, connector?: "OR" | "AND"): better_auth_plugins_access.AuthorizeResponse; + statements: better_auth_plugins_access.Subset<"project" | "template" | "category" | "tag", { + readonly activity: readonly ["create", "read", "update", "delete"]; + readonly project: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly template: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly recommendedTemplate: readonly ["create", "read", "list", "update", "delete"]; + readonly category: readonly ["create", "read", "list", "update", "delete"]; + readonly file: readonly ["upload", "list", "update", "delete"]; + readonly selfFile: readonly ["upload", "list", "update", "delete"]; + readonly tag: readonly ["create", "list", "read", "update", "delete"]; + readonly wallet: readonly ["grantCredit", "revokeCredit"]; + readonly user: readonly ["create", "read", "list", "update", "delete"]; + }>; + }; + contentadmin: { + authorize(request: K_1 extends infer T extends K ? { [key in T]?: better_auth_plugins_access.Subset<"template" | "recommendedTemplate" | "category" | "file" | "tag" | "user", { + readonly activity: readonly ["create", "read", "update", "delete"]; + readonly project: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly template: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly recommendedTemplate: readonly ["create", "read", "list", "update", "delete"]; + readonly category: readonly ["create", "read", "list", "update", "delete"]; + readonly file: readonly ["upload", "list", "update", "delete"]; + readonly selfFile: readonly ["upload", "list", "update", "delete"]; + readonly tag: readonly ["create", "list", "read", "update", "delete"]; + readonly wallet: readonly ["grantCredit", "revokeCredit"]; + readonly user: readonly ["create", "read", "list", "update", "delete"]; + }>[key] | { + actions: better_auth_plugins_access.Subset<"template" | "recommendedTemplate" | "category" | "file" | "tag" | "user", { + readonly activity: readonly ["create", "read", "update", "delete"]; + readonly project: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly template: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly recommendedTemplate: readonly ["create", "read", "list", "update", "delete"]; + readonly category: readonly ["create", "read", "list", "update", "delete"]; + readonly file: readonly ["upload", "list", "update", "delete"]; + readonly selfFile: readonly ["upload", "list", "update", "delete"]; + readonly tag: readonly ["create", "list", "read", "update", "delete"]; + readonly wallet: readonly ["grantCredit", "revokeCredit"]; + readonly user: readonly ["create", "read", "list", "update", "delete"]; + }>[key]; + connector: "OR" | "AND"; + } | undefined; } : never, connector?: "OR" | "AND"): better_auth_plugins_access.AuthorizeResponse; + statements: better_auth_plugins_access.Subset<"template" | "recommendedTemplate" | "category" | "file" | "tag" | "user", { + readonly activity: readonly ["create", "read", "update", "delete"]; + readonly project: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly template: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly recommendedTemplate: readonly ["create", "read", "list", "update", "delete"]; + readonly category: readonly ["create", "read", "list", "update", "delete"]; + readonly file: readonly ["upload", "list", "update", "delete"]; + readonly selfFile: readonly ["upload", "list", "update", "delete"]; + readonly tag: readonly ["create", "list", "read", "update", "delete"]; + readonly wallet: readonly ["grantCredit", "revokeCredit"]; + readonly user: readonly ["create", "read", "list", "update", "delete"]; + }>; + }; + superadmin: { + authorize(request: K_1 extends infer T extends K ? { [key in T]?: better_auth_plugins_access.Subset<"activity" | "project" | "template" | "recommendedTemplate" | "category" | "file" | "tag" | "wallet" | "user", { + readonly activity: readonly ["create", "read", "update", "delete"]; + readonly project: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly template: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly recommendedTemplate: readonly ["create", "read", "list", "update", "delete"]; + readonly category: readonly ["create", "read", "list", "update", "delete"]; + readonly file: readonly ["upload", "list", "update", "delete"]; + readonly selfFile: readonly ["upload", "list", "update", "delete"]; + readonly tag: readonly ["create", "list", "read", "update", "delete"]; + readonly wallet: readonly ["grantCredit", "revokeCredit"]; + readonly user: readonly ["create", "read", "list", "update", "delete"]; + }>[key] | { + actions: better_auth_plugins_access.Subset<"activity" | "project" | "template" | "recommendedTemplate" | "category" | "file" | "tag" | "wallet" | "user", { + readonly activity: readonly ["create", "read", "update", "delete"]; + readonly project: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly template: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly recommendedTemplate: readonly ["create", "read", "list", "update", "delete"]; + readonly category: readonly ["create", "read", "list", "update", "delete"]; + readonly file: readonly ["upload", "list", "update", "delete"]; + readonly selfFile: readonly ["upload", "list", "update", "delete"]; + readonly tag: readonly ["create", "list", "read", "update", "delete"]; + readonly wallet: readonly ["grantCredit", "revokeCredit"]; + readonly user: readonly ["create", "read", "list", "update", "delete"]; + }>[key]; + connector: "OR" | "AND"; + } | undefined; } : never, connector?: "OR" | "AND"): better_auth_plugins_access.AuthorizeResponse; + statements: better_auth_plugins_access.Subset<"activity" | "project" | "template" | "recommendedTemplate" | "category" | "file" | "tag" | "wallet" | "user", { + readonly activity: readonly ["create", "read", "update", "delete"]; + readonly project: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly template: readonly ["create", "read", "list", "update", "delete", "run"]; + readonly recommendedTemplate: readonly ["create", "read", "list", "update", "delete"]; + readonly category: readonly ["create", "read", "list", "update", "delete"]; + readonly file: readonly ["upload", "list", "update", "delete"]; + readonly selfFile: readonly ["upload", "list", "update", "delete"]; + readonly tag: readonly ["create", "list", "read", "update", "delete"]; + readonly wallet: readonly ["grantCredit", "revokeCredit"]; + readonly user: readonly ["create", "read", "list", "update", "delete"]; + }>; + }; +}; + +interface FileUploadResponse { + status: boolean; + msg: string; + data: string; + usage?: { + price: number; + price_desc: string; + }; +} +interface VideoCompressRequest { + url: string; + compress: 'low' | 'medium' | 'high'; +} +interface VideoCompressResponse { + status: boolean; + msg: string; + data: string; +} + +interface AigcModelInfo { + model_name: string; + description: string; + supported_ar: string[]; + supported_count: number[]; + mode: string; + model_provider: string; + extra: { + img_count: { + min: number; + max: number; + }; + other_params: Record; + }; + tags: string[]; + provider: string; + display_name: string; +} +interface AigcTaskResponse { + status: boolean; + msg: string; + data: string; +} +interface AigcTaskStatus { + status: boolean | string; + msg: string | { + message: string; + }; + data?: string[] | null; + extra?: string; + usage?: Record; +} + +interface GeneratedUser { + name: string; + email: string; + username: string; + displayUsername: string; +} + +interface LoomartOptions { + query: (sql: string, params: any[]) => Promise; + workflow?: Workflow; + prisma: any; +} +declare const loomart: (options: LoomartOptions) => { + id: "loomart"; + schema: { + readonly project: { + readonly fields: { + readonly userId: { + readonly type: "string"; + readonly required: true; + readonly references: { + readonly model: "user"; + readonly field: "id"; + }; + }; + readonly sourceTemplateId: { + readonly type: "string"; + }; + readonly title: { + readonly type: "string"; + readonly required: true; + }; + readonly titleEn: { + readonly type: "string"; + readonly required: true; + }; + readonly description: { + readonly type: "string"; + readonly required: true; + }; + readonly descriptionEn: { + readonly type: "string"; + readonly required: true; + }; + readonly resultUrl: { + readonly type: "string"; + readonly required: false; + readonly defaultValue: ""; + }; + readonly content: { + readonly type: "json"; + readonly required: true; + }; + readonly createdAt: { + readonly type: "date"; + readonly required: true; + }; + readonly updatedAt: { + readonly type: "date"; + readonly required: true; + }; + }; + }; + readonly category: { + readonly fields: { + readonly ownerId: { + readonly type: "string"; + }; + readonly name: { + readonly type: "string"; + readonly required: true; + readonly unique: true; + }; + readonly nameEn: { + readonly type: "string"; + readonly required: true; + readonly unique: true; + }; + readonly description: { + readonly type: "string"; + readonly required: true; + }; + readonly descriptionEn: { + readonly type: "string"; + readonly required: true; + }; + readonly sortOrder: { + readonly type: "number"; + readonly required: true; + readonly defaultValue: 0; + }; + readonly isActive: { + readonly type: "boolean"; + readonly required: true; + readonly defaultValue: true; + }; + readonly createdAt: { + readonly type: "date"; + readonly required: true; + }; + readonly updatedAt: { + readonly type: "date"; + readonly required: true; + }; + }; + }; + readonly template: { + readonly fields: { + readonly userId: { + readonly type: "string"; + readonly required: true; + readonly references: { + readonly model: "user"; + readonly field: "id"; + }; + }; + readonly title: { + readonly type: "string"; + readonly required: true; + }; + readonly titleEn: { + readonly type: "string"; + readonly required: true; + }; + readonly ownerId: { + readonly type: "string"; + }; + readonly description: { + readonly type: "string"; + readonly required: true; + }; + readonly descriptionEn: { + readonly type: "string"; + readonly required: true; + }; + readonly coverImageUrl: { + readonly type: "string"; + readonly required: true; + readonly defaultValue: ""; + }; + readonly previewUrl: { + readonly type: "string"; + readonly required: true; + readonly defaultValue: ""; + }; + readonly content: { + readonly type: "json"; + readonly required: true; + }; + readonly formSchema: { + readonly type: "json"; + }; + readonly uploadSapecifications: { + readonly type: "string"; + }; + readonly uploadSapecificationsEn: { + readonly type: "string"; + }; + readonly sortOrder: { + readonly type: "number"; + readonly required: true; + readonly defaultValue: 0; + }; + readonly costPrice: { + readonly type: "number"; + }; + readonly price: { + readonly type: "number"; + }; + readonly createdAt: { + readonly type: "date"; + readonly required: true; + }; + readonly updatedAt: { + readonly type: "date"; + readonly required: true; + }; + readonly aspectRatio: { + readonly type: "string"; + readonly required: true; + readonly defaultValue: "9:16"; + }; + readonly status: { + readonly type: "string"; + readonly required: true; + readonly defaultValue: "AUDITING"; + }; + readonly isDeleted: { + readonly type: "boolean"; + readonly required: true; + readonly defaultValue: false; + }; + readonly deletedAt: { + readonly type: "date"; + }; + }; + }; + readonly recommendedTemplate: { + readonly fields: { + readonly templateId: { + readonly type: "string"; + readonly required: true; + readonly unique: true; + readonly references: { + readonly model: "template"; + readonly field: "id"; + }; + }; + readonly sortOrder: { + readonly type: "number"; + readonly required: true; + readonly defaultValue: 0; + }; + readonly isActive: { + readonly type: "boolean"; + readonly required: true; + readonly defaultValue: true; + }; + readonly createdAt: { + readonly type: "date"; + readonly required: true; + }; + readonly updatedAt: { + readonly type: "date"; + readonly required: true; + }; + }; + }; + readonly tag: { + readonly fields: { + readonly ownerId: { + readonly type: "string"; + }; + readonly name: { + readonly type: "string"; + readonly required: true; + readonly unique: true; + }; + readonly nameEn: { + readonly type: "string"; + readonly required: true; + readonly unique: true; + }; + readonly description: { + readonly type: "string"; + readonly defaultValue: ""; + }; + readonly descriptionEn: { + readonly type: "string"; + readonly defaultValue: ""; + }; + readonly sortOrder: { + readonly type: "number"; + readonly required: true; + readonly defaultValue: 0; + }; + readonly createdAt: { + readonly type: "date"; + readonly required: true; + }; + readonly updatedAt: { + readonly type: "date"; + readonly required: true; + }; + }; + }; + readonly categoryTag: { + readonly fields: { + readonly categoryId: { + readonly type: "string"; + readonly required: true; + readonly references: { + readonly model: "category"; + readonly field: "id"; + }; + }; + readonly tagId: { + readonly type: "string"; + readonly required: true; + readonly references: { + readonly model: "tag"; + readonly field: "id"; + }; + }; + readonly sortOrder: { + readonly type: "number"; + readonly defaultValue: 0; + }; + readonly createdAt: { + readonly type: "date"; + readonly required: true; + }; + readonly updatedAt: { + readonly type: "date"; + readonly required: true; + }; + }; + }; + readonly categoryTagTemplate: { + readonly fields: { + readonly templateId: { + readonly type: "string"; + readonly required: true; + readonly references: { + readonly model: "template"; + readonly field: "id"; + }; + }; + readonly categoryTagId: { + readonly type: "string"; + readonly required: true; + readonly references: { + readonly model: "categoryTag"; + readonly field: "id"; + }; + }; + readonly sortOrder: { + readonly type: "number"; + readonly defaultValue: 0; + }; + readonly createdAt: { + readonly type: "date"; + readonly required: true; + }; + readonly updatedAt: { + readonly type: "date"; + readonly required: true; + }; + }; + }; + readonly activity: { + readonly fields: { + readonly title: { + readonly type: "string"; + readonly required: true; + }; + readonly titleEn: { + readonly type: "string"; + readonly required: true; + }; + readonly desc: { + readonly type: "string"; + readonly required: true; + }; + readonly descEn: { + readonly type: "string"; + readonly required: true; + }; + readonly coverUrl: { + readonly type: "string"; + readonly required: true; + }; + readonly videoUrl: { + readonly type: "string"; + }; + readonly ownerId: { + readonly type: "string"; + }; + readonly link: { + readonly type: "string"; + readonly required: true; + }; + readonly isActive: { + readonly type: "boolean"; + readonly defaultValue: true; + }; + readonly sortOrder: { + readonly type: "number"; + readonly defaultValue: 0; + }; + readonly createdAt: { + readonly type: "date"; + readonly required: true; + }; + readonly updatedAt: { + readonly type: "date"; + readonly required: true; + }; + }; + }; + readonly aigcBilling: { + readonly fields: { + readonly userId: { + readonly type: "string"; + readonly required: true; + readonly references: { + readonly model: "user"; + readonly field: "id"; + }; + }; + readonly taskId: { + readonly type: "string"; + readonly required: true; + readonly unique: true; + }; + readonly taskType: { + readonly type: "string"; + readonly required: true; + }; + readonly modelName: { + readonly type: "string"; + }; + readonly status: { + readonly type: "string"; + readonly defaultValue: "pending"; + }; + readonly input: { + readonly type: "json"; + }; + readonly output: { + readonly type: "json"; + }; + readonly price: { + readonly type: "number"; + }; + readonly usage: { + readonly type: "json"; + }; + readonly rating: { + readonly type: "number"; + }; + readonly errorMessage: { + readonly type: "string"; + }; + readonly createdAt: { + readonly type: "date"; + readonly required: true; + }; + readonly updatedAt: { + readonly type: "date"; + readonly required: true; + }; + }; + }; + readonly templateGeneration: { + readonly fields: { + readonly userId: { + readonly type: "string"; + readonly required: true; + readonly references: { + readonly model: "user"; + readonly field: "id"; + }; + }; + readonly templateId: { + readonly type: "string"; + readonly required: true; + readonly references: { + readonly model: "template"; + readonly field: "id"; + }; + }; + readonly type: { + readonly type: "string"; + readonly required: true; + }; + readonly resultUrl: { + readonly type: "json"; + readonly required: true; + }; + readonly originalUrl: { + readonly type: "string"; + }; + readonly createdAt: { + readonly type: "date"; + readonly required: true; + }; + readonly updatedAt: { + readonly type: "date"; + readonly required: true; + }; + readonly status: { + readonly type: "string"; + readonly defaultValue: "pending"; + }; + readonly creditsCost: { + readonly type: "number"; + readonly defaultValue: 0; + }; + readonly creditsTransactionId: { + readonly type: "string"; + }; + }; + }; + }; + init(ctx: better_auth.AuthContext): { + options: { + databaseHooks: {}; + }; + }; + endpoints: { + generateRandomUsers: { + (inputCtx_0: { + body: { + count: number; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + users: GeneratedUser[]; + }; + } : { + users: GeneratedUser[]; + }>; + options: { + method: "POST"; + body: zod.ZodObject<{ + count: zod.ZodNumber; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/random-users/generate"; + }; + createRandomUsers: { + (inputCtx_0: { + body: { + users: { + name: string; + email: string; + username: string; + displayUsername: string; + }[]; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + success: boolean; + created: number; + users: Array<{ + id: string; + name: string; + email: string; + }>; + errors: string[]; + }; + } : { + success: boolean; + created: number; + users: Array<{ + id: string; + name: string; + email: string; + }>; + errors: string[]; + }>; + options: { + method: "POST"; + body: zod.ZodObject<{ + users: zod.ZodArray>; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/random-users/create"; + }; + addUserBalance: { + (inputCtx_0: { + body: { + userId: string; + amount: number; + reason?: string | undefined; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + success: boolean; + balance: { + userId: string; + customerId: any; + amount: number; + currentBalance: number; + }; + message: string; + }; + } : { + success: boolean; + balance: { + userId: string; + customerId: any; + amount: number; + currentBalance: number; + }; + message: string; + }>; + options: { + method: "POST"; + body: zod.ZodObject<{ + userId: zod.ZodString; + amount: zod.ZodNumber; + reason: zod.ZodOptional; + }, better_auth.$strip>; + use: ((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>)[]; + metadata: { + SERVER_ONLY: true; + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: { + type: "object"; + properties: { + success: { + type: string; + }; + balance: { + type: string; + properties: { + userId: { + type: string; + }; + customerId: { + type: string; + }; + amount: { + type: string; + }; + currentBalance: { + type: string; + }; + }; + }; + message: { + type: string; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/admin-balance/add-user-balance"; + }; + deductUserBalance: { + (inputCtx_0: { + body: { + userId: string; + amount: number; + reason?: string | undefined; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + success: boolean; + balance: { + userId: string; + customerId: any; + amount: number; + currentBalance: number; + }; + message: string; + }; + } : { + success: boolean; + balance: { + userId: string; + customerId: any; + amount: number; + currentBalance: number; + }; + message: string; + }>; + options: { + method: "POST"; + body: zod.ZodObject<{ + userId: zod.ZodString; + amount: zod.ZodNumber; + reason: zod.ZodOptional; + }, better_auth.$strip>; + use: ((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>)[]; + metadata: { + SERVER_ONLY: true; + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: { + type: "object"; + properties: { + success: { + type: string; + }; + balance: { + type: string; + properties: { + userId: { + type: string; + }; + customerId: { + type: string; + }; + amount: { + type: string; + }; + currentBalance: { + type: string; + }; + }; + }; + message: { + type: string; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/admin-balance/deduct-user-balance"; + }; + getUserBalance: { + (inputCtx_0: { + body: { + userId: string; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + success: boolean; + balance: { + userId: string; + customerId: any; + currentBalance: number; + currency: string; + }; + }; + } : { + success: boolean; + balance: { + userId: string; + customerId: any; + currentBalance: number; + currency: string; + }; + }>; + options: { + method: "POST"; + body: zod.ZodObject<{ + userId: zod.ZodString; + }, better_auth.$strip>; + use: ((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>)[]; + metadata: { + SERVER_ONLY: true; + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: { + type: "object"; + properties: { + success: { + type: string; + }; + balance: { + type: string; + properties: { + userId: { + type: string; + }; + customerId: { + type: string; + }; + currentBalance: { + type: string; + }; + currency: { + type: string; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/admin-balance/get-user-balance"; + }; + listAigcBillings: { + (inputCtx_0: { + body: { + page?: number | undefined; + limit?: number | undefined; + userId?: string | undefined; + taskType?: string | undefined; + status?: string | undefined; + modelName?: string | undefined; + startDate?: string | undefined; + endDate?: string | undefined; + orderBy?: string | undefined; + order?: string | undefined; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + billings: { + userId: string; + taskId: string; + taskType: string; + createdAt: Date; + updatedAt: Date; + id: string; + modelName?: string | null | undefined; + status?: string | null | undefined; + input?: any; + output?: any; + price?: number | null | undefined; + usage?: any; + rating?: number | null | undefined; + errorMessage?: string | null | undefined; + }[]; + total: number; + page: number; + limit: number; + totalPages: number; + }; + } : { + billings: { + userId: string; + taskId: string; + taskType: string; + createdAt: Date; + updatedAt: Date; + id: string; + modelName?: string | null | undefined; + status?: string | null | undefined; + input?: any; + output?: any; + price?: number | null | undefined; + usage?: any; + rating?: number | null | undefined; + errorMessage?: string | null | undefined; + }[]; + total: number; + page: number; + limit: number; + totalPages: number; + }>; + options: { + method: "POST"; + use: ((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>)[]; + body: zod.ZodObject<{ + page: zod.ZodDefault>; + limit: zod.ZodDefault>; + userId: zod.ZodOptional; + taskType: zod.ZodOptional; + status: zod.ZodOptional; + modelName: zod.ZodOptional; + startDate: zod.ZodOptional; + endDate: zod.ZodOptional; + orderBy: zod.ZodDefault>; + order: zod.ZodDefault>; + }, better_auth.$strip>; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/aigc-billings/list"; + }; + uploadS3: { + (inputCtx_0?: ({ + body?: any; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }) | undefined): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: FileUploadResponse; + } : FileUploadResponse>; + options: { + method: "POST"; + body: zod.ZodAny; + use: ((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>)[]; + metadata: { + openapi: { + description: string; + tags: string[]; + requestBody: any; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/file/upload-s3"; + }; + compressVideo: { + (inputCtx_0: { + body: { + videoUrl: string; + quality?: "low" | "medium" | "high" | undefined; + format?: string | undefined; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: VideoCompressResponse; + } : VideoCompressResponse>; + options: { + method: "POST"; + body: zod.ZodObject<{ + videoUrl: zod.ZodString; + quality: zod.ZodDefault>; + format: zod.ZodOptional; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/file/compress-video"; + }; + getAigcModels: { + (inputCtx_0: { + body?: undefined; + } & { + method?: "GET" | undefined; + } & { + query: { + category?: "image" | "video" | undefined; + }; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + status: boolean; + data: AigcModelInfo[]; + msg: string; + }; + } : { + status: boolean; + data: AigcModelInfo[]; + msg: string; + }>; + options: { + method: "GET"; + query: zod.ZodObject<{ + category: zod.ZodDefault>>; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/aigc/models"; + }; + getAigcTaskStatus: { + (inputCtx_0: { + body?: undefined; + } & { + method?: "GET" | undefined; + } & { + query: { + taskId: string; + }; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: AigcTaskStatus; + } : AigcTaskStatus>; + options: { + method: "GET"; + query: zod.ZodObject<{ + taskId: zod.ZodString; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/aigc/task/get"; + }; + submitTask: { + (inputCtx_0: { + body: { + model_name: string; + prompt: string; + mode?: string | undefined; + aspect_ratio?: string | undefined; + webhook_flag?: boolean | undefined; + watermark?: boolean | undefined; + extra?: string | undefined; + img_url?: string | undefined; + img_list?: any[] | undefined; + duration?: string | undefined; + resolution?: string | undefined; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: AigcTaskResponse; + } : AigcTaskResponse>; + options: { + method: "POST"; + body: zod.ZodObject<{ + mode: zod.ZodOptional; + model_name: zod.ZodString; + prompt: zod.ZodString; + aspect_ratio: zod.ZodOptional; + webhook_flag: zod.ZodOptional; + watermark: zod.ZodOptional; + extra: zod.ZodOptional; + img_url: zod.ZodOptional; + img_list: zod.ZodOptional>; + duration: zod.ZodOptional; + resolution: zod.ZodOptional; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/aigc/task/submit"; + }; + concatVideos: { + (inputCtx_0: { + body: { + inputs: string[]; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + status: boolean; + data: { + taskId: string; + }; + msg: string; + }; + } : { + status: boolean; + data: { + taskId: string; + }; + msg: string; + }>; + options: { + method: "POST"; + body: zod.ZodObject<{ + inputs: zod.ZodArray; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/ffmpeg/task/concat"; + }; + getFfmpegTaskStatus: { + (inputCtx_0: { + body?: undefined; + } & { + method?: "GET" | undefined; + } & { + query: { + taskId: string; + }; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + status: boolean; + data: { + taskId: string; + status: string; + error: string; + code: number; + task_type: string; + results: any; + }; + msg: string; + }; + } : { + status: boolean; + data: { + taskId: string; + status: string; + error: string; + code: number; + task_type: string; + results: any; + }; + msg: string; + }>; + options: { + method: "GET"; + query: zod.ZodObject<{ + taskId: zod.ZodString; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/ffmpeg/task/get"; + }; + chat: { + (inputCtx_0: { + body: { + prompt: string; + model_name: string; + img_list?: string[] | undefined; + stream?: boolean | undefined; + tools?: string | undefined; + tool_choice?: string | undefined; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: Response | { + status: boolean; + msg: string; + data: string; + usage: { + [key: string]: unknown; + }; + }; + } : Response | { + status: boolean; + msg: string; + data: string; + usage: { + [key: string]: unknown; + }; + }>; + options: { + method: "POST"; + body: zod.ZodObject<{ + prompt: zod.ZodString; + model_name: zod.ZodString; + img_list: zod.ZodOptional>; + stream: zod.ZodOptional; + tools: zod.ZodOptional; + tool_choice: zod.ZodOptional; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + 'text/event-stream': { + schema: { + type: string; + }; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/chat"; + }; + listChatModels: { + (inputCtx_0?: ({ + body?: undefined; + } & { + method?: "GET" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }) | undefined): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + data: { + model_name: string; + desc: string; + extra: { + input_supported: string[]; + base_url: string; + }; + }[]; + status: boolean; + msg: string; + }; + } : { + data: { + model_name: string; + desc: string; + extra: { + input_supported: string[]; + base_url: string; + }; + }[]; + status: boolean; + msg: string; + }>; + options: { + method: "GET"; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/chat/models"; + }; + createTemplateGeneration: { + (inputCtx_0: { + body: { + templateId: string; + type: string; + resultUrl?: string[] | undefined; + originalUrl?: string | undefined; + status?: string | undefined; + creditsCost?: number | undefined; + creditsTransactionId?: string | undefined; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + userId: string; + templateId: string; + type: string; + resultUrl: any; + createdAt: Date; + updatedAt: Date; + id: string; + originalUrl?: string | null | undefined; + status?: string | null | undefined; + creditsCost?: number | null | undefined; + creditsTransactionId?: string | null | undefined; + }; + } : { + userId: string; + templateId: string; + type: string; + resultUrl: any; + createdAt: Date; + updatedAt: Date; + id: string; + originalUrl?: string | null | undefined; + status?: string | null | undefined; + creditsCost?: number | null | undefined; + creditsTransactionId?: string | null | undefined; + }>; + options: { + method: "POST"; + body: zod.ZodObject<{ + templateId: zod.ZodString; + type: zod.ZodString; + resultUrl: zod.ZodOptional>; + originalUrl: zod.ZodOptional; + status: zod.ZodDefault; + creditsCost: zod.ZodDefault; + creditsTransactionId: zod.ZodOptional; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 201: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/template-generation/create"; + }; + deleteTemplateGeneration: { + (inputCtx_0: { + body: { + id: string; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + message: string; + }; + } : { + message: string; + }>; + options: { + method: "POST"; + body: zod.ZodObject<{ + id: zod.ZodString; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/template-generation/delete"; + }; + getTemplateGeneration: { + (inputCtx_0: { + body?: undefined; + } & { + method?: "GET" | undefined; + } & { + query: { + id: string; + }; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + userId: string; + templateId: string; + type: string; + resultUrl: any; + createdAt: Date; + updatedAt: Date; + id: string; + originalUrl?: string | null | undefined; + status?: string | null | undefined; + creditsCost?: number | null | undefined; + creditsTransactionId?: string | null | undefined; + }; + } : { + userId: string; + templateId: string; + type: string; + resultUrl: any; + createdAt: Date; + updatedAt: Date; + id: string; + originalUrl?: string | null | undefined; + status?: string | null | undefined; + creditsCost?: number | null | undefined; + creditsTransactionId?: string | null | undefined; + }>; + options: { + method: "GET"; + query: zod.ZodObject<{ + id: zod.ZodString; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/template-generation/get"; + }; + listTemplateGenerations: { + (inputCtx_0: { + body: { + page?: number | undefined; + limit?: number | undefined; + userId?: string | undefined; + templateId?: string | undefined; + status?: string | undefined; + search?: string | undefined; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + data: { + user: { + id: string; + name: string; + email: string; + } | undefined; + template: { + id: string; + title: string; + titleEn: string; + coverImageUrl: string; + } | undefined; + userId: string; + templateId: string; + type: string; + resultUrl: any; + createdAt: Date; + updatedAt: Date; + id: string; + originalUrl?: string | null | undefined; + status?: string | null | undefined; + creditsCost?: number | null | undefined; + creditsTransactionId?: string | null | undefined; + }[]; + total: number; + page: number; + limit: number; + totalPages: number; + }; + } : { + data: { + user: { + id: string; + name: string; + email: string; + } | undefined; + template: { + id: string; + title: string; + titleEn: string; + coverImageUrl: string; + } | undefined; + userId: string; + templateId: string; + type: string; + resultUrl: any; + createdAt: Date; + updatedAt: Date; + id: string; + originalUrl?: string | null | undefined; + status?: string | null | undefined; + creditsCost?: number | null | undefined; + creditsTransactionId?: string | null | undefined; + }[]; + total: number; + page: number; + limit: number; + totalPages: number; + }>; + options: { + method: "POST"; + body: zod.ZodObject<{ + page: zod.ZodDefault>; + limit: zod.ZodDefault>; + userId: zod.ZodOptional; + templateId: zod.ZodOptional; + status: zod.ZodOptional; + search: zod.ZodOptional; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/template-generation/list"; + }; + updateTemplateGeneration: { + (inputCtx_0: { + body: { + id: string; + resultUrl?: any; + status?: string | null | undefined; + type?: string | undefined; + originalUrl?: string | null | undefined; + creditsCost?: number | null | undefined; + creditsTransactionId?: string | null | undefined; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + userId: string; + templateId: string; + type: string; + resultUrl: any; + createdAt: Date; + updatedAt: Date; + id: string; + originalUrl?: string | null | undefined; + status?: string | null | undefined; + creditsCost?: number | null | undefined; + creditsTransactionId?: string | null | undefined; + } | null; + } : { + userId: string; + templateId: string; + type: string; + resultUrl: any; + createdAt: Date; + updatedAt: Date; + id: string; + originalUrl?: string | null | undefined; + status?: string | null | undefined; + creditsCost?: number | null | undefined; + creditsTransactionId?: string | null | undefined; + } | null>; + options: { + method: "POST"; + body: zod.ZodObject<{ + readonly resultUrl: zod.ZodOptional; + readonly status: zod.ZodOptional>>; + readonly type: zod.ZodOptional; + readonly originalUrl: zod.ZodOptional>>; + readonly creditsCost: zod.ZodOptional>>; + readonly creditsTransactionId: zod.ZodOptional>>; + id: zod.ZodString; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/template-generation/update"; + }; + batchDeleteTemplateGeneration: { + (inputCtx_0: { + body: { + ids: string[]; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + message: string; + }; + } : { + message: string; + }>; + options: { + method: "POST"; + body: zod.ZodObject<{ + ids: zod.ZodArray; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/template-generation/batch-delete"; + }; + createRecommendedTemplate: { + (inputCtx_0: { + body: { + templateId: string; + sortOrder?: number | undefined; + isActive?: boolean | undefined; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + templateId: string; + sortOrder: number; + isActive: boolean; + createdAt: Date; + updatedAt: Date; + id: string; + }; + } : { + templateId: string; + sortOrder: number; + isActive: boolean; + createdAt: Date; + updatedAt: Date; + id: string; + }>; + options: { + method: "POST"; + body: zod.ZodObject<{ + templateId: zod.ZodString; + sortOrder: zod.ZodDefault; + isActive: zod.ZodDefault; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 201: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/template/recommended/create"; + }; + deleteRecommendedTemplate: { + (inputCtx_0: { + body: { + id: string; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + message: string; + }; + } : { + message: string; + }>; + options: { + method: "POST"; + body: zod.ZodObject<{ + id: zod.ZodString; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/template/recommended/delete"; + }; + listRecommendedTemplates: { + (inputCtx_0: { + body: { + page?: number | undefined; + limit?: number | undefined; + isActive?: boolean | undefined; + orderBy?: string | undefined; + order?: string | undefined; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + recommendedTemplates: { + template: { + userId: string; + title: string; + titleEn: string; + description: string; + descriptionEn: string; + coverImageUrl: string; + previewUrl: string; + content: any; + sortOrder: number; + createdAt: Date; + updatedAt: Date; + aspectRatio: string; + status: string; + isDeleted: boolean; + id: string; + ownerId?: string | null | undefined; + formSchema?: any; + uploadSapecifications?: string | null | undefined; + uploadSapecificationsEn?: string | null | undefined; + costPrice?: number | null | undefined; + price?: number | null | undefined; + deletedAt?: Date | null | undefined; + } | undefined; + templateId: string; + sortOrder: number; + isActive: boolean; + createdAt: Date; + updatedAt: Date; + id: string; + }[]; + total: number; + page: number; + limit: number; + totalPages: number; + }; + } : { + recommendedTemplates: { + template: { + userId: string; + title: string; + titleEn: string; + description: string; + descriptionEn: string; + coverImageUrl: string; + previewUrl: string; + content: any; + sortOrder: number; + createdAt: Date; + updatedAt: Date; + aspectRatio: string; + status: string; + isDeleted: boolean; + id: string; + ownerId?: string | null | undefined; + formSchema?: any; + uploadSapecifications?: string | null | undefined; + uploadSapecificationsEn?: string | null | undefined; + costPrice?: number | null | undefined; + price?: number | null | undefined; + deletedAt?: Date | null | undefined; + } | undefined; + templateId: string; + sortOrder: number; + isActive: boolean; + createdAt: Date; + updatedAt: Date; + id: string; + }[]; + total: number; + page: number; + limit: number; + totalPages: number; + }>; + options: { + method: "POST"; + body: zod.ZodObject<{ + page: zod.ZodDefault>; + limit: zod.ZodDefault>; + isActive: zod.ZodOptional; + orderBy: zod.ZodDefault>; + order: zod.ZodDefault>; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/template/recommended/list"; + }; + listPublicRecommendedTemplates: { + (inputCtx_0: { + body: { + limit?: number | undefined; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + templates: any[]; + }; + } : { + templates: any[]; + }>; + options: { + method: "POST"; + body: zod.ZodObject<{ + limit: zod.ZodDefault>; + }, better_auth.$strip>; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/template/recommended/list/public/"; + }; + updateRecommendedTemplate: { + (inputCtx_0: { + body: { + id: string; + sortOrder?: number | undefined; + isActive?: boolean | undefined; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + templateId: string; + sortOrder: number; + isActive: boolean; + createdAt: Date; + updatedAt: Date; + id: string; + } | null; + } : { + templateId: string; + sortOrder: number; + isActive: boolean; + createdAt: Date; + updatedAt: Date; + id: string; + } | null>; + options: { + method: "POST"; + body: zod.ZodObject<{ + readonly sortOrder: zod.ZodOptional; + readonly isActive: zod.ZodOptional; + id: zod.ZodString; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/template/recommended/update"; + }; + createActivity: { + (inputCtx_0: { + body: { + title: string; + titleEn: string; + desc: string; + descEn: string; + coverUrl: string; + link: string; + videoUrl?: string | undefined; + isActive?: boolean | undefined; + sortOrder?: number | undefined; + ownerId?: string | undefined; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + title: string; + titleEn: string; + desc: string; + descEn: string; + coverUrl: string; + link: string; + createdAt: Date; + updatedAt: Date; + id: string; + videoUrl?: string | null | undefined; + ownerId?: string | null | undefined; + isActive?: boolean | null | undefined; + sortOrder?: number | null | undefined; + }; + } : { + title: string; + titleEn: string; + desc: string; + descEn: string; + coverUrl: string; + link: string; + createdAt: Date; + updatedAt: Date; + id: string; + videoUrl?: string | null | undefined; + ownerId?: string | null | undefined; + isActive?: boolean | null | undefined; + sortOrder?: number | null | undefined; + }>; + options: { + method: "POST"; + body: zod.ZodObject<{ + title: zod.ZodString; + titleEn: zod.ZodString; + desc: zod.ZodString; + descEn: zod.ZodString; + coverUrl: zod.ZodString; + videoUrl: zod.ZodOptional; + link: zod.ZodString; + isActive: zod.ZodDefault; + sortOrder: zod.ZodDefault; + ownerId: zod.ZodOptional; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 201: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/activity/create"; + }; + deleteActivity: { + (inputCtx_0: { + body: { + id: string; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + message: string; + }; + } : { + message: string; + }>; + options: { + method: "POST"; + body: zod.ZodObject<{ + id: zod.ZodString; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/activity/delete"; + }; + getActivity: { + (inputCtx_0: { + body?: undefined; + } & { + method?: "GET" | undefined; + } & { + query: { + id: string; + }; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + title: string; + titleEn: string; + desc: string; + descEn: string; + coverUrl: string; + link: string; + createdAt: Date; + updatedAt: Date; + id: string; + videoUrl?: string | null | undefined; + ownerId?: string | null | undefined; + isActive?: boolean | null | undefined; + sortOrder?: number | null | undefined; + }; + } : { + title: string; + titleEn: string; + desc: string; + descEn: string; + coverUrl: string; + link: string; + createdAt: Date; + updatedAt: Date; + id: string; + videoUrl?: string | null | undefined; + ownerId?: string | null | undefined; + isActive?: boolean | null | undefined; + sortOrder?: number | null | undefined; + }>; + options: { + method: "GET"; + query: zod.ZodObject<{ + id: zod.ZodString; + }, better_auth.$strip>; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/activity/get"; + }; + listActivities: { + (inputCtx_0: { + body: { + page?: number | undefined; + limit?: number | undefined; + isActive?: boolean | undefined; + orderBy?: string | undefined; + order?: string | undefined; + ownerId?: string | undefined; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + activities: { + title: string; + titleEn: string; + desc: string; + descEn: string; + coverUrl: string; + link: string; + createdAt: Date; + updatedAt: Date; + id: string; + videoUrl?: string | null | undefined; + ownerId?: string | null | undefined; + isActive?: boolean | null | undefined; + sortOrder?: number | null | undefined; + }[]; + total: number; + page: number; + limit: number; + totalPages: number; + }; + } : { + activities: { + title: string; + titleEn: string; + desc: string; + descEn: string; + coverUrl: string; + link: string; + createdAt: Date; + updatedAt: Date; + id: string; + videoUrl?: string | null | undefined; + ownerId?: string | null | undefined; + isActive?: boolean | null | undefined; + sortOrder?: number | null | undefined; + }[]; + total: number; + page: number; + limit: number; + totalPages: number; + }>; + options: { + method: "POST"; + body: zod.ZodObject<{ + page: zod.ZodDefault>; + limit: zod.ZodDefault>; + isActive: zod.ZodOptional; + orderBy: zod.ZodDefault>; + order: zod.ZodDefault>; + ownerId: zod.ZodOptional; + }, better_auth.$strip>; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/activities/list"; + }; + updateActivity: { + (inputCtx_0: { + body: { + id: string; + title?: string | undefined; + titleEn?: string | undefined; + ownerId?: string | null | undefined; + sortOrder?: number | null | undefined; + isActive?: boolean | null | undefined; + desc?: string | undefined; + descEn?: string | undefined; + coverUrl?: string | undefined; + videoUrl?: string | null | undefined; + link?: string | undefined; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + title: string; + titleEn: string; + desc: string; + descEn: string; + coverUrl: string; + link: string; + createdAt: Date; + updatedAt: Date; + id: string; + videoUrl?: string | null | undefined; + ownerId?: string | null | undefined; + isActive?: boolean | null | undefined; + sortOrder?: number | null | undefined; + } | null; + } : { + title: string; + titleEn: string; + desc: string; + descEn: string; + coverUrl: string; + link: string; + createdAt: Date; + updatedAt: Date; + id: string; + videoUrl?: string | null | undefined; + ownerId?: string | null | undefined; + isActive?: boolean | null | undefined; + sortOrder?: number | null | undefined; + } | null>; + options: { + method: "POST"; + body: zod.ZodObject<{ + readonly title: zod.ZodOptional; + readonly titleEn: zod.ZodOptional; + readonly ownerId: zod.ZodOptional>>; + readonly sortOrder: zod.ZodOptional>>; + readonly isActive: zod.ZodOptional>>; + readonly desc: zod.ZodOptional; + readonly descEn: zod.ZodOptional; + readonly coverUrl: zod.ZodOptional; + readonly videoUrl: zod.ZodOptional>>; + readonly link: zod.ZodOptional; + id: zod.ZodString; + }, better_auth.$strip>; + use: ((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>)[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/activity/update"; + }; + createTag: { + (inputCtx_0: { + body: { + name: string; + nameEn: string; + description?: string | undefined; + descriptionEn?: string | undefined; + sortOrder?: number | undefined; + ownerId?: string | undefined; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + name: string; + nameEn: string; + sortOrder: number; + createdAt: Date; + updatedAt: Date; + id: string; + ownerId?: string | null | undefined; + description?: string | null | undefined; + descriptionEn?: string | null | undefined; + }; + } : { + name: string; + nameEn: string; + sortOrder: number; + createdAt: Date; + updatedAt: Date; + id: string; + ownerId?: string | null | undefined; + description?: string | null | undefined; + descriptionEn?: string | null | undefined; + }>; + options: { + method: "POST"; + body: zod.ZodObject<{ + name: zod.ZodString; + nameEn: zod.ZodString; + description: zod.ZodOptional; + descriptionEn: zod.ZodOptional; + sortOrder: zod.ZodDefault>; + ownerId: zod.ZodOptional; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 201: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/tags/create"; + }; + deleteTag: { + (inputCtx_0: { + body: { + id: string; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + message: string; + }; + } : { + message: string; + }>; + options: { + method: "POST"; + body: zod.ZodObject<{ + id: zod.ZodString; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/tags/delete"; + }; + getTag: { + (inputCtx_0: { + body?: undefined; + } & { + method?: "GET" | undefined; + } & { + query: { + id: string; + }; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + categories: ({ + name: string; + nameEn: string; + description: string; + descriptionEn: string; + sortOrder: number; + isActive: boolean; + createdAt: Date; + updatedAt: Date; + id: string; + ownerId?: string | null | undefined; + } | null)[]; + name: string; + nameEn: string; + sortOrder: number; + createdAt: Date; + updatedAt: Date; + id: string; + ownerId?: string | null | undefined; + description?: string | null | undefined; + descriptionEn?: string | null | undefined; + }; + } : { + categories: ({ + name: string; + nameEn: string; + description: string; + descriptionEn: string; + sortOrder: number; + isActive: boolean; + createdAt: Date; + updatedAt: Date; + id: string; + ownerId?: string | null | undefined; + } | null)[]; + name: string; + nameEn: string; + sortOrder: number; + createdAt: Date; + updatedAt: Date; + id: string; + ownerId?: string | null | undefined; + description?: string | null | undefined; + descriptionEn?: string | null | undefined; + }>; + options: { + method: "GET"; + query: zod.ZodObject<{ + id: zod.ZodString; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/tags/get"; + }; + getTagByName: { + (inputCtx_0: { + body?: undefined; + } & { + method?: "GET" | undefined; + } & { + query: { + name: string; + }; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + templates: { + userId: string; + title: string; + titleEn: string; + description: string; + descriptionEn: string; + coverImageUrl: string; + previewUrl: string; + content: any; + sortOrder: number; + createdAt: Date; + updatedAt: Date; + aspectRatio: string; + status: string; + isDeleted: boolean; + id: string; + ownerId?: string | null | undefined; + formSchema?: any; + uploadSapecifications?: string | null | undefined; + uploadSapecificationsEn?: string | null | undefined; + costPrice?: number | null | undefined; + price?: number | null | undefined; + deletedAt?: Date | null | undefined; + }[]; + name: string; + nameEn: string; + sortOrder: number; + createdAt: Date; + updatedAt: Date; + id: string; + ownerId?: string | null | undefined; + description?: string | null | undefined; + descriptionEn?: string | null | undefined; + }; + } : { + templates: { + userId: string; + title: string; + titleEn: string; + description: string; + descriptionEn: string; + coverImageUrl: string; + previewUrl: string; + content: any; + sortOrder: number; + createdAt: Date; + updatedAt: Date; + aspectRatio: string; + status: string; + isDeleted: boolean; + id: string; + ownerId?: string | null | undefined; + formSchema?: any; + uploadSapecifications?: string | null | undefined; + uploadSapecificationsEn?: string | null | undefined; + costPrice?: number | null | undefined; + price?: number | null | undefined; + deletedAt?: Date | null | undefined; + }[]; + name: string; + nameEn: string; + sortOrder: number; + createdAt: Date; + updatedAt: Date; + id: string; + ownerId?: string | null | undefined; + description?: string | null | undefined; + descriptionEn?: string | null | undefined; + }>; + options: { + method: "GET"; + query: zod.ZodObject<{ + name: zod.ZodString; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/tags/get-by-name"; + }; + listTags: { + (inputCtx_0: { + body: { + page?: number | undefined; + limit?: number | undefined; + search?: string | undefined; + orderBy?: string | undefined; + order?: string | undefined; + ownerId?: string | undefined; + categoryIds?: string[] | undefined; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + tags: any[]; + total: number; + page: number; + limit: number; + totalPages: number; + }; + } : { + tags: any[]; + total: number; + page: number; + limit: number; + totalPages: number; + }>; + options: { + method: "POST"; + body: zod.ZodObject<{ + page: zod.ZodDefault>; + limit: zod.ZodDefault>; + search: zod.ZodOptional; + orderBy: zod.ZodDefault>; + order: zod.ZodDefault>; + ownerId: zod.ZodOptional; + categoryIds: zod.ZodOptional>; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/tags/list"; + }; + updateTag: { + (inputCtx_0: { + body: { + id: string; + description?: string | null | undefined; + descriptionEn?: string | null | undefined; + ownerId?: string | null | undefined; + name?: string | undefined; + nameEn?: string | undefined; + sortOrder?: number | undefined; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + name: string; + nameEn: string; + sortOrder: number; + createdAt: Date; + updatedAt: Date; + id: string; + ownerId?: string | null | undefined; + description?: string | null | undefined; + descriptionEn?: string | null | undefined; + } | null; + } : { + name: string; + nameEn: string; + sortOrder: number; + createdAt: Date; + updatedAt: Date; + id: string; + ownerId?: string | null | undefined; + description?: string | null | undefined; + descriptionEn?: string | null | undefined; + } | null>; + options: { + method: "POST"; + body: zod.ZodObject<{ + readonly description: zod.ZodOptional>>; + readonly descriptionEn: zod.ZodOptional>>; + readonly ownerId: zod.ZodOptional>>; + readonly name: zod.ZodOptional; + readonly nameEn: zod.ZodOptional; + readonly sortOrder: zod.ZodOptional; + id: zod.ZodString; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/tags/update"; + }; + updateCategoryTag: { + (inputCtx_0: { + body: { + id: string; + sortOrder: number; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: any; + } : any>; + options: { + method: "POST"; + body: zod.ZodObject<{ + id: zod.ZodString; + sortOrder: zod.ZodNumber; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/tags/update-category-tag"; + }; + createCategory: { + (inputCtx_0: { + body: { + name: string; + nameEn: string; + description?: string | undefined; + descriptionEn?: string | undefined; + sortOrder?: number | undefined; + isActive?: boolean | undefined; + tagIds?: string[] | undefined; + ownerId?: string | undefined; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + tags: { + name: string; + nameEn: string; + sortOrder: number; + createdAt: Date; + updatedAt: Date; + id: string; + ownerId?: string | null | undefined; + description?: string | null | undefined; + descriptionEn?: string | null | undefined; + }[]; + name: string; + nameEn: string; + description: string; + descriptionEn: string; + sortOrder: number; + isActive: boolean; + createdAt: Date; + updatedAt: Date; + id: string; + ownerId?: string | null | undefined; + }; + } : { + tags: { + name: string; + nameEn: string; + sortOrder: number; + createdAt: Date; + updatedAt: Date; + id: string; + ownerId?: string | null | undefined; + description?: string | null | undefined; + descriptionEn?: string | null | undefined; + }[]; + name: string; + nameEn: string; + description: string; + descriptionEn: string; + sortOrder: number; + isActive: boolean; + createdAt: Date; + updatedAt: Date; + id: string; + ownerId?: string | null | undefined; + }>; + options: { + method: "POST"; + body: zod.ZodObject<{ + name: zod.ZodString; + nameEn: zod.ZodString; + description: zod.ZodDefault; + descriptionEn: zod.ZodDefault; + sortOrder: zod.ZodDefault; + isActive: zod.ZodDefault; + tagIds: zod.ZodOptional>; + ownerId: zod.ZodOptional; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 201: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/category/create"; + }; + deleteCategory: { + (inputCtx_0: { + body: { + id: string; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + message: string; + }; + } : { + message: string; + }>; + options: { + method: "POST"; + body: zod.ZodObject<{ + id: zod.ZodString; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/category/delete"; + }; + getCategory: { + (inputCtx_0: { + body?: undefined; + } & { + method?: "GET" | undefined; + } & { + query: { + id: string; + }; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + tags: { + name: string; + nameEn: string; + sortOrder: number; + createdAt: Date; + updatedAt: Date; + id: string; + ownerId?: string | null | undefined; + description?: string | null | undefined; + descriptionEn?: string | null | undefined; + }[]; + name: string; + nameEn: string; + description: string; + descriptionEn: string; + sortOrder: number; + isActive: boolean; + createdAt: Date; + updatedAt: Date; + id: string; + ownerId?: string | null | undefined; + }; + } : { + tags: { + name: string; + nameEn: string; + sortOrder: number; + createdAt: Date; + updatedAt: Date; + id: string; + ownerId?: string | null | undefined; + description?: string | null | undefined; + descriptionEn?: string | null | undefined; + }[]; + name: string; + nameEn: string; + description: string; + descriptionEn: string; + sortOrder: number; + isActive: boolean; + createdAt: Date; + updatedAt: Date; + id: string; + ownerId?: string | null | undefined; + }>; + options: { + method: "GET"; + query: zod.ZodObject<{ + id: zod.ZodString; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/category/get"; + }; + getCategoryByName: { + (inputCtx_0: { + body?: undefined; + } & { + method?: "GET" | undefined; + } & { + query: { + name: string; + }; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + tags: { + name: string; + nameEn: string; + sortOrder: number; + createdAt: Date; + updatedAt: Date; + id: string; + ownerId?: string | null | undefined; + description?: string | null | undefined; + descriptionEn?: string | null | undefined; + }[]; + templates: any[]; + name: string; + nameEn: string; + description: string; + descriptionEn: string; + sortOrder: number; + isActive: boolean; + createdAt: Date; + updatedAt: Date; + id: string; + ownerId?: string | null | undefined; + }; + } : { + tags: { + name: string; + nameEn: string; + sortOrder: number; + createdAt: Date; + updatedAt: Date; + id: string; + ownerId?: string | null | undefined; + description?: string | null | undefined; + descriptionEn?: string | null | undefined; + }[]; + templates: any[]; + name: string; + nameEn: string; + description: string; + descriptionEn: string; + sortOrder: number; + isActive: boolean; + createdAt: Date; + updatedAt: Date; + id: string; + ownerId?: string | null | undefined; + }>; + options: { + method: "GET"; + query: zod.ZodObject<{ + name: zod.ZodString; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/category/get-by-name"; + }; + listCategories: { + (inputCtx_0: { + body: { + page?: number | undefined; + limit?: number | undefined; + isActive?: boolean | undefined; + orderBy?: string | undefined; + order?: string | undefined; + search?: string | undefined; + categoryIds?: string[] | undefined; + withChildren?: boolean | undefined; + ownerId?: string | undefined; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + categories: any[]; + total: number; + page: number; + limit: number; + }; + } : { + categories: any[]; + total: number; + page: number; + limit: number; + }>; + options: { + method: "POST"; + body: zod.ZodObject<{ + page: zod.ZodDefault>; + limit: zod.ZodDefault>; + isActive: zod.ZodOptional; + orderBy: zod.ZodDefault>; + order: zod.ZodDefault>; + search: zod.ZodOptional; + categoryIds: zod.ZodOptional>; + withChildren: zod.ZodOptional; + ownerId: zod.ZodOptional; + }, better_auth.$strip>; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/category/list"; + }; + updateCategory: { + (inputCtx_0: { + body: { + id: string; + description?: string | undefined; + descriptionEn?: string | undefined; + ownerId?: string | null | undefined; + name?: string | undefined; + nameEn?: string | undefined; + sortOrder?: number | undefined; + isActive?: boolean | undefined; + tagIds?: string[] | undefined; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + name: string; + nameEn: string; + description: string; + descriptionEn: string; + sortOrder: number; + isActive: boolean; + createdAt: Date; + updatedAt: Date; + id: string; + ownerId?: string | null | undefined; + } | null; + } : { + name: string; + nameEn: string; + description: string; + descriptionEn: string; + sortOrder: number; + isActive: boolean; + createdAt: Date; + updatedAt: Date; + id: string; + ownerId?: string | null | undefined; + } | null>; + options: { + method: "POST"; + body: zod.ZodObject<{ + readonly description: zod.ZodOptional; + readonly descriptionEn: zod.ZodOptional; + readonly ownerId: zod.ZodOptional>>; + readonly name: zod.ZodOptional; + readonly nameEn: zod.ZodOptional; + readonly sortOrder: zod.ZodOptional; + readonly isActive: zod.ZodOptional; + id: zod.ZodString; + tagIds: zod.ZodOptional>; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/category/update"; + }; + createTemplate: { + (inputCtx_0: { + body: { + title: string; + titleEn: string; + description: string; + descriptionEn: string; + content: any; + sortOrder: number; + coverImageUrl: string; + previewUrl: string; + aspectRatio: string; + status: string; + categoryTagSortOrders: { + categoryId: string; + tagId: string; + sortOrder: number; + }[]; + ownerId?: string | null | undefined; + formSchema?: any; + uploadSapecifications?: string | null | undefined; + uploadSapecificationsEn?: string | null | undefined; + costPrice?: number | null | undefined; + price?: number | null | undefined; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + userId: string; + title: string; + titleEn: string; + description: string; + descriptionEn: string; + coverImageUrl: string; + previewUrl: string; + content: any; + sortOrder: number; + createdAt: Date; + updatedAt: Date; + aspectRatio: string; + status: string; + isDeleted: boolean; + id: string; + ownerId?: string | null | undefined; + formSchema?: any; + uploadSapecifications?: string | null | undefined; + uploadSapecificationsEn?: string | null | undefined; + costPrice?: number | null | undefined; + price?: number | null | undefined; + deletedAt?: Date | null | undefined; + }; + } : { + userId: string; + title: string; + titleEn: string; + description: string; + descriptionEn: string; + coverImageUrl: string; + previewUrl: string; + content: any; + sortOrder: number; + createdAt: Date; + updatedAt: Date; + aspectRatio: string; + status: string; + isDeleted: boolean; + id: string; + ownerId?: string | null | undefined; + formSchema?: any; + uploadSapecifications?: string | null | undefined; + uploadSapecificationsEn?: string | null | undefined; + costPrice?: number | null | undefined; + price?: number | null | undefined; + deletedAt?: Date | null | undefined; + }>; + options: { + method: "POST"; + body: zod.ZodObject<{ + readonly title: zod.ZodString; + readonly titleEn: zod.ZodString; + readonly description: zod.ZodString; + readonly descriptionEn: zod.ZodString; + readonly content: zod.ZodAny; + readonly ownerId: zod.ZodNullable>; + readonly sortOrder: zod.ZodNumber; + readonly coverImageUrl: zod.ZodString; + readonly previewUrl: zod.ZodString; + readonly formSchema: zod.ZodNullable>; + readonly uploadSapecifications: zod.ZodNullable>; + readonly uploadSapecificationsEn: zod.ZodNullable>; + readonly costPrice: zod.ZodNullable>; + readonly price: zod.ZodNullable>; + readonly aspectRatio: zod.ZodString; + readonly status: zod.ZodString; + categoryTagSortOrders: zod.ZodArray>; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 201: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/template/create"; + }; + deleteTemplate: { + (inputCtx_0: { + body: { + id: string; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + message: string; + }; + } : { + message: string; + }>; + options: { + method: "POST"; + body: zod.ZodObject<{ + id: zod.ZodString; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/template/delete"; + }; + getTemplate: { + (inputCtx_0: { + body?: undefined; + } & { + method?: "GET" | undefined; + } & { + query: { + id: string; + }; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + category: undefined; + tags: any[]; + userId: string; + title: string; + titleEn: string; + description: string; + descriptionEn: string; + coverImageUrl: string; + previewUrl: string; + content: any; + sortOrder: number; + createdAt: Date; + updatedAt: Date; + aspectRatio: string; + status: string; + isDeleted: boolean; + id: string; + ownerId?: string | null | undefined; + formSchema?: any; + uploadSapecifications?: string | null | undefined; + uploadSapecificationsEn?: string | null | undefined; + costPrice?: number | null | undefined; + price?: number | null | undefined; + deletedAt?: Date | null | undefined; + }; + } : { + category: undefined; + tags: any[]; + userId: string; + title: string; + titleEn: string; + description: string; + descriptionEn: string; + coverImageUrl: string; + previewUrl: string; + content: any; + sortOrder: number; + createdAt: Date; + updatedAt: Date; + aspectRatio: string; + status: string; + isDeleted: boolean; + id: string; + ownerId?: string | null | undefined; + formSchema?: any; + uploadSapecifications?: string | null | undefined; + uploadSapecificationsEn?: string | null | undefined; + costPrice?: number | null | undefined; + price?: number | null | undefined; + deletedAt?: Date | null | undefined; + }>; + options: { + method: "GET"; + query: zod.ZodObject<{ + id: zod.ZodString; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/template/get"; + }; + listTemplates: { + (inputCtx_0: { + body: { + page?: number | undefined; + limit?: number | undefined; + search?: string | undefined; + categoryId?: string | undefined; + status?: string | undefined; + ownerId?: string | undefined; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + templates: { + categoryTags: any[]; + userId: string; + title: string; + titleEn: string; + description: string; + descriptionEn: string; + coverImageUrl: string; + previewUrl: string; + content: any; + sortOrder: number; + createdAt: Date; + updatedAt: Date; + aspectRatio: string; + status: string; + isDeleted: boolean; + id: string; + ownerId?: string | null | undefined; + formSchema?: any; + uploadSapecifications?: string | null | undefined; + uploadSapecificationsEn?: string | null | undefined; + costPrice?: number | null | undefined; + price?: number | null | undefined; + deletedAt?: Date | null | undefined; + }[]; + total: number; + page: number; + limit: number; + totalPages: number; + }; + } : { + templates: { + categoryTags: any[]; + userId: string; + title: string; + titleEn: string; + description: string; + descriptionEn: string; + coverImageUrl: string; + previewUrl: string; + content: any; + sortOrder: number; + createdAt: Date; + updatedAt: Date; + aspectRatio: string; + status: string; + isDeleted: boolean; + id: string; + ownerId?: string | null | undefined; + formSchema?: any; + uploadSapecifications?: string | null | undefined; + uploadSapecificationsEn?: string | null | undefined; + costPrice?: number | null | undefined; + price?: number | null | undefined; + deletedAt?: Date | null | undefined; + }[]; + total: number; + page: number; + limit: number; + totalPages: number; + }>; + options: { + method: "POST"; + body: zod.ZodObject<{ + page: zod.ZodDefault>; + limit: zod.ZodDefault>; + search: zod.ZodOptional; + categoryId: zod.ZodOptional; + status: zod.ZodOptional; + ownerId: zod.ZodOptional; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/template/list"; + }; + updateTemplate: { + (inputCtx_0: { + body: { + id: string; + title?: string | undefined; + titleEn?: string | undefined; + description?: string | undefined; + descriptionEn?: string | undefined; + content?: any; + sortOrder?: number | undefined; + coverImageUrl?: string | undefined; + previewUrl?: string | undefined; + formSchema?: any; + uploadSapecifications?: string | null | undefined; + uploadSapecificationsEn?: string | null | undefined; + costPrice?: number | null | undefined; + price?: number | null | undefined; + aspectRatio?: string | undefined; + status?: string | undefined; + categoryTagSortOrders?: { + categoryId: string; + tagId: string; + sortOrder: number; + }[] | undefined; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + userId: string; + title: string; + titleEn: string; + description: string; + descriptionEn: string; + coverImageUrl: string; + previewUrl: string; + content: any; + sortOrder: number; + createdAt: Date; + updatedAt: Date; + aspectRatio: string; + status: string; + isDeleted: boolean; + id: string; + ownerId?: string | null | undefined; + formSchema?: any; + uploadSapecifications?: string | null | undefined; + uploadSapecificationsEn?: string | null | undefined; + costPrice?: number | null | undefined; + price?: number | null | undefined; + deletedAt?: Date | null | undefined; + } | null; + } : { + userId: string; + title: string; + titleEn: string; + description: string; + descriptionEn: string; + coverImageUrl: string; + previewUrl: string; + content: any; + sortOrder: number; + createdAt: Date; + updatedAt: Date; + aspectRatio: string; + status: string; + isDeleted: boolean; + id: string; + ownerId?: string | null | undefined; + formSchema?: any; + uploadSapecifications?: string | null | undefined; + uploadSapecificationsEn?: string | null | undefined; + costPrice?: number | null | undefined; + price?: number | null | undefined; + deletedAt?: Date | null | undefined; + } | null>; + options: { + method: "POST"; + body: zod.ZodObject<{ + readonly title: zod.ZodOptional; + readonly titleEn: zod.ZodOptional; + readonly description: zod.ZodOptional; + readonly descriptionEn: zod.ZodOptional; + readonly content: zod.ZodOptional; + readonly sortOrder: zod.ZodOptional; + readonly coverImageUrl: zod.ZodOptional; + readonly previewUrl: zod.ZodOptional; + readonly formSchema: zod.ZodOptional>>; + readonly uploadSapecifications: zod.ZodOptional>>; + readonly uploadSapecificationsEn: zod.ZodOptional>>; + readonly costPrice: zod.ZodOptional>>; + readonly price: zod.ZodOptional>>; + readonly aspectRatio: zod.ZodOptional; + readonly status: zod.ZodOptional; + id: zod.ZodString; + categoryTagSortOrders: zod.ZodOptional>>; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/template/update"; + }; + runTemplate: { + (inputCtx_0: { + body: { + templateId: string; + data: any; + identifier?: string | undefined; + originalUrl?: string | undefined; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + generationId: string; + }; + } : { + generationId: string; + }>; + options: { + method: "POST"; + body: zod.ZodObject<{ + templateId: zod.ZodString; + data: zod.ZodAny; + identifier: zod.ZodOptional; + originalUrl: zod.ZodOptional; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/template/run"; + }; + getProjects: { + (inputCtx_0: { + body: { + page?: number | undefined; + limit?: number | undefined; + search?: string | undefined; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + projects: { + userId: string; + title: string; + titleEn: string; + description: string; + descriptionEn: string; + content: any; + createdAt: Date; + updatedAt: Date; + id: string; + sourceTemplateId?: string | null | undefined; + resultUrl?: string | null | undefined; + }[]; + total: number; + page: number; + limit: number; + }; + } : { + projects: { + userId: string; + title: string; + titleEn: string; + description: string; + descriptionEn: string; + content: any; + createdAt: Date; + updatedAt: Date; + id: string; + sourceTemplateId?: string | null | undefined; + resultUrl?: string | null | undefined; + }[]; + total: number; + page: number; + limit: number; + }>; + options: { + method: "POST"; + body: zod.ZodObject<{ + page: zod.ZodDefault>; + limit: zod.ZodDefault>; + search: zod.ZodOptional; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/project/list"; + }; + createProject: { + (inputCtx_0: { + body: { + title: string; + content: any; + sourceTemplateId?: string | null | undefined; + titleEn?: string | undefined; + description?: string | undefined; + descriptionEn?: string | undefined; + resultUrl?: string | null | undefined; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + userId: string; + title: string; + titleEn: string; + description: string; + descriptionEn: string; + content: any; + createdAt: Date; + updatedAt: Date; + id: string; + sourceTemplateId?: string | null | undefined; + resultUrl?: string | null | undefined; + }; + } : { + userId: string; + title: string; + titleEn: string; + description: string; + descriptionEn: string; + content: any; + createdAt: Date; + updatedAt: Date; + id: string; + sourceTemplateId?: string | null | undefined; + resultUrl?: string | null | undefined; + }>; + options: { + method: "POST"; + body: zod.ZodObject<{ + readonly title: zod.ZodString; + readonly content: zod.ZodAny; + readonly sourceTemplateId: zod.ZodOptional>>; + readonly titleEn: zod.ZodOptional; + readonly description: zod.ZodOptional; + readonly descriptionEn: zod.ZodOptional; + readonly resultUrl: zod.ZodOptional>>; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 201: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/project/create"; + }; + getProject: { + (inputCtx_0: { + body?: undefined; + } & { + method?: "GET" | undefined; + } & { + query: { + id: string; + }; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + userId: string; + title: string; + titleEn: string; + description: string; + descriptionEn: string; + content: any; + createdAt: Date; + updatedAt: Date; + id: string; + sourceTemplateId?: string | null | undefined; + resultUrl?: string | null | undefined; + }; + } : { + userId: string; + title: string; + titleEn: string; + description: string; + descriptionEn: string; + content: any; + createdAt: Date; + updatedAt: Date; + id: string; + sourceTemplateId?: string | null | undefined; + resultUrl?: string | null | undefined; + }>; + options: { + method: "GET"; + query: zod.ZodObject<{ + id: zod.ZodString; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/project/get"; + }; + updateProject: { + (inputCtx_0: { + body: { + id: string; + sourceTemplateId?: string | null | undefined; + title?: string | undefined; + titleEn?: string | undefined; + description?: string | undefined; + descriptionEn?: string | undefined; + resultUrl?: string | null | undefined; + content?: any; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + userId: string; + title: string; + titleEn: string; + description: string; + descriptionEn: string; + content: any; + createdAt: Date; + updatedAt: Date; + id: string; + sourceTemplateId?: string | null | undefined; + resultUrl?: string | null | undefined; + } | null; + } : { + userId: string; + title: string; + titleEn: string; + description: string; + descriptionEn: string; + content: any; + createdAt: Date; + updatedAt: Date; + id: string; + sourceTemplateId?: string | null | undefined; + resultUrl?: string | null | undefined; + } | null>; + options: { + method: "POST"; + body: zod.ZodObject<{ + readonly sourceTemplateId: zod.ZodOptional>>; + readonly title: zod.ZodOptional; + readonly titleEn: zod.ZodOptional; + readonly description: zod.ZodOptional; + readonly descriptionEn: zod.ZodOptional; + readonly resultUrl: zod.ZodOptional>>; + readonly content: zod.ZodOptional; + id: zod.ZodString; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/project/update"; + }; + deleteProject: { + (inputCtx_0: { + body: { + id: string; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + message: string; + }; + } : { + message: string; + }>; + options: { + method: "POST"; + body: zod.ZodObject<{ + id: zod.ZodString; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/project/delete"; + }; + transferProject: { + (inputCtx_0: { + body: { + targetUserEmail: string; + projectIds: string[]; + mode?: "copy" | "transfer" | undefined; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + message: string; + targetUserId: string; + targetUserEmail: string; + mode: "copy" | "transfer"; + processedCount: number; + projectIds: string[]; + }; + } : { + message: string; + targetUserId: string; + targetUserEmail: string; + mode: "copy" | "transfer"; + processedCount: number; + projectIds: string[]; + }>; + options: { + method: "POST"; + body: zod.ZodObject<{ + targetUserEmail: zod.ZodEmail; + projectIds: zod.ZodArray; + mode: zod.ZodDefault>>; + }, better_auth.$strip>; + use: (((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + email: string; + emailVerified: boolean; + name: string; + image?: string | null | undefined; + }; + }; + }>) | (>(inputContext: InputCtx) => Promise))[]; + metadata: { + openapi: { + description: string; + tags: string[]; + responses: { + 200: { + description: string; + content: { + 'application/json': { + schema: any; + }; + }; + }; + }; + }; + }; + } & { + use: any[]; + }; + path: "/loomart/project/transfer"; + }; + }; + $Infer: {}; +}; + +type LoomartType = ReturnType; +declare module 'better-auth' { + interface Context { + loomart?: LoomartOptions; + } +} + +export { ac, contentadmin, defaultStatements, editor, getLoomartOptions, getZodSchemaFromModel, loomart, roles, superadmin, user }; +export type { AigcModelInfo, AigcTaskResponse, AigcTaskStatus, FileUploadResponse, GeneratedUser, InferZodSchema, LoomartOptions, LoomartType, Statements, VideoCompressRequest, VideoCompressResponse }; diff --git a/lib/plugins/types.ts b/lib/plugins/types.ts new file mode 100644 index 0000000..88053ee --- /dev/null +++ b/lib/plugins/types.ts @@ -0,0 +1,18 @@ + +/** + * 联合类型转换为交叉类型 + * 联合类型是 A | B,结果就是 A & B + * type Result = UnionToIntersection => string & number + * type Result2 = UnionToIntersection<{ a: string } | { b: number }> => { a: string } & { b: number } + */ +export type UnionToIntersection = (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never; + +export type Primitive = string | number | symbol | bigint | boolean | null | undefined; +/** + * 字面量联合类型 + * type Status = LiteralUnion<'active' | 'inactive', string> => :'active' | 'inactive' | string + * type Score = LiteralUnion<0 | 1 | 2 | 3, number> => 0 | 1 | 2 | 3 | number + */ +export type LiteralUnion = LiteralType | (BaseType & Record); + +export type ReturnType any> = T extends (...args: any) => infer R ? R : any; diff --git a/lib/types.ts b/lib/types.ts new file mode 100644 index 0000000..d1a96af --- /dev/null +++ b/lib/types.ts @@ -0,0 +1,7 @@ + +export type ApiError = { + code?: string | undefined; + message?: string | undefined; + status: number; + statusText: string; +} \ No newline at end of file diff --git a/lib/utils.ts b/lib/utils.ts new file mode 100644 index 0000000..e6a8be0 --- /dev/null +++ b/lib/utils.ts @@ -0,0 +1,6 @@ +import { clsx, type ClassValue } from "clsx"; +import { twMerge } from "tailwind-merge"; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} diff --git a/locales/en-US.json b/locales/en-US.json new file mode 100644 index 0000000..39fe342 --- /dev/null +++ b/locales/en-US.json @@ -0,0 +1,187 @@ +{ + "my": { + "editProfile": "Edit Profile", + "generatedWorks": "Generated Works", + "generating": "Generating...", + "queuing": "Queuing...", + "changePassword": "Change Password", + "language": "Language", + "languageSwitch": "Language: 中文", + "languageSwitchEn": "Language: English" + }, + "changePassword": { + "title": "Change Password", + "currentPassword": "Current Password", + "newPassword": "New Password", + "confirmPassword": "Confirm New Password", + "currentPasswordPlaceholder": "Enter current password", + "newPasswordPlaceholder": "Enter new password (at least 6 characters)", + "confirmPasswordPlaceholder": "Enter new password again", + "currentPasswordRequired": "Current password is required", + "newPasswordRequired": "New password is required", + "newPasswordTooShort": "New password must be at least 6 characters", + "newPasswordSame": "New password cannot be the same as current password", + "confirmPasswordRequired": "Please confirm new password", + "confirmPasswordMismatch": "New passwords do not match", + "submit": "Confirm Changes" + }, + "editProfile": { + "namePlaceholder": "Enter nickname", + "save": "Save" + }, + "terms": { + "title": "Terms of Service" + }, + "privacy": { + "title": "Privacy Policy" + }, + "membership": { + "terms": "Terms of Service", + "privacy": "Privacy Policy", + "agreementText": "I have read and agree to", + "agreementAnd": "and", + "myPoints": "My Points", + "subscriptionPlan": "Subscription Plan", + "mostRecommended": "Top", + "perMonth": "/month", + "pointsPerMonth": "Points per month", + "pointsAutoRenew": "Points auto-renew monthly", + "subscribeNow": "Subscribe Now", + "features": { + "points750": "750 points, can use Sora2 150 times each", + "points1080": "1,080 points, can use Sora2 150 times each", + "points1500": "1,500 points, can use Sora2 150 times each", + "textToVideo": "Support text-to-video/image-to-video", + "superClearImage": "Super clear image generation", + "superDiscount": "Enjoy super discounts on Sora2, Veo3.1", + "sora2ProTemplate": "Can use Sora2 Pro templates", + "removeWatermark": "Remove brand watermark from generated works", + "allTemplates": "All templates", + "higherQuality": "Higher quality video", + "prioritySupport": "Priority customer support" + } + }, + "home": { + "hotTemplate": "Hot Template", + "peopleUsed": "people used", + "tabs": { + "featured": "Featured", + "christmas": "Christmas Limited", + "pets": "Pets", + "avatar": "Avatar Playground", + "theater1": "Theater 1", + "theater2": "Theater 2" + } + }, + "message": { + "all": "All", + "notice": "Activity Notice", + "other": "Other", + "noMessages": "No messages" + }, + "video": { + "makeSame": "Make Same Style" + }, + "worksList": { + "title": "Generated Works", + "all": "All", + "pets": "Pets", + "portrait": "Portrait", + "together": "Together" + }, + "channels": { + "title": "All Channels", + "channelName": "Channel Name" + }, + "notFound": { + "title": "Page Not Found", + "goBack": "Go back to Home screen" + }, + "generateVideo": { + "uploadReference": "Upload Reference Image", + "descriptionPlaceholder": "Describe the video effect you want", + "generate": "Generate Video", + "startGenerating": "Start Generating Video", + "generatingMessage": "Video is being generated, please wait..." + }, + "generationRecord": { + "title": "Generation Record", + "aiVideo": "AI Video", + "originalImage": "Original Image", + "reEdit": "Re-edit", + "regenerate": "Regenerate" + }, + "search": { + "history": "Search History", + "clearAll": "Clear All", + "done": "Done", + "exploreMore": "Explore More", + "refresh": "Refresh", + "searchWorks": "Search Generated Works", + "searchWorksPlaceholder": "Enter keywords to search generated works" + }, + "templateDetail": { + "title": "Hello, I'm a new resident of Zootopia 👋", + "subtitle": "Mom, we're going to Zootopia too" + }, + "pointsDrawer": { + "title": "My Points", + "all": "All", + "consume": "Consumed", + "obtain": "Obtained", + "subscriptionPoints": "Subscription Points", + "topUpPoints": "Top-up Points", + "subscribeForPoints": "Subscribe for Points", + "topUpPointsButton": "Top-up Points", + "dailyFreePoints": "Daily Free Points" + }, + "aiGenerationRecord": { + "title": "AI Generation Record", + "recentUsed": "Recently Used" + }, + "searchBar": { + "placeholder": "Search", + "button": "Search" + }, + "searchResults": { + "makeSame": "Make Same Style", + "noResults": "No results found" + }, + "uploadReference": { + "selectImage": "Select Image", + "generateAIVideo": "Generate AI Video", + "aiRecord": "AI Generation Record", + "recentUsed": "Recently Used", + "recentProject": "Recent Project", + "all": "All", + "face": "Face" + }, + "topUp": { + "title": "Top-up Points", + "confirm": "Confirm Top-up", + "agreementText": "I have read and agree to", + "terms": "Terms of Service", + "privacy": "Privacy Policy", + "agreementAnd": "and" + }, + "tabs": { + "home": "Home", + "video": "Video", + "message": "Message", + "my": "My" + }, + "authForm": { + "login": "Login", + "register": "Register", + "username": "Username", + "email": "Email", + "password": "Password", + "fillCompleteInfo": "Please fill in all information", + "fillEmail": "Please fill in email", + "loginFailed": "Login failed", + "registerFailed": "Registration failed", + "noAccountRegister": "No account? Register", + "haveAccountLogin": "Already have an account? Login" + } +} + diff --git a/locales/zh-CN.json b/locales/zh-CN.json new file mode 100644 index 0000000..d5f8f03 --- /dev/null +++ b/locales/zh-CN.json @@ -0,0 +1,187 @@ +{ + "my": { + "editProfile": "编辑资料", + "generatedWorks": "生成作品", + "generating": "生成中...", + "queuing": "排队中...", + "changePassword": "修改密码", + "language": "语言", + "languageSwitch": "语言: 中文", + "languageSwitchEn": "Language: English" + }, + "changePassword": { + "title": "修改密码", + "currentPassword": "当前密码", + "newPassword": "新密码", + "confirmPassword": "确认新密码", + "currentPasswordPlaceholder": "请输入当前密码", + "newPasswordPlaceholder": "请输入新密码(至少6位)", + "confirmPasswordPlaceholder": "请再次输入新密码", + "currentPasswordRequired": "请填写当前密码", + "newPasswordRequired": "请填写新密码", + "newPasswordTooShort": "新密码长度至少为6位", + "newPasswordSame": "新密码不能与当前密码相同", + "confirmPasswordRequired": "请确认新密码", + "confirmPasswordMismatch": "两次输入的新密码不一致", + "submit": "确认修改" + }, + "editProfile": { + "namePlaceholder": "请输入昵称", + "save": "保存" + }, + "terms": { + "title": "服务条款" + }, + "privacy": { + "title": "隐私协议" + }, + "membership": { + "terms": "服务条款", + "privacy": "隐私协议", + "agreementText": "我已阅读并同意", + "agreementAnd": "与", + "myPoints": "我的积分", + "subscriptionPlan": "订阅计划", + "mostRecommended": "最推荐", + "perMonth": "/月", + "pointsPerMonth": "积分每月", + "pointsAutoRenew": "积分每月自动续期", + "subscribeNow": "立即开通", + "features": { + "points750": "750点,每次可以使用150次Sora2", + "points1080": "1,080点,每次可以使用150次Sora2", + "points1500": "1,500点,每次可以使用150次Sora2", + "textToVideo": "支持文生视频/图生视频", + "superClearImage": "超清图像生成", + "superDiscount": "享受Sora2、Veo3.1超级折扣", + "sora2ProTemplate": "可以使用Sora2 Pro模板", + "removeWatermark": "生成作品去除品牌水印", + "allTemplates": "全部模板", + "higherQuality": "视频更高清", + "prioritySupport": "优先客服支持" + } + }, + "home": { + "hotTemplate": "热门模板", + "peopleUsed": "人用过", + "tabs": { + "featured": "精选推荐", + "christmas": "圣诞限定", + "pets": "萌宠", + "avatar": "分身趣玩场", + "theater1": "图趣小剧场", + "theater2": "图趣小剧场2" + } + }, + "message": { + "all": "全部", + "notice": "活动通知", + "other": "其他", + "noMessages": "暂无消息" + }, + "video": { + "makeSame": "做同款" + }, + "worksList": { + "title": "生成作品", + "all": "全部", + "pets": "萌宠", + "portrait": "写真", + "together": "合拍" + }, + "channels": { + "title": "全部频道", + "channelName": "频道名称" + }, + "notFound": { + "title": "页面未找到", + "goBack": "返回首页" + }, + "generateVideo": { + "uploadReference": "上传参考图", + "descriptionPlaceholder": "描述你想要的视频效果", + "generate": "生成视频", + "startGenerating": "开始生成视频", + "generatingMessage": "视频正在生成中,请稍候..." + }, + "generationRecord": { + "title": "生成记录", + "aiVideo": "AI 视频", + "originalImage": "原图", + "reEdit": "重新编辑", + "regenerate": "再次生成" + }, + "search": { + "history": "搜索历史", + "clearAll": "全部清除", + "done": "完成", + "exploreMore": "探索更多", + "refresh": "换一换", + "searchWorks": "搜索生成的作品", + "searchWorksPlaceholder": "请输入关键词搜索生成的作品" + }, + "templateDetail": { + "title": "泥嚎 我是动物城的新居民 👋", + "subtitle": "麻 我们也要去疯狂动物城" + }, + "pointsDrawer": { + "title": "我的积分", + "all": "全部", + "consume": "消耗", + "obtain": "获得", + "subscriptionPoints": "订阅积分", + "topUpPoints": "额外充值积分", + "subscribeForPoints": "订阅得积分", + "topUpPointsButton": "充值积分", + "dailyFreePoints": "每日免费积分" + }, + "aiGenerationRecord": { + "title": "AI 生成记录", + "recentUsed": "最近用过" + }, + "searchBar": { + "placeholder": "搜索", + "button": "搜索" + }, + "searchResults": { + "makeSame": "做同款", + "noResults": "暂无您的结果" + }, + "uploadReference": { + "selectImage": "选择图片", + "generateAIVideo": "生成 AI 视频", + "aiRecord": "AI 生成记录", + "recentUsed": "最近用过", + "recentProject": "最近项目", + "all": "全部", + "face": "人脸" + }, + "topUp": { + "title": "充值积分", + "confirm": "确认充值", + "agreementText": "我已阅读并同意", + "terms": "服务条款", + "privacy": "隐私协议", + "agreementAnd": "与" + }, + "tabs": { + "home": "首页", + "video": "视频", + "message": "消息", + "my": "我的" + }, + "authForm": { + "login": "登录", + "register": "注册", + "username": "用户名", + "email": "邮箱", + "password": "密码", + "fillCompleteInfo": "请填写完整信息", + "fillEmail": "请填写邮箱", + "loginFailed": "登录失败", + "registerFailed": "注册失败", + "noAccountRegister": "没有账号?去注册", + "haveAccountLogin": "已有账号?去登录" + } +} + diff --git a/metro.config.js b/metro.config.js new file mode 100644 index 0000000..3a8abbd --- /dev/null +++ b/metro.config.js @@ -0,0 +1,9 @@ +const { getDefaultConfig } = require('expo/metro-config') +const { withNativeWind } = require('nativewind/metro') + +const config = getDefaultConfig(__dirname) +/** + * https://www.better-auth.com/docs/integrations/expo#expo-client + */ +// config.resolver.unstable_enablePackageExports = true; +module.exports = withNativeWind(config, { input: './global.css' }) diff --git a/nativewind-env.d.ts b/nativewind-env.d.ts new file mode 100644 index 0000000..c0d8380 --- /dev/null +++ b/nativewind-env.d.ts @@ -0,0 +1,3 @@ +/// + +// NOTE: This file should not be edited and should be committed with your source code. It is generated by NativeWind. \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..635fa77 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,14293 @@ +{ + "name": "popcore", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "popcore", + "version": "1.0.0", + "dependencies": { + "@better-auth/expo": "1.3.34", + "@expo/vector-icons": "^15.0.3", + "@gorhom/bottom-sheet": "^5.2.8", + "@react-native-async-storage/async-storage": "^2.2.0", + "@react-native-masked-view/masked-view": "0.3.2", + "@react-navigation/bottom-tabs": "^7.4.0", + "@react-navigation/elements": "^2.6.3", + "@react-navigation/native": "^7.1.8", + "@stripe/react-stripe-js": "^5.4.1", + "@stripe/stripe-js": "^8.5.3", + "@stripe/stripe-react-native": "^0.57.0", + "better-auth": "1.3.34", + "buffer": "^6.0.3", + "class-variance-authority": "^0.7.1", + "expo": "~54.0.25", + "expo-blur": "^15.0.8", + "expo-constants": "^18.0.11", + "expo-crypto": "~15.0.7", + "expo-dev-client": "~6.0.18", + "expo-font": "~14.0.9", + "expo-haptics": "~15.0.7", + "expo-image": "~3.0.10", + "expo-image-manipulator": "^14.0.8", + "expo-image-picker": "~17.0.8", + "expo-linear-gradient": "^15.0.8", + "expo-linking": "^8.0.10", + "expo-media-library": "~18.2.0", + "expo-network": "^8.0.8", + "expo-router": "~6.0.15", + "expo-secure-store": "^15.0.8", + "expo-splash-screen": "~31.0.11", + "expo-status-bar": "~3.0.8", + "expo-symbols": "~1.0.7", + "expo-system-ui": "~6.0.8", + "expo-updates": "^29.0.14", + "expo-video": "^3.0.15", + "expo-web-browser": "^15.0.10", + "i18next": "^23.14.0", + "metro-minify-terser": "^0.82.4", + "nativewind": "^4.1.21", + "react": "19.1.0", + "react-dom": "19.1.0", + "react-i18next": "^15.0.1", + "react-native": "0.81.5", + "react-native-ble-plx": "^3.5.0", + "react-native-gesture-handler": "~2.28.0", + "react-native-keyboard-controller": "^1.20.1", + "react-native-multi-ble-peripheral": "^0.1.8", + "react-native-reanimated": "~4.1.1", + "react-native-reanimated-carousel": "^4.0.3", + "react-native-safe-area-context": "~5.6.0", + "react-native-screens": "~4.16.0", + "react-native-svg": "^15.15.1", + "react-native-web": "~0.21.0", + "react-native-worklets": "0.5.1", + "tailwind-variants": "^0.2.1" + }, + "devDependencies": { + "@babel/cli": "^7.28.3", + "@babel/core": "^7.28.5", + "@babel/preset-env": "^7.28.5", + "@types/react": "^19.2.1", + "@types/react-native": "^0.72.8", + "@typescript-eslint/eslint-plugin": "^8.33.0", + "@typescript-eslint/parser": "^8.33.0", + "babel-plugin-module-resolver": "^5.0.2", + "eslint": "^9.25.0", + "eslint-config-expo": "~10.0.0", + "eslint-config-prettier": "^10.1.5", + "eslint-import-resolver-typescript": "^4.4.2", + "eslint-plugin-i18n-json": "^4.0.1", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-prettier": "^5.4.1", + "eslint-plugin-react-compiler": "19.0.0-beta-a7bf2bd-20241110", + "eslint-plugin-react-native": "^5.0.0", + "eslint-plugin-simple-import-sort": "^12.1.1", + "eslint-plugin-tailwindcss": "^3.18.0", + "eslint-plugin-unicorn": "^59.0.1", + "eslint-plugin-unused-imports": "^4.1.4", + "prettier": "^3.3.3", + "prettier-plugin-tailwindcss": "^0.6.12", + "tailwindcss": "3.4.4", + "typescript": "~5.9.2" + } + }, + "node_modules/@0no-co/graphql.web": { + "version": "1.2.0", + "license": "MIT", + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" + }, + "peerDependenciesMeta": { + "graphql": { + "optional": true + } + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/cli": { + "version": "7.28.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.28", + "commander": "^6.2.0", + "convert-source-map": "^2.0.0", + "fs-readdir-recursive": "^1.1.0", + "glob": "^7.2.0", + "make-dir": "^2.1.0", + "slash": "^2.0.0" + }, + "bin": { + "babel": "bin/babel.js", + "babel-external-helpers": "bin/babel-external-helpers.js" + }, + "engines": { + "node": ">=6.9.0" + }, + "optionalDependencies": { + "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", + "chokidar": "^3.6.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.5", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.5", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.5", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.28.5", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.28.5", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "regexpu-core": "^6.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.5", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "debug": "^4.4.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.10" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.28.5", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.28.3", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.25.9", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk/node_modules/ansi-styles": { + "version": "3.2.1", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk/node_modules/ansi-styles/node_modules/color-convert": { + "version": "1.9.3", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/chalk/node_modules/ansi-styles/node_modules/color-convert/node_modules/color-name": { + "version": "1.1.3", + "license": "MIT" + }, + "node_modules/@babel/highlight/node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk/node_modules/supports-color/node_modules/has-flag": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.28.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.28.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.28.0", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-decorators": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-default-from": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-default-from": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-flow": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.28.0", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.28.3", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.3", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.28.4", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.28.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-flow": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.28.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.28.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.4", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.28.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.28.0", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.28.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.28.5", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.5", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.28.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.27.1", + "@babel/plugin-syntax-import-attributes": "^7.27.1", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.0", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.5", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.4", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.0", + "@babel/plugin-transform-exponentiation-operator": "^7.28.5", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.5", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.28.5", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + "@babel/plugin-transform-numeric-separator": "^7.27.1", + "@babel/plugin-transform-object-rest-spread": "^7.28.4", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.28.5", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.27.1", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.4", + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "core-js-compat": "^3.43.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.28.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.28.0", + "@babel/plugin-transform-react-jsx": "^7.27.1", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.28.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.4", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.5", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse--for-generate-function-map": { + "name": "@babel/traverse", + "version": "7.28.5", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@better-auth/core": { + "version": "1.3.34", + "dependencies": { + "zod": "^4.1.5" + }, + "peerDependencies": { + "@better-auth/utils": "0.3.0", + "@better-fetch/fetch": "1.1.18", + "better-call": "1.0.19", + "jose": "^6.1.0", + "kysely": "^0.28.5", + "nanostores": "^1.0.1" + } + }, + "node_modules/@better-auth/core/node_modules/zod": { + "version": "4.1.13", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/@better-auth/expo": { + "version": "1.3.34", + "license": "MIT", + "dependencies": { + "@better-fetch/fetch": "1.1.18", + "zod": "^4.1.5" + }, + "peerDependencies": { + "better-auth": "1.3.34", + "expo-constants": ">=17.0.0", + "expo-crypto": ">=13.0.0", + "expo-linking": ">=7.0.0", + "expo-secure-store": ">=14.0.0", + "expo-web-browser": ">=14.0.0" + } + }, + "node_modules/@better-auth/expo/node_modules/zod": { + "version": "4.1.13", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/@better-auth/telemetry": { + "version": "1.3.34", + "dependencies": { + "@better-auth/core": "1.3.34", + "@better-auth/utils": "0.3.0", + "@better-fetch/fetch": "1.1.18" + } + }, + "node_modules/@better-auth/utils": { + "version": "0.3.0", + "license": "MIT" + }, + "node_modules/@better-fetch/fetch": { + "version": "1.1.18" + }, + "node_modules/@egjs/hammerjs": { + "version": "2.0.17", + "license": "MIT", + "dependencies": { + "@types/hammerjs": "^2.0.36" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@expo/cli": { + "version": "54.0.18", + "license": "MIT", + "dependencies": { + "@0no-co/graphql.web": "^1.0.8", + "@expo/code-signing-certificates": "^0.0.5", + "@expo/config": "~12.0.11", + "@expo/config-plugins": "~54.0.3", + "@expo/devcert": "^1.2.1", + "@expo/env": "~2.0.8", + "@expo/image-utils": "^0.8.8", + "@expo/json-file": "^10.0.8", + "@expo/metro": "~54.1.0", + "@expo/metro-config": "~54.0.10", + "@expo/osascript": "^2.3.8", + "@expo/package-manager": "^1.9.9", + "@expo/plist": "^0.4.8", + "@expo/prebuild-config": "^54.0.7", + "@expo/schema-utils": "^0.1.8", + "@expo/spawn-async": "^1.7.2", + "@expo/ws-tunnel": "^1.0.1", + "@expo/xcpretty": "^4.3.0", + "@react-native/dev-middleware": "0.81.5", + "@urql/core": "^5.0.6", + "@urql/exchange-retry": "^1.3.0", + "accepts": "^1.3.8", + "arg": "^5.0.2", + "better-opn": "~3.0.2", + "bplist-creator": "0.1.0", + "bplist-parser": "^0.3.1", + "chalk": "^4.0.0", + "ci-info": "^3.3.0", + "compression": "^1.7.4", + "connect": "^3.7.0", + "debug": "^4.3.4", + "env-editor": "^0.4.1", + "expo-server": "^1.0.5", + "freeport-async": "^2.0.0", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "lan-network": "^0.1.6", + "minimatch": "^9.0.0", + "node-forge": "^1.3.1", + "npm-package-arg": "^11.0.0", + "ora": "^3.4.0", + "picomatch": "^3.0.1", + "pretty-bytes": "^5.6.0", + "pretty-format": "^29.7.0", + "progress": "^2.0.3", + "prompts": "^2.3.2", + "qrcode-terminal": "0.11.0", + "require-from-string": "^2.0.2", + "requireg": "^0.2.2", + "resolve": "^1.22.2", + "resolve-from": "^5.0.0", + "resolve.exports": "^2.0.3", + "semver": "^7.6.0", + "send": "^0.19.0", + "slugify": "^1.3.4", + "source-map-support": "~0.5.21", + "stacktrace-parser": "^0.1.10", + "structured-headers": "^0.4.1", + "tar": "^7.5.2", + "terminal-link": "^2.1.1", + "undici": "^6.18.2", + "wrap-ansi": "^7.0.0", + "ws": "^8.12.1" + }, + "bin": { + "expo-internal": "build/bin/cli" + }, + "peerDependencies": { + "expo": "*", + "expo-router": "*", + "react-native": "*" + }, + "peerDependenciesMeta": { + "expo-router": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/@expo/cli/node_modules/ci-info": { + "version": "3.9.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@expo/cli/node_modules/glob": { + "version": "13.0.0", + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "path-scurry": "^2.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/cli/node_modules/glob/node_modules/minimatch": { + "version": "10.1.1", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/cli/node_modules/glob/node_modules/minipass": { + "version": "7.1.2", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/@expo/cli/node_modules/glob/node_modules/path-scurry": { + "version": "2.0.1", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/cli/node_modules/glob/node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.2.4", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@expo/cli/node_modules/minimatch": { + "version": "9.0.5", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/cli/node_modules/minimatch/node_modules/brace-expansion": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@expo/cli/node_modules/picomatch": { + "version": "3.0.1", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@expo/cli/node_modules/pretty-format": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@expo/cli/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@expo/cli/node_modules/pretty-format/node_modules/react-is": { + "version": "18.3.1", + "license": "MIT" + }, + "node_modules/@expo/cli/node_modules/semver": { + "version": "7.7.2", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/cli/node_modules/ws": { + "version": "8.18.3", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@expo/code-signing-certificates": { + "version": "0.0.5", + "license": "MIT", + "dependencies": { + "node-forge": "^1.2.1", + "nullthrows": "^1.1.1" + } + }, + "node_modules/@expo/config": { + "version": "12.0.11", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "~7.10.4", + "@expo/config-plugins": "~54.0.3", + "@expo/config-types": "^54.0.9", + "@expo/json-file": "^10.0.7", + "deepmerge": "^4.3.1", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "require-from-string": "^2.0.2", + "resolve-from": "^5.0.0", + "resolve-workspace-root": "^2.0.0", + "semver": "^7.6.0", + "slugify": "^1.3.4", + "sucrase": "~3.35.1" + } + }, + "node_modules/@expo/config-plugins": { + "version": "54.0.3", + "license": "MIT", + "dependencies": { + "@expo/config-types": "^54.0.9", + "@expo/json-file": "~10.0.7", + "@expo/plist": "^0.4.7", + "@expo/sdk-runtime-versions": "^1.0.0", + "chalk": "^4.1.2", + "debug": "^4.3.5", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "resolve-from": "^5.0.0", + "semver": "^7.5.4", + "slash": "^3.0.0", + "slugify": "^1.6.6", + "xcode": "^3.0.1", + "xml2js": "0.6.0" + } + }, + "node_modules/@expo/config-plugins/node_modules/glob": { + "version": "13.0.0", + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "path-scurry": "^2.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/config-plugins/node_modules/glob/node_modules/minimatch": { + "version": "10.1.1", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/config-plugins/node_modules/glob/node_modules/minipass": { + "version": "7.1.2", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/@expo/config-plugins/node_modules/glob/node_modules/path-scurry": { + "version": "2.0.1", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/config-plugins/node_modules/glob/node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.2.4", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@expo/config-plugins/node_modules/semver": { + "version": "7.7.2", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/config-plugins/node_modules/slash": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@expo/config-types": { + "version": "54.0.9", + "license": "MIT" + }, + "node_modules/@expo/config/node_modules/@babel/code-frame": { + "version": "7.10.4", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@expo/config/node_modules/glob": { + "version": "13.0.0", + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "path-scurry": "^2.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/config/node_modules/glob/node_modules/minimatch": { + "version": "10.1.1", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/config/node_modules/glob/node_modules/minipass": { + "version": "7.1.2", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/@expo/config/node_modules/glob/node_modules/path-scurry": { + "version": "2.0.1", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/config/node_modules/glob/node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.2.4", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@expo/config/node_modules/semver": { + "version": "7.7.2", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/devcert": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "@expo/sudo-prompt": "^9.3.1", + "debug": "^3.1.0" + } + }, + "node_modules/@expo/devcert/node_modules/debug": { + "version": "3.2.7", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@expo/devtools": { + "version": "0.1.8", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/@expo/env": { + "version": "2.0.8", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "debug": "^4.3.4", + "dotenv": "~16.4.5", + "dotenv-expand": "~11.0.6", + "getenv": "^2.0.0" + } + }, + "node_modules/@expo/fingerprint": { + "version": "0.15.4", + "license": "MIT", + "dependencies": { + "@expo/spawn-async": "^1.7.2", + "arg": "^5.0.2", + "chalk": "^4.1.2", + "debug": "^4.3.4", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "ignore": "^5.3.1", + "minimatch": "^9.0.0", + "p-limit": "^3.1.0", + "resolve-from": "^5.0.0", + "semver": "^7.6.0" + }, + "bin": { + "fingerprint": "bin/cli.js" + } + }, + "node_modules/@expo/fingerprint/node_modules/glob": { + "version": "13.0.0", + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "path-scurry": "^2.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/fingerprint/node_modules/glob/node_modules/minimatch": { + "version": "10.1.1", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/fingerprint/node_modules/glob/node_modules/minipass": { + "version": "7.1.2", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/@expo/fingerprint/node_modules/glob/node_modules/path-scurry": { + "version": "2.0.1", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/fingerprint/node_modules/glob/node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.2.4", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@expo/fingerprint/node_modules/ignore": { + "version": "5.3.2", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@expo/fingerprint/node_modules/minimatch": { + "version": "9.0.5", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/fingerprint/node_modules/minimatch/node_modules/brace-expansion": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@expo/fingerprint/node_modules/semver": { + "version": "7.7.2", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/image-utils": { + "version": "0.8.8", + "license": "MIT", + "dependencies": { + "@expo/spawn-async": "^1.7.2", + "chalk": "^4.0.0", + "getenv": "^2.0.0", + "jimp-compact": "0.16.1", + "parse-png": "^2.1.0", + "resolve-from": "^5.0.0", + "resolve-global": "^1.0.0", + "semver": "^7.6.0", + "temp-dir": "~2.0.0", + "unique-string": "~2.0.0" + } + }, + "node_modules/@expo/image-utils/node_modules/semver": { + "version": "7.7.2", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/json-file": { + "version": "10.0.8", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "~7.10.4", + "json5": "^2.2.3" + } + }, + "node_modules/@expo/json-file/node_modules/@babel/code-frame": { + "version": "7.10.4", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@expo/metro": { + "version": "54.1.0", + "license": "MIT", + "dependencies": { + "metro": "0.83.2", + "metro-babel-transformer": "0.83.2", + "metro-cache": "0.83.2", + "metro-cache-key": "0.83.2", + "metro-config": "0.83.2", + "metro-core": "0.83.2", + "metro-file-map": "0.83.2", + "metro-resolver": "0.83.2", + "metro-runtime": "0.83.2", + "metro-source-map": "0.83.2", + "metro-transform-plugins": "0.83.2", + "metro-transform-worker": "0.83.2" + } + }, + "node_modules/@expo/metro-config": { + "version": "54.0.10", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.20.0", + "@babel/core": "^7.20.0", + "@babel/generator": "^7.20.5", + "@expo/config": "~12.0.11", + "@expo/env": "~2.0.7", + "@expo/json-file": "~10.0.7", + "@expo/metro": "~54.1.0", + "@expo/spawn-async": "^1.7.2", + "browserslist": "^4.25.0", + "chalk": "^4.1.0", + "debug": "^4.3.2", + "dotenv": "~16.4.5", + "dotenv-expand": "~11.0.6", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "hermes-parser": "^0.29.1", + "jsc-safe-url": "^0.2.4", + "lightningcss": "^1.30.1", + "minimatch": "^9.0.0", + "postcss": "~8.4.32", + "resolve-from": "^5.0.0" + }, + "peerDependencies": { + "expo": "*" + }, + "peerDependenciesMeta": { + "expo": { + "optional": true + } + } + }, + "node_modules/@expo/metro-config/node_modules/glob": { + "version": "13.0.0", + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "path-scurry": "^2.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/metro-config/node_modules/glob/node_modules/minimatch": { + "version": "10.1.1", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/metro-config/node_modules/glob/node_modules/minipass": { + "version": "7.1.2", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/@expo/metro-config/node_modules/glob/node_modules/path-scurry": { + "version": "2.0.1", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/metro-config/node_modules/glob/node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.2.4", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@expo/metro-config/node_modules/hermes-parser": { + "version": "0.29.1", + "license": "MIT", + "dependencies": { + "hermes-estree": "0.29.1" + } + }, + "node_modules/@expo/metro-config/node_modules/hermes-parser/node_modules/hermes-estree": { + "version": "0.29.1", + "license": "MIT" + }, + "node_modules/@expo/metro-config/node_modules/minimatch": { + "version": "9.0.5", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/metro-config/node_modules/minimatch/node_modules/brace-expansion": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@expo/metro-config/node_modules/postcss": { + "version": "8.4.49", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/@expo/metro-runtime": { + "version": "6.1.2", + "license": "MIT", + "dependencies": { + "anser": "^1.4.9", + "pretty-format": "^29.7.0", + "stacktrace-parser": "^0.1.10", + "whatwg-fetch": "^3.0.0" + }, + "peerDependencies": { + "expo": "*", + "react": "*", + "react-dom": "*", + "react-native": "*" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/@expo/metro-runtime/node_modules/pretty-format": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@expo/metro-runtime/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@expo/metro-runtime/node_modules/pretty-format/node_modules/react-is": { + "version": "18.3.1", + "license": "MIT" + }, + "node_modules/@expo/osascript": { + "version": "2.3.8", + "license": "MIT", + "dependencies": { + "@expo/spawn-async": "^1.7.2", + "exec-async": "^2.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@expo/package-manager": { + "version": "1.9.9", + "license": "MIT", + "dependencies": { + "@expo/json-file": "^10.0.8", + "@expo/spawn-async": "^1.7.2", + "chalk": "^4.0.0", + "npm-package-arg": "^11.0.0", + "ora": "^3.4.0", + "resolve-workspace-root": "^2.0.0" + } + }, + "node_modules/@expo/plist": { + "version": "0.4.8", + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.2.3", + "xmlbuilder": "^15.1.1" + } + }, + "node_modules/@expo/prebuild-config": { + "version": "54.0.7", + "license": "MIT", + "dependencies": { + "@expo/config": "~12.0.11", + "@expo/config-plugins": "~54.0.3", + "@expo/config-types": "^54.0.9", + "@expo/image-utils": "^0.8.8", + "@expo/json-file": "^10.0.8", + "@react-native/normalize-colors": "0.81.5", + "debug": "^4.3.1", + "resolve-from": "^5.0.0", + "semver": "^7.6.0", + "xml2js": "0.6.0" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/@expo/prebuild-config/node_modules/semver": { + "version": "7.7.2", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/schema-utils": { + "version": "0.1.8", + "license": "MIT" + }, + "node_modules/@expo/sdk-runtime-versions": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/@expo/spawn-async": { + "version": "1.7.2", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@expo/sudo-prompt": { + "version": "9.3.2", + "license": "MIT" + }, + "node_modules/@expo/vector-icons": { + "version": "15.0.3", + "license": "MIT", + "peerDependencies": { + "expo-font": ">=14.0.4", + "react": "*", + "react-native": "*" + } + }, + "node_modules/@expo/ws-tunnel": { + "version": "1.0.6", + "license": "MIT" + }, + "node_modules/@expo/xcpretty": { + "version": "4.3.2", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/code-frame": "7.10.4", + "chalk": "^4.1.0", + "find-up": "^5.0.0", + "js-yaml": "^4.1.0" + }, + "bin": { + "excpretty": "build/cli.js" + } + }, + "node_modules/@expo/xcpretty/node_modules/@babel/code-frame": { + "version": "7.10.4", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@formatjs/ecma402-abstract": { + "version": "2.3.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@formatjs/fast-memoize": "2.2.7", + "@formatjs/intl-localematcher": "0.6.2", + "decimal.js": "^10.4.3", + "tslib": "^2.8.0" + } + }, + "node_modules/@formatjs/fast-memoize": { + "version": "2.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@formatjs/icu-messageformat-parser": { + "version": "2.11.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@formatjs/ecma402-abstract": "2.3.6", + "@formatjs/icu-skeleton-parser": "1.8.16", + "tslib": "^2.8.0" + } + }, + "node_modules/@formatjs/icu-skeleton-parser": { + "version": "1.8.16", + "dev": true, + "license": "MIT", + "dependencies": { + "@formatjs/ecma402-abstract": "2.3.6", + "tslib": "^2.8.0" + } + }, + "node_modules/@formatjs/intl-localematcher": { + "version": "0.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@gorhom/bottom-sheet": { + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/@gorhom/bottom-sheet/-/bottom-sheet-5.2.8.tgz", + "integrity": "sha512-+N27SMpbBxXZQ/IA2nlEV6RGxL/qSFHKfdFKcygvW+HqPG5jVNb1OqehLQsGfBP+Up42i0gW5ppI+DhpB7UCzA==", + "license": "MIT", + "dependencies": { + "@gorhom/portal": "1.0.14", + "invariant": "^2.2.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-native": "*", + "react": "*", + "react-native": "*", + "react-native-gesture-handler": ">=2.16.1", + "react-native-reanimated": ">=3.16.0 || >=4.0.0-" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-native": { + "optional": true + } + } + }, + "node_modules/@gorhom/portal": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/@gorhom/portal/-/portal-1.0.14.tgz", + "integrity": "sha512-MXyL4xvCjmgaORr/rtryDNFy3kU4qUbKlwtQqqsygd0xX3mhKjOLn6mQK8wfu0RkoE0pBE0nAasRoHua+/QZ7A==", + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.1" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/@hexagon/base64": { + "version": "1.1.28", + "license": "MIT" + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@isaacs/fs-minipass/node_modules/minipass": { + "version": "7.1.2", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/@isaacs/ttlcache": { + "version": "1.4.1", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up/node_modules/locate-path": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up/node_modules/locate-path/node_modules/p-locate": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up/node_modules/locate-path/node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.2", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml/node_modules/argparse": { + "version": "1.0.10", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/create-cache-key-function": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform/node_modules/slash": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@levischuck/tiny-cbor": { + "version": "0.2.11", + "license": "MIT" + }, + "node_modules/@nicolo-ribaudo/chokidar-2": { + "version": "2.1.8-no-fsevents.3", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/@noble/ciphers": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/@peculiar/asn1-android": { + "version": "2.6.0", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-cms": { + "version": "2.6.0", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "@peculiar/asn1-x509-attr": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-csr": { + "version": "2.6.0", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-ecc": { + "version": "2.6.0", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pfx": { + "version": "2.6.0", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.6.0", + "@peculiar/asn1-pkcs8": "^2.6.0", + "@peculiar/asn1-rsa": "^2.6.0", + "@peculiar/asn1-schema": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pkcs8": { + "version": "2.6.0", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pkcs9": { + "version": "2.6.0", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.6.0", + "@peculiar/asn1-pfx": "^2.6.0", + "@peculiar/asn1-pkcs8": "^2.6.0", + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "@peculiar/asn1-x509-attr": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-rsa": { + "version": "2.6.0", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-schema": { + "version": "2.6.0", + "license": "MIT", + "dependencies": { + "asn1js": "^3.0.6", + "pvtsutils": "^1.3.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-x509": { + "version": "2.6.0", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "asn1js": "^3.0.6", + "pvtsutils": "^1.3.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-x509-attr": { + "version": "2.6.0", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/x509": { + "version": "1.14.2", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.6.0", + "@peculiar/asn1-csr": "^2.6.0", + "@peculiar/asn1-ecc": "^2.6.0", + "@peculiar/asn1-pkcs9": "^2.6.0", + "@peculiar/asn1-rsa": "^2.6.0", + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "pvtsutils": "^1.3.6", + "reflect-metadata": "^0.2.2", + "tslib": "^2.8.1", + "tsyringe": "^4.10.0" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@pkgr/core": { + "version": "0.2.9", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "license": "MIT" + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.7", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.15", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.1", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.11", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.3", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.7", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.9", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.5", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.11", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs": { + "version": "1.1.13", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.1", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.2", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.2", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@react-native-async-storage/async-storage": { + "version": "2.2.0", + "license": "MIT", + "dependencies": { + "merge-options": "^3.0.4" + }, + "peerDependencies": { + "react-native": "^0.0.0-0 || >=0.65 <1.0" + } + }, + "node_modules/@react-native-masked-view/masked-view": { + "version": "0.3.2", + "license": "MIT", + "peerDependencies": { + "react": ">=16", + "react-native": ">=0.57" + } + }, + "node_modules/@react-native/assets-registry": { + "version": "0.81.5", + "license": "MIT", + "engines": { + "node": ">= 20.19.4" + } + }, + "node_modules/@react-native/babel-plugin-codegen": { + "version": "0.81.5", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.3", + "@react-native/codegen": "0.81.5" + }, + "engines": { + "node": ">= 20.19.4" + } + }, + "node_modules/@react-native/babel-preset": { + "version": "0.81.5", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.2", + "@babel/plugin-proposal-export-default-from": "^7.24.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-default-from": "^7.24.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.4", + "@babel/plugin-transform-async-to-generator": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.25.0", + "@babel/plugin-transform-class-properties": "^7.25.4", + "@babel/plugin-transform-classes": "^7.25.4", + "@babel/plugin-transform-computed-properties": "^7.24.7", + "@babel/plugin-transform-destructuring": "^7.24.8", + "@babel/plugin-transform-flow-strip-types": "^7.25.2", + "@babel/plugin-transform-for-of": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.25.1", + "@babel/plugin-transform-literals": "^7.25.2", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", + "@babel/plugin-transform-numeric-separator": "^7.24.7", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-optional-catch-binding": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.8", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-react-display-name": "^7.24.7", + "@babel/plugin-transform-react-jsx": "^7.25.2", + "@babel/plugin-transform-react-jsx-self": "^7.24.7", + "@babel/plugin-transform-react-jsx-source": "^7.24.7", + "@babel/plugin-transform-regenerator": "^7.24.7", + "@babel/plugin-transform-runtime": "^7.24.7", + "@babel/plugin-transform-shorthand-properties": "^7.24.7", + "@babel/plugin-transform-spread": "^7.24.7", + "@babel/plugin-transform-sticky-regex": "^7.24.7", + "@babel/plugin-transform-typescript": "^7.25.2", + "@babel/plugin-transform-unicode-regex": "^7.24.7", + "@babel/template": "^7.25.0", + "@react-native/babel-plugin-codegen": "0.81.5", + "babel-plugin-syntax-hermes-parser": "0.29.1", + "babel-plugin-transform-flow-enums": "^0.0.2", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": ">= 20.19.4" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/@react-native/codegen": { + "version": "0.81.5", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.2", + "@babel/parser": "^7.25.3", + "glob": "^7.1.1", + "hermes-parser": "0.29.1", + "invariant": "^2.2.4", + "nullthrows": "^1.1.1", + "yargs": "^17.6.2" + }, + "engines": { + "node": ">= 20.19.4" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/@react-native/codegen/node_modules/hermes-parser": { + "version": "0.29.1", + "license": "MIT", + "dependencies": { + "hermes-estree": "0.29.1" + } + }, + "node_modules/@react-native/codegen/node_modules/hermes-parser/node_modules/hermes-estree": { + "version": "0.29.1", + "license": "MIT" + }, + "node_modules/@react-native/community-cli-plugin": { + "version": "0.81.5", + "license": "MIT", + "dependencies": { + "@react-native/dev-middleware": "0.81.5", + "debug": "^4.4.0", + "invariant": "^2.2.4", + "metro": "^0.83.1", + "metro-config": "^0.83.1", + "metro-core": "^0.83.1", + "semver": "^7.1.3" + }, + "engines": { + "node": ">= 20.19.4" + }, + "peerDependencies": { + "@react-native-community/cli": "*", + "@react-native/metro-config": "*" + }, + "peerDependenciesMeta": { + "@react-native-community/cli": { + "optional": true + }, + "@react-native/metro-config": { + "optional": true + } + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/semver": { + "version": "7.7.2", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@react-native/debugger-frontend": { + "version": "0.81.5", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 20.19.4" + } + }, + "node_modules/@react-native/dev-middleware": { + "version": "0.81.5", + "license": "MIT", + "dependencies": { + "@isaacs/ttlcache": "^1.4.1", + "@react-native/debugger-frontend": "0.81.5", + "chrome-launcher": "^0.15.2", + "chromium-edge-launcher": "^0.2.0", + "connect": "^3.6.5", + "debug": "^4.4.0", + "invariant": "^2.2.4", + "nullthrows": "^1.1.1", + "open": "^7.0.3", + "serve-static": "^1.16.2", + "ws": "^6.2.3" + }, + "engines": { + "node": ">= 20.19.4" + } + }, + "node_modules/@react-native/gradle-plugin": { + "version": "0.81.5", + "license": "MIT", + "engines": { + "node": ">= 20.19.4" + } + }, + "node_modules/@react-native/js-polyfills": { + "version": "0.81.5", + "license": "MIT", + "engines": { + "node": ">= 20.19.4" + } + }, + "node_modules/@react-native/normalize-colors": { + "version": "0.81.5", + "license": "MIT" + }, + "node_modules/@react-native/virtualized-lists": { + "version": "0.72.8", + "devOptional": true, + "license": "MIT", + "dependencies": { + "invariant": "^2.2.4", + "nullthrows": "^1.1.1" + }, + "peerDependencies": { + "react-native": "*" + } + }, + "node_modules/@react-navigation/bottom-tabs": { + "version": "7.8.11", + "license": "MIT", + "dependencies": { + "@react-navigation/elements": "^2.9.1", + "color": "^4.2.3", + "sf-symbols-typescript": "^2.1.0" + }, + "peerDependencies": { + "@react-navigation/native": "^7.1.24", + "react": ">= 18.2.0", + "react-native": "*", + "react-native-safe-area-context": ">= 4.0.0", + "react-native-screens": ">= 4.0.0" + } + }, + "node_modules/@react-navigation/core": { + "version": "7.13.5", + "license": "MIT", + "dependencies": { + "@react-navigation/routers": "^7.5.2", + "escape-string-regexp": "^4.0.0", + "fast-deep-equal": "^3.1.3", + "nanoid": "^3.3.11", + "query-string": "^7.1.3", + "react-is": "^19.1.0", + "use-latest-callback": "^0.2.4", + "use-sync-external-store": "^1.5.0" + }, + "peerDependencies": { + "react": ">= 18.2.0" + } + }, + "node_modules/@react-navigation/elements": { + "version": "2.9.1", + "license": "MIT", + "dependencies": { + "color": "^4.2.3", + "use-latest-callback": "^0.2.4", + "use-sync-external-store": "^1.5.0" + }, + "peerDependencies": { + "@react-native-masked-view/masked-view": ">= 0.2.0", + "@react-navigation/native": "^7.1.24", + "react": ">= 18.2.0", + "react-native": "*", + "react-native-safe-area-context": ">= 4.0.0" + }, + "peerDependenciesMeta": { + "@react-native-masked-view/masked-view": { + "optional": true + } + } + }, + "node_modules/@react-navigation/native": { + "version": "7.1.24", + "license": "MIT", + "dependencies": { + "@react-navigation/core": "^7.13.5", + "escape-string-regexp": "^4.0.0", + "fast-deep-equal": "^3.1.3", + "nanoid": "^3.3.11", + "use-latest-callback": "^0.2.4" + }, + "peerDependencies": { + "react": ">= 18.2.0", + "react-native": "*" + } + }, + "node_modules/@react-navigation/native-stack": { + "version": "7.8.5", + "license": "MIT", + "dependencies": { + "@react-navigation/elements": "^2.9.1", + "color": "^4.2.3", + "sf-symbols-typescript": "^2.1.0", + "warn-once": "^0.1.1" + }, + "peerDependencies": { + "@react-navigation/native": "^7.1.24", + "react": ">= 18.2.0", + "react-native": "*", + "react-native-safe-area-context": ">= 4.0.0", + "react-native-screens": ">= 4.0.0" + } + }, + "node_modules/@react-navigation/routers": { + "version": "7.5.2", + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@simplewebauthn/browser": { + "version": "13.2.2", + "license": "MIT" + }, + "node_modules/@simplewebauthn/server": { + "version": "13.2.2", + "license": "MIT", + "dependencies": { + "@hexagon/base64": "^1.1.27", + "@levischuck/tiny-cbor": "^0.2.2", + "@peculiar/asn1-android": "^2.3.10", + "@peculiar/asn1-ecc": "^2.3.8", + "@peculiar/asn1-rsa": "^2.3.8", + "@peculiar/asn1-schema": "^2.3.8", + "@peculiar/asn1-x509": "^2.3.8", + "@peculiar/x509": "^1.13.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@stripe/react-stripe-js": { + "version": "5.4.1", + "license": "MIT", + "dependencies": { + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "@stripe/stripe-js": ">=8.0.0 <9.0.0", + "react": ">=16.8.0 <20.0.0", + "react-dom": ">=16.8.0 <20.0.0" + } + }, + "node_modules/@stripe/stripe-js": { + "version": "8.5.3", + "license": "MIT", + "engines": { + "node": ">=12.16" + } + }, + "node_modules/@stripe/stripe-react-native": { + "version": "0.57.0", + "license": "MIT", + "peerDependencies": { + "expo": ">=46.0.9", + "react": "*", + "react-native": "*" + }, + "peerDependenciesMeta": { + "expo": { + "optional": true + } + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/hammerjs": { + "version": "2.0.46", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.10.1", + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.7", + "devOptional": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-native": { + "version": "0.72.8", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@react-native/virtualized-lists": "^0.72.4", + "@types/react": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.35", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.48.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.48.1", + "@typescript-eslint/type-utils": "8.48.1", + "@typescript-eslint/utils": "8.48.1", + "@typescript-eslint/visitor-keys": "8.48.1", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.48.1", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.48.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.48.1", + "@typescript-eslint/types": "8.48.1", + "@typescript-eslint/typescript-estree": "8.48.1", + "@typescript-eslint/visitor-keys": "8.48.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.48.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.48.1", + "@typescript-eslint/types": "^8.48.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.48.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.48.1", + "@typescript-eslint/visitor-keys": "8.48.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.48.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.48.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.48.1", + "@typescript-eslint/typescript-estree": "8.48.1", + "@typescript-eslint/utils": "8.48.1", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.48.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.48.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.48.1", + "@typescript-eslint/tsconfig-utils": "8.48.1", + "@typescript-eslint/types": "8.48.1", + "@typescript-eslint/visitor-keys": "8.48.1", + "debug": "^4.3.4", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/node_modules/brace-expansion": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.48.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.48.1", + "@typescript-eslint/types": "8.48.1", + "@typescript-eslint/typescript-estree": "8.48.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.48.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.48.1", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "license": "ISC" + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@urql/core": { + "version": "5.2.0", + "license": "MIT", + "dependencies": { + "@0no-co/graphql.web": "^1.0.13", + "wonka": "^6.3.2" + } + }, + "node_modules/@urql/exchange-retry": { + "version": "1.3.2", + "license": "MIT", + "dependencies": { + "@urql/core": "^5.1.2", + "wonka": "^6.3.2" + }, + "peerDependencies": { + "@urql/core": "^5.0.0" + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.11", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/anser": { + "version": "1.4.10", + "license": "MIT" + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "license": "Python-2.0" + }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-timsort": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "license": "MIT" + }, + "node_modules/asn1js": { + "version": "3.0.7", + "license": "BSD-3-Clause", + "dependencies": { + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/async-function": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-jest/node_modules/slash": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-plugin-module-resolver": { + "version": "5.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "find-babel-config": "^2.1.1", + "glob": "^9.3.3", + "pkg-up": "^3.1.0", + "reselect": "^4.1.7", + "resolve": "^1.22.8" + } + }, + "node_modules/babel-plugin-module-resolver/node_modules/glob": { + "version": "9.3.5", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/babel-plugin-module-resolver/node_modules/glob/node_modules/minimatch": { + "version": "8.0.4", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/babel-plugin-module-resolver/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.14", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.7", + "@babel/helper-define-polyfill-provider": "^0.6.5", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.13.0", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.5", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-react-compiler": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.0" + } + }, + "node_modules/babel-plugin-react-native-web": { + "version": "0.21.2", + "license": "MIT" + }, + "node_modules/babel-plugin-syntax-hermes-parser": { + "version": "0.29.1", + "license": "MIT", + "dependencies": { + "hermes-parser": "0.29.1" + } + }, + "node_modules/babel-plugin-syntax-hermes-parser/node_modules/hermes-parser": { + "version": "0.29.1", + "license": "MIT", + "dependencies": { + "hermes-estree": "0.29.1" + } + }, + "node_modules/babel-plugin-syntax-hermes-parser/node_modules/hermes-parser/node_modules/hermes-estree": { + "version": "0.29.1", + "license": "MIT" + }, + "node_modules/babel-plugin-transform-flow-enums": { + "version": "0.0.2", + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-flow": "^7.12.1" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/babel-preset-expo": { + "version": "54.0.8", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/plugin-proposal-decorators": "^7.12.9", + "@babel/plugin-proposal-export-default-from": "^7.24.7", + "@babel/plugin-syntax-export-default-from": "^7.24.7", + "@babel/plugin-transform-class-static-block": "^7.27.1", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-flow-strip-types": "^7.25.2", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-runtime": "^7.24.7", + "@babel/preset-react": "^7.22.15", + "@babel/preset-typescript": "^7.23.0", + "@react-native/babel-preset": "0.81.5", + "babel-plugin-react-compiler": "^1.0.0", + "babel-plugin-react-native-web": "~0.21.0", + "babel-plugin-syntax-hermes-parser": "^0.29.1", + "babel-plugin-transform-flow-enums": "^0.0.2", + "debug": "^4.3.4", + "resolve-from": "^5.0.0" + }, + "peerDependencies": { + "@babel/runtime": "^7.20.0", + "expo": "*", + "react-refresh": ">=0.14.0 <1.0.0" + }, + "peerDependenciesMeta": { + "@babel/runtime": { + "optional": true + }, + "expo": { + "optional": true + } + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.4", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/better-auth": { + "version": "1.3.34", + "license": "MIT", + "dependencies": { + "@better-auth/core": "1.3.34", + "@better-auth/telemetry": "1.3.34", + "@better-auth/utils": "0.3.0", + "@better-fetch/fetch": "1.1.18", + "@noble/ciphers": "^2.0.0", + "@noble/hashes": "^2.0.0", + "@simplewebauthn/browser": "^13.1.2", + "@simplewebauthn/server": "^13.1.2", + "better-call": "1.0.19", + "defu": "^6.1.4", + "jose": "^6.1.0", + "kysely": "^0.28.5", + "nanostores": "^1.0.1", + "zod": "^4.1.5" + }, + "peerDependenciesMeta": { + "@lynx-js/react": { + "optional": true + }, + "@sveltejs/kit": { + "optional": true + }, + "next": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "solid-js": { + "optional": true + }, + "svelte": { + "optional": true + }, + "vue": { + "optional": true + } + } + }, + "node_modules/better-auth/node_modules/zod": { + "version": "4.1.13", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/better-call": { + "version": "1.0.19", + "dependencies": { + "@better-auth/utils": "^0.3.0", + "@better-fetch/fetch": "^1.1.4", + "rou3": "^0.5.1", + "set-cookie-parser": "^2.7.1", + "uncrypto": "^0.1.3" + } + }, + "node_modules/better-opn": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "open": "^8.0.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/better-opn/node_modules/open": { + "version": "8.4.2", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/big-integer": { + "version": "1.6.52", + "license": "Unlicense", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "license": "ISC" + }, + "node_modules/bplist-creator": { + "version": "0.1.0", + "license": "MIT", + "dependencies": { + "stream-buffers": "2.2.x" + } + }, + "node_modules/bplist-parser": { + "version": "0.3.2", + "license": "MIT", + "dependencies": { + "big-integer": "1.6.x" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "license": "MIT" + }, + "node_modules/builtin-modules": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001759", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/chrome-launcher": { + "version": "0.15.2", + "license": "Apache-2.0", + "dependencies": { + "@types/node": "*", + "escape-string-regexp": "^4.0.0", + "is-wsl": "^2.2.0", + "lighthouse-logger": "^1.0.0" + }, + "bin": { + "print-chrome-path": "bin/print-chrome-path.js" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/chromium-edge-launcher": { + "version": "0.2.0", + "license": "Apache-2.0", + "dependencies": { + "@types/node": "*", + "escape-string-regexp": "^4.0.0", + "is-wsl": "^2.2.0", + "lighthouse-logger": "^1.0.0", + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "node_modules/ci-info": { + "version": "4.3.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "node_modules/clean-regexp": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/clean-regexp/node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/cli-cursor": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/cliui": { + "version": "8.0.1", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/commander": { + "version": "6.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/comment-json": { + "version": "4.4.1", + "license": "MIT", + "dependencies": { + "array-timsort": "^1.0.3", + "core-util-is": "^1.0.3", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/compressible": { + "version": "2.0.18", + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.1", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/compression/node_modules/negotiator": { + "version": "0.6.4", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/connect": { + "version": "3.7.0", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/core-js-compat": { + "version": "3.47.0", + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/cross-fetch": { + "version": "3.2.0", + "license": "MIT", + "dependencies": { + "node-fetch": "^2.7.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/css-in-js-utils": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "hyphenate-style-name": "^1.0.3" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "1.1.3", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-tree/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "devOptional": true, + "license": "MIT" + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "dev": true, + "license": "MIT" + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/defu": { + "version": "6.1.4", + "license": "MIT" + }, + "node_modules/depd": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "license": "Apache-2.0" + }, + "node_modules/diff": { + "version": "3.5.0", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "license": "MIT" + }, + "node_modules/doctrine": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dotenv": { + "version": "16.4.7", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand": { + "version": "11.0.7", + "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.266", + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-editor": { + "version": "0.4.2", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "license": "MIT", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/es-abstract": { + "version": "1.24.0", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.1", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-expo": { + "version": "10.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "^8.18.2", + "@typescript-eslint/parser": "^8.18.2", + "eslint-import-resolver-typescript": "^3.6.3", + "eslint-plugin-expo": "^1.0.0", + "eslint-plugin-import": "^2.30.0", + "eslint-plugin-react": "^7.37.3", + "eslint-plugin-react-hooks": "^5.1.0", + "globals": "^16.0.0" + }, + "peerDependencies": { + "eslint": ">=8.10" + } + }, + "node_modules/eslint-config-expo/node_modules/eslint-import-resolver-typescript": { + "version": "3.10.1", + "dev": true, + "license": "ISC", + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.4.0", + "get-tsconfig": "^4.10.0", + "is-bun-module": "^2.0.0", + "stable-hash": "^0.0.5", + "tinyglobby": "^0.2.13", + "unrs-resolver": "^1.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-context": { + "version": "0.1.9", + "dev": true, + "license": "MIT", + "dependencies": { + "get-tsconfig": "^4.10.1", + "stable-hash-x": "^0.2.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-context" + }, + "peerDependencies": { + "unrs-resolver": "^1.0.0" + }, + "peerDependenciesMeta": { + "unrs-resolver": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "4.4.4", + "dev": true, + "license": "ISC", + "dependencies": { + "debug": "^4.4.1", + "eslint-import-context": "^0.1.8", + "get-tsconfig": "^4.10.1", + "is-bun-module": "^2.0.0", + "stable-hash-x": "^0.2.0", + "tinyglobby": "^0.2.14", + "unrs-resolver": "^1.7.11" + }, + "engines": { + "node": "^16.17.0 || >=18.6.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-expo": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "^8.29.1", + "@typescript-eslint/utils": "^8.29.1", + "eslint": "^9.24.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "eslint": ">=8.10" + } + }, + "node_modules/eslint-plugin-i18n-json": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@formatjs/icu-messageformat-parser": "^2.0.18", + "chalk": "^2.3.2", + "indent-string": "^3.2.0", + "jest-diff": "^22.0.3", + "lodash": "^4.17.21", + "log-symbols": "^2.2.0", + "parse-json": "^5.2.0", + "plur": "^2.1.2", + "pretty-format": "^22.0.3" + }, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "eslint": ">=4.0.0" + } + }, + "node_modules/eslint-plugin-i18n-json/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-i18n-json/node_modules/chalk/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-i18n-json/node_modules/chalk/node_modules/ansi-styles/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/eslint-plugin-i18n-json/node_modules/chalk/node_modules/ansi-styles/node_modules/color-convert/node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-plugin-i18n-json/node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint-plugin-i18n-json/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-i18n-json/node_modules/chalk/node_modules/supports-color/node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.11.7" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-compiler": { + "version": "19.0.0-beta-a7bf2bd-20241110", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "hermes-parser": "^0.20.1", + "zod": "^3.22.4", + "zod-validation-error": "^3.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.0.0 || >= 18.0.0" + }, + "peerDependencies": { + "eslint": ">=7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-native": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-plugin-react-native-globals": "^0.1.1" + }, + "peerDependencies": { + "eslint": "^3.17.0 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-react-native-globals": { + "version": "0.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-simple-import-sort": { + "version": "12.1.1", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=5.0.0" + } + }, + "node_modules/eslint-plugin-tailwindcss": { + "version": "3.18.2", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "^3.2.5", + "postcss": "^8.4.4" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "tailwindcss": "^3.4.0" + } + }, + "node_modules/eslint-plugin-unicorn": { + "version": "59.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "@eslint-community/eslint-utils": "^4.5.1", + "@eslint/plugin-kit": "^0.2.7", + "ci-info": "^4.2.0", + "clean-regexp": "^1.0.0", + "core-js-compat": "^3.41.0", + "esquery": "^1.6.0", + "find-up-simple": "^1.0.1", + "globals": "^16.0.0", + "indent-string": "^5.0.0", + "is-builtin-module": "^5.0.0", + "jsesc": "^3.1.0", + "pluralize": "^8.0.0", + "regexp-tree": "^0.1.27", + "regjsparser": "^0.12.0", + "semver": "^7.7.1", + "strip-indent": "^4.0.0" + }, + "engines": { + "node": "^18.20.0 || ^20.10.0 || >=21.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" + }, + "peerDependencies": { + "eslint": ">=9.22.0" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/@eslint/plugin-kit": { + "version": "0.2.8", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.13.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { + "version": "0.13.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/indent-string": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/semver": { + "version": "7.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-unused-imports": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", + "eslint": "^9.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "license": "MIT" + }, + "node_modules/exec-async": { + "version": "2.2.0", + "license": "MIT" + }, + "node_modules/expo": { + "version": "54.0.27", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.0", + "@expo/cli": "54.0.18", + "@expo/config": "~12.0.11", + "@expo/config-plugins": "~54.0.3", + "@expo/devtools": "0.1.8", + "@expo/fingerprint": "0.15.4", + "@expo/metro": "~54.1.0", + "@expo/metro-config": "54.0.10", + "@expo/vector-icons": "^15.0.3", + "@ungap/structured-clone": "^1.3.0", + "babel-preset-expo": "~54.0.8", + "expo-asset": "~12.0.11", + "expo-constants": "~18.0.11", + "expo-file-system": "~19.0.20", + "expo-font": "~14.0.10", + "expo-keep-awake": "~15.0.8", + "expo-modules-autolinking": "3.0.23", + "expo-modules-core": "3.0.28", + "pretty-format": "^29.7.0", + "react-refresh": "^0.14.2", + "whatwg-url-without-unicode": "8.0.0-3" + }, + "bin": { + "expo": "bin/cli", + "expo-modules-autolinking": "bin/autolinking", + "fingerprint": "bin/fingerprint" + }, + "peerDependencies": { + "@expo/dom-webview": "*", + "@expo/metro-runtime": "*", + "react": "*", + "react-native": "*", + "react-native-webview": "*" + }, + "peerDependenciesMeta": { + "@expo/dom-webview": { + "optional": true + }, + "@expo/metro-runtime": { + "optional": true + }, + "react-native-webview": { + "optional": true + } + } + }, + "node_modules/expo-asset": { + "version": "12.0.11", + "license": "MIT", + "dependencies": { + "@expo/image-utils": "^0.8.8", + "expo-constants": "~18.0.11" + }, + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-blur": { + "version": "15.0.8", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-constants": { + "version": "18.0.11", + "license": "MIT", + "dependencies": { + "@expo/config": "~12.0.11", + "@expo/env": "~2.0.8" + }, + "peerDependencies": { + "expo": "*", + "react-native": "*" + } + }, + "node_modules/expo-crypto": { + "version": "15.0.8", + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.0" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-dev-client": { + "version": "6.0.20", + "license": "MIT", + "dependencies": { + "expo-dev-launcher": "6.0.20", + "expo-dev-menu": "7.0.18", + "expo-dev-menu-interface": "2.0.0", + "expo-manifests": "~1.0.10", + "expo-updates-interface": "~2.0.0" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-dev-launcher": { + "version": "6.0.20", + "license": "MIT", + "dependencies": { + "ajv": "^8.11.0", + "expo-dev-menu": "7.0.18", + "expo-manifests": "~1.0.10" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-dev-launcher/node_modules/ajv": { + "version": "8.17.1", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/expo-dev-launcher/node_modules/ajv/node_modules/json-schema-traverse": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/expo-dev-menu": { + "version": "7.0.18", + "license": "MIT", + "dependencies": { + "expo-dev-menu-interface": "2.0.0" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-dev-menu-interface": { + "version": "2.0.0", + "license": "MIT", + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-eas-client": { + "version": "1.0.8", + "license": "MIT" + }, + "node_modules/expo-file-system": { + "version": "19.0.20", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "react-native": "*" + } + }, + "node_modules/expo-font": { + "version": "14.0.10", + "license": "MIT", + "dependencies": { + "fontfaceobserver": "^2.1.0" + }, + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-haptics": { + "version": "15.0.8", + "license": "MIT", + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-image": { + "version": "3.0.11", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*", + "react-native-web": "*" + }, + "peerDependenciesMeta": { + "react-native-web": { + "optional": true + } + } + }, + "node_modules/expo-image-loader": { + "version": "6.0.0", + "license": "MIT", + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-image-manipulator": { + "version": "14.0.8", + "license": "MIT", + "dependencies": { + "expo-image-loader": "~6.0.0" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-image-picker": { + "version": "17.0.9", + "license": "MIT", + "dependencies": { + "expo-image-loader": "~6.0.0" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-json-utils": { + "version": "0.15.0", + "license": "MIT" + }, + "node_modules/expo-keep-awake": { + "version": "15.0.8", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "react": "*" + } + }, + "node_modules/expo-linear-gradient": { + "version": "15.0.8", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-linking": { + "version": "8.0.10", + "license": "MIT", + "dependencies": { + "expo-constants": "~18.0.11", + "invariant": "^2.2.4" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-manifests": { + "version": "1.0.10", + "license": "MIT", + "dependencies": { + "@expo/config": "~12.0.11", + "expo-json-utils": "~0.15.0" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-media-library": { + "version": "18.2.1", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "react-native": "*" + } + }, + "node_modules/expo-modules-autolinking": { + "version": "3.0.23", + "license": "MIT", + "dependencies": { + "@expo/spawn-async": "^1.7.2", + "chalk": "^4.1.0", + "commander": "^7.2.0", + "require-from-string": "^2.0.2", + "resolve-from": "^5.0.0" + }, + "bin": { + "expo-modules-autolinking": "bin/expo-modules-autolinking.js" + } + }, + "node_modules/expo-modules-autolinking/node_modules/commander": { + "version": "7.2.0", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/expo-modules-core": { + "version": "3.0.28", + "license": "MIT", + "dependencies": { + "invariant": "^2.2.4" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-network": { + "version": "8.0.8", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "react": "*" + } + }, + "node_modules/expo-router": { + "version": "6.0.17", + "license": "MIT", + "dependencies": { + "@expo/metro-runtime": "^6.1.2", + "@expo/schema-utils": "^0.1.8", + "@radix-ui/react-slot": "1.2.0", + "@radix-ui/react-tabs": "^1.1.12", + "@react-navigation/bottom-tabs": "^7.4.0", + "@react-navigation/native": "^7.1.8", + "@react-navigation/native-stack": "^7.3.16", + "client-only": "^0.0.1", + "debug": "^4.3.4", + "escape-string-regexp": "^4.0.0", + "expo-server": "^1.0.5", + "fast-deep-equal": "^3.1.3", + "invariant": "^2.2.4", + "nanoid": "^3.3.8", + "query-string": "^7.1.3", + "react-fast-compare": "^3.2.2", + "react-native-is-edge-to-edge": "^1.1.6", + "semver": "~7.6.3", + "server-only": "^0.0.1", + "sf-symbols-typescript": "^2.1.0", + "shallowequal": "^1.1.0", + "use-latest-callback": "^0.2.1", + "vaul": "^1.1.2" + }, + "peerDependencies": { + "@expo/metro-runtime": "^6.1.2", + "@react-navigation/drawer": "^7.5.0", + "@testing-library/react-native": ">= 12.0.0", + "expo": "*", + "expo-constants": "^18.0.11", + "expo-linking": "^8.0.10", + "react": "*", + "react-dom": "*", + "react-native": "*", + "react-native-gesture-handler": "*", + "react-native-reanimated": "*", + "react-native-safe-area-context": ">= 5.4.0", + "react-native-screens": "*", + "react-native-web": "*", + "react-server-dom-webpack": "~19.0.1 || ~19.1.2 || ~19.2.1" + }, + "peerDependenciesMeta": { + "@react-navigation/drawer": { + "optional": true + }, + "@testing-library/react-native": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native-gesture-handler": { + "optional": true + }, + "react-native-reanimated": { + "optional": true + }, + "react-native-web": { + "optional": true + }, + "react-server-dom-webpack": { + "optional": true + } + } + }, + "node_modules/expo-router/node_modules/semver": { + "version": "7.6.3", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/expo-secure-store": { + "version": "15.0.8", + "license": "MIT", + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-server": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">=20.16.0" + } + }, + "node_modules/expo-splash-screen": { + "version": "31.0.12", + "license": "MIT", + "dependencies": { + "@expo/prebuild-config": "^54.0.7" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-status-bar": { + "version": "3.0.9", + "license": "MIT", + "dependencies": { + "react-native-is-edge-to-edge": "^1.2.1" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-structured-headers": { + "version": "5.0.0", + "license": "MIT" + }, + "node_modules/expo-symbols": { + "version": "1.0.8", + "license": "MIT", + "dependencies": { + "sf-symbols-typescript": "^2.0.0" + }, + "peerDependencies": { + "expo": "*", + "react-native": "*" + } + }, + "node_modules/expo-system-ui": { + "version": "6.0.9", + "license": "MIT", + "dependencies": { + "@react-native/normalize-colors": "0.81.5", + "debug": "^4.3.2" + }, + "peerDependencies": { + "expo": "*", + "react-native": "*", + "react-native-web": "*" + }, + "peerDependenciesMeta": { + "react-native-web": { + "optional": true + } + } + }, + "node_modules/expo-updates": { + "version": "29.0.14", + "license": "MIT", + "dependencies": { + "@expo/code-signing-certificates": "0.0.5", + "@expo/plist": "^0.4.7", + "@expo/spawn-async": "^1.7.2", + "arg": "4.1.0", + "chalk": "^4.1.2", + "debug": "^4.3.4", + "expo-eas-client": "~1.0.7", + "expo-manifests": "~1.0.9", + "expo-structured-headers": "~5.0.0", + "expo-updates-interface": "~2.0.0", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "ignore": "^5.3.1", + "resolve-from": "^5.0.0" + }, + "bin": { + "expo-updates": "bin/cli.js" + }, + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-updates-interface": { + "version": "2.0.0", + "license": "MIT", + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-updates/node_modules/arg": { + "version": "4.1.0", + "license": "MIT" + }, + "node_modules/expo-updates/node_modules/glob": { + "version": "13.0.0", + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "path-scurry": "^2.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/expo-updates/node_modules/glob/node_modules/minimatch": { + "version": "10.1.1", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/expo-updates/node_modules/glob/node_modules/minipass": { + "version": "7.1.2", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/expo-updates/node_modules/glob/node_modules/path-scurry": { + "version": "2.0.1", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/expo-updates/node_modules/glob/node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.2.4", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/expo-updates/node_modules/ignore": { + "version": "5.3.2", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/expo-video": { + "version": "3.0.15", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-web-browser": { + "version": "15.0.10", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "react-native": "*" + } + }, + "node_modules/expo/node_modules/pretty-format": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/expo/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/expo/node_modules/pretty-format/node_modules/react-is": { + "version": "18.3.1", + "license": "MIT" + }, + "node_modules/exponential-backoff": { + "version": "3.1.3", + "license": "Apache-2.0" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastq": { + "version": "1.19.1", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fbjs": { + "version": "3.0.5", + "license": "MIT", + "dependencies": { + "cross-fetch": "^3.1.5", + "fbjs-css-vars": "^1.0.0", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^1.0.35" + } + }, + "node_modules/fbjs-css-vars": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/fbjs/node_modules/promise": { + "version": "7.3.1", + "license": "MIT", + "dependencies": { + "asap": "~2.0.3" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/filter-obj": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/finalhandler/node_modules/encodeurl": { + "version": "1.0.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/on-finished": { + "version": "2.3.0", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/statuses": { + "version": "1.5.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/find-babel-config": { + "version": "2.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "json5": "^2.2.3" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up-simple": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "dev": true, + "license": "ISC" + }, + "node_modules/flow-enums-runtime": { + "version": "0.0.6", + "license": "MIT" + }, + "node_modules/fontfaceobserver": { + "version": "2.3.0", + "license": "BSD-2-Clause" + }, + "node_modules/for-each": { + "version": "0.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/freeport-async": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-readdir-recursive": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.13.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/getenv": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/global-dirs": { + "version": "0.1.1", + "license": "MIT", + "dependencies": { + "ini": "^1.3.4" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/globals": { + "version": "16.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hermes-estree": { + "version": "0.20.1", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.20.1", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.20.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "license": "MIT" + }, + "node_modules/hosted-git-info": { + "version": "7.0.2", + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "10.4.3", + "license": "ISC" + }, + "node_modules/html-parse-stringify": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "void-elements": "3.1.0" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/hyphenate-style-name": { + "version": "1.1.0", + "license": "BSD-3-Clause" + }, + "node_modules/i18next": { + "version": "23.16.8", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "7.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "queue": "6.0.2" + }, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "license": "ISC" + }, + "node_modules/inline-style-prefixer": { + "version": "7.0.1", + "license": "MIT", + "dependencies": { + "css-in-js-utils": "^3.1.0" + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/irregular-plurals": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-builtin-module": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "builtin-modules": "^5.0.0" + }, + "engines": { + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-bun-module": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, + "node_modules/is-bun-module/node_modules/semver": { + "version": "7.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jest-diff": { + "version": "22.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^2.0.1", + "diff": "^3.2.0", + "jest-get-type": "^22.4.3", + "pretty-format": "^22.4.3" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-diff/node_modules/chalk/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-diff/node_modules/chalk/node_modules/ansi-styles/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/jest-diff/node_modules/chalk/node_modules/ansi-styles/node_modules/color-convert/node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-diff/node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/jest-diff/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-diff/node_modules/chalk/node_modules/supports-color/node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "22.4.3", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/pretty-format": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/pretty-format/node_modules/react-is": { + "version": "18.3.1", + "license": "MIT" + }, + "node_modules/jest-message-util/node_modules/slash": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/node_modules/ci-info": { + "version": "3.9.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util/node_modules/picomatch": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/jest-get-type": { + "version": "29.6.3", + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/pretty-format": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/pretty-format/node_modules/react-is": { + "version": "18.3.1", + "license": "MIT" + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jimp-compact": { + "version": "0.16.1", + "license": "MIT" + }, + "node_modules/jiti": { + "version": "1.21.7", + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/jose": { + "version": "6.1.3", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsc-safe-url": { + "version": "0.2.4", + "license": "0BSD" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/kysely": { + "version": "0.28.8", + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/lan-network": { + "version": "0.1.7", + "license": "MIT", + "bin": { + "lan-network": "dist/lan-network-cli.js" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lighthouse-logger": { + "version": "1.4.2", + "license": "Apache-2.0", + "dependencies": { + "debug": "^2.6.9", + "marky": "^1.2.2" + } + }, + "node_modules/lighthouse-logger/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/lighthouse-logger/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/lightningcss": { + "version": "1.30.2", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.30.2", + "lightningcss-darwin-arm64": "1.30.2", + "lightningcss-darwin-x64": "1.30.2", + "lightningcss-freebsd-x64": "1.30.2", + "lightningcss-linux-arm-gnueabihf": "1.30.2", + "lightningcss-linux-arm64-gnu": "1.30.2", + "lightningcss-linux-arm64-musl": "1.30.2", + "lightningcss-linux-x64-gnu": "1.30.2", + "lightningcss-linux-x64-musl": "1.30.2", + "lightningcss-win32-arm64-msvc": "1.30.2", + "lightningcss-win32-x64-msvc": "1.30.2" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.2", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.throttle": { + "version": "4.1.1", + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "2.2.0", + "license": "MIT", + "dependencies": { + "chalk": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "2.4.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/chalk/node_modules/ansi-styles": { + "version": "3.2.1", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/chalk/node_modules/ansi-styles/node_modules/color-convert": { + "version": "1.9.3", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/log-symbols/node_modules/chalk/node_modules/ansi-styles/node_modules/color-convert/node_modules/color-name": { + "version": "1.1.3", + "license": "MIT" + }, + "node_modules/log-symbols/node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/log-symbols/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/chalk/node_modules/supports-color/node_modules/has-flag": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/marky": { + "version": "1.3.0", + "license": "Apache-2.0" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdn-data": { + "version": "2.0.14", + "license": "CC0-1.0" + }, + "node_modules/memoize-one": { + "version": "5.2.1", + "license": "MIT" + }, + "node_modules/merge-options": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/metro": { + "version": "0.83.2", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/core": "^7.25.2", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.3", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.3", + "@babel/types": "^7.25.2", + "accepts": "^1.3.7", + "chalk": "^4.0.0", + "ci-info": "^2.0.0", + "connect": "^3.6.5", + "debug": "^4.4.0", + "error-stack-parser": "^2.0.6", + "flow-enums-runtime": "^0.0.6", + "graceful-fs": "^4.2.4", + "hermes-parser": "0.32.0", + "image-size": "^1.0.2", + "invariant": "^2.2.4", + "jest-worker": "^29.7.0", + "jsc-safe-url": "^0.2.2", + "lodash.throttle": "^4.1.1", + "metro-babel-transformer": "0.83.2", + "metro-cache": "0.83.2", + "metro-cache-key": "0.83.2", + "metro-config": "0.83.2", + "metro-core": "0.83.2", + "metro-file-map": "0.83.2", + "metro-resolver": "0.83.2", + "metro-runtime": "0.83.2", + "metro-source-map": "0.83.2", + "metro-symbolicate": "0.83.2", + "metro-transform-plugins": "0.83.2", + "metro-transform-worker": "0.83.2", + "mime-types": "^2.1.27", + "nullthrows": "^1.1.1", + "serialize-error": "^2.1.0", + "source-map": "^0.5.6", + "throat": "^5.0.0", + "ws": "^7.5.10", + "yargs": "^17.6.2" + }, + "bin": { + "metro": "src/cli.js" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-babel-transformer": { + "version": "0.83.2", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.2", + "flow-enums-runtime": "^0.0.6", + "hermes-parser": "0.32.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-babel-transformer/node_modules/hermes-parser": { + "version": "0.32.0", + "license": "MIT", + "dependencies": { + "hermes-estree": "0.32.0" + } + }, + "node_modules/metro-babel-transformer/node_modules/hermes-parser/node_modules/hermes-estree": { + "version": "0.32.0", + "license": "MIT" + }, + "node_modules/metro-cache": { + "version": "0.83.2", + "license": "MIT", + "dependencies": { + "exponential-backoff": "^3.1.1", + "flow-enums-runtime": "^0.0.6", + "https-proxy-agent": "^7.0.5", + "metro-core": "0.83.2" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-cache-key": { + "version": "0.83.2", + "license": "MIT", + "dependencies": { + "flow-enums-runtime": "^0.0.6" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-config": { + "version": "0.83.2", + "license": "MIT", + "dependencies": { + "connect": "^3.6.5", + "flow-enums-runtime": "^0.0.6", + "jest-validate": "^29.7.0", + "metro": "0.83.2", + "metro-cache": "0.83.2", + "metro-core": "0.83.2", + "metro-runtime": "0.83.2", + "yaml": "^2.6.1" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-core": { + "version": "0.83.2", + "license": "MIT", + "dependencies": { + "flow-enums-runtime": "^0.0.6", + "lodash.throttle": "^4.1.1", + "metro-resolver": "0.83.2" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-file-map": { + "version": "0.83.2", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "fb-watchman": "^2.0.0", + "flow-enums-runtime": "^0.0.6", + "graceful-fs": "^4.2.4", + "invariant": "^2.2.4", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "nullthrows": "^1.1.1", + "walker": "^1.0.7" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-minify-terser": { + "version": "0.82.5", + "license": "MIT", + "dependencies": { + "flow-enums-runtime": "^0.0.6", + "terser": "^5.15.0" + }, + "engines": { + "node": ">=18.18" + } + }, + "node_modules/metro-resolver": { + "version": "0.83.2", + "license": "MIT", + "dependencies": { + "flow-enums-runtime": "^0.0.6" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-runtime": { + "version": "0.83.2", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.0", + "flow-enums-runtime": "^0.0.6" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-source-map": { + "version": "0.83.2", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.3", + "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", + "@babel/types": "^7.25.2", + "flow-enums-runtime": "^0.0.6", + "invariant": "^2.2.4", + "metro-symbolicate": "0.83.2", + "nullthrows": "^1.1.1", + "ob1": "0.83.2", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-symbolicate": { + "version": "0.83.2", + "license": "MIT", + "dependencies": { + "flow-enums-runtime": "^0.0.6", + "invariant": "^2.2.4", + "metro-source-map": "0.83.2", + "nullthrows": "^1.1.1", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + }, + "bin": { + "metro-symbolicate": "src/index.js" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-transform-plugins": { + "version": "0.83.2", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.2", + "@babel/generator": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.3", + "flow-enums-runtime": "^0.0.6", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-transform-worker": { + "version": "0.83.2", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.2", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.3", + "@babel/types": "^7.25.2", + "flow-enums-runtime": "^0.0.6", + "metro": "0.83.2", + "metro-babel-transformer": "0.83.2", + "metro-cache": "0.83.2", + "metro-cache-key": "0.83.2", + "metro-minify-terser": "0.83.2", + "metro-source-map": "0.83.2", + "metro-transform-plugins": "0.83.2", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-transform-worker/node_modules/metro-minify-terser": { + "version": "0.83.2", + "license": "MIT", + "dependencies": { + "flow-enums-runtime": "^0.0.6", + "terser": "^5.15.0" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro/node_modules/ci-info": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/metro/node_modules/hermes-parser": { + "version": "0.32.0", + "license": "MIT", + "dependencies": { + "hermes-estree": "0.32.0" + } + }, + "node_modules/metro/node_modules/hermes-parser/node_modules/hermes-estree": { + "version": "0.32.0", + "license": "MIT" + }, + "node_modules/metro/node_modules/ws": { + "version": "7.5.10", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "4.2.8", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "7.1.2", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/mz": { + "version": "2.7.0", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanostores": { + "version": "1.1.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "engines": { + "node": "^20.0.0 || >=22.0.0" + } + }, + "node_modules/napi-postinstall": { + "version": "0.3.4", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "node_modules/nativewind": { + "version": "4.2.1", + "license": "MIT", + "dependencies": { + "comment-json": "^4.2.5", + "debug": "^4.3.7", + "react-native-css-interop": "0.2.1" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "tailwindcss": ">3.3.0" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nested-error-stacks": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-forge": { + "version": "1.3.3", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.27", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-package-arg": { + "version": "11.0.3", + "license": "ISC", + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg/node_modules/semver": { + "version": "7.7.2", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nullthrows": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/ob1": { + "version": "0.83.2", + "license": "MIT", + "dependencies": { + "flow-enums-runtime": "^0.0.6" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/open": { + "version": "7.4.2", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "3.4.0", + "license": "MIT", + "dependencies": { + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-spinners": "^2.0.0", + "log-symbols": "^2.2.0", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "2.4.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/chalk/node_modules/ansi-styles": { + "version": "3.2.1", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/chalk/node_modules/ansi-styles/node_modules/color-convert": { + "version": "1.9.3", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/ora/node_modules/chalk/node_modules/ansi-styles/node_modules/color-convert/node_modules/color-name": { + "version": "1.1.3", + "license": "MIT" + }, + "node_modules/ora/node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ora/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/chalk/node_modules/supports-color/node_modules/has-flag": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-png": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "pngjs": "^3.3.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "dev": true, + "license": "ISC" + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "7.1.2", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-up": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/find-up/node_modules/locate-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/find-up/node_modules/locate-path/node_modules/p-locate": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/find-up/node_modules/locate-path/node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up/node_modules/find-up/node_modules/locate-path/node_modules/path-exists": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/plist": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/plur": { + "version": "2.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "irregular-plurals": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pluralize": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/pngjs": { + "version": "3.4.0", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.1.0", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.1.3", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.7.4", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/prettier-plugin-tailwindcss": { + "version": "0.6.14", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.21.3" + }, + "peerDependencies": { + "@ianvs/prettier-plugin-sort-imports": "*", + "@prettier/plugin-hermes": "*", + "@prettier/plugin-oxc": "*", + "@prettier/plugin-pug": "*", + "@shopify/prettier-plugin-liquid": "*", + "@trivago/prettier-plugin-sort-imports": "*", + "@zackad/prettier-plugin-twig": "*", + "prettier": "^3.0", + "prettier-plugin-astro": "*", + "prettier-plugin-css-order": "*", + "prettier-plugin-import-sort": "*", + "prettier-plugin-jsdoc": "*", + "prettier-plugin-marko": "*", + "prettier-plugin-multiline-arrays": "*", + "prettier-plugin-organize-attributes": "*", + "prettier-plugin-organize-imports": "*", + "prettier-plugin-sort-imports": "*", + "prettier-plugin-style-order": "*", + "prettier-plugin-svelte": "*" + }, + "peerDependenciesMeta": { + "@ianvs/prettier-plugin-sort-imports": { + "optional": true + }, + "@prettier/plugin-hermes": { + "optional": true + }, + "@prettier/plugin-oxc": { + "optional": true + }, + "@prettier/plugin-pug": { + "optional": true + }, + "@shopify/prettier-plugin-liquid": { + "optional": true + }, + "@trivago/prettier-plugin-sort-imports": { + "optional": true + }, + "@zackad/prettier-plugin-twig": { + "optional": true + }, + "prettier-plugin-astro": { + "optional": true + }, + "prettier-plugin-css-order": { + "optional": true + }, + "prettier-plugin-import-sort": { + "optional": true + }, + "prettier-plugin-jsdoc": { + "optional": true + }, + "prettier-plugin-marko": { + "optional": true + }, + "prettier-plugin-multiline-arrays": { + "optional": true + }, + "prettier-plugin-organize-attributes": { + "optional": true + }, + "prettier-plugin-organize-imports": { + "optional": true + }, + "prettier-plugin-sort-imports": { + "optional": true + }, + "prettier-plugin-style-order": { + "optional": true + }, + "prettier-plugin-svelte": { + "optional": true + } + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-format": { + "version": "22.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-regex": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles/node_modules/color-convert/node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/proc-log": { + "version": "4.2.0", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise": { + "version": "8.3.0", + "license": "MIT", + "dependencies": { + "asap": "~2.0.6" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pvtsutils": { + "version": "1.3.6", + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/pvutils": { + "version": "1.1.5", + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/qrcode-terminal": { + "version": "0.11.0", + "bin": { + "qrcode-terminal": "bin/qrcode-terminal.js" + } + }, + "node_modules/query-string": { + "version": "7.1.3", + "license": "MIT", + "dependencies": { + "decode-uri-component": "^0.2.2", + "filter-obj": "^1.1.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/queue": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "inherits": "~2.0.3" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/range-parser": { + "version": "1.2.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "19.1.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-devtools-core": { + "version": "6.1.5", + "license": "MIT", + "dependencies": { + "shell-quote": "^1.6.1", + "ws": "^7" + } + }, + "node_modules/react-devtools-core/node_modules/ws": { + "version": "7.5.10", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/react-dom": { + "version": "19.1.0", + "license": "MIT", + "dependencies": { + "scheduler": "^0.26.0" + }, + "peerDependencies": { + "react": "^19.1.0" + } + }, + "node_modules/react-fast-compare": { + "version": "3.2.2", + "license": "MIT" + }, + "node_modules/react-freeze": { + "version": "1.0.4", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": ">=17.0.0" + } + }, + "node_modules/react-i18next": { + "version": "15.7.4", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.27.6", + "html-parse-stringify": "^3.0.1" + }, + "peerDependencies": { + "i18next": ">= 23.4.0", + "react": ">= 16.8.0", + "typescript": "^5" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/react-is": { + "version": "19.2.1", + "license": "MIT" + }, + "node_modules/react-native": { + "version": "0.81.5", + "license": "MIT", + "dependencies": { + "@jest/create-cache-key-function": "^29.7.0", + "@react-native/assets-registry": "0.81.5", + "@react-native/codegen": "0.81.5", + "@react-native/community-cli-plugin": "0.81.5", + "@react-native/gradle-plugin": "0.81.5", + "@react-native/js-polyfills": "0.81.5", + "@react-native/normalize-colors": "0.81.5", + "@react-native/virtualized-lists": "0.81.5", + "abort-controller": "^3.0.0", + "anser": "^1.4.9", + "ansi-regex": "^5.0.0", + "babel-jest": "^29.7.0", + "babel-plugin-syntax-hermes-parser": "0.29.1", + "base64-js": "^1.5.1", + "commander": "^12.0.0", + "flow-enums-runtime": "^0.0.6", + "glob": "^7.1.1", + "invariant": "^2.2.4", + "jest-environment-node": "^29.7.0", + "memoize-one": "^5.0.0", + "metro-runtime": "^0.83.1", + "metro-source-map": "^0.83.1", + "nullthrows": "^1.1.1", + "pretty-format": "^29.7.0", + "promise": "^8.3.0", + "react-devtools-core": "^6.1.5", + "react-refresh": "^0.14.0", + "regenerator-runtime": "^0.13.2", + "scheduler": "0.26.0", + "semver": "^7.1.3", + "stacktrace-parser": "^0.1.10", + "whatwg-fetch": "^3.0.0", + "ws": "^6.2.3", + "yargs": "^17.6.2" + }, + "bin": { + "react-native": "cli.js" + }, + "engines": { + "node": ">= 20.19.4" + }, + "peerDependencies": { + "@types/react": "^19.1.0", + "react": "^19.1.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-native-ble-plx": { + "version": "3.5.0", + "license": "MIT", + "engines": { + "node": ">= 18.0.0" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-css-interop": { + "version": "0.2.1", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.22.15", + "@babel/traverse": "^7.23.0", + "@babel/types": "^7.23.0", + "debug": "^4.3.7", + "lightningcss": "~1.27.0", + "semver": "^7.6.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": ">=18", + "react-native": "*", + "react-native-reanimated": ">=3.6.2", + "tailwindcss": "~3" + }, + "peerDependenciesMeta": { + "react-native-safe-area-context": { + "optional": true + }, + "react-native-svg": { + "optional": true + } + } + }, + "node_modules/react-native-css-interop/node_modules/lightningcss": { + "version": "1.27.0", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^1.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.27.0", + "lightningcss-darwin-x64": "1.27.0", + "lightningcss-freebsd-x64": "1.27.0", + "lightningcss-linux-arm-gnueabihf": "1.27.0", + "lightningcss-linux-arm64-gnu": "1.27.0", + "lightningcss-linux-arm64-musl": "1.27.0", + "lightningcss-linux-x64-gnu": "1.27.0", + "lightningcss-linux-x64-musl": "1.27.0", + "lightningcss-win32-arm64-msvc": "1.27.0", + "lightningcss-win32-x64-msvc": "1.27.0" + } + }, + "node_modules/react-native-css-interop/node_modules/lightningcss/node_modules/detect-libc": { + "version": "1.0.3", + "license": "Apache-2.0", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/react-native-css-interop/node_modules/lightningcss/node_modules/lightningcss-win32-x64-msvc": { + "version": "1.27.0", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/react-native-css-interop/node_modules/semver": { + "version": "7.7.2", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/react-native-gesture-handler": { + "version": "2.28.0", + "license": "MIT", + "dependencies": { + "@egjs/hammerjs": "^2.0.17", + "hoist-non-react-statics": "^3.3.0", + "invariant": "^2.2.4" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-is-edge-to-edge": { + "version": "1.2.1", + "license": "MIT", + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-keyboard-controller": { + "version": "1.20.1", + "license": "MIT", + "dependencies": { + "react-native-is-edge-to-edge": "^1.2.1" + }, + "peerDependencies": { + "react": "*", + "react-native": "*", + "react-native-reanimated": ">=3.0.0" + } + }, + "node_modules/react-native-multi-ble-peripheral": { + "version": "0.1.8", + "license": "MIT", + "dependencies": { + "eventemitter3": "^5.0.0" + }, + "engines": { + "node": ">= 16.0.0" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-reanimated": { + "version": "4.1.6", + "license": "MIT", + "dependencies": { + "react-native-is-edge-to-edge": "^1.2.1", + "semver": "7.7.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0", + "react": "*", + "react-native": "*", + "react-native-worklets": ">=0.5.0" + } + }, + "node_modules/react-native-reanimated-carousel": { + "version": "4.0.3", + "license": "MIT", + "peerDependencies": { + "react": ">=18.0.0", + "react-native": ">=0.70.3", + "react-native-gesture-handler": ">=2.9.0", + "react-native-reanimated": ">=3.0.0" + } + }, + "node_modules/react-native-reanimated/node_modules/semver": { + "version": "7.7.2", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/react-native-safe-area-context": { + "version": "5.6.2", + "license": "MIT", + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-screens": { + "version": "4.16.0", + "license": "MIT", + "dependencies": { + "react-freeze": "^1.0.0", + "react-native-is-edge-to-edge": "^1.2.1", + "warn-once": "^0.1.0" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-svg": { + "version": "15.15.1", + "license": "MIT", + "dependencies": { + "css-select": "^5.1.0", + "css-tree": "^1.1.3", + "warn-once": "0.1.1" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-web": { + "version": "0.21.2", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.6", + "@react-native/normalize-colors": "^0.74.1", + "fbjs": "^3.0.4", + "inline-style-prefixer": "^7.0.1", + "memoize-one": "^6.0.0", + "nullthrows": "^1.1.1", + "postcss-value-parser": "^4.2.0", + "styleq": "^0.1.3" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-native-web/node_modules/@react-native/normalize-colors": { + "version": "0.74.89", + "license": "MIT" + }, + "node_modules/react-native-web/node_modules/memoize-one": { + "version": "6.0.0", + "license": "MIT" + }, + "node_modules/react-native-worklets": { + "version": "0.5.1", + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-arrow-functions": "^7.0.0-0", + "@babel/plugin-transform-class-properties": "^7.0.0-0", + "@babel/plugin-transform-classes": "^7.0.0-0", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.0.0-0", + "@babel/plugin-transform-optional-chaining": "^7.0.0-0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0-0", + "@babel/plugin-transform-template-literals": "^7.0.0-0", + "@babel/plugin-transform-unicode-regex": "^7.0.0-0", + "@babel/preset-typescript": "^7.16.7", + "convert-source-map": "^2.0.0", + "semver": "7.7.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0", + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-worklets/node_modules/semver": { + "version": "7.7.2", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/react-native/node_modules/@react-native/virtualized-lists": { + "version": "0.81.5", + "license": "MIT", + "dependencies": { + "invariant": "^2.2.4", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 20.19.4" + }, + "peerDependencies": { + "@types/react": "^19.1.0", + "react": "*", + "react-native": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-native/node_modules/commander": { + "version": "12.1.0", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/react-native/node_modules/pretty-format": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/react-native/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/react-native/node_modules/pretty-format/node_modules/react-is": { + "version": "18.3.1", + "license": "MIT" + }, + "node_modules/react-native/node_modules/semver": { + "version": "7.7.2", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/react-refresh": { + "version": "0.14.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.7.2", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/read-cache/node_modules/pify": { + "version": "2.3.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "license": "Apache-2.0" + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.2", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "license": "MIT" + }, + "node_modules/regexp-tree": { + "version": "0.1.27", + "dev": true, + "license": "MIT", + "bin": { + "regexp-tree": "bin/regexp-tree" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "6.4.0", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regexpu-core/node_modules/regjsparser": { + "version": "0.13.0", + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.12.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.0.2" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requireg": { + "version": "0.2.2", + "dependencies": { + "nested-error-stacks": "~2.0.1", + "rc": "~1.2.7", + "resolve": "~1.7.1" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/requireg/node_modules/resolve": { + "version": "1.7.1", + "license": "MIT", + "dependencies": { + "path-parse": "^1.0.5" + } + }, + "node_modules/reselect": { + "version": "4.1.8", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.11", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-global": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "global-dirs": "^0.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/resolve-workspace-root": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/restore-cursor": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rou3": { + "version": "0.5.1", + "license": "MIT" + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sax": { + "version": "1.4.3", + "license": "BlueOak-1.0.0" + }, + "node_modules/scheduler": { + "version": "0.26.0", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.19.1", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/serialize-error": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-static/node_modules/send": { + "version": "0.19.0", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-static/node_modules/send/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-static/node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/serve-static/node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/server-only": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "license": "MIT" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "license": "ISC" + }, + "node_modules/sf-symbols-typescript": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "license": "ISC" + }, + "node_modules/simple-plist": { + "version": "1.3.1", + "license": "MIT", + "dependencies": { + "bplist-creator": "0.1.0", + "bplist-parser": "0.3.1", + "plist": "^3.0.5" + } + }, + "node_modules/simple-plist/node_modules/bplist-parser": { + "version": "0.3.1", + "license": "MIT", + "dependencies": { + "big-integer": "1.6.x" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.4", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.4", + "license": "MIT" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/slash": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/slugify": { + "version": "1.6.6", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-on-first": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "license": "BSD-3-Clause" + }, + "node_modules/stable-hash": { + "version": "0.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/stable-hash-x": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stackframe": { + "version": "1.3.4", + "license": "MIT" + }, + "node_modules/stacktrace-parser": { + "version": "0.1.11", + "license": "MIT", + "dependencies": { + "type-fest": "^0.7.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/stream-buffers": { + "version": "2.2.0", + "license": "Unlicense", + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/strict-uri-encode": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "5.2.0", + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "4.1.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-indent": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/structured-headers": { + "version": "0.4.1", + "license": "MIT" + }, + "node_modules/styleq": { + "version": "0.1.3", + "license": "MIT" + }, + "node_modules/sucrase": { + "version": "3.35.1", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/synckit": { + "version": "0.11.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.2.9" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" + } + }, + "node_modules/tailwind-merge": { + "version": "2.6.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwind-variants": { + "version": "0.2.1", + "license": "MIT", + "dependencies": { + "tailwind-merge": "^2.2.0" + }, + "engines": { + "node": ">=16.x", + "pnpm": ">=7.x" + }, + "peerDependencies": { + "tailwindcss": "*" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.4", + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.0", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tar": { + "version": "7.5.2", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "7.1.2", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/temp-dir": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "5.44.1", + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "license": "MIT" + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/throat": { + "version": "5.0.0", + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "license": "BSD-3-Clause" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "license": "MIT" + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "license": "Apache-2.0" + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "license": "0BSD" + }, + "node_modules/tsyringe": { + "version": "4.10.0", + "license": "MIT", + "dependencies": { + "tslib": "^1.9.3" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/tsyringe/node_modules/tslib": { + "version": "1.14.1", + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.7.1", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ua-parser-js": { + "version": "1.0.41", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "license": "MIT", + "bin": { + "ua-parser-js": "script/cli.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/uncrypto": { + "version": "0.1.3", + "license": "MIT" + }, + "node_modules/undici": { + "version": "6.22.0", + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.2", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-latest-callback": { + "version": "0.2.6", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "7.0.3", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/validate-npm-package-name": { + "version": "5.0.1", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vaul": { + "version": "1.1.2", + "license": "MIT", + "dependencies": { + "@radix-ui/react-dialog": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" + } + }, + "node_modules/vlq": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/void-elements": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/warn-once": { + "version": "0.1.1", + "license": "MIT" + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webidl-conversions": { + "version": "5.0.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/whatwg-fetch": { + "version": "3.6.20", + "license": "MIT" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/whatwg-url-without-unicode": { + "version": "8.0.0-3", + "license": "MIT", + "dependencies": { + "buffer": "^5.4.3", + "punycode": "^2.1.1", + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/whatwg-url-without-unicode/node_modules/buffer": { + "version": "5.7.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/whatwg-url/node_modules/webidl-conversions": { + "version": "3.0.1", + "license": "BSD-2-Clause" + }, + "node_modules/which": { + "version": "2.0.2", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wonka": { + "version": "6.3.5", + "license": "MIT" + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/ws": { + "version": "6.2.3", + "license": "MIT", + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/xcode": { + "version": "3.0.1", + "license": "Apache-2.0", + "dependencies": { + "simple-plist": "^1.1.0", + "uuid": "^7.0.3" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/xml2js": { + "version": "0.6.0", + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xml2js/node_modules/xmlbuilder": { + "version": "11.0.1", + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "license": "MIT", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.8.2", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "3.5.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.24.4" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..9aebf21 --- /dev/null +++ b/package.json @@ -0,0 +1,106 @@ +{ + "name": "popcore", + "main": "expo-router/entry", + "version": "1.0.0", + "scripts": { + "start": "expo start", + "build:android:dev": "eas build --platform android --profile development", + "build:android:preview": "eas build --platform android --profile preview", + "prebuild:android": "expo prebuild --platform android", + "reset-project": "node ./scripts/reset-project.js", + "claude": "claude --dangerously-skip-permissions", + "android": "expo run:android", + "ios": "expo run:ios", + "web": "expo start --web", + "lint": "expo lint" + }, + "dependencies": { + "@better-auth/expo": "1.3.34", + "@expo/vector-icons": "^15.0.3", + "@gorhom/bottom-sheet": "^5.2.8", + "@react-native-async-storage/async-storage": "^2.2.0", + "@react-native-masked-view/masked-view": "0.3.2", + "@react-navigation/bottom-tabs": "^7.4.0", + "@react-navigation/elements": "^2.6.3", + "@react-navigation/native": "^7.1.8", + "@stripe/react-stripe-js": "^5.4.1", + "@stripe/stripe-js": "^8.5.3", + "@stripe/stripe-react-native": "^0.57.0", + "better-auth": "1.3.34", + "buffer": "^6.0.3", + "class-variance-authority": "^0.7.1", + "expo": "~54.0.25", + "expo-blur": "^15.0.8", + "expo-constants": "^18.0.11", + "expo-crypto": "~15.0.7", + "expo-dev-client": "~6.0.18", + "expo-font": "~14.0.9", + "expo-haptics": "~15.0.7", + "expo-image": "~3.0.10", + "expo-image-manipulator": "^14.0.8", + "expo-image-picker": "~17.0.8", + "expo-linear-gradient": "^15.0.8", + "expo-linking": "^8.0.10", + "expo-media-library": "~18.2.0", + "expo-network": "^8.0.8", + "expo-router": "~6.0.15", + "expo-secure-store": "^15.0.8", + "expo-splash-screen": "~31.0.11", + "expo-status-bar": "~3.0.8", + "expo-symbols": "~1.0.7", + "expo-system-ui": "~6.0.8", + "expo-updates": "^29.0.14", + "expo-video": "^3.0.15", + "expo-web-browser": "^15.0.10", + "i18next": "^23.14.0", + "metro-minify-terser": "^0.82.4", + "nativewind": "^4.1.21", + "react": "19.1.0", + "react-dom": "19.1.0", + "react-i18next": "^15.0.1", + "react-native": "0.81.5", + "react-native-ble-plx": "^3.5.0", + "react-native-gesture-handler": "~2.28.0", + "react-native-keyboard-controller": "^1.20.1", + "react-native-multi-ble-peripheral": "^0.1.8", + "react-native-reanimated": "~4.1.1", + "react-native-reanimated-carousel": "^4.0.3", + "react-native-safe-area-context": "~5.6.0", + "react-native-screens": "~4.16.0", + "react-native-svg": "^15.15.1", + "react-native-web": "~0.21.0", + "react-native-worklets": "0.5.1", + "tailwind-variants": "^0.2.1" + }, + "overrides": { + "jsc-safe-url": "0.2.4" + }, + "devDependencies": { + "@babel/cli": "^7.28.3", + "@babel/core": "^7.28.5", + "@babel/preset-env": "^7.28.5", + "@types/react": "^19.2.1", + "@types/react-native": "^0.72.8", + "@typescript-eslint/eslint-plugin": "^8.33.0", + "@typescript-eslint/parser": "^8.33.0", + "babel-plugin-module-resolver": "^5.0.2", + "eslint": "^9.25.0", + "eslint-config-expo": "~10.0.0", + "eslint-config-prettier": "^10.1.5", + "eslint-import-resolver-typescript": "^4.4.2", + "eslint-plugin-i18n-json": "^4.0.1", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-prettier": "^5.4.1", + "eslint-plugin-react-compiler": "19.0.0-beta-a7bf2bd-20241110", + "eslint-plugin-react-native": "^5.0.0", + "eslint-plugin-simple-import-sort": "^12.1.1", + "eslint-plugin-tailwindcss": "^3.18.0", + "eslint-plugin-unicorn": "^59.0.1", + "eslint-plugin-unused-imports": "^4.1.4", + "prettier": "^3.3.3", + "prettier-plugin-tailwindcss": "^0.6.12", + "tailwindcss": "3.4.4", + "typescript": "~5.9.2" + }, + "private": true +} diff --git a/scripts/reset-project.js b/scripts/reset-project.js new file mode 100644 index 0000000..51dff15 --- /dev/null +++ b/scripts/reset-project.js @@ -0,0 +1,112 @@ +#!/usr/bin/env node + +/** + * This script is used to reset the project to a blank state. + * It deletes or moves the /app, /components, /hooks, /scripts, and /constants directories to /app-example based on user input and creates a new /app directory with an index.tsx and _layout.tsx file. + * You can remove the `reset-project` script from package.json and safely delete this file after running it. + */ + +const fs = require("fs"); +const path = require("path"); +const readline = require("readline"); + +const root = process.cwd(); +const oldDirs = ["app", "components", "hooks", "constants", "scripts"]; +const exampleDir = "app-example"; +const newAppDir = "app"; +const exampleDirPath = path.join(root, exampleDir); + +const indexContent = `import { Text, View } from "react-native"; + +export default function Index() { + return ( + + Edit app/index.tsx to edit this screen. + + ); +} +`; + +const layoutContent = `import { Stack } from "expo-router"; + +export default function RootLayout() { + return ; +} +`; + +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, +}); + +const moveDirectories = async (userInput) => { + try { + if (userInput === "y") { + // Create the app-example directory + await fs.promises.mkdir(exampleDirPath, { recursive: true }); + console.log(`📁 /${exampleDir} directory created.`); + } + + // Move old directories to new app-example directory or delete them + for (const dir of oldDirs) { + const oldDirPath = path.join(root, dir); + if (fs.existsSync(oldDirPath)) { + if (userInput === "y") { + const newDirPath = path.join(root, exampleDir, dir); + await fs.promises.rename(oldDirPath, newDirPath); + console.log(`➡️ /${dir} moved to /${exampleDir}/${dir}.`); + } else { + await fs.promises.rm(oldDirPath, { recursive: true, force: true }); + console.log(`❌ /${dir} deleted.`); + } + } else { + console.log(`➡️ /${dir} does not exist, skipping.`); + } + } + + // Create new /app directory + const newAppDirPath = path.join(root, newAppDir); + await fs.promises.mkdir(newAppDirPath, { recursive: true }); + console.log("\n📁 New /app directory created."); + + // Create index.tsx + const indexPath = path.join(newAppDirPath, "index.tsx"); + await fs.promises.writeFile(indexPath, indexContent); + console.log("📄 app/index.tsx created."); + + // Create _layout.tsx + const layoutPath = path.join(newAppDirPath, "_layout.tsx"); + await fs.promises.writeFile(layoutPath, layoutContent); + console.log("📄 app/_layout.tsx created."); + + console.log("\n✅ Project reset complete. Next steps:"); + console.log( + `1. Run \`npx expo start\` to start a development server.\n2. Edit app/index.tsx to edit the main screen.${ + userInput === "y" + ? `\n3. Delete the /${exampleDir} directory when you're done referencing it.` + : "" + }` + ); + } catch (error) { + console.error(`❌ Error during script execution: ${error.message}`); + } +}; + +rl.question( + "Do you want to move existing files to /app-example instead of deleting them? (Y/n): ", + (answer) => { + const userInput = answer.trim().toLowerCase() || "y"; + if (userInput === "y" || userInput === "n") { + moveDirectories(userInput).finally(() => rl.close()); + } else { + console.log("❌ Invalid input. Please enter 'Y' or 'N'."); + rl.close(); + } + } +); diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..e5e3bc3 --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,31 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: [ + './app/**/*.{js,jsx,ts,tsx}', + './components/**/*.{js,jsx,ts,tsx}', + './@share/**/*.{js,jsx,ts,tsx}', + './lib/**/*.{js,jsx,ts,tsx}', + ], + presets: [require('nativewind/preset')], + darkMode: 'class', + safelist: ['dark'], + theme: { + extend: { + fontFamily: {}, + fontSize: {}, + screens: { + xs: '400px', + sm: '640px', + md: '768px', + lg: '1024px', + }, + colors: { + primary: '#16181B', + }, + backgroundImage: { + 'primary-gradient': 'linear-gradient(to left, #8b5cf6, #ec4899, #f97316)', + }, + }, + }, + plugins: [], +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..ab947d2 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "expo/tsconfig.base", + "compilerOptions": { + "strict": true, + "jsx": "react-native", + "baseUrl": ".", + "paths": { + "@/*": ["./*"] + } + }, + "include": ["**/*.ts", "**/*.tsx", ".expo/types/**/*.ts", "expo-env.d.ts", "nativewind-env.d.ts"] +}