From c08d19f20ed04ef14e7a1cde04fa5f57087e0653 Mon Sep 17 00:00:00 2001 From: IZUMI-Zu <274620705z@gmail.com> Date: Sat, 7 Sep 2024 22:10:23 +0800 Subject: [PATCH] feat: support scan login --- EnterCasdoorSdkConfig.js | 28 +++++-- QRScanner.js | 94 +++++++++++++++++++++ ScanLogin.js | 57 +++++++++++++ ScanQRCode.js | 82 +++--------------- app.json | 5 +- package-lock.json | 177 +++++++++++++++++++++------------------ package.json | 2 +- 7 files changed, 282 insertions(+), 163 deletions(-) create mode 100644 QRScanner.js create mode 100644 ScanLogin.js diff --git a/EnterCasdoorSdkConfig.js b/EnterCasdoorSdkConfig.js index b7a2c29..c480602 100644 --- a/EnterCasdoorSdkConfig.js +++ b/EnterCasdoorSdkConfig.js @@ -12,12 +12,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -import React from "react"; +import React, {useState} from "react"; import {ScrollView, Text, View} from "react-native"; import {Button, IconButton, Portal, TextInput} from "react-native-paper"; import Toast from "react-native-toast-message"; import DefaultCasdoorSdkConfig from "./DefaultCasdoorSdkConfig"; import PropTypes from "prop-types"; +import ScanQRCodeForLogin from "./ScanLogin"; import useStore from "./useStorage"; const EnterCasdoorSdkConfig = ({onClose, onWebviewClose}) => { @@ -39,6 +40,8 @@ const EnterCasdoorSdkConfig = ({onClose, onWebviewClose}) => { setCasdoorConfig, } = useStore(); + const [showScanner, setShowScanner] = useState(false); + const closeConfigPage = () => { onClose(); onWebviewClose(); @@ -58,12 +61,16 @@ const EnterCasdoorSdkConfig = ({onClose, onWebviewClose}) => { }; const handleScanToLogin = () => { - Toast.show({ - type: "info", - text1: "Info", - text2: "Scan to Login functionality not implemented yet.", - autoHide: true, - }); + setShowScanner(true); + }; + + const handleLogin = (loginInfo) => { + setServerUrl(loginInfo.serverUrl); + setClientId(loginInfo.clientId); + setAppName(loginInfo.appName); + setOrganizationName(loginInfo.organizationName); + setShowScanner(false); + onClose(); }; const handleUseDefault = () => { @@ -144,6 +151,13 @@ const EnterCasdoorSdkConfig = ({onClose, onWebviewClose}) => { + {showScanner && ( + setShowScanner(false)} + onLogin={handleLogin} + /> + )} ); }; diff --git a/QRScanner.js b/QRScanner.js new file mode 100644 index 0000000..98e7db5 --- /dev/null +++ b/QRScanner.js @@ -0,0 +1,94 @@ +// Copyright 2024 The Casdoor Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import React, {useEffect, useState} from "react"; +import {Text, View} from "react-native"; +import {Button, IconButton, Portal} from "react-native-paper"; +import {Camera, CameraView, scanFromURLAsync} from "expo-camera"; +import * as ImagePicker from "expo-image-picker"; +import PropTypes from "prop-types"; + +const QRScanner = ({onScan, onClose}) => { + const [hasPermission, setHasPermission] = useState(null); + + useEffect(() => { + const getPermissions = async() => { + const {status: cameraStatus} = await Camera.requestCameraPermissionsAsync(); + setHasPermission(cameraStatus === "granted"); + }; + + getPermissions(); + }, []); + + const handleBarCodeScanned = ({type, data}) => { + onScan(type, data); + }; + + const pickImage = async() => { + const result = await ImagePicker.launchImageLibraryAsync({ + mediaTypes: ImagePicker.MediaTypeOptions.Images, + quality: 1, + }); + + if (!result.canceled && result.assets[0]) { + const scannedData = await scanFromURLAsync(result.assets[0].uri, ["qr", "pdf417"]); + if (scannedData[0]) { + handleBarCodeScanned({type: scannedData[0].type, data: scannedData[0].data}); + } + } + }; + + if (hasPermission === null) { + return Requesting permissions...; + } + + if (hasPermission === false) { + return No access to camera or media library; + } + + return ( + + + + + + + + ); +}; + +QRScanner.propTypes = { + onScan: PropTypes.func.isRequired, + onClose: PropTypes.func.isRequired, +}; + +export default QRScanner; diff --git a/ScanLogin.js b/ScanLogin.js new file mode 100644 index 0000000..7bfeb9a --- /dev/null +++ b/ScanLogin.js @@ -0,0 +1,57 @@ +// Copyright 2024 The Casdoor Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import React from "react"; +import PropTypes from "prop-types"; +import QRScanner from "./QRScanner"; + +const ScanQRCodeForLogin = ({onClose, showScanner, onLogin}) => { + const handleScan = (type, data) => { + if (isValidLoginQR(data)) { + const loginInfo = parseLoginQR(data); + onLogin(loginInfo); + onClose(); + } + }; + + const isValidLoginQR = (data) => { + return data.startsWith("casdoor-app://login/into?"); + }; + + const parseLoginQR = (data) => { + const url = new URL(data); + const params = new URLSearchParams(url.search); + + return { + serverUrl: params.get("serverUrl"), + clientId: params.get("clientId"), + appName: params.get("appName"), + organizationName: params.get("organizationName"), + }; + }; + + if (!showScanner) { + return null; + } + + return ; +}; + +ScanQRCodeForLogin.propTypes = { + onClose: PropTypes.func.isRequired, + onLogin: PropTypes.func.isRequired, + showScanner: PropTypes.bool.isRequired, +}; + +export default ScanQRCodeForLogin; diff --git a/ScanQRCode.js b/ScanQRCode.js index 2662b4e..c75c5ca 100644 --- a/ScanQRCode.js +++ b/ScanQRCode.js @@ -12,37 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. -import React, {useEffect, useState} from "react"; -import {Text, View} from "react-native"; -import {Button, IconButton, Portal} from "react-native-paper"; -import {Camera, CameraView, scanFromURLAsync} from "expo-camera"; -import * as ImagePicker from "expo-image-picker"; +import React from "react"; import PropTypes from "prop-types"; +import QRScanner from "./QRScanner"; import useProtobufDecoder from "./useProtobufDecoder"; const ScanQRCode = ({onClose, showScanner, onAdd}) => { - ScanQRCode.propTypes = { - onClose: PropTypes.func.isRequired, - onAdd: PropTypes.func.isRequired, - showScanner: PropTypes.bool.isRequired, - }; - - const [hasPermission, setHasPermission] = useState(null); const decoder = useProtobufDecoder(require("./google/google_auth.proto")); - useEffect(() => { - const getPermissions = async() => { - const {status: cameraStatus} = await Camera.requestCameraPermissionsAsync(); - setHasPermission(cameraStatus === "granted"); - // const {status: mediaLibraryStatus} = await ImagePicker.requestMediaLibraryPermissionsAsync(); - // setHasMediaLibraryPermission(mediaLibraryStatus === "granted"); - }; - - getPermissions(); - }, []); - - const handleBarCodeScanned = ({type, data}) => { - // console.log(`Bar code with type ${type} and data ${data} has been scanned!`); + const handleScan = (type, data) => { const supportedProtocols = ["otpauth", "otpauth-migration"]; const protocolMatch = data.match(new RegExp(`^(${supportedProtocols.join("|")}):`)); if (protocolMatch) { @@ -76,55 +54,17 @@ const ScanQRCode = ({onClose, showScanner, onAdd}) => { onAdd(accounts.map(({accountName, issuer, totpSecret}) => ({accountName, issuer, secretKey: totpSecret}))); }; - const pickImage = async() => { - const result = await ImagePicker.launchImageLibraryAsync({ - mediaTypes: ImagePicker.MediaTypeOptions.Images, - quality: 1, - }); - - if (!result.canceled && result.assets[0]) { - const scannedData = await scanFromURLAsync(result.assets[0].uri, ["qr", "pdf417"]); - if (scannedData[0]) { - handleBarCodeScanned({type: scannedData[0].type, data: scannedData[0].data}); - } - } - }; - - if (hasPermission === null) { - return Requesting permissions...; + if (!showScanner) { + return null; } - if (hasPermission === false) { - return No access to camera or media library; - } + return ; +}; - return ( - - - - - - - - ); +ScanQRCode.propTypes = { + onClose: PropTypes.func.isRequired, + onAdd: PropTypes.func.isRequired, + showScanner: PropTypes.bool.isRequired, }; export default ScanQRCode; diff --git a/app.json b/app.json index 76a5ed4..f981bae 100644 --- a/app.json +++ b/app.json @@ -7,14 +7,13 @@ "icon": "./assets/icon.png", "userInterfaceStyle": "light", "sdkVersion": "51.0.0", + "scheme": "casdoor-app", "splash": { "image": "./assets/splash.png", "resizeMode": "contain", "backgroundColor": "#ffffff" }, - "assetBundlePatterns": [ - "**/*" - ], + "assetBundlePatterns": ["**/*"], "ios": { "supportsTablet": true, "bundleIdentifier": "org.casdoor.casdoorapp", diff --git a/package-lock.json b/package-lock.json index 7e6b5c3..81f71db 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,7 +22,7 @@ "expo-asset": "~10.0.10", "expo-camera": "~15.0.15", "expo-crypto": "~13.0.2", - "expo-dev-client": "~4.0.25", + "expo-dev-client": "~4.0.26", "expo-drizzle-studio-plugin": "^0.0.2", "expo-image": "~1.12.15", "expo-image-picker": "~15.0.7", @@ -98,28 +98,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", - "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", + "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz", - "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helpers": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -153,11 +155,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", - "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", + "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.24.7", + "@babel/types": "^7.25.6", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -191,13 +194,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", - "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -285,6 +289,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", + "peer": true, "dependencies": { "@babel/types": "^7.24.7" }, @@ -317,15 +322,15 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", - "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", "@babel/helper-module-imports": "^7.24.7", "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" }, "engines": { "node": ">=6.9.0" @@ -346,9 +351,10 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", - "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -421,9 +427,10 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", - "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -437,9 +444,10 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", - "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -459,12 +467,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz", - "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz", + "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==", + "license": "MIT", "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.6" }, "engines": { "node": ">=6.9.0" @@ -485,9 +494,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", - "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", + "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.6" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -1647,15 +1660,16 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz", - "integrity": "sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.2.tgz", + "integrity": "sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==", + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.22.5", - "@babel/types": "^7.22.15" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/plugin-syntax-jsx": "^7.24.7", + "@babel/types": "^7.25.2" }, "engines": { "node": ">=6.9.0" @@ -2208,9 +2222,10 @@ "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" }, "node_modules/@babel/runtime": { - "version": "7.23.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.1.tgz", - "integrity": "sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", + "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", + "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -2219,31 +2234,30 @@ } }, "node_modules/@babel/template": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", - "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", + "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7", + "@babel/generator": "^7.25.6", + "@babel/parser": "^7.25.6", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.6", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2252,11 +2266,12 @@ } }, "node_modules/@babel/types": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", - "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", + "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-string-parser": "^7.24.8", "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, @@ -10480,9 +10495,9 @@ } }, "node_modules/expo-dev-client": { - "version": "4.0.25", - "resolved": "https://registry.npmjs.org/expo-dev-client/-/expo-dev-client-4.0.25.tgz", - "integrity": "sha512-yChhepKXvdw+1vXIayvnvU9s42DJfgmAtBC9JLu7Q+Bk/SqgLxmEBpcxj9iBhu9x79bnrbgHEkGaLi+N1PljyA==", + "version": "4.0.26", + "resolved": "https://registry.npmjs.org/expo-dev-client/-/expo-dev-client-4.0.26.tgz", + "integrity": "sha512-GM+X7bngAK2vr0YMkPnQFUFVW22eG3CjoxTJ0yUwW3RgCqFdMkTeAIS/1sEXjyNYjGkigtgtch+bdYtJxfqpuw==", "license": "MIT", "dependencies": { "expo-dev-launcher": "4.0.27", diff --git a/package.json b/package.json index 7c73893..ff1f2d4 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "expo-asset": "~10.0.10", "expo-camera": "~15.0.15", "expo-crypto": "~13.0.2", - "expo-dev-client": "~4.0.25", + "expo-dev-client": "~4.0.26", "expo-drizzle-studio-plugin": "^0.0.2", "expo-image": "~1.12.15", "expo-image-picker": "~15.0.7",