diff --git a/app.json b/app.json index 080f8db..cc176a0 100644 --- a/app.json +++ b/app.json @@ -1,8 +1,8 @@ { "expo": { - "name": "myapp", - "slug": "myapp", - "scheme": "myapp", + "name": "Home Lab", + "slug": "homelab", + "scheme": "homelab", "version": "1.0.0", "orientation": "portrait", "icon": "./assets/icon.png", diff --git a/backend/.gitignore b/backend/.gitignore new file mode 100644 index 0000000..9b1ee42 --- /dev/null +++ b/backend/.gitignore @@ -0,0 +1,175 @@ +# Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore + +# Logs + +logs +_.log +npm-debug.log_ +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Caches + +.cache + +# Diagnostic reports (https://nodejs.org/api/report.html) + +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# Runtime data + +pids +_.pid +_.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover + +lib-cov + +# Coverage directory used by tools like istanbul + +coverage +*.lcov + +# nyc test coverage + +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) + +.grunt + +# Bower dependency directory (https://bower.io/) + +bower_components + +# node-waf configuration + +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) + +build/Release + +# Dependency directories + +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) + +web_modules/ + +# TypeScript cache + +*.tsbuildinfo + +# Optional npm cache directory + +.npm + +# Optional eslint cache + +.eslintcache + +# Optional stylelint cache + +.stylelintcache + +# Microbundle cache + +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history + +.node_repl_history + +# Output of 'npm pack' + +*.tgz + +# Yarn Integrity file + +.yarn-integrity + +# dotenv environment variable files + +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) + +.parcel-cache + +# Next.js build output + +.next +out + +# Nuxt.js build / generate output + +.nuxt +dist + +# Gatsby files + +# Comment in the public line in if your project uses Gatsby and not Next.js + +# https://nextjs.org/blog/next-9-1#public-directory-support + +# public + +# vuepress build output + +.vuepress/dist + +# vuepress v2.x temp and cache directory + +.temp + +# Docusaurus cache and generated files + +.docusaurus + +# Serverless directories + +.serverless/ + +# FuseBox cache + +.fusebox/ + +# DynamoDB Local files + +.dynamodb/ + +# TernJS port file + +.tern-port + +# Stores VSCode versions used for testing VSCode extensions + +.vscode-test + +# yarn v2 + +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store diff --git a/backend/bun.lockb b/backend/bun.lockb new file mode 100755 index 0000000..fc824c9 Binary files /dev/null and b/backend/bun.lockb differ diff --git a/backend/index.ts b/backend/index.ts new file mode 100644 index 0000000..5059819 --- /dev/null +++ b/backend/index.ts @@ -0,0 +1,113 @@ +import { Hono } from "hono"; +import { cors } from "hono/cors"; +import { zValidator } from "@hono/zod-validator"; +import z from "zod"; +import si from "systeminformation"; + +const formatBytes = (bytes: number) => { + const sizes = ["Bytes", "KB", "MB", "GB", "TB"]; + if (bytes === 0) return "n/a"; + const i = parseInt(String(Math.floor(Math.log(bytes) / Math.log(1024))), 10); + if (i === 0) return `${bytes} ${sizes[i]}`; + return `${(bytes / 1024 ** i).toFixed(2)} ${sizes[i]}`; +}; + +const secondsToTime = (seconds: number) => { + const d = Math.floor(seconds / (3600 * 24)); + const h = Math.floor((seconds % (3600 * 24)) / 3600); + const m = Math.floor((seconds % 3600) / 60); + const s = Math.floor(seconds % 60); + return `${d}d ${h}h ${m}m`; +}; + +const app = new Hono() + .use(cors()) + + .get("/", (c) => c.text("It works!")) + + .get("/system", async (c) => { + const date = new Date().toISOString(); + const uptime = secondsToTime(si.time().uptime || 0); + const system = await si.system(); + + const cpuSpeed = await si.cpuCurrentSpeed(); + const cpuTemp = await si.cpuTemperature(); + const cpuLoad = await si.currentLoad(); + const mem = await si.mem(); + + const perf = { + cpu: { + load: cpuLoad.currentLoad, + speed: cpuSpeed.avg, + temp: cpuTemp.main, + }, + mem: { + total: formatBytes(mem.total), + percent: (mem.active / mem.total) * 100, + used: formatBytes(mem.active), + free: formatBytes(mem.total - mem.active), + }, + }; + + const fsMounts = await si.fsSize(); + const storage = fsMounts + .filter((i) => i.size > 32 * 1024 * 1024 * 1024) + .map((i) => ({ + type: i.type, + mount: i.mount, + used: formatBytes(i.used), + percent: (i.used / i.size) * 100, + total: formatBytes(i.size), + free: formatBytes(i.available), + })); + + return c.json({ uptime, date, system, perf, storage }); + }) + + .get( + "/process", + zValidator( + "query", + z + .object({ sort: z.enum(["cpu", "mem"]), limit: z.coerce.number() }) + .partial() + .optional() + ), + async (c) => { + const memTotal = (await si.mem()).total; + const sort = c.req.query("sort") || "mem"; + const limit = parseInt(c.req.query("limit") || "") || 10; + + let processList = (await si.processes()).list; + + if (sort) { + switch (sort) { + case "cpu": + processList = processList.sort((a, b) => b.cpu - a.cpu); + break; + case "mem": + processList = processList.sort((a, b) => b.mem - a.mem); + break; + } + } + + const list = processList + .map((p) => ({ + name: p.name, + cmd: [p.name, p.params].filter(Boolean).join(" "), + cpu: p.cpu, + cpuPercent: p.cpu.toFixed(1) + "%", + mem: p.mem, + memUsage: formatBytes((p.mem / 100) * memTotal), + path: p.path, + user: p.user, + })) + .slice(0, limit); + + return c.json({ list }); + } + ); + +export type AppType = typeof app; + +export default app; diff --git a/backend/package.json b/backend/package.json new file mode 100644 index 0000000..53a9bf2 --- /dev/null +++ b/backend/package.json @@ -0,0 +1,20 @@ +{ + "name": "backend", + "module": "index.ts", + "type": "module", + "scripts": { + "dev": "bun run --watch index.ts" + }, + "devDependencies": { + "@types/bun": "latest" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "dependencies": { + "@hono/zod-validator": "^0.2.0", + "hono": "^4.1.0", + "systeminformation": "^5.22.2", + "zod": "^3.22.4" + } +} \ No newline at end of file diff --git a/backend/tsconfig.json b/backend/tsconfig.json new file mode 100644 index 0000000..0fef23a --- /dev/null +++ b/backend/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + // Enable latest features + "lib": ["ESNext"], + "target": "ESNext", + "module": "ESNext", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false + } +} diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000..5861f4d Binary files /dev/null and b/bun.lockb differ diff --git a/global.d.ts b/global.d.ts new file mode 100644 index 0000000..2ff1478 --- /dev/null +++ b/global.d.ts @@ -0,0 +1,4 @@ +declare module "*.svg" { + const content: React.FunctionComponent>; + export default content; +} diff --git a/metro.config.js b/metro.config.js new file mode 100644 index 0000000..80390ca --- /dev/null +++ b/metro.config.js @@ -0,0 +1,19 @@ +const { getDefaultConfig } = require("expo/metro-config"); + +module.exports = (() => { + const config = getDefaultConfig(__dirname); + + const { transformer, resolver } = config; + + config.transformer = { + ...transformer, + babelTransformerPath: require.resolve("react-native-svg-transformer") + }; + config.resolver = { + ...resolver, + assetExts: resolver.assetExts.filter((ext) => ext !== "svg"), + sourceExts: [...resolver.sourceExts, "svg"] + }; + + return config; +})(); diff --git a/package.json b/package.json index e3448ad..647c1f4 100644 --- a/package.json +++ b/package.json @@ -6,22 +6,27 @@ "start": "expo start", "android": "expo start --android", "ios": "expo start --ios", - "web": "expo start --web" + "web": "expo start --web", + "build:web": "expo export -p web" }, "dependencies": { "@expo/metro-runtime": "~3.1.3", "@types/react": "~18.2.45", "class-variance-authority": "^0.7.0", + "dayjs": "^1.11.10", "expo": "~50.0.11", "expo-constants": "~15.4.5", "expo-linking": "~6.2.2", "expo-router": "~3.4.8", "expo-status-bar": "~1.11.1", + "hono": "^4.1.0", "react": "18.2.0", "react-dom": "18.2.0", "react-native": "0.73.4", + "react-native-circular-progress": "^1.3.9", "react-native-safe-area-context": "4.8.2", "react-native-screens": "~3.29.0", + "react-native-svg": "14.1.0", "react-native-web": "~0.19.6", "react-query": "^3.39.3", "twrnc": "^4.1.0", @@ -29,7 +34,8 @@ }, "devDependencies": { "@babel/core": "^7.20.0", - "babel-plugin-module-resolver": "^5.0.0" + "babel-plugin-module-resolver": "^5.0.0", + "react-native-svg-transformer": "^1.3.0" }, "private": true } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 08c684e..a4fe631 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,25 +10,31 @@ dependencies: version: 3.1.3(react-native@0.73.4) '@types/react': specifier: ~18.2.45 - version: 18.2.64 + version: 18.2.66 class-variance-authority: specifier: ^0.7.0 version: 0.7.0 + dayjs: + specifier: ^1.11.10 + version: 1.11.10 expo: specifier: ~50.0.11 - version: 50.0.11(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21) + version: 50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21) expo-constants: specifier: ~15.4.5 - version: 15.4.5(expo@50.0.11) + version: 15.4.5(expo@50.0.13) expo-linking: specifier: ~6.2.2 - version: 6.2.2(expo@50.0.11) + version: 6.2.2(expo@50.0.13) expo-router: specifier: ~3.4.8 - version: 3.4.8(expo-constants@15.4.5)(expo-linking@6.2.2)(expo-modules-autolinking@1.10.3)(expo-status-bar@1.11.1)(expo@50.0.11)(react-dom@18.2.0)(react-native-safe-area-context@4.8.2)(react-native-screens@3.29.0)(react-native@0.73.4)(react@18.2.0) + version: 3.4.8(expo-constants@15.4.5)(expo-linking@6.2.2)(expo-modules-autolinking@1.10.3)(expo-status-bar@1.11.1)(expo@50.0.13)(react-dom@18.2.0)(react-native-safe-area-context@4.8.2)(react-native-screens@3.29.0)(react-native@0.73.4)(react@18.2.0) expo-status-bar: specifier: ~1.11.1 version: 1.11.1 + hono: + specifier: ^4.1.0 + version: 4.1.0 react: specifier: 18.2.0 version: 18.2.0 @@ -38,6 +44,9 @@ dependencies: react-native: specifier: 0.73.4 version: 0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0)(react@18.2.0) + react-native-circular-progress: + specifier: ^1.3.9 + version: 1.3.9(react-native-svg@15.1.0)(react-native@0.73.4)(react@18.2.0) react-native-safe-area-context: specifier: 4.8.2 version: 4.8.2(react-native@0.73.4)(react@18.2.0) @@ -196,8 +205,8 @@ packages: - supports-color dev: false - /@babel/helper-define-polyfill-provider@0.6.0(@babel/core@7.24.0): - resolution: {integrity: sha512-efwOM90nCG6YeT8o3PCyBVSxRfmILxCNL+TNI8CGQl7a62M0Wd9VkV+XHwIlkOz1r4b+lxu6gBjdWiOMdUCrCQ==} + /@babel/helper-define-polyfill-provider@0.6.1(@babel/core@7.24.0): + resolution: {integrity: sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: @@ -1252,7 +1261,7 @@ packages: '@babel/core': 7.24.0 '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.24.0 - babel-plugin-polyfill-corejs2: 0.4.9(@babel/core@7.24.0) + babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.24.0) babel-plugin-polyfill-corejs3: 0.9.0(@babel/core@7.24.0) babel-plugin-polyfill-regenerator: 0.5.5(@babel/core@7.24.0) semver: 6.3.1 @@ -1449,7 +1458,7 @@ packages: '@babel/plugin-transform-unicode-regex': 7.23.3(@babel/core@7.24.0) '@babel/plugin-transform-unicode-sets-regex': 7.23.3(@babel/core@7.24.0) '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.0) - babel-plugin-polyfill-corejs2: 0.4.9(@babel/core@7.24.0) + babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.24.0) babel-plugin-polyfill-corejs3: 0.9.0(@babel/core@7.24.0) babel-plugin-polyfill-regenerator: 0.5.5(@babel/core@7.24.0) core-js-compat: 3.36.0 @@ -1578,8 +1587,8 @@ packages: safe-json-stringify: 1.2.0 dev: false - /@expo/cli@0.17.7(@react-native/babel-preset@0.73.21)(expo-modules-autolinking@1.10.3): - resolution: {integrity: sha512-sOssVCFCVXSdZr2/KdqPeT2Qwxmty3rZeO9g5RbzZexHz93VUyONuqGwO1VlYKibn7FLYEGUovqU9Xi8zVB6JQ==} + /@expo/cli@0.17.8(@react-native/babel-preset@0.73.21)(expo-modules-autolinking@1.10.3): + resolution: {integrity: sha512-yfkoghCltbGPDbRI71Qu3puInjXx4wO82+uhW82qbWLvosfIN7ep5Gr0Lq54liJpvlUG6M0IXM1GiGqcCyP12w==} hasBin: true dependencies: '@babel/runtime': 7.24.0 @@ -1965,6 +1974,18 @@ packages: '@hapi/hoek': 9.3.0 dev: false + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: false + /@isaacs/ttlcache@1.4.1: resolution: {integrity: sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==} engines: {node: '>=12'} @@ -1983,7 +2004,7 @@ packages: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.25 + '@types/node': 20.11.27 jest-mock: 29.7.0 dev: false @@ -1993,7 +2014,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.11.25 + '@types/node': 20.11.27 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -2012,7 +2033,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.11.25 + '@types/node': 20.11.27 '@types/yargs': 15.0.19 chalk: 4.1.2 dev: false @@ -2024,7 +2045,7 @@ packages: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.11.25 + '@types/node': 20.11.27 '@types/yargs': 17.0.32 chalk: 4.1.2 dev: false @@ -2045,8 +2066,8 @@ packages: resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - /@jridgewell/source-map@0.3.5: - resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} + /@jridgewell/source-map@0.3.6: + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} dependencies: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 @@ -2098,6 +2119,13 @@ packages: rimraf: 3.0.2 dev: false + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: false + optional: true + /@radix-ui/react-compose-refs@1.0.0(react@18.2.0): resolution: {integrity: sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==} peerDependencies: @@ -2486,8 +2514,8 @@ packages: react-native: 0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0)(react@18.2.0) dev: false - /@react-navigation/bottom-tabs@6.5.16(@react-navigation/native@6.1.14)(react-native-safe-area-context@4.8.2)(react-native-screens@3.29.0)(react-native@0.73.4)(react@18.2.0): - resolution: {integrity: sha512-zw6hlP1YI4APbOoeJSg1JS9h3OPZIp4O2ccAkiIPgw7T6wyKs8dGJyrkkUtTryXoRUqL1D14xp6K1Etgqm7F2A==} + /@react-navigation/bottom-tabs@6.5.19(@react-navigation/native@6.1.16)(react-native-safe-area-context@4.8.2)(react-native-screens@3.29.0)(react-native@0.73.4)(react@18.2.0): + resolution: {integrity: sha512-Kz0dbPeeTJ6pbn69/NsllWnaLfe0egdmTDTnatniYTvwJYvaE06r73c+bKxeZ2jYps5xqmQDY+odvxmifCJO+g==} peerDependencies: '@react-navigation/native': ^6.0.0 react: '*' @@ -2495,8 +2523,8 @@ packages: react-native-safe-area-context: '>= 3.0.0' react-native-screens: '>= 3.0.0' dependencies: - '@react-navigation/elements': 1.3.26(@react-navigation/native@6.1.14)(react-native-safe-area-context@4.8.2)(react-native@0.73.4)(react@18.2.0) - '@react-navigation/native': 6.1.14(react-native@0.73.4)(react@18.2.0) + '@react-navigation/elements': 1.3.29(@react-navigation/native@6.1.16)(react-native-safe-area-context@4.8.2)(react-native@0.73.4)(react@18.2.0) + '@react-navigation/native': 6.1.16(react-native@0.73.4)(react@18.2.0) color: 4.2.3 react: 18.2.0 react-native: 0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0)(react@18.2.0) @@ -2505,8 +2533,8 @@ packages: warn-once: 0.1.1 dev: false - /@react-navigation/core@6.4.13(react@18.2.0): - resolution: {integrity: sha512-RBUpNG11SEYfvvWefJPxz8Xu/feWuPxln7ddRSY92aKs7u6fj/Z694Jun76Gmmw/RIHW6xcu3PH2v3Wm8nbumg==} + /@react-navigation/core@6.4.15(react@18.2.0): + resolution: {integrity: sha512-/ti6dulU68bsR3+zM9rlrqOUG8x7Xor35B4W1sA/AbDC0b1veexMGUQHXeyF+qh/3loG8JTwBUgTsPXkoLO2mw==} peerDependencies: react: '*' dependencies: @@ -2519,22 +2547,22 @@ packages: use-latest-callback: 0.1.9(react@18.2.0) dev: false - /@react-navigation/elements@1.3.26(@react-navigation/native@6.1.14)(react-native-safe-area-context@4.8.2)(react-native@0.73.4)(react@18.2.0): - resolution: {integrity: sha512-9rSY7MD6etU3M3j/OYUvtg4eBqABlkS39iJwwQheE89pSa9QyvXbJSsz/bUBEjFWwsOYxTVzj27bc7ulrDVWgw==} + /@react-navigation/elements@1.3.29(@react-navigation/native@6.1.16)(react-native-safe-area-context@4.8.2)(react-native@0.73.4)(react@18.2.0): + resolution: {integrity: sha512-sMkqqQHlxdBxrBVw6E2a3LJjb9Hrb1ola8+zRgJn4Ox8iKtjqtWEdg349DPWU77VpIekcMLsqQvEtZox3XkXgA==} peerDependencies: '@react-navigation/native': ^6.0.0 react: '*' react-native: '*' react-native-safe-area-context: '>= 3.0.0' dependencies: - '@react-navigation/native': 6.1.14(react-native@0.73.4)(react@18.2.0) + '@react-navigation/native': 6.1.16(react-native@0.73.4)(react@18.2.0) react: 18.2.0 react-native: 0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0)(react@18.2.0) react-native-safe-area-context: 4.8.2(react-native@0.73.4)(react@18.2.0) dev: false - /@react-navigation/native-stack@6.9.22(@react-navigation/native@6.1.14)(react-native-safe-area-context@4.8.2)(react-native-screens@3.29.0)(react-native@0.73.4)(react@18.2.0): - resolution: {integrity: sha512-1GGztUWXY+lbsIYkGV3HCYBF7qIOHnx663csgXArzunk8CcWNsUYwM7k1/Ql8e2LyvJtdjE3OS4fjLh+d72/YA==} + /@react-navigation/native-stack@6.9.25(@react-navigation/native@6.1.16)(react-native-safe-area-context@4.8.2)(react-native-screens@3.29.0)(react-native@0.73.4)(react@18.2.0): + resolution: {integrity: sha512-bhJ5NC9RxJyG8O3kLA2Axv699Wih8MoPCUWD6bWFIwLC/k02bXOQd/a19hEJqlFd+YLA343z897yybpHtcEhZQ==} peerDependencies: '@react-navigation/native': ^6.0.0 react: '*' @@ -2542,8 +2570,8 @@ packages: react-native-safe-area-context: '>= 3.0.0' react-native-screens: '>= 3.0.0' dependencies: - '@react-navigation/elements': 1.3.26(@react-navigation/native@6.1.14)(react-native-safe-area-context@4.8.2)(react-native@0.73.4)(react@18.2.0) - '@react-navigation/native': 6.1.14(react-native@0.73.4)(react@18.2.0) + '@react-navigation/elements': 1.3.29(@react-navigation/native@6.1.16)(react-native-safe-area-context@4.8.2)(react-native@0.73.4)(react@18.2.0) + '@react-navigation/native': 6.1.16(react-native@0.73.4)(react@18.2.0) react: 18.2.0 react-native: 0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0)(react@18.2.0) react-native-safe-area-context: 4.8.2(react-native@0.73.4)(react@18.2.0) @@ -2551,13 +2579,13 @@ packages: warn-once: 0.1.1 dev: false - /@react-navigation/native@6.1.14(react-native@0.73.4)(react@18.2.0): - resolution: {integrity: sha512-nCrVi4cHXx6VnXV8fj+lLb8zjLt1LZkpxudhfV/i1KstgaoGzh9FgFDIvbWONGE8f403FIsYUnZxKHvN7asp1w==} + /@react-navigation/native@6.1.16(react-native@0.73.4)(react@18.2.0): + resolution: {integrity: sha512-nlP9RrpNs0ogMQpYXURIIMZYOYvg51jvcC3wfE9GFKQO0Av+GsvWd/kPtliWzWmtFwPnqiu5dw4bCvNtfsB3bA==} peerDependencies: react: '*' react-native: '*' dependencies: - '@react-navigation/core': 6.4.13(react@18.2.0) + '@react-navigation/core': 6.4.15(react@18.2.0) escape-string-regexp: 4.0.0 fast-deep-equal: 3.1.3 nanoid: 3.3.7 @@ -2703,8 +2731,8 @@ packages: resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} dev: false - /@types/node@20.11.25: - resolution: {integrity: sha512-TBHyJxk2b7HceLVGFcpAUjsa5zIdsPWlR6XHfyGzd0SFu+/NFgQgMAl96MSDZgQDvJAvV6BKsFOrt6zIL09JDw==} + /@types/node@20.11.27: + resolution: {integrity: sha512-qyUZfMnCg1KEz57r7pzFtSGt49f6RPkPBis3Vo4PbS7roQEDn22hiHzl/Lo1q4i4hDEgBJmBF/NTNg2XR0HbFg==} dependencies: undici-types: 5.26.5 dev: false @@ -2713,8 +2741,8 @@ packages: resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} dev: false - /@types/react@18.2.64: - resolution: {integrity: sha512-MlmPvHgjj2p3vZaxbQgFUQFvD8QiZwACfGqEdDSWou5yISWxDQ4/74nCAwsUiX7UFLKZz3BbVSPj+YxeoGGCfg==} + /@types/react@18.2.66: + resolution: {integrity: sha512-OYTmMI4UigXeFMF/j4uv0lBBEbongSgptPrHBxqME44h9+yNov+oL6Z3ocJKo0WyXR84sQUNeyIp9MRfckvZpg==} dependencies: '@types/prop-types': 15.7.11 '@types/scheduler': 0.16.8 @@ -2881,6 +2909,11 @@ packages: engines: {node: '>=8'} dev: false + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: false + /ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} @@ -2899,6 +2932,11 @@ packages: engines: {node: '>=10'} dev: false + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: false + /any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} dev: false @@ -2993,14 +3031,14 @@ packages: resolve: 1.22.8 dev: true - /babel-plugin-polyfill-corejs2@0.4.9(@babel/core@7.24.0): - resolution: {integrity: sha512-BXIWIaO3MewbXWdJdIGDWZurv5OGJlFNo7oy20DpB3kWDVJLcY2NRypRsRUbRe5KMqSNLuOGnWTFQQtY5MAsRw==} + /babel-plugin-polyfill-corejs2@0.4.10(@babel/core@7.24.0): + resolution: {integrity: sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: '@babel/compat-data': 7.23.5 '@babel/core': 7.24.0 - '@babel/helper-define-polyfill-provider': 0.6.0(@babel/core@7.24.0) + '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.0) semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -3116,8 +3154,8 @@ packages: engines: {node: '>=0.6'} dev: false - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + /binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} dev: false @@ -3133,6 +3171,10 @@ packages: resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} dev: false + /boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + dev: false + /bplist-creator@0.1.0: resolution: {integrity: sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==} dependencies: @@ -3164,7 +3206,6 @@ packages: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} dependencies: balanced-match: 1.0.2 - dev: true /braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} @@ -3191,8 +3232,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001596 - electron-to-chromium: 1.4.699 + caniuse-lite: 1.0.30001597 + electron-to-chromium: 1.4.707 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.23.0) @@ -3271,7 +3312,7 @@ packages: es-errors: 1.3.0 function-bind: 1.1.2 get-intrinsic: 1.2.4 - set-function-length: 1.2.1 + set-function-length: 1.2.2 dev: false /caller-callsite@2.0.0: @@ -3308,8 +3349,8 @@ packages: engines: {node: '>=10'} dev: false - /caniuse-lite@1.0.30001596: - resolution: {integrity: sha512-zpkZ+kEr6We7w63ORkoJ2pOfBwBkY/bJrG/UZ90qNb45Isblu8wzDgevEOrRL1r9dWayHjYiiyCMEXPn4DweGQ==} + /caniuse-lite@1.0.30001597: + resolution: {integrity: sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w==} /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -3356,7 +3397,7 @@ packages: engines: {node: '>=12.13.0'} hasBin: true dependencies: - '@types/node': 20.11.25 + '@types/node': 20.11.27 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -3367,7 +3408,7 @@ packages: /chromium-edge-launcher@1.0.0: resolution: {integrity: sha512-pgtgjNKZ7i5U++1g1PWv75umkHvhVTDOQIZ+sjeUX9483S7Y6MUvO0lrd7ShGlQlFHMN4SwKTCq/X8hWrbv2KA==} dependencies: - '@types/node': 20.11.25 + '@types/node': 20.11.27 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -3652,6 +3693,29 @@ packages: hyphenate-style-name: 1.0.4 dev: false + /css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.1.0 + nth-check: 2.1.1 + dev: false + + /css-tree@1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + dev: false + + /css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + dev: false + /cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -3823,6 +3887,33 @@ packages: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} dev: false + /dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + dev: false + + /domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + dev: false + + /domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: false + + /domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dev: false + /dotenv-expand@10.0.0: resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} engines: {node: '>=12'} @@ -3833,17 +3924,25 @@ packages: engines: {node: '>=12'} dev: false + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: false + /ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: false - /electron-to-chromium@1.4.699: - resolution: {integrity: sha512-I7q3BbQi6e4tJJN5CRcyvxhK0iJb34TV8eJQcgh+fR2fQ8miMgZcEInckCo1U9exDHbfz7DLDnFn8oqH/VcRKw==} + /electron-to-chromium@1.4.707: + resolution: {integrity: sha512-qRq74Mo7ChePOU6GHdfAJ0NREXU8vQTlVlfWz3wNygFay6xrd/fY2J7oGHwrhFeU30OVctGLdTh/FcnokTWpng==} /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} dev: false + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: false + /encodeurl@1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} @@ -3855,6 +3954,11 @@ packages: once: 1.4.0 dev: false + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: false + /env-editor@0.4.2: resolution: {integrity: sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==} engines: {node: '>=8'} @@ -3977,13 +4081,13 @@ packages: strip-final-newline: 2.0.0 dev: false - /expo-asset@9.0.2(expo@50.0.11): + /expo-asset@9.0.2(expo@50.0.13): resolution: {integrity: sha512-PzYKME1MgUOoUvwtdzhAyXkjXOXGiSYqGKG/MsXwWr0Ef5wlBaBm2DCO9V6KYbng5tBPFu6hTjoRNil1tBOSow==} dependencies: '@react-native/assets-registry': 0.73.1 blueimp-md5: 2.19.0 - expo-constants: 15.4.5(expo@50.0.11) - expo-file-system: 16.0.8(expo@50.0.11) + expo-constants: 15.4.5(expo@50.0.13) + expo-file-system: 16.0.8(expo@50.0.13) invariant: 2.2.4 md5-file: 3.2.3 transitivePeerDependencies: @@ -3991,46 +4095,46 @@ packages: - supports-color dev: false - /expo-constants@15.4.5(expo@50.0.11): + /expo-constants@15.4.5(expo@50.0.13): resolution: {integrity: sha512-1pVVjwk733hbbIjtQcvUFCme540v4gFemdNlaxM2UXKbfRCOh2hzgKN5joHMOysoXQe736TTUrRj7UaZI5Yyhg==} peerDependencies: expo: '*' dependencies: '@expo/config': 8.5.4 - expo: 50.0.11(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21) + expo: 50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21) transitivePeerDependencies: - supports-color dev: false - /expo-file-system@16.0.8(expo@50.0.11): + /expo-file-system@16.0.8(expo@50.0.13): resolution: {integrity: sha512-yDbVT0TUKd7ewQjaY5THum2VRFx2n/biskGhkUmLh3ai21xjIVtaeIzHXyv9ir537eVgt4ReqDNWi7jcXjdUcA==} peerDependencies: expo: '*' dependencies: - expo: 50.0.11(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21) + expo: 50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21) dev: false - /expo-font@11.10.3(expo@50.0.11): + /expo-font@11.10.3(expo@50.0.13): resolution: {integrity: sha512-q1Td2zUvmLbCA9GV4OG4nLPw5gJuNY1VrPycsnemN1m8XWTzzs8nyECQQqrcBhgulCgcKZZJJ6U0kC2iuSoQHQ==} peerDependencies: expo: '*' dependencies: - expo: 50.0.11(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21) + expo: 50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21) fontfaceobserver: 2.3.0 dev: false - /expo-keep-awake@12.8.2(expo@50.0.11): + /expo-keep-awake@12.8.2(expo@50.0.13): resolution: {integrity: sha512-uiQdGbSX24Pt8nGbnmBtrKq6xL/Tm3+DuDRGBk/3ZE/HlizzNosGRIufIMJ/4B4FRw4dw8KU81h2RLuTjbay6g==} peerDependencies: expo: '*' dependencies: - expo: 50.0.11(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21) + expo: 50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21) dev: false - /expo-linking@6.2.2(expo@50.0.11): + /expo-linking@6.2.2(expo@50.0.13): resolution: {integrity: sha512-FEe6lP4f7xFT/vjoHRG+tt6EPVtkEGaWNK1smpaUevmNdyCJKqW0PDB8o8sfG6y7fly8ULe8qg3HhKh5J7aqUQ==} dependencies: - expo-constants: 15.4.5(expo@50.0.11) + expo-constants: 15.4.5(expo@50.0.13) invariant: 2.2.4 transitivePeerDependencies: - expo @@ -4051,13 +4155,13 @@ packages: - supports-color dev: false - /expo-modules-core@1.11.10: - resolution: {integrity: sha512-L1DSxV3AUnEvR8+G1JHbMPjpwqALv0AF71oREhDJ/ehI2TDX6LkE+up5BUK1/++UjmVu1lviefbUfLut2F5wNQ==} + /expo-modules-core@1.11.12: + resolution: {integrity: sha512-/e8g4kis0pFLer7C0PLyx98AfmztIM6gU9jLkYnB1pU9JAfQf904XEi3bmszO7uoteBQwSL6FLp1m3TePKhDaA==} dependencies: invariant: 2.2.4 dev: false - /expo-router@3.4.8(expo-constants@15.4.5)(expo-linking@6.2.2)(expo-modules-autolinking@1.10.3)(expo-status-bar@1.11.1)(expo@50.0.11)(react-dom@18.2.0)(react-native-safe-area-context@4.8.2)(react-native-screens@3.29.0)(react-native@0.73.4)(react@18.2.0): + /expo-router@3.4.8(expo-constants@15.4.5)(expo-linking@6.2.2)(expo-modules-autolinking@1.10.3)(expo-status-bar@1.11.1)(expo@50.0.13)(react-dom@18.2.0)(react-native-safe-area-context@4.8.2)(react-native-screens@3.29.0)(react-native@0.73.4)(react@18.2.0): resolution: {integrity: sha512-fOOAWHH4LSPjPFtIZbApxdTNU8xSS8qKvhZ7PfWNMfx9510J1R1Ce/nwENPzcRLHRuVofDsSAEBfi4kV03fJwg==} peerDependencies: '@react-navigation/drawer': ^6.5.8 @@ -4080,13 +4184,13 @@ packages: '@expo/metro-runtime': 3.1.3(react-native@0.73.4) '@expo/server': 0.3.1 '@radix-ui/react-slot': 1.0.1(react@18.2.0) - '@react-navigation/bottom-tabs': 6.5.16(@react-navigation/native@6.1.14)(react-native-safe-area-context@4.8.2)(react-native-screens@3.29.0)(react-native@0.73.4)(react@18.2.0) - '@react-navigation/native': 6.1.14(react-native@0.73.4)(react@18.2.0) - '@react-navigation/native-stack': 6.9.22(@react-navigation/native@6.1.14)(react-native-safe-area-context@4.8.2)(react-native-screens@3.29.0)(react-native@0.73.4)(react@18.2.0) - expo: 50.0.11(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21) - expo-constants: 15.4.5(expo@50.0.11) - expo-linking: 6.2.2(expo@50.0.11) - expo-splash-screen: 0.26.4(expo-modules-autolinking@1.10.3)(expo@50.0.11) + '@react-navigation/bottom-tabs': 6.5.19(@react-navigation/native@6.1.16)(react-native-safe-area-context@4.8.2)(react-native-screens@3.29.0)(react-native@0.73.4)(react@18.2.0) + '@react-navigation/native': 6.1.16(react-native@0.73.4)(react@18.2.0) + '@react-navigation/native-stack': 6.9.25(@react-navigation/native@6.1.16)(react-native-safe-area-context@4.8.2)(react-native-screens@3.29.0)(react-native@0.73.4)(react@18.2.0) + expo: 50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21) + expo-constants: 15.4.5(expo@50.0.13) + expo-linking: 6.2.2(expo@50.0.13) + expo-splash-screen: 0.26.4(expo-modules-autolinking@1.10.3)(expo@50.0.13) expo-status-bar: 1.11.1 react-helmet-async: 1.3.0(react-dom@18.2.0)(react@18.2.0) react-native-safe-area-context: 4.8.2(react-native@0.73.4)(react@18.2.0) @@ -4101,13 +4205,13 @@ packages: - supports-color dev: false - /expo-splash-screen@0.26.4(expo-modules-autolinking@1.10.3)(expo@50.0.11): + /expo-splash-screen@0.26.4(expo-modules-autolinking@1.10.3)(expo@50.0.13): resolution: {integrity: sha512-2DwofTQ0FFQCsvDysm/msENsbyNsJiAJwK3qK/oXeizECAPqD7bK19J4z9kuEbr7ORPX9MLnTQYKl6kmX3keUg==} peerDependencies: expo: '*' dependencies: '@expo/prebuild-config': 6.7.4(expo-modules-autolinking@1.10.3) - expo: 50.0.11(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21) + expo: 50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21) transitivePeerDependencies: - encoding - expo-modules-autolinking @@ -4118,23 +4222,23 @@ packages: resolution: {integrity: sha512-ddQEtCOgYHTLlFUe/yH67dDBIoct5VIULthyT3LRJbEwdpzAgueKsX2FYK02ldh440V87PWKCamh7R9evk1rrg==} dev: false - /expo@50.0.11(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21): - resolution: {integrity: sha512-XEq8By1l8FQo2SEzhXfQEoKBd0nZ9j6HKsDzj1dUrRVYd02SMH/xUCERxuRaWUL2u1bWdfaFlg/Dmc/2JlVkKQ==} + /expo@50.0.13(@babel/core@7.24.0)(@react-native/babel-preset@0.73.21): + resolution: {integrity: sha512-p0FYrhUJZe92YOwOXx6GZ/WaxF6YtsLXtWkql9pFIIocYBN6iQ3OMGsbQCRSu0ao8rlxsk7HgQDEWK4D+y9tAg==} hasBin: true dependencies: '@babel/runtime': 7.24.0 - '@expo/cli': 0.17.7(@react-native/babel-preset@0.73.21)(expo-modules-autolinking@1.10.3) + '@expo/cli': 0.17.8(@react-native/babel-preset@0.73.21)(expo-modules-autolinking@1.10.3) '@expo/config': 8.5.4 '@expo/config-plugins': 7.8.4 '@expo/metro-config': 0.17.6(@react-native/babel-preset@0.73.21) '@expo/vector-icons': 14.0.0 babel-preset-expo: 10.0.1(@babel/core@7.24.0) - expo-asset: 9.0.2(expo@50.0.11) - expo-file-system: 16.0.8(expo@50.0.11) - expo-font: 11.10.3(expo@50.0.11) - expo-keep-awake: 12.8.2(expo@50.0.11) + expo-asset: 9.0.2(expo@50.0.13) + expo-file-system: 16.0.8(expo@50.0.13) + expo-font: 11.10.3(expo@50.0.13) + expo-keep-awake: 12.8.2(expo@50.0.13) expo-modules-autolinking: 1.10.3 - expo-modules-core: 1.11.10 + expo-modules-core: 1.11.12 fbemitter: 3.0.0 whatwg-url-without-unicode: 8.0.0-3 transitivePeerDependencies: @@ -4306,6 +4410,14 @@ packages: is-callable: 1.2.7 dev: false + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + dev: false + /form-data@3.0.1: resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} engines: {node: '>= 6'} @@ -4392,7 +4504,7 @@ packages: function-bind: 1.1.2 has-proto: 1.0.3 has-symbols: 1.0.3 - hasown: 2.0.1 + hasown: 2.0.2 dev: false /get-port@3.2.0: @@ -4431,6 +4543,18 @@ packages: is-glob: 4.0.3 dev: false + /glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.3 + minipass: 7.0.4 + path-scurry: 1.10.1 + dev: false + /glob@6.0.4: resolution: {integrity: sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==} requiresBuild: true @@ -4549,8 +4673,8 @@ packages: has-symbols: 1.0.3 dev: false - /hasown@2.0.1: - resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} dependencies: function-bind: 1.1.2 @@ -4582,6 +4706,11 @@ packages: source-map: 0.7.4 dev: false + /hono@4.1.0: + resolution: {integrity: sha512-9no6DCHb4ijB1tWdFXU6JnrnFgzwVZ1cnIcS1BjAFnMcjbtBTOMsQrDrPH3GXbkNEEEkj8kWqcYBy8Qc0bBkJQ==} + engines: {node: '>=16.0.0'} + dev: false + /hosted-git-info@3.0.8: resolution: {integrity: sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==} engines: {node: '>=10'} @@ -4726,7 +4855,7 @@ packages: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} dependencies: - binary-extensions: 2.2.0 + binary-extensions: 2.3.0 dev: false /is-buffer@1.1.6: @@ -4741,7 +4870,7 @@ packages: /is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} dependencies: - hasown: 2.0.1 + hasown: 2.0.2 /is-directory@0.3.1: resolution: {integrity: sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==} @@ -4843,7 +4972,7 @@ packages: resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} engines: {node: '>= 0.4'} dependencies: - which-typed-array: 1.1.14 + which-typed-array: 1.1.15 dev: false /is-unicode-supported@0.1.0: @@ -4883,6 +5012,15 @@ packages: engines: {node: '>=0.10.0'} dev: false + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: false + /jest-environment-node@29.7.0: resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4890,7 +5028,7 @@ packages: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.25 + '@types/node': 20.11.27 jest-mock: 29.7.0 jest-util: 29.7.0 dev: false @@ -4920,7 +5058,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.11.25 + '@types/node': 20.11.27 jest-util: 29.7.0 dev: false @@ -4929,7 +5067,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.11.25 + '@types/node': 20.11.27 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -4952,7 +5090,7 @@ packages: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 20.11.25 + '@types/node': 20.11.27 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -5282,6 +5420,11 @@ packages: js-tokens: 4.0.0 dev: false + /lru-cache@10.2.0: + resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} + engines: {node: 14 || >=16.14} + dev: false + /lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: @@ -5347,6 +5490,10 @@ packages: resolution: {integrity: sha512-c2YOUbp33+6thdCUi34xIyOU/a7bvGKj/3DB1iaPMTuPHf/Q2d5s4sn1FaCOO43XkXggnb08y5W2PU8UNYNLKQ==} dev: false + /mdn-data@2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + dev: false + /memoize-one@5.2.1: resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} dev: false @@ -5442,7 +5589,7 @@ packages: resolution: {integrity: sha512-83eZaH2+B+jP92KuodPqXknzwmiboKAuZY4doRfTEEXAG57pNVNN6cqSRJlwDnmaTBKRffxoncBXbYqHQgulgg==} engines: {node: '>=18'} dependencies: - terser: 5.29.1 + terser: 5.29.2 dev: false /metro-resolver@0.80.6: @@ -5638,6 +5785,13 @@ packages: brace-expansion: 2.0.1 dev: true + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: false + /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: false @@ -5675,6 +5829,11 @@ packages: engines: {node: '>=8'} dev: false + /minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + dev: false + /minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} @@ -5840,6 +5999,12 @@ packages: path-key: 3.1.1 dev: false + /nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + dependencies: + boolbase: 1.0.0 + dev: false + /nullthrows@1.1.1: resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} dev: false @@ -6071,6 +6236,14 @@ packages: /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + /path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + lru-cache: 10.2.0 + minipass: 7.0.4 + dev: false + /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -6183,11 +6356,11 @@ packages: postcss: ^8.2.14 dependencies: postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + postcss-selector-parser: 6.0.16 dev: false - /postcss-selector-parser@6.0.15: - resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==} + /postcss-selector-parser@6.0.16: + resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} engines: {node: '>=4'} dependencies: cssesc: 3.0.0 @@ -6389,6 +6562,19 @@ packages: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} dev: false + /react-native-circular-progress@1.3.9(react-native-svg@15.1.0)(react-native@0.73.4)(react@18.2.0): + resolution: {integrity: sha512-y79Fwg4xg4aidgTeFLVYV/bI2vVverwJIe1xbC7fWTmyfDKd4n6fVFd1gsAGyJaMljGSC6dG3MswlPei7rmlkQ==} + peerDependencies: + react: '>=16.0.0' + react-native: '>=0.50.0' + react-native-svg: '>=7.0.0' + dependencies: + prop-types: 15.8.1 + react: 18.2.0 + react-native: 0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0)(react@18.2.0) + react-native-svg: 15.1.0(react-native@0.73.4)(react@18.2.0) + dev: false + /react-native-safe-area-context@4.8.2(react-native@0.73.4)(react@18.2.0): resolution: {integrity: sha512-ffUOv8BJQ6RqO3nLml5gxJ6ab3EestPiyWekxdzO/1MQ7NF8fW1Mzh1C5QE9yq573Xefnc7FuzGXjtesZGv7cQ==} peerDependencies: @@ -6411,6 +6597,18 @@ packages: warn-once: 0.1.1 dev: false + /react-native-svg@15.1.0(react-native@0.73.4)(react@18.2.0): + resolution: {integrity: sha512-p0Sx0EpQNk1nu6UcMEiB8K9P04n3J7s+pNYUwf1d/Yz+v4hk961VjuVqjyndgiEbHZyWiKWLZRVNuvLpwjPY2A==} + peerDependencies: + react: '*' + react-native: '*' + dependencies: + css-select: 5.1.0 + css-tree: 1.1.3 + react: 18.2.0 + react-native: 0.73.4(@babel/core@7.24.0)(@babel/preset-env@7.24.0)(react@18.2.0) + dev: false + /react-native-web@0.19.10(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-IQoHiTQq8egBCVVwmTrYcFLgEFyb4LMZYEktHn4k22JMk9+QTCEz5WTfvr+jdNoeqj/7rtE81xgowKbfGO74qg==} peerDependencies: @@ -6858,8 +7056,8 @@ packages: resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} dev: false - /set-function-length@1.2.1: - resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==} + /set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} dependencies: define-data-property: 1.1.4 @@ -6921,6 +7119,11 @@ packages: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} dev: false + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: false + /simple-plist@1.3.1: resolution: {integrity: sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==} dependencies: @@ -7058,6 +7261,15 @@ packages: strip-ansi: 6.0.1 dev: false + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: false + /string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} dependencies: @@ -7084,6 +7296,13 @@ packages: ansi-regex: 5.0.1 dev: false + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: false + /strip-eof@1.0.0: resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} engines: {node: '>=0.10.0'} @@ -7125,6 +7344,20 @@ packages: ts-interface-checker: 0.1.13 dev: false + /sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + commander: 4.1.1 + glob: 10.3.10 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + dev: false + /sudo-prompt@8.2.5: resolution: {integrity: sha512-rlBo3HU/1zAJUrkY6jNxDOC9eVYliG6nS4JA8u8KAshITd07tafMc/Br7xQwCSseXwJ2iCcHCE8SNWX3q8Z+kw==} dev: false @@ -7193,9 +7426,9 @@ packages: postcss-js: 4.0.1(postcss@8.4.35) postcss-load-config: 4.0.2(postcss@8.4.35) postcss-nested: 6.0.1(postcss@8.4.35) - postcss-selector-parser: 6.0.15 + postcss-selector-parser: 6.0.16 resolve: 1.22.8 - sucrase: 3.34.0 + sucrase: 3.35.0 transitivePeerDependencies: - ts-node dev: false @@ -7257,12 +7490,12 @@ packages: supports-hyperlinks: 2.3.0 dev: false - /terser@5.29.1: - resolution: {integrity: sha512-lZQ/fyaIGxsbGxApKmoPTODIzELy3++mXhS5hOqaAWZjQtpq/hFHAc+rm29NND1rYRxRWKcjuARNwULNXa5RtQ==} + /terser@5.29.2: + resolution: {integrity: sha512-ZiGkhUBIM+7LwkNjXYJq8svgkd+QK3UUr0wJqY4MieaezBSAIPgbSPZyIx0idM6XWK5CMzSWa8MJIzmRcB8Caw==} engines: {node: '>=10'} hasBin: true dependencies: - '@jridgewell/source-map': 0.3.5 + '@jridgewell/source-map': 0.3.6 acorn: 8.11.3 commander: 2.20.3 source-map-support: 0.5.21 @@ -7509,7 +7742,7 @@ packages: is-arguments: 1.1.1 is-generator-function: 1.0.10 is-typed-array: 1.1.13 - which-typed-array: 1.1.14 + which-typed-array: 1.1.15 dev: false /utils-merge@1.0.1: @@ -7608,8 +7841,8 @@ packages: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} dev: false - /which-typed-array@1.1.14: - resolution: {integrity: sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==} + /which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.7 @@ -7656,6 +7889,15 @@ packages: strip-ansi: 6.0.1 dev: false + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + dev: false + /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} diff --git a/src/app/_layout.tsx b/src/app/_layout.tsx index 086c6e1..645ce37 100644 --- a/src/app/_layout.tsx +++ b/src/app/_layout.tsx @@ -3,18 +3,26 @@ import { Slot } from "expo-router"; import { QueryClientProvider } from "react-query"; import queryClient from "@/lib/queryClient"; import { View } from "react-native"; -import { cn } from "@/lib/utils"; +import { cn, tw } from "@/lib/utils"; +import { useDeviceContext } from "twrnc"; import { StatusBar } from "expo-status-bar"; import { useSafeAreaInsets } from "react-native-safe-area-context"; const RootLayout = () => { const insets = useSafeAreaInsets(); + useDeviceContext(tw); return ( - - + + + + ); diff --git a/src/app/_sections/Performance.tsx b/src/app/_sections/Performance.tsx new file mode 100644 index 0000000..2507884 --- /dev/null +++ b/src/app/_sections/Performance.tsx @@ -0,0 +1,102 @@ +import React, { useState } from "react"; +import { AnimatedCircularProgress } from "react-native-circular-progress"; +import { InferResponseType } from "hono/client"; +import api from "@/lib/api"; +import Text from "@ui/Text"; +import { HStack, VStack } from "@ui/Stack"; +import Box from "@ui/Box"; +import ProcessList from "./ProcessList"; +import Divider from "@ui/Divider"; +import Button from "@ui/Button"; +import { Ionicons } from "@ui/Icons"; + +type Props = { + data: InferResponseType; +}; + +const Performance = ({ data: system }: Props) => { + const [showProcess, setShowProcess] = useState(false); + + return ( + <> + Performance + + + + + + {() => ( + + + {Math.round(system?.perf.cpu.load || 0)} + + % + + )} + + CPU + {system ? ( + + {`${system.perf.cpu.speed.toFixed(1)} GHz / ${ + system.perf.cpu.temp + }°C`} + + ) : null} + + + + {() => ( + + + {Math.round(system?.perf.mem.percent || 0)} + + % + + )} + + Mem + {system?.perf.mem.used} + + + +